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
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime.js";import{C as t,E as n,T as r,_ as i,a}from"./sdk-contracts.js";import{h as o,u as s}from"./location-coordinates.js";import{Br as c,Fr as l,Ir as u,Lr as d,Mr as f,Nr as p,Or as m,Pr as h,Rr as g,kr as _,x as ee}from"./sdk-batch-runner.js";import{f as te,o as ne,p as re,s as ie}from"./sdk-device.js";import{At as v,Kt as ae,Qt as oe,en as se,i as ce,kt as le,qt as ue}from"./prepare-kind.js";import{S as de,_ as y,a as fe,ct as b,d as x,dt as pe,f as me,ft as S,i as he,l as ge,m as _e,mt as ve,n as ye,nt as be,u as xe,ut as Se,v as Ce,y as we}from"./screenshot-result.js";import{n as C,t as w}from"./command-catalog.js";import{b as Te,c as Ee,i as De,p as Oe,y as ke}from"./registry.js";import{t as Ae}from"./command-metadata.js";import{A as T,F as je,S as Me,_ as Ne,b as Pe,k as Fe}from"./sdk-android-adb.js";import{r as Ie,t as Le}from"./output-path.js";import{n as E,t as Re}from"./version.js";import{n as ze,t as Be}from"./shell-quote.js";import{t as D}from"./timeouts.js";import{n as Ve,t as He}from"./client-metro.js";import O from"node:path";import{createHash as Ue,randomUUID as We}from"node:crypto";import k from"node:fs";import Ge from"node:os";import{pipeline as A}from"node:stream/promises";import{Transform as Ke,Writable as qe}from"node:stream";import j from"node:net";function Je(e,t){let n=h(e,`bundleId`),r=h(e,`package`);return{app:g(e,`app`),appPath:g(e,`appPath`),platform:d(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:le({session:t,bundleId:n,packageName:r})}}function Ye(e,t){let n=h(e,`bundleId`),r=h(e,`packageName`),a=n??r??h(e,`appId`),o=h(e,`launchTarget`)??r??n??a;if(!o)throw new i(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:e});return{appName:h(e,`appName`),appId:a,bundleId:n,packageName:r,launchTarget:o,installablePath:h(e,`installablePath`),archivePath:h(e,`archivePath`),materializationId:h(e,`materializationId`),materializationExpiresAt:h(e,`materializationExpiresAt`),identifiers:le({session:t,bundleId:n,packageName:r,appId:a})}}function Xe(e){return{released:e.released===!0,materializationId:g(e,`materializationId`),identifiers:{}}}function Ze(e){let{record:t,platform:n,id:r,name:i,target:a}=et(e,`name`),o=$e(t);return{platform:n,target:a,kind:l(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...ie(n)&&o?{appleOs:o}:{},identifiers:v(n,r,i),...M(n,r)}}function Qe(e){let{record:t,platform:n,id:r,name:i,target:a}=et(e,`name`),o=g(t,`device`),s=$e(t),c={session:i,...v(n,r,o)};return{name:i,createdAt:u(t,`createdAt`),sessionStateDir:h(t,`sessionStateDir`),runnerLogPath:h(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...s?{appleOs:s}:{},identifiers:c,...M(n,r,{simulatorSetPath:p(t,`ios_simulator_device_set`)})},identifiers:c}}function $e(e){let t=e.appleOs;return ne(t)?t:void 0}function et(e,t){let n=m(e);return{record:n,platform:d(n,`platform`),id:g(n,`id`),name:g(n,t),target:f(n,`target`)}}function M(e,t,n={}){if(e===`ios`)return{ios:{udid:t,...n.simulatorSetPath===void 0?{}:{simulatorSetPath:n.simulatorSetPath}}};if(!re(e))return{};let r=n.serial??t;return e===`android`?{android:{serial:r}}:e===`harmonyos`?{harmonyos:{serial:r}}:{vega:{serial:r}}}function tt(e){if(!_(e))return;let t=e.platform,n=h(e,`metroHost`),r=typeof e.metroPort==`number`?e.metroPort:void 0,i=h(e,`bundleUrl`),a=h(e,`launchUrl`);return{platform:t===`ios`||t===`android`?t:void 0,metroHost:n,metroPort:r,bundleUrl:i,launchUrl:a}}function nt(e){let t=e.platform,n=h(e,`id`),r=h(e,`device`);if(!te(t)||!n||!r)return;let i=f(e,`target`),a=re(t)?h(e,`serial`)??n:void 0;return{platform:t,target:i,id:n,name:r,identifiers:{...v(t,n,r),...a?{serial:a}:{}},...M(t,t===`ios`?h(e,`device_udid`)??n:n,{simulatorSetPath:p(e,`ios_simulator_device_set`),serial:a})}}function rt(e){if(_(e)&&!(typeof e.durationMs!=`number`||typeof e.measuredAt!=`string`||typeof e.method!=`string`))return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:h(e,`appTarget`),appBundleId:h(e,`appBundleId`)}}function it(e){if(!_(e)||typeof e.success!=`boolean`||typeof e.exitCode!=`number`||typeof e.stdout!=`string`||typeof e.stderr!=`string`)return;let t=ot(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}const at=[`hint`,`diagnosticId`,`logPath`,`supportedOn`];function ot(e){if(!_(e)||typeof e.code!=`string`||typeof e.message!=`string`)return;let t={code:e.code,message:e.message};for(let n of at){let r=e[n];typeof r==`string`&&(t[n]=r)}return _(e.details)&&(t.details=e.details),typeof e.retriable==`boolean`&&(t.retriable=e.retriable),t}function st(e){let t=ot(e.initialSnapshotError);return{...e.snapshot&&typeof e.snapshot==`object`?{snapshot:e.snapshot}:{},...t?{initialSnapshotError:t}:{}}}function ct(e){return Array.isArray(e)?e:[]}function lt(e){let t=ae(e);return c({requestId:e.requestId,cwd:e.cwd,sessionExplicit:e.session!==void 0,debug:e.debug,includeCost:e.cost,responseLevel:e.responseLevel,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform,...se(t),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function ut(e){return e??`default`}const dt={...De(),batch:Oe(ft)};function ft(e,t,n){let r=dt[e];if(!r)throw Error(`Missing daemon writer for batch command: ${e}`);let a=Ae(e);if(!a)throw Error(`Missing command metadata for batch command: ${e}`);try{return mt(r,a,a.readInput(t))}catch(t){throw new i(`INVALID_ARGS`,`Batch step ${n} ${e} input is invalid: ${t instanceof Error?t.message:String(t)}`,void 0,t)}}function pt(e,t){let n=dt[e];if(!n)throw Error(`Missing daemon writer for command: ${e}`);return mt(n,Ae(e),t)}function mt(e,t,n){let r=e(n);return{...r,...t?{metadataFlags:Te(t,r.options)}:{}}}async function ht(e,t){let n=k.statSync(e),r=O.basename(e),i=n.isDirectory(),a=vt(t)??_t(e,n),o=[];try{let t=i?await gt(e,o):e,n=k.statSync(t);return{payloadPath:t,fileName:r,artifactType:i?`app-bundle`:`file`,platform:a,contentType:i?`application/gzip`:`application/octet-stream`,sha256:await bt(t),sizeBytes:n.size,cleanup:()=>yt(o)}}catch(e){throw yt(o),e}}async function gt(e,t){let n=k.mkdtempSync(O.join(Ge.tmpdir(),`agent-device-upload-${We()}-`));t.push(n);let r=O.join(n,`${O.basename(e)}.tar.gz`);return await Ne(`tar`,[`czf`,r,`-C`,O.dirname(e),O.basename(e)],{env:{...process.env,COPYFILE_DISABLE:`1`}}),r}function _t(e,t){let n=e.toLowerCase();if(t.isDirectory()&&n.endsWith(`.app`)||n.endsWith(`.ipa`))return`ios`;if(n.endsWith(`.apk`)||n.endsWith(`.aab`))return`android`}function vt(e){return e===`ios`||e===`android`?e:void 0}function yt(e){for(let t of e)k.rmSync(t,{recursive:!0,force:!0})}async function bt(e){let t=Ue(`sha256`),n=new qe({write(e,n,r){t.update(e),r()}});return await A(k.createReadStream(e),n).catch(e=>{throw new i(`COMMAND_FAILED`,`Failed to read local artifact`,{},e instanceof Error?e:void 0)}),t.digest(`hex`)}function xt(e){let{stage:t,fileName:n,startOffset:r,totalBytes:i,onProgress:a}=e,o=r,s=wt(i),c=Math.min(i,r+s);return new Ke({transform(e,r,l){o=Math.min(i,o+e.byteLength),o>=c&&(a?.({type:`progress`,stage:t,fileName:n,transferredBytes:o,totalBytes:i}),c=Math.min(i,o+s)),l(null,e)}})}function St(){if(!(process.stderr.isTTY!==!0||process.env.CI))return e=>{process.stderr.write(`${Ct(e)}\n`)}}function Ct(e){switch(e.type){case`start`:return`Uploading ${e.fileName} (${N(e.totalBytes)}) via ${Tt(e.stage)} upload`;case`resume`:return`Resuming ${e.fileName} at ${N(e.transferredBytes)} of ${N(e.totalBytes)}`;case`progress`:return`Uploaded ${N(e.transferredBytes)} of ${N(e.totalBytes)} (${Et(e.transferredBytes,e.totalBytes)})`;case`fallback`:return`Direct upload did not complete; retrying ${e.fileName} with ${Tt(e.to)} upload`}}function wt(e){return Math.max(8388608,Math.ceil(e*.05))}function Tt(e){return e===`direct`?`direct`:`legacy`}function Et(e,t){return t<=0?`100%`:`${Math.min(100,Math.floor(e/t*100))}%`}function N(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t.toFixed(1)} KiB`;let n=t/1024;return n<1024?`${n.toFixed(1)} MiB`:`${(n/1024).toFixed(1)} GiB`}const Dt=300*1e3,Ot=`uploadStreamRetryable`;async function kt(e){return await P({...e,url:e.url,redirectCount:0,startOffset:0})}function At(e){return e instanceof i&&e.details?.[Ot]===!0}async function P(e){let t=await S(e.url.protocol),n=k.statSync(e.payloadPath).size,r=Nt(e.headers,e.startOffset,n);return Mt(e.progress,e.startOffset,n),await new Promise((a,o)=>{let s=!1,c=t.request({protocol:e.url.protocol,host:e.url.hostname,port:e.url.port,method:e.method,path:e.url.pathname+e.url.search,headers:r},t=>{s=!0,ve(t).then(r=>{clearTimeout(l);let s=t.statusCode??500,c=t.headers.location;if(c&&Pt(s)){if(e.redirectCount>=5){o(new i(`COMMAND_FAILED`,`Artifact upload exceeded redirect limit`,{maxRedirects:5,url:e.url.toString()}));return}let t=new URL(c,e.url);P({...e,url:t,redirectCount:e.redirectCount+1}).then(a,o);return}let u=Ft(s)?It(t.headers,n):void 0;if(u!==void 0){if(u>=n){a({statusCode:200,statusMessage:`Upload already complete`,body:``});return}if(u<=e.startOffset){o(new i(`COMMAND_FAILED`,`Artifact upload resume did not advance`,{offset:u,previousOffset:e.startOffset,url:e.url.toString()}));return}P({...e,startOffset:u}).then(a,o);return}a({statusCode:s,statusMessage:t.statusMessage,body:r})}).catch(o)}),l=setTimeout(()=>{c.destroy(),o(new i(`COMMAND_FAILED`,e.timeoutMessage,{timeoutMs:Dt,...e.timeoutHint?{hint:e.timeoutHint}:{},...jt(e)}))},Dt);c.on(`error`,t=>{s||(clearTimeout(l),o(new i(`COMMAND_FAILED`,e.errorMessage,{...e.errorHint?{hint:e.errorHint}:{},...jt(e)},t)))}),c.on(`close`,()=>clearTimeout(l)),A(k.createReadStream(e.payloadPath,{start:e.startOffset}),xt({stage:e.progress?.stage??`legacy`,fileName:e.progress?.fileName??O.basename(e.payloadPath),startOffset:e.startOffset,totalBytes:n,onProgress:e.progress?.onProgress}),c).catch(e=>{s||(c.destroy(),o(new i(`COMMAND_FAILED`,`Failed to read local artifact`,{},e instanceof Error?e:Error(String(e)))))})})}function jt(e){return e.retryable===!0?{[Ot]:!0}:{}}function Mt(e,t,n){e?.onProgress?.({type:t>0?`resume`:`start`,stage:e.stage,fileName:e.fileName,transferredBytes:t,totalBytes:n})}function Nt(e,t,n){return t<=0?e:{...e,"content-length":Math.max(n-t,0),"content-range":`bytes ${t}-${n-1}/${n}`}}function Pt(e){return[301,302,303,307,308].includes(e)}function Ft(e){return e===308}function It(e,t){let n=Lt(e[`x-upload-offset`]??e[`upload-offset`]);if(n!==void 0)return Math.min(n,t);let r=Rt(e.range)?.match(/^bytes=0-(\d+)$/);if(!r)return;let i=Number(r[1]);if(!(!Number.isSafeInteger(i)||i<0))return Math.min(i+1,t)}function Lt(e){let t=Rt(e);if(t===void 0)return;let n=Number(t);return Number.isSafeInteger(n)&&n>=0?n:void 0}function Rt(e){return Array.isArray(e)?e[0]:e}const zt=30*1e3;async function Bt(e){let t=await ht(e.localPath,e.platform),n=e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`,r=We();try{let i=await Wt({normalizedBase:n,token:e.token,artifact:t,uploadAttemptId:r});return i?.kind===`cache-hit`?i.uploadId:i?.kind===`direct-upload`?await Vt({normalizedBase:n,token:e.token,artifact:t,preflight:i,uploadAttemptId:r,onProgress:e.onProgress})||(e.onProgress?.({type:`fallback`,from:`direct`,to:`legacy`,fileName:t.fileName}),await Ut({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress})):await Ut({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress})}finally{t.cleanup()}}async function Vt(e){let t=async t=>(await qt(e.artifact,t,e.onProgress),await Jt({normalizedBase:e.normalizedBase,token:e.token,uploadId:t.uploadId}));try{return await t(e.preflight)}catch(n){if(!Ht(n))return;let r=await Wt({normalizedBase:e.normalizedBase,token:e.token,artifact:e.artifact,uploadAttemptId:e.uploadAttemptId});if(r?.kind===`cache-hit`)return r.uploadId;if(r?.kind===`direct-upload`)try{return await t(r)}catch{return}return}}function Ht(e){return e instanceof i?At(e):!0}async function Ut(e){let{normalizedBase:t,token:n,artifact:r}=e,a=new URL(`upload`,t),o={"content-type":r.contentType,"x-artifact-type":r.artifactType,"x-artifact-filename":r.fileName,"x-artifact-hash":r.sha256,"x-artifact-hash-algorithm":`sha256`,"transfer-encoding":`chunked`};Object.assign(o,b(n));let s=await kt({url:a,method:`POST`,headers:o,payloadPath:r.payloadPath,timeoutMessage:`Artifact upload timed out`,timeoutHint:`The upload to the remote daemon exceeded the 5-minute timeout.`,errorMessage:`Failed to upload artifact to remote daemon`,errorHint:`Verify the remote daemon is reachable and supports artifact uploads.`,progress:{stage:`legacy`,fileName:r.fileName,onProgress:e.onProgress}});try{let e=JSON.parse(s.body);if(!e.ok||!e.uploadId)throw new i(`COMMAND_FAILED`,`Upload failed: ${s.body}`);return e.uploadId}catch(e){throw e instanceof i?e:new i(`COMMAND_FAILED`,`Invalid upload response: ${s.body}`)}}async function Wt(e){let t=new URL(`upload/preflight`,e.normalizedBase),n={"content-type":`application/json`};Object.assign(n,b(e.token));let r=await fetch(t,{method:`POST`,headers:n,signal:AbortSignal.timeout(zt),body:JSON.stringify({uploadAttemptId:e.uploadAttemptId,sha256:e.artifact.sha256,fileName:e.artifact.fileName,sizeBytes:e.artifact.sizeBytes,artifactType:e.artifact.artifactType,...e.artifact.platform?{platform:e.artifact.platform}:{},contentType:e.artifact.contentType})}).catch(()=>void 0);if(r?.ok)return Gt(await r.json().catch(()=>void 0))}function Gt(e){if(!e||typeof e!=`object`)return;let t=e;if(t.ok!==!0||typeof t.uploadId!=`string`)return;if(t.cacheHit===!0)return{kind:`cache-hit`,uploadId:t.uploadId};let n=t.upload;if(!n||typeof n.url!=`string`)return;let r=n.headers??{};if(Kt(r))return{kind:`direct-upload`,uploadId:t.uploadId,url:n.url,headers:r}}function Kt(e){return!e||typeof e!=`object`||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}async function qt(e,t,n){let r=await kt({url:new URL(t.url),method:`PUT`,headers:t.headers,payloadPath:e.payloadPath,timeoutMessage:`Direct artifact upload timed out`,timeoutHint:`The direct upload ticket did not accept the artifact within the timeout.`,errorMessage:`Failed to upload artifact with direct upload ticket`,retryable:!0,progress:{stage:`direct`,fileName:e.fileName,onProgress:n}});if(r.statusCode<200||r.statusCode>=300)throw new i(`COMMAND_FAILED`,`Direct artifact upload failed`,{statusCode:r.statusCode,statusMessage:r.statusMessage})}async function Jt(e){let t=new URL(`upload/finalize`,e.normalizedBase),n={"content-type":`application/json`};Object.assign(n,b(e.token));let r=await fetch(t,{method:`POST`,headers:n,signal:AbortSignal.timeout(zt),body:JSON.stringify({uploadId:e.uploadId})}).catch(e=>{throw new i(`COMMAND_FAILED`,`Failed to finalize direct artifact upload`,{},e)});if(!r.ok)throw new i(`COMMAND_FAILED`,`Direct artifact upload finalize failed`,{status:r.status,statusText:r.statusText});let a=await r.json().catch(()=>void 0);if(!a?.ok||!a.uploadId)throw new i(`COMMAND_FAILED`,`Invalid upload finalize response`);return a.uploadId}async function Yt(e,t){let n=[...e.positionals??[]],r=e.flags?{...e.flags}:void 0,i=e.meta?.installSource,a={},o,s=St();if(!fn(t))return en({positionals:n,flags:r,installSource:i,uploadedArtifactId:o,clientArtifactPaths:a});r=Zt(e,n,r,a);let c=await tn(e,t,s);return c&&(i=c.installSource,o=c.uploadedArtifactId??o),e.command!==`install`&&e.command!==`reinstall`||(o=await Xt(e,t,n,s)??o),en({positionals:n,flags:r,installSource:i,uploadedArtifactId:o,clientArtifactPaths:a})}async function Xt(e,t,n,r){let i=n.length===1?0:1,a=n[i];if(a===void 0)return;if(a.startsWith(`remote:`)){n[i]=a.slice(7);return}let o=$t(a,e.meta?.cwd);if(o)return await Bt({localPath:o,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:r})}function Zt(e,t,n,r){let i=nn(e,t);if(!i)return n;i.positionalPath!==void 0&&(t[i.positionalIndex]=i.positionalPath);let a=Qt(n,i.flagPath);return r[i.field]=i.localPath,a}function Qt(e,t){return t===void 0?e:{...e??{},out:t}}function $t(e,t){let n=O.isAbsolute(e)?e:O.resolve(t??process.cwd(),e);return k.existsSync(n)?n:void 0}function en(e){return{positionals:e.positionals,flags:e.flags,installSource:e.installSource,uploadedArtifactId:e.uploadedArtifactId,...Object.keys(e.clientArtifactPaths).length>0?{clientArtifactPaths:e.clientArtifactPaths}:{}}}async function tn(e,t,n){let r=e.meta?.installSource;if(e.command!==`install_source`||!r||r.kind!==`path`)return null;let i=r.path.trim();if(!i)return{installSource:r};if(i.startsWith(`remote:`))return{installSource:{...r,path:i.slice(7)}};let a=O.isAbsolute(i)?i:O.resolve(e.meta?.cwd??process.cwd(),i);if(!k.existsSync(a))return{installSource:{...r,path:a}};let o=await Bt({localPath:a,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:n});return{installSource:{...r,path:a},uploadedArtifactId:o}}function nn(e,t){if(e.command===`screenshot`){let n=sn(e,`path`,`.png`);return t[0]?{field:`path`,localPath:n,positionalIndex:0,positionalPath:I(`screenshot`,`.png`)}:{field:`path`,localPath:n,positionalIndex:0,flagPath:I(`screenshot`,`.png`)}}if(e.command===`record`&&(t[0]??``).toLowerCase()===`start`){if(!an(e)&&e.flags?.platform===void 0)return null;let t=rn(e),n=on(sn(e,`outPath`,t,1),e);return{field:`outPath`,localPath:n,positionalIndex:1,positionalPath:I(`recording`,O.extname(n)||t)}}return null}function rn(e){return Ie(e.flags?.platform)}function an(e){return F(e.positionals?.[1])||F(e.flags?.out)}function on(e,t){return t.flags?.platform===`web`?Le(e,rn(t)):e}function sn(e,t,n,r=0){let i=e.positionals?.[r]??e.flags?.out,a=`${t===`path`?`screenshot`:`recording`}-${Date.now()}${n}`,o=F(i)?i:a;return O.isAbsolute(o)?o:O.resolve(e.meta?.cwd??process.cwd(),o)}function F(e){return typeof e==`string`&&e.trim().length>0}function I(e,t){let n=t.startsWith(`.`)?t:`.${t}`;return O.posix.join(`/tmp`,`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${n}`)}async function cn(e,t,n){let r=Array.isArray(n.data?.artifacts)?n.data.artifacts:[];if(r.length===0||!e.baseUrl)return n;let i=n.data?{...n.data}:{},a=[];for(let n of r){if(!n||typeof n!=`object`||typeof n.artifactId!=`string`){a.push(n);continue}let r=ln(n,t);await un({baseUrl:e.baseUrl,token:e.token,artifactId:n.artifactId,destinationPath:r,requestScope:t.meta}),i[n.field]=r,a.push({...n,localPath:r})}return i.artifacts=a,{ok:!0,data:i}}function ln(e,t){if(e.localPath&&e.localPath.trim().length>0)return e.localPath;let n=t.meta?.clientArtifactPaths?.[e.field];if(n&&n.trim().length>0)return n;let r=e.fileName?.trim()||`${e.field}-${Date.now()}`;return O.resolve(t.meta?.cwd??process.cwd(),r)}async function un(e){let t=new URL(dn(e.baseUrl,e.artifactId)),n=await S(t.protocol);await k.promises.mkdir(O.dirname(e.destinationPath),{recursive:!0}),await new Promise((r,a)=>{let o=!1,s=e.timeoutMs??9e4,c=t=>{if(!o){if(o=!0,clearTimeout(u),t){k.promises.rm(e.destinationPath,{force:!0}).finally(()=>a(t));return}r()}},l=n.request({protocol:t.protocol,host:t.hostname,port:t.port,method:`GET`,path:t.pathname+t.search,headers:{...b(e.token),...Se(e.requestScope?.tenantId)}},t=>{if((t.statusCode??500)>=400){let n=``;t.setEncoding(`utf8`),t.on(`data`,e=>{n+=e}),t.on(`end`,()=>{c(new i(`COMMAND_FAILED`,`Failed to download remote artifact`,{artifactId:e.artifactId,statusCode:t.statusCode,requestId:e.requestScope?.requestId,body:n}))});return}t.on(`aborted`,()=>{c(new i(`COMMAND_FAILED`,`Remote artifact download was interrupted`,{artifactId:e.artifactId,requestId:e.requestScope?.requestId}))}),A(t,k.createWriteStream(e.destinationPath)).then(()=>c(),e=>c(e instanceof Error?e:Error(String(e))))}),u=setTimeout(()=>{let t=new i(`COMMAND_FAILED`,`Remote artifact download timed out`,{artifactId:e.artifactId,requestId:e.requestScope?.requestId,timeoutMs:s});c(t),l.destroy(t)},s);l.on(`error`,t=>{if(t instanceof i){c(t);return}c(new i(`COMMAND_FAILED`,`Failed to download remote artifact`,{artifactId:e.artifactId,requestId:e.requestScope?.requestId,timeoutMs:s},t instanceof Error?t:void 0))}),l.end()})}function dn(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(`artifacts/${encodeURIComponent(t)}`,n).toString()}function fn(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}const pn=3e3,mn=1e3;function L(e){let t=Cn(e);if(!t||typeof t!=`object`)return null;let n=t,r=hn(n);if(!r)return null;let i=gn(n);return i?{token:r,...i,transport:_n(n.transport),pid:z(n.pid)??0,version:R(n.version),codeSignature:R(n.codeSignature),processStartTime:R(n.processStartTime)}:null}function hn(e){return typeof e.token==`string`&&e.token.length>0?e.token:null}function gn(e){let t=z(e.port),n=z(e.httpPort);return t===void 0&&n===void 0?null:{port:t,httpPort:n}}function _n(e){return e===`socket`||e===`http`||e===`dual`?e:void 0}function R(e){return typeof e==`string`?e:void 0}function z(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function B(e){let t=Cn(e);if(!t||typeof t!=`object`)return null;let n=t;return Number.isInteger(n.pid)&&Number(n.pid)>0?{pid:Number(n.pid),processStartTime:typeof n.processStartTime==`string`?n.processStartTime:void 0,startedAt:typeof n.startedAt==`number`?n.startedAt:void 0}:null}function V(e){wn(e)}function H(e){wn(e)}function vn(e){let t=W(e);if(!t.hasLock||t.hasInfo)return;let n=B(e.lockPath);if(!n){H(e.lockPath);return}x(n.pid,n.processStartTime)||H(e.lockPath)}async function U(e,t,n={}){let r=n.stopLiveProcesses??!0,i={reason:t,removedInfo:!1,removedLock:!1,stoppedInfoProcess:!1,stoppedLockProcess:!1};try{let t=k.existsSync(e.infoPath),n=L(e.infoPath);if(n){let t=x(n.pid,n.processStartTime);t&&!r?i.retainedInfoProcess=!0:(t&&(await G(n),i.stoppedInfoProcess=!0),V(e.infoPath),i.removedInfo=!0)}else t&&(V(e.infoPath),i.removedInfo=!0);let a=k.existsSync(e.lockPath),o=B(e.lockPath);if(o){let t=x(o.pid,o.processStartTime);t&&!r?i.retainedLockProcess=!0:(t&&(await me(o.pid,{termTimeoutMs:pn,killTimeoutMs:mn,expectedStartTime:o.processStartTime}),i.stoppedLockProcess=!0),H(e.lockPath),i.removedLock=!0)}else a&&(H(e.lockPath),i.removedLock=!0)}catch(e){i.error=e instanceof Error?e.message:String(e)}return T({level:i.error?`warn`:`info`,phase:`daemon_startup_metadata_cleanup`,data:i}),i}function W(e){return{hasInfo:k.existsSync(e.infoPath),hasLock:k.existsSync(e.lockPath)}}async function yn(e){let t=W(e);if(!t.hasLock||t.hasInfo)return!1;let n=B(e.lockPath);return!n||!x(n.pid,n.processStartTime)?(H(e.lockPath),!0):!1}async function G(e){await me(e.pid,{termTimeoutMs:pn,killTimeoutMs:mn,expectedStartTime:e.processStartTime})}function bn(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}function xn(e,t=y(process.env.AGENT_DEVICE_STATE_DIR)){let n=Sn(t);return e.hasLock&&!e.hasInfo?`agent-device attempted to clean stale daemon metadata automatically, but ${t.lockPath} still exists without ${t.infoPath}. Retry with --debug; if this persists after confirming no agent-device daemon process is running, run: ${n}`:e.hasLock&&e.hasInfo?`agent-device attempted to clean stale daemon metadata automatically, but ${t.infoPath} and ${t.lockPath} still remain. Retry with --debug; if this persists after confirming no agent-device daemon process is running, run: ${n}`:e.hasInfo?`agent-device did not observe reachable daemon metadata after retrying, and ${t.infoPath} still remains. Stale metadata was cleaned automatically when safe; retry with --debug. If this persists after confirming no agent-device daemon process is running, run: ${n}`:`agent-device did not observe reachable daemon metadata after retrying. Stale metadata was cleaned automatically when safe; retry with --debug and check daemon diagnostics logs. If stale metadata returns after confirming no agent-device daemon process is running, run: ${n}`}function Sn(e){return`rm -f ${Be(e.infoPath)} ${Be(e.lockPath)}`}function Cn(e){if(!k.existsSync(e))return null;try{return JSON.parse(k.readFileSync(e,`utf8`))}catch{return null}}function wn(e){try{k.existsSync(e)&&k.unlinkSync(e)}catch{}}function Tn(e,t){if(t.onProgress){t.onProgress(e);return}e.type===`command`&&(t.req.command===`doctor`&&ce(),process.stderr.write(`${e.message}\n`))}function K(e,t,n){return new i(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:e.meta?.requestId,line:t},n instanceof Error?n:void 0)}function En(e){let t=t=>(e.onError(t),!0);return{handleLine(n){let r;try{r=JSON.parse(n)}catch(r){return t(K(e.req,n,r))}if(he(r))try{return Tn(r.event,{req:e.req,onProgress:e.onProgress}),!1}catch(e){return t(e)}return fe(r)?(e.onResponse(r.response),!0):e.responseFormat===`socket-legacy`?(e.onResponse(r),!0):t(K(e.req,n,Error(`Missing daemon progress response envelope`)))}}}function Dn(e,t){return ge(e)&&String(Array.isArray(t)?t.join(`,`):t??``).includes(`application/x-ndjson`)}function On(e,t){let{req:n,isSettled:r,resolve:i,reject:a,clearTimeout:o}=t,s=``,c=En({req:n,onProgress:t.onProgress,responseFormat:`socket-legacy`,onResponse(t){o(),i(t),e.end()},onError(e){o(),a(e)}});e.setEncoding(`utf8`),e.on(`data`,e=>{if(r())return;let t=xe(s,e);s=t.buffer;for(let e of t.lines)if(c.handleLine(e))return})}function kn(e,t){let{req:n,handleResponseBody:r,reject:a,clearTimeout:o}=t,s=``,c=!1,l=En({req:n,onProgress:t.onProgress,responseFormat:`ndjson-envelope`,onResponse(e){c=!0,o(),r(JSON.stringify(e))},onError(e){c=!0,o(),a(e)}});e.setEncoding(`utf8`),e.on(`data`,e=>{if(c)return;let t=xe(s,e);s=t.buffer;for(let e of t.lines)if(e&&l.handleLine(e))return}),e.on(`end`,()=>{if(c)return;let e=s.trim();e&&l.handleLine(e)||(c=!0,o(),a(K(n,e)))}),e.on(`error`,e=>{c||(c=!0,o(),a(new i(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:n.meta?.requestId},e instanceof Error?e:void 0)))})}function An(e,t){let{info:n,req:r,resolve:a,reject:o}=t;try{let t=jn(e);if(t.error){o(Mn(t.error,r.meta?.requestId));return}if(!t.result||typeof t.result!=`object`){o(new i(`COMMAND_FAILED`,`Invalid daemon RPC response`,{requestId:r.meta?.requestId}));return}Nn(n,r,t.result,a,o)}catch(t){o(new i(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:r.meta?.requestId,line:e},t instanceof Error?t:void 0))}}function jn(e){return JSON.parse(e)}function Mn(e,t){let r=e.data??{};return new i(n(r.code==null?void 0:String(r.code),`COMMAND_FAILED`),String(r.message??e.message??`Daemon RPC request failed`),{...typeof r.details==`object`&&r.details?r.details:{},hint:typeof r.hint==`string`?r.hint:void 0,diagnosticId:typeof r.diagnosticId==`string`?r.diagnosticId:void 0,logPath:typeof r.logPath==`string`?r.logPath:void 0,retriable:typeof r.retriable==`boolean`?r.retriable:void 0,supportedOn:typeof r.supportedOn==`string`?r.supportedOn:void 0,requestId:t})}async function Nn(e,t,n,r,i){try{r(e.baseUrl&&n.ok?await cn(e,t,n):n)}catch(e){i(e)}}function Pn(e,t){let n=e.meta?.requestId??Fe();return Fn(e.command)?{jsonrpc:`2.0`,id:n,method:In(e.command),params:Ln(e,e.command,t)}:{jsonrpc:`2.0`,id:n,method:`agent_device.command`,params:e}}function Fn(e){return e===`lease_allocate`||e===`lease_heartbeat`||e===`lease_release`}function In(e){switch(e){case`lease_allocate`:return`agent_device.lease.allocate`;case`lease_heartbeat`:return`agent_device.lease.heartbeat`;case`lease_release`:return`agent_device.lease.release`}}function Ln(e,t,n){return oe(ue(e),t,{includeTokenParam:n.includeTokenParam,token:e.token,session:e.session})}const Rn=[`xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand`,`xcodebuild .*AgentDeviceRunner\\.env\\.session-`,`xcodebuild build-for-testing .*apple/runner/AgentDeviceRunner/AgentDeviceRunner\\.xcodeproj`],zn=new Set([`apple`,`ios`,`macos`]);function Bn(e){return e!==void 0&&zn.has(e)}function Vn(e){let t=ee(e.command);if(t.envelopeMs===`unbounded`)return;let n={...t,envelopeMs:t.envelopeMs};return Hn(n,e.positionals??[])??Un(n,e.flags)??n.envelopeMs}function Hn(e,t){if(e.budget.source!==`positional-parser`)return;let n=e.budget.parser(t);return n===null?void 0:Gn(e,n)}function Un(e,t){if(e.budget.source===`flag`)return e.budget.envelope===`widen`?Wn(e,e.budget,t):typeof t?.timeoutMs==`number`?t.timeoutMs:e.envelopeMs}function Wn(e,t,n){if(n?.settle!==!0)return e.envelopeMs;let r=typeof n.timeoutMs==`number`?n.timeoutMs:t.defaultBudgetMs;return typeof r==`number`?Kn(e,r):e.envelopeMs}function Gn(e,t){return Math.max(e.envelopeMs,t+Qn)}function Kn(e,t){return Math.max(e.envelopeMs,e.envelopeMs+t+Qn)}function qn(e,t,n,r,a,o,s){let c=a?{terminated:0}:Xn(),l=!a&&Jn(r),u=l?Zn(e,t):{forcedKill:!1},d=Bn(s)||c.terminated>0;return T({level:`error`,phase:`daemon_request_timeout`,data:{timeoutMs:o,requestId:n,command:r,timedOutRunnerPidsTerminated:c.terminated,timedOutRunnerCleanupError:c.error,daemonPidReset:l?e.pid:void 0,daemonPidForceKilled:l?u.forcedKill:void 0,daemonPreservedAfterTimeout:!a&&!l,daemonBaseUrl:e.baseUrl}}),new i(`COMMAND_FAILED`,`Daemon request timed out`,{timeoutMs:o,requestId:n,hint:Yn({remote:a,resetDaemon:l,command:r,appleCleanupEvidence:d})})}function Jn(e){return ee(e).onTimeout===`reset-daemon`}function Yn(e){let{remote:t,resetDaemon:n,command:r,appleCleanupEvidence:i}=e;if(t)return`Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.`;if(!n){let e=i&&r===C.snapshot?` If this was the first Apple-platform snapshot on the device, run agent-device prepare ios-runner with the same --platform before snapshot/test so runner startup is handled explicitly.`:``;return`Retry with --debug and check daemon diagnostics logs. The timed-out ${r??`request`} request was canceled${i?` and Apple runner work was aborted when detected`:``}; the daemon was kept alive so the session can still be closed or inspected.${e}`}return i?`Retry with --debug and check daemon diagnostics logs. Timed-out Apple runner xcodebuild processes were terminated when detected.`:`Retry with --debug and check daemon diagnostics logs. The daemon was reset after the timeout.`}function Xn(){let e=0;try{for(let t of Rn)Me(`pkill`,[`-f`,t],{allowFailure:!0}).exitCode===0&&(e+=1);return{terminated:e}}catch(t){return{terminated:e,error:t instanceof Error?t.message:String(t)}}}function Zn(e,t){let n=!1;try{x(e.pid,e.processStartTime)&&(process.kill(e.pid,`SIGKILL`),n=!0)}catch{G(e)}finally{V(t.infoPath),H(t.lockPath)}return{forcedKill:n}}const Qn=3e4,$n=`Daemon HTTP endpoint is unavailable`,er=`Daemon socket endpoint is unavailable`;async function tr(e,t){let n=ur(e,t);if(await nr(e,n))return!0;let r=dr(e,t,n);return r?await nr(e,r):!1}async function nr(e,t){return t===`http`?await ir(e):await rr(e.port)}function rr(e){return e?new Promise(t=>{let n=!1,r=j.createConnection({host:`127.0.0.1`,port:e},()=>{i(!0)}),i=e=>{n||(n=!0,r.destroy(),t(e))};r.setTimeout(500),r.on(`timeout`,()=>{i(!1)}),r.on(`error`,()=>{i(!1)})}):Promise.resolve(!1)}function ir(e){return or(e).then(e=>e.reachable)}async function ar(e){let t=await or(e);if(!e.baseUrl||!t.reachable)return t;if(typeof t.rpcProtocolVersion==`number`&&t.rpcProtocolVersion!==2)throw new i(`COMMAND_FAILED`,`Remote daemon RPC protocol is incompatible`,{daemonBaseUrl:e.baseUrl,clientVersion:E(),remoteVersion:t.version,remoteService:t.service,supportedRpcProtocolVersion:2,remoteRpcProtocolVersion:t.rpcProtocolVersion,hint:`Upgrade agent-device on the client or remote host so both support the same daemon RPC protocol.`});return t}async function or(e){let t=e.baseUrl?pe(e.baseUrl,`health`):e.httpPort?`http://127.0.0.1:${e.httpPort}/health`:null;if(!t)return{reachable:!1};let n=new URL(t),r=await S(n.protocol),i=e.baseUrl?3e3:500;return await new Promise(t=>{let a=e.baseUrl?b(e.token):{},o=r.request({protocol:n.protocol,host:n.hostname,port:n.port,path:n.pathname+n.search,method:`GET`,timeout:i,headers:a},e=>{let n=``;e.setEncoding(`utf8`),e.on(`data`,e=>{n+=e}),e.on(`end`,()=>{let r=e.statusCode??500;t({reachable:r<500,statusCode:r,...sr(n)})})});o.on(`timeout`,()=>{o.destroy(),t({reachable:!1})}),o.on(`error`,()=>{t({reachable:!1})}),o.end()})}function sr(e){try{let t=JSON.parse(e);return{service:typeof t.service==`string`?t.service:void 0,version:typeof t.version==`string`?t.version:void 0,rpcProtocolVersion:typeof t.rpcProtocolVersion==`number`?t.rpcProtocolVersion:void 0}}catch{return{}}}async function cr(e,t,n,r,i,a={}){let o=ur(e,n);try{return await lr(e,t,r,i,o,a)}catch(s){let c=dr(e,n,o);if(!c||!fr(s,o))throw s;return await lr(e,t,r,i,c,a)}}async function lr(e,t,n,r,i,a){return i===`http`?await gr(e,t,n,r,a):await hr(e,t,n,r,a)}function ur(e,t){if(e.baseUrl){if(t===`socket`)throw new i(`COMMAND_FAILED`,`Remote daemon endpoint only supports HTTP transport`,{daemonBaseUrl:e.baseUrl});return`http`}if(t===`http`||t===`socket`)return pr(e,t);let n=(e.transport===`socket`||e.transport===`dual`?[`socket`,`http`]:[`http`,`socket`]).find(t=>q(e,t));if(n)return n;throw new i(`COMMAND_FAILED`,`Daemon metadata has no reachable transport`)}function q(e,t){return t===`http`?!!e.httpPort:!!e.port}function dr(e,t,n){if(t!==`auto`||e.baseUrl)return null;let r=n===`socket`?`http`:`socket`;return q(e,r)?r:null}function fr(e,t){return t===`socket`&&e instanceof i&&e.code===`COMMAND_FAILED`&&e.message===`Failed to communicate with daemon`&&e.details?.daemonSocketRequestWritten===!1}function pr(e,t){if(q(e,t))return t;throw new i(`COMMAND_FAILED`,t===`http`?$n:er)}function mr(e,t,n,r={}){return T({level:`error`,phase:`daemon_request_socket_error`,data:{requestId:t,message:e instanceof Error?e.message:String(e)}}),new i(`COMMAND_FAILED`,`Failed to communicate with daemon`,{...r,requestId:t,hint:n?`Retry command. If this persists, verify the remote daemon URL, auth token, and remote host reachability.`:`Retry command. If this persists, clean stale daemon metadata and start a fresh session.`},e instanceof Error?e:void 0)}async function hr(e,t,n,r,a){let o=e.port;if(!o)throw new i(`COMMAND_FAILED`,er);return new Promise((i,s)=>{let c=!1,l=j.createConnection({host:`127.0.0.1`,port:o},()=>{c=!0,l.write(`${JSON.stringify(t)}\n`)}),u=!1,d=typeof r==`number`?setTimeout(()=>{u=!0,l.destroy(),s(qn(e,n,t.meta?.requestId,t.command,!1,r,t.flags?.platform))},r):void 0;On(l,{req:t,onProgress:a.onProgress,isSettled:()=>u,clearTimeout:()=>{d&&clearTimeout(d)},resolve:e=>{u=!0,i(e)},reject:e=>{u=!0,s(e)}}),l.on(`error`,e=>{u||(u=!0,d&&clearTimeout(d),s(mr(e,t.meta?.requestId,!1,{daemonSocketRequestWritten:c})))})})}async function gr(e,t,n,r,a){let o=e.baseUrl?new URL(pe(e.baseUrl,`rpc`)):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!o)throw new i(`COMMAND_FAILED`,$n);let s=JSON.stringify(Pn(t,{includeTokenParam:!e.baseUrl})),c={"content-type":`application/json`,"content-length":Buffer.byteLength(s)};e.baseUrl&&Object.assign(c,b(e.token));let l=await S(o.protocol);return await new Promise((u,d)=>{let f=l.request({protocol:o.protocol,host:o.hostname,port:o.port,method:`POST`,path:o.pathname+o.search,headers:c},n=>{if(Dn(t,n.headers?.[`content-type`])){kn(n,{req:t,onProgress:a.onProgress,reject:d,clearTimeout:()=>{m&&clearTimeout(m)},handleResponseBody:n=>An(n,{info:e,req:t,resolve:u,reject:d})});return}ve(n).then(n=>{m&&clearTimeout(m),An(n,{info:e,req:t,resolve:u,reject:d})}).catch(e=>{m&&clearTimeout(m),d(new i(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:t.meta?.requestId},e instanceof Error?e:void 0))})}),p=bn(e),m=typeof r==`number`?setTimeout(()=>{f.destroy(),d(qn(e,n,t.meta?.requestId,t.command,p,r,t.flags?.platform))},r):void 0;f.on(`error`,e=>{m&&clearTimeout(m),d(mr(e,t.meta?.requestId,p))}),f.write(s),f.end()})}const J=15e3,Y=new j.BlockList;Y.addSubnet(`127.0.0.0`,8,`ipv4`),Y.addAddress(`::1`,`ipv6`),Y.addSubnet(`::ffff:127.0.0.0`,104,`ipv6`);function _r(e,t){let n=vr(e),r=yr(e,t),i=br(e,r.remoteBaseUrl),a=xr(e,n,r.rawBaseUrl);return{paths:y(a?Sr():n),transportPreference:i.preference,serverMode:i.serverMode,ownedStateDir:a,remoteBaseUrl:r.remoteBaseUrl,remoteAuthToken:r.authToken}}function vr(e){return e.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR}function yr(e,t){let n=e.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL,r=Gr(n),i=t??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN;return Kr(r,i),{rawBaseUrl:n,remoteBaseUrl:r,authToken:i}}function br(e,t){let n=e.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,r=we(n);if(t&&r===`socket`)throw new i(`INVALID_ARGS`,`Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.`,{daemonBaseUrl:t});return{preference:r,serverMode:Ce(e.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??(n===`dual`?`dual`:void 0))}}function xr(e,t,n){return Ir(e.command)&&!t&&!n}function Sr(){return k.mkdtempSync(O.join(Ge.tmpdir(),`agent-device-replay-daemon-`))}async function Cr(e){if(e.remoteBaseUrl)return await wr(e);let t=await Tr(e);return t?{info:t,startedByClient:!1}:(vn(e.paths),await jr(e))}async function wr(e){let t={transport:`http`,token:e.remoteAuthToken??``,pid:0,baseUrl:e.remoteBaseUrl};if((await ar(t)).reachable)return{info:t,startedByClient:!1};throw new i(`COMMAND_FAILED`,`Remote daemon is unavailable`,{daemonBaseUrl:e.remoteBaseUrl,hint:`Verify AGENT_DEVICE_DAEMON_BASE_URL points to a reachable daemon with GET /health and POST /rpc. If this CLI was connected with connect proxy, run agent-device disconnect to return to the local daemon.`})}async function Tr(e){let t=L(e.paths.infoPath);if(!t)return null;let n=await Er(t,e.transportPreference);return Or(t,n)?t:(kr(t,n,e.paths.baseDir),await G(t),V(e.paths.infoPath),null)}async function Er(e,t){try{return await tr(e,t)}catch(e){if(Dr(e))return!1;throw e}}function Dr(e){return e instanceof i&&e.code===`COMMAND_FAILED`&&(e.message===`Daemon HTTP endpoint is unavailable`||e.message===`Daemon socket endpoint is unavailable`)}function Or(e,t){return e.version===E()&&e.codeSignature===Hr()&&t}function kr(e,t,n){try{let r=e.version?`pid ${e.pid}, v${e.version}`:`pid ${e.pid}`,i=Ar(e,t);process.stderr.write(`Replacing daemon (${r}) in ${n}: ${i}\n`)}catch{}}function Ar(e,t){return e.version===E()?e.codeSignature===Hr()?t?`not reusable`:`unreachable`:`code-signature mismatch`:`version mismatch (client v${E()})`}async function jr(e){let t=0,n=[],r,a;for(let i=1;i<=2;i+=1){let o;try{o=Br(e),a={pid:o.pid}}catch(t){if(r=t instanceof Error?t.message:String(t),n.push(await U(e.paths,`start_error`)),i<2){await D(150);continue}break}let s=await zr(J,e,o);if(s.kind===`ready`)return{info:s.info,startedByClient:!0};if(s.kind===`early_exit`){if(a=s.exit,r=Ur(s.exit),n.push(await U(e.paths,`start_error`)),i<2){await D(150);continue}break}if(await yn(e.paths)){t+=1;continue}let c=W(e.paths),l=i<2,u=await U(e.paths,`startup_timeout`,{stopLiveProcesses:!1});if(n.push(u),u.retainedInfoProcess||u.retainedLockProcess){let t=await zr(J,e,o);if(t.kind===`ready`)return{info:t.info,startedByClient:!0};t.kind===`early_exit`&&(a=t.exit,r=Ur(t.exit));break}if(!l)break;!c.hasInfo&&!c.hasLock&&await D(150)}let o=W(e.paths),s=Wr(e.paths.logPath);throw new i(`COMMAND_FAILED`,`Failed to start daemon`,{kind:`daemon_startup_failed`,stateDir:e.paths.baseDir,infoPath:e.paths.infoPath,lockPath:e.paths.lockPath,logPath:e.paths.logPath,startupTimeoutMs:J,startupAttempts:2,lockRecoveryCount:t,cleanupResults:n,startError:r,daemonProcess:a,...s?{daemonLogTail:s}:{},metadataState:o,hint:xn(o,e.paths)})}async function Mr(e,t,n,r){if(!Ir(e.command)||!t.startedByClient&&!n.ownedStateDir||bn(t.info)||Pr(r)||Lr(e,r))return r;let i={pid:t.info.pid,removedInfo:!1,removedLock:!1,removedStateDir:!1,error:void 0},a=r;try{await G(t.info)}catch(e){i.error=e instanceof Error?e.message:String(e)}finally{let e=k.existsSync(n.paths.infoPath);V(n.paths.infoPath),i.removedInfo=e&&!k.existsSync(n.paths.infoPath);let t=k.existsSync(n.paths.lockPath);if(H(n.paths.lockPath),i.removedLock=t&&!k.existsSync(n.paths.lockPath),n.ownedStateDir){let e=de(n.paths.sessionsDir);e?a=Nr(r,e):(k.rmSync(n.paths.baseDir,{recursive:!0,force:!0}),i.removedStateDir=!k.existsSync(n.paths.baseDir))}}return T({level:i.error?`warn`:`info`,phase:`daemon_replay_cleanup`,data:i}),a}function Nr(e,n){if(e&&!e.ok)return e;let{sessionName:r,tombstone:a}=n,o=a.sourcePath?`re-run: replay ${a.sourcePath} --save-script`:`re-run your replay <script> --save-script from the start`;return{ok:!1,error:t(new i(`REPAIR_COMMIT_FAILED`,`The repair transaction for session "${r}" completed, but committing its healed script failed at teardown: ${a.commitFailure.message}. ${o}.`))}}function Pr(e){if(!e||e.ok||e.error.code!==`REPLAY_DIVERGENCE`)return!1;let t=e.error.details?.divergence;if(!t||typeof t!=`object`)return!1;let n=t.resume;return!n||typeof n!=`object`?!1:n.repairSessionHeld===!0}function Fr(e,t){let n=`This repair session's daemon was kept alive to continue the repair; pass --state-dir ${t} on your next command (press, replay --from, or close --save-script) to reach it.`,r=e.error.hint;return{...e,error:{...e.error,hint:r?`${r} ${n}`:n}}}function Ir(e){return e===C.replay||e===C.test}function Lr(e,t){return e.command!==C.replay||!t||!t.ok?!1:t.data?.sessionActive===!0}function Rr(e,t){let n=e.data??{},r=typeof n.session==`string`?n.session:void 0,i=[...t?[`--state-dir ${ze(t)}`]:[],...r?[`--session ${ze(r)}`]:[]];if(i.length===0)return e;let a=`This session's daemon was kept alive because its script left the session active; pass ${i.join(` `)} on your next command to reach it.`,o=typeof n.message==`string`?n.message:void 0;return{...e,data:{...n,hint:a,message:o?`${o} ${a}`:a}}}async function zr(e,t,n){let r=Date.now(),i;for(n.exited.then(e=>{i=e});Date.now()-r<e;){if(i)return{kind:`early_exit`,exit:i};let e=L(t.paths.infoPath);if(e&&await tr(e,t.transportPreference))return{kind:`ready`,info:e};if(i)return{kind:`early_exit`,exit:i};await D(100)}return{kind:`timeout`}}function Br(e){let t=Vr(),n=t.useSrc?[`--experimental-strip-types`,t.srcPath]:[t.distPath],r={...process.env,AGENT_DEVICE_STATE_DIR:e.paths.baseDir,AGENT_DEVICE_DAEMON_SERVER_MODE:e.serverMode};k.mkdirSync(e.paths.baseDir,{recursive:!0});let i=k.openSync(e.paths.logPath,`a`),a=k.openSync(e.paths.logPath,`a`);try{return Pe(process.execPath,n,{env:r,stdio:[`ignore`,i,a]})}finally{k.closeSync(i),k.closeSync(a)}}function Vr(){let e=Re(),t=[O.join(e,`dist`,`src`,`internal`,`daemon.js`),O.join(e,`dist`,`src`,`daemon.js`)],n=t[0];if(n===void 0)throw new i(`COMMAND_FAILED`,`Daemon dist path list is empty`);let r=t.find(e=>k.existsSync(e))??n,a=O.join(e,`src`,`daemon.ts`),o=t.some(e=>k.existsSync(e)),s=k.existsSync(a);if(!o&&!s)throw new i(`COMMAND_FAILED`,`Daemon entry not found`,{distPaths:t,srcPath:a});return{root:e,distPath:r,distPaths:t,srcPath:a,useSrc:(process.execArgv.includes(`--experimental-strip-types`)||!o)&&s}}function Hr(){let e=Vr();return _e(e.useSrc?e.srcPath:e.distPath,e.root)}function Ur(e){return e.error?`daemon process ${e.pid} failed to start: ${e.error}`:e.signal?`daemon process ${e.pid} exited before readiness with signal ${e.signal}`:`daemon process ${e.pid} exited before readiness with code ${e.exitCode??0}`}function Wr(e){try{if(!k.existsSync(e))return;let t=k.statSync(e);if(t.size<=0)return;let n=Math.min(t.size,64e3),r=k.openSync(e,`r`);try{let e=Buffer.alloc(n);k.readSync(r,e,0,n,t.size-n);let i=e.toString(`utf8`).trim();return i.length>0?i:void 0}finally{k.closeSync(r)}}catch{return}}function Gr(e){if(!e)return;let t;try{t=new URL(e)}catch(t){throw new i(`INVALID_ARGS`,`Invalid daemon base URL`,{daemonBaseUrl:e},t instanceof Error?t:void 0)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new i(`INVALID_ARGS`,`Daemon base URL must use http or https`,{daemonBaseUrl:e});return t.toString().replace(/\/+$/,``)}function Kr(e,t){if(!e)return;let n=new URL(e).hostname;if(!qr(n)&&!(typeof t==`string`&&t.trim().length>0))throw new i(`INVALID_ARGS`,`Remote daemon base URL for non-loopback hosts requires daemon authentication`,{daemonBaseUrl:e,hint:`Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL.`})}function qr(e){let t=e.trim().toLowerCase().replace(/^\[(.*)\]$/,`$1`);return t===`localhost`?!0:j.isIPv4(t)?Y.check(t,`ipv4`):j.isIPv6(t)?Y.check(t,`ipv6`):!1}async function Jr(e,t={}){let n=e.meta?.requestId??Fe(),r=!!(e.meta?.debug||e.flags?.verbose),i=e.flags,{daemonAuthToken:a,...o}=i??{},s=i?{...e,flags:o}:e,c=_r(s,t.authToken??a),l=Vn(s),u=await je(`daemon_startup`,async()=>await Cr(c),{requestId:n,session:e.session}),d=u.info,f=await Yt(s,d);ni(s.command);let p=Yr(s,f,d.token,n,r);return T({level:`info`,phase:`daemon_request_prepare`,data:{requestId:n,command:s.command,session:s.session}}),await $r(s,u,c,async()=>ti(ei(await je(`daemon_request`,async()=>await cr(d,p,c.transportPreference,c.paths,l,t.onProgress?{onProgress:t.onProgress}:void 0),{requestId:n,command:e.command}),c),s,c))}function Yr(e,t,n,r,i){return{...e,positionals:t.positionals,flags:t.flags,token:n,meta:Xr(e,t,r,i)}}function Xr(e,t,n,r){let i=e.meta??{};return{...i,requestId:n,debug:r,...Zr(i,e.flags),...Qr(t)}}function Zr(e,t){return{includeCost:e.includeCost,cwd:e.cwd,sessionExplicit:e.sessionExplicit,tenantId:e.tenantId??t?.tenant,runId:e.runId??t?.runId,leaseId:e.leaseId??t?.leaseId,sessionIsolation:e.sessionIsolation??t?.sessionIsolation,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform}}function Qr(e){return{...e.uploadedArtifactId?{uploadedArtifactId:e.uploadedArtifactId}:{},...e.clientArtifactPaths?{clientArtifactPaths:e.clientArtifactPaths}:{},...e.installSource?{installSource:e.installSource}:{}}}async function $r(e,t,n,r){let a,o=!1,s;try{a=await r()}catch(e){o=!0,s=e}let c=await Mr(e,t,n,a);if(o)throw s;if(!c)throw new i(`COMMAND_FAILED`,`Daemon request produced no response after cleanup`);return c}function ei(e,t){return e.ok||!t.ownedStateDir||!Pr(e)?e:Fr(e,t.paths.baseDir)}function ti(e,t,n){return!e.ok||!Lr(t,e)?e:Rr(e,n.ownedStateDir?n.paths.baseDir:void 0)}function ni(e){!ri(e)||process.stderr.isTTY!==!0||process.env.CI||process.stderr.write(e===C.reinstall?`Reinstalling...
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{I as t,N as n,a as r,o as i,y as a}from"./sdk-contracts.js";import"./capture.js";import{n as o}from"./snapshot-capture-annotations.js";import{C as s,D as c,S as l,T as u,b as d,g as f,h as p,w as m,x as h,y as g}from"./sdk-batch-runner.js";import{n as _}from"./snapshot-diagnostics.js";import{T as ee,i as te,m as ne,w as re}from"./registry.js";import{c as ie,m as v,p as y,s as b}from"./sdk-device.js";import{f as x,i as S}from"./lease-scope.js";import{C as ae,en as oe}from"./sdk-batch.js";import{n as C,t as w}from"./catalog.js";import{c as T,n as se,r as ce}from"./diagnostics.js";import{t as E}from"./command-metadata.js";import"./diagnostics2.js";import{a as le,c as ue,i as de,l as fe,n as pe,o as me,r as he,s as ge,t as _e}from"./daemon-client-lifecycle.js";import{n as D}from"./config.js";import{r as ve}from"./session-paths.js";import{n as ye,t as be}from"./client-metro.js";import{t as xe}from"./screenshot-result.js";import O from"node:path";import k from"node:fs";function A(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function j(e,t,n){return{deviceId:t,deviceName:n,...v(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function M(e,t){let n=h(e,`bundleId`),r=h(e,`package`);return{app:u(e,`app`),appPath:u(e,`appPath`),platform:m(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:A({session:t,bundleId:n,packageName:r})}}function Se(e,t){let n=h(e,`bundleId`),r=h(e,`packageName`),i=n??r??h(e,`appId`),o=h(e,`launchTarget`)??r??n??i;if(!o)throw new a(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:e});return{appName:h(e,`appName`),appId:i,bundleId:n,packageName:r,launchTarget:o,installablePath:h(e,`installablePath`),archivePath:h(e,`archivePath`),materializationId:h(e,`materializationId`),materializationExpiresAt:h(e,`materializationExpiresAt`),identifiers:A({session:t,bundleId:n,packageName:r,appId:i})}}function Ce(e){return{released:e.released===!0,materializationId:u(e,`materializationId`),identifiers:{}}}function N(e){let{record:t,platform:n,id:r,name:i,target:a}=F(e,`name`),o=P(t);return{platform:n,target:a,kind:l(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...ie(n)&&o?{appleOs:o}:{},identifiers:j(n,r,i),...we(t),...I(n,r)}}function we(e){let t=e.claimedBy;if(!t||typeof t!=`object`||Array.isArray(t))return{};let n=t,r=n.session,i=n.workspace;return typeof r!=`string`||typeof i!=`string`?{}:{claimedBy:{session:r,workspace:i}}}function Te(e){let{record:t,platform:n,id:r,name:i,target:a}=F(e,`name`),o=u(t,`device`),c=P(t),l={session:i,...j(n,r,o)};return{name:i,address:h(t,`address`),createdAt:s(t,`createdAt`),sessionStateDir:h(t,`sessionStateDir`),runnerLogPath:h(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...c?{appleOs:c}:{},identifiers:l,...I(n,r,{simulatorSetPath:d(t,`ios_simulator_device_set`)})},identifiers:l}}function P(e){let t=e.appleOs;return b(t)?t:void 0}function F(e,t){let n=p(e);return{record:n,platform:m(n,`platform`),id:u(n,`id`),name:u(n,t),target:g(n,`target`)}}function I(e,t,n={}){if(e===`ios`)return{ios:{udid:t,...n.simulatorSetPath===void 0?{}:{simulatorSetPath:n.simulatorSetPath}}};if(!v(e))return{};let r=n.serial??t;return e===`android`?{android:{serial:r}}:e===`harmonyos`?{harmonyos:{serial:r}}:{vega:{serial:r}}}function Ee(e){if(!f(e))return;let t=e.platform,n=h(e,`metroHost`),r=typeof e.metroPort==`number`?e.metroPort:void 0,a=h(e,`bundleUrl`),o=h(e,`launchUrl`);return{platform:i(t)?t:void 0,metroHost:n,metroPort:r,bundleUrl:a,launchUrl:o}}function De(e){let t=e.platform,n=h(e,`id`),r=h(e,`device`);if(!y(t)||!n||!r)return;let i=g(e,`target`),a=v(t)?h(e,`serial`)??n:void 0;return{platform:t,target:i,id:n,name:r,identifiers:{...j(t,n,r),...a?{serial:a}:{}},...I(t,t===`ios`?h(e,`device_udid`)??n:n,{simulatorSetPath:d(e,`ios_simulator_device_set`),serial:a})}}const Oe=[`explicit-selector`,`existing-session`,`single-booted-local`,`single-bootable-local`,`single-app-installed-local`,`preferred-local`,`single-provider-device`],ke=[`session`,`local`,`provider`];function Ae(e){if(!f(e))return;let{reason:t,source:n,candidateCount:r,bootOccurred:i}=e;if(!(!Oe.includes(t)||!ke.includes(n)||typeof r!=`number`||!Number.isInteger(r)||r<0||typeof i!=`boolean`))return{reason:t,source:n,candidateCount:r,bootOccurred:i}}function je(e){if(f(e)&&typeof e.durationMs==`number`&&typeof e.measuredAt==`string`&&typeof e.method==`string`)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:h(e,`appTarget`),appBundleId:h(e,`appBundleId`)}}function L(e){if(!f(e)||typeof e.success!=`boolean`||typeof e.exitCode!=`number`||typeof e.stdout!=`string`||typeof e.stderr!=`string`)return;let t=R(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}const Me=[`hint`,`diagnosticId`,`logPath`,`supportedOn`];function R(e){if(!f(e)||typeof e.code!=`string`||typeof e.message!=`string`)return;let t={code:e.code,message:e.message};Object.assign(t,Ne(e.cause));for(let n of Me){let r=e[n];typeof r==`string`&&(t[n]=r)}return f(e.details)&&(t.details=e.details),typeof e.retriable==`boolean`&&(t.retriable=e.retriable),t}function Ne(e){let n=t(e);return n?{cause:n}:void 0}function Pe(e){let t=R(e.initialSnapshotError);return{...e.snapshot&&typeof e.snapshot==`object`?{snapshot:e.snapshot}:{},...t?{initialSnapshotError:t}:{}}}function Fe(e){return Array.isArray(e)?e:[]}function Ie(e){let t=S(e);return c({requestId:e.requestId,cwd:e.cwd,sessionExplicit:e.session!==void 0,debug:e.debug,includeCost:e.cost,responseLevel:e.responseLevel,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform,...x(t),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function z(e){return e??`default`}const B={...te(),batch:ne(Le)};async function Le(e,t,n){let r=B[e];if(!r)throw Error(`Missing daemon writer for batch command: ${e}`);let i=E(e);if(!i)throw Error(`Missing command metadata for batch command: ${e}`);try{return await V(r,i,i.readInput(t))}catch(t){let r=t instanceof Error?t.message:String(t);throw new a(`INVALID_ARGS`,`Batch step ${n} ${e} input is invalid: ${r}`,void 0,t)}}async function Re(e,t){let n=B[e];if(!n)throw Error(`Missing daemon writer for command: ${e}`);return await V(n,E(e),t)}async function V(e,t,n){let r=await e(n);return{...r,...t?{metadataFlags:ee(t,r.options)}:{}}}async function H(e,t={}){let n=e.meta?.requestId??se(),r=!!(e.meta?.debug||e.flags?.verbose),i=e.flags,{daemonAuthToken:a,...o}=i??{},s=i?{...e,flags:o}:e,c=ge(s,t.authToken??a),l=oe(ae(s.command),s),u=await T(`daemon_startup`,async()=>await de(c),{requestId:n,session:e.session}),d=u.info,f=await fe(s,d);Ke(s.command);let p=ze(s,f,d.token,n,r);return ce({level:`info`,phase:`daemon_request_prepare`,data:{requestId:n,command:s.command,session:s.session}}),await Ue(s,u,c,async()=>Ge(We(await T(`daemon_request`,async()=>await ue(d,p,c.transportPreference,c.paths,l,t.onProgress?{onProgress:t.onProgress}:void 0),{requestId:n,command:e.command}),c),s,c))}function ze(e,t,n,r,i){return{...e,positionals:t.positionals,flags:t.flags,token:n,meta:Be(e,t,r,i)}}function Be(e,t,n,r){let i=e.meta??{};return{...i,requestId:n,debug:r,...Ve(i,e.flags),...He(t)}}function Ve(e,t){return{includeCost:e.includeCost,cwd:e.cwd,sessionExplicit:e.sessionExplicit,tenantId:e.tenantId??t?.tenant,runId:e.runId??t?.runId,leaseId:e.leaseId??t?.leaseId,sessionIsolation:e.sessionIsolation??t?.sessionIsolation,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform}}function He(e){return{...e.uploadedArtifactId?{uploadedArtifactId:e.uploadedArtifactId}:{},...e.clientArtifactPaths?{clientArtifactPaths:e.clientArtifactPaths}:{},...e.installSource?{installSource:e.installSource}:{}}}async function Ue(e,t,n,r){let i,o=!1,s;try{i=await r()}catch(e){o=!0,s=e}let c=await he(e,t,n,i);if(o)throw s;if(!c)throw new a(`COMMAND_FAILED`,`Daemon request produced no response after cleanup`);return c}function We(e,t){return e.ok||!t.ownedStateDir||!me(e)?e:pe(e,t.paths.baseDir)}function Ge(e,t,n){return!e.ok||!le(t,e)?e:_e(e,n.ownedStateDir?n.paths.baseDir:void 0)}function Ke(e){!qe(e)||process.stderr.isTTY!==!0||process.env.CI||process.stderr.write(e===C.reinstall?`Reinstalling...
|
|
2
2
|
`:`Installing...
|
|
3
|
-
`)}function ri(e){return e===C.install||e===C.reinstall||e===w.installSource}function X(e,t){return O.join(e,`metro-sessions`,`${be(t)}.json`)}function ii(e){let t=X(e.stateDir,e.session);k.mkdirSync(O.dirname(t),{recursive:!0}),k.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function ai(e){let t=X(e.stateDir,e.session),n;try{n=k.readFileSync(t,`utf8`)}catch{return}let r;try{r=JSON.parse(n)}catch{return}if(!r||typeof r!=`object`||Array.isArray(r))return;let i=r,a={};return typeof i.metroHost==`string`&&i.metroHost&&(a.metroHost=i.metroHost),typeof i.metroPort==`number`&&Number.isInteger(i.metroPort)&&(a.metroPort=i.metroPort),typeof i.bundleUrl==`string`&&i.bundleUrl&&(a.bundleUrl=i.bundleUrl),Object.keys(a).length>0?a:void 0}function oi(e){k.rmSync(X(e.stateDir,e.session),{force:!0})}var si=e({createAgentDeviceClient:()=>ci});function ci(e={},t={}){let n=t.transport??Jr,o=t=>a(t.responseLevel??e.responseLevel),s=async(t,i=[],a={},o,s)=>{let c=Q(e,a),l={session:ut(c.session),command:t,positionals:i,...s?{input:s}:{},flags:ke(c,o),runtime:c.runtime,meta:lt(c)},u=await n(l,{authToken:c.daemonAuthToken});return u.ok||r(u.error),u.data??{}},c=async(e={})=>{let t=await s(w.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(Qe)},l=async(e,t={})=>{let n=pt(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},u=(t={})=>ut(Q(e,t).session);return{command:{wait:async e=>await l(`wait`,e),alert:async(e={})=>await l(`alert`,e),...yi(l),reactNative:async e=>await l(`react-native`,e),doctor:async(e={})=>await l(`doctor`,e),prepare:async e=>await l(`prepare`,e),viewport:async e=>await l(`viewport`,e)},devices:{list:async(e={})=>{let t=await l(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(Ze)},capabilities:async(e={})=>{let t=await l(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:Ze(t.device),availableCommands:n}},boot:async(e={})=>await l(`boot`,e),shutdown:async(e={})=>await l(`shutdown`,e)},sessions:{list:async(e={})=>await c(e),stateDir:async(t={})=>y(Q(e,t).stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,close:async(t={})=>{let n=u(t);try{let e=await l(`close`,t);return{session:n,shutdown:it(e.shutdown),provider:Z(e.provider),savedScript:h(e,`savedScript`),identifiers:{session:n}}}finally{wi(e,t)}},saveScript:async(e={})=>{let t=await s(w.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),n=t.actionCount;if(typeof n!=`number`||!Number.isInteger(n)||n<0)throw new i(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let r=g(t,`session`);return{session:r,savedScript:g(t,`savedScript`),actionCount:n,identifiers:{session:r}}},artifacts:async(e={})=>await l(`artifacts`,e)},apps:{install:async e=>Je(await l(`install`,e),u(e)),reinstall:async e=>Je(await l(`reinstall`,e),u(e)),installFromSource:async e=>Ye(await l(`install-from-source`,e),u(e)),list:async(e={})=>{let t=await l(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=u(t),r=await l(`open`,t);Ci({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=nt(r),a=h(r,`appBundleId`),o=a,s=Array.isArray(r.warnings)?r.warnings.filter(e=>typeof e==`string`):[];return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:h(r,`sessionStateDir`),runnerLogPath:h(r,`runnerLogPath`),requestLogPath:h(r,`requestLogPath`),eventLogPath:h(r,`eventLogPath`),appName:h(r,`appName`),appBundleId:a,appId:o,startup:rt(r.startup),runtime:tt(r.runtime),device:i,...st(r),identifiers:{session:n,deviceId:i?.id,deviceName:i?.name,udid:i?.ios?.udid,serial:i?.android?.serial,appId:o,appBundleId:a}}},close:async(e={})=>{let t=u(e),n=await l(`close`,e);return{session:t,closedApp:e.app,shutdown:it(n.shutdown),savedScript:h(n,`savedScript`),identifiers:{session:t}}},push:async e=>await l(`push`,e),triggerEvent:async e=>await l(`trigger-app-event`,e)},materializations:{release:async e=>Xe(await s(w.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:{allocate:async e=>Ti(await s(w.leaseAllocate,[],{...e,leaseId:void 0})),heartbeat:async e=>Ti(await s(w.leaseHeartbeat,[],e)),release:async e=>{let t=await s(w.leaseRelease,[],e);return{released:t.released===!0,provider:Z(t.provider)}}},metro:{prepare:async t=>{let n=await He({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath});return bi(e,n),n},reload:async(t={})=>await Ve({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??xi(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=u(e),n=await l(`snapshot`,e);return o(e)?n:_i(n,t)},screenshot:async(e={})=>{let t=u(e),n=await l(`screenshot`,e);if(o(e))return n;let r=ye(n);return{path:g(n,`path`),width:r?.width,height:r?.height,logicalWidth:r?.logicalWidth,logicalHeight:r?.logicalHeight,pixelDensity:r?.pixelDensity,overlayRefs:r?.overlayRefs,identifiers:{session:t}}},diff:async e=>await l(`diff`,e)},interactions:{click:async e=>await l(`click`,e),press:async e=>await l(`press`,e),longPress:async e=>await l(`longpress`,e),swipe:async e=>await l(`swipe`,e),pan:async e=>await l(`gesture`,li(e)),drag:async e=>await l(`gesture`,ui(e)),fling:async e=>await l(`gesture`,di(e)),swipeGesture:async e=>await l(`gesture`,fi(e)),focus:async e=>await l(`focus`,e),type:async e=>await l(`type`,e),fill:async e=>await l(`fill`,e),scroll:async e=>await l(`scroll`,e),pinch:async e=>await l(`gesture`,pi(e)),rotateGesture:async e=>await l(`gesture`,mi(e)),transformGesture:async e=>await l(`gesture`,hi(e)),get:async e=>await l(`get`,e),is:async e=>await l(`is`,e),find:async e=>await l(`find`,e)},replay:{run:async e=>await l(`replay`,e),test:async e=>await l(`test`,e)},batch:{run:async e=>await l(`batch`,e)},observability:{perf:async(e={})=>await l(`perf`,e),logs:async(e={})=>await l(`logs`,e),events:async(e={})=>await l(`events`,e),network:async(e={})=>await l(`network`,e),audio:async(e={})=>await l(`audio`,e)},debug:{symbols:async t=>{let{symbolicateCrashArtifact:n}=await import(`./debug-symbols.js`);return n({cwd:t.cwd??e.cwd,...t})}},recording:{record:async e=>await l(`record`,e),trace:async e=>await l(`trace`,e)},settings:{update:async e=>await l(`settings`,e)}}}function li(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`pan`,origin:{x:t,y:n},delta:{x:r,y:i}}}function ui(e){return{...e,kind:`drag`}}function di(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function fi(e){return{...e,kind:`swipe`}}function pi(e){let{x:t,y:n,...r}=e;return gi(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function mi(e){let{x:t,y:n,...r}=e;return gi(t,n,`rotate`),{...r,kind:`rotate`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function hi(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`transform`,origin:{x:t,y:n},delta:{x:r,y:i}}}function gi(e,t,n){if(e===void 0!=(t===void 0))throw new i(`INVALID_ARGS`,`gesture ${n} center requires both x and y`)}function _i(e,t){let n=h(e,`appBundleId`);return{nodes:ct(e.nodes),truncated:e.truncated===!0,appName:h(e,`appName`),appBundleId:n,...vi(e),identifiers:{session:t,appId:n,appBundleId:n}}}function vi(e){let t=Z(e.visibility),n=Z(e.unchanged),r=s(e.snapshotDiagnostics);return{...t?{visibility:t}:{},...o(e),...n?{unchanged:n}:{},...r?{snapshotDiagnostics:r}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function yi(e){let t={};for(let[n,r]of Object.entries(Ee.clientCommandMethods??{}))t[n]=async(t={})=>await e(r,t);let n=t.orientation;if(!n)throw Error(`orientation client method missing from the system command family`);return t.rotate=async(e={})=>({...await n(e),action:`rotate`}),t}function Z(e){return _(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:y(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:ut(n.session)}}function bi(e,t){try{let n=new URL(t.statusUrl),r=Number.parseInt(n.port,10);if(!n.hostname||!Number.isInteger(r))return;let i=t.bridge?void 0:t.iosRuntime.bundleUrl??t.androidRuntime.bundleUrl;ii({...$(e),hints:{metroHost:n.hostname,metroPort:r,bundleUrl:i}})}catch{}}function xi(e){try{return ai($(e))}catch{return}}function Si(e){if(!e)return;let{metroHost:t,metroPort:n,bundleUrl:r}=e;if(!(t===void 0&&n===void 0&&r===void 0))return{metroHost:t,metroPort:n,bundleUrl:r}}function Ci(e){try{let t=$(e.config,e.options),n=Si(e.runtime);if(n){ii({...t,hints:n});return}e.sessionReused||oi(t)}catch{}}function wi(e,t){try{oi($(e,t))}catch{}}function Ti(e){let t=e.lease;if(!_(t))throw Error(`Invalid lease response from daemon`);return{leaseId:g(t,`leaseId`),tenantId:g(t,`tenantId`),runId:g(t,`runId`),backend:g(t,`backend`),leaseProvider:h(t,`leaseProvider`),clientId:h(t,`clientId`),deviceKey:h(t,`deviceKey`),createdAt:typeof t.createdAt==`number`?t.createdAt:void 0,heartbeatAt:typeof t.heartbeatAt==`number`?t.heartbeatAt:void 0,expiresAt:typeof t.expiresAt==`number`?t.expiresAt:void 0}}export{_r as a,Cr as i,ci as n,Jr as r,si as t};
|
|
3
|
+
`)}function qe(e){return e===C.install||e===C.reinstall||e===w.installSource}function U(e,t){return O.join(e,`metro-sessions`,`${ve(t)}.json`)}function W(e){let t=U(e.stateDir,e.session);k.mkdirSync(O.dirname(t),{recursive:!0}),k.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function Je(e){let t=U(e.stateDir,e.session),n;try{n=k.readFileSync(t,`utf8`)}catch{return}let r;try{r=JSON.parse(n)}catch{return}if(!r||typeof r!=`object`||Array.isArray(r))return;let i=r,a={};return typeof i.metroHost==`string`&&i.metroHost&&(a.metroHost=i.metroHost),typeof i.metroPort==`number`&&Number.isInteger(i.metroPort)&&(a.metroPort=i.metroPort),typeof i.bundleUrl==`string`&&i.bundleUrl&&(a.bundleUrl=i.bundleUrl),Object.keys(a).length>0?a:void 0}function G(e){k.rmSync(U(e.stateDir,e.session),{force:!0})}function Ye(e){let t=async(t,n)=>await e(w.humanControl,t,n);return{allocate:async t=>q(await e(w.leaseAllocate,[],{...t,leaseId:void 0})),heartbeat:async t=>q(await e(w.leaseHeartbeat,[],t)),release:async t=>{let n=await e(w.leaseRelease,[],t);return{released:n.released===!0,provider:f(n.provider)?n.provider:void 0}},humanControl:{list:async e=>{let n=await t([`list`],e);if(!Array.isArray(n.holds))throw new a(`COMMAND_FAILED`,`Daemon did not return human-control holds.`);return n.holds.map(K)},put:async(e,n={},r)=>K((await t([`put`,e,JSON.stringify(n)],r)).hold),remove:async(e,n)=>(await t([`remove`,e],n)).released===!0}}}function K(e){if(!f(e)||!f(e.scope)||e.state!==`active`&&e.state!==`activating`||typeof e.createdAt!=`number`||typeof e.updatedAt!=`number`)throw new a(`COMMAND_FAILED`,`Daemon returned an invalid human-control hold.`);return{id:u(e,`id`),scope:{backend:u(e.scope,`backend`),leaseProvider:h(e.scope,`leaseProvider`),deviceKey:u(e.scope,`deviceKey`)},state:e.state,reason:h(e,`reason`),createdAt:e.createdAt,updatedAt:e.updatedAt,...typeof e.expiresAt==`number`?{expiresAt:e.expiresAt}:{}}}function q(e){let t=e.lease;if(!f(t))throw Error(`Invalid lease response from daemon`);return{leaseId:u(t,`leaseId`),tenantId:u(t,`tenantId`),runId:u(t,`runId`),backend:u(t,`backend`),leaseProvider:h(t,`leaseProvider`),clientId:h(t,`clientId`),deviceKey:h(t,`deviceKey`),createdAt:typeof t.createdAt==`number`?t.createdAt:void 0,heartbeatAt:typeof t.heartbeatAt==`number`?t.heartbeatAt:void 0,expiresAt:typeof t.expiresAt==`number`?t.expiresAt:void 0}}var Xe=e({createAgentDeviceClient:()=>J});function J(e={},t={}){let i=t.transport??H,o=t=>r(t.responseLevel??e.responseLevel),s=async(t,r=[],a={},o,s)=>{let c=Q(e,a),l={session:z(c.session),command:t,positionals:r,...s?{input:s}:{},flags:re(c,o),runtime:c.runtime,meta:Ie(c)},u=await i(l,{authToken:c.daemonAuthToken});return u.ok||n(u.error),u.data??{}},c=async(e={})=>{let t=await s(w.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(Te)},l=async(e,t={})=>{let n=await Re(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},d=(t={})=>z(Q(e,t).session);return{command:{wait:async e=>await l(`wait`,e),alert:async(e={})=>await l(`alert`,e),appState:async(e={})=>await l(`appstate`,e),back:async(e={})=>await l(`back`,e),home:async(e={})=>await l(`home`,e),orientation:async e=>await l(`orientation`,e),appSwitcher:async(e={})=>await l(`app-switcher`,e),keyboard:async(e={})=>await l(`keyboard`,e),clipboard:async e=>await l(`clipboard`,e),tvRemote:async e=>await l(`tv-remote`,e),reactNative:async e=>await l(`react-native`,e),doctor:async(e={})=>await l(`doctor`,e),prepare:async e=>await l(`prepare`,e),viewport:async e=>await l(`viewport`,e)},devices:{list:async(e={})=>{let t=await l(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(N)},capabilities:async(e={})=>{let t=await l(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:N(t.device),availableCommands:n}},boot:async(e={})=>await l(`boot`,e),shutdown:async(e={})=>await l(`shutdown`,e)},sessions:{list:async(e={})=>await c(e),stateDir:async(t={})=>{let n=Q(e,t);return D(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir},close:async(t={})=>{let n=d(t);try{let e=await l(`close`,t);return{session:n,shutdown:L(e.shutdown),provider:Z(e.provider),savedScript:h(e,`savedScript`),identifiers:{session:n}}}finally{lt(e,t)}},saveScript:async(e={})=>{let t=await s(w.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),n=t.actionCount;if(typeof n!=`number`||!Number.isInteger(n)||n<0)throw new a(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let r=u(t,`session`);return{session:r,savedScript:u(t,`savedScript`),actionCount:n,identifiers:{session:r}}},artifacts:async(e={})=>await l(`artifacts`,e)},apps:{install:async e=>M(await l(`install`,e),d(e)),reinstall:async e=>M(await l(`reinstall`,e),d(e)),installFromSource:async e=>Se(await l(`install-from-source`,e),d(e)),list:async(e={})=>{let t=await l(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=d(t),r=await l(`open`,t);ct({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=De(r),a=h(r,`appBundleId`),o=a,s=Array.isArray(r.warnings)?r.warnings.filter(e=>typeof e==`string`):[];return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:h(r,`sessionStateDir`),runnerLogPath:h(r,`runnerLogPath`),requestLogPath:h(r,`requestLogPath`),eventLogPath:h(r,`eventLogPath`),appName:h(r,`appName`),appBundleId:a,appId:o,selection:Ae(r.selection),startup:je(r.startup),runtime:Ee(r.runtime),device:i,...Pe(r),identifiers:{session:n,deviceId:i?.id,deviceName:i?.name,udid:i?.ios?.udid,serial:i?.android?.serial,appId:o,appBundleId:a}}},close:async(e={})=>{let t=d(e),n=await l(`close`,e);return{session:t,closedApp:e.app,shutdown:L(n.shutdown),savedScript:h(n,`savedScript`),identifiers:{session:t}}},push:async e=>await l(`push`,e),triggerEvent:async e=>await l(`trigger-app-event`,e)},materializations:{release:async e=>Ce(await s(w.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:Ye(s),metro:{prepare:async t=>{let n=await be({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath});return at(e,n),n},reload:async(t={})=>await ye({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??ot(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=d(e),n=await l(`snapshot`,e);return o(e)?n:rt(n,t)},screenshot:async(e={})=>{let t=d(e),n=await l(`screenshot`,e);return o(e)?n:xe(n,t)},diff:async e=>await l(`diff`,e)},interactions:{click:async e=>await l(`click`,e),press:async e=>await l(`press`,e),longPress:async e=>await l(`longpress`,e),hover:async e=>await l(`hover`,e),swipe:async e=>await l(`swipe`,e),pan:async e=>await l(`gesture`,Ze(e)),drag:async e=>await l(`gesture`,Qe(e)),fling:async e=>await l(`gesture`,Y(e)),swipeGesture:async e=>await l(`gesture`,$e(e)),focus:async e=>await l(`focus`,e),type:async e=>await l(`type`,e),fill:async e=>await l(`fill`,e),scroll:async e=>await l(`scroll`,e),pinch:async e=>await l(`gesture`,et(e)),rotateGesture:async e=>await l(`gesture`,tt(e)),transformGesture:async e=>await l(`gesture`,nt(e)),get:async e=>await l(`get`,e),is:async e=>await l(`is`,e),find:async e=>await l(`find`,e)},replay:{run:async e=>await l(`replay`,e),test:async e=>await l(`test`,e)},batch:{run:async e=>await l(`batch`,e)},observability:{perf:async e=>await l(`perf`,e),logs:async(e={})=>await l(`logs`,e),events:async(e={})=>await l(`events`,e),network:async(e={})=>await l(`network`,e),audio:async(e={})=>await l(`audio`,e)},debug:{symbols:async t=>{let{symbolicateCrashArtifact:n}=await import(`./debug-symbols-facade.js`);return n({cwd:t.cwd??e.cwd,...t})}},recording:{record:async e=>await l(`record`,e),trace:async e=>await l(`trace`,e)},settings:{update:async e=>await l(`settings`,e)}}}function Ze(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`pan`,origin:{x:t,y:n},delta:{x:r,y:i}}}function Qe(e){return{...e,kind:`drag`}}function Y(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function $e(e){return{...e,kind:`swipe`}}function et(e){let{x:t,y:n,...r}=e;return X(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function tt(e){let{x:t,y:n,...r}=e;return X(t,n,`rotate`),{...r,kind:`rotate`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function nt(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`transform`,origin:{x:t,y:n},delta:{x:r,y:i}}}function X(e,t,n){if(e===void 0!=(t===void 0))throw new a(`INVALID_ARGS`,`gesture ${n} center requires both x and y`)}function rt(e,t){let n=h(e,`appBundleId`);return{nodes:Fe(e.nodes),...typeof e.truncated==`boolean`?{truncated:e.truncated}:{},appName:h(e,`appName`),appBundleId:n,...it(e),identifiers:{session:t,appId:n,appBundleId:n}}}function it(e){let t=Z(e.visibility),n=Z(e.unchanged),r=_(e.snapshotDiagnostics);return{...t?{visibility:t}:{},...o(e),...n?{unchanged:n}:{},...r?{snapshotDiagnostics:r}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function Z(e){return f(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:D(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:z(n.session)}}function at(e,t){try{let n=new URL(t.statusUrl),r=Number.parseInt(n.port,10);if(!n.hostname||!Number.isInteger(r))return;let i=t.bridge?void 0:t.iosRuntime.bundleUrl??t.androidRuntime.bundleUrl;W({...$(e),hints:{metroHost:n.hostname,metroPort:r,bundleUrl:i}})}catch{}}function ot(e){try{return Je($(e))}catch{return}}function st(e){if(!e)return;let{metroHost:t,metroPort:n,bundleUrl:r}=e;if(t!==void 0||n!==void 0||r!==void 0)return{metroHost:t,metroPort:n,bundleUrl:r}}function ct(e){try{let t=$(e.config,e.options),n=st(e.runtime);if(n){W({...t,hints:n});return}e.sessionReused||G(t)}catch{}}function lt(e,t){try{G($(e,t))}catch{}}export{J as n,H as r,Xe as t};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { I as PlatformSelector } from "./sdk-contracts.js";
|
|
2
|
+
import { t as AgentDeviceClient } from "./client-types.js";
|
|
3
|
+
import { ToolApprovalStatus, ToolSet } from "ai";
|
|
4
|
+
//#region src/ai-sdk/index.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* `'core'` — the curated perceive/act loop (see the `frameworkTier` pinning
|
|
7
|
+
* test in `src/__tests__/command-descriptor-parity.test.ts`). `'all'`
|
|
8
|
+
* exposes every MCP-exposed command, same set the MCP server surfaces.
|
|
9
|
+
*/
|
|
10
|
+
type AgentDeviceToolSet = 'core' | 'all';
|
|
11
|
+
type CreateAgentDeviceToolsOptions = {
|
|
12
|
+
/**
|
|
13
|
+
* The agent-device session every tool call targets. Required: pinning one
|
|
14
|
+
* session here is what lets the model call these tools without ever seeing
|
|
15
|
+
* (or being able to typo) a session name — mirroring the "keep the client
|
|
16
|
+
* outside tool execution so calls share one named session" guidance in the
|
|
17
|
+
* AI SDK doc.
|
|
18
|
+
*/
|
|
19
|
+
session: string;
|
|
20
|
+
/**
|
|
21
|
+
* When set, pins every tool call to this platform the same way `session` is
|
|
22
|
+
* pinned, and removes `platform` from the tools' input schemas. Omit it to
|
|
23
|
+
* let each call (and the daemon's own default-device selection) decide.
|
|
24
|
+
*/
|
|
25
|
+
platform?: PlatformSelector;
|
|
26
|
+
/** Which tools to build. Defaults to `'core'`. */
|
|
27
|
+
set?: AgentDeviceToolSet;
|
|
28
|
+
/**
|
|
29
|
+
* Per-command approval policy, keyed by command name (e.g. `install`,
|
|
30
|
+
* `close`). Returned as `toolApproval`, ready to pass straight to
|
|
31
|
+
* `ToolLoopAgent`/`generateText`/`streamText` — see
|
|
32
|
+
* https://ai-sdk.dev/docs/agents/tool-approvals. `tool()`'s own
|
|
33
|
+
* `needsApproval` option is deprecated in favor of this, so this factory
|
|
34
|
+
* never sets it.
|
|
35
|
+
*/
|
|
36
|
+
approval?: Partial<Record<string, ToolApprovalStatus>>;
|
|
37
|
+
};
|
|
38
|
+
type AgentDeviceTools = {
|
|
39
|
+
tools: ToolSet;
|
|
40
|
+
client: AgentDeviceClient;
|
|
41
|
+
toolApproval?: Partial<Record<string, ToolApprovalStatus>>;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Builds an AI SDK tool set from the same command registry the MCP server
|
|
45
|
+
* exposes (`listCommandTools()` / `createCommandToolExecutor()`), so the two
|
|
46
|
+
* integrations stay in lockstep without a hand-maintained tool list. Uses
|
|
47
|
+
* `jsonSchema()` against the registry's JSON Schema directly — no zod layer.
|
|
48
|
+
*
|
|
49
|
+
* `ai` is an optional peer dependency, so it is imported lazily here rather
|
|
50
|
+
* than at module scope: importing `agent-device/ai-sdk` itself never
|
|
51
|
+
* requires `ai` to be installed, only calling this function does.
|
|
52
|
+
*
|
|
53
|
+
* The returned `client` is a plain `agent-device` client for the same
|
|
54
|
+
* session, for the host's own setup/teardown (e.g. `client.apps.open(...)`
|
|
55
|
+
* before the loop, `client.sessions.close()` in a `finally`); the tools
|
|
56
|
+
* themselves execute through the registry's own executor, independent of
|
|
57
|
+
* this instance.
|
|
58
|
+
*/
|
|
59
|
+
declare function createAgentDeviceTools(options: CreateAgentDeviceToolsOptions): Promise<AgentDeviceTools>;
|
|
60
|
+
//#endregion
|
|
61
|
+
export { AgentDeviceToolSet, AgentDeviceTools, CreateAgentDeviceToolsOptions, createAgentDeviceTools };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{y as e}from"./sdk-contracts.js";import{n as t}from"./agent-device-client.js";import{y as n}from"./sdk-batch.js";import{i as r,n as i,o as a,r as o}from"./command-tools.js";const s=[`session`,...a];async function c(a){let{jsonSchema:c,tool:f}=await l(),{session:p,platform:m,set:h=`core`,approval:g}=a,_=t({session:p,...m?{lockPlatform:m}:{}}),v=i(),y=new Set(s);m&&y.add(`platform`);let b={};for(let t of o())(h!==`core`||n(t.name)===`core`)&&(b[t.name]=f({description:t.description,inputSchema:c(u(t.inputSchema,y)),...t.outputSchema?{outputSchema:c(t.outputSchema)}:{},execute:async n=>{let i={...d(n,y),session:p,...m?{platform:m}:{}},a=await v.execute(t.name,i);if(a.isError){let t=a.structuredContent,n=r(t);throw new e(t.code,n,t.details)}return a.structuredContent??{}}}));return{tools:b,client:_,...g?{toolApproval:g}:{}}}async function l(){try{return await import(`ai`)}catch(t){throw new e(`MISSING_PEER_DEPENDENCY`,"createAgentDeviceTools() requires the optional peer dependency 'ai'. Install it with `pnpm add ai` (or npm/yarn equivalent).",void 0,t)}}function u(e,t){if(!e.properties)return e;let n=e.required?.filter(e=>!t.has(e));return{...e,properties:d(e.properties,t),...n?{required:n}:{}}}function d(e,t){let n={};for(let[r,i]of Object.entries(e))t.has(r)||(n[r]=i);return n}export{c as createAgentDeviceTools};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=1e4,t=2e3,n=`ALERT_NOT_FOUND`,r=`alert-not-found`,i=[`get`,`accept`,`dismiss`,`wait`];export{e as a,n as i,t as n,r,i as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{y as e}from"./sdk-contracts.js";import{Zt as t}from"./sdk-batch.js";import{a as n,o as r}from"./touch-runtime.js";function i(e){return Object.freeze({captureScreenshot:e.capture})}function a(e,t){return Object.freeze({captureScreenshot:async n=>{await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).screenshot(n.outPath,n.options)}})}function o(e){return a(e.signal,n(e))}function s(e){return a(e.signal,r({...e,operation:`screenshot`}))}function c(e,t){return t.signal===void 0?e:AbortSignal.any([e,t.signal])}function l(e){return Object.freeze({captureSnapshot:e.capture,captureSnapshotWithCustomActions:e.customActions,captureSnapshotWithoutActiveApp:e.withoutActiveApp})}function u(t){let n=async n=>{let r=c(t.signal,n),i={...n.execution,appBundleId:n.options?.appBundleId,signal:r},a=t.ownership===`local`?await t.resolveInteractor(t.device,i):t.resolveInteractor(i);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`Provider-owned snapshot operation has no bound provider interactor.`,{reason:`provider-runtime-interactor-missing`,deviceId:t.device.id});let o=await a.snapshot({...n.options,signal:r});if(!p(o))return o;if(!t.presentIosAcquisition)throw new e(`COMMAND_FAILED`,`Acquired iOS snapshot has no host presentation owner.`,{reason:`ios-snapshot-presenter-missing`,deviceId:t.device.id});return await t.presentIosAcquisition(o,n.options)};return Object.freeze({captureSnapshot:n,captureSnapshotWithCustomActions:n,captureSnapshotWithoutActiveApp:n})}function d(e){return u({...e,ownership:`local`})}function f(e){return u({...e,ownership:`provider`})}function p(e){return`stage`in e&&e.stage===`acquired`}function m(e){return Object.freeze({findText:e.findText,findSelector:e.findSelector})}function h(e){return Object.freeze({setViewport:e.setViewport})}function g(e){return Object.freeze({focusPoint:e.focus})}function _(e,t){return Object.freeze({focusPoint:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).focus(n.point.x,n.point.y)}})}function v(e){return _(e.signal,n(e))}function y(e){return _(e.signal,r({...e,operation:`focus`}))}function b(e){return Object.freeze({performGesturePlan:e.plan,performDirectionalFlingPlan:e.directionalFling,performMultiTouchGesturePlan:e.multiTouch,performTargetAuthoredDrag:e.targetAuthoredDrag,gestureViewport:e.viewport})}function x(e,n,r){let i=async e=>{let i=await S(n,r,e);if(typeof i.performGesture!=`function`)throw t(`Runtime owner advertised gesture execution without an interactor implementation`);return await i.performGesture(e.plan)};return Object.freeze({...e.performGesturePlan.available?{performGesturePlan:i}:{},...e.performDirectionalFlingPlan.available?{performDirectionalFlingPlan:i}:{},...e.performMultiTouchGesturePlan.available?{performMultiTouchGesturePlan:i}:{},...e.performTargetAuthoredDrag.available?{performTargetAuthoredDrag:i}:{},...e.gestureViewport.available?{gestureViewport:async e=>{let i=await S(n,r,e);if(typeof i.gestureViewport!=`function`)throw t(`Runtime owner advertised gestureViewport without an interactor implementation`);return await i.gestureViewport()}}:{}})}async function S(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}function C(e){return x(e.facts,e.signal,n(e))}function w(e){return x(e.facts,e.signal,r({...e,operation:`gesture`}))}function T(e){return Object.freeze({scrollDirection:e.scroll})}function E(e,t){return Object.freeze({scrollDirection:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.target?.appBundleId,signal:e})).scroll(n.direction,n.options))})}function D(e){return E(e.signal,n(e))}function O(e){return E(e.signal,r({...e,operation:`scroll`}))}function k(e){return Object.freeze({typeText:e.type})}function A(e,t){return Object.freeze({typeText:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).type(n.text,n.delayMs))})}function j(e){return A(e.signal,n(e))}function M(e){return A(e.signal,r({...e,operation:`type`}))}function N(e){return typeof e!=`string`||e.trim().length===0?Object.freeze({status:`unreadable`,reason:`no-text-at-point`}):Object.freeze({status:`read`,text:e})}function P(e){return Object.freeze({readTextAtPoint:e.readTextAtPoint})}function F(e){return Object.freeze({readTextAtPoint:async n=>{let r=e.signal;r.throwIfAborted();let i=await e.resolveInteractor(e.device,{...n.execution,appBundleId:n.options?.appBundleId,signal:r});if(typeof i.readTextAtPoint!=`function`)throw t(`Runtime owner advertised readTextAtPoint without an interactor implementation`);return N(await i.readTextAtPoint(n.point,{appBundleId:n.options?.appBundleId,surface:n.options?.surface,signal:r}))}})}function I(e){return Object.freeze({back:e.back})}function ee(e,t){return Object.freeze({back:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).back(n.mode)}})}function L(e){return Object.freeze({home:e.home})}function R(e,t){return Object.freeze({home:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).home()}})}function z(e){return Object.freeze({setOrientation:e.orientation})}function B(e,t){return Object.freeze({setOrientation:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).setOrientation(n.rotation))})}function V(e){return Object.freeze({tvRemote:e.tvRemote})}function H(e,t){return Object.freeze({tvRemote:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).tvRemote(n.button,n.durationMs)}})}function U(e){return Object.freeze({keyboardStatus:e.status,keyboardDismiss:e.dismiss,keyboardEnter:e.enter})}function W(t,n){if(t)return t;throw new e(`COMMAND_FAILED`,`${n} was admitted but its bound interactor has no implementation.`,{reason:`interactor-method-missing`})}async function G(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}const K={keyboardStatus:`keyboard status`,keyboardDismiss:`keyboard dismiss`,keyboardEnter:`keyboard enter`};function q(e,t,n){let r=async r=>{let i=await G(t,n,r);return await W(i[e],K[e]).call(i)};return Object.freeze({[e]:r})}function J(e){return Object.freeze({readClipboard:e.read,writeClipboard:e.write})}async function Y(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}function X(e,t){return Object.freeze({readClipboard:async n=>await(await Y(e,t,n)).readClipboard()})}function Z(e,t){return Object.freeze({writeClipboard:async n=>{await(await Y(e,t,n)).writeClipboard(n.text)}})}function Q(e){return Object.freeze({appSwitcher:e.appSwitcher})}function $(e,t){return Object.freeze({appSwitcher:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).appSwitcher()}})}function te(e){return Object.freeze({triggerAppEvent:e.triggerAppEvent})}function ne(e,t){return Object.freeze({triggerAppEvent:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).open(n.eventUrl,{appBundleId:n.options?.appBundleId})}})}function re(e){return Object.freeze({setSetting:e.setSetting})}function ie(e,t){return Object.freeze({setSetting:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.appBundleId,signal:e})).setSetting(n.setting,n.state,n.appBundleId,n.options))})}function ae(e){return Object.freeze({readAlert:e.read,awaitAlert:e.wait,acceptAlert:e.accept,dismissAlert:e.dismiss})}async function oe(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.appBundleId,signal:e})}function se(e){return{...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs},...e.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...e.surface===void 0?{}:{surface:e.surface}}}function ce(e,t,n){return Object.freeze({[e]:async r=>await(await oe(t,n,r))[e](se(r))})}export{T as A,f as B,F as C,k as D,M as E,y as F,i as G,l as H,g as I,h as L,w as M,b as N,D as O,v as P,m as R,ee as S,j as T,o as U,c as V,s as W,B as _,te as a,L as b,$ as c,J as d,K as f,V as g,H as h,re as i,C as j,O as k,X as l,U as m,ce as n,ne as o,q as p,ie as r,Q as s,ae as t,Z as u,z as v,P as w,I as x,R as y,d as z};
|
|
@@ -1,27 +1,29 @@
|
|
|
1
|
-
import { a as createAndroidPortReverseManager, i as AndroidPortReverseEndpoint, n as AndroidAdbExecutorOptions, r as AndroidAdbProvider, t as AndroidAdbExecutor } from "./sdk-android-adb.js";
|
|
2
1
|
import { t as AppsFilter } from "./app-inventory.js";
|
|
3
|
-
import { a as readAndroidClipboardWithAdb, i as getAndroidKeyboardStatusWithAdb, n as AndroidKeyboardState, o as writeAndroidClipboardWithAdb, r as dismissAndroidKeyboardWithAdb, t as AndroidKeyboardDismissResult } from "./device-input-state.js";
|
|
4
|
-
//#region packages/
|
|
5
|
-
|
|
6
|
-
type AppStateRuntimeResult = Readonly<{
|
|
7
|
-
package?: string;
|
|
8
|
-
activity?: string;
|
|
9
|
-
}>;
|
|
2
|
+
import { a as readAndroidClipboardWithAdb, c as AndroidAdbExecutor, d as AndroidPortReverseEndpoint, f as AndroidPortReverseProvider, i as getAndroidKeyboardStatusWithAdb, l as AndroidAdbExecutorOptions, n as AndroidKeyboardState, o as writeAndroidClipboardWithAdb, r as dismissAndroidKeyboardWithAdb, t as AndroidKeyboardDismissResult, u as AndroidAdbProvider } from "./device-input-state.js";
|
|
3
|
+
//#region packages/platform-android/src/adb-port-reverse.d.ts
|
|
4
|
+
declare function createAndroidPortReverseManager(provider: AndroidAdbProvider | AndroidAdbExecutor): AndroidPortReverseProvider;
|
|
10
5
|
//#endregion
|
|
11
|
-
//#region
|
|
6
|
+
//#region packages/platform-android/src/app-helpers.d.ts
|
|
12
7
|
type AndroidAppListFilter = AppsFilter;
|
|
13
8
|
type AndroidAppListTarget = 'mobile' | 'tv' | 'auto';
|
|
14
9
|
type AndroidAppListOptions = {
|
|
15
10
|
filter?: AndroidAppListFilter;
|
|
16
11
|
target?: AndroidAppListTarget;
|
|
17
12
|
};
|
|
18
|
-
declare function listAndroidAppsWithAdb(adb: AndroidAdbExecutor, options?: AndroidAppListOptions): Promise<Array<{
|
|
13
|
+
declare function listAndroidAppsWithAdb$1(adb: AndroidAdbExecutor, options?: AndroidAppListOptions): Promise<Array<{
|
|
19
14
|
package: string;
|
|
20
15
|
name: string;
|
|
21
16
|
}>>;
|
|
22
|
-
declare function getAndroidAppStateWithAdb(adb: AndroidAdbExecutor): Promise<AppStateRuntimeResult>;
|
|
23
17
|
//#endregion
|
|
24
|
-
//#region
|
|
18
|
+
//#region packages/platform-android/src/logcat.d.ts
|
|
19
|
+
type AndroidLogcatCaptureOptions = {
|
|
20
|
+
lines?: number;
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
signal?: AbortSignal;
|
|
23
|
+
};
|
|
24
|
+
declare function captureAndroidLogcatWithAdb$1(adb: AndroidAdbExecutor, options?: AndroidLogcatCaptureOptions): Promise<string>;
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region packages/platform-android/src/app-control.d.ts
|
|
25
27
|
type AndroidOpenAppWithAdbOptions = {
|
|
26
28
|
activity?: string;
|
|
27
29
|
category?: string;
|
|
@@ -29,12 +31,18 @@ type AndroidOpenAppWithAdbOptions = {
|
|
|
29
31
|
declare function forceStopAndroidAppWithAdb(adb: AndroidAdbExecutor, packageName: string): Promise<void>;
|
|
30
32
|
declare function openAndroidAppWithAdb(adb: AndroidAdbExecutor, packageName: string, options?: AndroidOpenAppWithAdbOptions): Promise<void>;
|
|
31
33
|
//#endregion
|
|
32
|
-
//#region
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
|
|
34
|
+
//#region packages/contracts/src/app-state-runtime.d.ts
|
|
35
|
+
/** Neutral foreground identity returned by a selected platform/provider runtime. */
|
|
36
|
+
type AppStateRuntimeResult = Readonly<{
|
|
37
|
+
package?: string;
|
|
38
|
+
activity?: string;
|
|
39
|
+
}>;
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region packages/platform-android/src/mechanics.d.ts
|
|
42
|
+
declare function listAndroidAppsWithAdb(...args: Parameters<typeof listAndroidAppsWithAdb$1>): Promise<Awaited<ReturnType<typeof listAndroidAppsWithAdb$1>>>;
|
|
43
|
+
declare function captureAndroidLogcatWithAdb(...args: Parameters<typeof captureAndroidLogcatWithAdb$1>): Promise<Awaited<ReturnType<typeof captureAndroidLogcatWithAdb$1>>>;
|
|
44
|
+
//#endregion
|
|
45
|
+
//#region src/sdk/android-adb.d.ts
|
|
46
|
+
declare function getAndroidAppStateWithAdb(adb: AndroidAdbExecutor, signal?: AbortSignal): Promise<AppStateRuntimeResult>;
|
|
39
47
|
//#endregion
|
|
40
48
|
export { type AndroidAdbExecutor, type AndroidAdbExecutorOptions, type AndroidAdbProvider, type AndroidKeyboardDismissResult, type AndroidKeyboardState, type AndroidPortReverseEndpoint, captureAndroidLogcatWithAdb, createAndroidPortReverseManager, dismissAndroidKeyboardWithAdb, forceStopAndroidAppWithAdb, getAndroidAppStateWithAdb, getAndroidKeyboardStatusWithAdb, listAndroidAppsWithAdb, openAndroidAppWithAdb, readAndroidClipboardWithAdb, writeAndroidClipboardWithAdb };
|
package/dist/src/android-adb.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import"./platform-runtime-android-adb-host.js";import{d as e}from"./adb-executor.js";import{_ as t,d as n,h as r,n as i,p as a,t as o,v as s,y as c}from"./mechanics.js";async function l(e,t){let{getAndroidAppStateWithAdb:n}=await import(`./platform-runtime.js`).then(e=>e.a);return await n(e,t)}export{o as captureAndroidLogcatWithAdb,e as createAndroidPortReverseManager,n as dismissAndroidKeyboardWithAdb,s as forceStopAndroidAppWithAdb,l as getAndroidAppStateWithAdb,a as getAndroidKeyboardStatusWithAdb,i as listAndroidAppsWithAdb,c as openAndroidAppWithAdb,r as readAndroidClipboardWithAdb,t as writeAndroidClipboardWithAdb};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as e}from"./sdk-contracts.js";import{Lr as t,Tr as n,jr as r}from"./sdk-batch.js";import{n as i,t as a}from"./rect-center.js";const o=new WeakMap;function s(e,t){return o.set(e,{...o.get(e),...t}),e}function c(e,t){return s(e,{clickability:t})}function l(e){return e?o.get(e)?.clickability:void 0}function u(e,t){let n=l(e);return n?c(t,n):t}function d(e,t){return s(e,{occlusionContext:t})}function f(e){return e?o.get(e)?.occlusionContext:void 0}const p=[`tabbar`,`toolbar`,`navigationbar`,`bottomnavigation`,`bottomnavigationview`,`sheet`,`dialog`,`alert`,`popover`,`menu`],m=[`tabbar`,`toolbar`,`navigationbar`],h=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`edittext`,`checkbox`,`radio`,`switch`,`cell`];function g(e,t={}){if(e.length<2)return e;let n=new Map(e.map(e=>[e.index,e])),r={nodes:e,byIndex:n,overlayPositions:e.flatMap((e,r)=>E(e,n,t)?[r]:[]),coverCache:new Map},i=[];for(let[n,a]of e.entries())T(a)&&b(r,n,a,t)&&i.push(n);return v(e,i)}function _(e,t){let n=[];for(let[r,i]of e.entries())T(i)&&t(i)&&n.push(r);return v(e,n)}function v(e,t){if(t.length===0)return e;let n=[...e];for(let r of t){let t=e[r];n[r]={...t,hittable:!1,interactionBlocked:`covered`,presentationHints:L(t.presentationHints)}}return n}function y(e){return e.interactionBlocked!==void 0}function b(t,n,r,i){let a=t.coverCache.get(n);if(a!==void 0)return a;t.coverCache.set(n,null);let o=I(r.rect);if(!o)return S(t,n,null);let s=e(o),c=i.isAdditionalOverlayNode?.(r)===!0;for(let e of t.overlayPositions){if(!x(t,e,n,c,i))continue;let a=t.nodes[e];if(C(t,e,r,o,s,i))return S(t,n,a)}return S(t,n,null)}function x(e,t,n,r,i){let a=e.nodes[t];return a?t>n?!0:t===n||r?!1:i.isAdditionalOverlayNode?.(a)===!0:!1}function S(e,t,n){return e.coverCache.set(t,n),n}function C(e,n,r,i,a,o){if(!e.nodes[n])return!1;let s=w(e,n,r,i,o);return!!(s&&t(s,a.x,a.y))}function w(e,t,n,r,i){let o=e.nodes[t];if(!o||!E(o,e.byIndex,i)||P(n,o,e.byIndex))return null;let s=I(o.rect);return!s||a(r,s)||b(e,t,o,i)?null:s}function T(e){return I(e.rect)?e.hittable===!0||j(e)?!0:!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()):!1}function E(e,t,r){return!I(e.rect)||n(e)||D(e,t)?!1:M(e,p)||O(e,t,r)}function D(e,t){if(!M(e,m))return!1;let r=I(e.rect);if(!r)return!1;let i=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,o=new Set;for(;i&&!o.has(i.index);){if(n(i)){let e=I(i.rect);return!!(e&&a(r,e))}o.add(i.index),i=typeof i.parentIndex==`number`?t.get(i.parentIndex):void 0}return!1}function O(e,t,n){return n.isAdditionalOverlayNode?.(e)===!0&&!k(e,t,n)}function k(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(A(r,n))return!0;i.add(r.index),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}function A(e,t){return t.isAdditionalOverlayNode?.(e)===!0&&I(e.rect)!==null&&!n(e)}function j(e){return M(e,h)}function M(e,t){let n=N(e);return t.some(e=>n.includes(e))}function N(e){return[e.type,e.role,e.subrole].map(e=>r(e??``)).join(` `)}function P(e,t,n){return F(e,t,n)||F(t,e,n)}function F(e,t,n){let r=typeof t.parentIndex==`number`?n.get(t.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(r.index===e.index)return!0;i.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}return!1}function I(e){let t=i(e);return t&&t.width>0&&t.height>0?t:null}function L(e){return Array.from(new Set([...e??[],`covered`]))}const R=new Set([`com.google.android.inputmethod.latin`,`com.samsung.android.honeyboard`,`com.touchtype.swiftkey`,`com.microsoft.swiftkey`]);function z(e){let t=J(e.packageName),n=(e.resourceId??``).toLowerCase(),r=J(e.activeInputMethodPackage);if(t&&r&&t===r)return{inputMethodOwned:!0,source:`active-input-method`};if(r&&n.startsWith(`${r}:id/`))return{inputMethodOwned:!0,source:`active-input-method-resource`};if(t&&R.has(t))return{inputMethodOwned:!0,source:`known-ime-package`};for(let e of R)if(n.startsWith(`${e}:id/`))return{inputMethodOwned:!0,source:`known-ime-resource`};return{inputMethodOwned:!1,source:`app`}}function B(e,t,n){return z({packageName:e,resourceId:t,activeInputMethodPackage:n}).inputMethodOwned}function V(e){return z(e).inputMethodOwned}function H(e){return V({packageName:e.bundleId,resourceId:e.identifier})}function U(e){let t=J(e);return!!(t&&R.has(t))}function W(e){let t=(e??``).toLowerCase();for(let e of R)if(t.startsWith(`${e}:id/`))return!0;return!1}function G(e,t,n){return!e&&!t?`unknown`:B(e,t,n)?`ime`:`app`}function K(e){for(let t of[/\bmCurMethodId=([^\s]+)/i,/\bmCurId=([^\s]+)/i,/\bmCurrentInputMethodId=([^\s]+)/i,/\bcurMethodId=([^\s]+)/i]){let n=q(e.match(t)?.[1]);if(n)return n}}function q(e){let t=(e??``).trim();if(t)return J((t.split(`/`)[0]??``).match(/[a-zA-Z0-9_.]+/)?.[0])}function J(e){return(e??``).trim().toLowerCase()||void 0}export{W as a,_ as c,d,u as f,U as i,y as l,f as m,H as n,K as o,l as p,V as r,g as s,G as t,c as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=new Set([`empty-helper-output`,`system-window-only`,`content-poor-app-window`]);function t(t){return typeof t==`string`&&e.has(t)}function n(e){if(!e||typeof e!=`object`)return!1;let n=e.details?.androidSnapshotHelperFailureReason;return t(n)}const r=new Set([`accessibility-timeout`]);function i(e){return typeof e==`string`&&r.has(e)}function a(e){if(!e||typeof e!=`object`)return;let t=e.details?.androidCaptureFailureReason;return i(t)?t:void 0}const o=`com.android.systemui`;function s(e){let t=e??``;if(!t.startsWith(`com.android.systemui:id/`))return!1;let n=t.slice(`${o}:id/`.length);return/(^|_)(status_bar|navigation_bar)(_|$)/.test(n)}function c(e){return`systemChrome`in e&&e.systemChrome===!0}function l(e){if(!c(e))return e;let{systemChrome:t,...n}=e;return n}function u(e){return e.some(c)?e.map(l):e}export{l as a,u as i,c as n,n as o,s as r,a as s,o as t};
|
package/dist/src/android.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{c as t}from"./diagnostics.js";import"./diagnostics2.js";import"./platform-runtime-android-adb-host.js";import{u as n}from"./adb-executor.js";import{A as r,C as i,D as a,E as o,M as s,O as c,S as l,T as u,a as d,b as f,c as p,f as m,g as h,i as g,j as _,k as v,l as y,m as b,o as x,s as S,u as C,w,x as T}from"./mechanics.js";import{a as E,i as D,n as O}from"./app-lifecycle.js";import{n as k}from"./scoped-provider.js";import{t as A}from"./snapshot-state.js";var j=e({createAndroidInteractor:()=>N});function M(e){return e?`daemon-session`:`command`}function N(e,j,N){let P=M(N?.appBundleId),F=t=>({...t===void 0?{}:{timeoutMs:t},captureNodes:async()=>{let t=await p(e,{includeHiddenContentHints:!1});return A(y(t),void 0).nodes}}),I={open:(t,n)=>D(e,t,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:n?.launchArgs,url:n?.url}),openDevice:()=>E(e),close:t=>O(e,t),tap:(t,n)=>o(e,t,n),doubleTap:async(t,n)=>{await o(e,t,n),await o(e,t,n)},longPress:(t,n,r)=>u(e,t,n,r),focus:(t,n)=>i(e,t,n),type:(t,n)=>d(e,t,n),fill:(t,n,r,i)=>g(e,t,n,r,i,{helperSessionScope:P}),scroll:(t,n)=>v(e,t,{...n,helperSessionScope:P}),performGesture:t=>_(e,t),gestureViewport:()=>s(e,{helperSessionScope:P}),screenshot:(t,n)=>x(e,t,n),readTextAtPoint:async(t,n)=>{let{readAndroidTextAtPoint:r}=await import(`./mechanics.js`).then(e=>e.r);return await r(e,t.x,t.y,{helperSessionScope:M(n?.appBundleId)})??void 0},snapshot:async n=>{let r=n??{},i=await t(`snapshot_capture`,async()=>await p(e,{appBundleId:r.appBundleId,signal:r.signal??N?.signal,interactiveOnly:r.interactiveOnly,depth:r.depth,scope:r.scope,raw:r.raw,includeHiddenContentHints:r.includeHiddenContentHints,helperSessionScope:M(r.appBundleId)}),{backend:`android`});return y(i)},back:t=>l(e),home:()=>w(e),setOrientation:t=>r(e,t),appSwitcher:()=>T(e),tvRemote:(t,n)=>c(e,t,n),keyboardStatus:async()=>({kind:`ime-probe`,...await m(e)}),keyboardDismiss:async()=>({kind:`ime-probe`,...await C(e)}),keyboardEnter:async()=>(await a(e),{kind:`android-acknowledged`}),readClipboard:()=>b(e),writeClipboard:t=>h(e,t),setSetting:(t,n,r,i)=>S(e,t,n,r,i),readAlert:async()=>await f(e,`get`,F()),awaitAlert:async t=>await f(e,`wait`,F(t?.timeoutMs)),acceptAlert:async()=>await f(e,`accept`,F()),dismissAlert:async()=>await f(e,`dismiss`,F())};return j?k(I,t=>n(j,{serial:e.id},t)):I}export{N as n,j as t};
|
package/dist/src/api.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{a as e,i as t,t as n}from"./rolldown-runtime.js";import{a as r,i,r as a}from"./ios-client.js";import{promises as o}from"fs";import s from"os";import c,{basename as l}from"path";import u,{createHash as d}from"crypto";function f(e,t,n,r,i){if(r===`m`)throw TypeError(`Private method is not writable`);if(r===`a`&&!i)throw TypeError(`Private accessor was defined without a setter`);if(typeof t==`function`?e!==t||!i:!t.has(e))throw TypeError(`Cannot write private member to an object whose class did not declare it`);return r===`a`?i.call(e,n):i?i.value=n:t.set(e,n),n}function p(e,t,n,r){if(n===`a`&&!r)throw TypeError(`Private accessor was defined without a getter`);if(typeof t==`function`?e!==t||!r:!t.has(e))throw TypeError(`Cannot read private member from an object whose class did not declare it`);return n===`m`?r:n===`a`?r.call(e):r?r.value:t.get(e)}let m=function(){let{crypto:e}=globalThis;if(e?.randomUUID)return m=e.randomUUID.bind(e),e.randomUUID();let t=new Uint8Array(1),n=e?()=>e.getRandomValues(t)[0]:()=>Math.random()*255&255;return`10000000-1000-4000-8000-100000000000`.replace(/[018]/g,e=>(e^n()&15>>e/4).toString(16))};function h(e){return typeof e==`object`&&!!e&&(`name`in e&&e.name===`AbortError`||`message`in e&&String(e.message).includes(`FetchRequestCanceledException`))}const g=e=>{if(e instanceof Error)return e;if(typeof e==`object`&&e){try{if(Object.prototype.toString.call(e)===`[object Error]`){let t=Error(e.message,e.cause?{cause:e.cause}:{});return e.stack&&(t.stack=e.stack),e.cause&&!t.cause&&(t.cause=e.cause),e.name&&(t.name=e.name),t}}catch{}try{return Error(JSON.stringify(e))}catch{}}return Error(e)};var _=class extends Error{},v=class e extends _{constructor(t,n,r,i){super(`${e.makeMessage(t,n,r)}`),this.status=t,this.headers=i,this.error=n}static makeMessage(e,t,n){let r=t?.message?typeof t.message==`string`?t.message:JSON.stringify(t.message):t?JSON.stringify(t):n;return e&&r?`${e} ${r}`:e?`${e} status code (no body)`:r||`(no status code or body)`}static generate(t,n,r,i){if(!t||!i)return new b({message:r,cause:g(n)});let a=n;return t===400?new S(t,a,r,i):t===401?new C(t,a,r,i):t===403?new w(t,a,r,i):t===404?new T(t,a,r,i):t===409?new E(t,a,r,i):t===422?new D(t,a,r,i):t===429?new O(t,a,r,i):t>=500?new k(t,a,r,i):new e(t,a,r,i)}},y=class extends v{constructor({message:e}={}){super(void 0,void 0,e||`Request was aborted.`,void 0)}},b=class extends v{constructor({message:e,cause:t}){super(void 0,void 0,e||`Connection error.`,void 0),t&&(this.cause=t)}},x=class extends b{constructor({message:e}={}){super({message:e??`Request timed out.`})}},S=class extends v{},C=class extends v{},w=class extends v{},T=class extends v{},E=class extends v{},D=class extends v{},O=class extends v{},k=class extends v{};const A=/^[a-z][a-z0-9+.-]*:/i,ee=e=>A.test(e);let j=e=>(j=Array.isArray,j(e)),M=j;function N(e){return typeof e==`object`?e??{}:{}}function P(e){if(!e)return!0;for(let t in e)return!1;return!0}function te(e,t){return Object.prototype.hasOwnProperty.call(e,t)}const ne=(e,t)=>{if(typeof t!=`number`||!Number.isInteger(t))throw new _(`${e} must be an integer`);if(t<0)throw new _(`${e} must be a positive integer`);return t},re=e=>{try{return JSON.parse(e)}catch{return}},ie=e=>new Promise(t=>setTimeout(t,e)),F=`0.24.5`;function ae(){return typeof Deno<`u`&&Deno.build!=null?`deno`:typeof EdgeRuntime<`u`?`edge`:Object.prototype.toString.call(globalThis.process===void 0?0:globalThis.process)===`[object process]`?`node`:`unknown`}const oe=()=>{let e=ae();if(e===`deno`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":F,"X-Stainless-OS":le(Deno.build.os),"X-Stainless-Arch":ce(Deno.build.arch),"X-Stainless-Runtime":`deno`,"X-Stainless-Runtime-Version":typeof Deno.version==`string`?Deno.version:Deno.version?.deno??`unknown`};if(typeof EdgeRuntime<`u`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":F,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":`edge`,"X-Stainless-Runtime-Version":globalThis.process.version};if(e===`node`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":F,"X-Stainless-OS":le(globalThis.process.platform??`unknown`),"X-Stainless-Arch":ce(globalThis.process.arch??`unknown`),"X-Stainless-Runtime":`node`,"X-Stainless-Runtime-Version":globalThis.process.version??`unknown`};let t=se();return t?{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":F,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`unknown`,"X-Stainless-Runtime":`browser:${t.browser}`,"X-Stainless-Runtime-Version":t.version}:{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":F,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`unknown`,"X-Stainless-Runtime":`unknown`,"X-Stainless-Runtime-Version":`unknown`}};function se(){if(typeof navigator>`u`||!navigator)return null;for(let{key:e,pattern:t}of[{key:`edge`,pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`ie`,pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`ie`,pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`chrome`,pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`firefox`,pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`safari`,pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}]){let n=t.exec(navigator.userAgent);if(n)return{browser:e,version:`${n[1]||0}.${n[2]||0}.${n[3]||0}`}}return null}const ce=e=>e===`x32`?`x32`:e===`x86_64`||e===`x64`?`x64`:e===`arm`?`arm`:e===`aarch64`||e===`arm64`?`arm64`:e?`other:${e}`:`unknown`,le=e=>(e=e.toLowerCase(),e.includes(`ios`)?`iOS`:e===`android`?`Android`:e===`darwin`?`MacOS`:e===`win32`?`Windows`:e===`freebsd`?`FreeBSD`:e===`openbsd`?`OpenBSD`:e===`linux`?`Linux`:e?`Other:${e}`:`Unknown`);let ue;const de=()=>ue??=oe();function fe(){if(typeof fetch<`u`)return r.fetch;throw Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Limrun({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function pe(...e){let t=globalThis.ReadableStream;if(t===void 0)throw Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new t(...e)}function me(e){let t=Symbol.asyncIterator in e?e[Symbol.asyncIterator]():e[Symbol.iterator]();return pe({start(){},async pull(e){let{done:n,value:r}=await t.next();n?e.close():e.enqueue(r)},async cancel(){await t.return?.()}})}async function he(e){if(typeof e!=`object`||!e)return;if(e[Symbol.asyncIterator]){await e[Symbol.asyncIterator]().return?.();return}let t=e.getReader(),n=t.cancel();t.releaseLock(),await n}const ge=({headers:e,body:t})=>({bodyHeaders:{"content-type":`application/json`},body:JSON.stringify(t)});function _e(e){return Object.entries(e).filter(([e,t])=>t!==void 0).map(([e,t])=>{if(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)return`${encodeURIComponent(e)}=${encodeURIComponent(t)}`;if(t===null)return`${encodeURIComponent(e)}=`;throw new _(`Cannot stringify type ${typeof t}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join(`&`)}const I={off:0,error:200,warn:300,info:400,debug:500},ve=(e,t,n)=>{if(e){if(te(I,e))return e;z(n).warn(`${t} was set to ${JSON.stringify(e)}, expected one of ${JSON.stringify(Object.keys(I))}`)}};function L(){}function R(e,t,n){return!t||I[e]>I[n]?L:t[e].bind(t)}const ye={error:L,warn:L,info:L,debug:L};let be=new WeakMap;function z(e){let t=e.logger,n=e.logLevel??`off`;if(!t)return ye;let r=be.get(t);if(r&&r[0]===n)return r[1];let i={error:R(`error`,t,n),warn:R(`warn`,t,n),info:R(`info`,t,n),debug:R(`debug`,t,n)};return be.set(t,[n,i]),i}const B=e=>(e.options&&(e.options={...e.options},delete e.options.headers),e.headers&&=Object.fromEntries((e.headers instanceof Headers?[...e.headers]:Object.entries(e.headers)).map(([e,t])=>[e,e.toLowerCase()===`authorization`||e.toLowerCase()===`cookie`||e.toLowerCase()===`set-cookie`?`***`:t])),`retryOfRequestLogID`in e&&(e.retryOfRequestLogID&&(e.retryOf=e.retryOfRequestLogID),delete e.retryOfRequestLogID),e);async function xe(e,t){let{response:n,requestLogID:r,retryOfRequestLogID:i,startTime:a}=t,o=await(async()=>{if(n.status===204)return null;if(t.options.__binaryResponse)return n;let e=n.headers.get(`content-type`)?.split(`;`)[0]?.trim();return e?.includes(`application/json`)||e?.endsWith(`+json`)?n.headers.get(`content-length`)===`0`?void 0:await n.json():await n.text()})();return z(e).debug(`[${r}] response parsed`,B({retryOfRequestLogID:i,url:n.url,status:n.status,body:o,durationMs:Date.now()-a})),o}var V,Se=class e extends Promise{constructor(e,t,n=xe){super(e=>{e(null)}),this.responsePromise=t,this.parseResponse=n,V.set(this,void 0),f(this,V,e,`f`)}_thenUnwrap(t){return new e(p(this,V,`f`),this.responsePromise,async(e,n)=>t(await this.parseResponse(e,n),n))}asResponse(){return this.responsePromise.then(e=>e.response)}async withResponse(){let[e,t]=await Promise.all([this.parse(),this.asResponse()]);return{data:e,response:t}}parse(){return this.parsedPromise||=this.responsePromise.then(e=>this.parseResponse(p(this,V,`f`),e)),this.parsedPromise}then(e,t){return this.parse().then(e,t)}catch(e){return this.parse().catch(e)}finally(e){return this.parse().finally(e)}};V=new WeakMap;var H,Ce=class{constructor(e,t,n,r){H.set(this,void 0),f(this,H,e,`f`),this.options=r,this.response=t,this.body=n}hasNextPage(){return this.getPaginatedItems().length?this.nextPageRequestOptions()!=null:!1}async getNextPage(){let e=this.nextPageRequestOptions();if(!e)throw new _("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await p(this,H,`f`).requestAPIList(this.constructor,e)}async*iterPages(){let e=this;for(yield e;e.hasNextPage();)e=await e.getNextPage(),yield e}async*[(H=new WeakMap,Symbol.asyncIterator)](){for await(let e of this.iterPages())for(let t of e.getPaginatedItems())yield t}},we=class extends Se{constructor(e,t,n){super(e,t,async(e,t)=>new n(e,t.response,await xe(e,t),t.options))}async*[Symbol.asyncIterator](){let e=await this;for await(let t of e)yield t}},U=class extends Ce{constructor(e,t,n,r){super(e,t,n,r),this.items=n||[]}getPaginatedItems(){return this.items??[]}nextPageRequestOptions(){let e=this.getPaginatedItems();if(!(typeof this.options.query==`object`&&`endingBefore`in(this.options.query||{}))){let t=e[e.length-1]?.metadata.id;return t?{...this.options,query:{...N(this.options.query),startingAfter:t}}:null}let t=e[0]?.metadata.id;return t?{...this.options,query:{...N(this.options.query),endingBefore:t}}:null}};const Te=()=>{if(typeof File>`u`){let{process:e}=globalThis,t=typeof e?.versions?.node==`string`&&parseInt(e.versions.node.split(`.`))<20;throw Error("`File` is not defined as a global, which is required for file uploads."+(t?" Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`.":``))}};function W(e,t,n){return Te(),new File(e,t??`unknown_file`,n)}function Ee(e){return(typeof e==`object`&&!!e&&(`name`in e&&e.name&&String(e.name)||`url`in e&&e.url&&String(e.url)||`filename`in e&&e.filename&&String(e.filename)||`path`in e&&e.path&&String(e.path))||``).split(/[\\/]/).pop()||void 0}const De=e=>typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`,Oe=e=>typeof e==`object`&&!!e&&typeof e.size==`number`&&typeof e.type==`string`&&typeof e.text==`function`&&typeof e.slice==`function`&&typeof e.arrayBuffer==`function`,ke=e=>typeof e==`object`&&!!e&&typeof e.name==`string`&&typeof e.lastModified==`number`&&Oe(e),Ae=e=>typeof e==`object`&&!!e&&typeof e.url==`string`&&typeof e.blob==`function`;async function je(e,t,n){if(Te(),e=await e,ke(e))return e instanceof File?e:W([await e.arrayBuffer()],e.name);if(Ae(e)){let r=await e.blob();return t||=new URL(e.url).pathname.split(/[\\/]/).pop(),W(await G(r),t,n)}let r=await G(e);if(t||=Ee(e),!n?.type){let e=r.find(e=>typeof e==`object`&&`type`in e&&e.type);typeof e==`string`&&(n={...n,type:e})}return W(r,t,n)}async function G(e){let t=[];if(typeof e==`string`||ArrayBuffer.isView(e)||e instanceof ArrayBuffer)t.push(e);else if(Oe(e))t.push(e instanceof Blob?e:await e.arrayBuffer());else if(De(e))for await(let n of e)t.push(...await G(n));else{let t=e?.constructor?.name;throw Error(`Unexpected data type: ${typeof e}${t?`; constructor: ${t}`:``}${Me(e)}`)}return t}function Me(e){return typeof e!=`object`||!e?``:`; props: [${Object.getOwnPropertyNames(e).map(e=>`"${e}"`).join(`, `)}]`}var K=class{constructor(e){this._client=e}};const Ne=Symbol(`brand.privateNullableHeaders`);function*Pe(e){if(!e)return;if(Ne in e){let{values:t,nulls:n}=e;yield*t.entries();for(let e of n)yield[e,null];return}let t=!1,n;e instanceof Headers?n=e.entries():M(e)?n=e:(t=!0,n=Object.entries(e??{}));for(let e of n){let n=e[0];if(typeof n!=`string`)throw TypeError(`expected header name to be a string`);let r=M(e[1])?e[1]:[e[1]],i=!1;for(let e of r)e!==void 0&&(t&&!i&&(i=!0,yield[n,null]),yield[n,e])}}const q=e=>{let t=new Headers,n=new Set;for(let r of e){let e=new Set;for(let[i,a]of Pe(r)){let r=i.toLowerCase();e.has(r)||(t.delete(i),e.add(r)),a===null?(t.delete(i),n.add(r)):(t.append(i,a),n.delete(r))}}return{[Ne]:!0,values:t,nulls:n}};function Fe(e){return e.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}const Ie=Object.freeze(Object.create(null)),J=((e=Fe)=>function(t,...n){if(t.length===1)return t[0];let r=!1,i=[],a=t.reduce((t,a,o)=>{/[?#]/.test(a)&&(r=!0);let s=n[o],c=(r?encodeURIComponent:e)(``+s);return o!==n.length&&(s==null||typeof s==`object`&&s.toString===Object.getPrototypeOf(Object.getPrototypeOf(s.hasOwnProperty??Ie)??Ie)?.toString)&&(c=s+``,i.push({start:t.length+a.length,length:c.length,error:`Value of type ${Object.prototype.toString.call(s).slice(8,-1)} is not a valid path parameter`})),t+a+(o===n.length?``:c)},``),o=a.split(/[?#]/,1)[0],s=/(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi,c;for(;(c=s.exec(o))!==null;)i.push({start:c.index,length:c[0].length,error:`Value "${c[0]}" can\'t be safely passed as a path parameter`});if(i.sort((e,t)=>e.start-t.start),i.length>0){let e=0,t=i.reduce((t,n)=>{let r=` `.repeat(n.start-e),i=`^`.repeat(n.length);return e=n.start+n.length,t+r+i},``);throw new _(`Path parameters result in path with invalid segments:\n${i.map(e=>e.error).join(`
|
|
2
|
+
`)}\n${a}\n${t}`)}return a})(Fe);var Le=class extends K{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/android_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/android_instances`,U,{query:e,...t})}delete(e,t){return this._client.delete(J`/v1/android_instances/${e}`,{...t,headers:q([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(J`/v1/android_instances/${e}`,t)}},Re=class extends K{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/ios_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/ios_instances`,U,{query:e,...t})}delete(e,t){return this._client.delete(J`/v1/ios_instances/${e}`,{...t,headers:q([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(J`/v1/ios_instances/${e}`,t)}},ze=class extends K{list(e={},t){return this._client.get(`/v1/assets`,{query:e,...t})}delete(e,t){return this._client.delete(J`/v1/assets/${e}`,{...t,headers:q([{Accept:`*/*`},t?.headers])})}get(e,t={},n){return this._client.get(J`/v1/assets/${e}`,{query:t,...n})}getOrCreate(e,t){return this._client.put(`/v1/assets`,{body:e,...t})}},Be=class extends ze{async getOrUpload(e,t){let n=await this.getOrCreate({name:e.name??l(e.path)},t),i=await o.readFile(e.path),a=d(`md5`).update(i).digest(`hex`);if(n.md5&&n.md5===a)return{id:n.id,name:n.name,signedDownloadUrl:n.signedDownloadUrl,md5:n.md5};let s=await r.fetch(n.signedUploadUrl,{headers:{"Content-Length":i.length.toString(),"Content-Type":`application/octet-stream`},method:`PUT`,body:i});if(s.status!==200)throw Error(`Failed to upload asset: ${s.status} ${await s.text()}`);return{id:n.id,name:n.name,signedDownloadUrl:n.signedDownloadUrl,md5:a}}},Ve=class extends K{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/xcode_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/xcode_instances`,U,{query:e,...t})}delete(e,t){return this._client.delete(J`/v1/xcode_instances/${e}`,{...t,headers:q([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(J`/v1/xcode_instances/${e}`,t)}},He=n((e=>{Object.defineProperty(e,"__esModule",{value:!0});var t=class extends Error{constructor(e,t){super(e),this.name=`ParseError`,this.type=t.type,this.field=t.field,this.value=t.value,this.line=t.line}};function n(e){}function r(e){if(typeof e==`function`)throw TypeError("`config` must be an object, got a function instead. Did you mean `createParser({onEvent: fn})`?");let{onEvent:r=n,onError:o=n,onRetry:s=n,onComment:c,maxBufferSize:l}=e,u=[],d=0,f=!0,p,m=``,h=0,g,_=!1;function v(e){if(_)throw Error("Cannot feed parser: it was terminated after exceeding the configured max buffer size. Call `reset()` to resume parsing.");if(f&&(f=!1,e.charCodeAt(0)===239&&e.charCodeAt(1)===187&&e.charCodeAt(2)===191&&(e=e.slice(3))),u.length===0){let t=b(e);t!==``&&(u.push(t),d=t.length),y();return}if(e.indexOf(`
|
|
3
|
+
`)===-1&&e.indexOf(`\r`)===-1){u.push(e),d+=e.length,y();return}u.push(e);let t=u.join(``);u.length=0,d=0;let n=b(t);n!==``&&(u.push(n),d=n.length),y()}function y(){l!==void 0&&(d+m.length<=l||(_=!0,u.length=0,d=0,p=void 0,m=``,h=0,g=void 0,o(new t(`Buffered data exceeded max buffer size of ${l} characters`,{type:`max-buffer-size-exceeded`}))))}function b(e){let t=0;if(e.indexOf(`\r`)===-1){let n=e.indexOf(`
|
|
4
|
+
`,t);for(;n!==-1;){if(t===n){h>0&&r({id:p,event:g,data:m}),p=void 0,m=``,h=0,g=void 0,t=n+1,n=e.indexOf(`
|
|
5
|
+
`,t);continue}let o=e.charCodeAt(t);if(i(e,t,o)){let i=e.charCodeAt(t+5)===32?t+6:t+5,a=e.slice(i,n);if(h===0&&e.charCodeAt(n+1)===10){r({id:p,event:g,data:a}),p=void 0,m=``,g=void 0,t=n+2,n=e.indexOf(`
|
|
6
|
+
`,t);continue}m=h===0?a:`${m}
|
|
7
|
+
${a}`,h++}else a(e,t,o)?g=e.slice(e.charCodeAt(t+6)===32?t+7:t+6,n)||void 0:x(e,t,n);t=n+1,n=e.indexOf(`
|
|
8
|
+
`,t)}return e.slice(t)}for(;t<e.length;){let n=e.indexOf(`\r`,t),r=e.indexOf(`
|
|
9
|
+
`,t),i=-1;if(n!==-1&&r!==-1?i=n<r?n:r:n===-1?r!==-1&&(i=r):i=n===e.length-1?-1:n,i===-1)break;x(e,t,i),t=i+1,e.charCodeAt(t-1)===13&&e.charCodeAt(t)===10&&t++}return e.slice(t)}function x(e,t,n){if(t===n){C();return}let r=e.charCodeAt(t);if(i(e,t,r)){let r=e.charCodeAt(t+5)===32?t+6:t+5,i=e.slice(r,n);m=h===0?i:`${m}
|
|
10
|
+
${i}`,h++;return}if(a(e,t,r)){g=e.slice(e.charCodeAt(t+6)===32?t+7:t+6,n)||void 0;return}if(r===105&&e.charCodeAt(t+1)===100&&e.charCodeAt(t+2)===58){let r=e.slice(e.charCodeAt(t+3)===32?t+4:t+3,n);p=r.includes(`\0`)?void 0:r;return}if(r===58){if(c){let r=e.slice(t,n);c(r.slice(e.charCodeAt(t+1)===32?2:1))}return}let o=e.slice(t,n),s=o.indexOf(`:`);if(s===-1){S(o,``,o);return}let l=o.slice(0,s),u=o.charCodeAt(s+1)===32?2:1;S(l,o.slice(s+u),o)}function S(e,n,r){switch(e){case`event`:g=n||void 0;break;case`data`:m=h===0?n:`${m}
|
|
11
|
+
${n}`,h++;break;case`id`:p=n.includes(`\0`)?void 0:n;break;case`retry`:/^\d+$/.test(n)?s(parseInt(n,10)):o(new t(`Invalid \`retry\` value: "${n}"`,{type:`invalid-retry`,value:n,line:r}));break;default:o(new t(`Unknown field "${e.length>20?`${e.slice(0,20)}\u2026`:e}"`,{type:`unknown-field`,field:e,value:n,line:r}))}}function C(){h>0&&r({id:p,event:g,data:m}),p=void 0,m=``,h=0,g=void 0}function w(e={}){if(e.consume&&u.length>0){let e=u.join(``);x(e,0,e.length)}f=!0,p=void 0,m=``,h=0,g=void 0,u.length=0,d=0,_=!1}return{feed:v,reset:w}}function i(e,t,n){return n===100&&e.charCodeAt(t+1)===97&&e.charCodeAt(t+2)===116&&e.charCodeAt(t+3)===97&&e.charCodeAt(t+4)===58}function a(e,t,n){return n===101&&e.charCodeAt(t+1)===118&&e.charCodeAt(t+2)===101&&e.charCodeAt(t+3)===110&&e.charCodeAt(t+4)===116&&e.charCodeAt(t+5)===58}e.ParseError=t,e.createParser=r}));const Ue=e(n((e=>{Object.defineProperty(e,"__esModule",{value:!0});var n=t(`node:stream`),r=He();let i=`connecting`,a=`open`,o=`closed`,s=()=>{};function c(e,{getStream:t}){let n=typeof e==`string`||e instanceof URL?{url:e}:e,{onMessage:c,onComment:u=s,onConnect:d=s,onDisconnect:f=s,onScheduleReconnect:p=s}=n,{fetch:m,url:h,initialLastEventId:g}=l(n),_={...n.headers},v=[],y=c?[c]:[],b=e=>y.forEach(t=>t(e)),x=r.createParser({onEvent:N,onRetry:P,onComment:u}),S,C=h.toString(),w=new AbortController,T=g,E=2e3,D,O=o;return k(),{close:A,connect:k,[Symbol.iterator]:()=>{throw Error("EventSource does not support synchronous iteration. Use `for await` instead.")},[Symbol.asyncIterator]:ee,get lastEventId(){return T},get url(){return C},get readyState(){return O}};function k(){S||=(O=i,w=new AbortController,m(h,te()).then(M).catch(e=>{S=null,!(e.name===`AbortError`||e.type===`aborted`||w.signal.aborted)&&j()}))}function A(){O=o,w.abort(),x.reset(),clearTimeout(D),v.forEach(e=>e())}function ee(){let e=[],t=[];function n(){return new Promise(n=>{let r=t.shift();r?n({value:r,done:!1}):e.push(n)})}let r=function(n){let r=e.shift();r?r({value:n,done:!1}):t.push(n)};function i(){for(y.splice(y.indexOf(r),1);e.shift(););for(;t.shift(););}function a(){let t=e.shift();t&&(t({done:!0,value:void 0}),i())}return v.push(a),y.push(r),{next(){return O===o?this.return():n()},return(){return i(),Promise.resolve({done:!0,value:void 0})},throw(e){return i(),Promise.reject(e)},[Symbol.asyncIterator](){return this}}}function j(){p({delay:E}),!w.signal.aborted&&(O=i,D=setTimeout(k,E))}async function M(e){d(),x.reset();let{body:n,redirected:r,status:i}=e;if(i===204){f(),A();return}if(!n)throw Error(`Missing response body`);r&&(C=e.url);let o=t(n),s=new TextDecoder,c=o.getReader(),l=!0;O=a;do{let{done:e,value:t}=await c.read();t&&x.feed(s.decode(t,{stream:!e})),e&&(l=!1,S=null,x.reset(),j(),f())}while(l)}function N(e){typeof e.id==`string`&&(T=e.id),b(e)}function P(e){E=e}function te(){let{mode:e,credentials:t,body:r,method:i,redirect:a,referrer:o,referrerPolicy:s}=n;return{mode:e,credentials:t,body:r,method:i,redirect:a,referrer:o,referrerPolicy:s,headers:{Accept:`text/event-stream`,..._,...T?{"Last-Event-ID":T}:void 0},cache:`no-store`,signal:w.signal}}}function l(e){let t=e.fetch||globalThis.fetch;if(!u(t))throw Error(`No fetch implementation provided, and one was not found on the global object.`);if(typeof AbortController!=`function`)throw Error(`Missing AbortController implementation`);let{url:n,initialLastEventId:r}=e;if(typeof n!=`string`&&!(n instanceof URL))throw Error(`Invalid URL provided - must be string or URL instance`);if(typeof r!=`string`&&r!==void 0)throw Error(`Invalid initialLastEventId provided - must be string or undefined`);return{fetch:t,url:n,initialLastEventId:r}}function u(e){return typeof e==`function`}let d={getStream:p};function f(e){return c(e,d)}function p(e){if(`getReader`in e)return e;if(typeof e.pipe!=`function`||typeof e.on!=`function`)throw Error(`Invalid response body, expected a web or node.js stream`);if(typeof n.Readable.toWeb!=`function`)throw Error("Node.js 18 or higher required (`Readable.toWeb()` not defined)");return n.Readable.toWeb(n.Readable.from(e))}e.CLOSED=o,e.CONNECTING=i,e.OPEN=a,e.createEventSource=f}))(),1).createEventSource;var Y=class{constructor(){this.dataListeners=[],this.closeListeners=[],this.closed=!1}on(e,t){return e===`data`?this.dataListeners.push(t):e===`close`&&this.closeListeners.push(t),this}emit(e,t){if(e===`data`&&typeof t==`string`)for(let e of this.dataListeners)e(t);else if(e===`close`&&!this.closed){this.closed=!0;for(let e of this.closeListeners)e()}}},We=class{constructor(e,t){this.command=new Y,this.stdout=new Y,this.stderr=new Y,this.exitListeners=[],this.abortController=new AbortController,this.sseConnection=null,this.killed=!1,this.options=t,this.log=t.log??(()=>{}),this.resultPromise=e instanceof Promise?e.then(e=>this.run(e)):this.run(e)}then(e,t){return this.resultPromise.then(e,t)}catch(e){return this.resultPromise.catch(e)}finally(e){return this.resultPromise.finally(e)}on(e,t){return e===`exit`&&this.exitListeners.push(t),this}async kill(){if(this.killed=!0,this.abortController.abort(),this.sseConnection&&=(this.sseConnection.close(),null),!this.execId){this.log(`warn`,`Failed to cancel build: execId is not set`);return}try{await r.fetch(`${this.options.apiUrl}/exec/${this.execId}/cancel`,{method:`POST`,headers:{Authorization:`Bearer ${this.options.token}`}}),this.log(`info`,`Build cancelled`)}catch(e){this.log(`warn`,`Failed to cancel build: ${e}`)}}async run(e){let{log:t}=this,{apiUrl:n,token:i}=this.options,a;try{a=await r.fetch(`${n}/exec`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${i}`},body:JSON.stringify(e),signal:this.abortController.signal})}catch(e){if(this.killed){this.command.emit(`close`),this.stdout.emit(`close`),this.stderr.emit(`close`);for(let e of this.exitListeners)e(-1);return{exitCode:-1,execId:``,status:`CANCELLED`}}throw e}if(!a.ok){let e=await a.text();throw Error(`exec failed: ${a.status} ${e}`)}let o=await a.json();this.execId=o.execId,t(`debug`,`Build started: ${this.execId}`);let s=`${n}/exec/${this.execId}/events`,c,l;try{c=await Promise.race([this.connectSSE(s),new Promise((e,t)=>{l=setTimeout(()=>t(Error(`SSE timeout`)),36e5)})])}catch{this.killed?(t(`debug`,`Build killed`),c=-1):(t(`warn`,`SSE completion timeout`),c=1)}finally{clearTimeout(l),this.sseConnection&&=(this.sseConnection.close(),null)}this.command.emit(`close`),this.stdout.emit(`close`),this.stderr.emit(`close`);for(let e of this.exitListeners)e(c);let u=c===0?`SUCCEEDED`:c===-1?`CANCELLED`:`FAILED`,d={exitCode:c,execId:this.execId,status:u,...e.additionalMetadata??{}};return this.log(`debug`,`Build finished: ${d.status} (exit ${d.exitCode})`),d}connectSSE(e){return new Promise((t,n)=>{if(this.abortController.signal.aborted){n(Error(`killed`));return}try{let i=Ue({url:e,fetch:r.fetch,headers:{Authorization:`Bearer ${this.options.token}`},onMessage:e=>{let n=typeof e.data==`string`?e.data:String(e.data??``),r=e.event;if(r===`command`)this.command.emit(`data`,n);else if(r===`stdout`)this.stdout.emit(`data`,n);else if(r===`stderr`)this.stderr.emit(`data`,n);else if(r===`exitCode`){let e=parseInt(n,10);if(Number.isNaN(e)){this.log(`warn`,`SSE exitCode event has invalid data: ${n}`);return}this.log(`debug`,`Build completed via SSE: exitCode=${e}`),t(e)}},onDisconnect:()=>{this.killed||this.log(`warn`,`SSE disconnected`)}});this.sseConnection=i,this.abortController.signal.addEventListener(`abort`,()=>n(Error(`killed`)),{once:!0})}catch(e){this.killed||this.log(`warn`,`SSE setup failed: ${e}`),n(e)}})}};function Ge(e,t){return new We(e,t)}function Ke(e){let t=t=>{let n=[`none`,`error`,`warn`,`info`,`debug`];return n.indexOf(e)>=n.indexOf(t)};return(e,n)=>{if(!t(e))return;let r=`[XcodeInstance]`;e===`error`||e===`warn`?console[e](r,n):console.log(r,n)}}var qe=class extends Ve{async createClient(e){let t,n;if(`instance`in e){if(!e.instance.status.apiUrl)throw Error(`Instance not ready: apiUrl is not available`);t=e.instance.status.apiUrl,n=e.instance.status.token}else t=e.apiUrl,n=e.token;let o=Ke(e.logLevel??`info`),l=this._client;return{async sync(e,r){let l=c.resolve(e),d=`limsync-cache-${c.basename(l)}-${u.createHash(`sha1`).update(l).digest(`hex`).slice(0,8)}`,f=r?.basisCacheDir??c.join(s.tmpdir(),d),p={apiUrl:t,token:n,udid:d,install:r?.install??!0,ignoreFn:await a(e,{basisCacheDir:f,additional:e=>!!(e.startsWith(`build/`)||e.startsWith(`.build/`)||e.startsWith(`DerivedData/`)||e.startsWith(`Index.noindex/`)||e.startsWith(`ModuleCache.noindex/`)||e.startsWith(`.index-build/`)||e.startsWith(`.swiftpm/`)||e.startsWith(`Pods/`)||e.startsWith(`Carthage/Build/`)||e.includes(`/xcuserdata/`)||e.includes(`.dSYM/`)||r?.ignore?.(e))}),basisCacheDir:f,watch:r?.watch??!0,maxPatchBytes:r?.maxPatchBytes??4194304,launchMode:`ForegroundIfRunning`,log:o},m=await i(e,p);return m.stopWatching?{stopWatching:m.stopWatching}:{}},xcodebuild(e,r){let i={command:`xcodebuild`,...e&&{xcodebuild:e}};if(r?.upload){let e=r.upload.assetName;return Ge(l.assets.getOrCreate({name:e}).then(e=>(i.signedUploadUrl=e.signedUploadUrl,i.additionalMetadata={signedDownloadUrl:e.signedDownloadUrl},i)).catch(t=>{throw Error(`Failed to create upload URL for artifact '${e}': ${t instanceof Error?t.message:t}`)}),{apiUrl:t,token:n,log:o})}return Ge(i,{apiUrl:t,token:n,log:o})},async attachSimulator(e){let i,a;if(`status`in e){if(!e.status.apiUrl)throw Error(`Simulator instance not ready: apiUrl is not available`);i=e.status.apiUrl,a=e.status.token}else i=e.apiUrl,a=e.token;let o=await r.fetch(`${t}/simulator`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify({apiUrl:i,token:a})});if(!o.ok){let e=await o.text();throw Error(`POST /simulator failed: ${o.status} ${e}`)}}}}};const X=e=>{if(globalThis.process!==void 0)return globalThis.process.env?.[e]?.trim()||void 0;if(globalThis.Deno!==void 0)return globalThis.Deno.env?.get?.(e)?.trim()||void 0};var Z,Je,Q,Ye,$=class{constructor({baseURL:e=X(`LIMRUN_BASE_URL`),apiKey:t=X(`LIM_API_KEY`)??null,...n}={}){Z.add(this),Q.set(this,void 0),this.androidInstances=new Le(this),this.assets=new Be(this),this.iosInstances=new Re(this),this.xcodeInstances=new qe(this);let r={apiKey:t,...n,baseURL:e||`https://api.limrun.com`};this.baseURL=r.baseURL,this.timeout=r.timeout??Je.DEFAULT_TIMEOUT,this.logger=r.logger??console;let i=`warn`;this.logLevel=i,this.logLevel=ve(r.logLevel,`ClientOptions.logLevel`,this)??ve(X(`LIMRUN_LOG`),`process.env['LIMRUN_LOG']`,this)??i,this.fetchOptions=r.fetchOptions,this.maxRetries=r.maxRetries??2,this.fetch=r.fetch??fe(),f(this,Q,ge,`f`),this._options=r,this.apiKey=t}withOptions(e){return new this.constructor({...this._options,baseURL:this.baseURL,maxRetries:this.maxRetries,timeout:this.timeout,logger:this.logger,logLevel:this.logLevel,fetch:this.fetch,fetchOptions:this.fetchOptions,apiKey:this.apiKey,...e})}defaultQuery(){return this._options.defaultQuery}validateHeaders({values:e,nulls:t}){if(!(this.apiKey&&e.get(`authorization`))&&!t.has(`authorization`))throw Error(`Could not resolve authentication method. Expected the apiKey to be set. Or for the "Authorization" headers to be explicitly omitted`)}async authHeaders(e){if(this.apiKey!=null)return q([{Authorization:`Bearer ${this.apiKey}`}])}stringifyQuery(e){return _e(e)}getUserAgent(){return`${this.constructor.name}/JS ${F}`}defaultIdempotencyKey(){return`stainless-node-retry-${m()}`}makeStatusError(e,t,n,r){return v.generate(e,t,n,r)}buildURL(e,t,n){let r=!p(this,Z,`m`,Ye).call(this)&&n||this.baseURL,i=ee(e)?new URL(e):new URL(r+(r.endsWith(`/`)&&e.startsWith(`/`)?e.slice(1):e)),a=this.defaultQuery(),o=Object.fromEntries(i.searchParams);return(!P(a)||!P(o))&&(t={...o,...a,...t}),typeof t==`object`&&t&&!Array.isArray(t)&&(i.search=this.stringifyQuery(t)),i.toString()}async prepareOptions(e){}async prepareRequest(e,{url:t,options:n}){}get(e,t){return this.methodRequest(`get`,e,t)}post(e,t){return this.methodRequest(`post`,e,t)}patch(e,t){return this.methodRequest(`patch`,e,t)}put(e,t){return this.methodRequest(`put`,e,t)}delete(e,t){return this.methodRequest(`delete`,e,t)}methodRequest(e,t,n){return this.request(Promise.resolve(n).then(n=>({method:e,path:t,...n})))}request(e,t=null){return new Se(this,this.makeRequest(e,t,void 0))}async makeRequest(e,t,n){let r=await e,i=r.maxRetries??this.maxRetries;t??=i,await this.prepareOptions(r);let{req:a,url:o,timeout:s}=await this.buildRequest(r,{retryCount:i-t});await this.prepareRequest(a,{url:o,options:r});let c=`log_`+(Math.random()*(1<<24)|0).toString(16).padStart(6,`0`),l=n===void 0?``:`, retryOf: ${n}`,u=Date.now();if(z(this).debug(`[${c}] sending request`,B({retryOfRequestLogID:n,method:r.method,url:o,options:r,headers:a.headers})),r.signal?.aborted)throw new y;let d=new AbortController,f=await this.fetchWithTimeout(o,a,s,d).catch(g),p=Date.now();if(f instanceof globalThis.Error){let e=`retrying, ${t} attempts remaining`;if(r.signal?.aborted)throw new y;let i=h(f)||/timed? ?out/i.test(String(f)+(`cause`in f?String(f.cause):``));if(t)return z(this).info(`[${c}] connection ${i?`timed out`:`failed`} - ${e}`),z(this).debug(`[${c}] connection ${i?`timed out`:`failed`} (${e})`,B({retryOfRequestLogID:n,url:o,durationMs:p-u,message:f.message})),this.retryRequest(r,t,n??c);throw z(this).info(`[${c}] connection ${i?`timed out`:`failed`} - error; no more retries left`),z(this).debug(`[${c}] connection ${i?`timed out`:`failed`} (error; no more retries left)`,B({retryOfRequestLogID:n,url:o,durationMs:p-u,message:f.message})),i?new x:new b({cause:f})}let m=`[${c}${l}] ${a.method} ${o} ${f.ok?`succeeded`:`failed`} with status ${f.status} in ${p-u}ms`;if(!f.ok){let e=await this.shouldRetry(f);if(t&&e){let e=`retrying, ${t} attempts remaining`;return await he(f.body),z(this).info(`${m} - ${e}`),z(this).debug(`[${c}] response error (${e})`,B({retryOfRequestLogID:n,url:f.url,status:f.status,headers:f.headers,durationMs:p-u})),this.retryRequest(r,t,n??c,f.headers)}let i=e?`error; no more retries left`:`error; not retryable`;z(this).info(`${m} - ${i}`);let a=await f.text().catch(e=>g(e).message),o=re(a),s=o?void 0:a;throw z(this).debug(`[${c}] response error (${i})`,B({retryOfRequestLogID:n,url:f.url,status:f.status,headers:f.headers,message:s,durationMs:Date.now()-u})),this.makeStatusError(f.status,o,s,f.headers)}return z(this).info(m),z(this).debug(`[${c}] response start`,B({retryOfRequestLogID:n,url:f.url,status:f.status,headers:f.headers,durationMs:p-u})),{response:f,options:r,controller:d,requestLogID:c,retryOfRequestLogID:n,startTime:u}}getAPIList(e,t,n){return this.requestAPIList(t,n&&`then`in n?n.then(t=>({method:`get`,path:e,...t})):{method:`get`,path:e,...n})}requestAPIList(e,t){let n=this.makeRequest(t,null,void 0);return new we(this,n,e)}async fetchWithTimeout(e,t,n,r){let{signal:i,method:a,...o}=t||{},s=this._makeAbort(r);i&&i.addEventListener(`abort`,s,{once:!0});let c=setTimeout(s,n),l=globalThis.ReadableStream&&o.body instanceof globalThis.ReadableStream||typeof o.body==`object`&&o.body!==null&&Symbol.asyncIterator in o.body,u={signal:r.signal,...l?{duplex:`half`}:{},method:`GET`,...o};a&&(u.method=a.toUpperCase());try{return await this.fetch.call(void 0,e,u)}finally{clearTimeout(c)}}async shouldRetry(e){let t=e.headers.get(`x-should-retry`);return t===`true`?!0:t===`false`?!1:e.status===408||e.status===409||e.status===429||e.status>=500}async retryRequest(e,t,n,r){let i,a=r?.get(`retry-after-ms`);if(a){let e=parseFloat(a);Number.isNaN(e)||(i=e)}let o=r?.get(`retry-after`);if(o&&!i){let e=parseFloat(o);i=Number.isNaN(e)?Date.parse(o)-Date.now():e*1e3}if(i===void 0){let n=e.maxRetries??this.maxRetries;i=this.calculateDefaultRetryTimeoutMillis(t,n)}return await ie(i),this.makeRequest(e,t-1,n)}calculateDefaultRetryTimeoutMillis(e,t){let n=t-e;return Math.min(.5*2**n,8)*(1-Math.random()*.25)*1e3}async buildRequest(e,{retryCount:t=0}={}){let n={...e},{method:r,path:i,query:a,defaultBaseURL:o}=n,s=this.buildURL(i,a,o);`timeout`in n&&ne(`timeout`,n.timeout),n.timeout=n.timeout??this.timeout;let{bodyHeaders:c,body:l}=this.buildBody({options:n});return{req:{method:r,headers:await this.buildHeaders({options:e,method:r,bodyHeaders:c,retryCount:t}),...n.signal&&{signal:n.signal},...globalThis.ReadableStream&&l instanceof globalThis.ReadableStream&&{duplex:`half`},...l&&{body:l},...this.fetchOptions??{},...n.fetchOptions??{}},url:s,timeout:n.timeout}}async buildHeaders({options:e,method:t,bodyHeaders:n,retryCount:r}){let i={};this.idempotencyHeader&&t!==`get`&&(e.idempotencyKey||=this.defaultIdempotencyKey(),i[this.idempotencyHeader]=e.idempotencyKey);let a=q([i,{Accept:`application/json`,"User-Agent":this.getUserAgent(),"X-Stainless-Retry-Count":String(r),...e.timeout?{"X-Stainless-Timeout":String(Math.trunc(e.timeout/1e3))}:{},...de()},await this.authHeaders(e),this._options.defaultHeaders,n,e.headers]);return this.validateHeaders(a),a.values}_makeAbort(e){return()=>e.abort()}buildBody({options:{body:e,headers:t}}){if(!e)return{bodyHeaders:void 0,body:void 0};let n=q([t]);return ArrayBuffer.isView(e)||e instanceof ArrayBuffer||e instanceof DataView||typeof e==`string`&&n.values.has(`content-type`)||globalThis.Blob&&e instanceof globalThis.Blob||e instanceof FormData||e instanceof URLSearchParams||globalThis.ReadableStream&&e instanceof globalThis.ReadableStream?{bodyHeaders:void 0,body:e}:typeof e==`object`&&(Symbol.asyncIterator in e||Symbol.iterator in e&&`next`in e&&typeof e.next==`function`)?{bodyHeaders:void 0,body:me(e)}:typeof e==`object`&&n.values.get(`content-type`)===`application/x-www-form-urlencoded`?{bodyHeaders:{"content-type":`application/x-www-form-urlencoded`},body:this.stringifyQuery(e)}:p(this,Q,`f`).call(this,{body:e,headers:n})}};Je=$,Q=new WeakMap,Z=new WeakSet,Ye=function(){return this.baseURL!==`https://api.limrun.com`},$.Limrun=Je,$.DEFAULT_TIMEOUT=3e5,$.LimrunError=_,$.APIError=v,$.APIConnectionError=b,$.APIConnectionTimeoutError=x,$.APIUserAbortError=y,$.NotFoundError=T,$.ConflictError=E,$.RateLimitError=O,$.BadRequestError=S,$.AuthenticationError=C,$.InternalServerError=k,$.PermissionDeniedError=w,$.UnprocessableEntityError=D,$.toFile=je,$.AndroidInstances=Le,$.Assets=Be,$.IosInstances=Re,$.XcodeInstances=qe;export{T as n,$ as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{y as e}from"./sdk-contracts.js";const t=1e3;function n(t){if(t)throw new e(`UNAUTHORIZED`,`Limrun uploaded apps are unavailable on the public daemon HTTP surface.`)}async function r(e,n,r){r?.throwIfAborted();let i=await e.assets.list({limit:t},{signal:r});r?.throwIfAborted();let a=[];for(let e of i){let t=o(e,n);t&&a.push(t)}return a.sort((e,t)=>e.name.localeCompare(t.name))}async function i(n,r,i,a){a?.throwIfAborted();let s=await n.assets.list({limit:t,nameFilter:i},{signal:a});a?.throwIfAborted();let c=s.filter(e=>e.name===i).map(e=>o(e,r)).filter(e=>e!==void 0);if(c.length<=1)return c[0];throw new e(`COMMAND_FAILED`,`Limrun returned multiple uploaded apps named ${i}.`,{app:i,platform:r,assetIds:c.map(e=>e.id)})}function a(e,t){let n=l(e.replace(/\.(?:tar\.gz|tgz|tar|zip|ipa|apk)$/i,``).replace(/\.app$/i,``));if(n.length<5)return;let r=t.map(e=>({app:e,keys:c(e)})).filter(({keys:e})=>e.includes(n));return r.length===1?r[0]?.app.id:void 0}function o(e,t){if(e.md5&&s(e)===t)return{id:e.id,name:e.name}}function s(e){if(e.os===`android`||e.os===`ios`)return e.os;let t=e.name.toLowerCase();if(t.endsWith(`.apk`))return`android`;if(t.endsWith(`.ipa`)||t.endsWith(`.zip`)||t.endsWith(`.tar`)||t.endsWith(`.tar.gz`)||t.endsWith(`.tgz`))return`ios`}function c(e){let t=e.id.split(/[.:/]/).at(-1);return[e.id,t,e.name].filter(e=>typeof e==`string`).map(l)}function l(e){return e.toLowerCase().replaceAll(/[^a-z0-9]+/g,``)}export{n as assertLimrunUploadedAppAccess,r as listLimrunAppAssets,a as resolveInstalledAppIdForAsset,i as resolveLimrunAppAsset};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{y as e}from"./sdk-contracts.js";import{r as t}from"./adb.js";import{t as n}from"./app-resolution-cache.js";const r=/\.(?:apk|aab)$/i,i=/^[A-Za-z_][\w]*(\.[A-Za-z_][\w]*)+$/;function a(e){let t=e.trim();return t.length===0?`other`:r.test(t)?t.includes(`/`)||t.includes(`\\`)||t.startsWith(`.`)||t.startsWith(`~`)||!o(t)?`binary`:`package`:o(t)?`package`:`other`}function o(e){return i.test(e)}function s(e){return`Android runtime hints require an installed package name, not "${e}". Install or reinstall the app first, then relaunch by package.`}const c={settings:{type:`intent`,value:`android.settings.SETTINGS`}},l=`Run agent-device apps --platform android to discover the installed package name, then retry open with that exact package.`,u=n();function d(e){return{platform:`android`,deviceId:e.id,variant:e.target??``}}async function f(e,t){return await u.invalidateWhile(d(e),t)}async function p(n,r){let i=r.trim();if(a(i)===`package`)return{type:`package`,value:i};let o=c[i.toLowerCase()];if(o)return o;let s=d(n),f=u.get(s,i);if(f)return f;let p=(await t(n,[`shell`,`pm`,`list`,`packages`])).stdout.split(`
|
|
2
|
+
`).map(e=>e.replace(`package:`,``).trim()).filter(Boolean).filter(e=>e.toLowerCase().includes(i.toLowerCase())),m=p[0];if(m!==void 0&&p.length===1)return u.set(s,i,{type:`package`,value:m});throw p.length>1?new e(`INVALID_ARGS`,`Multiple packages matched "${r}"`,{matches:p,hint:`Run agent-device apps --platform android to see the exact installed package names before retrying open.`}):new e(`APP_NOT_INSTALLED`,`No package found matching "${r}"`,{hint:l})}function m(e){let t=new Set([`com`,`android`,`google`,`app`,`apps`,`service`,`services`,`mobile`,`client`]),n=e.split(`.`).flatMap(e=>e.split(/[_-]+/)).map(e=>e.trim().toLowerCase()).filter(e=>e.length>0),r=n.at(-1)??e;for(let e=n.length-1;e>=0;--e){let i=n[e];if(i&&!t.has(i)){r=i;break}}return r.split(/[^a-z0-9]+/i).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}export{a,f as i,m as n,s as o,p as r,l as t};
|
package/dist/src/app-helpers.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{r as e}from"./app-inventory.js";import"./device.js";import{n as t}from"./adb-failure.js";import"./adb-executor.js";import{n}from"./app-deployment-resolution.js";import{a as r,i}from"./app-parsers.js";const a=`android.intent.category.LAUNCHER`,o=`android.intent.category.LEANBACK_LAUNCHER`;async function s(t,r={}){let i=await c(t,r.target??`auto`);return(e(r.filter)===`user-installed`?(await f(t)).filter(e=>i.has(e)):Array.from(i)).map(e=>({package:e,name:n(e)})).sort((e,t)=>e.package.localeCompare(t.package))}async function c(e,t){let n=(await Promise.all(l(t).map(async t=>{let n=await e(u(t),{allowFailure:!0});return n.exitCode===0?d(n.stdout):[]}))).flat();return new Set(n)}function l(e){switch(e){case`mobile`:return[a];case`tv`:return[o];default:return[a,o]}}function u(e){return[`shell`,`cmd`,`package`,`query-activities`,`--brief`,`-a`,`android.intent.action.MAIN`,`-c`,e]}function d(e){return e.trim().length===0?[]:i(e)}async function f(e){let n=await e([`shell`,`pm`,`list`,`packages`,`-3`],{allowFailure:!0});if(n.exitCode!==0)throw t(`Failed to list Android user-installed apps`,n);return r(n.stdout)}export{s as listAndroidAppsWithAdb};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as e,y as t}from"./sdk-contracts.js";import{Dr as n,Hn as r,Qn as i,jr as a}from"./sdk-batch.js";import{n as o}from"./scroll-indicator.js";import"./device.js";function s(e){let t=f(e.label),n=f(e.value),r=f(e.identifier),i=m(r)?r:``;return p(e.type??``)?n||t||i:t||n||i}function c(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=a(e.type??``),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`textview`)||n.includes(`textarea`)||n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`edittext`)||r.includes(`text area`)||r.includes(`text field`)}function l(e){let t=e.replaceAll(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function u(e,t){let n=s(e),r=c(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&d(n)}}function d(e){return e?e.length>80||/[\r\n]/.test(e):!1}function f(e){return typeof e==`string`?e.trim():``}function p(e){let t=a(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function m(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}const h={application:`application`,navigationbar:`navigation-bar`,tabbar:`tab-bar`,button:`button`,imagebutton:`button`,link:`link`,cell:`cell`,statictext:`text`,checkedtextview:`text`,textbox:`text-field`,textfield:`text-field`,edittext:`text-field`,textarea:`text-view`,switch:`switch`,slider:`slider`,image:`image`,imageview:`image`,webview:`webview`,framelayout:`group`,linearlayout:`group`,relativelayout:`group`,constraintlayout:`group`,viewgroup:`group`,view:`group`,listview:`list`,recyclerview:`list`,collectionview:`collection`,searchfield:`search`,heading:`heading`,activityindicator:`activity-indicator`,progressindicator:`progress-indicator`,segmentedcontrol:`segmented-control`,group:`group`,window:`window`,checkbox:`checkbox`,radio:`radio`,menuitem:`menu-item`,toolbar:`toolbar`,scrollarea:`scroll-area`,scrollview:`scroll-area`,nestedscrollview:`scroll-area`,table:`table`};function g(e,t={}){let n=[],r=[];for(let i of e){let e=i.depth??0,a=i.label?.trim()||i.value?.trim()||i.identifier?.trim()||``,o=x(i.type??`Element`),s=i.inheritsLabel===!0||i.inheritsIdentifier===!0;if(o===`group`&&!a&&!s)continue;for(;n.length>0&&e<=n.at(-1);)n.pop();let c=n.length;n.push(e),r.push({node:i,depth:c,type:o,text:_(i,c,!1,o,t)})}return r}function _(e,t,n,r,i={}){let a=r??x(e.type??`Element`),o=u(e,a),s=E(e,a,i,o),c=` `.repeat(t),l=e.ref?`@${e.ref}`:``,d=D(e,a,i,o);!s&&(e.inheritsLabel===!0||e.inheritsIdentifier===!0)&&d.push(`same label as parent`);let f=d.map(e=>` [${e}]`).join(``),p=s?` "${s}"`:``,m=v(e);return n?`${c}${l} [${a}]${f}${m}`.trimEnd():`${c}${l} [${a}]${p}${f}${m}`.trimEnd()}function v(e){let t=e.actions?.filter(e=>e.trim().length>0);return!t||t.length===0?``:` actions: [${t.map(e=>`"${A(y(e))}"`).join(`, `)}]`}function y(e){return e.replaceAll(/\s+/g,` `).replaceAll(/[\u0000-\u001f\u007f-\u009f]/g,``).trim()}function b(e,t){let n=e.label?.trim();if(n&&w(t,n))return``;let r=e.value?.trim();if(C(t)){if(r)return r;if(n)return n}else if(n)return n;if(r)return r;let i=e.identifier?.trim();return!i||T(i)&&(t===`group`||t===`image`||t===`list`||t===`collection`)?``:i}function x(e){let t=e,n=e.replaceAll(/XCUIElementType/gi,``).toLowerCase(),r=t.includes(`.`)&&(t.startsWith(`android.`)||t.startsWith(`androidx.`)||t.startsWith(`com.`));return n.includes(`.`)&&(n=n.replace(/^android\.widget\./,``).replace(/^android\.view\./,``).replace(/^android\.webkit\./,``).replace(/^androidx\./,``).replace(/^com\.google\.android\./,``).replace(/^com\.android\./,``),r&&n.includes(`.`)&&(n=n.slice(n.lastIndexOf(`.`)+1))),n===`textview`?r?`text`:`text-view`:S(n)||n||`element`}function S(e){return Object.prototype.hasOwnProperty.call(h,e)?h[e]:void 0}function C(e){return e===`text-field`||e===`text-view`||e===`search`}function w(e,t){return e!==`scroll-area`&&e!==`list`&&e!==`collection`&&e!==`table`?!1:o(t)}function T(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function E(e,t,n,r){return!n.summarizeTextSurfaces||!r.shouldSummarize?b(e,t):O(e,t,r.text)||b(e,t)}function D(e,t,n,r){let i=[];return e.enabled===!1&&i.push(`disabled`),i.push(...e.presentationHints??[]),!n.summarizeTextSurfaces||(e.selected===!0&&i.push(`selected`),e.focused===!0&&i.push(`focused`),C(t)&&i.push(`editable`),k(e,t)&&i.push(`scrollable`),!r.shouldSummarize)?j(i):(i.push(`preview:"${A(l(r.text))}"`),i.push(`truncated`),j(i))}function O(e,t,n){let r=f(e.label);if(r&&r!==n)return r;let i=f(e.identifier);if(i&&!T(i)&&i!==n)return i;switch(t){case`text`:case`text-view`:return`Text view`;case`text-field`:return`Text field`;case`search`:return`Search field`;default:return``}}function k(e,t){if(t===`scroll-area`)return!0;let n=(e.type??``).toLowerCase(),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`scroll`)||r.includes(`scroll`)}function A(e){return e.replaceAll(`\\`,String.raw`\\`).replaceAll(`"`,String.raw`\"`)}function j(e){return[...new Set(e)]}const M={state:`sparse`,backend:`tree`,reason:`legacy iOS capture exposed only the application root`,reasonCode:`sparse-tree`};function N(e){if(e.scope!==void 0)return`scope`;if(e.depth!==void 0)return`depth`}function P(e,t=`is`){let n=`${t} absent`;return e===`scope`?`${n} does not support --scope; it requires an unscoped capture`:`${n} does not support --depth; it requires a full-depth capture`}function F(e,t){let n=t[0]?R(t[0]):void 0,r=t.length;if(e.truncated===!0)return{kind:`truncated`,matches:r,...n?{firstMatch:n}:{}};let i=I(e);return i?{kind:`sparse`,matches:r,...n?{firstMatch:n}:{},quality:{state:i.state,backend:i.backend,...i.reason?{reason:i.reason}:{},...i.reasonCode?{reasonCode:i.reasonCode}:{}}}:r===0?{kind:`absent`,matches:0}:{kind:`present`,matches:r,firstMatch:n}}function I(e){let t=e.snapshotQuality;return t?.state===`sparse`?{state:t.state,backend:t.backend,...t.reason?{reason:t.reason}:{},...t.reasonCode?{reasonCode:t.reasonCode}:{}}:L(e)?M:void 0}function L(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:a(e.nodes[0]?.type??``)===`application`}function R(e){let t=r(e),a=i(n(e),256);return{...t,...a&&a!==t.label?{text:a}:{}}}const z={selectorNotFound:`selector_not_found`,predicateFailed:`predicate_failed`};function B(e,n=`is`){return new t(`INVALID_ARGS`,P(e,n),{command:n,predicate:`absent`,rejectedOption:e})}function V(e,n,r=`is`){let i=`firstMatch`in n?n.firstMatch:void 0,a={command:r,reason:z.predicateFailed,predicate:`absent`,selector:e,matches:n.matches,observation:n.kind,...i?{firstMatch:i}:{},...n.kind===`sparse`?{snapshotQuality:n.quality}:{},...n.kind===`truncated`?{truncated:!0}:{}};if(n.kind===`present`){let i=n.matches>1;return new t(`COMMAND_FAILED`,`${r} absent failed for selector ${e}: ${n.matches} match${i?`es`:``} found`,{...a,...i?{hint:`Refine the selector to match no elements.`}:{}})}return new t(`COMMAND_FAILED`,`${r} absent could not prove absence for selector ${e}: ${n.kind===`sparse`?`capture was sparse`:`capture was truncated`}`,{...a,hint:`Retry after the accessibility capture is complete.`})}function H(n,r,i=`is`){let a=e(r),o=typeof a.details?.reason==`string`?a.details.reason:typeof a.details?.androidSnapshotHelperFailureReason==`string`?a.details.androidSnapshotHelperFailureReason:void 0;return new t(`COMMAND_FAILED`,`${i} absent could not prove absence for selector ${n}: capture was unreadable`,{command:i,reason:z.predicateFailed,predicate:`absent`,selector:n,matches:0,observation:`unreadable`,captureErrorCode:a.code,...o?{captureErrorReason:o}:{},hint:`Retry after the accessibility capture is readable.`},a)}export{N as a,g as c,_ as d,s as f,z as i,b as l,V as n,F as o,p,H as r,L as s,B as t,x as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{y as e}from"./sdk-contracts.js";const t=`user-installed`;function n(e){return e??`user-installed`}function r(t){if(t===void 0)throw new e(`INVALID_ARGS`,`appsFilter must be resolved before executing the apps command`);return t}export{r as n,n as r,t};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{y as e}from"./sdk-contracts.js";import{a as t,i as n,r}from"./sdk-batch-runner.js";import{l as i,u as a}from"./sdk-device.js";import{n as o,t as s}from"./launch-console.js";import"./observability.js";import{r as c}from"./diagnostics.js";import{n as l}from"./exec.js";import"./diagnostics2.js";import"./command.js";import{i as u,n as d}from"./retry.js";import{D as f,o as p}from"./host-file.js";import{f as m,t as h}from"./config2.js";import{a as g,o as _}from"./tool-provider.js";import{t as v}from"./physical-device-control.js";import{t as y}from"./simctl.js";import{n as b,r as x}from"./apps-simctl.js";import{m as S}from"./runner-client.js";import{t as C}from"./simulator.js";import{a as w,l as T,u as E}from"./app-resolution.js";import D from"node:path";function O(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=t.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 k(e,t){let n=await _(y(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 g(`plutil`,[`-extract`,`CFBundleExecutable`,`raw`,`-o`,`-`,`${r}/Info.plist`],{allowFailure:!0});if(i.exitCode!==0||!i.stdout.trim())return{installed:!0};let a=`${r}/${i.stdout.trim()}`,o=await g(`otool`,[`-l`,a],{allowFailure:!0});if(o.exitCode!==0)return{installed:!0};let s=o.stdout.toLowerCase();return{installed:!0,simulatorCompatible:s.includes(`iossimulator`)||s.includes(`platform 7`)}}function A(e){return e.installed?e.simulatorCompatible===!1?`ARCH_MISMATCH`:`PERSISTENT_LAUNCH_FAIL`:`APP_NOT_INSTALLED`}function j(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 M=25e3;async function N(c,l,u){let d=u?.launchConsole?.trim(),f=u?.launchArgs;if(d&&(!i(c)||c.kind!==`simulator`))throw new e(`UNSUPPORTED_OPERATION`,o);if(a(c)){if(f&&f.length>0)throw new e(`UNSUPPORTED_OPERATION`,`--launch-args is not supported on macOS; launch arguments are currently iOS-only.`);await E(c,l,u);return}let p=u?.url?.trim();if(p){if(d)throw new e(`INVALID_ARGS`,s);if(!r(p))throw new e(`INVALID_ARGS`,`open <app> <url> requires a valid URL target`);if(c.kind===`simulator`){let e=!!f||n(p);if(u?.terminateRunningApp||e){let t=u?.appBundleId??await w(c,l);e?await R(c,t,{...f?{launchArgs:f}:{},...u?.terminateRunningApp?{terminateRunningApp:!0}:{}}):await L(c,t)}await P(c,p,void 0);return}let i=u?.appBundleId??await w(c,l),a=t(i,p);if(!a)throw new e(`INVALID_ARGS`,`Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.`);await U(c,a,{payloadUrl:p,launchArgs:f,runnerOptions:u?.runnerOptions});return}let m=l.trim();if(r(m)){if(d)throw new e(`INVALID_ARGS`,s);if(c.kind===`simulator`){await P(c,m,f);return}let n=t(u?.appBundleId,m);if(!n)throw new e(`INVALID_ARGS`,`Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.`);await U(c,n,{payloadUrl:m,launchArgs:f,runnerOptions:u?.runnerOptions});return}let h=u?.appBundleId??await w(c,l);if(c.kind===`simulator`){await R(c,h,{...d?{launchConsole:d}:{},...f?{launchArgs:f}:{},...u?.terminateRunningApp?{terminateRunningApp:!0}:{}});return}await U(c,h,{launchArgs:f,runnerOptions:u?.runnerOptions})}async function P(t,n,r){if(r&&r.length>0)throw new e(`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 C(t),await b(t,[`openurl`,t.id,n])}async function F(e){a(e)||e.kind===`simulator`&&await C(e)}async function I(e,t,n){if(a(e)){await T(e,t);return}let r=await w(e,t);if(e.kind===`simulator`){await L(e,r);return}await v(e).terminateApp(e,r,{runnerOptions:n,runRunnerCommand:S})}async function L(t,n){await C(t);let r=x(t,[`terminate`,t.id,n]),i=await _(r,{allowFailure:!0,timeoutMs:m});if(i.exitCode!==0&&!i.stderr.toLowerCase().includes(`found nothing to terminate`))throw new e(`COMMAND_FAILED`,`xcrun exited with code ${i.exitCode}`,l(i,{cmd:`xcrun`,args:r}))}async function R(t,n,r){await C(t);let i=0,a=d.fromTimeoutMs(h);try{await u(async({deadline:i})=>{if(i?.isExpired())throw new e(`COMMAND_FAILED`,`App launch deadline exceeded`,{timeoutMs:h});let a=x(t,z(t.id,n,r)),o=r?.launchConsole?await B(a,r.launchConsole):await _(a,{allowFailure:!0});if(o.exitCode!==0)throw new e(`COMMAND_FAILED`,`xcrun exited with code ${o.exitCode}`,l(o,{cmd:`xcrun`,args:a}))},{maxAttempts:10,baseDelayMs:1e3,maxDelayMs:5e3,jitter:.2,shouldRetry(e){return O(e)?(i+=1,i<3):!1}},{deadline:a})}catch(e){if(O(e)){let r=e,i=A(await k(t,n));r.details={...r.details,hint:j(i)}}throw e}}function z(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 B(t,n){await p(D.dirname(n));try{let e=await _(t,{allowFailure:!0,timeoutMs:M});return await V(n,e.stdout,e.stderr),e}catch(t){let r=(t instanceof e?t:void 0)?.details;if(r?.timeoutMs===M){let e=typeof r.stdout==`string`?r.stdout:``,t=typeof r.stderr==`string`?r.stderr:``;return await V(n,e,t),c({level:`warn`,phase:`ios_simulator_launch_console_capture_timeout`,data:{timeoutMs:M,logPath:n,stdoutBytes:Buffer.byteLength(e),stderrBytes:Buffer.byteLength(t)}}),{stdout:e,stderr:t,exitCode:0}}throw t}}async function V(e,t,n){await f(e,H(t,n))}function H(e,t){return!e||!t||e.endsWith(`
|
|
2
|
+
`)||e.endsWith(`\r`)?`${e}${t}`:`${e}\n${t}`}async function U(e,t,n){await v(e).launchApp(e,t,{...n,runRunnerCommand:S})}export{N as n,F as r,I as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./app-launch.js";export{e as closeIosApp};
|