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
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Y as e}from"../sdk-contracts.js";import{i as t,n,o as r,r as i,t as a}from"../png-worker-contract.js";import{t as o}from"../png-crop-bytes.js";import{parentPort as s}from"node:worker_threads";async function c(e){switch(e.kind){case`decode`:{let n=t(a(e.png),e.label);return{kind:`decode`,width:n.width,height:n.height,data:n.data}}case`decode-image`:{let{decodeScreenshotImage:t}=await import(`../screenshot-image.js`),n=t(a(e.image),e.label);return{kind:`decode-image`,width:n.width,height:n.height,data:n.data}}case`encode`:{let t=new r.PNG({width:e.width,height:e.height});return t.data=a(e.data),{kind:`encode`,png:r.PNG.sync.write(t)}}case`crop`:return{kind:`crop`,png:o(a(e.png),e.box,e.label)};case`rgb-difference`:{let r=t(a(e.firstPng),e.label),i=t(a(e.secondPng),e.label);return{kind:`rgb-difference`,...n(r,i)}}case`diff-pixels`:return{kind:`diff-pixels`,...i(e)};case`jpeg-to-png`:{let{transcodeScreenshotToPng:t}=await import(`../screenshot-image.js`);return{kind:`jpeg-to-png`,png:t(a(e.image),e.label)}}}}function l(e){return e.buffer instanceof ArrayBuffer&&e.byteOffset===0&&e.byteLength===e.buffer.byteLength}function u(e){return d(e).filter(l).map(e=>e.buffer)}function d(e){switch(e.kind){case`decode`:case`decode-image`:return[e.data];case`encode`:return[e.png];case`crop`:return e.png===null?[]:[e.png];case`rgb-difference`:return[];case`diff-pixels`:return[e.diffData,e.diffMask];case`jpeg-to-png`:return[e.png]}}const f=s;f&&f.on(`message`,async t=>{let n;try{n={id:t.id,ok:!0,result:await c(t)}}catch(r){n={id:t.id,ok:!1,error:e(r)}}f.postMessage(n,n.ok?u(n.result):[])});export{u as resultTransferList};
|
package/dist/src/inventory.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{I as e,P as t}from"./sdk-contracts.js";import{n,o as r}from"./device-shell.js";import{a as i,r as a}from"./adb-failure.js";import o from"node:path";function s(e){return e.startsWith(`emulator-`)}function c(e){return e.toLowerCase().replaceAll(`_`,` `).replaceAll(/\s+/g,` `).trim()}function l(e){let t=[];for(let n of e.split(`
|
|
2
2
|
`)){let e=n.trim().split(/\s+/),r=e[0];!r||r===`List`||e[1]!==`device`||t.push({serial:r,rawModel:(e.find(e=>e.startsWith(`model:`))??``).replace(`model:`,``)})}return t}function u(e){let[t,n]=e.split(/\r?\n/).map(e=>e.trim());return{...t?{model:t}:{},...n?{osVersion:n}:{}}}function d(e){return e.split(`
|
|
3
3
|
`).map(e=>e.trim()).filter(e=>e.length>0)}function f(e){let t=e.split(`
|
|
4
4
|
`).map(e=>e.trim()).filter(e=>e.length>0);return t.at(-1)===`OK`&&t.pop(),t.join(`
|
|
5
|
-
`).trim()||void 0}function p(e){let t=e.toLowerCase();return t.includes(`tv`)||t.includes(`leanback`)?`tv`:null}function m(e){return/feature:android\.(software\.leanback(_only)?|hardware\.type\.television)\b/i.test(e)}function h(e){return/\b(tv|television)\b/i.test(c(e))?`tv`:`mobile`}const g=1e4,_=
|
|
5
|
+
`).trim()||void 0}function p(e){let t=e.toLowerCase();return t.includes(`tv`)||t.includes(`leanback`)?`tv`:null}function m(e){return/feature:android\.(software\.leanback(_only)?|hardware\.type\.television)\b/i.test(e)}function h(e){return/\b(tv|television)\b/i.test(c(e))?`tv`:`mobile`}const g=1e4,_=r(`getprop ro.product.model; getprop ro.build.version.release`),v=[`android.software.leanback`,`android.software.leanback_only`,`android.hardware.type.television`];function y(e,t={sdkRoots:[]}){return{discover:async(n,r)=>await b(e,t,n,r)}}async function b(e,n,r,i){await e.toolchains.prepare(`android`);let a=[...n.sdkRoots,o.join(e.homeDirectory,`Android`,`Sdk`)],s=await S(e,`adb`,a,[`platform-tools`,`adb`]);if(!s)throw new t(`TOOL_MISSING`,`adb not found in PATH`);let c={host:e,adb:s,emulator:await S(e,`emulator`,a,[`emulator`,`emulator`]),scope:i},l=x(r),u=await I((await C(c)).filter(e=>!l||l.has(e.serial)),3,async e=>await w(c,e));return[...u,...r.androidAvdSelection===`running-only`?[]:await j(c,u)]}function x(e){let t=e.serial?.trim(),n=e.androidSerialAllowlist;return t?n?new Set(n.includes(t)?[t]:[]):new Set([t]):n?new Set(n):void 0}async function S(e,t,n,r){for(let t of n){let n=o.join(t,...r);if(await e.files.isExecutable(n))return n}return await e.commands.which(t)}async function C(e){let t=await P(e,e.adb,[`devices`,`-l`]);if(t.exitCode!==0)throw a(`Failed to list Android devices`,t,"Verify adb is running and the device appears in `adb devices`.");return l(t.stdout)}async function w(e,t){let[n,r,i,a]=await Promise.all([E(e,t),k(e,t.serial),A(e,t.serial),T(e,t.serial)]);return{platform:`android`,id:t.serial,name:n,kind:s(t.serial)?`emulator`:`device`,target:i,...a,booted:r}}async function T(e,t){try{let n=await N(e,t,[_],2e3);return n.exitCode===0?u(n.stdout):{}}catch(t){if(e.scope.signal.aborted)throw t;return{}}}async function E(e,t){let n=t.rawModel.replaceAll(`_`,` `).trim();return s(t.serial)?(await D(e,t.serial))?.replaceAll(`_`,` `)||n||t.serial:n||t.serial}async function D(e,t){for(let n of[`ro.boot.qemu.avd_name`,`persist.sys.avd_name`]){let r=await O(e,M(t,[`getprop`,n])),i=r?.stdout.trim();if(r?.exitCode===0&&i)return i}let n=await O(e,[`-s`,t,`emu`,`avd`,`name`]),r=n&&f(n.stdout);return n?.exitCode===0?r:void 0}async function O(t,n){try{return await P(t,t.adb,n)}catch(t){let n=e(t);if(n.code===`COMMAND_FAILED`&&typeof n.details?.timeoutMs==`number`)return;throw t}}async function k(e,t){try{return(await N(e,t,[`getprop`,`sys.boot_completed`])).stdout.trim()===`1`}catch(t){if(e.scope.signal.aborted)throw t;return!1}}async function A(e,t){return p(F(await N(e,t,[`getprop`,`ro.build.characteristics`])))===`tv`||(await I(v,2,async n=>await N(e,t,[`cmd`,`package`,`has-feature`,n]))).some(e=>F(e).toLowerCase().includes(`true`))||m(F(await N(e,t,[`pm`,`list`,`features`])))?`tv`:`mobile`}async function j(e,t){if(!e.emulator)return[];let n;try{n=await P(e,e.emulator,[`-list-avds`])}catch(t){if(e.scope.signal.aborted)throw t;return[]}if(n.exitCode!==0)return[];let r=new Set(t.filter(e=>e.kind===`emulator`).map(e=>c(e.name)));return d(n.stdout).filter(e=>!r.has(c(e))).map(e=>({platform:`android`,id:e,name:e,kind:`emulator`,target:h(e),booted:!1}))}function M(e,t){return n(`adb`,`shell`,t,[`-s`,e])}async function N(e,t,n,r=g){return await P(e,e.adb,M(t,n),r)}async function P(e,t,n,r=g){try{return await e.host.commands.run({executable:t,args:n,allowFailure:!0,timeoutMs:r},e.scope.signal)}catch(e){throw i(e)}}function F(e){return`${e.stdout}\n${e.stderr}`}async function I(e,t,n){let r=Array(e.length),i=0;return await Promise.all(Array.from({length:Math.min(t,e.length)},async()=>{for(;i<e.length;){let t=i++;r[t]=await n(e[t])}})),r}export{y as createAndroidInventory};
|
package/dist/src/inventory2.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{M as t}from"./sdk-device.js";import{l as n}from"./simctl.js";const r=/^(iphone|ipad|ipod|appletv|realitydevice)/i,i=/ipad/i,a=/\b(apple vision|vision pro|xros|visionos|realitydevice)\b/i,o=/\b(iphone|ipad|ipod)\b/i,s=/^appletv/i,c=[`apple tv`,`appletv`,`tvos`];function l(e){return(e??``).trim().toLowerCase()}function u(e){return e.includes(`tvos`)}function d(e){return e.includes(`xros`)||e.includes(`visionos`)}function f(e){return u(l(e))?`tv`:`mobile`}function p(e){let t=l(e);return t.includes(`ios`)||t.includes(`tvos`)||t.includes(`xros`)||t.includes(`visionos`)}function m(e){let t=l(e);return c.some(e=>t.includes(e))}function h(e){return o.test(e.trim())}function g(e){return m(e)?`tv`:h(e)||a.test(e)?`mobile`:null}function _(e,t){return e===`tv`?`tvos`:t.some(e=>a.test(e))?`visionos`:t.some(e=>i.test(e))?`ipados`:`ios`}function v(e){return r.test(e.trim())}function y(e){return s.test(e.trim())}function b(e){return[e.name??``,e.deviceProperties?.name??``,e.deviceProperties?.deviceType??``]}function x(e){return e.hardwareProperties?.productType??e.deviceProperties?.productType??``}function S(e){return u(l(e.hardwareProperties?.platform))||y(x(e))||b(e).some(m)?`tv`:`mobile`}function C(e){let t=l(e.hardwareProperties?.platform);return t.includes(`ios`)||u(t)||d(t)||v(x(e))?!0:b(e).some(m)}function w(e){if(!C(e))return null;let t=e.hardwareProperties?.udid??e.identifier??``,n=e.name??e.deviceProperties?.name??t;if(!t)return null;let r=S(e),i=e.hardwareProperties?.marketingName?.trim(),a=e.deviceProperties?.osVersionNumber?.trim();return{platform:`apple`,id:t,name:n,kind:`device`,target:r,appleOs:_(r,[x(e),...b(e)]),...i?{model:i}:{},...a?{osVersion:a}:{},iosPhysicalDeviceBackend:`coredevice`,booted:!0}}const T=/^==\s*(.+?)\s*==$/,E=/^(?<name>.+?)\s+(?:\[(?<idBracket>[^[\]]+)\]|\((?<osVersion>[^)]+)\)\s+\((?<idParen>[^)]+)\))\s*$/;function D(e){let t=[],n=null;for(let r of e.split(/\r?\n/)){let e=r.trim();if(!e)continue;let i=T.exec(e);if(i){n=i[1]?.trim()??null;continue}if(n!==`Devices`)continue;let a=O(e);a&&t.push(a)}return t}function O(e){let t=E.exec(e)?.groups;if(!t)return;let n=t.name?.trim(),r=t.idBracket?.trim()||t.idParen?.trim();if(!n||!r)return;let i=g(n);if(!i)return;let a=t.osVersion?.trim();return{platform:`apple`,id:r,name:n,kind:`device`,target:i,appleOs:_(i,a?[n,a]:[n]),...a?{osVersion:a}:{},iosPhysicalDeviceBackend:`xctest`,booted:!0}}async function k(e,t){let[n,r]=await Promise.all([A(e,t),j(e,t)]);return M(n,r)}async function A(e,t){let n;try{return n=await e.files.createTemporaryTextFile({prefix:`agent-device-devicectl-`,suffix:`.json`}),(await e.appleTools.run({tool:`devicectl`,args:[`list`,`devices`,`--json-output`,n.path],allowFailure:!0,timeoutMs:8e3},t.signal)).exitCode===0?(JSON.parse(await n.readText()).result?.devices??[]).flatMap(e=>{let t=w(e);return t?[t]:[]}):[]}catch{return t.signal.throwIfAborted(),[]}finally{try{await n?.[Symbol.asyncDispose]()}catch{}}}async function j(e,t){try{let n=await e.appleTools.run({tool:`xctrace`,args:[`list`,`devices`],allowFailure:!0},t.signal);return n.exitCode===0?D(n.stdout):[]}catch{return t.signal.throwIfAborted(),[]}}function M(e,t){let n=new Set(e.map(e=>e.id)),r=[...e];for(let e of t)n.has(e.id)||(n.add(e.id),r.push(e));return r}function N(e,t){let n=P(e),r=[];for(let[i,a]of Object.entries(e.devices))if(p(i))for(let e of a){if(!e.isAvailable)continue;let a=f(i);r.push({platform:`apple`,id:e.udid,name:e.name,kind:`simulator`,target:a,appleOs:_(a,[i,e.deviceTypeIdentifier??``,e.name]),...n(i,e),booted:e.state===`Booted`,...t?{simulatorSetPath:t}:{}})}return r}function P(e){let t=new Map(e.devicetypes?.map(e=>[e.identifier,e.name])),n=new Map(e.runtimes?.map(e=>[e.identifier,e.version]));return(e,r)=>{let i=t.get(r.deviceTypeIdentifier??``),a=n.get(e);return{...i?{model:i}:{},...a?{osVersion:a}:{}}}}async function F(r,i,a){let o=i.iosSimulatorSetPath?.trim()||void 0,s=await r.appleTools.run({tool:`simctl`,args:n(o),...i.booted===!0?{timeoutMs:3e3}:{}},a.signal),c;try{c=N(JSON.parse(s.stdout),o)}catch(t){throw new e(`COMMAND_FAILED`,`Failed to parse simctl devices JSON`,void 0,t)}for(let e of c)e.booted===!0&&await r.observations.deviceBooted(e);return t(c)}function I(e){return Object.freeze({discover:async(t,n)=>await L(e,t,n)})}async function L(n,r,i){if(R(r))return[V(n)];if(n.hostOs!==`darwin`)throw B(n.hostOs);if(!await n.appleTools.isXcrunAvailable(i.signal))throw new e(`TOOL_MISSING`,`xcrun not found in PATH`);let a=F(n,r,i);if(r.kind===`simulator`)return await a;if(r.iosSimulatorSetPath||r.udid){let e=await a,o=[...e,V(n)];if(r.iosSimulatorSetPath||e.some(e=>e.id===r.udid))return t(o);let s=await k(n,i);return t(H(o,s))}let[o,s]=await Promise.all([a,k(n,i)]),c=[...o,V(n)];return t(H(c,s))}function R(e){return e.platform===`macos`||e.platform===`apple`&&e.target===`desktop`}const z={darwin:`macOS`,linux:`Linux`,win32:`Windows`,other:`a non-macOS host`};function B(t){return new e(`UNSUPPORTED_PLATFORM`,`Apple tools are only available on macOS`,{supportedOn:`macOS`,hostOs:t,retriable:!1,hint:`This host runs ${z[t]}, so it cannot boot iOS Simulators or run macOS sessions. Drive Android here instead with the same command shape: agent-device devices --platform android to list targets, then agent-device open <app.apk> --platform android. To use an iOS Simulator from this machine, run agent-device on a macOS host and pass --daemon-base-url <that daemon URL>.`})}function V(e){return{platform:`apple`,id:`host-macos-local`,name:e.hostName,kind:`device`,target:`desktop`,appleOs:`macos`,booted:!0}}function H(e,t){let n=new Set(e.map(e=>e.id));return[...e,...t.filter(e=>!n.has(e.id)&&(n.add(e.id),!0))]}export{I as createAppleInventorySource};
|
package/dist/src/inventory6.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{w as e}from"./tv-remote.js";function t(){return{discover:async()=>[e]}}export{t as createWebInventory};
|
package/dist/src/io.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { ArtifactAdapter, ArtifactDescriptor, CreateTempFileOptions, FileInputRef, FileOutputRef, LocalArtifactAdapterOptions, OutputVisibility, ReserveOutputOptions, ReservedOutputFile, ResolveInputOptions, ResolvedInputFile, TemporaryFile, createLocalArtifactAdapter };
|
|
1
|
+
import { a as FileInputRef, c as OutputVisibility, d as ResolveInputOptions, f as ResolvedInputFile, i as CreateTempFileOptions, l as ReserveOutputOptions, n as ArtifactAdapter, o as FileOutputRef, p as TemporaryFile, r as ArtifactDescriptor, s as LocalArtifactAdapterOptions, t as createLocalArtifactAdapter, u as ReservedOutputFile } from "./sdk-io.js";
|
|
2
|
+
export { type ArtifactAdapter, type ArtifactDescriptor, type CreateTempFileOptions, type FileInputRef, type FileOutputRef, type LocalArtifactAdapterOptions, type OutputVisibility, type ReserveOutputOptions, type ReservedOutputFile, type ResolveInputOptions, type ResolvedInputFile, type TemporaryFile, createLocalArtifactAdapter };
|
package/dist/src/ios-client.js
CHANGED
|
@@ -101,4 +101,4 @@ req.on('error', (error) => {
|
|
|
101
101
|
req.end(body);
|
|
102
102
|
`}function ke(e,t){return new Promise((n,r)=>{e.once(`error`,r),e.listen(t,`127.0.0.1`,()=>{e.off(`error`,r),n()})})}function Ae(e){return new Promise((t,n)=>{e.close(e=>{e?n(e):t()})})}function je(e){return new Promise((t,n)=>{let r=[];e.on(`data`,e=>r.push(Buffer.from(e))),e.on(`end`,()=>{try{t(JSON.parse(Buffer.concat(r).toString(`utf8`)||`{}`))}catch(e){n(e)}}),e.on(`error`,n)})}function X(e,t,n){let r=JSON.stringify(n);e.writeHead(t,{"content-type":`application/json`,"content-length":Buffer.byteLength(r)}),e.end(r)}var Me=t({REVERSE_TUNNEL_REMOTE_PORT_MAX:()=>Pe,REVERSE_TUNNEL_REMOTE_PORT_MIN:()=>Ne,RecordingQuality:()=>ze,SimctlExecution:()=>Be,TAP_ELEMENT_TIMEOUT_MS:()=>Fe,createInstanceClient:()=>Z,deriveReverseTunnelUrl:()=>Le,parseElementTree:()=>Re});const Ne=57090,Pe=57099,Fe=9e4;function Ie(e){return`${e}/files?name=recording.mp4`}function Le(e,t){let n=new URL(e);if(n.protocol===`https:`)n.protocol=`wss:`;else if(n.protocol===`http:`)n.protocol=`ws:`;else throw Error(`Unsupported apiUrl protocol for reverse tunnel: ${n.protocol}`);return n.pathname=`${n.pathname.replace(/\/+$/,``)}/reverse-tunnel`,n.search=``,n.hash=``,n.searchParams.set(`remotePort`,String(t)),n.toString()}function Re(e){return JSON.parse(e)}var ze;(function(e){e[e.Q5=5]=`Q5`,e[e.Q6=6]=`Q6`,e[e.Q7=7]=`Q7`,e[e.Q8=8]=`Q8`,e[e.Q9=9]=`Q9`,e[e.Q10=10]=`Q10`})(ze||={});var Be=class extends re{get isRunning(){return!this.completed}constructor(e,{encoding:t=`utf-8`}={}){super(),this.stdoutChunks=[],this.stderrChunks=[],this.stdoutLineBuffer=``,this.stderrLineBuffer=``,this.exitCodeValue=null,this.completed=!1,this.waitPromise=null,this.stopCallback=null,this.stopCallback=e,this.encoding=t}on(e,t){return super.on(e,t)}once(e,t){return super.once(e,t)}off(e,t){return super.off(e,t)}wait(){return this.waitPromise||=new Promise((e,t)=>{if(this.completed){e({code:this.exitCodeValue,stdout:Buffer.concat(this.stdoutChunks).toString(this.encoding),stderr:Buffer.concat(this.stderrChunks).toString(this.encoding)});return}this.once(`exit`,t=>{e({code:t,stdout:Buffer.concat(this.stdoutChunks).toString(this.encoding),stderr:Buffer.concat(this.stderrChunks).toString(this.encoding)})}),this.once(`error`,e=>{t(e)})}),this.waitPromise}stop(){this.stopCallback&&this.stopCallback()}_handleStdout(e){this.stdoutChunks.push(e),this.emit(`stdout`,e),this.stdoutLineBuffer+=e.toString(this.encoding);let t=this.stdoutLineBuffer.split(`
|
|
103
103
|
`);this.stdoutLineBuffer=t.pop()||``;for(let e of t)this.emit(`line-stdout`,e)}_handleStderr(e){this.stderrChunks.push(e),this.emit(`stderr`,e),this.stderrLineBuffer+=e.toString(this.encoding);let t=this.stderrLineBuffer.split(`
|
|
104
|
-
`);this.stderrLineBuffer=t.pop()||``;for(let e of t)this.emit(`line-stderr`,e)}_handleExit(e){this.stdoutLineBuffer&&=(this.emit(`line-stdout`,this.stdoutLineBuffer),``),this.stderrLineBuffer&&=(this.emit(`line-stderr`,this.stderrLineBuffer),``),this.exitCodeValue=e,this.completed=!0,this.emit(`exit`,e)}_handleError(e){this.completed=!0,this.emit(`error`,e)}};async function Z(e){let t=`${e.apiUrl.replace(`https://`,`wss://`).replace(`http://`,`ws://`)}/signaling?token=${e.token}`,n=e.logLevel??`info`,r=e.maxReconnectAttempts??6,re=e.reconnectDelay??1e3,_=e.maxReconnectDelay??3e4,v,b=`connecting`,x=0,w,T=!1,E,O=new Map,k=new Map,A=new Map,j=[],M=[],N=new Set,P={debug:(...e)=>{n===`debug`&&console.log(...e)},info:(...e)=>{(n===`info`||n===`debug`)&&console.log(...e)},warn:(...e)=>{(n===`warn`||n===`info`||n===`debug`)&&console.warn(...e)},error:(...e)=>{n!==`none`&&console.error(...e)}},F=e=>{b!==e&&(b=e,P.debug(`Connection state changed to: ${e}`),N.forEach(t=>{try{t(e)}catch(e){P.error(`Error in connection state callback:`,e)}}))},I=e=>{O.forEach(t=>{clearTimeout(t.timeout),t.reject(Error(e))}),O.clear(),k.forEach(t=>t._handleError(Error(e))),k.clear()},ae=()=>{w&&=(clearTimeout(w),void 0),H&&=(clearInterval(H),void 0),v&&=(v.removeAllListeners(),v.on(`error`,()=>{}),(v.readyState===l.default.OPEN||v.readyState===l.default.CONNECTING)&&v.close(),void 0)},L=()=>{let e=j.splice(0);for(let t of e)t().catch(e=>P.warn(`Failed to close xcrun shim:`,e));let t=M.splice(0);for(let e of t)e().catch(e=>P.warn(`Failed to close HTTP proxy:`,e))},R=()=>{ae(),L()},z=(e,t,n)=>{let r=A.get(e)??new Map;r.set(t,n),A.set(e,r)},oe=(e,t)=>{let n=A.get(e);if(!n)return;let r=n.get(t);if(r)return n.delete(t),n.size===0&&A.delete(e),r},B=(e,t)=>{let n=A.get(e);n&&(n.delete(t),n.size===0&&A.delete(e))},V=()=>{A.clear()},H,se=Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15);return new Promise((A,L)=>{let U=!1,ce=()=>{if(T){P.debug(`Skipping reconnection (intentional disconnect)`);return}if(s(E??``)){P.error(`Skipping reconnection (non-retryable error): ${E}`),F(`disconnected`),V();return}if(x>=r){P.error(`Max reconnection attempts (${r}) reached. Giving up.`),F(`disconnected`),V();return}let e=Math.min(re*2**x,_);x++,P.debug(`Scheduling reconnection attempt ${x} in ${e}ms...`),F(`reconnecting`),w=setTimeout(()=>{P.debug(`Attempting to reconnect (attempt ${x})...`),K()},e)},W=()=>`ts-client-${Date.now()}-${Math.random().toString(36).substring(7)}`,le=e=>{if(e.type!==`launchApp`)return`encryptionKey`in e?{...e,encryptionKey:`[REDACTED]`}:e;let t=e.runtime;return{type:e.type,id:e.id,execId:e.execId,bundleId:e.bundleId,mode:e.mode,runtime:t?{kind:t.kind,version:t.version}:void 0}},G=(e,t={},n,r=3e4)=>new Promise((i,a)=>{if(!v||v.readyState!==l.default.OPEN){a(Error(`WebSocket is not connected or connection is not open.`));return}let o=W(),s=setTimeout(()=>{O.delete(o),a(Error(`Request ${e} timed out`))},r);O.set(o,n?{resolve:i,reject:a,timeout:s,transform:n}:{resolve:i,reject:a,timeout:s});let c={type:e,id:o,...t};P.debug(`Sending request:`,le(c)),v.send(JSON.stringify(c),t=>{t&&(clearTimeout(s),O.delete(o),P.error(`Failed to send ${e} request:`,t),a(t))})}),pe=e=>e.length===0?[]:e.split(/\r?\n/),me=e=>{if(e.type!==`appExit`)return!1;let{execId:t,bundleId:n}=e;if(typeof t!=`string`||typeof n!=`string`)return P.warn(`Received malformed appExit message:`,e),!0;let r=oe(`appExit`,t);return r?(r(e).catch(e=>{P.error(`Error processing appExit notification for execId ${t}:`,e)}),!0):(P.debug(`Received appExit for unknown or already handled execId: ${t}`),!0)},ge={screenshotResult:e=>({base64:e.base64,width:e.width,height:e.height}),elementTreeResult:e=>Re(e.json??`[]`),tapResult:()=>void 0,tapElementResult:e=>({elementLabel:e.elementLabel,elementType:e.elementType,method:e.method}),incrementElementResult:e=>({elementLabel:e.elementLabel}),decrementElementResult:e=>({elementLabel:e.elementLabel}),setElementValueResult:e=>({elementLabel:e.elementLabel}),typeTextResult:()=>void 0,pressKeyResult:()=>void 0,toggleKeyboardResult:()=>void 0,launchAppResult:()=>void 0,terminateAppResult:()=>void 0,watchAppResult:()=>void 0,unwatchAppResult:()=>void 0,appLogTailResult:e=>e.logs??``,listAppsResult:e=>JSON.parse(e.apps||`[]`),listOpenFilesResult:e=>e.files||[],deviceInfoResult:e=>({udid:e.udid,screenWidth:e.screenWidth,screenHeight:e.screenHeight,model:e.model}),openUrlResult:()=>void 0,appInstallationResult:e=>({url:e.url||``,bundleId:e.bundleId||``}),keychainExportResult:()=>void 0,keychainImportResult:e=>({durationMs:e.durationMs??0}),startVideoRecordingResult:()=>void 0,stopVideoRecordingResult:()=>void 0,startAppLogCaptureResult:()=>void 0,stopAppLogCaptureResult:()=>void 0,startEventCaptureResult:()=>void 0,stopEventCaptureResult:()=>void 0,cameraControlResult:()=>void 0,playOnMicrophoneResult:e=>({duration:e.duration??0,once:e.once??!1}),stopMicrophonePlaybackResult:()=>void 0,microphoneStatusResult:e=>e.status??{source:`silence`},setOrientationResult:()=>void 0,foldStateResult:e=>e.state??null,scrollResult:()=>void 0,performActionsResult:e=>({results:e.results??[]}),xcrunResult:e=>({stdout:e.stdout?Buffer.from(e.stdout,`base64`).toString(`utf-8`):``,stderr:e.stderr?Buffer.from(e.stderr,`base64`).toString(`utf-8`):``,exitCode:e.exitCode??-1}),xcodebuildResult:e=>({stdout:e.stdout?Buffer.from(e.stdout,`base64`).toString(`utf-8`):``,stderr:e.stderr?Buffer.from(e.stderr,`base64`).toString(`utf-8`):``,exitCode:e.exitCode??-1})},K=()=>{ae(),F(`connecting`);let e=i.getWebSocketAgent(t);v=new l.default(t,e?{agent:e}:{}),v.on(`message`,e=>{let t;try{t=JSON.parse(e.toString())}catch(t){P.error({data:e,error:t},`Failed to parse JSON message`);return}if(me(t))return;if(t.type===`simctlStream`){let e=k.get(t.id);if(!e){P.debug(`Received simctl stream for unknown execution: ${t.id}`);return}if(t.stdout)try{e._handleStdout(Buffer.from(t.stdout,`base64`))}catch(e){P.error(`Failed to decode stdout data:`,e)}if(t.stderr)try{e._handleStderr(Buffer.from(t.stderr,`base64`))}catch(e){P.error(`Failed to decode stderr data:`,e)}t.exitCode!==void 0&&(P.debug(`Simctl execution ${t.id} completed with exit code ${t.exitCode}`),e._handleExit(t.exitCode),k.delete(t.id));return}let n=O.get(t.id);if(!n){P.debug(`Received response for unknown or already handled request: ${t.id}`);return}if(clearTimeout(n.timeout),O.delete(t.id),t.error){P.debug(`Server error for ${t.type}: ${t.error}`),n.reject(Error(t.error));return}let r=n.transform??ge[t.type];if(r)try{n.resolve(r(t))}catch(e){n.reject(e)}else P.warn(`Received unexpected message type:`,t.type),n.resolve(t)}),v.on(`error`,e=>{E=e.message,P.error(`WebSocket error:`,e.message),!U&&(v?.readyState===l.default.CONNECTING||v?.readyState===l.default.OPEN)&&L(e)}),v.on(`close`,()=>{H&&=(clearInterval(H),void 0);let e=!T&&!s(E??``)&&b!==`disconnected`;F(`disconnected`),P.debug(`Disconnected from server.`),I(`Connection closed`),e?ce():s(E??``)&&(P.error(`Closing connection due to non-retryable error: ${E}`),R(),F(`disconnected`),I(`Non-retryable error`),V(),P.debug(`Non-retryable error. Closing connection.`))}),v.on(`open`,async()=>{if(P.debug(`Connected to ${t}`),x=0,E=void 0,F(`connected`),H=setInterval(()=>{v&&v.readyState===l.default.OPEN&&v.ping()},3e4),!U){try{Q=await gt(),P.debug(`Device info fetched:`,Q)}catch(e){P.error(`Failed to fetch device info:`,e),L(e);return}U=!0,A({screenshot:q,elementTree:J,elementTreeRaw:_e,tap:ye,tapWithScreenSize:be,tapElement:Se,incrementElement:Ce,decrementElement:we,setElementValue:Te,typeText:Ee,pressKey:De,toggleKeyboard:Oe,launchApp:ke,terminateApp:X,watchApp:je,appLogTail:Me,streamAppLog:Fe,streamSyslog:ze,listApps:Z,openUrl:Ve,installApp:He,saveKeychain:Ue,restoreKeychain:We,setOrientation:Xe,getFoldState:Je,screenshotDisplay:Ke,tapDisplay:qe,setDuoOrientation:Ge,setHingeAngle:Ye,scroll:Ze,performActions:Qe,startRecording:$e,stopRecording:ot,startAppLogCapture:et,stopAppLogCapture:tt,startEventCapture:nt,stopEventCapture:rt,streamAppLogCapture:it,streamEventCapture:at,playOnMicrophone:st,stopMicrophonePlayback:ct,microphoneStatus:lt,keepAlive:ut,syncApp:dt,setStoreKitConfig:Tt,clearStoreKitConfig:Et,discoverStoreKitConfig:Dt,softReset:Ot,startReverseTunnel:kt,startTunnel:At,getTunnelStatus:jt,stopTunnel:Mt,startHttpProxy:Nt,startForwardHttpProxy:Pt,disconnect:$,getConnectionState:Ft,onConnectionStateChange:It,simctl:_t,xcrun:pt,startXcrunShim:mt,xcodebuild:ht,pushFile:yt,pullFile:bt,listFiles:xt,deleteFile:St,setCameraVideo:Ct,clearCameraVideo:wt,lsof:ft,deviceInfo:Q})}})},q=()=>G(`screenshot`),J=e=>G(`elementTree`,{point:e}),_e=e=>G(`elementTree`,{point:e},e=>e.json??``),ye=(e,t)=>G(`tap`,{x:e,y:t}),be=(e,t,n,r)=>G(`tap`,{x:e,y:t,screenWidth:n,screenHeight:r}),Y=(e,t)=>G(`tapElement`,{selector:e,activate:t?.activate},void 0,t?.timeoutMs??9e4),xe=e=>{let t=e instanceof Error?e.message:String(e);return/matched nothing in the accessibility tree|was not found on screen after scrolling|Accessibility element not found for selector/.test(t)},Se=async(e,t)=>{if(!t?.scrollSearch)return Y(e,t);if(!Q)throw Error(`Device info not available yet; wait for client connection to be established.`);let n=Date.now()+(t.timeoutMs??9e4),r=()=>Y(e,{...t,timeoutMs:Math.max(1,n-Date.now())}),i;try{return await r()}catch(e){if(!xe(e))throw e;i=e}let a=Q.screenHeight,o;if(Q.model===`iPhone Duo`){let e=(await Je())?.displays.filter(e=>e.active)??[];if(e.length!==1)throw Error(`Scroll search requires exactly one active Duo display; retry after the fold settles.`);let t=e[0];o=t.id,a=(t.orientation===3||t.orientation===4?t.width:t.height)/t.scale}let s=Math.round(a*.6);for(let[e,t]of[[`down`,3],[`up`,6]])for(let a=0;a<t&&!(Date.now()>=n);a+=1){await Ze(e,s,o?{display:o}:void 0),await D(300);try{return await r()}catch(e){if(!xe(e))throw e;i=e}}let c=i instanceof Error?i.message:String(i);throw Error(`${c} (after client-side scroll search)`)},Ce=e=>G(`incrementElement`,{selector:e}),we=e=>G(`decrementElement`,{selector:e}),Te=(e,t)=>{let n=t??void 0;return G(`setElementValue`,{text:e,selector:n,focused:!n||void 0})},Ee=(e,t,n)=>{let r=n?.requireFocus!==!1&&void 0;return G(`typeText`,{text:e,pressEnter:t,requireFocus:r})},De=(e,t)=>G(`pressKey`,{key:e,modifiers:t}),Oe=()=>G(`toggleKeyboard`),ke=(e,t)=>{let n=typeof t==`string`?{mode:t}:t??{},r=typeof t==`object`?t.mode:n.mode;if(n.runtime&&r===`ForegroundIfRunning`)return Promise.reject(Error(`launchApp runtime launches require RelaunchIfRunning so runtime injection is applied.`));let i=n.runtime?`RelaunchIfRunning`:n.mode,a=n.onExit,o=a?W():void 0;return o&&a&&z(`appExit`,o,Ae(o,a)),G(`launchApp`,{bundleId:e,mode:i,runtime:n.runtime,execId:o}).catch(e=>{throw o&&B(`appExit`,o),e})},Ae=(e,t)=>async n=>{let r=n,i=[];if(Array.isArray(r.logs))i=r.logs.map(String);else if(Number.isInteger(r.logLineCount)&&(r.logLineCount??0)>0)try{i=pe(await G(`appLogTail`,{bundleId:r.bundleId,lines:r.logLineCount}))}catch(t){P.error(`Failed to fetch app logs for exit execId ${e}:`,t)}let a={bundleId:r.bundleId,reason:r.reason??`exit`,...r.crash?{crash:r.crash}:{}};try{await t(i,a)}catch(t){P.error(`Error in onExit callback for execId ${e}:`,t)}},je=async(e,t)=>{let n=W();z(`appExit`,n,Ae(n,t));try{await G(`watchApp`,{bundleId:e,execId:n})}catch(e){throw B(`appExit`,n),e}return{execId:n,stop:async()=>{B(`appExit`,n),await G(`unwatchApp`,{execId:n})}}},X=e=>G(`terminateApp`,{bundleId:e}),Me=(e,t)=>G(`appLogTail`,{bundleId:e,lines:t}),Fe=e=>{let n=W();return new te(t,{type:`streamAppLog`,id:n,bundleId:e},`streamAppLogTerminate`,n)},ze=()=>{let e=W();return new te(t,{type:`streamSyslog`,id:e},`streamSyslogTerminate`,e)},Z=()=>G(`listApps`),Ve=e=>G(`openUrl`,{url:e}),He=(e,t)=>G(`appInstallation`,{url:e,md5:t?.md5,launchMode:t?.launchMode},void 0,t?.timeoutMs??12e4),Ue=async e=>{await G(`exportKeychain`,{url:e.url,encryptionKey:e.encryptionKey},void 0,12e4)},We=async e=>G(`importKeychain`,{url:e.url,encryptionKey:e.encryptionKey},void 0,12e4),Ge=e=>[`portrait`,`pud`,`landscape-left`,`landscape-right`].includes(e)?G(`setDuoOrientation`,{orientation:e}):Promise.reject(RangeError(`Invalid iPhone Duo orientation`)),Ke=e=>G(`screenshotDisplay`,{display:e}),qe=(e,t,n)=>G(`tapDisplay`,{display:e,x:t,y:n}),Je=()=>G(`getFoldState`),Ye=e=>!Number.isFinite(e)||e<0||e>180?Promise.reject(RangeError(`Hinge angle must be between 0 and 180 degrees`)):G(`setHingeAngle`,{angleDegrees:e}),Xe=e=>G(`setOrientation`,{orientation:e}),Ze=(e,t,n)=>G(`scroll`,{direction:e,pixels:t,coordinate:n?.coordinate,momentum:n?.momentum,display:n?.display}),Qe=(e,t)=>{let n=e.reduce((e,t)=>e+(t.type===`wait`?Math.max(0,t.durationMs):0),0),r=t?.timeoutMs??3e4+n+e.length*2e3;return G(`performActions`,{actions:e,display:t?.display},void 0,r)},$e=async e=>{let t={...h(e?.persist)};if(e?.quality!==void 0){if(!Number.isInteger(e.quality)||e.quality<5||e.quality>10)throw Error(`quality must be one of: 5, 6, 7, 8, 9, 10`);t.quality=e.quality}e?.display!==void 0&&(t.display=e.display),await G(`startVideoRecording`,t)},et=async e=>{if(!e.bundleId)throw Error(`bundleId must be a non-empty string`);await G(`startAppLogCapture`,{bundleId:e.bundleId,...h(e.persist)})},tt=async()=>{await G(`stopAppLogCapture`)},nt=async e=>{await G(`startEventCapture`,{...h(e?.persist)})},rt=async()=>{await G(`stopEventCapture`)},it=t=>f({url:`${e.apiUrl}/session/applogs/events`,token:e.token,onEntry:t.onLine,onError:t.onError}),at=t=>f({url:`${e.apiUrl}/session/events/events`,token:e.token,onEntry:t.onEvent,onError:t.onError}),ot=async t=>{await G(`stopVideoRecording`,{upload:t.presignedUrl?{presignedUrl:t.presignedUrl}:void 0});let n=Ie(e.apiUrl);return t.localPath&&await ne(n,e.token,t.localPath),n},st=async(e,t)=>{if(!e)throw Error(`path must be a non-empty string`);return G(`playOnMicrophone`,{path:e,once:t?.once})},ct=async()=>{await G(`stopMicrophonePlayback`)},lt=async()=>G(`microphoneStatus`),ut=()=>{!v||v.readyState!==l.default.OPEN||v.send(JSON.stringify({type:`keepAlive`,sessionId:se}))},dt=async(t,n)=>{let r=await ue(t),i=r.appPath,a=S.join(i,`Info.plist`);if(!(await g.promises.stat(a).catch(()=>null))?.isFile())throw Error(`The folder is not a valid app bundle: missing Info.plist at ${a}`);if(!Q)throw Error(`Device info not available yet; wait for client connection to be established.`);let o=S.resolve(r.cacheIdentityPath),s=`limsync-cache-${S.basename(o)}-${C.createHash(`sha1`).update(o).digest(`hex`).slice(0,8)}`,l=n?.basisCacheDir??S.join(y.tmpdir(),s),u=n?.watch??!0,d=(e,t)=>{switch(e){case`debug`:P.debug(t);break;case`info`:P.info(t);break;case`warn`:P.warn(t);break;case`error`:P.error(t);break;default:P.info(t)}},f={apiUrl:e.apiUrl,token:e.token,udid:s,ignoreFn:await ie(i,{basisCacheDir:l,log:d}),basisCacheDir:l,log:d,install:n?.install??!0,launchMode:n?.launchMode??`ForegroundIfRunning`,watch:!r.isArchive&&u,...n?.onSyncComplete?{onSyncComplete:n.onSyncComplete}:{}},p=await c(i,f);if(!r.isArchive||!r.archivePath||!u)return p;let m=de({archivePath:r.archivePath,log:d,onExtracted:async()=>{await c(i,f)}});return{...p,stopWatching:async()=>{await m.close()}}},ft=()=>G(`listOpenFiles`,{kind:`unix`}),pt=e=>G(`xcrun`,{args:e}),mt=async()=>{let e=await ve({deviceInfo:Q,listApps:Z,simctl:_t,syncApp:dt});return j.push(e.close),e.dir},ht=e=>G(`xcodebuild`,{args:e}),gt=()=>G(`deviceInfo`),Q,_t=(e,t={})=>{let n=W(),r=new Be(()=>{k.delete(n),t.disconnectOnExit&&(P.debug(`Simctl execution ${n} cancelled, disconnecting due to disconnectOnExit`),$()),P.debug(`Simctl execution ${n} cancelled`)});if(k.set(n,r),t.disconnectOnExit&&(r.once(`exit`,()=>{P.debug(`Simctl execution ${n} finished, disconnecting due to disconnectOnExit`),$()}),r.once(`error`,()=>{P.debug(`Simctl execution ${n} errored, disconnecting due to disconnectOnExit`),$()})),!v||v.readyState!==l.default.OPEN)return process.nextTick(()=>{r._handleError(Error(`WebSocket is not connected or connection is not open.`)),k.delete(n)}),r;let i={type:`simctl`,id:n,args:e,...t.stdin!==void 0&&{stdin:Buffer.from(t.stdin).toString(`base64`)}};return P.debug(`Sending simctl request:`,{...i,stdin:void 0}),v.send(JSON.stringify(i),e=>{e&&(P.error(`Failed to send simctl request:`,e),r._handleError(e),k.delete(n))}),r},vt=(t,n)=>{let r=new URLSearchParams({name:t});return n?.bundleId&&(r.set(`bundleId`,n.bundleId),n.containerType&&r.set(`containerType`,n.containerType)),`${e.apiUrl}/files?${r.toString()}`},yt=async(t,n,r)=>{let a=g.createReadStream(t),o=vt(n,r);try{let n=await i.fetch(o,{method:`PUT`,headers:{"Content-Type":`application/octet-stream`,"Content-Length":g.statSync(t).size.toString(),Authorization:`Bearer ${e.token}`},body:a,duplex:`half`});if(!n.ok){let e=await n.text();throw P.debug(`Upload failed: ${n.status} ${e}`),Error(`Upload failed: ${n.status} ${e}`)}return(await n.json()).path}catch(e){throw P.debug(`Failed to upload file ${t}:`,e),e}},bt=async(t,n)=>{let r=await i.fetch(vt(t,n),{method:`GET`,headers:{Authorization:`Bearer ${e.token}`}});if(!r.ok){let e=await r.text();throw Error(`Download of '${t}' failed: ${r.status} ${e}`)}return Buffer.from(await r.arrayBuffer())},xt=async(t=`.`,n)=>{let r=new URLSearchParams;t&&t!==`.`&&r.set(`path`,t),n?.bundleId&&(r.set(`bundleId`,n.bundleId),n.containerType&&r.set(`containerType`,n.containerType));let a=r.toString(),o=`${e.apiUrl}/files/list${a?`?${a}`:``}`,s=await i.fetch(o,{method:`GET`,headers:{Authorization:`Bearer ${e.token}`}});if(!s.ok){let e=await s.text();throw Error(`Listing of '${t}' failed: ${s.status} ${e}`)}return(await s.json()).entries},St=async(t,n)=>{let r=await i.fetch(vt(t,n),{method:`DELETE`,headers:{Authorization:`Bearer ${e.token}`}});if(!r.ok){let e=await r.text();throw Error(`Deletion of '${t}' failed: ${r.status} ${e}`)}},Ct=async(e,t)=>{let n=`limrun-camera-${S.basename(e)}`,r=await yt(e,n);await G(`cameraControl`,{action:`setSource`,source:`video`,arg:r,loop:t?.loop??!0})},wt=()=>G(`cameraControl`,{action:`reset`}),Tt=async(t,n)=>{let r=Buffer.isBuffer(n)?n:Buffer.from(n),a=`${e.apiUrl}/payments/storeKitConfigs/${encodeURIComponent(t)}`,o=await i.fetch(a,{method:`PUT`,headers:{"Content-Type":`application/octet-stream`,Authorization:`Bearer ${e.token}`},body:r});if(!o.ok){let e=await o.text();throw Error(`setStoreKitConfig failed: ${o.status} ${e}`)}},Et=async t=>{let n=`${e.apiUrl}/payments/storeKitConfigs/${encodeURIComponent(t)}`,r=await i.fetch(n,{method:`DELETE`,headers:{Authorization:`Bearer ${e.token}`}});if(!r.ok){let e=await r.text();throw Error(`clearStoreKitConfig failed: ${r.status} ${e}`)}},Dt=async(t,n)=>{let r=n?.timeoutSeconds??120,a=`${e.apiUrl}/payments/storeKitConfigs/${encodeURIComponent(t)}/discover`,o=new AbortController,s=setTimeout(()=>o.abort(),(r+10)*1e3);try{let t=await i.fetch(a,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${e.token}`},body:JSON.stringify({timeoutSeconds:r}),signal:o.signal});if(!t.ok){let e=await t.text();throw Error(`discoverStoreKitConfig failed: ${t.status} ${e}`)}let n=await t.json();return{itemsFound:n.itemsFound,productsCount:n.productsCount,subscriptionsCount:n.subscriptionsCount,subscriptionGroupsCount:n.subscriptionGroupsCount}}finally{clearTimeout(s)}},Ot=async(t,n)=>{let r={bundleId:t};n?.strategy&&(r.strategy=n.strategy);let a=`${e.apiUrl}/softReset`,o=await i.fetch(a,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${e.token}`},body:JSON.stringify(r)});if(!o.ok){let e=await o.text();throw Error(`softReset failed: ${o.status} ${e}`)}let s=await o.json(),c={strategy:s.strategy,bundleId:s.bundleId,durationMs:s.durationMs};return s.itemsCleared!==void 0&&(c.itemsCleared=s.itemsCleared),c},kt=async t=>{o(t.remotePort,`remotePort`,Ne,Pe);let r=t.localPort??t.remotePort;o(r,`localPort`,1,65535);let i=Le(e.apiUrl,t.remotePort);return m(i,e.token,{localHost:t.localHost??`127.0.0.1`,localPort:r,logLevel:t.logLevel??n})},At=async t=>ee(d(e.apiUrl),e.token,p(t,n)),jt=async()=>u(e.apiUrl,e.token),Mt=async t=>{await a(e.apiUrl,e.token,t)},Nt=async t=>{o(t.localPort,`localPort`,1,65535);let n=await fe({localPort:t.localPort,remoteBaseUrl:t.remoteBaseUrl,headers:{authorization:`Bearer ${e.token}`}});return M.push(n.close),n.port},Pt=async t=>{o(t.matchPort,`matchPort`,1,65535);let n=await he({matchPort:t.matchPort,remoteBaseUrl:t.remoteBaseUrl,headers:{authorization:`Bearer ${e.token}`}});return M.push(n.close),n.port},$=()=>{T=!0,R(),F(`disconnected`),I(`Intentional disconnect`),V(),P.debug(`Intentionally disconnected from WebSocket.`)},Ft=()=>b,It=e=>(N.add(e),()=>{N.delete(e)});K()})}export{D as i,Me as n,ie as r,Z as t};
|
|
104
|
+
`);this.stderrLineBuffer=t.pop()||``;for(let e of t)this.emit(`line-stderr`,e)}_handleExit(e){this.stdoutLineBuffer&&=(this.emit(`line-stdout`,this.stdoutLineBuffer),``),this.stderrLineBuffer&&=(this.emit(`line-stderr`,this.stderrLineBuffer),``),this.exitCodeValue=e,this.completed=!0,this.emit(`exit`,e)}_handleError(e){this.completed=!0,this.emit(`error`,e)}};async function Z(e){let t=`${e.apiUrl.replace(`https://`,`wss://`).replace(`http://`,`ws://`)}/signaling?token=${e.token}`,n=e.logLevel??`info`,r=e.maxReconnectAttempts??6,re=e.reconnectDelay??1e3,_=e.maxReconnectDelay??3e4,v,b=`connecting`,x=0,w,T=!1,E,O=new Map,k=new Map,A=new Map,j=[],M=[],N=new Set,P={debug:(...e)=>{n===`debug`&&console.log(...e)},info:(...e)=>{(n===`info`||n===`debug`)&&console.log(...e)},warn:(...e)=>{(n===`warn`||n===`info`||n===`debug`)&&console.warn(...e)},error:(...e)=>{n!==`none`&&console.error(...e)}},F=e=>{b!==e&&(b=e,P.debug(`Connection state changed to: ${e}`),N.forEach(t=>{try{t(e)}catch(e){P.error(`Error in connection state callback:`,e)}}))},I=e=>{O.forEach(t=>{clearTimeout(t.timeout),t.reject(Error(e))}),O.clear(),k.forEach(t=>t._handleError(Error(e))),k.clear()},ae=()=>{w&&=(clearTimeout(w),void 0),H&&=(clearInterval(H),void 0),v&&=(v.removeAllListeners(),v.on(`error`,()=>{}),(v.readyState===l.default.OPEN||v.readyState===l.default.CONNECTING)&&v.close(),void 0)},L=()=>{let e=j.splice(0);for(let t of e)t().catch(e=>P.warn(`Failed to close xcrun shim:`,e));let t=M.splice(0);for(let e of t)e().catch(e=>P.warn(`Failed to close HTTP proxy:`,e))},R=()=>{ae(),L()},z=(e,t,n)=>{let r=A.get(e)??new Map;r.set(t,n),A.set(e,r)},oe=(e,t)=>{let n=A.get(e);if(!n)return;let r=n.get(t);if(r)return n.delete(t),n.size===0&&A.delete(e),r},B=(e,t)=>{let n=A.get(e);n&&(n.delete(t),n.size===0&&A.delete(e))},V=()=>{A.clear()},H,se=Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15);return new Promise((A,L)=>{let U=!1,ce=()=>{if(T){P.debug(`Skipping reconnection (intentional disconnect)`);return}if(s(E??``)){P.error(`Skipping reconnection (non-retryable error): ${E}`),F(`disconnected`),V();return}if(x>=r){P.error(`Max reconnection attempts (${r}) reached. Giving up.`),F(`disconnected`),V();return}let e=Math.min(re*2**x,_);x++,P.debug(`Scheduling reconnection attempt ${x} in ${e}ms...`),F(`reconnecting`),w=setTimeout(()=>{P.debug(`Attempting to reconnect (attempt ${x})...`),K()},e)},W=()=>`ts-client-${Date.now()}-${Math.random().toString(36).substring(7)}`,le=e=>{if(e.type!==`launchApp`)return`encryptionKey`in e?{...e,encryptionKey:`[REDACTED]`}:e;let t=e.runtime;return{type:e.type,id:e.id,execId:e.execId,bundleId:e.bundleId,mode:e.mode,runtime:t?{kind:t.kind,version:t.version}:void 0}},G=(e,t={},n,r=3e4)=>new Promise((i,a)=>{if(!v||v.readyState!==l.default.OPEN){a(Error(`WebSocket is not connected or connection is not open.`));return}let o=W(),s=setTimeout(()=>{O.delete(o),a(Error(`Request ${e} timed out`))},r);O.set(o,n?{resolve:i,reject:a,timeout:s,transform:n}:{resolve:i,reject:a,timeout:s});let c={type:e,id:o,...t};P.debug(`Sending request:`,le(c)),v.send(JSON.stringify(c),t=>{t&&(clearTimeout(s),O.delete(o),P.error(`Failed to send ${e} request:`,t),a(t))})}),pe=e=>e.length===0?[]:e.split(/\r?\n/),me=e=>{if(e.type!==`appExit`)return!1;let{execId:t,bundleId:n}=e;if(typeof t!=`string`||typeof n!=`string`)return P.warn(`Received malformed appExit message:`,e),!0;let r=oe(`appExit`,t);return r?(r(e).catch(e=>{P.error(`Error processing appExit notification for execId ${t}:`,e)}),!0):(P.debug(`Received appExit for unknown or already handled execId: ${t}`),!0)},ge={screenshotResult:e=>({base64:e.base64,width:e.width,height:e.height}),elementTreeResult:e=>Re(e.json??`[]`),tapResult:()=>void 0,tapElementResult:e=>({elementLabel:e.elementLabel,elementType:e.elementType,method:e.method}),incrementElementResult:e=>({elementLabel:e.elementLabel}),decrementElementResult:e=>({elementLabel:e.elementLabel}),setElementValueResult:e=>({elementLabel:e.elementLabel}),typeTextResult:()=>void 0,pressKeyResult:()=>void 0,toggleKeyboardResult:()=>void 0,launchAppResult:()=>void 0,terminateAppResult:()=>void 0,watchAppResult:()=>void 0,unwatchAppResult:()=>void 0,appLogTailResult:e=>e.logs??``,listAppsResult:e=>JSON.parse(e.apps||`[]`),listOpenFilesResult:e=>e.files||[],deviceInfoResult:e=>({udid:e.udid,screenWidth:e.screenWidth,screenHeight:e.screenHeight,model:e.model}),openUrlResult:()=>void 0,appInstallationResult:e=>({url:e.url||``,bundleId:e.bundleId||``}),keychainExportResult:()=>void 0,keychainImportResult:e=>({durationMs:e.durationMs??0}),startVideoRecordingResult:()=>void 0,stopVideoRecordingResult:()=>void 0,startAppLogCaptureResult:()=>void 0,stopAppLogCaptureResult:()=>void 0,startEventCaptureResult:()=>void 0,stopEventCaptureResult:()=>void 0,cameraControlResult:()=>void 0,playOnMicrophoneResult:e=>({duration:e.duration??0,once:e.once??!1}),stopMicrophonePlaybackResult:()=>void 0,microphoneStatusResult:e=>e.status??{source:`silence`},setOrientationResult:()=>void 0,foldStateResult:e=>e.state??null,scrollResult:()=>void 0,performActionsResult:e=>({results:e.results??[]}),xcrunResult:e=>({stdout:e.stdout?Buffer.from(e.stdout,`base64`).toString(`utf-8`):``,stderr:e.stderr?Buffer.from(e.stderr,`base64`).toString(`utf-8`):``,exitCode:e.exitCode??-1}),xcodebuildResult:e=>({stdout:e.stdout?Buffer.from(e.stdout,`base64`).toString(`utf-8`):``,stderr:e.stderr?Buffer.from(e.stderr,`base64`).toString(`utf-8`):``,exitCode:e.exitCode??-1})},K=()=>{ae(),F(`connecting`);let e=i.getWebSocketAgent(t);v=new l.default(t,e?{agent:e}:{}),v.on(`message`,e=>{let t;try{t=JSON.parse(e.toString())}catch(t){P.error({data:e,error:t},`Failed to parse JSON message`);return}if(me(t))return;if(t.type===`simctlStream`){let e=k.get(t.id);if(!e){P.debug(`Received simctl stream for unknown execution: ${t.id}`);return}if(t.stdout)try{e._handleStdout(Buffer.from(t.stdout,`base64`))}catch(e){P.error(`Failed to decode stdout data:`,e)}if(t.stderr)try{e._handleStderr(Buffer.from(t.stderr,`base64`))}catch(e){P.error(`Failed to decode stderr data:`,e)}t.exitCode!==void 0&&(P.debug(`Simctl execution ${t.id} completed with exit code ${t.exitCode}`),e._handleExit(t.exitCode),k.delete(t.id));return}let n=O.get(t.id);if(!n){P.debug(`Received response for unknown or already handled request: ${t.id}`);return}if(clearTimeout(n.timeout),O.delete(t.id),t.error){P.debug(`Server error for ${t.type}: ${t.error}`),n.reject(Error(t.error));return}let r=n.transform??ge[t.type];if(r)try{n.resolve(r(t))}catch(e){n.reject(e)}else P.warn(`Received unexpected message type:`,t.type),n.resolve(t)}),v.on(`error`,e=>{E=e.message,P.error(`WebSocket error:`,e.message),!U&&(v?.readyState===l.default.CONNECTING||v?.readyState===l.default.OPEN)&&L(e)}),v.on(`close`,()=>{H&&=(clearInterval(H),void 0);let e=!T&&!s(E??``)&&b!==`disconnected`;F(`disconnected`),P.debug(`Disconnected from server.`),I(`Connection closed`),e?ce():s(E??``)&&(P.error(`Closing connection due to non-retryable error: ${E}`),R(),F(`disconnected`),I(`Non-retryable error`),V(),P.debug(`Non-retryable error. Closing connection.`))}),v.on(`open`,async()=>{if(P.debug(`Connected to ${t}`),x=0,E=void 0,F(`connected`),H=setInterval(()=>{v&&v.readyState===l.default.OPEN&&v.ping()},3e4),!U){try{Q=await gt(),P.debug(`Device info fetched:`,Q)}catch(e){P.error(`Failed to fetch device info:`,e),L(e);return}U=!0,A({screenshot:q,elementTree:J,elementTreeRaw:_e,tap:ye,tapWithScreenSize:be,tapElement:Se,incrementElement:Ce,decrementElement:we,setElementValue:Te,typeText:Ee,pressKey:De,toggleKeyboard:Oe,launchApp:ke,terminateApp:X,watchApp:je,appLogTail:Me,streamAppLog:Fe,streamSyslog:ze,listApps:Z,openUrl:Ve,installApp:He,saveKeychain:Ue,restoreKeychain:We,setOrientation:Xe,getFoldState:Je,screenshotDisplay:Ke,tapDisplay:qe,setDuoOrientation:Ge,setHingeAngle:Ye,scroll:Ze,performActions:Qe,startRecording:$e,stopRecording:ot,startAppLogCapture:et,stopAppLogCapture:tt,startEventCapture:nt,stopEventCapture:rt,streamAppLogCapture:it,streamEventCapture:at,playOnMicrophone:st,stopMicrophonePlayback:ct,microphoneStatus:lt,keepAlive:ut,syncApp:dt,setStoreKitConfig:Tt,clearStoreKitConfig:Et,discoverStoreKitConfig:Dt,softReset:Ot,startReverseTunnel:kt,startTunnel:At,getTunnelStatus:jt,stopTunnel:Mt,startHttpProxy:Nt,startForwardHttpProxy:Pt,disconnect:$,getConnectionState:Ft,onConnectionStateChange:It,simctl:_t,xcrun:pt,startXcrunShim:mt,xcodebuild:ht,pushFile:yt,pullFile:bt,listFiles:xt,deleteFile:St,setCameraVideo:Ct,clearCameraVideo:wt,lsof:ft,deviceInfo:Q})}})},q=()=>G(`screenshot`),J=e=>G(`elementTree`,{point:e}),_e=e=>G(`elementTree`,{point:e},e=>e.json??``),ye=(e,t)=>G(`tap`,{x:e,y:t}),be=(e,t,n,r)=>G(`tap`,{x:e,y:t,screenWidth:n,screenHeight:r}),Y=(e,t)=>G(`tapElement`,{selector:e,activate:t?.activate},void 0,t?.timeoutMs??9e4),xe=e=>{let t=e instanceof Error?e.message:String(e);return/matched nothing in the accessibility tree|was not found on screen after scrolling|Accessibility element not found for selector/.test(t)},Se=async(e,t)=>{if(!t?.scrollSearch)return Y(e,t);if(!Q)throw Error(`Device info not available yet; wait for client connection to be established.`);let n=Date.now()+(t.timeoutMs??9e4),r=()=>Y(e,{...t,timeoutMs:Math.max(1,n-Date.now())}),i;try{return await r()}catch(e){if(!xe(e))throw e;i=e}let a=Q.screenHeight,o;if(Q.model===`iPhone Duo`){let e=(await Je())?.displays.filter(e=>e.active)??[];if(e.length!==1)throw Error(`Scroll search requires exactly one active Duo display; retry after the fold settles.`);let t=e[0];o=t.id,a=(t.orientation===3||t.orientation===4?t.width:t.height)/t.scale}let s=Math.round(a*.6);for(let[e,t]of[[`down`,3],[`up`,6]])for(let a=0;a<t&&!(Date.now()>=n);a+=1){await Ze(e,s,o?{display:o}:void 0),await D(300);try{return await r()}catch(e){if(!xe(e))throw e;i=e}}let c=i instanceof Error?i.message:String(i);throw Error(`${c} (after client-side scroll search)`)},Ce=e=>G(`incrementElement`,{selector:e}),we=e=>G(`decrementElement`,{selector:e}),Te=(e,t)=>{let n=t??void 0;return G(`setElementValue`,{text:e,selector:n,focused:!n||void 0})},Ee=(e,t,n)=>{let r=n?.requireFocus!==!1&&void 0;return G(`typeText`,{text:e,pressEnter:t,requireFocus:r})},De=(e,t)=>G(`pressKey`,{key:e,modifiers:t}),Oe=()=>G(`toggleKeyboard`),ke=(e,t)=>{let n=typeof t==`string`?{mode:t}:t??{},r=typeof t==`object`?t.mode:n.mode;if(n.runtime&&r===`ForegroundIfRunning`)return Promise.reject(Error(`launchApp runtime launches require RelaunchIfRunning so runtime injection is applied.`));let i=Object.keys(n.env??{}).length>0,a=n.runtime?`RelaunchIfRunning`:n.mode??(i?`RelaunchIfRunning`:void 0),o=n.onExit,s=o?W():void 0;return s&&o&&z(`appExit`,s,Ae(s,o)),G(`launchApp`,{bundleId:e,mode:a,runtime:n.runtime,env:n.env,execId:s}).catch(e=>{throw s&&B(`appExit`,s),e})},Ae=(e,t)=>async n=>{let r=n,i=[];if(Array.isArray(r.logs))i=r.logs.map(String);else if(Number.isInteger(r.logLineCount)&&(r.logLineCount??0)>0)try{i=pe(await G(`appLogTail`,{bundleId:r.bundleId,lines:r.logLineCount}))}catch(t){P.error(`Failed to fetch app logs for exit execId ${e}:`,t)}let a={bundleId:r.bundleId,reason:r.reason??`exit`,...r.crash?{crash:r.crash}:{}};try{await t(i,a)}catch(t){P.error(`Error in onExit callback for execId ${e}:`,t)}},je=async(e,t)=>{let n=W();z(`appExit`,n,Ae(n,t));try{await G(`watchApp`,{bundleId:e,execId:n})}catch(e){throw B(`appExit`,n),e}return{execId:n,stop:async()=>{B(`appExit`,n),await G(`unwatchApp`,{execId:n})}}},X=e=>G(`terminateApp`,{bundleId:e}),Me=(e,t)=>G(`appLogTail`,{bundleId:e,lines:t}),Fe=e=>{let n=W();return new te(t,{type:`streamAppLog`,id:n,bundleId:e},`streamAppLogTerminate`,n)},ze=()=>{let e=W();return new te(t,{type:`streamSyslog`,id:e},`streamSyslogTerminate`,e)},Z=()=>G(`listApps`),Ve=e=>G(`openUrl`,{url:e}),He=(e,t)=>G(`appInstallation`,{url:e,md5:t?.md5,launchMode:t?.launchMode},void 0,t?.timeoutMs??12e4),Ue=async e=>{await G(`exportKeychain`,{url:e.url,encryptionKey:e.encryptionKey},void 0,12e4)},We=async e=>G(`importKeychain`,{url:e.url,encryptionKey:e.encryptionKey},void 0,12e4),Ge=e=>[`portrait`,`pud`,`landscape-left`,`landscape-right`].includes(e)?G(`setDuoOrientation`,{orientation:e}):Promise.reject(RangeError(`Invalid iPhone Duo orientation`)),Ke=e=>G(`screenshotDisplay`,{display:e}),qe=(e,t,n)=>G(`tapDisplay`,{display:e,x:t,y:n}),Je=()=>G(`getFoldState`),Ye=e=>!Number.isFinite(e)||e<0||e>180?Promise.reject(RangeError(`Hinge angle must be between 0 and 180 degrees`)):G(`setHingeAngle`,{angleDegrees:e}),Xe=e=>G(`setOrientation`,{orientation:e}),Ze=(e,t,n)=>G(`scroll`,{direction:e,pixels:t,coordinate:n?.coordinate,momentum:n?.momentum,display:n?.display}),Qe=(e,t)=>{let n=e.reduce((e,t)=>e+(t.type===`wait`?Math.max(0,t.durationMs):0),0),r=t?.timeoutMs??3e4+n+e.length*2e3;return G(`performActions`,{actions:e,display:t?.display},void 0,r)},$e=async e=>{let t={...h(e?.persist)};if(e?.quality!==void 0){if(!Number.isInteger(e.quality)||e.quality<5||e.quality>10)throw Error(`quality must be one of: 5, 6, 7, 8, 9, 10`);t.quality=e.quality}e?.display!==void 0&&(t.display=e.display),await G(`startVideoRecording`,t)},et=async e=>{if(!e.bundleId)throw Error(`bundleId must be a non-empty string`);await G(`startAppLogCapture`,{bundleId:e.bundleId,...h(e.persist)})},tt=async()=>{await G(`stopAppLogCapture`)},nt=async e=>{await G(`startEventCapture`,{...h(e?.persist)})},rt=async()=>{await G(`stopEventCapture`)},it=t=>f({url:`${e.apiUrl}/session/applogs/events`,token:e.token,onEntry:t.onLine,onError:t.onError}),at=t=>f({url:`${e.apiUrl}/session/events/events`,token:e.token,onEntry:t.onEvent,onError:t.onError}),ot=async t=>{await G(`stopVideoRecording`,{upload:t.presignedUrl?{presignedUrl:t.presignedUrl}:void 0});let n=Ie(e.apiUrl);return t.localPath&&await ne(n,e.token,t.localPath),n},st=async(e,t)=>{if(!e)throw Error(`path must be a non-empty string`);return G(`playOnMicrophone`,{path:e,once:t?.once})},ct=async()=>{await G(`stopMicrophonePlayback`)},lt=async()=>G(`microphoneStatus`),ut=()=>{!v||v.readyState!==l.default.OPEN||v.send(JSON.stringify({type:`keepAlive`,sessionId:se}))},dt=async(t,n)=>{let r=await ue(t),i=r.appPath,a=S.join(i,`Info.plist`);if(!(await g.promises.stat(a).catch(()=>null))?.isFile())throw Error(`The folder is not a valid app bundle: missing Info.plist at ${a}`);if(!Q)throw Error(`Device info not available yet; wait for client connection to be established.`);let o=S.resolve(r.cacheIdentityPath),s=`limsync-cache-${S.basename(o)}-${C.createHash(`sha1`).update(o).digest(`hex`).slice(0,8)}`,l=n?.basisCacheDir??S.join(y.tmpdir(),s),u=n?.watch??!0,d=(e,t)=>{switch(e){case`debug`:P.debug(t);break;case`info`:P.info(t);break;case`warn`:P.warn(t);break;case`error`:P.error(t);break;default:P.info(t)}},f={apiUrl:e.apiUrl,token:e.token,udid:s,ignoreFn:await ie(i,{basisCacheDir:l,log:d}),basisCacheDir:l,log:d,install:n?.install??!0,launchMode:n?.launchMode??`ForegroundIfRunning`,watch:!r.isArchive&&u,...n?.onSyncComplete?{onSyncComplete:n.onSyncComplete}:{}},p=await c(i,f);if(!r.isArchive||!r.archivePath||!u)return p;let m=de({archivePath:r.archivePath,log:d,onExtracted:async()=>{await c(i,f)}});return{...p,stopWatching:async()=>{await m.close()}}},ft=()=>G(`listOpenFiles`,{kind:`unix`}),pt=e=>G(`xcrun`,{args:e}),mt=async()=>{let e=await ve({deviceInfo:Q,listApps:Z,simctl:_t,syncApp:dt});return j.push(e.close),e.dir},ht=e=>G(`xcodebuild`,{args:e}),gt=()=>G(`deviceInfo`),Q,_t=(e,t={})=>{let n=W(),r=new Be(()=>{k.delete(n),t.disconnectOnExit&&(P.debug(`Simctl execution ${n} cancelled, disconnecting due to disconnectOnExit`),$()),P.debug(`Simctl execution ${n} cancelled`)});if(k.set(n,r),t.disconnectOnExit&&(r.once(`exit`,()=>{P.debug(`Simctl execution ${n} finished, disconnecting due to disconnectOnExit`),$()}),r.once(`error`,()=>{P.debug(`Simctl execution ${n} errored, disconnecting due to disconnectOnExit`),$()})),!v||v.readyState!==l.default.OPEN)return process.nextTick(()=>{r._handleError(Error(`WebSocket is not connected or connection is not open.`)),k.delete(n)}),r;let i={type:`simctl`,id:n,args:e,...t.stdin!==void 0&&{stdin:Buffer.from(t.stdin).toString(`base64`)}};return P.debug(`Sending simctl request:`,{...i,stdin:void 0}),v.send(JSON.stringify(i),e=>{e&&(P.error(`Failed to send simctl request:`,e),r._handleError(e),k.delete(n))}),r},vt=(t,n)=>{let r=new URLSearchParams({name:t});return n?.bundleId&&(r.set(`bundleId`,n.bundleId),n.containerType&&r.set(`containerType`,n.containerType)),`${e.apiUrl}/files?${r.toString()}`},yt=async(t,n,r)=>{let a=g.createReadStream(t),o=vt(n,r);try{let n=await i.fetch(o,{method:`PUT`,headers:{"Content-Type":`application/octet-stream`,"Content-Length":g.statSync(t).size.toString(),Authorization:`Bearer ${e.token}`},body:a,duplex:`half`});if(!n.ok){let e=await n.text();throw P.debug(`Upload failed: ${n.status} ${e}`),Error(`Upload failed: ${n.status} ${e}`)}return(await n.json()).path}catch(e){throw P.debug(`Failed to upload file ${t}:`,e),e}},bt=async(t,n)=>{let r=await i.fetch(vt(t,n),{method:`GET`,headers:{Authorization:`Bearer ${e.token}`}});if(!r.ok){let e=await r.text();throw Error(`Download of '${t}' failed: ${r.status} ${e}`)}return Buffer.from(await r.arrayBuffer())},xt=async(t=`.`,n)=>{let r=new URLSearchParams;t&&t!==`.`&&r.set(`path`,t),n?.bundleId&&(r.set(`bundleId`,n.bundleId),n.containerType&&r.set(`containerType`,n.containerType));let a=r.toString(),o=`${e.apiUrl}/files/list${a?`?${a}`:``}`,s=await i.fetch(o,{method:`GET`,headers:{Authorization:`Bearer ${e.token}`}});if(!s.ok){let e=await s.text();throw Error(`Listing of '${t}' failed: ${s.status} ${e}`)}return(await s.json()).entries},St=async(t,n)=>{let r=await i.fetch(vt(t,n),{method:`DELETE`,headers:{Authorization:`Bearer ${e.token}`}});if(!r.ok){let e=await r.text();throw Error(`Deletion of '${t}' failed: ${r.status} ${e}`)}},Ct=async(e,t)=>{let n=`limrun-camera-${S.basename(e)}`,r=await yt(e,n);await G(`cameraControl`,{action:`setSource`,source:`video`,arg:r,loop:t?.loop??!0})},wt=()=>G(`cameraControl`,{action:`reset`}),Tt=async(t,n)=>{let r=Buffer.isBuffer(n)?n:Buffer.from(n),a=`${e.apiUrl}/payments/storeKitConfigs/${encodeURIComponent(t)}`,o=await i.fetch(a,{method:`PUT`,headers:{"Content-Type":`application/octet-stream`,Authorization:`Bearer ${e.token}`},body:r});if(!o.ok){let e=await o.text();throw Error(`setStoreKitConfig failed: ${o.status} ${e}`)}},Et=async t=>{let n=`${e.apiUrl}/payments/storeKitConfigs/${encodeURIComponent(t)}`,r=await i.fetch(n,{method:`DELETE`,headers:{Authorization:`Bearer ${e.token}`}});if(!r.ok){let e=await r.text();throw Error(`clearStoreKitConfig failed: ${r.status} ${e}`)}},Dt=async(t,n)=>{let r=n?.timeoutSeconds??120,a=`${e.apiUrl}/payments/storeKitConfigs/${encodeURIComponent(t)}/discover`,o=new AbortController,s=setTimeout(()=>o.abort(),(r+10)*1e3);try{let t=await i.fetch(a,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${e.token}`},body:JSON.stringify({timeoutSeconds:r}),signal:o.signal});if(!t.ok){let e=await t.text();throw Error(`discoverStoreKitConfig failed: ${t.status} ${e}`)}let n=await t.json();return{itemsFound:n.itemsFound,productsCount:n.productsCount,subscriptionsCount:n.subscriptionsCount,subscriptionGroupsCount:n.subscriptionGroupsCount}}finally{clearTimeout(s)}},Ot=async(t,n)=>{let r={bundleId:t};n?.strategy&&(r.strategy=n.strategy);let a=`${e.apiUrl}/softReset`,o=await i.fetch(a,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${e.token}`},body:JSON.stringify(r)});if(!o.ok){let e=await o.text();throw Error(`softReset failed: ${o.status} ${e}`)}let s=await o.json(),c={strategy:s.strategy,bundleId:s.bundleId,durationMs:s.durationMs};return s.itemsCleared!==void 0&&(c.itemsCleared=s.itemsCleared),c},kt=async t=>{o(t.remotePort,`remotePort`,Ne,Pe);let r=t.localPort??t.remotePort;o(r,`localPort`,1,65535);let i=Le(e.apiUrl,t.remotePort);return m(i,e.token,{localHost:t.localHost??`127.0.0.1`,localPort:r,logLevel:t.logLevel??n})},At=async t=>ee(d(e.apiUrl),e.token,p(t,n)),jt=async()=>u(e.apiUrl,e.token),Mt=async t=>{await a(e.apiUrl,e.token,t)},Nt=async t=>{o(t.localPort,`localPort`,1,65535);let n=await fe({localPort:t.localPort,remoteBaseUrl:t.remoteBaseUrl,headers:{authorization:`Bearer ${e.token}`}});return M.push(n.close),n.port},Pt=async t=>{o(t.matchPort,`matchPort`,1,65535);let n=await he({matchPort:t.matchPort,remoteBaseUrl:t.remoteBaseUrl,headers:{authorization:`Bearer ${e.token}`}});return M.push(n.close),n.port},$=()=>{T=!0,R(),F(`disconnected`),I(`Intentional disconnect`),V(),P.debug(`Intentionally disconnected from WebSocket.`)},Ft=()=>b,It=e=>(N.add(e),()=>{N.delete(e)});K()})}export{D as i,Me as n,ie as r,Z as t};
|
package/dist/src/ios-settings.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{P as e,et as t}from"./sdk-contracts.js";async function n(t,n,a,o,s){let c=n.toLowerCase();switch(c){case`appearance`:case`permission`:case`location`:return await t.dependencies.ios.applySimctlSetting({runSimctl:e=>r(t,e),udid:`booted`,deviceId:t.device.id,setting:c,state:a,appBundleId:o,resolveApp:e=>t.dependencies.ios.resolveAppAlias(e),options:s});case`clear-app-state`:return await i(t,a,o);default:throw new e(`UNSUPPORTED_OPERATION`,`Limrun iOS direct sessions support appearance, permission, location, and clear-app-state settings, not ${n}.`,{command:`settings`})}}async function r(t,n){let r=await t.client.simctl(n).wait();if(r.code!==0)throw new e(`COMMAND_FAILED`,`Limrun iOS simctl exited with code ${r.code}`,{args:n,exitCode:r.code,stdout:r.stdout,stderr:r.stderr});return r}async function i(n,r,i){if(r.toLowerCase()!==`clear`)throw new e(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!i)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`,t());let a=await n.dependencies.ios.resolveAppAlias(i);try{await n.client.softReset(a,{strategy:`data`}),await n.client.terminateApp(a)}catch(t){throw t instanceof e?t:new e(`COMMAND_FAILED`,`Limrun iOS could not clear app state.`,{setting:`clear-app-state`,bundleId:a},t)}return{bundleId:a,cleared:!0}}export{n as setLimrunIosSetting};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Ir as e,Jr as t}from"./sdk-batch.js";const n={"appium-source":{producer:`appium-source`,acquisitionDepth:{rawTraversal:{kind:`incomplete`},regularPresented:{kind:`incomplete`}},hittabilityEvidence:`unavailable`},"limrun-ios-tree":{producer:`limrun-ios-tree`,acquisitionDepth:{rawTraversal:{kind:`incomplete`},regularPresented:{kind:`incomplete`}},hittabilityEvidence:`unavailable`}},r={"apple-runner":`available`,"simulator-ax-bridge":`available`,"appium-source":`unavailable`,"limrun-ios-tree":`unavailable`};function i(e){return r[e]}function a(e,t){let n=[];return e.hittabilityEvidence===`unavailable`&&n.push({kind:`unavailable-fact`,fact:`hittability`}),(e.acquisitionDepth.rawTraversal.kind===`incomplete`||e.acquisitionDepth.regularPresented.kind===`incomplete`)&&n.push({kind:`unavailable-fact`,fact:`acquisition-depth`}),i(e.producer)===`unavailable`&&n.push({kind:`unavailable-fact`,fact:`truncation`}),t.kind===`missing`&&n.push({kind:`missing-viewport`,reason:t.reason}),Object.freeze(n)}function o(e){let t=n[e.producer];return{stage:`acquired`,acquisition:{producer:e.producer,intent:`full`,nodes:e.nodes,viewport:e.viewport,lineage:e.lineage,residue:a(t,e.viewport)}}}function s(e,n={}){let r=e.filter(c),i=[...r.length>0||n.fallbackToLargestRoot!==!0?r:e].sort(l)[0];if(i)return t(i.rect)?{kind:`reported`,rect:i.rect}:{kind:`missing`,reason:i.rectStatus===`invalid`||i.rectStatus===void 0&&i.rect!==void 0?`invalid`:`not-provided`}}function c(t){let n=e(t.type??``);return n===`application`||n===`window`}function l(e,t){return u(t.rectStatus)-u(e.rectStatus)||d(t.rect)-d(e.rect)}function u(e){return e===`reported`?2:+(e===`invalid`)}function d(e){return e&&t(e)?e.width*e.height:0}export{i as n,s as r,o as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{s as e}from"./src.js";import{r as t,t as n}from"./ios-snapshot-acquisition.js";async function r(t){let r=await t.client.elementTree(),a=i(r,t.client.deviceInfo);return n({producer:`limrun-ios-tree`,nodes:e(r),viewport:a,lineage:{targetId:t.instanceId}})}function i(e,n){let r=t((Array.isArray(e)?e:[e]).map(a));return r?.kind===`reported`?{kind:`derived`,rect:r.rect}:u(n)}function a(e){let t=e.rect??e.frame,n=o(t);return{type:e.elementType??e.type??e.role,...n?{rect:n}:{},rectStatus:l(t,n)}}function o(e){if(s(e))return{x:e.x,y:e.y,width:e.width,height:e.height}}function s(e){return[e?.x,e?.y,e?.width,e?.height].every(c)}function c(e){return typeof e==`number`&&Number.isFinite(e)}const l=(e,t)=>!e||!t?`not-provided`:t.width>0&&t.height>0?`reported`:`invalid`;function u(e){let t=e?.screenWidth,n=e?.screenHeight;return t===void 0||n===void 0?{kind:`missing`,reason:`not-provided`}:!d(t)||!d(n)?{kind:`missing`,reason:`invalid`}:{kind:`reported`,rect:{x:0,y:0,width:t,height:n}}}function d(e){return Number.isFinite(e)&&e>0}export{r as captureLimrunIosSnapshot};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{v as e}from"./sdk-contracts.js";import{$r as t,Jr as n,Lr as r,Nr as i,Xr as a,Yr as o,ei as s,ni as c,qr as l}from"./sdk-batch.js";import{n as u,t as d}from"./scroll-indicator.js";import{a as f,i as p,o as m,r as h}from"./react-native-overlay.js";import{t as g}from"./rect-center.js";import{i as ee,n as _,t as te}from"./ios-snapshot-planning.js";import{_ as ne,a as v,c as y,d as re,f as b,g as x,h as ie,i as S,l as ae,m as C,n as w,o as oe,p as T,r as se,t as E,u as ce}from"./tree.js";function le(e,t){let n=v(t.sourceNodesByIndex.values());for(let r of e)ue(r,t.sourceNodesByIndex,n)&&C(t.replacements,r,{type:`Cell`})}function ue(e,t,n){return!(r(e.type??``)!==`other`||e.enabled===!1||!e.rect||!pe(e.label)||!oe(e,t,fe)||!de(e)||ce(e.rect,n))}function de(e){return e.rect?e.rect.height>=44&&e.rect.height<=160&&e.rect.width>=120:!1}function fe(e){let t=r(e.type??``);return t===`scrollview`||t===`scrollarea`}function pe(e){let t=e?.trim();return!(!t||/^(toolbar|window|application)$/i.test(t)||t.startsWith(`!,`)||/debugger|fast refresh/i.test(t))}function me(e,t){let n=new Set;for(let r of e)he(t.replacements.get(r.index)??r)&&ge(r,t.sourceNodesByIndex,t,n);ye(e,t,n)}function he(e){let t=e.label?.trim();return!!(t&&u(t))}function ge(e,t,n,r){let i=!b(e.type)||n.isSuppressed(e),a=d(e.label?.trim()??``,e.value),o=a?ve(e,t):void 0;i&&n.suppressNode(e,o?[o]:[]),o&&a&&De(n,o,e,a)&&r.add(o.index)}function D(e,t){return typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0}function _e(e,t){return e.rect!=null&&t.rect!=null&&O(e.rect,t.rect)}function ve(e,t){if(b(e.type))return null;let n=D(e,t);for(;n&&!b(n.type);){let e=D(n,t);if(!e||!_e(n,e))return null;n=e}return n??null}function ye(e,t,n){let r=new Map;for(let i of e){let e=r.get(i.parentIndex??-1),a=e?.clip,o=t.replacements.get(i.index)??i,s=Ee(o.rect,a),c=be(o,a,s),l=xe(e,c,o);Se(t,i,o,a,s,c,l),r.set(i.index,Ce(i,o,a,s,l,n))}}function be(e,t,n){return!!(t&&o(e.rect)&&!o(n))}function xe(e,t,n){return!!(e?.projectedOut||t&&Te(n))}function Se(e,t,n,r,i,a,o){o||a?e.suppressNode(t,[]):r&&i&&!O(n.rect,i)&&C(e.replacements,t,{rect:i})}function Ce(e,t,n,r,i,a){return{projectedOut:i,...we(e,t,n,r,a)?{clip:r}:n?{clip:n}:{}}}function we(e,t,n,r,i){return!!(o(r)&&(i.has(e.index)||n!==void 0&&b(t.type)))}function Te(e){return e.type?.trim().toLowerCase()===`cell`||b(e.type)}function Ee(e,t){if(!e||!t)return e;let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return{x:n,y:r,width:Math.max(0,i-n),height:Math.max(0,a-r)}}function O(e,t){return!!(e&&e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height)}function De(e,t,n,r){let i=Oe((e.replacements.get(t.index)??t).rect,n.rect);return ne(e.replacements,t,e=>({rect:i??e.rect,hiddenContentAbove:k(e.hiddenContentAbove,r.above),hiddenContentBelow:k(e.hiddenContentBelow,r.below)})),!!i}function k(e,t){return e===!0||t?!0:void 0}function Oe(e,t){if(!(!e||!t)&&!(t.height<=0||t.height>=e.height)&&!(t.y<e.y||t.y>e.y+e.height))return{...e,y:t.y,height:Math.min(t.height,e.y+e.height-t.y)}}function A(e,t){for(let n=0;n<e.length;n+=1){let i=e[n],a=i?.label?.trim();i&&a&&r(i.type??``)===`other`&&t(i,a,n)}}function ke(e,t){A(e,(n,r,i)=>{if(!f(r)||!n.rect)return;let a=S(e,i,e=>!!e.rect&&m(e.label?.trim()??``));if(!a?.rect)return;let o=je(n.rect,a.rect);if(!o)return;let s=Ae(e,i,o);C(t,n,{rect:s}),y(e,i,e=>{f(e.label?.trim()??``)&&C(t,e,{rect:s})})})}function Ae(e,n,r){let i=r;return y(e,n,e=>{let n=e.label?.trim()??``;!e.rect||!f(n)||s(r,e.rect)&&t(e.rect)<t(i)&&(i=e.rect)}),i}function je(e,t){let n=e.x+e.width,r=t.x+t.width,i={x:t.x,y:e.y,width:n-t.x,height:e.height};if(t.x>e.x&&g(t,i))return{...e,width:t.x-e.x};let a={x:e.x,y:e.y,width:r-e.x,height:e.height};if(r<n&&g(t,a))return{...e,x:r,width:n-r}}function Me(e,t){A(e,(n,r,i)=>{h(n)&&p(n,j(e,i))&&t.suppressNode(n,j(e,i))})}function j(e,t){let n=[];return y(e,t,e=>{n.push(e)}),n}function Ne(e,t){let n=v(e),r=n?n.y+n.height:null;if(r!==null)for(let n=0;n<e.length;n+=1){let i=e[n];!i||!Pe(i,r)||(t.suppressNode(i,[]),Fe(i,t,r),y(e,n,e=>{t.suppressNode(e,[])}))}}function Pe(e,t){return!e.rect||r(e.type??``)!==`keyboard`?!1:e.rect.y>=t}function Fe(e,t,n){let r=typeof e.parentIndex==`number`?t.sourceNodesByIndex.get(e.parentIndex):void 0;for(;r?.rect&&r.rect.y>=n;)t.suppressNode(r,[]),r=typeof r.parentIndex==`number`?t.sourceNodesByIndex.get(r.parentIndex):void 0}function Ie(e,t){for(let n=0;n<e.length;n+=1){let i=e[n];if(!i)continue;if(Le(i)){M(e,n,i,t);continue}if(!Re(i))continue;let a=S(e,n,e=>r(e.type??``)===`searchfield`&&e.label===`Search`);a&&(t.suppressNode(i,[a]),ze(i,a,t),M(e,n,a,t))}}function Le(e){return r(e.type??``)===`searchfield`&&e.label===`Search`}function Re(e){let t=r(e.type??``);return e.label===`Toolbar`&&(t===`toolbar`||t===`searchfield`)}function M(e,t,n,r){y(e,t,e=>{e.index!==n.index&&Be(e)&&r.suppressNode(e,[n])})}function ze(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){let e=n.sourceNodesByIndex.get(r.parentIndex);if(!e||e.label!==`Toolbar`)return;n.suppressNode(e,[t]),r=e}}function Be(e){let t=r(e.type??``);return t===`button`?!1:t===`image`||e.label===`Search`}function Ve(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?.label?.trim();!r||t.isSuppressed(r)||!i||He(e,n,r,i,t)}}function He(e,t,n,i,a){let o=r(n.type??``);if(o===`statictext`||o===`link`){N(e,t,i,n,a);return}if(o!==`other`)return;let s=Ue(e,t,i);if(s){a.suppressNode(n,[s]);return}N(e,t,i,n,a)}function Ue(e,t,n){return S(e,t,e=>{let t=r(e.type??``);return(t===`link`||t===`searchfield`||b(e.type))&&e.label?.trim()===n})}function N(e,t,n,r,i){y(e,t,e=>{!i.semanticRepresentativeIndexes.has(e.index)&&re(e,n)&&i.suppressNode(e,[r])})}function We(e,t){A(e,(n,r,i)=>{let a=S(e,i,e=>T(e)&&e.label?.trim()===r&&(g(e.rect,n.rect)||Ge(n,e)));a&&t.suppressNode(n,[a])})}function Ge(e,t){if(t.label?.trim()!==e.label?.trim())return!1;let n=r(t.type??``);return Ke(e,n)||n===`textfield`||qe(e,n,t)}function Ke(e,t){let n=e.label?.trim();return t===`button`&&(n===`Dismiss`||n===`Back`)}function qe(e,t,n){return t!==`button`||!e.rect||!n.rect?!1:e.rect.x===0&&e.rect.y===0&&e.rect.width>=300&&e.rect.height>=600&&n.rect.width<e.rect.width}function Je(e,t){let n=E(e);for(let i of e){if(r(i.type??``)!==`other`||i.hittable===!0||i.label?.trim()||i.value?.trim()||!i.identifier?.trim())continue;let e=se(i,n);(e.length!==0||i.hittable===!1)&&t.suppressNode(i,e)}}function Ye(e,t){Ne(e,t),Je(e,t),me(e,t),Ie(e,t),We(e,t),ke(e,t.replacements),Me(e,t),Ve(e,t)}function Xe(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?Ze(e,n,r,t):void 0;!r?.rect||!i||et(e,n,r,i,t)}}function Ze(e,t,n,i){let a=n.label?.trim();if(r(n.type??``)!==`cell`||a&&!Qe(a,n.identifier)&&!u(a))return a;let o=w(e,t).find($e),s=o?.label?.trim();return!o||!s?a:(C(i.replacements,n,{label:s}),i.suppressNode(o,[n]),s)}function Qe(e,t){return t?.trim()===e&&/^[A-Z_$][A-Za-z0-9_$]*Cell$/.test(e)}function $e(e){if(!e.label?.trim())return!1;let t=r(e.type??``);return t===`statictext`||t===`text`||t===`textview`}function et(e,t,n,i,a){let o=r(n.type??``);if(o===`button`){P(w(e,t),i,a,n);return}if(o!==`cell`)return;let s=w(e,t);tt(s,n,i,a)||nt(s,n,i,a)}function tt(e,t,n,r){let i=e.find(e=>it(e,t,n));if(!i)return!1;let a=e.find(e=>F(e,t,n)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&C(r.replacements,i,{identifier:o}),r.suppressNode(t,[i]),rt(e,t,n,i,r),!0}function nt(e,t,n,r){let i=e.find(e=>F(e,t,n));if(!i){e.some(ae)&&P(e,n,r,t);return}!t.identifier&&i.identifier&&C(r.replacements,t,{identifier:i.identifier}),r.suppressNode(i,[t]),P(e.filter(e=>e.index!==i.index),n,r,t)}function rt(e,t,n,r,i){for(let a of e)a.index!==r.index&&(F(a,t,n)||I(a,t)||at(a,r)||x(a,n))&&i.suppressNode(a,[r])}function P(e,t,n,r){for(let i of e)(x(i,t)||r&&I(i,r))&&n.suppressNode(i,r?[r]:[])}function F(e,t,n){if(r(e.type??``)!==`button`)return!1;let i=t.identifier?.trim(),a=e.identifier?.trim();return i&&a&&i===a?!0:e.label?.trim()===n&&g(e.rect,t.rect)}function I(e,t){return r(e.type??``)===`button`&&!e.label?.trim()&&!e.value?.trim()&&g(e.rect,t.rect)}function it(e,t,n){if(r(e.type??``)!==`switch`)return!1;let i=t.identifier?.trim(),a=e.identifier?.trim();return i&&a&&i===a?!0:e.label?.trim()===n}function at(e,t){if(r(e.type??``)!==`switch`||e.index===t.index)return!1;let n=e.label?.trim();return n===t.value?.trim()||n===`0`||n===`1`}const L=1.15;function ot(e,t,n){let r=new Map(e.map((e,t)=>[e.index,t]));for(let[i,o]of e.entries()){let s=st(e,r,t,o,n);if(!s)continue;z(e,i,n);let c=B(s.shelfRect,2);for(let t of s.intermediateSiblings){if(gt(t)||!t.rect||!a(t.rect,c))continue;let i=r.get(t.index);i!==void 0&&z(e,i,n)}}}function st(e,t,n,r,i){let a=ct(r,n,i.sourceNodesByIndex);if(!a)return;let o=dt(e,t,a.siblings,a.position,a.parent);if(!(o<0))return{shelfRect:a.rect,intermediateSiblings:a.siblings.slice(a.position+1,o)}}function ct(e,t,n){let r=ft(e,R(t,e.index));if(!r)return;let i=ut(e,n);if(!i||!i.rect)return;let a=R(t,i.index),o=a.findIndex(t=>t.index===e.index);if(lt(a,o,e,r))return{rect:r.rect,parent:i,siblings:a,position:o}}function R(e,t){return e.get(t)??[]}function lt(e,t,n,r){if(t<1)return!1;let i=pt(e,t,n);return i?!r.childActionsPresented||!mt(i,r.actionButtons):!1}function ut(e,t){return typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0}function dt(e,t,n,r,i){return n.findIndex((n,a)=>a>r&&ht(e,t.get(n.index),n,i))}function ft(e,t){if(!b(e.type)||!e.rect)return;let n=e.rect,i=t.filter(e=>r(e.type??``)===`button`&&e.rect);if(i.length===0&&e.hiddenContentBelow===!0)return{rect:n,childActionsPresented:!1,actionButtons:i};if(i.length<3)return;let a=i.map(e=>e.rect.x+e.rect.width/2);if(a.every((e,t)=>t===0||e>a[t-1]))return{rect:n,childActionsPresented:i.some(e=>s(n,e.rect)),actionButtons:i}}function pt(e,t,n){if(!(!n.rect||t<1))for(let r=t-1;r>=0;--r){let t=e[r];if(!(!t.rect||!T(t))&&t.rect.x+t.rect.width/2<n.rect.x&&_t(t.rect,B(n.rect,2)))return t}}function mt(e,t){if(!e.rect||t.length===0)return!1;let n=Math.max(...t.map(e=>e.rect?.width??0)),r=Math.max(...t.map(e=>e.rect?.height??0));return e.rect.width>n*L||e.rect.height>r*L}function ht(e,t,n,i){return t!==void 0&&r(n.type??``)===`other`&&g(n.rect,i.rect)&&!!S(e,t,T)}function z(e,t,n){let r=e[t];if(r){n.suppressNode(r,[]);for(let r of w(e,t))n.suppressNode(r,[])}}function gt(e){let t=r(e.type??``);return t===`textfield`||t===`securetextfield`||t===`searchfield`||t===`textview`}function B(e,t){return{x:e.x-t,y:e.y-t,width:e.width+t*2,height:e.height+t*2}}function _t(e,t){return Math.max(e.y,t.y)<=Math.min(e.y+e.height,t.y+t.height)}function vt(e,t){let n=E(e);ot(e,n,t),yt(e,n,t)}function yt(e,t,n){for(let i of e){if(r(i.type??``)!==`navigationbar`||!i.rect)continue;let e=t.get(i.index)??[],a=e.flatMap(t=>bt(t,e,i.rect));if(a.length!==1)continue;let{field:o,title:s,image:l,label:u}=a[0];C(n.replacements,o,{type:`Button`,label:u,enabled:!0,hittable:void 0,rect:c([l.rect,o.rect,s.rect])}),n.semanticRepresentativeIndexes.add(o.index),n.suppressNode(s,[o]),n.suppressNode(l,[o])}}function bt(e,t,n){let r=i(e);if(!xt(e,r))return[];let a=V(t,e=>St(e,r)),o=V(t,Ct);return a?.rect&&o?.rect&&wt(o.rect,e.rect,a.rect,n)?[{field:e,title:a,image:o,label:r}]:[]}function xt(e,t){return r(e.type??``)===`textfield`&&e.enabled===!1&&!!e.rect&&!!t&&e.value?.trim()===t}function St(e,t){return r(e.type??``)===`statictext`&&e.label?.trim()===t&&!!e.rect}function Ct(e){return r(e.type??``)===`image`&&!!e.identifier?.trim()&&!!e.rect}function V(e,t){let n=e.filter(t);return n.length===1?n[0]:void 0}function wt(e,t,n,r){let i=t.x-(e.x+e.width),a=n.x-(t.x+t.width);return s(r,e)&&s(r,t)&&s(r,n)&&i>=0&&i<=12&&a>=0&&a<=12&&H(e,t)&&H(t,n)}function H(e,t){return Math.max(e.y,t.y)<=Math.min(e.y+e.height,t.y+t.height)}function Tt(e,t){let n=E(e);for(let i of e){if(r(i.type??``)===`element(58)`){C(t.replacements,i,{type:`WebView`});continue}let e=Et(i,t.sourceNodesByIndex,n);if(e?.kind===`suppress`){t.suppressNode(i,[]);continue}e&&(C(t.replacements,i,{type:e.type,...e.type===`Heading`?{value:void 0}:{}}),t.semanticRepresentativeIndexes.add(i.index))}}function Et(e,t,n){if(r(e.type??``)!==`other`)return null;let i=oe(e,t,kt),a=e.label?.trim();return!i||!a?null:Ot(e,i,a)?{kind:`suppress`}:Dt(e,a,n)?{kind:`semantic`,type:At(e.value)?`Heading`:`StaticText`}:null}function Dt(e,t,n){let i=n.get(e.index);if(i?.length!==1)return!1;let a=i[0];return r(a.type??``)===`statictext`&&a.label?.trim()===t&&!n.has(a.index)}function Ot(e,t,n){return e.parentIndex===t.index&&t.label?.trim()===n&&!At(e.value)}function kt(e){let t=r(e.type??``);return t===`webview`||t===`element(58)`}function At(e){return/^[1-6]$/.test(e?.trim()??``)}const jt=[Tt,vt,le,Xe,Ye];function U(e){if(e.length===0)return{nodes:e,presentedIndexesBySourceIndex:new Map};let t=new Map,n=new Map,r=new Set,i=new Map(e.map(e=>[e.index,e])),a=new Set,o={replacements:t,semanticRepresentativeIndexes:r,sourceNodesByIndex:i,isSuppressed:e=>a.has(e.index),suppressNode(e,t){if(a.add(e.index),t.length===0)return;let r=n.get(e.index)??new Set;for(let e of t)r.add(e.index);n.set(e.index,r)}};for(let t of jt)t(e,o);if(a.size===0&&t.size===0)return{nodes:e,presentedIndexesBySourceIndex:new Map(e.map(e=>[e.index,[e.index]]))};let s=e.filter(e=>!a.has(e.index)).map(e=>t.get(e.index)??e),c=ie(s,a,e),l=new Map(s.map((e,t)=>[e.index,c[t].index]));return{nodes:c,presentedIndexesBySourceIndex:new Map(e.map(e=>[e.index,W(e.index,l,n)]))}}function W(e,t,n,r=new Set){let i=t.get(e);if(i!==void 0)return[i];if(r.has(e))return[];r.add(e);let a=new Set;for(let i of n.get(e)??[])for(let e of W(i,t,n,r))a.add(e);return[...a].sort((e,t)=>e-t)}var G=class extends Error{code=`IOS_SNAPSHOT_ENGINE_FAILED`;reason;details;constructor(e,t,n={}){super(t),this.name=`IosSnapshotEngineError`,this.reason=e,this.details=n}};function Mt(e){return{reason:e.reason,...e.details}}function K(e){let t=new Map;for(let[n,r]of e.entries()){if(!Number.isInteger(r.index)||r.index<0||t.has(r.index))throw new G(`malformed-graph`,`iOS snapshot graph contains a duplicate or invalid node index`,{index:r.index});if(t.set(r.index,n),r.depth!==void 0&&(!Number.isInteger(r.depth)||r.depth<0))throw new G(`malformed-graph`,`iOS snapshot graph contains an invalid node depth`,{index:r.index,field:`depth`})}for(let[n,r]of e.entries()){if(r.parentIndex===void 0)continue;let e=t.get(r.parentIndex);if(e===void 0||e>=n)throw new G(`malformed-graph`,`iOS snapshot graph parent must precede its child`,{index:r.index,parentIndex:r.parentIndex})}}const q=new Set([`collectionview`,`scrollview`,`table`]),Nt=new Set([`application`,`window`]);function Pt(){return{projectedOut:!1}}function Ft(e,t,n,i,a,s){let c=s===`cursor-projected`?t.ancestorClip:void 0,l=It(e.rect,n,c),u=o(J(e.rect)),d=o(l),f=r(e.type??``),p=Lt(s,t.projectedOut,u,d,f,a),m=Wt(e,Rt(s,t.projectedOut,u,d)&&!zt(e,u,s),i,s),h=Ut(f,m,d,a),g=Vt(s,t.projectedOut,u,d,e);return{isIncluded:m,descendants:Bt(s,p,c,l,h),effectiveRect:l,...g?{hiddenContentFrame:g}:{},establishesScrollAnchor:h}}function It(e,t,n){let r=J(e);if(!r)return;let i=Y(r,t);return n&&(i=Y(i,n)),i}function Lt(e,t,n,r,i,a){return e===`plain-viewport`?!r:t||n&&!r&&Ht(i,a)}function Rt(e,t,n,r){return e===`plain-viewport`?r:!t&&(!n||r)}function zt(e,t,n){return n!==`cursor-projected`||e.parentIndex===void 0||Gt(e)||!t?!1:Kt(e.rect)<=1||qt(e.rect)<=1}function Bt(e,t,n,r,i){return{projectedOut:t,...e===`cursor-projected`&&i?{ancestorClip:r}:{ancestorClip:n}}}function Vt(e,t,n,r,i){if(!(e!==`cursor-projected`||t||!n||r))return J(i.rect)}function Ht(e,t){return t&&(e===`cell`||q.has(e))}function Ut(e,t,n,r){return t&&n&&r&&q.has(e)}function Wt(e,t,n,i){if(e.parentIndex===void 0)return!0;let a=r(e.type??``);return i===`plain-viewport`&&n&&!t&&a!==`application`?!1:Nt.has(a)||t}function Gt(e){return[e.label,e.identifier,e.value].some(e=>typeof e==`string`&&e.trim().length>0)}function J(e){if(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite)&&!(e.width<0||e.height<0))return{...e,width:Math.max(0,e.width),height:Math.max(0,e.height)}}function Kt(e){return J(e)?.width??0}function qt(e){return J(e)?.height??0}function Y(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?{x:e.x,y:e.y,width:0,height:0}:{x:i>n?n:e.x,y:a>r?r:e.y,width:i-n,height:a-r}}function Jt(e){let t=E(e),n=new Set;for(let e of t.values()){let r=Yt(e,t);if(r){for(let i of e.slice(0,-1))if(Xt(r,i)){n.add(i.index);for(let e of se(i,t))n.add(e.index)}}}return n}function Yt(e,t){let n=e.at(-1);if(!n||!Zt(n))return;let r=(t.get(n.index)??[]).find(Qt);if(!(r?.userInteractionEnabled!==!0||!o(r.rect)))return{container:n,dimmingRect:r.rect}}function Xt(e,t){return Zt(t)&&o(t.rect)&&s(e.dimmingRect,t.rect)}function Zt(e){return $t(e,`uitransitionview`)}function Qt(e){return $t(e,`uidimmingview`)}function $t(e,t){return r(e.role??``)===t}function en(e,t,n,r,i={}){K(e);let a=Jt(e),o=e.filter(e=>!a.has(e.index)),s=tn(o),c=new Map,l=[],u=new Map,d=0;for(let e of o){let a=nn(e,c,()=>{d+=1}),o=a?.traversal??Pt(),f=r===`cursor-projected`?a?.anchor:void 0,p=Ft(e,o,t,n,s.has(e.index),r);rn(p,f,u);let m=an(e,p,a,l,t,i),h=sn(p,f,m.keptIndex);c.set(e.index,{traversal:p.descendants,anchor:h,keptIndex:m.keptIndex,keptDepth:m.keptDepth})}let f=ln(u,l);return{nodes:f,stats:{presentedNodeCount:f.length,sourceNodeCount:e.length,parentClipLookups:d,modalContainedNodeCount:a.size}}}function tn(e){let t=new Set;for(let n of e)n.parentIndex!==void 0&&t.add(n.parentIndex);return t}function nn(e,t,n){if(e.parentIndex!==void 0)return n(),t.get(e.parentIndex)}function rn(e,t,n){e.hiddenContentFrame&&t&&cn(e.hiddenContentFrame,t,n)}function an(e,t,n,r,i,a){let o=n?.keptIndex,s=n?.keptDepth??-1;if(!t.isIncluded)return{keptIndex:o,keptDepth:s};let c=r.length;s+=1;let{hittable:l,...u}=e;return r.push({raw:{...u,index:c,depth:s,parentIndex:o,...on(l,e.parentIndex!==void 0,t.effectiveRect,e.enabled!==!1,i,a)},sourceIndex:e.index,...t.effectiveRect?{effectiveRect:t.effectiveRect}:{}}),o=c,{keptIndex:o,keptDepth:s}}function on(e,t,r,i,a,o){return o.hittabilityAvailable===!1?e===!1||!i?{hittable:!1}:{}:{hittable:t&&e===!0&&n(i,r,a)}}function sn(e,t,n){return e.establishesScrollAnchor&&n!==void 0&&e.effectiveRect?{index:n,rect:e.effectiveRect}:t}function cn(e,t,n){let r=n.get(t.index)??{above:!1,below:!1};e.y+e.height<=t.rect.y?r.above=!0:e.y>=t.rect.y+t.rect.height&&(r.below=!0),n.set(t.index,r)}function ln(e,t){return t.map(t=>{let n=e.get(t.raw.index);if(!n)return t;let r=t.raw;return{...t,raw:{...r,hiddenContentAbove:r.hiddenContentAbove===!0||n.above?!0:void 0,hiddenContentBelow:r.hiddenContentBelow===!0||n.below?!0:void 0}}})}const un=new Set([`collectionview`,`scrollview`,`table`]);function dn(e){return fn(e.viewport)}function fn(e){if(e.kind===`missing`)throw new G(e.reason===`invalid`?`invalid-viewport`:`missing-viewport`,`regular iOS snapshot presentation requires a valid viewport`,{field:`viewport`});if(!o(e.rect))throw new G(`invalid-viewport`,`regular iOS snapshot presentation requires a positive finite viewport`,{field:`viewport`});return e.rect}function pn(e,t,n,r=!0){K(e);let i=new Map,a=0;for(let s of e){let e=mn(s,i,t,()=>{a+=1}),c=bn(s.rect);if(hn(s,r),!c||!o(c)){gn(s,c),i.set(s.index,e);continue}_n(s,c,e),vn(s,c,t),i.set(s.index,yn(s,c,e,n))}return{parentClipLookups:a}}function mn(e,t,n,r){if(e.parentIndex===void 0)return n;r();let i=t.get(e.parentIndex);if(!i)throw new G(`invalid-presented-payload`,`regular iOS snapshot payload refers to a parent outside the payload`,{index:e.index,parentIndex:e.parentIndex});return i}function hn(e,t){if(!(e.hittable!==!0||t))throw new G(`invalid-presented-payload`,`iOS snapshot payload marked a node actionable without hittability evidence`,{index:e.index})}function gn(e,t){if(e.hittable===!0)throw new G(`regular-degenerate-actionable-node`,`regular iOS snapshot node with a missing or degenerate frame is actionable`,{index:e.index,frame:t??e.rect})}function _n(e,t,n){if(!xn(t,n))throw new G(`regular-node-outside-cumulative-clip`,`regular iOS snapshot node escaped its cumulative clip`,{index:e.index,frame:t,clip:n})}function vn(e,t,n){if(!(e.hittable!==!0||e.enabled!==!1&&l(n,t.x+t.width/2,t.y+t.height/2)))throw new G(`invalid-presented-payload`,`regular iOS snapshot payload marked a disabled or off-viewport node actionable`,{index:e.index,frame:t})}function yn(e,t,n,i){return i===`cursor-projected`&&un.has(r(e.type??``))?t:n}function X(e,t,n,r,i=!0){if(t===`raw`)return K(e),{parentClipLookups:0};if(!n)throw new G(`missing-viewport`,`regular iOS snapshot payload cannot be validated without a viewport`,{field:`viewport`});try{return pn(e,n,r,i)}catch(e){throw e instanceof G&&e.code===`IOS_SNAPSHOT_ENGINE_FAILED`&&e.reason===`malformed-graph`?new G(`invalid-presented-payload`,e.message,e.details):e}}function bn(e){if(!(!e||![e.x,e.y,e.width,e.height].every(Number.isFinite))&&!(e.width<0||e.height<0))return{...e,width:Math.max(0,e.width),height:Math.max(0,e.height)}}function xn(e,t){let n=1e-4;return s({x:t.x-n,y:t.y-n,width:t.width+n*2,height:t.height+n*2},e)}const Sn=new Set([`button`,`cell`,`checkbox`,`collectionview`,`link`,`menuitem`,`picker`,`searchfield`,`securetextfield`,`segmentedcontrol`,`slider`,`scrollview`,`stepper`,`switch`,`tabbar`,`table`,`textfield`,`textview`,`webview`]);function Cn(e){let t=Fn(e.nodes),n=Tn(e,t);return e.projection===`raw`?En(n,e.depth,t):Dn(n,e.depth)}function Z(e){let t=Fn(e.nodes);return e.projection===`raw`?En(e.nodes,e.depth,t):Dn(e.nodes,e.depth)}function wn(e){return e.parentIndex===void 0||Sn.has(r(e.type??``))||In(e)}function Tn(e,t){let n=e.scope?.trim().toLowerCase();if(!n)return[...e.nodes];for(let r=0;r<e.nodes.length;r+=1){let i=e.nodes[r];if(!i||!Nn(i.raw,n))continue;let a=Pn(e.nodes,r,t);if(!(e.projection===`raw`||a.some(t=>wn(e.nodes[t].raw))))continue;let o=a.map(t=>e.nodes[t]);return Mn(e.projection===`raw`&&e.depth!==null?o.filter(n=>Q(n,t)-Q(i,t)<=e.depth):o,Q(i,t),t)}return[]}function En(e,t,n){let r=t===null?[...e]:e.filter(e=>Q(e,n)<=t);return{nodes:r.map(e=>({...e.raw,rect:e.raw.rect})),sourceIndexes:r.map(e=>e.sourceIndex)}}function Dn(e,t){let n=[],r=[],i=new Map;for(let a of e){let e=On(a,i),o=kn(a,e,t,n.length);if(!o){jn(a,e,i);continue}n.push(o),r.push(a.sourceIndex),i.set(a.raw.index,o)}return{nodes:n,sourceIndexes:r}}function On(e,t){return e.raw.parentIndex===void 0?void 0:t.get(e.raw.parentIndex)}function kn(e,t,n,r){if(!wn(e.raw))return;let i=t?(t.depth??0)+1:0;if(n!==null&&i>n)return;let a=An(e);return{...e.raw,index:r,depth:i,parentIndex:t?.index,...e.effectiveRect?{rect:e.effectiveRect}:{rect:void 0},...a===void 0?{}:{hittable:a}}}function An(e){if(e.raw.hittable!==void 0)return!!(e.raw.hittable===!0&&e.effectiveRect&&e.effectiveRect.width>0&&e.effectiveRect.height>0)}function jn(e,t,n){t&&n.set(e.raw.index,t)}function Mn(e,t,n){let r=new Map(e.map((e,t)=>[e.raw.index,t]));return e.map((e,i)=>({...e,raw:{...e.raw,index:i,depth:Math.max(0,Q(e,n)-t),parentIndex:e.raw.parentIndex===void 0?void 0:r.get(e.raw.parentIndex)}}))}function Nn(e,t){return[e.label,e.identifier,e.value].some(e=>typeof e==`string`&&e.toLowerCase().includes(t))}function Pn(e,t,n){let r=Q(e[t],n),i=[];for(let a=t;a<e.length&&!(a>t&&Q(e[a],n)<=r);a+=1)i.push(a);return i}function Q(e,t){return Math.max(0,e.raw.depth??t?.get(e.raw.index)??0)}function Fn(e){let t=new Map;for(let n of e){let e=(n.raw.parentIndex===void 0?-1:t.get(n.raw.parentIndex)??-1)+1;t.set(n.raw.index,n.raw.depth===void 0?e:Math.max(0,n.raw.depth))}return t}function In(e){return[e.label,e.identifier,e.value].some(e=>typeof e==`string`&&e.trim().length>0)}function Ln(e,t,n=`cursor-projected`){Rn(e,t);let r=e.validation.presentationKey.projection,i=r===`regular`?fn(e.validation.viewport):void 0,a=e.validation.hittability.kind===`available`,o=zn(e,r,i,n,a),s=Bn(e.presentation.payload.nodes,r,t),c=Vn(s.nodes,r,i,n,a,o);return{nodes:s.nodes,...i?{validatedViewport:i}:{},...e.presentation.qualityPayload?{qualityNodes:[...e.presentation.qualityPayload.nodes]}:{},presentedIndexesBySourceIndex:s.presentedIndexesBySourceIndex,stats:{presentedNodeCount:s.nodes.length,sourceNodeCount:e.presentation.payload.nodes.length,parentClipLookups:c.parentClipLookups,modalContainedNodeCount:0}}}function Rn(e,t){if(!Hn(_(t),e.validation.presentationKey))throw new G(`projection-mismatch`,`presented iOS snapshot does not match the requested presentation key`,{projection:e.validation.presentationKey.projection});if(e.presentation.intent!==t.acquisitionIntent)throw new G(`projection-mismatch`,`presented iOS snapshot does not match the requested acquisition intent`,{field:`acquisitionIntent`})}function zn(e,t,n,r,i){let a=X(e.presentation.payload.nodes,t,n,r,i);if(e.presentation.qualityPayload)try{X(e.presentation.qualityPayload.nodes,t,n,r,i)}catch(e){throw e instanceof G?new G(`invalid-quality-payload`,e.message,e.details):e}return a}function Bn(e,t,n){return t===`regular`&&n.interactiveOnly?U([...e]):{nodes:[...e],presentedIndexesBySourceIndex:Un(e)}}function Vn(e,t,n,r,i,a){return t!==`regular`||!n?a:X(e,t,n,r,i)}function Hn(e,t){return e.projection===t.projection&&e.interactiveOnly===t.interactiveOnly&&e.depth===t.depth&&e.scope===t.scope&&e.customActions===t.customActions}function Un(e){return new Map(e.map(e=>[e.index,[e.index]]))}function Wn(t,n,r={}){let i=Gn(t,n,r),a=t.stage===`presented`?t.validation.presentationKey:_(n),o=t.stage===`acquired`?t.acquisition.truncated:t.presentation.payload.truncated;return{payload:{nodes:e(i.nodes),...o===void 0?{}:{truncated:o}},presentationKey:a,comparisonIdentity:te(t,n),residue:t.stage===`acquired`?[...t.acquisition.residue]:[...t.validation.residue],...i.validatedViewport?{validatedViewport:i.validatedViewport}:{}}}function Gn(e,t,n={}){let r=n.foldPolicy??`cursor-projected`;return e.stage===`acquired`?Kn(e.acquisition,t,r):Ln(e,t,r)}function Kn(e,t,n){if(Jn(e,ee(t)),t.projection===`raw`){K(e.nodes);let r=e.nodes.map(e=>({raw:e,sourceIndex:e.index})),i=Cn({nodes:r,projection:`raw`,scope:t.scope,depth:t.depth,foldPolicy:n}),a=t.scope===null?void 0:Z({nodes:r,projection:`raw`,depth:null,foldPolicy:n}).nodes;return{nodes:i.nodes,...a?{qualityNodes:a}:{},presentedIndexesBySourceIndex:$(e.nodes,i.nodes,i.sourceIndexes,Yn(i.nodes)),stats:{presentedNodeCount:i.nodes.length,sourceNodeCount:e.nodes.length,parentClipLookups:0,modalContainedNodeCount:0}}}let r=dn(e),i=!qn(e.residue),a=en(e.nodes,r,t.interactiveOnly,n,{hittabilityAvailable:i}),o=Cn({nodes:a.nodes,projection:`regular`,scope:t.scope,depth:t.depth,foldPolicy:n}),s=t.interactiveOnly?U(o.nodes):{nodes:o.nodes,presentedIndexesBySourceIndex:Yn(o.nodes)},c=X(s.nodes,`regular`,r,n,i),l=t.scope===null?void 0:Z({nodes:a.nodes,projection:`regular`,depth:null,foldPolicy:n}).nodes;return{nodes:s.nodes,validatedViewport:r,...l?{qualityNodes:l}:{},presentedIndexesBySourceIndex:$(e.nodes,o.nodes,o.sourceIndexes,s.presentedIndexesBySourceIndex),stats:{presentedNodeCount:s.nodes.length,sourceNodeCount:e.nodes.length,parentClipLookups:a.stats.parentClipLookups+c.parentClipLookups,modalContainedNodeCount:a.stats.modalContainedNodeCount}}}function qn(e){return e.some(e=>e.kind===`unavailable-fact`&&e.fact===`hittability`)}function Jn(e,t){let n=e.hint;if(n.projection!==t.projection||n.rawTraversalDepth!==t.rawTraversalDepth||n.regularPresentedDepth!==t.regularPresentedDepth||n.interactiveOnly!==t.interactiveOnly||n.customActions!==t.customActions||n.acquisitionIntent!==t.acquisitionIntent)throw new G(`projection-mismatch`,`acquired iOS snapshot does not match the requested capture hint`,{projection:n.projection})}function Yn(e){return new Map(e.map(e=>[e.index,[e.index]]))}function $(e,t,n,r){let i=new Map(t.map((e,t)=>[e.index,n[t]])),a=new Map(e.map(e=>[e.index,[]]));for(let[e,t]of r){let n=i.get(e);n!==void 0&&a.set(n,t)}return a}export{U as a,Mt as i,Ln as n,G as r,Wn as t};
|
|
1
|
+
import{v as e}from"./sdk-contracts.js";import{R as t,z as n}from"./tv-remote.js";import{$r as r,Ir as i,Jr as a,Kr as o,Mr as s,Qr as c,Yr as l,qr as u,ti as d}from"./sdk-batch.js";import{a as f,i as p,o as m,r as h}from"./react-native-overlay.js";import{t as g}from"./rect-center.js";import{i as ee,n as _,t as te}from"./ios-snapshot-planning.js";import{_ as ne,a as v,c as y,d as re,f as b,g as x,h as ie,i as S,l as ae,m as C,n as w,o as oe,p as T,r as se,t as E,u as ce}from"./tree.js";function le(e,t){let n=v(t.sourceNodesByIndex.values());for(let r of e)ue(r,t.sourceNodesByIndex,n)&&C(t.replacements,r,{type:`Cell`})}function ue(e,t,n){return!(i(e.type??``)!==`other`||e.enabled===!1||!e.rect||!pe(e.label)||!oe(e,t,fe)||!de(e)||ce(e.rect,n))}function de(e){return e.rect?e.rect.height>=44&&e.rect.height<=160&&e.rect.width>=120:!1}function fe(e){let t=i(e.type??``);return t===`scrollview`||t===`scrollarea`}function pe(e){let t=e?.trim();return!(!t||/^(toolbar|window|application)$/i.test(t)||t.startsWith(`!,`)||/debugger|fast refresh/i.test(t))}function me(e,t){let n=new Set;for(let r of e)he(t.replacements.get(r.index)??r)&&ge(r,t.sourceNodesByIndex,t,n);ye(e,t,n)}function he(e){let t=e.label?.trim();return!!(t&&n(t))}function ge(e,n,r,i){let a=!b(e.type)||r.isSuppressed(e),o=t(e.label?.trim()??``,e.value),s=o?ve(e,n):void 0;a&&r.suppressNode(e,s?[s]:[]),s&&o&&De(r,s,e,o)&&i.add(s.index)}function D(e,t){return typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0}function _e(e,t){return e.rect!=null&&t.rect!=null&&O(e.rect,t.rect)}function ve(e,t){if(b(e.type))return null;let n=D(e,t);for(;n&&!b(n.type);){let e=D(n,t);if(!e||!_e(n,e))return null;n=e}return n??null}function ye(e,t,n){let r=new Map;for(let i of e){let e=r.get(i.parentIndex??-1),a=e?.clip,o=t.replacements.get(i.index)??i,s=Ee(o.rect,a),c=be(o,a,s),l=xe(e,c,o);Se(t,i,o,a,s,c,l),r.set(i.index,Ce(i,o,a,s,l,n))}}function be(e,t,n){return!!(t&&a(e.rect)&&!a(n))}function xe(e,t,n){return!!(e?.projectedOut||t&&Te(n))}function Se(e,t,n,r,i,a,o){o||a?e.suppressNode(t,[]):r&&i&&!O(n.rect,i)&&C(e.replacements,t,{rect:i})}function Ce(e,t,n,r,i,a){return{projectedOut:i,...we(e,t,n,r,a)?{clip:r}:n?{clip:n}:{}}}function we(e,t,n,r,i){return!!(a(r)&&(i.has(e.index)||n!==void 0&&b(t.type)))}function Te(e){return e.type?.trim().toLowerCase()===`cell`||b(e.type)}function Ee(e,t){if(!e||!t)return e;let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return{x:n,y:r,width:Math.max(0,i-n),height:Math.max(0,a-r)}}function O(e,t){return!!(e&&e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height)}function De(e,t,n,r){let i=Oe((e.replacements.get(t.index)??t).rect,n.rect);return ne(e.replacements,t,e=>({rect:i??e.rect,hiddenContentAbove:k(e.hiddenContentAbove,r.above),hiddenContentBelow:k(e.hiddenContentBelow,r.below)})),!!i}function k(e,t){return e===!0||t?!0:void 0}function Oe(e,t){if(!(!e||!t)&&!(t.height<=0||t.height>=e.height)&&!(t.y<e.y||t.y>e.y+e.height))return{...e,y:t.y,height:Math.min(t.height,e.y+e.height-t.y)}}function A(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],a=r?.label?.trim();r&&a&&i(r.type??``)===`other`&&t(r,a,n)}}function ke(e,t){A(e,(n,r,i)=>{if(!f(r)||!n.rect)return;let a=S(e,i,e=>!!e.rect&&m(e.label?.trim()??``));if(!a?.rect)return;let o=je(n.rect,a.rect);if(!o)return;let s=Ae(e,i,o);C(t,n,{rect:s}),y(e,i,e=>{f(e.label?.trim()??``)&&C(t,e,{rect:s})})})}function Ae(e,t,n){let i=n;return y(e,t,e=>{let t=e.label?.trim()??``;!e.rect||!f(t)||r(n,e.rect)&&c(e.rect)<c(i)&&(i=e.rect)}),i}function je(e,t){let n=e.x+e.width,r=t.x+t.width,i={x:t.x,y:e.y,width:n-t.x,height:e.height};if(t.x>e.x&&g(t,i))return{...e,width:t.x-e.x};let a={x:e.x,y:e.y,width:r-e.x,height:e.height};if(r<n&&g(t,a))return{...e,x:r,width:n-r}}function Me(e,t){A(e,(n,r,i)=>{h(n)&&p(n,j(e,i))&&t.suppressNode(n,j(e,i))})}function j(e,t){let n=[];return y(e,t,e=>{n.push(e)}),n}function Ne(e,t){let n=v(e),r=n?n.y+n.height:null;if(r!==null)for(let n=0;n<e.length;n+=1){let i=e[n];!i||!Pe(i,r)||(t.suppressNode(i,[]),Fe(i,t,r),y(e,n,e=>{t.suppressNode(e,[])}))}}function Pe(e,t){return!e.rect||i(e.type??``)!==`keyboard`?!1:e.rect.y>=t}function Fe(e,t,n){let r=typeof e.parentIndex==`number`?t.sourceNodesByIndex.get(e.parentIndex):void 0;for(;r?.rect&&r.rect.y>=n;)t.suppressNode(r,[]),r=typeof r.parentIndex==`number`?t.sourceNodesByIndex.get(r.parentIndex):void 0}function Ie(e,t){for(let n=0;n<e.length;n+=1){let r=e[n];if(!r)continue;if(Le(r)){M(e,n,r,t);continue}if(!Re(r))continue;let a=S(e,n,e=>i(e.type??``)===`searchfield`&&e.label===`Search`);a&&(t.suppressNode(r,[a]),ze(r,a,t),M(e,n,a,t))}}function Le(e){return i(e.type??``)===`searchfield`&&e.label===`Search`}function Re(e){let t=i(e.type??``);return e.label===`Toolbar`&&(t===`toolbar`||t===`searchfield`)}function M(e,t,n,r){y(e,t,e=>{e.index!==n.index&&Be(e)&&r.suppressNode(e,[n])})}function ze(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){let e=n.sourceNodesByIndex.get(r.parentIndex);if(!e||e.label!==`Toolbar`)return;n.suppressNode(e,[t]),r=e}}function Be(e){let t=i(e.type??``);return t===`button`?!1:t===`image`||e.label===`Search`}function Ve(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?.label?.trim();!r||t.isSuppressed(r)||!i||He(e,n,r,i,t)}}function He(e,t,n,r,a){let o=i(n.type??``);if(o===`statictext`||o===`link`){N(e,t,r,n,a);return}if(o!==`other`)return;let s=Ue(e,t,r);if(s){a.suppressNode(n,[s]);return}N(e,t,r,n,a)}function Ue(e,t,n){return S(e,t,e=>{let t=i(e.type??``);return(t===`link`||t===`searchfield`||b(e.type))&&e.label?.trim()===n})}function N(e,t,n,r,i){y(e,t,e=>{!i.semanticRepresentativeIndexes.has(e.index)&&re(e,n)&&i.suppressNode(e,[r])})}function We(e,t){A(e,(n,r,i)=>{let a=S(e,i,e=>T(e)&&e.label?.trim()===r&&(g(e.rect,n.rect)||Ge(n,e)));a&&t.suppressNode(n,[a])})}function Ge(e,t){if(t.label?.trim()!==e.label?.trim())return!1;let n=i(t.type??``);return Ke(e,n)||n===`textfield`||qe(e,n,t)}function Ke(e,t){let n=e.label?.trim();return t===`button`&&(n===`Dismiss`||n===`Back`)}function qe(e,t,n){return t!==`button`||!e.rect||!n.rect?!1:e.rect.x===0&&e.rect.y===0&&e.rect.width>=300&&e.rect.height>=600&&n.rect.width<e.rect.width}function Je(e,t){let n=E(e);for(let r of e){if(i(r.type??``)!==`other`||r.hittable===!0||r.label?.trim()||r.value?.trim()||!r.identifier?.trim())continue;let e=se(r,n);(e.length!==0||r.hittable===!1)&&t.suppressNode(r,e)}}function Ye(e,t){Ne(e,t),Je(e,t),me(e,t),Ie(e,t),We(e,t),ke(e,t.replacements),Me(e,t),Ve(e,t)}function Xe(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?Ze(e,n,r,t):void 0;!r?.rect||!i||et(e,n,r,i,t)}}function Ze(e,t,r,a){let o=r.label?.trim();if(i(r.type??``)!==`cell`||o&&!Qe(o,r.identifier)&&!n(o))return o;let s=w(e,t).find($e),c=s?.label?.trim();return!s||!c?o:(C(a.replacements,r,{label:c}),a.suppressNode(s,[r]),c)}function Qe(e,t){return t?.trim()===e&&/^[A-Z_$][A-Za-z0-9_$]*Cell$/.test(e)}function $e(e){if(!e.label?.trim())return!1;let t=i(e.type??``);return t===`statictext`||t===`text`||t===`textview`}function et(e,t,n,r,a){let o=i(n.type??``);if(o===`button`){P(w(e,t),r,a,n);return}if(o!==`cell`)return;let s=w(e,t);tt(s,n,r,a)||nt(s,n,r,a)}function tt(e,t,n,r){let i=e.find(e=>it(e,t,n));if(!i)return!1;let a=e.find(e=>F(e,t,n)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&C(r.replacements,i,{identifier:o}),r.suppressNode(t,[i]),rt(e,t,n,i,r),!0}function nt(e,t,n,r){let i=e.find(e=>F(e,t,n));if(!i){e.some(ae)&&P(e,n,r,t);return}!t.identifier&&i.identifier&&C(r.replacements,t,{identifier:i.identifier}),r.suppressNode(i,[t]),P(e.filter(e=>e.index!==i.index),n,r,t)}function rt(e,t,n,r,i){for(let a of e)a.index!==r.index&&(F(a,t,n)||I(a,t)||at(a,r)||x(a,n))&&i.suppressNode(a,[r])}function P(e,t,n,r){for(let i of e)(x(i,t)||r&&I(i,r))&&n.suppressNode(i,r?[r]:[])}function F(e,t,n){if(i(e.type??``)!==`button`)return!1;let r=t.identifier?.trim(),a=e.identifier?.trim();return r&&a&&r===a?!0:e.label?.trim()===n&&g(e.rect,t.rect)}function I(e,t){return i(e.type??``)===`button`&&!e.label?.trim()&&!e.value?.trim()&&g(e.rect,t.rect)}function it(e,t,n){if(i(e.type??``)!==`switch`)return!1;let r=t.identifier?.trim(),a=e.identifier?.trim();return r&&a&&r===a?!0:e.label?.trim()===n}function at(e,t){if(i(e.type??``)!==`switch`||e.index===t.index)return!1;let n=e.label?.trim();return n===t.value?.trim()||n===`0`||n===`1`}const L=1.15;function ot(e,t,n){let r=new Map(e.map((e,t)=>[e.index,t]));for(let[i,a]of e.entries()){let o=st(e,r,t,a,n);if(!o)continue;z(e,i,n);let s=B(o.shelfRect,2);for(let t of o.intermediateSiblings){if(gt(t)||!t.rect||!l(t.rect,s))continue;let i=r.get(t.index);i!==void 0&&z(e,i,n)}}}function st(e,t,n,r,i){let a=ct(r,n,i.sourceNodesByIndex);if(!a)return;let o=dt(e,t,a.siblings,a.position,a.parent);if(!(o<0))return{shelfRect:a.rect,intermediateSiblings:a.siblings.slice(a.position+1,o)}}function ct(e,t,n){let r=ft(e,R(t,e.index));if(!r)return;let i=ut(e,n);if(!i||!i.rect)return;let a=R(t,i.index),o=a.findIndex(t=>t.index===e.index);if(lt(a,o,e,r))return{rect:r.rect,parent:i,siblings:a,position:o}}function R(e,t){return e.get(t)??[]}function lt(e,t,n,r){if(t<1)return!1;let i=pt(e,t,n);return i?!r.childActionsPresented||!mt(i,r.actionButtons):!1}function ut(e,t){return typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0}function dt(e,t,n,r,i){return n.findIndex((n,a)=>a>r&&ht(e,t.get(n.index),n,i))}function ft(e,t){if(!b(e.type)||!e.rect)return;let n=e.rect,a=t.filter(e=>i(e.type??``)===`button`&&e.rect);if(a.length===0&&e.hiddenContentBelow===!0)return{rect:n,childActionsPresented:!1,actionButtons:a};if(a.length<3)return;let o=a.map(e=>e.rect.x+e.rect.width/2);if(o.every((e,t)=>t===0||e>o[t-1]))return{rect:n,childActionsPresented:a.some(e=>r(n,e.rect)),actionButtons:a}}function pt(e,t,n){if(!(!n.rect||t<1))for(let r=t-1;r>=0;--r){let t=e[r];if(!(!t.rect||!T(t))&&t.rect.x+t.rect.width/2<n.rect.x&&_t(t.rect,B(n.rect,2)))return t}}function mt(e,t){if(!e.rect||t.length===0)return!1;let n=Math.max(...t.map(e=>e.rect?.width??0)),r=Math.max(...t.map(e=>e.rect?.height??0));return e.rect.width>n*L||e.rect.height>r*L}function ht(e,t,n,r){return t!==void 0&&i(n.type??``)===`other`&&g(n.rect,r.rect)&&!!S(e,t,T)}function z(e,t,n){let r=e[t];if(r){n.suppressNode(r,[]);for(let r of w(e,t))n.suppressNode(r,[])}}function gt(e){let t=i(e.type??``);return t===`textfield`||t===`securetextfield`||t===`searchfield`||t===`textview`}function B(e,t){return{x:e.x-t,y:e.y-t,width:e.width+t*2,height:e.height+t*2}}function _t(e,t){return Math.max(e.y,t.y)<=Math.min(e.y+e.height,t.y+t.height)}function vt(e,t){let n=E(e);ot(e,n,t),yt(e,n,t)}function yt(e,t,n){for(let r of e){if(i(r.type??``)!==`navigationbar`||!r.rect)continue;let e=t.get(r.index)??[],a=e.flatMap(t=>bt(t,e,r.rect));if(a.length!==1)continue;let{field:o,title:s,image:c,label:l}=a[0];C(n.replacements,o,{type:`Button`,label:l,enabled:!0,hittable:void 0,rect:d([c.rect,o.rect,s.rect])}),n.semanticRepresentativeIndexes.add(o.index),n.suppressNode(s,[o]),n.suppressNode(c,[o])}}function bt(e,t,n){let r=s(e);if(!xt(e,r))return[];let i=V(t,e=>St(e,r)),a=V(t,Ct);return i?.rect&&a?.rect&&wt(a.rect,e.rect,i.rect,n)?[{field:e,title:i,image:a,label:r}]:[]}function xt(e,t){return i(e.type??``)===`textfield`&&e.enabled===!1&&!!e.rect&&!!t&&e.value?.trim()===t}function St(e,t){return i(e.type??``)===`statictext`&&e.label?.trim()===t&&!!e.rect}function Ct(e){return i(e.type??``)===`image`&&!!e.identifier?.trim()&&!!e.rect}function V(e,t){let n=e.filter(t);return n.length===1?n[0]:void 0}function wt(e,t,n,i){let a=t.x-(e.x+e.width),o=n.x-(t.x+t.width);return r(i,e)&&r(i,t)&&r(i,n)&&a>=0&&a<=12&&o>=0&&o<=12&&H(e,t)&&H(t,n)}function H(e,t){return Math.max(e.y,t.y)<=Math.min(e.y+e.height,t.y+t.height)}function Tt(e,t){let n=E(e);for(let r of e){if(i(r.type??``)===`element(58)`){C(t.replacements,r,{type:`WebView`});continue}let e=Et(r,t.sourceNodesByIndex,n);if(e?.kind===`suppress`){t.suppressNode(r,[]);continue}e&&(C(t.replacements,r,{type:e.type,...e.type===`Heading`?{value:void 0}:{}}),t.semanticRepresentativeIndexes.add(r.index))}}function Et(e,t,n){if(i(e.type??``)!==`other`)return null;let r=oe(e,t,kt),a=e.label?.trim();return!r||!a?null:Ot(e,r,a)?{kind:`suppress`}:Dt(e,a,n)?{kind:`semantic`,type:At(e.value)?`Heading`:`StaticText`}:null}function Dt(e,t,n){let r=n.get(e.index);if(r?.length!==1)return!1;let a=r[0];return i(a.type??``)===`statictext`&&a.label?.trim()===t&&!n.has(a.index)}function Ot(e,t,n){return e.parentIndex===t.index&&t.label?.trim()===n&&!At(e.value)}function kt(e){let t=i(e.type??``);return t===`webview`||t===`element(58)`}function At(e){return/^[1-6]$/.test(e?.trim()??``)}const jt=[Tt,vt,le,Xe,Ye];function U(e){if(e.length===0)return{nodes:e,presentedIndexesBySourceIndex:new Map};let t=new Map,n=new Map,r=new Set,i=new Map(e.map(e=>[e.index,e])),a=new Set,o={replacements:t,semanticRepresentativeIndexes:r,sourceNodesByIndex:i,isSuppressed:e=>a.has(e.index),suppressNode(e,t){if(a.add(e.index),t.length===0)return;let r=n.get(e.index)??new Set;for(let e of t)r.add(e.index);n.set(e.index,r)}};for(let t of jt)t(e,o);if(a.size===0&&t.size===0)return{nodes:e,presentedIndexesBySourceIndex:new Map(e.map(e=>[e.index,[e.index]]))};let s=e.filter(e=>!a.has(e.index)).map(e=>t.get(e.index)??e),c=ie(s,a,e),l=new Map(s.map((e,t)=>[e.index,c[t].index]));return{nodes:c,presentedIndexesBySourceIndex:new Map(e.map(e=>[e.index,W(e.index,l,n)]))}}function W(e,t,n,r=new Set){let i=t.get(e);if(i!==void 0)return[i];if(r.has(e))return[];r.add(e);let a=new Set;for(let i of n.get(e)??[])for(let e of W(i,t,n,r))a.add(e);return[...a].sort((e,t)=>e-t)}var G=class extends Error{code=`IOS_SNAPSHOT_ENGINE_FAILED`;reason;details;constructor(e,t,n={}){super(t),this.name=`IosSnapshotEngineError`,this.reason=e,this.details=n}};function Mt(e){return{reason:e.reason,...e.details}}function K(e){let t=new Map;for(let[n,r]of e.entries()){if(!Number.isInteger(r.index)||r.index<0||t.has(r.index))throw new G(`malformed-graph`,`iOS snapshot graph contains a duplicate or invalid node index`,{index:r.index});if(t.set(r.index,n),r.depth!==void 0&&(!Number.isInteger(r.depth)||r.depth<0))throw new G(`malformed-graph`,`iOS snapshot graph contains an invalid node depth`,{index:r.index,field:`depth`})}for(let[n,r]of e.entries()){if(r.parentIndex===void 0)continue;let e=t.get(r.parentIndex);if(e===void 0||e>=n)throw new G(`malformed-graph`,`iOS snapshot graph parent must precede its child`,{index:r.index,parentIndex:r.parentIndex})}}const q=new Set([`collectionview`,`scrollview`,`table`]),Nt=new Set([`application`,`window`]);function Pt(){return{projectedOut:!1}}function Ft(e,t,n,r,o,s){let c=s===`cursor-projected`?t.ancestorClip:void 0,l=It(e.rect,n,c),u=a(J(e.rect)),d=a(l),f=i(e.type??``),p=Lt(s,t.projectedOut,u,d,f,o),m=Wt(e,Rt(s,t.projectedOut,u,d)&&!zt(e,u,s),r,s),h=Ut(f,m,d,o),g=Vt(s,t.projectedOut,u,d,e);return{isIncluded:m,descendants:Bt(s,p,c,l,h),effectiveRect:l,...g?{hiddenContentFrame:g}:{},establishesScrollAnchor:h}}function It(e,t,n){let r=J(e);if(!r)return;let i=Y(r,t);return n&&(i=Y(i,n)),i}function Lt(e,t,n,r,i,a){return e===`plain-viewport`?!r:t||n&&!r&&Ht(i,a)}function Rt(e,t,n,r){return e===`plain-viewport`?r:!t&&(!n||r)}function zt(e,t,n){return n!==`cursor-projected`||e.parentIndex===void 0||Gt(e)||!t?!1:Kt(e.rect)<=1||qt(e.rect)<=1}function Bt(e,t,n,r,i){return{projectedOut:t,...e===`cursor-projected`&&i?{ancestorClip:r}:{ancestorClip:n}}}function Vt(e,t,n,r,i){if(!(e!==`cursor-projected`||t||!n||r))return J(i.rect)}function Ht(e,t){return t&&(e===`cell`||q.has(e))}function Ut(e,t,n,r){return t&&n&&r&&q.has(e)}function Wt(e,t,n,r){if(e.parentIndex===void 0)return!0;let a=i(e.type??``);return r===`plain-viewport`&&n&&!t&&a!==`application`?!1:Nt.has(a)||t}function Gt(e){return[e.label,e.identifier,e.value].some(e=>typeof e==`string`&&e.trim().length>0)}function J(e){if(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite)&&!(e.width<0||e.height<0))return{...e,width:Math.max(0,e.width),height:Math.max(0,e.height)}}function Kt(e){return J(e)?.width??0}function qt(e){return J(e)?.height??0}function Y(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?{x:e.x,y:e.y,width:0,height:0}:{x:i>n?n:e.x,y:a>r?r:e.y,width:i-n,height:a-r}}function Jt(e){let t=E(e),n=new Set;for(let e of t.values()){let r=Yt(e,t);if(r){for(let i of e.slice(0,-1))if(Xt(r,i)){n.add(i.index);for(let e of se(i,t))n.add(e.index)}}}return n}function Yt(e,t){let n=e.at(-1);if(!n||!Zt(n))return;let r=(t.get(n.index)??[]).find(Qt);if(!(r?.userInteractionEnabled!==!0||!a(r.rect)))return{container:n,dimmingRect:r.rect}}function Xt(e,t){return Zt(t)&&a(t.rect)&&r(e.dimmingRect,t.rect)}function Zt(e){return $t(e,`uitransitionview`)}function Qt(e){return $t(e,`uidimmingview`)}function $t(e,t){return i(e.role??``)===t}function en(e,t,n,r,i={}){K(e);let a=Jt(e),o=e.filter(e=>!a.has(e.index)),s=tn(o),c=new Map,l=[],u=new Map,d=0;for(let e of o){let a=nn(e,c,()=>{d+=1}),o=a?.traversal??Pt(),f=r===`cursor-projected`?a?.anchor:void 0,p=Ft(e,o,t,n,s.has(e.index),r);rn(p,f,u);let m=an(e,p,a,l,t,i),h=sn(p,f,m.keptIndex);c.set(e.index,{traversal:p.descendants,anchor:h,keptIndex:m.keptIndex,keptDepth:m.keptDepth})}let f=ln(u,l);return{nodes:f,stats:{presentedNodeCount:f.length,sourceNodeCount:e.length,parentClipLookups:d,modalContainedNodeCount:a.size}}}function tn(e){let t=new Set;for(let n of e)n.parentIndex!==void 0&&t.add(n.parentIndex);return t}function nn(e,t,n){if(e.parentIndex!==void 0)return n(),t.get(e.parentIndex)}function rn(e,t,n){e.hiddenContentFrame&&t&&cn(e.hiddenContentFrame,t,n)}function an(e,t,n,r,i,a){let o=n?.keptIndex,s=n?.keptDepth??-1;if(!t.isIncluded)return{keptIndex:o,keptDepth:s};let c=r.length;s+=1;let{hittable:l,...u}=e;return r.push({raw:{...u,index:c,depth:s,parentIndex:o,...on(l,e.parentIndex!==void 0,t.effectiveRect,e.enabled!==!1,i,a)},sourceIndex:e.index,...t.effectiveRect?{effectiveRect:t.effectiveRect}:{}}),o=c,{keptIndex:o,keptDepth:s}}function on(e,t,n,r,i,a){return a.hittabilityAvailable===!1?e===!1||!r?{hittable:!1}:{}:{hittable:t&&e===!0&&u(r,n,i)}}function sn(e,t,n){return e.establishesScrollAnchor&&n!==void 0&&e.effectiveRect?{index:n,rect:e.effectiveRect}:t}function cn(e,t,n){let r=n.get(t.index)??{above:!1,below:!1};e.y+e.height<=t.rect.y?r.above=!0:e.y>=t.rect.y+t.rect.height&&(r.below=!0),n.set(t.index,r)}function ln(e,t){return t.map(t=>{let n=e.get(t.raw.index);if(!n)return t;let r=t.raw;return{...t,raw:{...r,hiddenContentAbove:r.hiddenContentAbove===!0||n.above?!0:void 0,hiddenContentBelow:r.hiddenContentBelow===!0||n.below?!0:void 0}}})}const un=new Set([`collectionview`,`scrollview`,`table`]);function dn(e){return fn(e.viewport)}function fn(e){if(e.kind===`missing`)throw new G(e.reason===`invalid`?`invalid-viewport`:`missing-viewport`,`regular iOS snapshot presentation requires a valid viewport`,{field:`viewport`});if(!a(e.rect))throw new G(`invalid-viewport`,`regular iOS snapshot presentation requires a positive finite viewport`,{field:`viewport`});return e.rect}function pn(e,t,n,r=!0){K(e);let i=new Map,o=0;for(let s of e){let e=mn(s,i,t,()=>{o+=1}),c=bn(s.rect);if(hn(s,r),!c||!a(c)){gn(s,c),i.set(s.index,e);continue}_n(s,c,e),vn(s,c,t),i.set(s.index,yn(s,c,e,n))}return{parentClipLookups:o}}function mn(e,t,n,r){if(e.parentIndex===void 0)return n;r();let i=t.get(e.parentIndex);if(!i)throw new G(`invalid-presented-payload`,`regular iOS snapshot payload refers to a parent outside the payload`,{index:e.index,parentIndex:e.parentIndex});return i}function hn(e,t){if(!(e.hittable!==!0||t))throw new G(`invalid-presented-payload`,`iOS snapshot payload marked a node actionable without hittability evidence`,{index:e.index})}function gn(e,t){if(e.hittable===!0)throw new G(`regular-degenerate-actionable-node`,`regular iOS snapshot node with a missing or degenerate frame is actionable`,{index:e.index,frame:t??e.rect})}function _n(e,t,n){if(!xn(t,n))throw new G(`regular-node-outside-cumulative-clip`,`regular iOS snapshot node escaped its cumulative clip`,{index:e.index,frame:t,clip:n})}function vn(e,t,n){if(!(e.hittable!==!0||e.enabled!==!1&&o(n,t.x+t.width/2,t.y+t.height/2)))throw new G(`invalid-presented-payload`,`regular iOS snapshot payload marked a disabled or off-viewport node actionable`,{index:e.index,frame:t})}function yn(e,t,n,r){return r===`cursor-projected`&&un.has(i(e.type??``))?t:n}function X(e,t,n,r,i=!0){if(t===`raw`)return K(e),{parentClipLookups:0};if(!n)throw new G(`missing-viewport`,`regular iOS snapshot payload cannot be validated without a viewport`,{field:`viewport`});try{return pn(e,n,r,i)}catch(e){throw e instanceof G&&e.code===`IOS_SNAPSHOT_ENGINE_FAILED`&&e.reason===`malformed-graph`?new G(`invalid-presented-payload`,e.message,e.details):e}}function bn(e){if(!(!e||![e.x,e.y,e.width,e.height].every(Number.isFinite))&&!(e.width<0||e.height<0))return{...e,width:Math.max(0,e.width),height:Math.max(0,e.height)}}function xn(e,t){let n=1e-4;return r({x:t.x-n,y:t.y-n,width:t.width+n*2,height:t.height+n*2},e)}const Sn=new Set([`button`,`cell`,`checkbox`,`collectionview`,`link`,`menuitem`,`picker`,`searchfield`,`securetextfield`,`segmentedcontrol`,`slider`,`scrollview`,`stepper`,`switch`,`tabbar`,`table`,`textfield`,`textview`,`webview`]);function Cn(e){let t=Fn(e.nodes),n=Tn(e,t);return e.projection===`raw`?En(n,e.depth,t):Dn(n,e.depth)}function Z(e){let t=Fn(e.nodes);return e.projection===`raw`?En(e.nodes,e.depth,t):Dn(e.nodes,e.depth)}function wn(e){return e.parentIndex===void 0||Sn.has(i(e.type??``))||In(e)}function Tn(e,t){let n=e.scope?.trim().toLowerCase();if(!n)return[...e.nodes];for(let r=0;r<e.nodes.length;r+=1){let i=e.nodes[r];if(!i||!Nn(i.raw,n))continue;let a=Pn(e.nodes,r,t);if(!(e.projection===`raw`||a.some(t=>wn(e.nodes[t].raw))))continue;let o=a.map(t=>e.nodes[t]);return Mn(e.projection===`raw`&&e.depth!==null?o.filter(n=>Q(n,t)-Q(i,t)<=e.depth):o,Q(i,t),t)}return[]}function En(e,t,n){let r=t===null?[...e]:e.filter(e=>Q(e,n)<=t);return{nodes:r.map(e=>({...e.raw,rect:e.raw.rect})),sourceIndexes:r.map(e=>e.sourceIndex)}}function Dn(e,t){let n=[],r=[],i=new Map;for(let a of e){let e=On(a,i),o=kn(a,e,t,n.length);if(!o){jn(a,e,i);continue}n.push(o),r.push(a.sourceIndex),i.set(a.raw.index,o)}return{nodes:n,sourceIndexes:r}}function On(e,t){return e.raw.parentIndex===void 0?void 0:t.get(e.raw.parentIndex)}function kn(e,t,n,r){if(!wn(e.raw))return;let i=t?(t.depth??0)+1:0;if(n!==null&&i>n)return;let a=An(e);return{...e.raw,index:r,depth:i,parentIndex:t?.index,...e.effectiveRect?{rect:e.effectiveRect}:{rect:void 0},...a===void 0?{}:{hittable:a}}}function An(e){if(e.raw.hittable!==void 0)return!!(e.raw.hittable===!0&&e.effectiveRect&&e.effectiveRect.width>0&&e.effectiveRect.height>0)}function jn(e,t,n){t&&n.set(e.raw.index,t)}function Mn(e,t,n){let r=new Map(e.map((e,t)=>[e.raw.index,t]));return e.map((e,i)=>({...e,raw:{...e.raw,index:i,depth:Math.max(0,Q(e,n)-t),parentIndex:e.raw.parentIndex===void 0?void 0:r.get(e.raw.parentIndex)}}))}function Nn(e,t){return[e.label,e.identifier,e.value].some(e=>typeof e==`string`&&e.toLowerCase().includes(t))}function Pn(e,t,n){let r=Q(e[t],n),i=[];for(let a=t;a<e.length&&!(a>t&&Q(e[a],n)<=r);a+=1)i.push(a);return i}function Q(e,t){return Math.max(0,e.raw.depth??t?.get(e.raw.index)??0)}function Fn(e){let t=new Map;for(let n of e){let e=(n.raw.parentIndex===void 0?-1:t.get(n.raw.parentIndex)??-1)+1;t.set(n.raw.index,n.raw.depth===void 0?e:Math.max(0,n.raw.depth))}return t}function In(e){return[e.label,e.identifier,e.value].some(e=>typeof e==`string`&&e.trim().length>0)}function Ln(e,t,n=`cursor-projected`){Rn(e,t);let r=e.validation.presentationKey.projection,i=r===`regular`?fn(e.validation.viewport):void 0,a=e.validation.hittability.kind===`available`,o=zn(e,r,i,n,a),s=Bn(e.presentation.payload.nodes,r,t),c=Vn(s.nodes,r,i,n,a,o);return{nodes:s.nodes,...i?{validatedViewport:i}:{},...e.presentation.qualityPayload?{qualityNodes:[...e.presentation.qualityPayload.nodes]}:{},presentedIndexesBySourceIndex:s.presentedIndexesBySourceIndex,stats:{presentedNodeCount:s.nodes.length,sourceNodeCount:e.presentation.payload.nodes.length,parentClipLookups:c.parentClipLookups,modalContainedNodeCount:0}}}function Rn(e,t){if(!Hn(_(t),e.validation.presentationKey))throw new G(`projection-mismatch`,`presented iOS snapshot does not match the requested presentation key`,{projection:e.validation.presentationKey.projection});if(e.presentation.intent!==t.acquisitionIntent)throw new G(`projection-mismatch`,`presented iOS snapshot does not match the requested acquisition intent`,{field:`acquisitionIntent`})}function zn(e,t,n,r,i){let a=X(e.presentation.payload.nodes,t,n,r,i);if(e.presentation.qualityPayload)try{X(e.presentation.qualityPayload.nodes,t,n,r,i)}catch(e){throw e instanceof G?new G(`invalid-quality-payload`,e.message,e.details):e}return a}function Bn(e,t,n){return t===`regular`&&n.interactiveOnly?U([...e]):{nodes:[...e],presentedIndexesBySourceIndex:Un(e)}}function Vn(e,t,n,r,i,a){return t!==`regular`||!n?a:X(e,t,n,r,i)}function Hn(e,t){return e.projection===t.projection&&e.interactiveOnly===t.interactiveOnly&&e.depth===t.depth&&e.scope===t.scope&&e.customActions===t.customActions}function Un(e){return new Map(e.map(e=>[e.index,[e.index]]))}function Wn(t,n,r={}){let i=Gn(t,n,r),a=t.stage===`presented`?t.validation.presentationKey:_(n),o=t.stage===`acquired`?t.acquisition.truncated:t.presentation.payload.truncated;return{payload:{nodes:e(i.nodes),...o===void 0?{}:{truncated:o}},presentationKey:a,comparisonIdentity:te(t,n),residue:t.stage===`acquired`?[...t.acquisition.residue]:[...t.validation.residue],...i.validatedViewport?{validatedViewport:i.validatedViewport}:{}}}function Gn(e,t,n={}){let r=n.foldPolicy??`cursor-projected`;return e.stage===`acquired`?Kn(e.acquisition,t,r):Ln(e,t,r)}function Kn(e,t,n){if(Jn(e,ee(t)),t.projection===`raw`){K(e.nodes);let r=e.nodes.map(e=>({raw:e,sourceIndex:e.index})),i=Cn({nodes:r,projection:`raw`,scope:t.scope,depth:t.depth,foldPolicy:n}),a=t.scope===null?void 0:Z({nodes:r,projection:`raw`,depth:null,foldPolicy:n}).nodes;return{nodes:i.nodes,...a?{qualityNodes:a}:{},presentedIndexesBySourceIndex:$(e.nodes,i.nodes,i.sourceIndexes,Yn(i.nodes)),stats:{presentedNodeCount:i.nodes.length,sourceNodeCount:e.nodes.length,parentClipLookups:0,modalContainedNodeCount:0}}}let r=dn(e),i=!qn(e.residue),a=en(e.nodes,r,t.interactiveOnly,n,{hittabilityAvailable:i}),o=Cn({nodes:a.nodes,projection:`regular`,scope:t.scope,depth:t.depth,foldPolicy:n}),s=t.interactiveOnly?U(o.nodes):{nodes:o.nodes,presentedIndexesBySourceIndex:Yn(o.nodes)},c=X(s.nodes,`regular`,r,n,i),l=t.scope===null?void 0:Z({nodes:a.nodes,projection:`regular`,depth:null,foldPolicy:n}).nodes;return{nodes:s.nodes,validatedViewport:r,...l?{qualityNodes:l}:{},presentedIndexesBySourceIndex:$(e.nodes,o.nodes,o.sourceIndexes,s.presentedIndexesBySourceIndex),stats:{presentedNodeCount:s.nodes.length,sourceNodeCount:e.nodes.length,parentClipLookups:a.stats.parentClipLookups+c.parentClipLookups,modalContainedNodeCount:a.stats.modalContainedNodeCount}}}function qn(e){return e.some(e=>e.kind===`unavailable-fact`&&e.fact===`hittability`)}function Jn(e,t){let n=e.hint;if(n.projection!==t.projection||n.rawTraversalDepth!==t.rawTraversalDepth||n.regularPresentedDepth!==t.regularPresentedDepth||n.interactiveOnly!==t.interactiveOnly||n.customActions!==t.customActions||n.acquisitionIntent!==t.acquisitionIntent)throw new G(`projection-mismatch`,`acquired iOS snapshot does not match the requested capture hint`,{projection:n.projection})}function Yn(e){return new Map(e.map(e=>[e.index,[e.index]]))}function $(e,t,n,r){let i=new Map(t.map((e,t)=>[e.index,n[t]])),a=new Map(e.map(e=>[e.index,[]]));for(let[e,t]of r){let n=i.get(e);n!==void 0&&a.set(n,t)}return a}export{U as a,Mt as i,Ln as n,G as r,Wn as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{ei as t}from"./sdk-batch.js";import{i as n,r}from"./ios-snapshot-planning.js";import{i,r as a,t as o}from"./ios-snapshot-engine.js";const s={"acquisition-depth":`iOS snapshot acquisition does not report hierarchy completeness; provider-side depth or child limits may omit nodes.`,hittability:`iOS snapshot acquisition does not provide hittability evidence; regular snapshots omit unverified hittability while raw snapshots preserve supplied facts.`,truncation:`iOS snapshot acquisition does not expose truncation metadata; tree completeness is not independently verified.`};function c(e,n){let i=r({raw:n?.raw,interactiveOnly:n?.interactiveOnly,depth:n?.depth,scope:n?.scope,customActions:n?.customActions,acquisitionIntent:e.acquisition.intent}),a=l(e,i);try{let n=o(a,i),r=t(n.validatedViewport);return{backend:`xctest`,producer:e.acquisition.producer,nodes:[...n.payload.nodes],comparisonIdentity:n.comparisonIdentity,...e.acquisition.truncated===void 0?{}:{truncated:e.acquisition.truncated},...r?{viewport:r}:{},...u(e.acquisition.residue)}}catch(e){d(e)}}function l(e,t){let r=n(t);return e.acquisition.intent===`full`?{stage:`acquired`,acquisition:{...e.acquisition,intent:`full`,hint:{...r,acquisitionIntent:`full`}}}:{stage:`acquired`,acquisition:{...e.acquisition,intent:`surface-observation`,hint:{...r,acquisitionIntent:`surface-observation`}}}}function u(e){let t=new Set(e.flatMap(e=>{if(e.kind===`missing-viewport`)return[`iOS snapshot acquisition did not provide a valid viewport (${e.reason}); retry with --raw to inspect the acquired tree, while regular presentation requires viewport evidence.`];if(e.kind!==`unavailable-fact`)return[];let t=s[e.fact];return t?[t]:[]}));return t.size===0?{}:{warnings:[...t]}}function d(t){if(!(t instanceof a))throw t;let n=i(t),r=t.reason===`missing-viewport`||t.reason===`invalid-viewport`?`Use snapshot --raw to inspect the acquired iOS tree; regular presentation requires valid viewport evidence.`:void 0;throw new e(`COMMAND_FAILED`,t.message,{...n,...r?{hint:r}:{}},t)}export{c as presentIosSnapshotAcquisition};
|
package/dist/src/keyed-lock.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AsyncLocalStorage as e}from"node:async_hooks";const t=new e;async function n(e,n,r){let i=t.getStore()??[]
|
|
1
|
+
import{AsyncLocalStorage as e}from"node:async_hooks";const t=new e;async function n(e,n,r){let i=t.getStore()??[],a=i.find(t=>t.active&&t.locks===e&&t.key===n);if(a){let e,t=new Promise(t=>{e=t});a.descendants.add(t);try{return await r()}finally{a.descendants.delete(t),e()}}let o=(e.get(n)??Promise.resolve()).catch(()=>{}).then(async()=>{let a={locks:e,key:n,active:!0,descendants:new Set};try{return await t.run([...i.filter(e=>e.active),a],r)}finally{for(;a.descendants.size>0;)await Promise.all(a.descendants);a.active=!1}});return e.set(n,o),o.finally(()=>{e.get(n)===o&&e.delete(n)})}export{n as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{r as t}from"./diagnostics.js";import"./diagnostics2.js";import{
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{r as t}from"./diagnostics.js";import"./diagnostics2.js";import{nn as n}from"./sdk-batch.js";import{s as r}from"./app-resolution.js";import{n as i}from"./alert.js";const a=`launch_confirmation_foreign_app`,o=/^Open in [“"].+[”"]\?$/u,s=1e4;async function c(n){let r=await u(n);if(`outcome`in r)return r;let i=r.alert;if(!i)return{outcome:`absent`};if(!p(i))return t({level:`warn`,phase:`ios_launch_confirmation_unanswered`,data:{reason:`alert-unrecognized`,title:i.message,buttons:i.items}}),{outcome:`unanswered`,reason:`alert-unrecognized`};let o=await d(n);if(`outcome`in o)return o;if(o.owner===void 0)return h(`url-owner-unresolved`,{}),{outcome:`unanswered`,reason:`url-owner-unresolved`};if(o.owner!==n.appBundleId)throw new e(`COMMAND_FAILED`,`The launch URL asks to open ${o.owner} instead.`,{reason:a,foreignAppBundleId:o.owner,sessionAppBundleId:n.appBundleId,hint:`iOS is asking whether to open ${o.owner}. Answer it with alert accept or alert dismiss, and pass a launch URL whose scheme belongs to the session app.`});return await n.acceptAlert().then(f,async e=>await l(n,i,e))}async function l(e,t,n){let r=await u(e);return`outcome`in r?m(`alert-accept`)(n):r.alert&&p(r.alert)&&r.alert.message===t.message?(h(`alert-still-present`,{}),{outcome:`unanswered`,reason:`alert-still-present`}):m(`alert-accept`)(n)}async function u(e){return await e.readAlert().then(e=>({alert:e}),m(`alert-read`))}async function d(e){return await e.resolveUrlOwner().then(e=>({owner:e}),m(`url-owner`))}function f(){return{outcome:`accepted`}}function p(e){let t=e.message,n=e.items;return typeof t==`string`&&o.test(t)&&Array.isArray(n)&&n.length===2&&n.includes(`Cancel`)&&n.includes(`Open`)}function m(t){return n=>(h(`step-failed`,{step:t,code:n instanceof e?n.code:void 0}),{outcome:`unreadable`,step:t})}function h(e,n){t({level:`debug`,phase:`ios_launch_confirmation_unanswered`,data:{reason:e,...n}})}async function g(e,t,n,r){let i=await n.then(e=>({interactor:e}),m(`runner`));return`outcome`in i?i:await c(_(e,t,i.interactor,r))}function _(e,{url:t,appBundleId:a},o,c){let l=o.readAlert?.bind(o),u=o.acceptAlert?.bind(o);if(!l||!u)throw n(`Apple interactor has no alert read or accept leg`);let d={appBundleId:a,surface:`app`};return Object.freeze({appBundleId:a,readAlert:async()=>await i(l(d)),acceptAlert:async()=>await u(d),resolveUrlOwner:async()=>await r(e,t,{timeoutMs:s,signal:c})})}export{a as LAUNCH_CONFIRMATION_FOREIGN_APP_REASON,s as URL_OWNER_LOOKUP_TIMEOUT_MS,c as answerLaunchConfirmation,g as answerSimulatorLaunchConfirmation,_ as createLaunchConfirmationPort};
|
package/dist/src/lease.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{L as e,P as t,U as n}from"./sdk-contracts.js";import{E as r,_t as i,ft as a,ht as o,lt as s}from"./back-mode.js";import{rn as c}from"./sdk-batch.js";import{c as l}from"./device-shell.js";import{i as u,r as d}from"./request-cancel.js";import"./request.js";import{Ct as f,St as p,Tt as m,ht as h,mt as g,vt as _}from"./internal/daemon.js";async function v(e){let{req:t,sessionName:n,sessionStore:s,leaseRegistry:l,providerRuntimeIds:f,providerRuntimeRequiredIds:m,providerCredentials:_,leaseLifecycleProvider:v,cloudArtifactProvider:S}=e,C=g(t);switch(t.command){case r.artifacts:return{ok:!0,data:await D(t,h(t,s.get(n)),l,S)};case`lease_allocate`:{F(C.leaseBackend),T(C.leaseProvider,f,m),E(C,t.meta?.providerCredentialFingerprint,_);let e=new Set(l.listActiveLeases().map(e=>e.leaseId)),n=l.allocateLease(a(C)),r=e.has(n.leaseId),i=t.meta?.requestId;return await l.runDeviceMutation(n,async()=>{let e,a=v?.allocate?l.retainLeaseWork(n,()=>!u(i)):void 0;try{e=await v?.allocate?.(n,{...w(t),signal:d(i),deadline:Date.now()+c}),N(l,n,e)}catch(e){throw await b(n,r,i,v,l),e}finally{a?.release()}if(u(i))throw await x(n,v,l);return{ok:!0,data:{lease:l.getLease(p(n))??n,...e?{provider:e}:{}}}})}case`lease_heartbeat`:{let e=l.heartbeatLease(o(C)),n=await v?.heartbeat?.(e,w(t));return{ok:!0,data:{lease:e,...n?{provider:n}:{}}}}case`lease_release`:{let e=i(C),n=l.getLease(e);P(n);let r=await l.runDeviceMutation(n,async()=>await y(l,v,n,e,w(t)));return{ok:!0,data:{released:r.registryReleased,...r.provider?{provider:r.provider}:{}}}}default:return null}}async function y(e,t,n,r,i){let a=n?await t?.release?.(n,i):void 0;return n&&N(e,n,a),{registryReleased:e.releaseLease(r).released,provider:a}}async function b(e,t,n,r,i){if(!t){i.releaseLease(p(e));return}if(u(n))throw await x(e,r,i)}async function x(e,t,r){let i=p(e),a,o;try{a=await y(r,t,e,i)}catch(e){o=n(e),a={registryReleased:r.releaseLease(i).released}}return S(e,a,o)}function S(t,n,r){let i=n.provider?.providerSessionId,a=Array.isArray(n.provider?.warnings)?n.provider.warnings:[],o=n.registryReleased&&r===void 0&&a.length===0;return e({leaseId:t.leaseId,leaseProvider:t.leaseProvider,released:o,registryReleased:n.registryReleased,providerSessionId:i,...a.length>0?{warnings:a}:{},...r===void 0?{}:{releaseError:r},hint:C(o,t.leaseId,i)})}function C(e,t,n){return e?`The lease request was canceled while the provider was still allocating; the session it produced was released.`:`The lease request was canceled while the provider was still allocating, and the session it produced could NOT be confirmed released — it may still be running and billing. Stop provider session ${String(n??`(unknown)`)} for lease ${t} by hand.`}function w(e){return{flags:e.flags,...typeof e.flags?.providerApp==`string`?{initialApp:e.flags.providerApp}:{},cwd:typeof e.meta?.cwd==`string`?e.meta.cwd:void 0,...e.internal?.publicNetworkOnly?{publicNetworkOnly:!0}:{}}}function T(e,n,r){if(!(!e||n===void 0||r===void 0||!r.includes(e)||n.includes(e)))throw new t(`UNSUPPORTED_OPERATION`,`Provider "${e}" is not available in this daemon runtime.`,{provider:e,hint:`Restart the daemon with ${e} configured, then retry lease allocation.`})}function E({leaseProvider:e,leaseBackend:n},r,i){if(!i||!e||!r)return;let a=i.fingerprint(e,n);if(r!==a)throw new t(`INVALID_ARGS`,a?`The running daemon holds different ${e} credentials than this shell.`:`The running daemon was started without the ${e} credentials this shell holds.`,{reason:`provider-credentials-changed`,provider:e,hint:`Stop it with agent-device daemon stop --state-dir ${l(i.stateDir)}, then rerun the command so a new daemon starts with this shell's environment.`})}async function D(e,t,n,r){let i=M(e.flags,`providerSessionId`);return O(t,i)?await k(t.tenantId):await A(t,i,n,r)}function O(e,t){return s(e)||!e.leaseProvider&&!t}async function k(e){let t=await m(e);return{source:`daemon`,status:`ready`,artifacts:t,...t.length===0?{message:`No daemon artifacts available.`}:{}}}async function A(e,n,r,i){if(!e.leaseProvider)throw new t(`INVALID_ARGS`,`artifacts requires --provider for provider session lookup or an active cloud connection.`);if(!e.leaseId&&!n)throw new t(`INVALID_ARGS`,`artifacts requires an active cloud lease or --provider-session <id>.`);let a=j(r,e,n),o=await i?.listCloudArtifacts?.({provider:e.leaseProvider,leaseId:a?.leaseId??e.leaseId,providerSessionId:n});if(!o)throw new t(`UNSUPPORTED_OPERATION`,`Cloud artifacts are not available for provider "${e.leaseProvider}".`);return o}function j(e,n,r){if(!r)return;let i=e.resolveProviderSession({provider:n.leaseProvider,providerSessionId:r,tenantId:n.tenantId});if(i)return i;throw new t(`UNAUTHORIZED`,`Provider session is not owned by the request tenant`,{reason:`PROVIDER_SESSION_NOT_OWNED`})}function M(e,t){let n=e?.[t];return typeof n==`string`&&n.trim().length>0?n.trim():void 0}function N(e,t,n){let r=_(n);r&&e.recordProviderSession(t,r)}function P(e){if(e?.backend===`macos-app`)throw new t(`UNAUTHORIZED`,`A macos-app lease is released by the host administrator.`,{reason:`MACOS_APP_LEASE_HOST_OWNED`,retriable:!1,hint:`Disconnect only drops the client connection; the host ends the lease.`})}function F(e){if(f(e)===`macos-app`)throw new t(`UNAUTHORIZED`,`A macos-app lease is allocated by the host administrator.`,{reason:`MACOS_APP_LEASE_HOST_ALLOCATED`,retriable:!1,hint:`Ask the host administrator for a macos-app lease and connect with its leaseId.`})}export{v as handleLeaseCommands};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{l as n,r}from"./exec.js";import"./command.js";import{a as i}from"./version.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{l as n,r}from"./exec.js";import"./command.js";import{a as i}from"./version.js";import{C as a,g as o,h as s,m as c}from"./adb-executor.js";import"./mechanics.js";import"./platform-runtime-android-adb-host.js";import{n as l}from"./android.js";var u=e({createLimrunRuntimeDependencies:()=>d});function d(){return{clientVersion:i(),android:{createInteractor:(e,t)=>l(e,t),createPortReverse:async(e,t)=>{let{createAndroidPortReverseManager:n}=await import(`./mechanics.js`).then(e=>e.r);return n(e,t)},inferAppName:async e=>{let{inferAndroidAppName:t}=await import(`./mechanics.js`).then(e=>e.r);return t(e)},listApps:async(e,t)=>{let{listAndroidAppsWithAdb:n}=await import(`./mechanics.js`).then(e=>e.r);return(await n(e,{filter:t,target:`mobile`})).map(e=>({id:e.package,name:e.name}))},getForegroundApp:async(e,t,n)=>{let{getAndroidAppStateWithAdb:r}=await import(`./platform-runtime.js`).then(e=>e.a),i=await r(async(e,r)=>await t(e,{...r,signal:n}),n);return i.package?{appId:i.package,activity:i.activity}:void 0},getKeyboardState:async e=>{let{getAndroidKeyboardStatusWithAdb:t}=await import(`./mechanics.js`).then(e=>e.r);return await t(e)},dismissKeyboard:async e=>{let{dismissAndroidKeyboardWithAdb:t}=await import(`./mechanics.js`).then(e=>e.r);return await t(e)},readLogs:async(e,t)=>{let{captureAndroidLogcatWithAdb:n}=await import(`./mechanics.js`).then(e=>e.r);return await n(e,{lines:t,timeoutMs:5e3})},forceStopApp:async(e,t,n)=>{let{runAdbShell:r}=await import(`./mechanics.js`).then(e=>e.r);await r(async(t,r)=>await e(t,{...r,signal:n}),[`am`,`force-stop`,t],{allowFailure:!0})},deviceAdbInvocation:(e,t)=>s(o(e),t),hostAdbInvocation:e=>s(c(),e),adbError:async(e,t,n)=>{let{androidAdbResultError:r,serializeAndroidAdbInvocation:i}=await import(`./mechanics.js`).then(e=>e.r);return r(e,t,n?{command:`adb ${i(n).join(` `)}`}:void 0)}},host:{runAdb:async(e,t)=>await a(e,t),downloadFile:async e=>{let{downloadLimrunFile:t}=await import(`./limrun-download-file.js`);await t(e)},archiveDirectory:async({sourceDirectory:e,entryName:i,archivePath:a})=>{let o=[`-qr`,a,i],s=await n(`zip`,o,{cwd:e,timeoutMs:12e4});if(s.exitCode!==0)throw new t(`COMMAND_FAILED`,`Failed to package iOS .app for Limrun install`,{command:[`zip`,...o].join(` `),...r(s)})}},ios:{applySimctlSetting:async e=>{let{applySimctlSetting:t}=await import(`./simctl-settings-facade.js`);return await t(e)},resolveAppAlias:async e=>{let{resolveIosAppAlias:t}=await import(`./app-resolution-facade.js`);return t(e)},readBundleAppName:async e=>{let{readIosBundleInfo:t}=await import(`./install-artifact-facade.js`);return(await t(e)).appName}}}}export{u as n,d as t};
|