agent-device 0.20.9 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.9.apk → agent-device-android-ime-helper-0.21.0.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.0.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.9.manifest.json → agent-device-android-ime-helper-0.21.0.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.0.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.0.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.9.manifest.json → agent-device-android-snapshot-helper-0.21.0.manifest.json} +6 -6
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +35 -33
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +6 -1
- package/apple/snapshot-bridge/LICENSE.idb +23 -0
- package/apple/snapshot-bridge/README.md +49 -0
- package/apple/snapshot-bridge/SnapshotBridge.m +280 -0
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.h +33 -0
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +382 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +58 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +19 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAlertVerification.swift +36 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerStringNormalization.swift +8 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +12 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +100 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +2 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +21 -12
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +21 -88
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +124 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +110 -107
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +6 -14
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +85 -114
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +13 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +72 -175
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +10 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXElementTypes.swift +12 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +78 -64
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +17 -9
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +47 -13
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +232 -438
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +98 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +229 -168
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationInvariant.swift +19 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +110 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +206 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +147 -25
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +21 -18
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +24 -307
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +206 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +158 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +19 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +49 -16
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +2 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +4 -19
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +16 -20
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +111 -0
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +42 -81
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +35 -82
- package/dist/apple/snapshot-presentation/Package.swift +21 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +56 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +259 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentation.swift +153 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationFailure.swift +27 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +91 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +161 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotScopePolicy.swift +53 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +242 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +97 -0
- package/dist/src/adapter.js +1 -0
- package/dist/src/adb-executor.js +2 -0
- package/dist/src/adb-failure.js +1 -0
- package/dist/src/adb-host.js +1 -0
- package/dist/src/adb.js +1 -0
- package/dist/src/agent-browser-lifecycle.js +1 -0
- package/dist/src/agent-browser-process-record.js +1 -0
- package/dist/src/agent-browser-provider.js +1 -0
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/ai-sdk.d.ts +61 -0
- package/dist/src/ai-sdk.js +1 -0
- package/dist/src/alert-contract.js +1 -0
- package/dist/src/alert-runtime.js +1 -0
- package/dist/src/android-adb.d.ts +27 -19
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-ownership.js +1 -0
- package/dist/src/android-system-chrome.js +1 -0
- package/dist/src/android.js +1 -1
- package/dist/src/api.js +11 -0
- package/dist/src/app-catalog.js +1 -0
- package/dist/src/app-deployment-resolution.js +2 -0
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-inventory-contract.js +1 -0
- package/dist/src/app-inventory.js +1 -0
- package/dist/src/app-launch.js +2 -0
- package/dist/src/app-lifecycle-facade.js +1 -0
- package/dist/src/app-lifecycle.js +3 -6
- package/dist/src/app-lifecycle2.js +2 -2
- package/dist/src/app-lifecycle3.js +1 -0
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime.js +1 -4
- package/dist/src/app-log-runtime2.js +4 -0
- package/dist/src/app-parsers.js +4 -0
- package/dist/src/app-resolution-cache.js +1 -0
- package/dist/src/app-resolution-facade.js +1 -0
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/app-state.js +1 -2
- package/dist/src/application-lifecycle-interaction.js +1 -0
- package/dist/src/application-lifecycle-runtime.js +1 -0
- package/dist/src/apps-simctl.js +1 -0
- package/dist/src/archive.js +4 -0
- package/dist/src/artifact-download.js +1 -0
- package/dist/src/artifacts.d.ts +6 -2
- package/dist/src/artifacts.js +1 -1
- package/dist/src/async-lifecycle.js +1 -0
- package/dist/src/audio-probe-result.js +1 -0
- package/dist/src/audio-probe-runtime.js +1 -0
- package/dist/src/audio-probe-support.js +1 -0
- package/dist/src/auth-session.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/back-mode.js +1 -0
- package/dist/src/{url.js → base-url.js} +1 -1
- package/dist/src/boot-diagnostics.js +2 -2
- package/dist/src/byte-limit-stream.js +1 -1
- package/dist/src/capabilities.js +1 -0
- package/dist/src/capture.js +1 -0
- package/dist/src/catalog.js +1 -0
- package/dist/src/cli-command-aliases.js +1 -0
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +77 -51
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +5 -7
- package/dist/src/click-button.js +1 -0
- package/dist/src/client-metro-companion.js +1 -0
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +1606 -0
- package/dist/src/clipboard.js +1 -0
- package/dist/src/code-signature-cache.js +1 -0
- package/dist/src/code-signature.js +1 -0
- package/dist/src/color.js +1 -0
- package/dist/src/command-metadata.js +1 -1
- package/dist/src/command-schema.js +3 -3
- package/dist/src/command-surface.js +1 -1
- package/dist/src/command-tools.js +2 -0
- package/dist/src/command.js +1 -0
- package/dist/src/{selector-vocabulary.js → compatibility-policy.js} +1 -1
- package/dist/src/config.js +1 -1
- package/dist/src/config2.js +1 -0
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +5 -5
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -0
- package/dist/src/daemon-process.js +1 -0
- package/dist/src/daemon-registration.js +1 -0
- package/dist/src/daemon-shutdown-report.js +1 -1
- package/dist/src/daemon.js +2 -2
- package/dist/src/debug-symbols-facade.js +5 -0
- package/dist/src/deploy-result-target.js +1 -0
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-claim-rule.js +1 -0
- package/dist/src/device-input-state.d.ts +190 -3
- package/dist/src/device-inventory-context.js +1 -0
- package/dist/src/device-isolation.js +1 -0
- package/dist/src/device-release.js +1 -0
- package/dist/src/device-rotation.js +1 -0
- package/dist/src/device-selection-resolver.js +1 -0
- package/dist/src/device-session.js +1 -0
- package/dist/src/device.js +1 -1
- package/dist/src/device2.js +3 -2
- package/dist/src/diagnostics.js +3 -0
- package/dist/src/diagnostics2.js +1 -0
- package/dist/src/dispatch-resolve.js +1 -0
- package/dist/src/doctor-facade.js +1 -0
- package/dist/src/doctor-output.js +1 -0
- package/dist/src/doctor.js +1 -0
- package/dist/src/doctor2.js +1 -0
- package/dist/src/doctor3.js +1 -0
- package/dist/src/durable-resource.js +1 -0
- package/dist/src/entities.js +1 -1
- package/dist/src/error.js +2 -0
- package/dist/src/exec.js +1 -0
- package/dist/src/file.js +1 -0
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/format.js +2 -0
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/gesture-admission.js +1 -0
- package/dist/src/gesture-plan-types.js +1 -0
- package/dist/src/gesture-plan.js +1 -0
- package/dist/src/gesture-runtime.js +1 -0
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/hdc.js +1 -1
- package/dist/src/helper.js +2 -2
- package/dist/src/host-file.js +1 -0
- package/dist/src/human-control-contract.js +1 -0
- package/dist/src/human-control.js +1 -0
- package/dist/src/index.d.ts +2 -1578
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -4
- package/dist/src/input-actions2.js +2 -1
- package/dist/src/install-artifact-facade.js +1 -0
- package/dist/src/install-source-network-transport.js +1 -0
- package/dist/src/install-source.d.ts +3 -10
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-positionals.js +1 -0
- package/dist/src/interaction-ref-policy.js +1 -0
- package/dist/src/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-operation-catalog.js +1 -0
- package/dist/src/interactor-types.js +1 -0
- package/dist/src/interactor.js +6 -2
- package/dist/src/interactor2.js +1 -1
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.d.ts +1 -1
- package/dist/src/internal/bin.js +1 -2
- package/dist/src/internal/companion-tunnel.d.ts +1 -1
- package/dist/src/internal/companion-tunnel.js +1 -1
- package/dist/src/internal/daemon.d.ts +1 -1
- package/dist/src/internal/daemon.js +2 -4
- package/dist/src/internal/png-worker.d.ts +4 -4
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/internal/run-script-http-child.d.ts +4 -0
- package/dist/src/internal/run-script-http-child.js +1 -0
- package/dist/src/internal/update-check-entry.d.ts +1 -1
- package/dist/src/inventory.js +4 -4
- package/dist/src/inventory2.js +1 -1
- package/dist/src/inventory3.js +1 -1
- package/dist/src/inventory5.js +1 -1
- package/dist/src/inventory6.js +1 -1
- package/dist/src/ios-client.js +16 -0
- package/dist/src/ios-snapshot-acquisition.js +1 -0
- package/dist/src/ios-snapshot-adapter.js +1 -0
- package/dist/src/ios-snapshot-planning.js +1 -0
- package/dist/src/ios-snapshot-runtime.js +1 -0
- package/dist/src/json.js +1 -0
- package/dist/src/keyboard-actions.js +1 -0
- package/dist/src/launch-console.js +1 -0
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease-scope.js +1 -0
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +1618 -7
- package/dist/src/limrun.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -0
- package/dist/src/location-coordinates.js +1 -1
- package/dist/src/logcat.js +1 -1
- package/dist/src/macos-facade.js +1 -0
- package/dist/src/managed-device-scope.js +1 -0
- package/dist/src/mechanics.js +19 -0
- package/dist/src/metro.d.ts +4 -2
- package/dist/src/metro.js +1 -1
- package/dist/src/metro2.js +1 -1
- package/dist/src/mobile-snapshot-semantics.js +1 -0
- package/dist/src/multitouch-support.js +1 -0
- package/dist/src/numeric.js +1 -0
- package/dist/src/observability.js +1 -1
- package/dist/src/observation.js +2 -0
- package/dist/src/output-path.js +1 -1
- package/dist/src/owner-identity.js +3 -1
- package/dist/src/parameterized-recorded-fill.js +1 -0
- package/dist/src/parser.js +1 -1
- package/dist/src/perf-facade.js +2 -0
- package/dist/src/perf-runtime-operation-builder.js +1 -0
- package/dist/src/perf-runtime-plan.js +1 -0
- package/dist/src/perf-runtime.js +1 -0
- package/dist/src/perf.js +1 -4
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/physical-device-facade.js +1 -0
- package/dist/src/platform-request-scope.js +1 -0
- package/dist/src/platform-runtime-android-adb-host.js +1 -0
- package/dist/src/platform-runtime-android-mechanics.js +1 -0
- package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
- package/dist/src/platform-runtime-app-log-process.js +1 -1
- package/dist/src/platform-runtime-apple-resources.js +1 -0
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -0
- package/dist/src/platform-runtime-network-web-transport.js +1 -1
- package/dist/src/platform-runtime-open-target.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +4 -4
- package/dist/src/platform-runtime-runtime-hints.js +2 -2
- package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
- package/dist/src/platform-runtime-unavailable.js +1 -0
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/plist.js +1 -1
- package/dist/src/png-worker-contract.js +1 -1
- package/dist/src/prepare-kind.js +1 -15
- package/dist/src/process-exit.js +1 -1
- package/dist/src/process.js +1 -0
- package/dist/src/provider-device-runtime.js +1 -0
- package/dist/src/provider-session-ownership.js +2 -0
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/provider.js +1 -1
- package/dist/src/providers.js +1 -0
- package/dist/src/proxy.js +2 -2
- package/dist/src/react-native-overlay.js +1 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/rect-center.js +1 -0
- package/dist/src/register-builtins.js +1 -0
- package/dist/src/registry.js +39 -28
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay-divergence.js +2 -0
- package/dist/src/replay.js +2 -2
- package/dist/src/reporting.js +8 -8
- package/dist/src/request-admission.js +1 -0
- package/dist/src/request-cancel.js +1 -0
- package/dist/src/request-cancellation.js +1 -0
- package/dist/src/request-progress-protocol.js +1 -0
- package/dist/src/request-providers.js +1 -0
- package/dist/src/request-runtime-binding.js +1 -0
- package/dist/src/request.js +1 -0
- package/dist/src/result-serialization.js +1 -0
- package/dist/src/retry.js +1 -0
- package/dist/src/rolldown-runtime.js +1 -1
- package/dist/src/runner-cache-metadata.js +2 -0
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-operations-facade.js +1 -0
- package/dist/src/runner-owner-facade.js +1 -0
- package/dist/src/runner-owner-state.js +1 -0
- package/dist/src/runner-presentation.js +1 -0
- package/dist/src/runner-selector-query.js +1 -0
- package/dist/src/runner.js +1 -0
- package/dist/src/{runtime-transport.js → runtime-transport-hints.js} +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime2.js +4 -4
- package/dist/src/runtime3.js +1 -1
- package/dist/src/runtime4.js +4 -3
- package/dist/src/runtime5.js +1 -1
- package/dist/src/runtime6.js +1 -1
- package/dist/src/runtime7.js +1 -1
- package/dist/src/runtime8.js +1 -1
- package/dist/src/runtime9.js +1 -1
- package/dist/src/scoped-provider.js +1 -1
- package/dist/src/screen-recording-completion.js +1 -0
- package/dist/src/screen-recording-live-handle.js +1 -0
- package/dist/src/screen-recording-options.js +1 -0
- package/dist/src/screen-recording-resource-recovery.js +1 -0
- package/dist/src/screen-recording-runtime.js +1 -0
- package/dist/src/screenshot-density.js +1 -1
- package/dist/src/screenshot-result.js +1 -6
- package/dist/src/screenshot-runtime.js +1 -0
- package/dist/src/screenshot.js +1 -1
- package/dist/src/screenshot2.js +1 -0
- package/dist/src/screenshot3.js +5 -0
- package/dist/src/script.js +1 -0
- package/dist/src/scroll-command.js +1 -0
- package/dist/src/scroll-gesture.js +1 -0
- package/dist/src/scroll-indicator.js +1 -0
- package/dist/src/sdk-batch-runner.d.ts +23 -6
- package/dist/src/sdk-batch-runner.js +2 -3
- package/dist/src/sdk-batch.js +2 -0
- package/dist/src/sdk-contracts.d.ts +222 -99
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-finders.d.ts +1 -1
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.js +1 -1
- package/dist/src/sdk-remote-config.d.ts +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +539 -199
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +1 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/semantic-index.js +1 -0
- package/dist/src/server.js +10 -3
- package/dist/src/session-allocation.js +1 -0
- package/dist/src/session-artifact-paths.js +1 -0
- package/dist/src/session-paths.js +1 -0
- package/dist/src/session-repair-tombstone.js +1 -0
- package/dist/src/session-routing.js +1 -0
- package/dist/src/session-runtime-admission.js +1 -0
- package/dist/src/session-snapshot.js +1 -0
- package/dist/src/session-store.js +4 -0
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session2.js +5 -28
- package/dist/src/settings.js +1 -0
- package/dist/src/shared.js +2 -2
- package/dist/src/simctl-facade.js +1 -0
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-facade.js +1 -0
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-capture-annotations.js +1 -0
- package/dist/src/snapshot-desktop-projection.js +1 -0
- package/dist/src/snapshot-diagnostics.js +1 -0
- package/dist/src/snapshot-process.js +1 -0
- package/dist/src/snapshot-quality-backend-capabilities.js +1 -0
- package/dist/src/snapshot-quality-verdict.js +1 -0
- package/dist/src/snapshot-runtime-binding.js +1 -0
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-scope.js +1 -0
- package/dist/src/snapshot-state.js +1 -0
- package/dist/src/snapshot.js +1 -8
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/snapshot3.js +1 -1
- package/dist/src/snapshot4.js +1 -0
- package/dist/src/src.js +1 -1
- package/dist/src/src2.js +1 -1
- package/dist/src/src3.js +1 -2
- package/dist/src/src4.js +1 -0
- package/dist/src/src5.js +1 -0
- package/dist/src/src6.js +1 -0
- package/dist/src/src7.js +2 -0
- package/dist/src/src8.js +115 -0
- package/dist/src/startup-recovery-fence.js +1 -0
- package/dist/src/status-markers.js +1 -0
- package/dist/src/string-enum.js +1 -1
- package/dist/src/success-text.js +1 -0
- package/dist/src/surface-snapshot.js +1 -0
- package/dist/src/surface-snapshot2.js +1 -0
- package/dist/src/takeover.js +5 -0
- package/dist/src/tool-provider-facade.js +1 -0
- package/dist/src/tool-provider.js +4 -3
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/tool-provider3.js +1 -0
- package/dist/src/toolchain-probe.js +2 -0
- package/dist/src/touch-runtime.js +1 -0
- package/dist/src/transport.js +3 -0
- package/dist/src/tree.js +1 -0
- package/dist/src/ttl-memo.js +1 -0
- package/dist/src/tv-remote.js +1 -0
- package/dist/src/type-text-runtime.js +1 -0
- package/dist/src/undici.js +99 -0
- package/dist/src/update-check.js +1 -1
- package/dist/src/verified-file.js +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/video.js +2 -2
- package/dist/src/web.js +2 -1
- package/dist/src/web2.js +1 -0
- package/dist/src/webdriver-ios-snapshot.js +1 -0
- package/dist/src/webdriver-source.js +1 -0
- package/linux/atspi-dump.py +54 -9
- package/package.json +73 -38
- package/server.json +9 -3
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.9.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.9.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.9.apk.sha256 +0 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -75
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +0 -4
- package/dist/src/appearance.js +0 -1
- package/dist/src/apps.js +0 -5
- package/dist/src/audio-probe.js +0 -1
- package/dist/src/cancel.js +0 -1
- package/dist/src/cli-grammar.js +0 -1
- package/dist/src/command-catalog.js +0 -1
- package/dist/src/debug-symbols.js +0 -5
- package/dist/src/device-input-state.js +0 -2
- package/dist/src/device-ready.js +0 -1
- package/dist/src/dispatch.js +0 -1
- package/dist/src/handler-utils.js +0 -1
- package/dist/src/helper-package-install.js +0 -1
- package/dist/src/host-process.js +0 -3
- package/dist/src/ime-lifecycle.js +0 -2
- package/dist/src/ime-recovery-marker.js +0 -1
- package/dist/src/input-actions3.js +0 -1
- package/dist/src/install-artifact.js +0 -1
- package/dist/src/install-artifact2.js +0 -1
- package/dist/src/interaction-common.js +0 -1
- package/dist/src/interaction-runtime.js +0 -1
- package/dist/src/interaction-snapshot.js +0 -1
- package/dist/src/manifest.js +0 -1
- package/dist/src/method-scope.js +0 -1
- package/dist/src/png-resize.js +0 -1
- package/dist/src/process-lock.js +0 -1
- package/dist/src/runner-lease.js +0 -1
- package/dist/src/runner-sequence.js +0 -1
- package/dist/src/screenshot-geometry.js +0 -1
- package/dist/src/sdk-android-adb.d.ts +0 -245
- package/dist/src/sdk-android-adb.js +0 -4
- package/dist/src/sdk.js +0 -1
- package/dist/src/setting-state.js +0 -1
- package/dist/src/shell-quote.js +0 -1
- package/dist/src/snapshot-session.js +0 -1
- package/dist/src/timing-safe-equal.js +0 -1
- package/dist/src/unsupported-interactor.js +0 -1
- package/dist/src/verdict.js +0 -1
- /package/dist/src/{recording-telemetry.js → telemetry.js} +0 -0
package/dist/src/appearance.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";function t(t){let n=t.trim().toLowerCase();if(n===`light`)return`light`;if(n===`dark`)return`dark`;if(n===`toggle`)return`toggle`;throw new e(`INVALID_ARGS`,`Invalid appearance state: ${t}. Use light|dark|toggle.`)}export{t};
|
package/dist/src/apps.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{a as n,c as r,n as i,s as a}from"./location-coordinates.js";import{G as o,J as s,K as c,W as l,q as ee}from"./sdk-batch-runner.js";import{c as u,l as d}from"./sdk-device.js";import"./observability.js";import{A as f,f as p,h as m}from"./sdk-android-adb.js";import{i as h,o as te}from"./boot-diagnostics.js";import{n as ne,t as g}from"./setting-state.js";import{t as re}from"./appearance.js";import{n as ie,r as _,s as ae}from"./simctl.js";import{a as v,i as oe}from"./tool-provider.js";import{i as se}from"./helper.js";import{t as ce}from"./png-resize.js";import{i as le,n as ue}from"./screenshot-density.js";import{a as y,i as b,l as de,n as x,o as S,r as C}from"./physical-device-control.js";import{a as w,c as fe,d as pe,f as me,l as he,t as T,u as ge}from"./config.js";import{n as E}from"./runner-client.js";import{n as _e,r as D,t as O}from"./simulator.js";import{a as ve,c as ye,i as k,l as be,n as xe,o as Se,r as Ce,s as we,u as Te}from"./app-resolution.js";import A from"node:path";import{promises as j}from"node:fs";import"node:os";const Ee=[`--time`,`9:41`,`--dataNetwork`,`wifi`,`--wifiMode`,`active`,`--wifiBars`,`3`,`--batteryState`,`charged`,`--batteryLevel`,`100`],De={0:`hide`,1:`wifi`,6:`3g`,7:`4g`,8:`lte`,9:`lte-a`,10:`lte+`,11:`5g`,12:`5g+`,13:`5g-uwb`,14:`5g-uc`},Oe={1:`searching`,2:`failed`,3:`active`},ke={0:`notSupported`,1:`searching`,2:`failed`,3:`active`};function M(e,t,n){return _(e,t,n)}const N=new Set;async function Ae(e){let t=null,n=!1;if(Me(e))n=!0;else try{t=await Ne(e),n=!0}catch(t){R(e,`snapshot_failed`,t)}try{(!n||t)&&await Pe(e),await L(e,Ee)}catch(t){R(e,`prepare_failed`,t)}return async()=>{await je(e,n?t:null)}}async function je(e,t){if(await Pe(e),!t){F(e);return}await L(e,Ie(t)),P(e)}function P(e){N.delete(I(e))}function F(e){N.add(I(e))}function Me(e){return N.has(I(e))}function I(e){return`${e.platform}:${e.kind}:${e.id}`}async function Ne(e){return Fe(m(await M(e,[`status_bar`,e.id,`list`],{allowFailure:!0}),`Failed to read simulator status bar overrides`).stdout)}async function Pe(e){await M(e,[`status_bar`,e.id,`clear`])}async function L(e,t){t.length!==0&&await M(e,[`status_bar`,e.id,`override`,...t])}function Fe(e){let n={},r=e.split(`
|
|
2
|
-
`).map(e=>e.trim()).filter(e=>e.length>0&&e!==`Current Status Bar Overrides:`&&!/^=+$/.test(e));for(let e of r){let r=/^DataNetworkType:\s+(\d+)$/.exec(e);if(r){let e=Number(r[1]),i=De[e];if(!i)throw new t(`COMMAND_FAILED`,`Unsupported simulator data network type: ${e}`);n.dataNetwork=i;continue}let i=/^WiFi Mode:\s+(\d+),\s+WiFi Bars:\s+(\d+)$/.exec(e);if(i){let e=Oe[Number(i[1])];e&&(n.wifiMode=e),n.wifiBars=i[2];continue}let a=/^Cell Mode:\s+(\d+),\s+Cell Bars:\s+(\d+)$/.exec(e);if(a){let e=Number(a[1]),r=ke[e];if(!r)throw new t(`COMMAND_FAILED`,`Unsupported simulator cellular mode: ${e}`);n.cellularMode=r,n.cellularBars=a[2];continue}let o=/^Operator Name:\s*(.*)$/.exec(e);if(o){n.operatorName=o[1]??``;continue}}return Object.keys(n).length===0?null:n}function Ie(e){let t=[];return e.dataNetwork&&t.push(`--dataNetwork`,e.dataNetwork),e.wifiMode&&t.push(`--wifiMode`,e.wifiMode),e.wifiBars!==void 0&&(e.dataNetwork===`wifi`||e.wifiMode)&&t.push(`--wifiBars`,e.wifiBars),e.cellularMode&&t.push(`--cellularMode`,e.cellularMode),e.cellularBars!==void 0&&(e.cellularMode||Le(e.dataNetwork)||e.operatorName!==void 0)&&t.push(`--cellularBars`,e.cellularBars),e.operatorName!==void 0&&t.push(`--operatorName`,e.operatorName),t}function Le(e){return!!(e&&e!==`hide`&&e!==`wifi`)}function R(e,t,n){f({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...b(n)}})}function z(e,t,n){return _(e,t,n)}const Re={ensureBooted:O,prepareStatusBarForScreenshot:Ae,captureWithRetry:Ve,normalizeDensity:qe,captureWithRunner:H,shouldFallbackToRunner:G},B=new Map,V=new Map;async function ze(e,t,n={}){if(d(e)){await H(e,t,n.appBundleId,n.fullscreen,n.runnerOptions);return}if(e.kind===`simulator`){await Be(e,t,n);return}await x(e).captureScreenshot(e,t,{appBundleId:n.appBundleId,fullscreen:n.fullscreen,runnerOptions:n.runnerOptions,runRunnerCommand:E})}async function Be(e,n,r={}){if(e.kind!==`simulator`)throw new t(`UNSUPPORTED_OPERATION`,`Simulator screenshot fallback flow supports only iOS simulators`);let i={...Re,...r.deps??{}};r.skipIosSimulatorBootCheck||await i.ensureBooted(e);let a=async()=>{};if(r.normalizeStatusBar===!0)try{a=await i.prepareStatusBarForScreenshot(e)}catch(t){W(e,`prepare_failed`,t)}try{try{await i.captureWithRetry(e,n),await i.normalizeDensity(e,n,r.pixelDensity);return}catch(t){let a=t;if(r.skipIosSimulatorBootCheck&&Ke(t)){await i.ensureBooted(e);try{await i.captureWithRetry(e,n),await i.normalizeDensity(e,n,r.pixelDensity);return}catch(e){a=e}}if(!i.shouldFallbackToRunner(a))throw a;We(e,`simctl_screenshot`,a)}await i.captureWithRunner(e,n,r.appBundleId,r.fullscreen,r.runnerOptions),await i.normalizeDensity(e,n,r.pixelDensity)}finally{await a().catch(t=>W(e,`restore_failed`,t))}}async function Ve(e,t){let n=h.fromTimeoutMs(pe);await te(async({deadline:n})=>{await z(e,[`io`,e.id,`screenshot`,t],{timeoutMs:Math.max(1e3,n?.remainingMs()??2e4)})},{maxAttempts:5,baseDelayMs:fe,maxDelayMs:he,jitter:.2,shouldRetry:e=>G(e)},{deadline:n,phase:`ios_simulator_screenshot`})}async function H(e,n,r,i,a){if(e.kind===`device`&&!d(e)){await x(e).captureScreenshot(e,n,{appBundleId:r,fullscreen:i,runnerOptions:a,preferRunner:!0,runRunnerCommand:E});return}let o=(await E(e,{command:`screenshot`,appBundleId:r,fullscreen:i,inlineScreenshot:!1},a)).message;if(!o)throw new t(`COMMAND_FAILED`,`Failed to capture iOS screenshot: runner returned no file path`);if(d(e)){await j.copyFile(o,n);return}if(e.kind===`simulator`){await He(e,o,n);return}throw new t(`COMMAND_FAILED`,`Unsupported Apple screenshot target`)}async function He(e,n,r){let i=h.fromTimeoutMs(w),a=`Unable to locate runner container for simulator screenshot`,o=V.get(e.id);if(o){let t=await U(o,n,r);if(t.copied)return;a=t.error,V.delete(e.id)}for(let t of de){let o=await z(e,[`get_app_container`,e.id,t,`data`],{allowFailure:!0,timeoutMs:Ue(i,w,`runner screenshot container lookup`)});if(o.exitCode!==0){let e=o.stderr.trim();e&&(a=e);continue}let s=o.stdout.trim();if(!s){a=`simctl get_app_container returned empty output`;continue}let c=await U(s,n,r);if(c.copied){V.set(e.id,s);return}a=c.error}throw new t(`COMMAND_FAILED`,`Failed to capture iOS screenshot: ${a}`)}async function U(e,t,n){let r=`Runner screenshot was not found in the simulator container`;for(let i of Ge(e,t))try{return await j.copyFile(i,n),{copied:!0}}catch(e){r=e instanceof Error?e.message:String(e)}return{copied:!1,error:r}}function Ue(e,n,r){let i=e.remainingMs();if(i>0)return i;throw new t(`COMMAND_FAILED`,`iOS ${r} timed out after ${n}ms`,{timeoutMs:n,step:r})}function We(e,t,n){let r=b(n);f({level:`warn`,phase:`ios_screenshot_fallback`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:t,to:`runner`,...r}})}function W(e,t,n){f({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...b(n)}})}function Ge(e,t){let n=A.resolve(e),r=t.trim();if(!r)return[];let i=[],a=new Set,o=e=>{let t=A.normalize(e);a.has(t)||(a.add(t),i.push(t))},s=r.replace(/^\/+/,``),c=s.replace(/\\/g,`/`);if(s&&o(A.join(n,s)),A.isAbsolute(r)&&o(A.normalize(r)),c.startsWith(`tmp/`))o(A.join(n,c));else{let e=c.lastIndexOf(`/tmp/`);if(e>=0){let t=c.slice(e+1);o(A.join(n,t))}}let l=A.basename(r);return l&&o(A.join(n,`tmp`,l)),i}function G(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=C(e);return n.includes(`timeout waiting for screen surfaces`)||n.includes(`nsposixerrordomain`)&&n.includes(`code=60`)&&n.includes(`screenshot`)||n.includes(`timed out`)&&n.includes(`screenshot`)}function Ke(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=C(e);return n.includes(`not booted`)||n.includes(`current state: shutdown`)||n.includes(`current state is shutdown`)||n.includes(`current state=shutdown`)||n.includes(`state: shutdown`)||n.includes(`state=shutdown`)}async function qe(e,t,n){let r=await Je(e),i=ue(await le(t),r,n);i&&await ce(t,i.width,i.height)}async function Je(e){let n=B.get(e.id);if(n!==void 0)return n;let r=await z(e,[`getenv`,e.id,`SIMULATOR_MAINSCREEN_SCALE`],{timeoutMs:ge}),i=Number(r.stdout.trim());if(!Number.isFinite(i)||i<=0)throw new t(`COMMAND_FAILED`,`Failed to read iOS simulator screenshot scale from SIMULATOR_MAINSCREEN_SCALE`);return B.set(e.id,i),i}function K(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=e.details??{};if(n.exitCode!==4)return!1;let r=String(n.stderr??``).toLowerCase();return r.includes(`fbsopenapplicationserviceerrordomain`)&&r.includes(`the request to open`)}async function Ye(e,t){let n=await v(ie(e,[`get_app_container`,e.id,t]),{allowFailure:!0});if(n.exitCode!==0)return{installed:!1};let r=n.stdout.trim();if(!r)return{installed:!1};let i=await oe(`plutil`,[`-extract`,`CFBundleExecutable`,`raw`,`-o`,`-`,`${r}/Info.plist`],{allowFailure:!0});if(i.exitCode!==0||!i.stdout.trim())return{installed:!0};let a=await oe(`otool`,[`-l`,`${r}/${i.stdout.trim()}`],{allowFailure:!0});if(a.exitCode!==0)return{installed:!0};let o=a.stdout.toLowerCase();return{installed:!0,simulatorCompatible:o.includes(`iossimulator`)||o.includes(`platform 7`)}}function Xe(e){return e.installed?e.simulatorCompatible===!1?`ARCH_MISMATCH`:`PERSISTENT_LAUNCH_FAIL`:`APP_NOT_INSTALLED`}function Ze(e){switch(e){case`ARCH_MISMATCH`:return`The app binary was not built for the simulator platform. Rebuild with a simulator destination or use a physical device.`;case`APP_NOT_INSTALLED`:return`The app bundle is not installed on this simulator. Run install before open.`;case`PERSISTENT_LAUNCH_FAIL`:return`The simulator repeatedly refused to launch the app. Inspect crash logs in Console.app or ~/Library/Logs/DiagnosticReports/ and consider reinstalling the app.`;default:return`The simulator failed to launch the app. Retry with --debug and inspect diagnostics log for details.`}}const q=25e3;async function Qe(e,n,r){let i=r?.launchConsole?.trim(),a=r?.launchArgs;if(i&&(!u(e)||e.kind!==`simulator`))throw new t(`UNSUPPORTED_OPERATION`,o);if(d(e)){if(a&&a.length>0)throw new t(`UNSUPPORTED_OPERATION`,`--launch-args is not supported on macOS; launch arguments are currently iOS-only.`);await we(e,n,r);return}let f=r?.url?.trim();if(f){if(i)throw new t(`INVALID_ARGS`,l);if(!c(f))throw new t(`INVALID_ARGS`,`open <app> <url> requires a valid URL target`);if(e.kind===`simulator`){let t=!!a||ee(f);if(r?.terminateRunningApp||t){let i=r?.appBundleId??await k(e,n);t?await Z(e,i,{...a?{launchArgs:a}:{},...r?.terminateRunningApp?{terminateRunningApp:!0}:{}}):await X(e,i)}await J(e,f,void 0);return}let o=s(r?.appBundleId??await k(e,n),f);if(!o)throw new t(`INVALID_ARGS`,`Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.`);await Q(e,o,{payloadUrl:f,launchArgs:a,runnerOptions:r?.runnerOptions});return}let p=n.trim();if(c(p)){if(i)throw new t(`INVALID_ARGS`,l);if(e.kind===`simulator`){await J(e,p,a);return}let n=s(r?.appBundleId,p);if(!n)throw new t(`INVALID_ARGS`,`Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.`);await Q(e,n,{payloadUrl:p,launchArgs:a,runnerOptions:r?.runnerOptions});return}let m=r?.appBundleId??await k(e,n);if(e.kind===`simulator`){await Z(e,m,{...i?{launchConsole:i}:{},...a?{launchArgs:a}:{},...r?.terminateRunningApp?{terminateRunningApp:!0}:{}});return}await Q(e,m,{launchArgs:a,runnerOptions:r?.runnerOptions})}async function J(e,n,r){if(r&&r.length>0)throw new t(`INVALID_ARGS`,`--launch-args is not supported with iOS simulator URL opens (simctl openurl ignores launch args). Launch the app first with --launch-args, then issue the URL open in a separate call.`);await O(e),await y(e,[`openurl`,e.id,n])}async function $e(e){d(e)||e.kind===`simulator`&&await _e(e)!==`Booted`&&await O(e)}async function Y(e,t,n){if(d(e)){await Se(e,t);return}let r=await k(e,t);if(e.kind===`simulator`){await X(e,r);return}await x(e).terminateApp(e,r,{runnerOptions:n,runRunnerCommand:E})}async function X(e,n){await O(e);let r=S(e,[`terminate`,e.id,n]),i=await v(r,{allowFailure:!0,timeoutMs:me});if(i.exitCode!==0&&!i.stderr.toLowerCase().includes(`found nothing to terminate`))throw new t(`COMMAND_FAILED`,`xcrun exited with code ${i.exitCode}`,p(i,{cmd:`xcrun`,args:r}))}async function Z(e,n,r){await O(e);let i=0,a=h.fromTimeoutMs(T);try{await te(async({deadline:i})=>{if(i?.isExpired())throw new t(`COMMAND_FAILED`,`App launch deadline exceeded`,{timeoutMs:T});let a=S(e,et(e.id,n,r)),o=r?.launchConsole?await tt(a,r.launchConsole):await v(a,{allowFailure:!0});if(o.exitCode!==0)throw new t(`COMMAND_FAILED`,`xcrun exited with code ${o.exitCode}`,p(o,{cmd:`xcrun`,args:a}))},{maxAttempts:10,baseDelayMs:1e3,maxDelayMs:5e3,jitter:.2,shouldRetry(e){return K(e)?(i+=1,i<3):!1}},{deadline:a})}catch(t){if(K(t)){let r=t,i=Xe(await Ye(e,n));r.details={...r.details,hint:Ze(i)}}throw t}}function et(e,t,n){let r=[`launch`];return n?.launchConsole&&r.push(`--console-pty`),n?.terminateRunningApp&&r.push(`--terminate-running-process`),r.push(e,t),n?.launchArgs&&n.launchArgs.length>0&&r.push(...n.launchArgs),r}async function tt(e,n){await j.mkdir(A.dirname(n),{recursive:!0});try{let t=await v(e,{allowFailure:!0,timeoutMs:q});return await nt(n,t.stdout,t.stderr),t}catch(e){let r=(e instanceof t?e:void 0)?.details;if(r?.timeoutMs===q){let e=typeof r.stdout==`string`?r.stdout:``,t=typeof r.stderr==`string`?r.stderr:``;return await nt(n,e,t),f({level:`warn`,phase:`ios_simulator_launch_console_capture_timeout`,data:{timeoutMs:q,logPath:n,stdoutBytes:Buffer.byteLength(e),stderrBytes:Buffer.byteLength(t)}}),{stdout:e,stderr:t,exitCode:0}}throw e}}async function nt(e,t,n){await j.writeFile(e,rt(t,n),`utf8`)}function rt(e,t){return!e||!t||e.endsWith(`
|
|
3
|
-
`)||e.endsWith(`\r`)?`${e}${t}`:`${e}\n${t}`}async function Q(e,t,n){await x(e).launchApp(e,t,{...n,runRunnerCommand:E})}async function it(e){return d(e)?await ye():(D(e,`clipboard`),await O(e),m(await y(e,[`pbpaste`,e.id],{allowFailure:!0}),`Failed to read iOS simulator clipboard`).stdout.replace(/\r\n/g,`
|
|
4
|
-
`).replace(/\n$/,``))}async function at(e,t){if(d(e)){await Te(t);return}D(e,`clipboard`),await O(e),m(await y(e,[`pbcopy`,e.id],{allowFailure:!0,stdin:t}),`Failed to write iOS simulator clipboard`)}let $=null,ot;async function st(e,r,o,s,c){if(d(e)){let e=r.toLowerCase();if(e===`appearance`){await be(o);return}if(e===`permission`){let e=a(o);if(e===`deny`)throw new t(`INVALID_ARGS`,n(`permission`));return await se(e,lt(c?.permissionTarget))}throw new t(`INVALID_ARGS`,n(r))}D(e,`settings`),await O(e);let l=r.toLowerCase();switch(l){case`clear-app-state`:{if(o.toLowerCase()!==`clear`)throw new t(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!s)throw new t(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);let n=await ct(e,s);return{bundleId:n.bundleId,containerPath:n.containerPath,cleared:!0}}case`wifi`:{let t=g(o)?`active`:`failed`;await y(e,[`status_bar`,e.id,`override`,`--wifiMode`,t]),P(e);return}case`airplane`:g(o)?(await y(e,[`status_bar`,e.id,`override`,`--dataNetwork`,`hide`,`--wifiMode`,`failed`,`--wifiBars`,`0`,`--cellularMode`,`failed`,`--cellularBars`,`0`,`--operatorName`,``]),P(e)):(await y(e,[`status_bar`,e.id,`clear`]),F(e));return;case`location`:{if(o.toLowerCase()===`set`){let{latitude:t,longitude:n}=i(c);return await y(e,[`location`,e.id,`set`,`${t},${n}`]),{latitude:t,longitude:n}}let n=g(o);if(!s)throw new t(`INVALID_ARGS`,`location setting requires an active app in session`);let r=n?`grant`:`revoke`;await y(e,[`privacy`,e.id,r,`location`,s]);return}case`faceid`:case`touchid`:{let t=l,n=ft[t];await bt(e,yt(o,t),{settingName:t,label:n.label,modalityAliases:n.modalityAliases});return}case`appearance`:{let t=await ut(e,o);await y(e,[`ui`,e.id,`appearance`,t]);return}case`permission`:if(!s)throw new t(`INVALID_ARGS`,`permission setting requires an active app in session`);await mt(e,pt(a(o)),vt(c?.permissionTarget,c?.permissionMode),s);return;default:throw new t(`INVALID_ARGS`,`Unsupported setting: ${r}`)}}async function ct(e,n){if(!u(e)||e.kind!==`simulator`)throw new t(`UNSUPPORTED_OPERATION`,`Clearing app state is currently supported only on iOS simulators.`);let r=await k(e,n);await O(e),await Y(e,r);let i=m(await y(e,[`get_app_container`,e.id,r,`data`],{allowFailure:!0}),`simctl get_app_container failed for ${r}`).stdout.trim();if(!i)throw new t(`COMMAND_FAILED`,`simctl get_app_container returned an empty data container path for ${r}`);let a=await j.readdir(i);return await Promise.all(a.map(e=>j.rm(A.join(i,e),{recursive:!0,force:!0}))),{bundleId:r,containerPath:i}}function lt(e){let n=e?.trim().toLowerCase();if(n===`accessibility`||n===`screen-recording`||n===`input-monitoring`)return n;throw new t(`INVALID_ARGS`,`Unsupported macOS permission target. Use accessibility|screen-recording|input-monitoring.`)}async function ut(e,n){let r=re(n);if(r!==`toggle`)return r;let i=m(await y(e,[`ui`,e.id,`appearance`],{allowFailure:!0}),`Failed to read current iOS appearance`),a=dt(i.stdout,i.stderr);if(!a)throw new t(`COMMAND_FAILED`,`Unable to determine current iOS appearance for toggle`,{stdout:i.stdout,stderr:i.stderr});return a===`dark`?`light`:`dark`}function dt(e,t){let n=/\b(light|dark|unsupported|unknown)\b/i.exec(`${e}\n${t}`);if(!n)return null;let r=n[1]?.toLowerCase();return r===`dark`?`dark`:r===`light`?`light`:null}const ft={faceid:{label:`Face ID`,modalityAliases:[`face`]},touchid:{label:`Touch ID`,modalityAliases:[`finger`,`touch`]}};function pt(e){return e===`deny`?`revoke`:e}async function mt(e,n,r,i){let a=await gt(e);if(!a.has(r))throw new t(`UNSUPPORTED_OPERATION`,`iOS simctl privacy does not support service "${r}" on this runtime.`,{deviceId:e.id,appBundleId:i,hint:`Supported services: ${Array.from(a).sort().join(`, `)}`});let o=[`privacy`,e.id,n,r,i],s=r===`notifications`;if(!(n===`reset`&&s))try{await y(e,o);return}catch(n){throw s&&ht(n)?new t(`UNSUPPORTED_OPERATION`,`iOS simulator does not support setting notifications permission via simctl privacy on this runtime.`,{deviceId:e.id,appBundleId:i,hint:`Use reset notifications for reprompt behavior, or toggle notifications manually in Settings.`}):n}try{await y(e,o);return}catch(e){if(!ht(e))throw e}try{await y(e,[`privacy`,e.id,`reset`,`all`,i])}catch(n){throw new t(`COMMAND_FAILED`,`iOS simulator blocked direct notifications reset. Fallback reset-all also failed.`,{deviceId:e.id,appBundleId:i,hint:`Use reinstall to force a fresh notifications prompt, or reset simulator content and settings.`},n instanceof Error?n:void 0)}}function ht(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=String(e.details?.stderr??``).toLowerCase();return(n.includes(`failed to grant access`)||n.includes(`failed to revoke access`)||n.includes(`failed to reset access`))&&n.includes(`operation not permitted`)}async function gt(e){let n=ae(e.simulatorSetPath),r=`${process.env.PATH??``}::${n??``}`;if($&&ot===r)return $;let i=await y(e,[`privacy`,`help`],{allowFailure:!0}),a=_t(`${i.stdout}\n${i.stderr}`);if(a.size===0)throw new t(`COMMAND_FAILED`,`Unable to determine supported simctl privacy services`,{stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,hint:"Run `xcrun simctl privacy help` manually to verify available services for this runtime."});return $=a,ot=r,a}function _t(e){let t=new Set,n=!1;for(let r of e.split(`
|
|
5
|
-
`)){let e=r.trim();if(!e)continue;if(e===`service`){n=!0;continue}if(!n)continue;if(e.startsWith(`bundle identifier`))break;let i=/^([a-z-]+)\s+-\s+/.exec(e)?.[1];i!==void 0&&t.add(i)}return t}function vt(e,n){let i=r(e);if(i!==`photos`&&n?.trim())throw new t(`INVALID_ARGS`,`Permission mode is only supported for photos. Received: ${n}.`);if(i===`camera`)return`camera`;if(i===`microphone`)return`microphone`;if(i===`contacts`)return`contacts`;if(i===`contacts-limited`)return`contacts-limited`;if(i===`notifications`)return`notifications`;if(i===`calendar`)return`calendar`;if(i===`location`)return`location`;if(i===`location-always`)return`location-always`;if(i===`media-library`)return`media-library`;if(i===`motion`)return`motion`;if(i===`reminders`)return`reminders`;if(i===`siri`)return`siri`;if(i===`photos`){let e=n?.trim().toLowerCase();if(!e||e===`full`)return`photos`;if(e===`limited`)return`photos-add`;throw new t(`INVALID_ARGS`,`Invalid photos mode: ${n}. Use full|limited.`)}throw new t(`INVALID_ARGS`,`Unsupported permission target: ${e}. Use camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri.`)}function yt(e,n){let r=e.trim().toLowerCase();if(r===`match`)return`match`;if(r===`nonmatch`)return`nonmatch`;if(r===`enroll`)return`enroll`;if(r===`unenroll`)return`unenroll`;throw new t(`INVALID_ARGS`,`Invalid ${n} state: ${e}. Use match|nonmatch|enroll|unenroll.`)}async function bt(e,n,r){let i=xt(e.id,n,r.modalityAliases),a=[];for(let t of i){let n=S(e,t),r=await v(n,{allowFailure:!0});if(r.exitCode===0)return;a.push({args:n,stderr:r.stderr,stdout:r.stdout,exitCode:r.exitCode})}let o=ne(a);throw a.length>0&&a.every(e=>St(e.stdout,e.stderr))?new t(`UNSUPPORTED_OPERATION`,`${r.label} simulation is not supported on this simulator runtime.`,{deviceId:e.id,action:n,setting:r.settingName,attempts:o}):new t(`COMMAND_FAILED`,`Failed to simulate ${r.settingName}.`,{deviceId:e.id,action:n,setting:r.settingName,attempts:o})}function xt(e,t,n){let r=n.length>0?n:[`face`];switch(t){case`match`:return r.flatMap(t=>[[`biometric`,e,`match`,t],[`biometric`,`match`,e,t]]);case`nonmatch`:return r.flatMap(t=>[[`biometric`,e,`nonmatch`,t],[`biometric`,e,`nomatch`,t],[`biometric`,`nonmatch`,e,t],[`biometric`,`nomatch`,e,t]]);case`enroll`:return[[`biometric`,e,`enroll`,`yes`],[`biometric`,e,`enroll`,`1`],[`biometric`,`enroll`,e,`yes`],[`biometric`,`enroll`,e,`1`]];case`unenroll`:return[[`biometric`,e,`enroll`,`no`],[`biometric`,e,`enroll`,`0`],[`biometric`,`enroll`,e,`no`],[`biometric`,`enroll`,e,`0`]]}}function St(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`unrecognized subcommand`)||n.includes(`unknown subcommand`)||n.includes(`not supported`)||n.includes(`unavailable`)||n.includes(`biometric`)&&n.includes(`invalid`)}var Ct=e({findIosSimulatorInstalledApp:()=>xe,listIosApps:()=>Ce,resolveIosApp:()=>k,resolveIosSimulatorDeepLinkBundleId:()=>ve});export{Y as a,H as c,at as i,ze as l,st as n,Qe as o,it as r,$e as s,Ct as t};
|
package/dist/src/audio-probe.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as e}from"./sdk-device.js";import{s as t}from"./helper.js";const n={platform:`host-system-audio`,source:`system-audio`,backend:`macos-screencapturekit`,sourceCount:1,start:t,notes:r};function r(t){return[`Audio probe samples host system audio through ScreenCaptureKit for this ${e(t)?`iOS simulator`:t.platform===`android`?`Android emulator`:`macOS session`}; it is not app-instrumented audio.`,`Screen Recording permission is required for host system audio capture.`,`Other audible host apps can contribute to the measured buckets.`]}export{n as macOsScreenCaptureKitAudioProbeBackend};
|
package/dist/src/cancel.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";const t=new Set,n=new Map,r=`request_canceled`,i=`request canceled`;function a(e,t){if(typeof e==`string`&&e.length>0)return e;let n=(typeof t==`string`?t:typeof t==`number`&&Number.isFinite(t)?String(t):`generated`).trim().replace(/[^a-zA-Z0-9_-]/g,`_`).slice(0,32)||`generated`,r=Math.random().toString(36).slice(2,10);return`req:${n}:${process.pid}:${Date.now()}:${r}`}const o=5e4,s=1e4;function c(e){if(e.size<=o)return;let t=0;for(let n of e.keys()){if(t>=s)break;e.delete(n),t++}}function l(e){if(e.size<=o)return;let t=0;for(let n of e){if(t>=s)break;e.delete(n),t++}}function u(r){if(!r)return;if(n.has(r))throw new e(`INVALID_ARGS`,`Request ID is already in flight: ${r}`,{requestId:r,reason:`duplicate_request_id`});c(n);let i=new AbortController;return n.set(r,i),t.has(r)&&i.abort(),{requestId:r,controller:i}}function d(e){e&&(l(t),t.add(e),n.get(e)?.abort())}function f(e,r){e&&(r&&(r.requestId!==e||n.get(e)!==r.controller)||(t.delete(e),n.delete(e)))}function p(e){e&&f(e.requestId,e)}function m(e){return e?t.has(e):!1}function h(e){if(e)return n.get(e)?.signal}function g(){return new e(`COMMAND_FAILED`,i,{reason:r,hint:`The request was canceled intentionally (explicit cancel or client disconnect) — no retry is needed unless the cancellation was unintended.`})}function _(e){if(m(e))throw g()}function v(t){return!(t instanceof e)||t.code!==`COMMAND_FAILED`?!1:t.details?.reason===r?!0:t.message===i}export{m as a,u as c,h as i,a as l,f as n,v as o,g as r,d as s,p as t,_ as u};
|
package/dist/src/cli-grammar.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./registry.js";const t=e();function n(e,n,r){let i=t[e];if(!i)throw Error(`Missing CLI reader for command: ${e}`);return i(n,r)}export{n as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{g as e}from"./sdk-batch-runner.js";const t=s(`public`),n=s(`internal`),r=s(`local-cli`),i={help:`help`};function a(){return[...Object.values(t),...Object.values(r)].sort()}function o(e){return Object.values(i).includes(e)||Object.values(n).includes(e)?!0:a().includes(e)}function s(t){let n={};for(let[r,i]of e(t))n[r]=i;return n}export{a as i,t as n,o as r,n as t};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{kr as t}from"./sdk-batch-runner.js";import{_ as n,h as r}from"./sdk-android-adb.js";import i from"node:path";import a from"node:fs/promises";const o=/^[0-9a-fA-F-]{32,36}$/;function s(e){if(!(!e||!o.test(e)))return e.replaceAll(`-`,``).toUpperCase()}function c(e,t){return`${e.uuid}:${l(t)}`}function l(e){return`0x${e.toString(16)}`}function u(e){return typeof e==`string`&&e.length>0?e:void 0}function d(...e){for(let t of e){let e=u(t);if(e)return e}}function f(e){let t=e.filter(e=>!!e);return t.length>0?t.join(` `):void 0}function p(e){try{let n=JSON.parse(e);return t(n)?n:null}catch{return null}}function m(e){if(typeof e==`number`&&Number.isSafeInteger(e))return e;if(typeof e==`string`){let t=e.startsWith(`0x`)?Number.parseInt(e,16):Number(e);return Number.isSafeInteger(t)?t:void 0}}function h(e,t,n){if(!Object.hasOwn(e,t))return;let r=m(e[t]);if(r!==void 0)return r;v(n,t)}function g(e,t,n){if(!Object.hasOwn(e,t))return;let r=_(e[t]);if(r!==void 0)return r;v(n,t)}function _(e){if(typeof e==`bigint`)return e;if(typeof e==`number`&&Number.isSafeInteger(e)||typeof e==`string`&&/^(?:0x[0-9a-fA-F]+|\d+)$/.test(e))return BigInt(e)}function v(t,n){throw new e(`INVALID_ARGS`,`Invalid ${t} numeric field: ${n}`,{hint:`Crash artifact numeric fields must be integer numbers or integer numeric strings.`})}function y(e){return e.length===1?e[0]:void 0}function b(e){return[...new Set(e)]}function x(e){let t=e.match(/^(.*) \+ (\d+)$/);return t?{symbol:t[1],location:Number(t[2])}:{symbol:e}}const S=/^(?:arm64e?|arm64_32|x86_64|armv7[sk]?|i386)$/;function ee(e){return te(e)??w(e)}function te(e){let t=ne(e);if(!t)return null;let n=(Array.isArray(t.payload.usedImages)?t.payload.usedImages:[]).flatMap((e,t)=>C(e,t));if(n.length===0)return null;let r=re(Array.isArray(t.payload.threads)?t.payload.threads:[],n);return{format:`ips`,images:n,addresses:r.map(({frame:e,...t})=>t),document:t,frameMatches:r,write:e=>oe(t,r,e)}}function ne(e){let t=p(e);if(t)return{payload:t};let n=e.indexOf(`
|
|
2
|
-
`);if(n===-1)return null;let r=e.slice(0,n),i=p(e.slice(n+1));return i?{header:r,payload:i}:null}function re(e,t){let n=new Map(t.map(e=>[e.index,e]));return e.flatMap((e,t)=>ie(e).flatMap((e,r)=>ae(e,n,t,r)))}function ie(e){return!t(e)||!Array.isArray(e.frames)?[]:e.frames.filter(t)}function ae(e,t,n,r){let i=h(e,`imageIndex`,`IPS frame`),a=g(e,`imageOffset`,`IPS frame`);if(i===void 0||a===void 0)return[];let o=t.get(i);return o?[{frame:e,frameIndex:r,threadIndex:n,image:o,address:o.base+a}]:[]}function oe(e,t,n){for(let e of t){let t=n.get(c(e.image,e.address))?.text;t&&se(e.frame,t)}e.payload.agentDeviceSymbolication={tool:`agent-device debug symbols`,symbolicatedFrames:[...n.values()].filter(e=>e.text).length};let r=`${JSON.stringify(e.payload,null,2)}\n`;return e.header?`${e.header}\n${r}`:r}function se(e,t){let n=x(t);e.symbol=n.symbol,n.location!==void 0&&(e.symbolLocation=n.location)}function C(e,n){if(!t(e))return[];let r=s(u(e.uuid)),a=g(e,`base`,`IPS usedImages`);if(!r||a===void 0)return[];let o=u(e.path);return[{index:n,name:u(e.name)??(o?i.basename(o):`image-${n}`),uuid:r,arch:u(e.arch),base:a,path:o}]}function w(e){let t=e.split(`
|
|
3
|
-
`),n=T(t);if(n.length===0)return null;let r=O(t,n);return{format:`text`,images:n,addresses:r,lines:t,frameMatches:r,write(e){let n=new Map(r.map(e=>[e.lineIndex,e]));return t.map((t,r)=>{let i=n.get(r);if(!i)return t;let a=e.get(c(i.image,i.address))?.text;return!a||t.includes(a)?t:`${t} // ${a}`}).join(`
|
|
4
|
-
`)}}}function T(e){let t=[],n=e.findIndex(e=>/^Binary Images:/i.test(e.trim()));if(n===-1)return t;for(let r of e.slice(n+1)){let e=E(r);e&&t.push(e)}return t}function E(e){let t=e.match(/^\s*(0x[0-9a-fA-F]+)\s*-\s*(0x[0-9a-fA-F]+)\s+\+?(.+?)\s+<([0-9a-fA-F-]{32,36})>\s+(.+)$/);if(!t)return null;let n=s(t[4]);if(!n)return null;let r=D(t[3].trim(),t[5].trim());return{name:r.name,arch:r.arch,uuid:n,base:BigInt(t[1]),end:BigInt(t[2]),path:t[5].trim()}}function D(e,t){let n=e.split(/\s+/),r=n.at(-1);if(r&&S.test(r))return{name:n.slice(0,-1).join(` `).trim(),arch:r};let a=i.basename(t);return{name:e.startsWith(a)?a:e}}function O(e,t){let n=[],r;for(let[i,a]of e.entries()){let e=a.match(/^Thread\s+(\d+)\s+Crashed:/);e?r=Number(e[1]):(a.trim().length===0||/^Thread\s+\d+/.test(a))&&(r=void 0);let o=k(a,t),s=a.match(/^\s*(\d+)/);o&&s&&n.push({...o,frameIndex:Number(s[1]),lineIndex:i,threadIndex:r})}return n}function k(e,t){let n=e.match(/^\s*\d+\s+(.+?)\s+(0x[0-9a-fA-F]+)\b/);if(!n)return null;let r=n[1].trim(),i=BigInt(n[2]),a=A(t,r,i);return a?{image:a,address:i}:null}function A(e,t,n){let r=e.filter(e=>e.name===t);return r.find(e=>j(e,n))??y(r)}function j(e,t){return e.end!==void 0&&e.base<=t&&t<=e.end}const M=1e4;async function N(e){return e.dsym&&e.searchPath?[H(e.cwd,e.dsym),...await P(H(e.cwd,e.searchPath))]:e.dsym?[H(e.cwd,e.dsym)]:e.searchPath?await P(H(e.cwd,e.searchPath)):[]}async function P(t){let n=[],r=0;async function o(s){if(n.length>=200)return;if(r+=1,r>M)throw new e(`COMMAND_FAILED`,`debug symbols search-path scan exceeded bounds.`,{searchPath:t,maxEntries:M,hint:`Pass --dsym <App.dSYM> directly or narrow --search-path to the build products directory.`});if(!(await F(s,t)).isDirectory()){s===t&&I(t);return}if(s.endsWith(`.dSYM`)){n.push(s);return}let c=await a.readdir(s,{withFileTypes:!0});for(let e of c)e.isDirectory()&&await o(i.join(s,e.name))}return await o(t),n}async function F(t,n){try{return await a.stat(t)}catch{throw new e(`INVALID_ARGS`,`debug symbols search path does not exist: ${n}`,{hint:`Pass an existing build products directory to --search-path, or pass --dsym <App.dSYM> directly.`})}}function I(t){throw new e(`INVALID_ARGS`,`debug symbols search path is not a directory: ${t}`,{hint:`Pass an existing build products directory to --search-path, or pass --dsym <App.dSYM> directly.`})}async function L(t,n){let r=(await Promise.all(b(t).map(e=>R(e,n)))).flat();if(r.length===0)throw new e(`COMMAND_FAILED`,`No UUIDs found in dSYM bundle.`,{hint:`Verify the path points to a built .dSYM bundle with DWARF contents.`});return r}async function R(e,t){return await z(e),B(e,r(await n(t,[`--uuid`,e],{timeoutMs:15e3,allowFailure:!0}),`Failed to inspect dSYM UUIDs: ${e}`,{hint:`Verify the dSYM bundle is valid and readable.`}).stdout)}async function z(t){if(!((await a.stat(t).catch(()=>null))?.isDirectory()&&t.endsWith(`.dSYM`)))throw new e(`INVALID_ARGS`,`Not a .dSYM bundle: ${t}`,{hint:`Pass the .dSYM bundle path, not the DWARF executable inside it.`})}function B(e,t){return t.split(`
|
|
5
|
-
`).flatMap(t=>{let n=t.match(/^UUID:\s+([0-9a-fA-F-]{32,36})\s+\(([^)]+)\)\s+(.+)$/),r=s(n?.[1]);return n&&r?[{dsymPath:e,uuid:r,arch:n[2],binaryPath:n[3].trim()}]:[]})}function V(t,n,r){let i=new Map;for(let e of t){let t=n.find(t=>t.uuid===e.uuid&&(e.arch===void 0||t.arch===void 0||t.arch===e.arch));t&&i.set(e.uuid,{image:e,dsym:t})}if(i.size>0)return i;let a=b(t.map(e=>e.uuid)),o=b(n.map(e=>e.uuid));throw new e(`COMMAND_FAILED`,r?`dSYM UUID does not match any Apple image in the crash artifact.`:`No matching dSYM UUID found under search path.`,{artifactUuidCount:a.length,artifactUuidSample:a.slice(0,5),dsymUuidCount:o.length,dsymUuidSample:o.slice(0,5),hint:`Use dwarfdump --uuid <App.dSYM> and compare it with the crash Binary Images or usedImages UUID, then pass the matching dSYM/search path.`})}function H(e,t){return i.resolve(e,t)}function U(e,t){return e.format===`ips`?W(e.document,e.frameMatches,t):ve(e.lines,e.frameMatches,t)}function W(e,t,n){let r=me(e.payload),i={format:`ips`,...G(e),crashedThread:r,topFrames:_e(t,r,n),findings:[]};return{...i,findings:Y(i)}}function G(e){let t=e.payload,n=pe(e.header);return{appName:K(t,n),bundleId:ce(t,n),version:le(t,n),incident:ue(t,n),timestamp:de(t,n),exceptionType:fe(t.exception),exceptionCodes:he(t.exception),terminationReason:ge(t.termination)}}function K(e,t){return d(e.procName,t?.app_name,t?.name)}function ce(e,n){return d((t(e.bundleInfo)?e.bundleInfo:void 0)?.CFBundleIdentifier,n?.bundleID)}function le(e,n){return d((t(e.bundleInfo)?e.bundleInfo:void 0)?.CFBundleShortVersionString,n?.app_version)}function ue(e,t){return d(e.incident,t?.incident_id)}function de(e,t){return d(e.captureTime,t?.timestamp)}function fe(e){return t(e)?u(e.type):void 0}function pe(e){return e?p(e):null}function me(e){let n=m(e.faultingThread);if(n!==void 0)return n;let r=(Array.isArray(e.threads)?e.threads:[]).findIndex(e=>t(e)&&e.triggered===!0);return r===-1?void 0:r}function he(e){return t(e)?d(e.codes,e.rawCodes):void 0}function ge(e){if(t(e))return f([u(e.namespace),u(e.code),u(e.reason)])}function _e(e,t,n){return e.filter(e=>t===void 0||e.threadIndex===t).slice(0,5).map(e=>J(e.frameIndex,e.image,e.address,n))}function ve(e,t,n){let r=be(e),i={format:`text`,appName:ye(e),bundleId:q(e,`Identifier`),version:q(e,`Version`),incident:q(e,`Incident Identifier`),timestamp:q(e,`Date/Time`),exceptionType:q(e,`Exception Type`),exceptionCodes:q(e,`Exception Codes`),terminationReason:q(e,`Termination Reason`),crashedThread:r,topFrames:xe(t,r,n),findings:[]};return{...i,findings:Y(i)}}function ye(e){return q(e,`Process`)?.replace(/\s+\[\d+\]$/,``)}function q(e,t){let n=`${t}:`,r=e.find(e=>e.trimStart().startsWith(n));return r&&r.slice(r.indexOf(`:`)+1).trim()||void 0}function be(e){let t=q(e,`Triggered by Thread`),n=t?Number.parseInt(t,10):NaN;if(Number.isSafeInteger(n))return n;for(let t of e){let e=t.match(/^Thread\s+(\d+)\s+Crashed:/);if(e)return Number(e[1])}}function xe(e,t,n){return t===void 0?[]:e.filter(e=>e.threadIndex===t).slice(0,5).map(e=>J(e.frameIndex,e.image,e.address,n))}function J(e,t,n,r){return{index:e,image:t.name,address:l(n),symbol:r.get(c(t,n))?.text}}function Y(e){return[Se(e),e.exceptionType?`Exception: ${e.exceptionType}`:void 0,e.terminationReason?`Termination: ${e.terminationReason}`:void 0].filter(e=>!!e).slice(0,3)}function Se(e){let t=e.topFrames.find(e=>e.symbol);return t?`Start with ${t.symbol} in ${t.image}; it is the first symbolicated frame captured on the crashed thread.`:e.topFrames.length>0?`No symbolicated frame was found on the crashed thread; verify matching dSYMs for the top images.`:void 0}async function Ce(e,t,n){let r=new Map;for(let i of we(e,t).values())for(let e of await Te(n,i))r.set(c(e.image,e.address),e);return r}function we(e,t){let n=new Map;for(let r of e){let e=t.get(r.image.uuid);if(!e)continue;let i=`${r.image.uuid}:${e.dsym.binaryPath}`,a=n.get(i)??{...e,addresses:[]};a.addresses.push(r.address),n.set(i,a)}return n}async function Te(e,t){let i=b(t.addresses.map(l)),a=r(await n(e,Ee(t,i),{timeoutMs:3e4,allowFailure:!0}),`atos failed while symbolicating crash frames.`,{hint:`Verify the crash artifact and dSYM were produced from the same build and architecture.`});return De(t.image,i,a.stdout)}function Ee(e,t){return[`-arch`,e.image.arch??e.dsym.arch??`arm64`,`-o`,e.dsym.binaryPath,`-l`,l(e.image.base),...t]}function De(e,t,n){let r=Oe(n);return t.map((t,n)=>{let i=r[n]?.trim();return{image:e,address:BigInt(t),text:ke(i,t)?i:void 0}})}function Oe(e){let t=e.split(/\r?\n/);return t.at(-1)===``&&t.pop(),t}function ke(e,t){if(!e)return!1;let n=e.trim().toLowerCase();return!n||n===`??`||n===t.toLowerCase()?!1:!n.startsWith(`0x`)}async function Ae(){return{dwarfdump:await X(`dwarfdump`),atos:await X(`atos`)}}async function X(t){try{let e=await n(`xcrun`,[`--find`,t],{timeoutMs:5e3,allowFailure:!0}),r=e.stdout.trim();if(e.exitCode===0&&r.length>0)return r}catch{}throw new e(`TOOL_MISSING`,`Apple symbolication tool not found: ${t}`,{hint:`Install Xcode Command Line Tools and verify xcrun --find dwarfdump and xcrun --find atos succeed.`})}const Z=64*1024*1024;async function je(t){if(t.action!==void 0&&t.action!==`symbols`)throw new e(`INVALID_ARGS`,`debug supports only the symbols workflow.`,{hint:`Use debug symbols --artifact <crash.ips|crash.log> --dsym <App.dSYM> or --search-path <dir> --out <path>.`});let n=t.cwd??process.cwd(),r=$(n,t.artifact),o=$(n,t.out??Pe(r)),s=ee(await Me(r,`crash artifact`));s||Q();let c=await N({cwd:n,dsym:t.dsym,searchPath:t.searchPath});if(c.length===0)throw new e(`INVALID_ARGS`,`debug symbols requires --dsym or --search-path.`,{hint:`Pass a matching .dSYM bundle directly, or pass --search-path <dir> so agent-device can match crash image UUIDs to local dSYMs.`});let l=await Ae(),u=await L(c,l.dwarfdump),d=V(s.images,u,!!t.dsym),f=await Ce(s.addresses,d,l.atos),p=s.write(f);await a.mkdir(i.dirname(o),{recursive:!0}),await a.writeFile(o,p,`utf8`);let m=[...d.values()].map(({image:e,dsym:t})=>({name:e.name,uuid:e.uuid,arch:e.arch??t.arch,dsymPath:t.dsymPath,binaryPath:t.binaryPath})),h=[...f.values()].filter(e=>e.text).length,g=s.images.length-m.length,_=g>0?[`${g} Apple image${g===1?``:`s`} had no matching dSYM and were left unchanged.`]:void 0;return{kind:`debugSymbols`,platform:`apple`,artifactPath:r,outPath:o,crash:U(s,f),matchedImages:m,symbolicatedFrames:h,skippedImages:g,warnings:_,message:`Symbolicated ${h} frame${h===1?``:`s`} -> ${o}`}}function Q(){throw new e(`UNSUPPORTED_OPERATION`,`debug symbols currently supports Apple crash artifacts with Binary Images or IPS usedImages.`,{hint:`For Android Java/R8 crashes, use retrace with mapping.txt. For Android native crashes, use ndk-stack or addr2line with unstripped .so symbols. Capture the crash with logs, then symbolicate externally until Android support is added.`})}async function Me(t,n){await Ne(t,n);try{return await a.readFile(t,`utf8`)}catch(r){let i=r instanceof Error?r.message:String(r);throw new e(`INVALID_ARGS`,`Failed to read ${n}: ${t}`,{message:i})}}async function Ne(t,n){try{let r=await a.stat(t);if(r.size<=Z)return;throw new e(`INVALID_ARGS`,`${n} is too large: ${t}`,{actualBytes:r.size,maxBytes:Z,hint:`Pass a bounded Apple .ips/.crash artifact. For very large logs, first narrow the log to the crash report, or use logs grep/tail for lead-up context.`})}catch(r){if(r instanceof e)throw r;let i=r instanceof Error?r.message:String(r);throw new e(`INVALID_ARGS`,`Failed to read ${n}: ${t}`,{message:i})}}function $(e,t){return i.resolve(e,t)}function Pe(e){let t=i.extname(e);return`${t?e.slice(0,-t.length):e}-symbolicated${t||`.log`}`}export{je as symbolicateCrashArtifact};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{Bt as n,It as r,Vt as i,zt as a}from"./sdk-batch-runner.js";import{A as o,n as s,o as c}from"./sdk-android-adb.js";import{n as l}from"./shell-quote.js";import{t as u}from"./timeouts.js";import{h as d}from"./app-lifecycle.js";var f=e({dismissAndroidKeyboard:()=>y,dismissAndroidKeyboardWithAdb:()=>b,getAndroidKeyboardState:()=>_,getAndroidKeyboardStatusWithAdb:()=>v,readAndroidClipboardText:()=>j,readAndroidClipboardWithAdb:()=>M,writeAndroidClipboardText:()=>N,writeAndroidClipboardWithAdb:()=>P});const p=[`mInputShown`,`mIsInputViewShown`,`isInputViewShown`,`mDecorViewVisible`,`mWindowVisible`,`mInShowWindow`],m=new Map([[2,`number`],[3,`phone`],[4,`datetime`]]),h=new Set([32,208]),g=new Set([128,224,144]);async function _(e){return await v(c(e))}async function v(e){let t=await e([`shell`,`dumpsys`,`input_method`],{allowFailure:!0});if(t.exitCode!==0)throw s(`Failed to query Android keyboard state`,t);return x(t.stdout)}async function y(e){return await b(c(e))}async function b(e){let n=await v(e),r=n,i=0;for(;r.visible&&i<2;)await e([`shell`,`input`,`keyevent`,`111`]),i+=1,await u(120),r=await v(e);if(n.visible&&r.visible)throw new t(`UNSUPPORTED_OPERATION`,`Android keyboard dismiss is unavailable for the current IME without back navigation.`,{attempts:i,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner});return{attempts:i,wasVisible:n.visible,dismissed:n.visible&&!r.visible,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}function x(e){let t=E(e)??S(e),n=C(e),a=w(e,/\bpackageName=([A-Za-z0-9_.]+)\b/g),o=w(e,/\b(?:resourceId|resource-id)=([^\s,}]+)/g),s=i(e),c=r(a,o,s);return T(a,o,s),{visible:t??!1,inputType:n,type:n?A(n):void 0,inputMethodPackage:s,focusedPackage:a,focusedResourceId:o,inputOwner:c}}function S(e){let t=e.match(/\bmImeWindowVis=0x([0-9a-fA-F]+)\b/)?.[1];if(!t)return null;let n=Number.parseInt(t,16);return Number.isNaN(n)?null:(n&1)!=0}function C(e){let t=w(e,/\binputType=0x([0-9a-fA-F]+)\b/gi);return t?`0x${t.toLowerCase()}`:void 0}function w(e,t){let n;for(let r of e.matchAll(t))n=r[1];return n}function T(e,t,r){r||!a(e)&&!n(t)||o({level:`warn`,phase:`android_input_ownership_fallback`,data:{focusedPackage:e,focusedResourceId:t}})}function E(e){return O(D(e,p))}function D(e,t){let n=new Map,r=RegExp(`\\b(${t.join(`|`)})=([a-zA-Z]+)\\b`,`g`);for(let t of e.matchAll(r)){let e=t[1],r=t[2]?.toLowerCase();!e||r!==`true`&&r!==`false`||n.set(e,r===`true`)}return n}function O(e){if(e.size===0)return null;let t=k(e,[`mWindowVisible`,`mDecorViewVisible`,`mInShowWindow`]);if(t!==void 0)return t;let n=e.get(`mInputShown`);return n===void 0?k(e,[`mIsInputViewShown`,`isInputViewShown`])??null:n}function k(e,t){for(let n of t){let t=e.get(n);if(t!==void 0)return t}}function A(e){let t=Number.parseInt(e.replace(/^0x/i,``),16);if(Number.isNaN(t))return`unknown`;let n=t&15,r=m.get(n);if(r)return r;if(n!==1)return`unknown`;let i=t&4080;return h.has(i)?`email`:g.has(i)?`password`:`text`}async function j(e){return await M(c(e))}async function M(e){return I(await F(e,[`shell`,`cmd`,`clipboard`,`get`,`text`],`read`))}async function N(e,t){await P(c(e),t)}async function P(e,t){await F(e,[`shell`,`cmd`,`clipboard`,`set`,`text`,l(t)],`write`)}async function F(e,n,r){let i=await e(n,{allowFailure:!0});if(d(i.stdout,i.stderr))throw new t(`UNSUPPORTED_OPERATION`,`Android shell clipboard ${r} is not supported on this device.`);if(i.exitCode!==0)throw s(`Failed to ${r} Android clipboard text`,i);return i.stdout}function I(e){let t=e.replace(/\r\n/g,`
|
|
2
|
-
`).replace(/\n$/,``),n=t.match(/^clipboard text:\s*(.*)$/i);return n?n[1]??``:t.trim().toLowerCase()===`null`?``:t}export{j as a,P as c,v as i,b as n,M as o,_ as r,N as s,f as t};
|
package/dist/src/device-ready.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as e}from"./sdk-device.js";import{o as t}from"./interactors.js";import{n}from"./physical-device-control.js";import{p as r}from"./config.js";const i=r({ttlMs:5e3});async function a(r,a={}){if(t(r))return;let c=s(r);if(i.get(c)===!0){if(!a.focusExisting)return;i.delete(c)}if(e(r)){if(r.kind===`simulator`){let{ensureBootedSimulator:e}=await import(`./simulator.js`).then(e=>e.i);await e(r,{deviceHub:a.deviceHub,focusExisting:a.focusExisting,onColdBootStart:a.onIosSimulatorColdBootStart}),o(c);return}if(r.kind===`device`){await n(r).ensureReady(r),o(c);return}}if(r.platform===`android`){let{waitForAndroidBoot:e}=await import(`./app-lifecycle.js`).then(e=>e.l);await e(r.id),o(c)}}function o(e){i.set(e,!0)}function s(e){let t=e.kind===`simulator`?e.simulatorSetPath??``:``;return JSON.stringify([e.platform,e.kind,e.id,e.target??``,t])}export{a as t};
|
package/dist/src/dispatch.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{D as t,t as n}from"./location-coordinates.js";import{a as r,f as i,kt as a}from"./sdk-batch-runner.js";import{_ as o,b as s,c,h as l,l as u,m as d,s as f,y as ee}from"./sdk-device.js";import{Ht as p,Vt as m,at as te,it as h,n as g,ot as ne,st as re}from"./prepare-kind.js";import{G as _,V as ie,W as v,d as y,f as ae,i as oe,m as se,p as ce,u as le}from"./interaction.js";import{A as ue}from"./screenshot-result.js";import{a as de}from"./device.js";import{s as fe}from"./runtime.js";import{A as b,F as x}from"./sdk-android-adb.js";import{t as pe}from"./timeouts.js";import{i as S,r as me,t as C}from"./interactors.js";import{o as he,s as ge}from"./simctl.js";import{c as _e,o as ve,s as ye}from"./verified-file.js";import be from"node:path";import{AsyncLocalStorage as xe}from"node:async_hooks";import{promises as Se}from"node:fs";const w=new xe;async function Ce(t,n,r){let i=await we(t,n,r);if(i)return i;let a=await E(t,n,r);if(r.allowLocalSimulatorFallback!==!1&&O(n,a)){let e;try{[e]=await ve({platform:n.platform??`ios`,target:n.target,iosSimulatorSetPath:r.simulatorSetPath,kind:`simulator`})}catch(e){if(_e(e))throw e}if(e)return e}if(a)return a;throw new e(`DEVICE_NOT_FOUND`,`No devices found`,{selector:n})}async function we(t,n,r){let i=r.appleSimulatorAppTarget?.trim();if(!i||k(n)||r.allowLocalSimulatorFallback===!1)return;let a=t.filter(e=>l(e,n)&&c(e)&&e.kind===`simulator`&&e.booted===!0);if(a.length<2)return;let{findIosSimulatorInstalledApp:o}=await import(`./apps.js`).then(e=>e.t),s=(await Promise.all(a.map(async e=>await o(e,i)?e:void 0))).filter(e=>e!==void 0);if(s.length===1)return s[0];throw s.length===0?new e(`APP_NOT_INSTALLED`,`No booted iOS simulator has ${i} installed`,{appTarget:i,...T(a),hint:`Install the app on a booted simulator, or pass --udid to select the intended device explicitly.`}):new e(`AMBIGUOUS_MATCH`,`Multiple booted iOS simulators have ${i} installed`,{appTarget:i,...T(s),hint:`Pass --udid to select the intended simulator explicitly.`})}function T(e){return{devices:e.map(e=>({id:e.id,name:e.name}))}}async function E(e,t,n){try{return await s(e,t,n)}catch(e){if(D(e,t))return;throw e}}function D(t,n){return!k(n)&&t instanceof e&&t.code===`DEVICE_NOT_FOUND`}function O(e,t){return!k(e)&&(!e.platform||e.platform===`apple`||e.platform===`ios`)&&e.target!==`desktop`&&(!t||t.kind===`device`)}function k(e){return!!(e.udid||e.serial||e.deviceName)}async function Te(e,t={}){let n={...A(e),androidAvdSelection:t.androidAvdSelection??`running-only`},{iosSimulatorSetPath:r,...i}=n,a=Ae(n,t),o={simulatorSetPath:r},c={platform:n.platform,target:e.target,cacheHit:!1};return await x(`resolve_target_device`,async()=>{let e=ke(a);if(e)return c.cacheHit=!0,e;let l=await ye(n),u=[...l.devices];return Oe(i)?j(a,await Ce(u,i,{simulatorSetPath:r,allowLocalSimulatorFallback:l.source===`local`||n.leaseProvider===void 0,appleSimulatorAppTarget:t.appleSimulatorAppTarget})):j(a,await s(u,i,o))},c)}function A(t){let n=t.platform;if(t.target&&!n)throw new e(`INVALID_ARGS`,`Device target selector requires --platform. Use --platform ios|macos|android|vega|linux|apple with --target mobile|tv|desktop.`);let r=ee({simulatorSetPath:ge(t.iosSimulatorDeviceSet),platform:n,target:t.target}),i=he(t.androidDeviceAllowlist);return{platform:n,target:t.target,deviceName:t.device,udid:t.udid,serial:t.serial,leaseId:t.leaseId,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId,iosSimulatorSetPath:r,androidSerialAllowlist:i?Array.from(i).sort():void 0}}async function Ee(e){return w.getStore()?await e():await w.run(new Map,e)}function De(e){return f(e.platform)}function Oe(e){return De(e)}function ke(e){let t=w.getStore()?.get(e);if(t)return{...t}}function j(e,t){return w.getStore()?.set(e,{...t}),t}function Ae(e,t){let{appleSimulatorAppTarget:n,...r}=t;return JSON.stringify({request:e,options:r})}me();const je={device:!0},Me={emulator:!0,device:!0},Ne=new Set([`perf`,`back`,`app-switcher`,`click`,`fill`,`find`,`focus`,`get`,`home`,`gesture`,`keyboard`,`is`,`longpress`,`press`,`screenshot`,`scroll`,`settings`,`snapshot`,`swipe`,`type`,`wait`]),Pe=[`audio`,`find`,`get`,`is`,`screenshot`,`snapshot`,`wait`],Fe=[`click`,`fill`,`focus`,`press`,`scroll`,`type`],Ie=[`viewport`],M=new Set([...Pe,...Fe,...Ie]),N=Le(r(i));function Le(e){let t={};for(let[n,r]of Object.entries(e))t[n]=Ne.has(n)?{...r,harmonyos:Me}:r;return Re(t)}function Re(e){let t={};for(let[n,r]of Object.entries(e))t[n]=M.has(n)?{...r,web:je}:r;for(let t of M)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}function P(e,t){let n=N[e];if(!n)return!0;let r=S(t.platform);if(!r)return!1;let i=n[r.capability.bucket];if(!i)return!1;let a=r.capability.supportsByDefault?.[e];return a&&!a(t)?!1:i[t.kind??`unknown`]===!0}function ze(e,t){return S(t.platform)?.capability.unsupportedHintByDefault?.[e]?.(t)}function Be(){return i.filter(e=>e.catalog.group===`public`&&(`capability`in e&&e.capability!==void 0||e.platformExecution.kind===`device-runtime`)).map(e=>e.name).sort()}function Ve(e){let t=N[e];if(!t)return[];let n=[`apple`,`android`,`harmonyos`,`vega`,`linux`,`web`],r=[];for(let e of n){let n=t[e];n&&Object.values(n).some(e=>e===!0)&&r.push(e)}return r}function He(e,t){if(e.intent===`drag`){Ue(e,t);return}if(t.platform===`web`||t.appleOs===`watchos`)throw I(e,F(e,t));if(Ge(e)){Ke(e,t);return}if(t.appleOs===`visionos`)throw I(e,F(e,t));if(e.intent===`fling`&&`direction`in e&&t.platform===`linux`)throw I(e,`gesture fling is not supported on Linux`)}function Ue(e,t){if(!We(t))throw I(e,F(e,t),`Target-authored drag requires an adapter that preserves source hold, timed movement, and destination hold; it is supported on Android touch devices and iOS/iPadOS.`)}function We(e){return e.platform===`android`?e.target!==`tv`:e.platform===`apple`?e.appleOs===void 0?e.target!==`desktop`&&e.target!==`tv`:e.appleOs===`ios`||e.appleOs===`ipados`:!1}function Ge(e){return e.intent===`pan`?(`pointerCount`in e?e.pointerCount:1)===2:e.intent===`pinch`||e.intent===`rotate`||e.intent===`transform`}function Ke(e,t){if(t.platform===`android`){if(t.target!==`tv`)return;throw I(e,`gesture ${e.intent} is not supported on Android TV`,`Android TV has no touch input — this gesture is supported on Android phones, tablets, and the iOS simulator only.`)}if(t.platform!==`apple`)throw I(e,F(e,t));a(t,e.intent)}function F(e,t){return`gesture ${e.intent} is not supported on ${t.appleOs??t.platform}`}function I(t,n,r){return new e(`UNSUPPORTED_OPERATION`,n,{gesture:t.intent,...r?{hint:r}:{}})}const L=`No active session. Run open first.`;function R(e,t,n,r){return{ok:!1,error:{code:e,message:t,...r?.hint?{hint:r.hint}:{},...r?.retriable===void 0?{}:{retriable:r.retriable},...n?{details:n}:{}}}}function qe(){return R(`SESSION_NOT_FOUND`,L)}function Je(e,t,n){if(P(e,t))return null;let r=n?.hint?ze(e,t):void 0;return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:n?.message??`${e} is not supported on this device`,...r?{hint:r}:{}}}}const Ye=/^[A-Za-z0-9_.:-]{1,64}$/,z=8*1024,B=4*1024;function Xe(t){let n=t[0]?.trim(),r=t[1]?.trim();if(!n)throw new e(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!Ye.test(n))throw new e(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(t.length>2)throw new e(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:Qe(r,n)}}function Ze(t,n,r){let i=o(t),a=$e(t);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let s=r?JSON.stringify(r):``,c=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(s)).replaceAll(`{platform}`,encodeURIComponent(i));if(c.length>B)throw new e(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:c.length,maxLength:B});return c}function Qe(t,n){if(t)try{let r=JSON.parse(t);if(!r||typeof r!=`object`||Array.isArray(r))throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>z)throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${z} bytes`);return r}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${t}`)}}function $e(e){return((c(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:u(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}function et(e){let t=e?e.textEntryReadiness:void 0,n=at(t)?{textEntryReadiness:t}:{},r=tt(e);return r?{...n,...r}:n}function tt(e){if(!nt(e))return null;let t=rt(e.target);return t?{verification:`unconfirmed`,requested:e.requested,before:e.before,after:e.after,target:t}:null}function nt(e){return!!(e&&e.verification===`unconfirmed`&&typeof e.requested==`string`&&V(e.before)&&V(e.after))}function rt(e){if(!H(e)||!it(e))return null;let t=ot(e.rect);return t?{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:t}:null}function it(e){return V(e.resourceId)&&V(e.className)&&V(e.packageName)}function at(e){return typeof e==`string`&&ce.includes(e)}function V(e){return e===null||typeof e==`string`}function ot(e){return!H(e)||![e.x,e.y,e.width,e.height].every(e=>typeof e==`number`)?null:e}function H(e){return!!e&&typeof e==`object`}const U=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function st(e,t){return f(e.platform)&&t>1}function ct(e,t,n=2e4){if(e.length===0)return[];let r=t>0?t:e.length,i=[],a=[],o=0;for(let t of e){let e=(t.durationMs??0)+(t.pauseMs??0)+250,s=a.length>0&&o+e>n,c=a.length>=r;(s||c)&&(i.push(a),a=[],o=0),a.push(t),o+=e}return a.length>0&&i.push(a),i}function W(e,t){if(t<=0)return[0,0];let[n,r]=U[e%U.length];return[n*t,r*t]}async function lt(e,t,n){for(let r=0;r<e;r+=1)await n(r),r<e-1&&t>0&&await pe(t)}async function ut(e,t){let{x:n,y:r}=G(t,`longpress requires x y [durationMs]`,{hint:`Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i, use the target rect center as x y, then retry longpress x y durationMs.`}),i=t[2]?Number(t[2]):void 0;return await e.longPress(n,r,i),{x:n,y:r,durationMs:i,...m(`Long pressed (${n}, ${r})`)}}async function dt(e,t){let{x:n,y:r}=G(t,`focus requires x y`);return await e.focus(n,r),{x:n,y:r,...m(`Focused (${n}, ${r})`)}}async function ft(t,n,r){let i=It(n);if(i)throw new e(`INVALID_ARGS`,`type does not accept a target ref like "${i}"`,{hint:`Use fill ${i} "text" to target that field, or press ${i} then type "text" to append.`});let a=n.join(` `);if(!a)throw new e(`INVALID_ARGS`,`type requires text`);let o=h(r?.delayMs??0,`delay-ms`,0,1e4),s=(await t.type(a,o))?.textEntryRoute;return{...s===void 0?{}:{textEntryRoute:s},text:a,delayMs:o,...m(Y(`Typed`,a))}}async function pt(t,n,r){if(r?.directElementSelector)return await mt(t,r.directElementSelector,n,r);let i=Number(n[0]),a=Number(n[1]),o=n.slice(2).join(` `);if(Number.isNaN(i)||Number.isNaN(a)||!o)throw new e(`INVALID_ARGS`,`fill requires x y text`);let s=h(r?.delayMs??0,`delay-ms`,0,1e4),c=await t.fill(i,a,o,s,{allowNonHittableCoordinateFallback:r?.allowNonHittableCoordinateFallback===!0});return{x:i,y:a,text:o,delayMs:s,...c?.maestroNonHittableCoordinateFallbackUsed===!0?{maestroNonHittableCoordinateFallbackUsed:!0}:{},...et(c),...m(Y(`Filled`,o))}}async function mt(t,n,r,i){if(!t.fillElementSelector)throw new e(`UNSUPPORTED_OPERATION`,`direct element selector fill is not supported`);let a=r.join(` `);if(!a)throw new e(`INVALID_ARGS`,`fill requires text`);let o=h(i.delayMs??0,`delay-ms`,0,1e4),s=await t.fillElementSelector(n,a,o);return{selector:n.raw,text:a,delayMs:o,...s??{},...m(Y(`Filled`,a))}}async function ht(e,t,n,r){if(r?.directElementSelector&&c(e))return await gt(t,r.directElementSelector);let{x:i,y:a}=G(n,`press requires x y`);if(u(e)&&r?.surface&&r.surface!==`app`)return await _t(i,a,r);let o=_(r);if(o!==`primary`)return await vt(e,i,a,o,r);let s=xt(r);return St(s),st(e,s.count)?await wt(e,i,a,s,r):await Dt(t,i,a,s)}async function gt(t,n){if(!t.tapElementSelector)throw new e(`UNSUPPORTED_OPERATION`,`direct element selector tap is not supported`);let r=await t.tapElementSelector(n),i=r?.maestroNonHittableCoordinateFallbackUsed===!0;return{selector:n.raw,...r??{},...m(i?se:`Tapped ${n.raw}`)}}function G(t,n,r){let i=Number(t[0]),a=Number(t[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new e(`INVALID_ARGS`,n,r);return{x:i,y:a}}async function _t(t,n,r){let i=_(r);if(i!==`primary`)throw new e(`UNSUPPORTED_OPERATION`,`${i} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:a}=await import(`./helper.js`).then(e=>e.t);return await a(t,n,{bundleId:r.appBundleId,surface:r.surface}),{x:t,y:n,...m(J({x:t,y:n}))}}async function vt(e,t,n,r,i){if(yt(e,r,i),e.platform===`linux`)return await bt(t,n,r);let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.r);return await a(e,{command:`mouseClick`,x:t,y:n,button:r,appBundleId:i?.appBundleId},q(i)),{x:t,y:n,button:r,...m(J({x:t,y:n,button:r}))}}function yt(e,t,n){let r=v({commandLabel:`click`,platform:o(e),button:t,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap});if(r)throw r}async function bt(e,t,n){if(n===`secondary`){let{rightClickLinux:n}=await import(`./input-actions3.js`);await n(e,t)}else{let{middleClickLinux:n}=await import(`./input-actions3.js`);await n(e,t)}return{x:e,y:t,button:n,...m(J({x:e,y:t,button:n}))}}function xt(e){return{count:K(e?.count,1,`count`,1,200),intervalMs:K(e?.intervalMs,0,`interval-ms`,0,1e4),holdMs:K(e?.holdMs,0,`hold-ms`,0,1e4),jitterPx:K(e?.jitterPx,0,`jitter-px`,0,100),doubleTap:!!e?.doubleTap}}function K(e,t,n,r,i){return h(e===void 0?t:e,n,r,i)}function St({doubleTap:t,holdMs:n,jitterPx:r}){if(t&&n>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with hold-ms`);if(t&&r>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with jitter-px`)}async function Ct(e,t,n){let{runAppleRunnerCommand:r}=await import(`./runner-client.js`).then(e=>e.r),{MAX_RUNNER_SEQUENCE_STEPS:i,buildRunnerSequenceCommand:a,parseRunnerSequenceResult:o}=await import(`./runner-sequence.js`).then(e=>e.r),s=ct(t,i),c,l,u=0,d=[],f=0;for(let t of s){let i=await r(e,a(t,n?.appBundleId),q(n));c??=i,l=i;let s;try{s=o(i)}catch(e){throw Et(e,f)}u+=s.completedSteps,d.push(...s.results),f+=t.length}return{...c??{},completedSteps:u,sequenceResults:d,...l?.gestureEndUptimeMs===void 0?{}:{gestureEndUptimeMs:l.gestureEndUptimeMs}}}async function wt(e,t,n,r,i){let a=await Ct(e,Tt(e,t,n,r),i);return{x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,timingMode:`runner-sequence`,...a,...m(J({x:t,y:n}))}}function Tt(e,t,n,r){let i=r.doubleTap?`doubleTap`:r.holdMs>0?`longPress`:`tap`,a=i===`tap`&&c(e)&&!d(e);return Array.from({length:r.count},(e,o)=>{let[s,c]=W(o,r.jitterPx),l=o===r.count-1;return{kind:i,x:t+s,y:n+c,...a?{synthesized:!0}:{},...r.holdMs>0?{durationMs:r.holdMs}:{},...!l&&r.intervalMs>0?{pauseMs:r.intervalMs}:{}}})}function Et(t,n){if(n===0||!(t instanceof e)||!t.details)return t;let r=t.details.failedStepIndex;if(typeof r!=`number`)return t;let i=t.details.completedSteps;return new e(t.code,t.message,{...t.details,failedStepIndex:r+n,chunkStepIndex:r,...typeof i==`number`?{completedSteps:n+i}:{}},t.cause)}async function Dt(e,t,n,r){let i;return await lt(r.count,r.intervalMs,async a=>{let[o,s]=W(a,r.jitterPx),c=t+o,l=n+s;if(r.doubleTap){let t=await e.doubleTap(c,l);i??=t??void 0;return}if(r.holdMs>0){let t=await e.longPress(c,l,r.holdMs);i??=t??void 0}else{let t=await e.tap(c,l);i??=t??void 0}}),p({x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,...i},J({x:t,y:n}))}function q(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir}}async function Ot(t,n,r){let i=n[0],a=n[1]?Number(n[1]):void 0,o=r?.pixels,s=r?.durationMs;if(!i)throw new e(`INVALID_ARGS`,`scroll requires direction`);kt(a,o,s);let c=Pt(i),l={amount:a,pixels:o,durationMs:s},{interactionResult:u,completedPasses:d}=await jt(t,r,c,l);return p(Mt(c,l,d,u),ne(c.direction,c.edge,d,a,o))}function kt(e,t,n){At(e),ae(n),le({amount:e,pixels:t})}function At(t){if(t!==void 0&&!Number.isFinite(t))throw new e(`INVALID_ARGS`,`scroll amount must be a number`)}async function jt(e,t,n,r){if(n.edge){let i=n.edge,a=await re({edge:i,captureState:async n=>await Nt(e,t,i,n),scroll:async()=>await e.scroll(n.direction,r)});return{interactionResult:a.result??{},completedPasses:a.passes}}return{interactionResult:await e.scroll(n.direction,r)??{},completedPasses:1}}function Mt(e,t,n,r){let i=y(r);return{direction:e.direction,...e.edge?{edge:e.edge,passes:n}:{},...t.amount===void 0?{}:{amount:t.amount},...t.pixels===void 0?{}:{pixels:t.pixels},...i===void 0?{}:{durationMs:i},...r}}async function Nt(t,n,r,i){if(typeof t.snapshot!=`function`)throw new e(`UNSUPPORTED_OPERATION`,`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let a=t.snapshot;return await te({edge:r,scope:i,captureNodes:async e=>(await a({appBundleId:n?.appBundleId,scope:e})).nodes??[]})}function Pt(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:ie(e)}}async function Ft(e,t,n){let{x:r,y:i}=G(t,`read requires x y`);if(e.platform===`android`){let{readAndroidTextAtPoint:t}=await import(`./input-actions.js`).then(e=>e.s);return{action:`read`,text:await t(e,r,i)??``}}if(e.platform===`linux`){let{readLinuxTextAtPoint:e}=await import(`./snapshot2.js`).then(e=>e.n);return{action:`read`,text:await e(r,i,n?.surface)}}if(u(e)&&n?.surface&&n.surface!==`app`){let{runMacOsReadTextAction:e}=await import(`./helper.js`).then(e=>e.t);return{action:`read`,text:(await e(r,i,{bundleId:n.appBundleId,surface:n.surface})).text}}let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.r),o=await a(e,{command:`readText`,x:r,y:i,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId,iosXctestrunFile:n?.iosXctestrunFile,iosXctestDerivedDataPath:n?.iosXctestDerivedDataPath,iosXctestEnvDir:n?.iosXctestEnvDir});return{action:`read`,text:typeof o.text==`string`?o.text:typeof o.message==`string`?o.message:``}}function It(e){return fe(e[0])}function J(e){return e.button&&e.button!==`primary`?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function Y(e,t){return`${e} ${Array.from(t).length} chars`}async function Lt(e,t,n,r,i){let a=X(i);return await Rt(e,await C(e,a),t,n,r,i,a)}async function Rt(e,t,n,r,i,a,o){return b({level:`debug`,phase:`platform_command_prepare`,data:{command:n,platform:e.platform,kind:e.kind}}),await x(`platform_command`,async()=>await Vt(e,t,n,r,i,a,o),{command:n,platform:e.platform})}async function zt(t,n,r){let i=await C(t,X(r));if(!i.performGesture)throw new e(`UNSUPPORTED_OPERATION`,`Gesture execution is unavailable`);return await i.performGesture(n)}async function Bt(e,t){return await(await C(e,X(t))).gestureViewport?.()}function X(e){return{requestId:e?.requestId,signal:e?.signal,appBundleId:e?.appBundleId,verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir,runnerLeaseContext:e?.runnerLeaseContext}}const Z={press:({device:e,interactor:t,positionals:n,context:r})=>ht(e,t,n,r),longpress:({interactor:e,positionals:t})=>ut(e,t),focus:({interactor:e,positionals:t})=>dt(e,t),type:({interactor:e,positionals:t,context:n})=>ft(e,t,n),fill:({interactor:e,positionals:t,context:n})=>pt(e,t,n),scroll:({interactor:e,positionals:t,context:n})=>Ot(e,t,n),"trigger-app-event":({device:e,interactor:t,positionals:n,context:r})=>Ht(e,t,n,r),screenshot:({interactor:e,positionals:t,outPath:n,context:r})=>Ut(e,t,n,r),viewport:({interactor:e,positionals:t})=>Wt(e,t),back:async({interactor:e,context:t})=>(await e.back(t?.backMode),{action:`back`,mode:t?.backMode??`in-app`,...m(`Back`)}),home:async({interactor:e})=>(await e.home(),{action:`home`,...m(`Home`)}),orientation:async({interactor:e,positionals:t})=>{let n=de(t[0]),r=(await e.setOrientation(n))?.orientation??n;return{action:`orientation`,orientation:r,...m(`Rotated to ${r}`)}},"app-switcher":async({interactor:e})=>(await e.appSwitcher(),{action:`app-switcher`,...m(`Opened app switcher`)}),clipboard:({interactor:e,positionals:t})=>Gt(e,t),keyboard:({device:e,positionals:t,context:n,runnerCtx:r})=>qt(e,t,n,r),"tv-remote":({device:e,interactor:t,positionals:n,context:r})=>Kt(e,t,n,r),settings:({device:e,interactor:t,positionals:n,context:r})=>Zt(e,t,n,r),snapshot:({interactor:e,context:t})=>nn(e,t),read:({device:e,positionals:t,context:n})=>Ft(e,t,n)};async function Vt(t,n,r,i,a,o,s){let c=Object.hasOwn(Z,r)?Z[r]:void 0;if(!c)throw new e(`INVALID_ARGS`,`Unknown command: ${r}`);return await c({device:t,interactor:n,positionals:i,outPath:a,context:o,runnerCtx:s})}async function Ht(e,t,n,r){let{eventName:i,payload:a}=Xe(n),o=Ze(e,i,a);return await t.open(o,{appBundleId:r?.appBundleId}),{event:i,eventUrl:o,transport:`deep-link`,...m(`Triggered app event: ${i}`)}}async function Ut(e,n,r,i){let a=n[0]??r??`./screenshot-${Date.now()}.png`;await Se.mkdir(be.dirname(a),{recursive:!0});let o=t(i);return await e.screenshot(a,{appBundleId:i?.appBundleId,pixelDensity:o.pixelDensity,fullscreen:o.fullscreen,normalizeStatusBar:o.normalizeStatusBar,stabilize:o.stabilize,surface:i?.surface,skipIosSimulatorBootCheck:i?.skipIosSimulatorBootCheck,captureBackend:i?.screenshotCaptureBackend}),{path:a,...m(`Saved screenshot: ${a}`)}}async function Wt(t,n){if(n.length!==2)throw new e(`INVALID_ARGS`,`viewport requires exactly two arguments: <width> <height>`);let r=g(n[0],`width`),i=g(n[1],`height`);if(!t.setViewport)throw new e(`UNSUPPORTED_OPERATION`,`viewport is not supported by this backend`);return await t.setViewport(r,i),{width:r,height:i,...m(`Viewport set: ${r}x${i}`)}}async function Gt(t,n){let r=(n[0]??``).toLowerCase();if(r!==`read`&&r!==`write`)throw new e(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);if(r===`read`){if(n.length!==1)throw new e(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:r,text:await t.readClipboard()}}if(n.length<2)throw new e(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=n.slice(1).join(` `);return await t.writeClipboard(i),{action:r,textLength:Array.from(i).length,...m(`Clipboard updated`)}}async function Kt(t,n,r,i){if(t.target!==`tv`)throw new e(`UNSUPPORTED_OPERATION`,`tv-remote is supported only on TV targets`,{hint:`Select an Android TV, tvOS, or Vega OS target with --target tv.`});if(r.length!==1)throw new e(`INVALID_ARGS`,`tv-remote requires exactly one button`);let a=oe(r[0]),o=i?.durationMs===void 0?void 0:h(i.durationMs,`durationMs`,0,1e4);return await n.tvRemote(a,o),{action:`tv-remote`,button:a,...o===void 0?{}:{durationMs:o},...m(`Pressed TV remote ${a}`)}}async function qt(t,n,r,i){let a=(n[0]??`status`).toLowerCase();if(!ue(a))throw new e(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(n.length>1)throw new e(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);if(t.platform===`android`)return await Jt(t,a);if(t.platform===`harmonyos`)return await Q(t,a);if(c(t))return await Yt(t,a,r,i);throw new e(`UNSUPPORTED_OPERATION`,`keyboard is supported only on Android, HarmonyOS, and iOS`)}async function Q(t,n){if(n!==`dismiss`&&n!==`enter`&&n!==`return`)throw new e(`UNSUPPORTED_OPERATION`,`keyboard status/get is not available through the public HarmonyOS HDC API; use keyboard dismiss or enter`);let{pressHarmonyKeyboardKey:r}=await import(`./input-actions2.js`);return await r(t,n===`dismiss`?`Back`:`Enter`),{platform:`harmonyos`,action:n===`dismiss`?`dismiss`:`enter`,...m(n===`dismiss`?`Keyboard dismissed`:`Keyboard enter pressed`)}}async function Jt(e,t){if(t===`enter`||t===`return`){let{pressAndroidEnter:t}=await import(`./input-actions.js`).then(e=>e.s);return await t(e),{platform:`android`,action:`enter`,...m(`Keyboard enter pressed`)}}if(t===`dismiss`){let{dismissAndroidKeyboard:t}=await import(`./device-input-state.js`).then(e=>e.t),n=await t(e);return{platform:`android`,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}let{getAndroidKeyboardState:n}=await import(`./device-input-state.js`).then(e=>e.t),r=await n(e);return{platform:`android`,action:`status`,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}async function Yt(t,n,r,i){if(n!==`dismiss`&&n!==`enter`&&n!==`return`)throw new e(`UNSUPPORTED_OPERATION`,`keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS`);if(n===`enter`||n===`return`){let{runAppleRunnerCommand:e}=await import(`./runner-client.js`).then(e=>e.r),n=await e(t,{command:`keyboardReturn`,appBundleId:r?.appBundleId},i);return{platform:`ios`,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...m(`Keyboard enter pressed`)}}let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.r),o=await a(t,{command:`keyboardDismiss`,appBundleId:r?.appBundleId},i),s=typeof o.keyboardDismissMechanism==`string`?o.keyboardDismissMechanism:void 0;return{platform:`ios`,action:`dismiss`,wasVisible:o.wasVisible,dismissed:o.dismissed,visible:o.visible,mechanism:s,...m(Xt(o.dismissed===!0,s))}}function Xt(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function Zt(t,n,r,i){let[a,o,s,c]=r;if(!a||!o&&a!==`clear-app-state`)throw new e(`INVALID_ARGS`,`settings requires setting state`);if(a===`clear-app-state`)return await Qt(t,n,o,s,i);if(!o)throw new e(`INVALID_ARGS`,`settings requires setting state`);return await $t(t,n,a,o,s,c,r,i)}async function Qt(t,n,r,i,a){let o=(r===`clear`?i:r)??a?.appBundleId;if(!o)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);b({level:`debug`,phase:`settings_apply`,data:{setting:`clear-app-state`,state:`clear`,appBundleId:o,platform:t.platform}});let s=await n.setSetting(`clear-app-state`,`clear`,o);return s&&typeof s==`object`?p({setting:`clear-app-state`,state:`clear`,...s},$(s)??`Cleared user data for ${o}`):{setting:`clear-app-state`,state:`clear`,...m(`Cleared user data for ${o}`)}}async function $t(e,t,n,r,i,a,o,s){let c=n===`location`&&r===`set`,l=(n===`permission`||c?o[4]:o[2])??s?.appBundleId;b({level:`debug`,phase:`settings_apply`,data:tn(e,n,r,i,a,l,c)});let u=await t.setSetting(n,r,l,en(n,i,a,c));return u&&typeof u==`object`?p({setting:n,state:r,...u},$(u)??`Updated setting: ${n}`):{setting:n,state:r,...m(`Updated setting: ${n}`)}}function en(e,t,r,i){if(e===`permission`)return{permissionTarget:t,permissionMode:r};if(i)return{latitude:n(t,`latitude`),longitude:n(r,`longitude`)}}function tn(e,t,n,r,i,a,o){return o?{setting:t,state:n,latitude:r,longitude:i,platform:e.platform}:t===`permission`?{setting:t,state:n,permissionTarget:r,permissionMode:i,platform:e.platform}:{setting:t,state:n,appBundleId:a,platform:e.platform}}async function nn(e,t){let n=t??{};return await e.snapshot({appBundleId:n.appBundleId,signal:n.signal,interactiveOnly:n.snapshotInteractiveOnly,preferredBackend:n.snapshotPreferredBackend,depth:n.snapshotDepth,scope:n.snapshotScope,raw:n.snapshotRaw,customActions:n.snapshotCustomActions,includeRects:n.snapshotIncludeRects,includeHiddenContentHints:n.snapshotIncludeHiddenContentHints,surface:n.surface})}function $(e){return typeof e.message==`string`&&e.message.length>0?e.message:void 0}export{R as a,P as c,Ve as d,A as f,L as i,Be as l,Ee as m,zt as n,qe as o,Te as p,Bt as r,Je as s,Lt as t,He as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./screenshot-result.js";function e(e,t,n,r,i,a){t&&e.recordAction(t,{command:r,positionals:a?.positionals??n.positionals??[],flags:a?.flags??n.flags??{},result:i??{}})}export{e as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as e,_ as t}from"./sdk-contracts.js";import{a as n,i as r,n as i}from"./sdk-android-adb.js";import{n as a,t as o}from"./version.js";import s from"node:path";import c from"node:crypto";import l from"node:os";import u from"node:fs/promises";function d(e){let t={status:[],results:[],currentStatus:null,currentResult:null};for(let n of e.split(/\r?\n/))f(n,t);return p(t),{status:t.status,results:t.results}}function f(e,t){if(e.startsWith(`INSTRUMENTATION_STATUS: `)){t.currentStatus??={},g(e.slice(24),t.currentStatus);return}if(e.startsWith(`INSTRUMENTATION_STATUS_CODE: `)){m(t);return}if(e.startsWith(`INSTRUMENTATION_RESULT: `)){t.currentResult??={},g(e.slice(24),t.currentResult);return}e.startsWith(`INSTRUMENTATION_CODE: `)&&h(t)}function p(e){m(e),h(e)}function m(e){e.currentStatus&&=(e.status.push(e.currentStatus),null)}function h(e){e.currentResult&&=(e.results.push(e.currentResult),null)}function g(e,t){let n=e.indexOf(`=`);n<0||(t[e.slice(0,n)]=e.slice(n+1))}function _(e){if(e===void 0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function v(e){if(e===`true`)return!0;if(e===`false`)return!1}function y(e,n,r){if(typeof e!=`number`||!Number.isInteger(e))throw new t(`INVALID_ARGS`,`Android ${r} manifest ${n} must be an integer.`);return e}function b(e,n,r,i){if(e!==r)throw new t(`INVALID_ARGS`,`Android ${i} manifest ${n} must be "${r}".`);return r}function x(e,n,r){if(typeof e!=`string`||e.length===0)throw new t(`INVALID_ARGS`,`Android ${r} manifest ${n} is required.`);return e}function S(e,n){let r=x(e,`sha256`,n).trim().toLowerCase();if(r.length!==64||!/^[0-9a-f]+$/.test(r))throw new t(`INVALID_ARGS`,`Android ${n} manifest sha256 must be a 64-character hex string.`);return r}const C=1e4;async function w(e){let{adb:t,adbProvider:n,packageName:a,versionCode:o,apkPath:s,sha256:c,cache:l,deviceKey:u,installTimeoutMs:d,helperLabel:f}=e,p=`${u}\0${a}\0${o}\0${c}`;if(l.has(p))return{packageName:a,versionCode:o,installedSha256:c,installed:!1,reason:`current`};await j(s,c,f);let m=await T({adb:t,adbProvider:n,packageName:a,versionCode:o,sha256:c});if(m.reason===`current`)return l.add(p),{packageName:a,versionCode:o,...m,installed:!1};let h=await r(s,{provider:n,replace:!0,allowTestPackages:!0,allowFailure:!0,timeoutMs:d});if(h.exitCode!==0)throw i(`Failed to install ${f}`,h,{packageName:a,versionCode:o,reason:m.reason});return l.add(p),{packageName:a,versionCode:o,...m,installed:!0}}async function T(e){let{adb:t,adbProvider:n,packageName:r,versionCode:i,sha256:a,signal:o}=e,s=await O(t,r,o);if(s===void 0)return{reason:`missing`};if(s<i)return{installedVersionCode:s,reason:`outdated`};if(s>i)return{installedVersionCode:s,reason:`current`};try{let e=await k(t,n,r,o);return{installedVersionCode:s,installedSha256:e,reason:e===a?`current`:`mismatched`}}catch{return o?.throwIfAborted(),{installedVersionCode:s,reason:`unverifiable`}}}async function E(n){let r=a(),i=s.join(o(),`android`,n.helperDirName,`dist`),c=s.join(i,n.manifestFileName(r));try{let e=n.parseManifest(JSON.parse(await u.readFile(c,`utf8`))),t=s.join(i,e.assetName);return await u.access(t),{apkPath:t,manifest:e}}catch(r){throw new t(`UNSUPPORTED_OPERATION`,n.unavailableMessage,{manifestPath:c,error:e(r).message},r)}}function D(e){return async t=>await w({adb:t.adb,adbProvider:t.adbProvider,packageName:t.artifact.manifest.packageName,versionCode:t.artifact.manifest.versionCode,apkPath:t.artifact.apkPath,sha256:t.artifact.manifest.sha256,cache:e.cache,deviceKey:t.deviceKey,installTimeoutMs:e.installTimeoutMs,helperLabel:e.helperLabel})}async function O(e,t,n){let r=await e([`shell`,`cmd`,`package`,`list`,`packages`,`--show-versioncode`,t],{allowFailure:!0,timeoutMs:5e3,signal:n});if(r.exitCode!==0)return;let i=RegExp(`package:${N(t)}(?:\\s|$).*versionCode:(\\d+)`).exec(`${r.stdout}\n${r.stderr}`);return i?Number(i[1]):void 0}async function k(e,r,a,o){let c=await e([`shell`,`pm`,`path`,a],{allowFailure:!0,timeoutMs:C,signal:o}),d=A(`${c.stdout}\n${c.stderr}`);if(c.exitCode!==0||!d)throw new t(`COMMAND_FAILED`,`Could not resolve installed Android helper APK`);let f=await u.mkdtemp(s.join(l.tmpdir(),`agent-device-helper-`)),p=s.join(f,`base.apk`);try{let e=await n(d,p,{provider:r,allowFailure:!0,timeoutMs:C,signal:o});if(e.exitCode!==0)throw i(`Could not read installed Android helper APK`,e,{packageName:a,remotePath:d});return await M(p)}finally{await u.rm(f,{recursive:!0,force:!0})}}function A(e){return e.split(/\r?\n/).map(e=>e.startsWith(`package:`)?e.slice(8).trim():``).find(e=>e.endsWith(`/base.apk`))}async function j(e,n,r){let i=await M(e);if(i!==n)throw new t(`COMMAND_FAILED`,`${r} APK checksum mismatch`,{apkPath:e,expectedSha256:n,actualSha256:i})}async function M(e){let t=c.createHash(`sha256`);return t.update(await u.readFile(e)),t.digest(`hex`)}function N(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}export{d as a,S as c,_ as d,j as i,x as l,D as n,y as o,E as r,b as s,T as t,v as u};
|
package/dist/src/host-process.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{S as e,_ as t}from"./sdk-android-adb.js";import{t as n}from"./timeouts.js";const r=1e3,i=process.platform===`win32`?`ps`:`/bin/ps`;function a(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function o(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(-e,0),!0}catch(e){return e.code===`EPERM`}}function s(e){return d(e,`lstart=`)}function c(e){return d(e,`command=`)}function l(e){return d(e,`state=`)?.startsWith(`Z`)??!1}function u(t){let n=new Map,i=h(t);if(i.length===0)return n;try{let t=e(`ps`,[`-p`,i.join(`,`),`-o`,`pid=,state=,lstart=`],{allowFailure:!0,timeoutMs:r});if(t.exitCode!==0)return n;for(let e of t.stdout.split(`
|
|
2
|
-
`)){let t=/^\s*(\d+)\s+(\S+)\s+(.+?)\s*$/.exec(e);if(!t)continue;let r=Number.parseInt(t[1],10);!Number.isInteger(r)||r<=0||n.set(r,{state:t[2],startTime:t[3]})}}catch{}return n}function d(t,n){if(!Number.isInteger(t)||t<=0)return null;try{let a=e(i,[`-p`,String(t),`-o`,n],{allowFailure:!0,timeoutMs:r});if(a.exitCode!==0)return null;let o=a.stdout.trim();return o.length>0?o:null}catch{return null}}function f(e){let t=[];for(let n of e.split(`
|
|
3
|
-
`)){let e=/^\s*(\d+)\s+(\d+)\s+(.+?)\s*$/.exec(n);if(!e)continue;let r=Number.parseInt(e[1],10),i=Number.parseInt(e[2],10),a=e[3];!Number.isInteger(r)||r<=0||t.push({pid:r,ppid:Number.isInteger(i)&&i>0?i:void 0,command:a})}return t}async function p(e){let n=await(e.runCommand??t)(e.runCommand?`ps`:i,[`-ax`,`-o`,`pid=,ppid=,command=`],{allowFailure:!0,timeoutMs:e.timeoutMs});return n.exitCode===0?f(n.stdout):[]}function m(e,t){let n=new Set(h(e)),r=!0;for(;r;){r=!1;for(let e of t)e.ppid===void 0||!n.has(e.ppid)||n.has(e.pid)||(n.add(e.pid),r=!0)}return t.filter(e=>n.has(e.pid))}function h(e,t={}){return[...new Set(e)].filter(e=>Number.isInteger(e)&&e>0&&e!==t.excludePid)}function g(e,t){let n=h(e,{excludePid:process.pid}),r=0;for(let e of n)try{process.kill(e,t),r+=1}catch{}return r}async function _(e,t){if(!a(e))return!0;let r=Date.now();for(;Date.now()-r<t;)if(await n(50),!a(e))return!0;return!a(e)}async function v(e){let t=h(e.pids,{excludePid:process.pid});t.length!==0&&(g(t,`SIGTERM`),await Promise.all(t.map(async t=>await _(t,e.termTimeoutMs))),g(t.filter(e=>a(e)),`SIGKILL`),await Promise.all(t.map(async t=>await _(t,e.killTimeoutMs))))}export{p as a,s as c,_ as d,l as i,g as l,a as n,u as o,o as r,c as s,m as t,v as u};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime.js";import{C as t,_ as n}from"./sdk-contracts.js";import{lt as r}from"./sdk-batch-runner.js";import{A as i,_ as a,n as o,o as s,s as c}from"./sdk-android-adb.js";import{c as l,l as u,n as d,o as f,r as p,s as m}from"./helper-package-install.js";import{t as h}from"./keyed-lock.js";import{i as g,r as _,t as v}from"./ime-recovery-marker.js";const y=`IME helper`,b=`android-ime-helper-v1`;async function x(e){return e.imeHelperArtifact??await S()}async function S(){return await p({helperDirName:`ime-helper`,manifestFileName:e=>`agent-device-android-ime-helper-${e}.manifest.json`,parseManifest:C,unavailableMessage:`Android test IME text entry requires the bundled Android IME helper artifact, but it was not found or could not be read`})}function C(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`INVALID_ARGS`,`Android IME helper manifest must be an object.`);let t=e;return{name:m(t.name,`name`,`android-ime-helper`,y),version:u(t.version,`version`,y),assetName:u(t.assetName,`assetName`,y),sha256:l(t.sha256,y),packageName:m(t.packageName,`packageName`,`com.callstack.agentdevice.imehelper`,y),versionCode:f(t.versionCode,`versionCode`,y),serviceComponent:m(t.serviceComponent,`serviceComponent`,`com.callstack.agentdevice.imehelper/.TestInputMethodService`,y),broadcastProtocol:m(t.broadcastProtocol,`broadcastProtocol`,b,y)}}const w=d({cache:new Set,installTimeoutMs:3e4,helperLabel:`Android IME helper`});function T(e){return`${e.platform}:${e.id}`}async function E(e,t,n){await O(e,t,`com.callstack.agentdevice.imehelper.ACTION_INPUT_TEXT_B64`,{text:Buffer.from(n,`utf8`).toString(`base64`)})}async function D(e,t){await O(e,t,`com.callstack.agentdevice.imehelper.ACTION_CLEAR_TEXT`,{})}async function O(e,t,n,r){let i=[`shell`,`am`,`broadcast`,`-p`,t,`-a`,n];i.push(`--es`,`protocol`,b);for(let[e,t]of Object.entries(r))i.push(`--es`,e,t);let a=await e(i,{allowFailure:!0,timeoutMs:1e4});if(a.exitCode!==0)throw o(`Android IME helper broadcast failed`,a,{action:n,packageName:t})}var k=e({ANDROID_TEST_IME_SETTINGS_KEYS:()=>Z,activateAndroidTestIme:()=>I,isAndroidTestImeActive:()=>F,listAndroidAdbSerialsQuick:()=>X,readAndroidDefaultInputMethod:()=>U,restoreAndroidTestIme:()=>R,restoreOrphanedAndroidTestImeOnDaemonStartup:()=>V});const A=`agent_device_ime_helper_previous_ime`,j=`secure`,M=`default_input_method`,N=new Set,P=new Map;function F(e){return N.has(T(e))}async function I(e,t){return await r(t.stateDir),await H(t.stateDir,e.id,async()=>await L(e,t))}async function L(e,n){let r=s(e),a=c(e),o=T(e),l;try{l=await x(a),await w({adb:r,adbProvider:a,artifact:l,deviceKey:o})}catch(e){return{outcome:`helper-unavailable`,reason:t(e).message}}let{manifest:u}=l,d=await U(r);if(d===u.serviceComponent){let t=await g(n.stateDir,e.id),i=await W(r);return t&&N.add(o),{outcome:`settled`,activated:!1,alreadyActive:!0,...t?{}:{persistFailed:!0},previousIme:i,helperServiceComponent:u.serviceComponent,helperPackageName:u.packageName}}let f=await W(r);if(!await G(r,d))return await q(r,f,e.id),i({level:`warn`,phase:`android_test_ime_persist_failed`,data:{device:e.id,previousIme:d}}),{outcome:`settled`,activated:!1,alreadyActive:!1,persistFailed:!0,helperServiceComponent:u.serviceComponent,helperPackageName:u.packageName};let p=(await _(n.stateDir)).includes(e.id);if(!await g(n.stateDir,e.id))return await q(r,f,e.id),i({level:`warn`,phase:`android_test_ime_marker_persist_failed`,data:{device:e.id,previousIme:d}}),{outcome:`settled`,activated:!1,alreadyActive:!1,persistFailed:!0,helperServiceComponent:u.serviceComponent,helperPackageName:u.packageName};await r([`shell`,`ime`,`enable`,u.serviceComponent],{allowFailure:!0,timeoutMs:1e4});let m=await r([`shell`,`ime`,`set`,u.serviceComponent],{allowFailure:!0,timeoutMs:1e4}),h=await U(r);return h===u.serviceComponent?(N.add(o),i({phase:`android_test_ime_activated`,data:{device:e.id,previousIme:d}}),{outcome:`settled`,activated:!0,alreadyActive:!1,previousIme:d,helperServiceComponent:u.serviceComponent,helperPackageName:u.packageName}):(N.delete(o),await q(r,f,e.id),p||await v(n.stateDir,e.id),i({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:e.id,activeIme:h,stderr:m.stderr.trim()}}),{outcome:`settled`,activated:!1,alreadyActive:!1,helperServiceComponent:u.serviceComponent,helperPackageName:u.packageName})}async function R(e,t){return await H(t.stateDir,e.id,async()=>{let n=T(e);if(!N.has(n))return{restored:!1,reason:`no-record`};N.delete(n);let r=await B(s(e),e);return z(r.reason)&&await v(t.stateDir,e.id),r})}function z(e){return e===`ok`||e===`helper-not-active`||e===`no-record`}async function B(e,t){let n=t.id;if(N.has(T(t)))return{restored:!1,reason:`owned-by-live-session`};let r=await W(e);if(!r)return{restored:!1,reason:`no-record`};let a=await U(e);if(a!==`com.callstack.agentdevice.imehelper/.TestInputMethodService`)return i({level:`debug`,phase:`android_test_ime_restore_skipped`,data:{device:n,currentIme:a,previousIme:r}}),{restored:!1,previousIme:r,reason:`helper-not-active`};await e([`shell`,`ime`,`set`,r],{allowFailure:!0,timeoutMs:1e4});let o=await U(e);return o===r?(await K(e).catch(()=>{}),i({phase:`android_test_ime_restored`,data:{device:n,previousIme:r}}),{restored:!0,previousIme:r,reason:`ok`}):(i({level:`warn`,phase:`android_test_ime_restore_failed`,data:{device:n,previousIme:r,afterIme:o}}),{restored:!1,previousIme:r,reason:`set-failed`})}async function V(e){let n=await _(e.stateDir);if(n.length===0)return;let r;try{r=new Set(await e.listSerials())}catch(e){i({level:`debug`,phase:`android_test_ime_startup_scan_failed`,data:{error:t(e).message}});return}for(let a of n){if(!r.has(a))continue;let n={platform:`android`,id:a,name:a,kind:a.startsWith(`emulator-`)?`emulator`:`device`,booted:!0};try{await H(e.stateDir,a,async()=>{let t=await B(s(n),n);t.restored&&i({level:`warn`,phase:`android_test_ime_orphan_restored`,data:{device:a,previousIme:t.previousIme}}),z(t.reason)&&await v(e.stateDir,a)})}catch(e){i({level:`debug`,phase:`android_test_ime_orphan_restore_failed`,data:{device:a,error:t(e).message}})}}}function H(e,t,n){return h(P,`${e}:${t}`,n)}async function U(e){let t=await e([`shell`,`settings`,`get`,j,M],{allowFailure:!0,timeoutMs:5e3});return Y(t.exitCode===0?t.stdout:``)}async function W(e){let t=await e([`shell`,`settings`,`get`,j,A],{allowFailure:!0,timeoutMs:5e3});return Y(t.exitCode===0?t.stdout:``)||void 0}async function G(e,t){return(await e([`shell`,`settings`,`put`,j,A,t],{allowFailure:!0,timeoutMs:5e3})).exitCode===0?await W(e)===t:!1}async function K(e){await e([`shell`,`settings`,`delete`,j,A],{allowFailure:!0,timeoutMs:5e3})}async function q(e,n,r){try{(n?await G(e,n):await J(e))||i({level:`warn`,phase:`android_test_ime_record_rollback_failed`,data:{device:r,hadPriorRecord:n!==void 0}})}catch(e){i({level:`warn`,phase:`android_test_ime_record_rollback_failed`,data:{device:r,hadPriorRecord:n!==void 0,error:t(e).message}})}}async function J(e){return await K(e),await W(e)===void 0}function Y(e){let t=e.trim();return!t||t===`null`?``:t}async function X(){try{return(await a(`adb`,[`devices`],{timeoutMs:5e3})).stdout.split(`
|
|
2
|
-
`).map(e=>e.trim()).filter(e=>e.length>0&&!e.startsWith(`List of devices`)).map(e=>e.split(/\s+/)).filter(e=>e[1]===`device`).map(e=>e[0])}catch{return[]}}const Z={previousIme:A,defaultInputMethod:M};export{D as a,E as c,U as i,k as n,S as o,F as r,x as s,Z as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime.js";import{C as t}from"./sdk-contracts.js";import{A as n}from"./sdk-android-adb.js";import r from"node:path";import{randomUUID as i}from"node:crypto";import a from"node:fs/promises";var o=e({clearAndroidTestImeRecoveryMarker:()=>d,readAndroidTestImeRecoveryMarkers:()=>f,writeAndroidTestImeRecoveryMarker:()=>l});function s(e){return r.join(e,`android-test-ime-pending`)}function c(e,t){return r.join(s(e),encodeURIComponent(t))}async function l(e,o){let l,d,f,m=!1;try{let t=s(e);if(f=c(e,o),await a.mkdir(t,{recursive:!0}),(await p(f))?.serial===o)return!0;l=r.join(t,`.${encodeURIComponent(o)}.${i()}.tmp`);let n={version:1,serial:o};if(d=await a.open(l,`wx`,384),await d.writeFile(`${JSON.stringify(n)}\n`,`utf8`),await d.sync(),await d.close(),d=void 0,await a.rename(l,f),l=void 0,m=!0,await u(t),(await p(f))?.serial!==o)throw Error(`Android test IME marker read-back did not match the requested device.`);return!0}catch(r){return d&&await d.close().catch(()=>{}),l&&await a.rm(l,{force:!0}).catch(()=>{}),m&&f&&await a.rm(f,{force:!0}).catch(()=>{}),n({level:`debug`,phase:`android_test_ime_marker_write_failed`,data:{stateDir:e,serial:o,error:t(r).message}}),!1}}async function u(e){let t;try{t=await a.open(e,`r`),await t.sync()}catch{}finally{t&&await t.close().catch(()=>{})}}async function d(e,t){await a.rm(c(e,t),{force:!0}).catch(()=>{})}async function f(e){let t;try{t=await a.readdir(s(e))}catch{return[]}let n=[];for(let i of t)try{let t=r.join(s(e),i),a=await p(t);a&&c(e,a.serial)===t&&n.push(a.serial)}catch{}return[...new Set(n)].sort()}async function p(e){try{return m(await a.readFile(e,`utf8`))}catch{return}}function m(e){try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t;return n.version===1&&typeof n.serial==`string`&&n.serial.length>0?{version:1,serial:n.serial}:void 0}catch{return}}export{l as i,o as n,f as r,d as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{t}from"./timeouts.js";import{r as n}from"./snapshot2.js";function r(){return process.env.WAYLAND_DISPLAY||process.env.XDG_SESSION_TYPE===`wayland`?`wayland`:`x11`}let i=null;async function a(){let t=n();if(i?.provider===t)return i;let a=r();if(a===`wayland`){if(await t.whichCommand(`ydotool`))return i={tool:`ydotool`,display:a,provider:t},i;throw new e(`TOOL_MISSING`,`ydotool is required for input synthesis on Wayland (xdotool does not work on Wayland). Install it via your package manager.`)}if(await t.whichCommand(`xdotool`))return i={tool:`xdotool`,display:a,provider:t},i;throw new e(`TOOL_MISSING`,`xdotool is required for input synthesis on X11. Install it via your package manager.`)}const o=1e4;async function s(...e){await n().runCommand(`xdotool`,e,{allowFailure:!1,timeoutMs:o})}async function c(...e){await n().runCommand(`ydotool`,e,{allowFailure:!1,timeoutMs:o})}function l(){return n().input}async function u(e,t){let{tool:n}=await a();n===`xdotool`?await s(`mousemove`,`--sync`,String(e),String(t)):await c(`mousemove`,`--absolute`,`-x`,String(e),`-y`,String(t))}async function d(e,t){let n=l();if(n){await n.key(e,t);return}let{tool:r}=await a();r===`xdotool`?await s(`key`,`--clearmodifiers`,e):await c(`key`,...t)}async function f(e,t,n,r){await u(e,t);let{tool:i}=await a();i===`xdotool`?await s(`click`,n):await c(`click`,r)}async function p(e,t,n,r,i){let a=l();if(a){await a.click(e,t,n);return}await f(e,t,r,i)}async function m(e,t){await p(e,t,`primary`,`1`,`0xC0`)}async function h(e,t){await p(e,t,`secondary`,`3`,`0xC1`)}async function g(e,t){await p(e,t,`middle`,`2`,`0xC2`)}async function _(e,t){let n=l();if(n){await n.doubleClick(e,t);return}let{tool:r}=await a();await u(e,t),r===`xdotool`?await s(`click`,`--repeat`,`2`,`1`):(await c(`click`,`0xC0`),await c(`click`,`0xC0`))}async function v(e,n,r=800){let i=l();if(i){await i.longPress(e,n,r);return}let{tool:o}=await a();await u(e,n),o===`xdotool`?(await s(`mousedown`,`1`),await t(r),await s(`mouseup`,`1`)):(await c(`click`,`--down`,`0xC0`),await t(r),await c(`click`,`--up`,`0xC0`))}async function y(e,t){await m(e,t)}async function b(e,n,r,i,o=300){let d=l();if(d){await d.drag(e,n,r,i,o);return}let{tool:f}=await a();await u(e,n),f===`xdotool`?(await s(`mousedown`,`1`),await s(`mousemove`,`--sync`,String(r),String(i)),await t(o),await s(`mouseup`,`1`)):(await c(`click`,`--down`,`0xC0`),await c(`mousemove`,`--absolute`,`-x`,String(r),`-y`,String(i)),await t(o),await c(`click`,`--up`,`0xC0`))}async function x(e,t){let n=l();if(n)return await n.scroll(e,t),C(t);let{tool:r}=await a(),i=5;if(t?.pixels==null?t?.amount!=null&&(i=Math.max(1,Math.round(5*(t.amount/.6)))):i=r===`xdotool`?Math.max(1,Math.round(t.pixels/15)):Math.max(1,Math.round(t.pixels/40)),r===`xdotool`){let n=e===`up`?`4`:e===`down`?`5`:e===`left`?`6`:`7`;await S(i,t?.durationMs,async e=>{await s(`click`,`--repeat`,String(e),n)})}else e===`up`||e===`down`?await S(i,t?.durationMs,async t=>{await c(`mousemove`,`--wheel`,`-y`,String(e===`up`?-t:t))}):await S(i,t?.durationMs,async t=>{await c(`mousemove`,`--wheel`,`-x`,String(e===`left`?-t:t))});return C(t)}async function S(e,n,r){if(n===void 0||n<=0||e<=1){await r(e);return}let i=n/Math.max(1,e-1);for(let n=0;n<e;n+=1)await r(1),n<e-1&&await t(i)}function C(e){return e?.durationMs===void 0?{}:{durationMs:e.durationMs}}async function w(e,t=0){let n=l();if(n){await n.typeText(e,{delayMs:t});return}let{tool:r}=await a();if(r===`xdotool`){let n=[`type`];t>0&&n.push(`--delay`,String(t)),n.push(`--clearmodifiers`,`--`,e),await s(...n)}else await c(`type`,`--`,e)}async function T(e,n,r,i=0){await m(e,n),await t(100),await d(`ctrl+a`,[`29:1`,`30:1`,`30:0`,`29:0`]),await t(50),await w(r,i)}export{_ as doubleClickLinux,T as fillLinux,y as focusLinux,v as longPressLinux,g as middleClickLinux,m as pressLinux,h as rightClickLinux,x as scrollLinux,d as sendKey,b as swipeLinux,w as typeLinux};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./manifest.js";import{n as t,r as n}from"./install-source2.js";import r from"node:path";async function i(e,r){let i=e.kind===`url`&&t(e.url),s=await n({source:e,isInstallablePath:(e,t)=>t.isFile()&&a(e),installableLabel:`Android installable (.apk or .aab)`,allowArchiveExtraction:e.kind!==`url`||i,signal:r?.signal});try{let e=r?.resolveIdentity===!1?{}:await o(s.installablePath,r?.signal);return{archivePath:s.archivePath,installablePath:s.installablePath,packageName:e.packageName,cleanup:s.cleanup}}catch(e){throw await s.cleanup(),e}}function a(e){let t=r.extname(e).toLowerCase();return t===`.apk`||t===`.aab`}async function o(t,n){let i=r.extname(t).toLowerCase();return i!==`.apk`&&i!==`.aab`?{}:{packageName:await e(t,n)}}export{i as prepareAndroidInstallArtifact};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{r as t}from"./byte-limit-stream.js";import{a as n,c as r,n as i,o as a,r as o,s}from"./install-source2.js";import{t as c}from"./plist.js";import l from"node:path";import{promises as u}from"node:fs";import d from"node:os";async function f(e,t){return await r(async()=>await p(e,t))}async function p(t,n){if(t.kind===`url`&&!i(t.url))throw new e(`INVALID_ARGS`,`iOS install_from_source URL sources are only supported for trusted artifact services such as GitHub Actions and EAS. Use a path source for other hosts.`);let r=await o({source:t,isInstallablePath:(e,t)=>t.isDirectory()&&e.toLowerCase().endsWith(`.app`)||t.isFile()&&e.toLowerCase().endsWith(`.ipa`),installableLabel:`iOS installable (.app or .ipa)`,allowArchiveExtraction:t.kind!==`url`||i(t.url),signal:n?.signal}),a;try{a=await h(r.installablePath,n);let e=a,t=await m(e.installPath,n?.signal);return{archivePath:r.archivePath??(r.installablePath.toLowerCase().endsWith(`.ipa`)?r.installablePath:void 0),installablePath:e.installPath,bundleId:t.bundleId,appName:t.appName,cleanup:async()=>{await e.cleanup(),await r.cleanup()}}}catch(e){try{await a?.cleanup()}finally{await r.cleanup()}throw e}}async function m(e,t){let n=l.join(e,`Info.plist`),[r,i,a]=await Promise.all([c(n,`CFBundleIdentifier`,t),c(n,`CFBundleDisplayName`,t),c(n,`CFBundleName`,t)]);return{bundleId:r,appName:i??a}}async function h(e,t){return e.toLowerCase().endsWith(`.ipa`)?await g(e,t):{installPath:e,cleanup:async()=>{}}}async function g(r,i){let o=await u.mkdtemp(l.join(d.tmpdir(),`agent-device-ios-ipa-`)),c=async()=>{await u.rm(o,{recursive:!0,force:!0})};try{let d=l.join(o,`extracted`),f=a()+1;await t({archivePath:r,outputRoot:d,type:`zip`,budget:n(),depth:f,signal:i?.signal}),s(f);let p=l.join(d,`Payload`),m=(await u.readdir(p,{withFileTypes:!0}).catch(()=>{throw new e(`INVALID_ARGS`,`Invalid IPA: missing Payload directory`)})).filter(e=>e.isDirectory()&&e.name.toLowerCase().endsWith(`.app`)).map(e=>({installPath:l.join(p,e.name),bundleName:e.name.replace(/\.app$/i,``)})),h=m[0];if(h!==void 0&&m.length===1)return{installPath:h.installPath,cleanup:c};if(m.length===0)throw new e(`INVALID_ARGS`,`Invalid IPA: expected at least one .app under Payload, found 0`);await _(m,i?.signal);let g=i?.appIdentifierHint?.trim();if(g){let t=v(m,g);if(t)return{installPath:t.installPath,cleanup:c};throw new e(`INVALID_ARGS`,`Invalid IPA: found ${m.length} .app bundles under Payload and none matched "${g}". Available bundles: ${m.map(y).join(`, `)}`)}throw new e(`INVALID_ARGS`,`Invalid IPA: found ${m.length} .app bundles under Payload. Pass an app identifier or bundle name matching one of: ${m.map(y).join(`, `)}`)}catch(e){throw await c(),e}}async function _(e,t){await Promise.all(e.map(async e=>{if(e.bundleId&&e.appName)return;let n=await m(e.installPath,t);e.bundleId=e.bundleId??n.bundleId,e.appName=e.appName??n.appName}))}function v(t,n){let r=n.toLowerCase(),i=t.filter(e=>e.bundleName.toLowerCase()===r);if(i.length===1)return i[0];if(i.length>1)throw new e(`INVALID_ARGS`,`Invalid IPA: multiple app bundles matched "${n}" by name. Use a bundle id hint instead.`);if(n.includes(`.`)){let e=t.filter(e=>e.bundleId?.toLowerCase()===r);if(e.length===1)return e[0]}}function y(e){let t=e.bundleId??e.appName;return t?`${e.bundleName}.app (${t})`:`${e.bundleName}.app`}export{f as prepareIosInstallArtifact,m as readIosBundleInfo};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as e,M as t,P as n,X as r}from"./screenshot-result.js";import{i}from"./session-target-evidence.js";import{A as a}from"./sdk-android-adb.js";import{a as o}from"./input-actions.js";import{Ut as s,Wt as c,bt as l,xt as u}from"./internal/daemon.js";async function d(e){let{session:t,flags:n,sessionStore:r,contextFromFlags:i,captureSnapshotForSession:a}=e,s=t.screenRecording?.handle;if(!s)return;let c=s.inspect().touchReferenceFrame;if(c)return c;if(t.device.platform===`android`){let e=await o(t.device),n={referenceWidth:e.width,referenceHeight:e.height};return s.setTouchReferenceFrame(n),n}let l=u(t.snapshot);if(l)return s.setTouchReferenceFrame(l),l;let d=u(await a(t,n,r,i,{interactiveOnly:!0}));return d&&s.setTouchReferenceFrame(d),d}async function f(e){try{return await d(e)}catch(t){a({level:`warn`,phase:`touch_reference_frame_resolve_failed`,data:{platform:e.session.device.platform,error:t instanceof Error?t.message:String(t)}});return}}function p(e){return u({nodes:e,createdAt:0})}function m(e){let{session:t,sessionStore:n,command:a,positionals:o,actionCommand:u=a,retryPositionals:d,flags:f,result:p,responseData:m,recordedTarget:_,recordedTargets:v,scheduleInteractionOutcomeRetry:y=!0,actionStartedAt:b,actionFinishedAt:x,androidFreshnessBaseline:S}=e,C=c(f),[w,T]=g({command:a,positionals:o,flags:C,result:p,responseData:m}),E=r(t)&&_?i(_):void 0,D=r(t)&&v?h(v):void 0;return n.recordAction(t,{command:a,positionals:o,flags:C??{},result:w,...E?{targetEvidence:E}:{},...D?{targetEvidences:D}:{}}),s({session:t,command:a,action:u,positionals:d??o,flags:f,scheduleOutcomeRetry:y,androidFreshnessBaseline:S}),l(t,u,o,w,C??{},b,x),{ok:!0,data:T}}function h(e){let t=i(e.source),n=i(e.destination);return t&&n?{source:t,destination:n}:void 0}function g(r){if(r.command!==`fill`||typeof r.flags?.recordAs!=`string`)return[r.result,r.responseData];let i=e({ts:0,command:`fill`,positionals:r.positionals,flags:r.flags,result:r.result}),a=n(r.flags.recordAs);return[t(r.result,i,a),t(r.responseData,i,a)]}export{p as n,f as r,m as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{_ as t}from"./sdk-device.js";import{o as n}from"./screenshot-geometry.js";import{t as r}from"./runtime.js";import{i}from"./cancel.js";import{i as a,n as o,r as s,t as c}from"./dispatch.js";import{n as l}from"./provider.js";import{At as u,Et as d,Pt as f}from"./internal/daemon.js";import{a as p,b as m,f as h,m as g,u as _}from"./selector-runtime.js";import{a as v}from"./snapshot-session.js";async function y(e){let{session:t,node:r,rootViewport:i,requestOptions:a}=e,o=_(r);if(!o)return null;let s;try{s=await p(t,o,a)}catch{return null}if(!s.found||!s.node?.rect)return null;let c={rect:s.node.rect,hittable:s.node.hittable===!0};return n(c,i)?c.rect:null}function b(t){let n=t.sessionStore.get(t.sessionName);if(!n)throw new e(`SESSION_NOT_FOUND`,a);return r({backend:x({...t,session:n}),...v(`interaction commands`,{plural:!0}),sessions:d({sessionName:t.sessionName,getSession:()=>n,recordOptions:{includeSnapshot:!0,omitRefFrameSnapshot:t.req.internal?.findResolvedTarget!==void 0},setRecord:e=>{e.snapshot&&(u(n,e.snapshot),t.sessionStore.set(t.sessionName,n))}}),signal:i(t.req.meta?.requestId)})}function x(e){let{req:n,session:r}=e,i=S(r);return{platform:t(r.device),captureSnapshot:async(t,i)=>({snapshot:await e.captureSnapshotForSession(r,n.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:i?.interactiveOnly===!0,preferredBackend:i?.preferredBackend,includeRects:i?.includeRects===!0,signal:t.signal})}),resolveGestureViewport:async()=>e.pairedGestureViewport??await s(r.device,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)),confirmOffscreenTargetVisible:h(r,{skipPendingPostGestureStabilization:!1})?async(t,i,a)=>await y({session:r,node:i,rootViewport:a,requestOptions:g({req:n,logPath:e.logPath,traceLogPath:r.trace?.outPath})}):void 0,tap:async(t,i)=>(f(r),C(await c(r.device,`press`,[String(i.x),String(i.y)],n.flags?.out,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)))),tapTarget:i?.clickRef?async(e,t)=>(f(r),await i.clickRef?.(t.ref),{ref:m(t.ref)}):void 0,fill:async(t,i,a,o)=>(f(r),C(await c(r.device,`fill`,[String(i.x),String(i.y),a],n.flags?.out,{...e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath),allowNonHittableCoordinateFallback:o?.allowNonHittableCoordinateFallback}))),fillTarget:i?.fillRef?async(e,t,n,a)=>(f(r),await i.fillRef?.(t.ref,n,a),{ref:m(t.ref),text:n,delayMs:a?.delayMs??0}):void 0,longPress:async(t,i,a)=>(f(r),C(await c(r.device,`longpress`,[String(i.x),String(i.y),...a?.durationMs===void 0?[]:[String(a.durationMs)]],n.flags?.out,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)))),performGesture:async(t,i)=>(f(r),C(await o(r.device,i,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)))),typeText:async(t,i)=>(f(r),C(await c(r.device,`type`,[i],n.flags?.out,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath))))}}function S(e){if(e.device.platform!==`web`)return;let t=l();return t.clickRef||t.fillRef?t:void 0}function C(e){return e&&typeof e==`object`?e:void 0}export{b as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./verdict.js";import{At as t,Rt as n}from"./internal/daemon.js";import{t as r}from"./backend-snapshot-options.js";async function i(i,a,o,s,c){let l={...a??{},...r(c)},u=s(l,i.appBundleId,i.trace?.outPath),{snapshot:d}=await n({device:i.device,session:i,flags:l,outPath:l.out,logPath:u.logPath??``,includeRects:c.includeRects,androidFreshnessMode:c.androidFreshnessMode,signal:c.signal});return e(d.snapshotQuality)||(t(i,d),o.set(i.name,i)),d}export{i as t};
|
package/dist/src/manifest.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e,m as t}from"./sdk-android-adb.js";import{t as n}from"./sdk.js";import r from"node:path";import{TextDecoder as i}from"node:util";import a from"node:fs/promises";const o=new i(`utf-16le`);let s;async function c(e,t){for(let n of[`AndroidManifest.xml`,`base/manifest/AndroidManifest.xml`]){let r=await l(e,n,t);if(!r)continue;let i=u(r);if(i)return i}return await y(e,t)}async function l(t,n,r){try{let i=await e(`unzip`,[`-p`,t,n],{allowFailure:!0,binaryStdout:!0,signal:r});return i.exitCode!==0||!i.stdoutBuffer||i.stdoutBuffer.length===0?void 0:i.stdoutBuffer}catch{r?.throwIfAborted();return}}function u(e){return e.subarray(0,Math.min(e.length,128)).toString(`utf8`).trimStart().startsWith(`<`)?d(e.toString(`utf8`)):f(e)}function d(e){return e.match(/<manifest\b[^>]*\bpackage\s*=\s*["']([^"']+)["']/i)?.[1]}function f(e){if(e.length<8||e.readUInt16LE(0)!==3)return;let t;for(let n=e.readUInt16LE(2);n+8<=e.length;){let r=e.readUInt16LE(n),i=e.readUInt16LE(n+2),a=e.readUInt32LE(n+4);if(a<=0||n+a>e.length)return;if(r===1)t=m(e.subarray(n,n+a));else if(r===258&&t){let r=p(e,n,i,t);if(r)return r}n+=a}}function p(e,t,n,r){if(n<36||t+n>e.length||r[e.readUInt32LE(t+20)]!==`manifest`)return;let i=e.readUInt16LE(t+24),a=e.readUInt16LE(t+26),o=e.readUInt16LE(t+28),s=t+i;for(let t=0;t<o;t+=1){let n=s+t*a;if(n+20>e.length)return;if(r[e.readUInt32LE(n+4)]!==`package`)continue;let i=e.readUInt32LE(n+8);if(i!==4294967295)return r[i];let o=e.readUInt8(n+15),c=e.readUInt32LE(n+16);return o===3?r[c]:void 0}}function m(e){if(e.length<28)return[];let t=e.readUInt32LE(8),n=e.readUInt32LE(16),r=e.readUInt32LE(20),i=(n&256)!=0,a=[];for(let n=0;n<t;n+=1){let t=28+n*4;if(t+4>e.length)return a;let o=r+e.readUInt32LE(t);a.push(i?h(e,o):g(e,o))}return a}function h(e,t){let[,n]=_(e,t),[r,i]=_(e,t+n),a=t+n+i;return e.subarray(a,a+r).toString(`utf8`)}function g(e,t){let[n,r]=v(e,t),i=t+r;return o.decode(e.subarray(i,i+n*2))}function _(e,t){let n=e.readUInt8(t);if(!(n&128))return[n,1];let r=e.readUInt8(t+1);return[(n&127)<<8|r,2]}function v(e,t){let n=e.readUInt16LE(t);if(!(n&32768))return[n,2];let r=e.readUInt16LE(t+2);return[(n&32767)<<16|r,4]}async function y(t,n){n?.throwIfAborted();let r=await b();if(!r)return;let i=await e(r,[`dump`,`badging`,t],{allowFailure:!0,signal:n});if(i.exitCode===0)return i.stdout.match(/package:\s+name='([^']+)'/)?.[1]}async function b(){if(s!==void 0)return s??void 0;try{for(let e of n()){let n=r.join(e,`build-tools`);try{let e=(await a.readdir(n)).sort((e,t)=>t.localeCompare(e,void 0,{numeric:!0}));for(let i of e){let e=r.join(n,i,`aapt`);if(r.isAbsolute(e)&&await t(e))return s=e,e}}catch{}}}catch{}s=null}export{c as t};
|
package/dist/src/method-scope.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
function e(e,t){return new Proxy(e,{get(e,n,r){let i=Reflect.get(e,n,r);return typeof i==`function`?(...n)=>t(async()=>await i.apply(e,n)):i}})}export{e as t};
|
package/dist/src/png-resize.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as e,_ as t}from"./sdk-contracts.js";import{b as n}from"./location-coordinates.js";import{A as r}from"./sdk-android-adb.js";import{a as i,i as a,n as o,r as s,t as c}from"./png-worker-contract.js";import l from"node:path";import u,{promises as d}from"node:fs";import{fileURLToPath as f}from"node:url";import{Worker as p}from"node:worker_threads";function m(e,t){try{let n=f(e),r=l.extname(n)||`.js`;return[l.join(l.dirname(n),`${t}${r}`),l.join(l.dirname(n),`internal`,`${t}${r}`)].find(e=>u.existsSync(e))??null}catch{return null}}var h=class extends Error{};let g=null,_=!1,v=!1,y=0;const b=new Map;function x(e){_=!0,!v&&(v=!0,r({level:`warn`,phase:`png_worker_unavailable`,data:{reason:e}}),process.emitWarning(`PNG worker unavailable, falling back to in-process PNG processing: ${e}`))}function S(n){let r=b.get(n.id);r&&(b.delete(n.id),T(),n.ok?r.resolve(n.result):r.reject(new t(e(n.error.code),n.error.message,n.error.details)))}function C(e,t){g===e&&(x(t.message),g=null,e.terminate().catch(()=>{}),w(new h(`PNG worker failed: ${t.message}`)))}function w(e){let t=[...b.values()];b.clear();for(let n of t)n.reject(e)}function T(){g&&(b.size>0?g.ref():g.unref())}function E(){if(_)return null;if(g)return g;let e=m(import.meta.url,`png-worker`);if(!e)return x(`worker entry module not found next to the current module`),null;try{let t=new p(e,{execArgv:e.endsWith(`.ts`)?[`--experimental-strip-types`]:[]});return t.on(`message`,S),t.on(`error`,e=>{C(t,e)}),t.on(`exit`,e=>{C(t,Error(`PNG worker exited with code ${e}`))}),t.unref(),g=t,t}catch(e){return x(`failed to spawn worker: ${e instanceof Error?e.message:String(e)}`),null}}function D(e){let t=E();if(!t)return Promise.reject(new h(`PNG worker is unavailable`));y+=1;let n=y;return new Promise((r,i)=>{b.set(n,{resolve:r,reject:i}),T();try{t.postMessage({...e,id:n})}catch(e){b.delete(n),T(),i(new h(`failed to post job to PNG worker: ${e instanceof Error?e.message:String(e)}`))}})}async function O(e,t){try{return await D(e)}catch(e){if(e instanceof h)return t();throw e}}function k(){E()}async function A(){let e=g;g=null,w(new h(`PNG worker terminated`)),e&&await e.terminate()}async function j(e,t){let n=await O({kind:`decode`,png:e,label:t},()=>{let n=a(e,t);return{kind:`decode`,width:n.width,height:n.height,data:n.data}}),r=new i.PNG({width:n.width,height:n.height});return r.data=c(n.data),r}async function M(e){return c((await O({kind:`encode`,width:e.width,height:e.height,data:e.data},()=>({kind:`encode`,png:i.PNG.sync.write(e)}))).png)}async function N(e,t,n){let{kind:r,...i}=await O({kind:`rgb-difference`,firstPng:e,secondPng:t,label:n},()=>({kind:`rgb-difference`,...o(a(e,n),a(t,n))}));return i}async function P(e){let{kind:t,...n}=await O({kind:`diff-pixels`,...e},()=>({kind:`diff-pixels`,...s(e)}));return{...n,diffData:c(n.diffData)}}async function F(e,r){let{min:i,max:a}=n;if(!Number.isFinite(r)||r<i||r>a)throw new t(`INVALID_ARGS`,`Screenshot scale must be between ${i} and ${a}`);if(r===1)return;let o=await j(await d.readFile(e),`screenshot`),s=Math.max(1,Math.round(o.width*r)),c=Math.max(1,Math.round(o.height*r));await d.writeFile(e,await M(L(o,s,c)))}async function I(e,n,r){if(!Number.isInteger(n)||n<1||!Number.isInteger(r)||r<1)throw new t(`INVALID_ARGS`,`Screenshot resize dimensions must be positive integers`);let i=await j(await d.readFile(e),`screenshot`);i.width===n&&i.height===r||await d.writeFile(e,await M(L(i,n,r)))}function L(e,t,n){let r=new i.PNG({width:t,height:n});for(let i=0;i<n;i+=1){let a=i*e.height/n,o=(i+1)*e.height/n;for(let n=0;n<t;n+=1){let s=n*e.width/t,c=(n+1)*e.width/t,l=0,u=0,d=0,f=0,p=0;for(let t=Math.floor(a);t<Math.ceil(o);t+=1){let n=Math.min(t+1,o)-Math.max(t,a);for(let r=Math.floor(s);r<Math.ceil(c);r+=1){let i=n*(Math.min(r+1,c)-Math.max(r,s)),a=(t*e.width+r)*4;l+=(e.data[a]??0)*i,u+=(e.data[a+1]??0)*i,d+=(e.data[a+2]??0)*i,f+=(e.data[a+3]??0)*i,p+=i}}let m=(i*r.width+n)*4;r.data[m]=Math.round(l/p),r.data[m+1]=Math.round(u/p),r.data[m+2]=Math.round(d/p),r.data[m+3]=Math.round(f/p)}}return r}export{j as a,A as c,P as i,F as n,M as o,N as r,k as s,I as t};
|
package/dist/src/process-lock.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{t}from"./timeouts.js";import{t as n}from"./owner-identity.js";import r from"node:path";import i from"node:fs";async function a(n){let{lockDirPath:a,owner:c}=n,u=r.join(a,`owner.json`),d=Date.now()+(n.timeoutMs??3e4),f=n.pollMs??100,p=n.ownerGraceMs??5e3,m=n.description??`process lock`;for(i.mkdirSync(r.dirname(a),{recursive:!0});Date.now()<d;)try{i.mkdirSync(a),o(u,c);let e=!1;return async()=>{e||(e=!0,i.rmSync(a,{recursive:!0,force:!0}))}}catch(e){let n=e;if(n.code!==`EEXIST`)throw n;if(s(a,u,p))continue;await t(f)}throw new e(`COMMAND_FAILED`,`Timed out waiting for ${m}`,{lockDirPath:a,...l(a,u)})}function o(e,t){let n=`${e}.${process.pid}.${Date.now()}.tmp`;i.writeFileSync(n,JSON.stringify(t),`utf8`),i.renameSync(n,e)}function s(e,t,n){let r=null;try{r=i.statSync(e)}catch{return!0}let a=c(t);return a?u(a)?!1:(i.rmSync(e,{recursive:!0,force:!0}),!0):Date.now()-r.mtimeMs<n?!1:(i.rmSync(e,{recursive:!0,force:!0}),!0)}function c(e){try{return JSON.parse(i.readFileSync(e,`utf8`))}catch{return null}}function l(e,t){let r=Date.now(),a=c(t),o;try{o=Math.max(0,Math.round(r-i.statSync(e).mtimeMs))}catch{}return{...o===void 0?{}:{lockAgeMs:o},...a?{ownerPid:a.pid,ownerStartTime:a.startTime,ownerAgeMs:Math.max(0,Math.round(r-a.acquiredAtMs)),ownerLiveness:n({owner:a})}:{}}}function u(e){let t=n({owner:e});return t!==`owner-process-dead`&&t!==`owner-process-reused`}export{a as t};
|
package/dist/src/runner-lease.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{A as n}from"./sdk-android-adb.js";import{c as r,n as i,s as a}from"./host-process.js";import{t as o}from"./owner-identity.js";import{t as s}from"./process-lock.js";import c from"node:path";import l from"node:crypto";import u from"node:fs";import d from"node:os";var f=e({RUNNER_OWNER_START_TIME:()=>m,RUNNER_OWNER_TOKEN:()=>h,buildDetachedRunnerLease:()=>N,buildRunnerLease:()=>_,cleanupOwnedRunnerLease:()=>P,cleanupRunnerLeasesForOwner:()=>F,prepareRunnerLeaseForStartup:()=>S,readStaleRunnerLease:()=>M,releaseRunnerLease:()=>I,setRunnerLeaseOwnerStateDir:()=>v,verifyLeaseRunnerPidIdentity:()=>Z,withRunnerLeaseLock:()=>y,writeRunnerLease:()=>L});const p=process.pid,m=r(process.pid),h=$(p,m);let g;function _(e){return{schemaVersion:1,deviceId:e.deviceId,ownerToken:h,ownerPid:p,ownerStartTime:m,ownerStateDir:E(),sessionId:e.sessionId,runnerPid:e.runnerPid??null,runnerStartTime:e.runnerPid?r(e.runnerPid):null,port:e.port,xctestrunPath:e.xctestrunPath,jsonPath:e.jsonPath,createdAtMs:Date.now()}}function v(e){g=e?.trim()||void 0}async function y(e,t){let n=await s({lockDirPath:`${z(e)}.lock`,owner:{pid:p,startTime:m,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await n()}}function b(e){try{return U(JSON.parse(u.readFileSync(z(e),`utf8`)),e)}catch{return null}}function x(e){if(!e)return{type:`empty`};if(e.ownerToken===h)return{type:`owned`,lease:e};let t=o({owner:{pid:e.ownerPid,startTime:e.ownerStartTime},...e.ownerStateDir?{stateDir:e.ownerStateDir}:{}});return t!==`live`&&t!==`unknown`?{type:`stale`,lease:e,staleReason:t}:{type:`busy`,lease:e}}async function S(e,n,r){let i=x(b(e));if(i.type===`empty`){await n.cleanupRunnerXcodebuildProcesses(e,void 0);return}if(i.type===`busy`){if(C(i.lease)){await Y(i.lease,`same-state-dir`,n);return}if(w(i.lease,r)){await Y(i.lease,`logical-lease-takeover`,n);return}throw new t(`COMMAND_FAILED`,r?`iOS runner for ${e} is busy after device lease admission`:`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,logicalLeaseContext:r,ownerPid:i.lease.ownerPid,ownerStartTime:i.lease.ownerStartTime,ownerStateDir:i.lease.ownerStateDir,ownerToken:i.lease.ownerToken,sessionId:i.lease.sessionId,hint:D(i.lease,r)})}await Y(i.lease,i.type,n)}function C(e){let t=E();return!t||!e.ownerStateDir?!1:c.resolve(t)===c.resolve(e.ownerStateDir)}function w(e,t){return!t||t.leaseProvider!==`proxy`||!t.leaseId||!t.clientId?!1:T(t.deviceKey,e.deviceId)}function T(e,t){if(!e)return!1;if(e===t)return!0;let[,,n]=e.split(`:`,3);return n===t}function E(){return g||process.env.AGENT_DEVICE_STATE_DIR?.trim()||void 0}function D(e,t){let n=O(e),r=k(e);return t?[r,n,`The device is busy because another active device lease owns it, or the runner is owned by another daemon/process after lease admission.`,`Retry after the owning session closes or after the five-minute inactivity lease expires.`].join(` `):[r,n,`If the runner is still active, wait for it to finish. Do not run prepare ios-runner from another daemon/client to recover this.`].join(` `)}function O(e){let t=`Runner owner: PID ${e.ownerPid}`;return e.ownerStateDir?`${t} with AGENT_DEVICE_STATE_DIR=${e.ownerStateDir}`:`${t}.`}function k(e){return e.ownerStateDir?`If it is stuck, stop the owning agent-device daemon for ${A(`AGENT_DEVICE_STATE_DIR`,e.ownerStateDir)} and retry.`:`If it is stuck, stop the owning agent-device daemon and retry.`}function A(e,t){return`${e}=${j(t)}`}function j(e){return`'${e.replaceAll(`'`,`'\\''`)}'`}function M(e){let t=x(b(e));return t.type===`stale`&&(t.staleReason===`owner-process-dead`||t.staleReason===`owner-process-reused`)?t.lease:null}function N(e){return{...e,ownerToken:`detached-${e.ownerToken}`}}async function P(e,t){let n=x(b(e));n.type===`owned`&&await Y(n.lease,`owned`,t)}async function F(e,t){if(!Number.isInteger(e.pid)||e.pid<=0)return;let n=V(e);await Promise.all(n.map(async e=>{await Y(e,`owned`,t)}))}function I(e){e&&R({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function L(e){let t=z(e.deviceId);u.mkdirSync(c.dirname(t),{recursive:!0});let n=`${t}.${process.pid}.${Date.now()}.tmp`;u.writeFileSync(n,JSON.stringify(e,null,2),`utf8`),u.renameSync(n,t)}function R(e){let t=b(e.deviceId);if(t&&!(e.ownerToken&&t.ownerToken!==e.ownerToken)&&!(e.sessionId&&t.sessionId!==e.sessionId))try{u.unlinkSync(z(e.deviceId))}catch{}}function z(e){return c.join(B(),`${ee(e)}.json`)}function B(){let e=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim();return e?c.resolve(e):c.join(d.homedir(),`.agent-device`,`apple-runner`,`leases`)}function V(e){let t,n=B();try{t=u.readdirSync(n,{withFileTypes:!0})}catch{return[]}let r=[];for(let i of t){if(!i.isFile()||!i.name.endsWith(`.json`))continue;let t=H(c.join(n,i.name));t&&t.ownerPid===e.pid&&(e.startTime!==void 0&&t.ownerStartTime!==e.startTime||r.push(t))}return r}function H(e){try{let t=JSON.parse(u.readFileSync(e,`utf8`)),n=G(t.deviceId);return n?U(t,n):null}catch{return null}}function U(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return null;let n=e;if(n.schemaVersion!==1||n.deviceId!==t)return null;let r=W(n);return r?{schemaVersion:1,deviceId:t,...r,ownerStartTime:K(n.ownerStartTime),ownerStateDir:K(n.ownerStateDir)??void 0,runnerPid:q(n.runnerPid),runnerStartTime:K(n.runnerStartTime)}:null}function W(e){let t={ownerToken:G(e.ownerToken),ownerPid:q(e.ownerPid),sessionId:G(e.sessionId),port:q(e.port),xctestrunPath:G(e.xctestrunPath),jsonPath:G(e.jsonPath),createdAtMs:J(e.createdAtMs)};return Object.values(t).some(e=>e===null)?null:t}function G(e){return typeof e==`string`&&e.length>0?e:null}function K(e){return typeof e==`string`?e:null}function q(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:null}function J(e){return typeof e==`number`&&Number.isFinite(e)?e:null}async function Y(e,t,r){n({level:t===`stale`||t===`same-state-dir`||t===`logical-lease-takeover`?`warn`:`debug`,phase:`ios_runner_lease_cleanup`,data:{deviceId:e.deviceId,ownerPid:e.ownerPid,ownerStateDir:e.ownerStateDir,ownerToken:e.ownerToken,runnerPid:e.runnerPid,sessionId:e.sessionId,reason:t}}),await r.cleanupRunnerProcessTree(X(e),`SIGTERM`),await r.cleanupRunnerXcodebuildProcesses(e.deviceId,e.ownerToken),await r.cleanupRunnerProcessTree(X(e),`SIGKILL`),r.cleanupTempFile(e.xctestrunPath),r.cleanupTempFile(e.jsonPath),I(e)}function X(e){let t=e.runnerPid??void 0;if(!(!t||!i(t))){if(Z(e,t))return t;n({level:`warn`,phase:`ios_runner_lease_recycled_pid_skipped`,data:{deviceId:e.deviceId,runnerPid:t,runnerStartTime:e.runnerStartTime??null,sessionId:e.sessionId}})}}function Z(e,t){return e.runnerStartTime?r(t)===e.runnerStartTime:Q(a(t))}function Q(e){return!!e&&e.includes(`xcodebuild`)&&e.includes(`AgentDeviceRunner`)}function $(e,t){let n=l.createHash(`sha256`);return n.update(String(e)),n.update(`\0`),n.update(t??`unknown-start`),`owner-${e}-${n.digest(`hex`).slice(0,8)}`}function ee(e){return e.replaceAll(/[^A-Za-z0-9._-]/g,`-`)||`unknown-device`}export{S as a,f as c,y as d,L as f,P as i,v as l,N as n,M as o,_ as r,I as s,h as t,Z as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime.js";import{E as t,_ as n}from"./sdk-contracts.js";var r=e({MAX_RUNNER_SEQUENCE_STEPS:()=>20,SEQUENCEABLE_RUNNER_STEP_KINDS:()=>i,buildRunnerSequenceCommand:()=>u,parseRunnerSequenceResult:()=>d,validateRunnerSequenceSteps:()=>s});const i=[`tap`,`doubleTap`,`longPress`];function a(e){return typeof e==`string`&&i.includes(e)}function o(e,t,r){return new n(`INVALID_ARGS`,r,{stepIndex:e,kind:typeof t==`string`?t:void 0})}function s(e){if(!Array.isArray(e)||e.length===0)throw new n(`INVALID_ARGS`,`sequence requires at least one step`,{stepCount:Array.isArray(e)?e.length:0});if(e.length>20)throw new n(`INVALID_ARGS`,`sequence accepts at most 20 steps, received ${e.length}`,{stepCount:e.length,maxSteps:20});e.forEach((e,t)=>c(e,t))}function c(e,t){if(!a(e.kind))throw o(t,e.kind,`sequence step ${t} has unsupported kind "${String(e.kind)}"; allowed: ${i.join(`, `)}`);if(!Number.isFinite(e.x)||!Number.isFinite(e.y))throw o(t,e.kind,`sequence step ${t} (${e.kind}) requires finite x and y`);e.durationMs!==void 0&&l(e.durationMs,0,1e4,t,e.kind,`durationMs`),e.pauseMs!==void 0&&l(e.pauseMs,0,1e4,t,e.kind,`pauseMs`)}function l(e,t,n,r,i,a){if(!Number.isFinite(e)||e<t||e>n)throw o(r,i,`sequence step ${r} (${i}) ${a} must be between ${t} and ${n}`)}function u(e,t){return s(e),{command:`sequence`,steps:e,appBundleId:t}}function d(e){let t=p(e.sequenceResults),n=typeof e.completedSteps==`number`&&Number.isFinite(e.completedSteps)?e.completedSteps:t.filter(e=>e.ok).length,r=typeof e.failedStepIndex==`number`&&Number.isFinite(e.failedStepIndex)?e.failedStepIndex:t.findIndex(e=>!e.ok)>=0?t.findIndex(e=>!e.ok):void 0;if(r!==void 0)throw f(t,n,r);return{results:t,completedSteps:n,failedStepIndex:r}}function f(e,r,i){let a=e[i],o=a?.kind??`step`,s=a?.errorMessage??`sequence step ${i} (${o}) failed`;return new n(t(a?.errorCode),s,{failedStepIndex:i,failedStepKind:o,completedSteps:r,sequenceResults:e,hint:`Run snapshot -i to inspect the current UI, then continue from the observed state.`})}function p(e){return Array.isArray(e)?e.map(e=>{let t=e??{};return{ok:t.ok===!0,kind:typeof t.kind==`string`?t.kind:`unknown`,errorCode:typeof t.errorCode==`string`?t.errorCode:void 0,errorMessage:typeof t.errorMessage==`string`?t.errorMessage:void 0,gestureStartUptimeMs:typeof t.gestureStartUptimeMs==`number`?t.gestureStartUptimeMs:void 0,gestureEndUptimeMs:typeof t.gestureEndUptimeMs==`number`?t.gestureEndUptimeMs:void 0}}):[]}export{d as n,r,u as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Cr as e,ar as t,dr as n,fr as r,gr as i,ir as a,sr as o,ur as s}from"./sdk-batch-runner.js";function c(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function l(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=u(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function u(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function d(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=p(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>y(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:b(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&C(e)),e,t)}}function f(e){if(e.length===0)return new Map;let{hintedContainers:t}=p(e);return v(t.directionsByContainer)}function p(e){let n=i(e),r=new Set,a=[];for(let i of e){if(t(i,e,n)){T(i,r,n);continue}a.push(i)}return{byIndex:n,visibleNodeIndexes:r,offscreenNodes:a,hintedContainers:_(e,a,r,n)}}function m(e,t){return e.hittable&&o(e.rect,t)}function h(t,r,a=i(r)){if(!t.rect)return null;let c=s(t,r,a);if(c&&!e(t.rect,c)){let e=g(t.rect,c);if(e)return e}let l=n(r,t.rect);if(l&&!o(t.rect,l)){let e=g(t.rect,l);if(e)return e}return null}function g(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function _(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=E(e,n,r);if(!t?.rect)continue;let s=S(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return D(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function v(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function y(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function b(e,t,n){let r=new Map;for(let i of e){let e=x(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=w(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function x(e,t,n){if(!e.rect)return null;let r=s(e,t,n);return r?S(e.rect,r):null}function S(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function C(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!r(e)}function w(e){let t=new Set,n=[];for(let i of e){let e=r(i);!e||t.has(e)||(t.add(e),n.push(e))}return n}function T(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function E(e,t,n){return a(e,n,e=>t.has(e.index))}function D(e,t,n,r,i){for(let a of e){let e=O(a);if(!e||e.size===0)continue;let o=E(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function O(e){let t=l(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function k(e){return e}function A(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}export{f as a,c,h as i,k as n,m as o,d as r,l as s,A as t};
|