agent-device 0.21.23 → 0.21.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.apk → agent-device-android-ime-helper-0.21.25.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.manifest.json → agent-device-android-ime-helper-0.21.25.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.manifest.json +16 -0
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +12 -6
- package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/RectResponseTests.swift +21 -0
- package/apple/snapshot-bridge/README.md +9 -7
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +159 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerHttpRequestFraming.swift +139 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerPeer.swift +41 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerToken.swift +25 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +56 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +14 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +18 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +12 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +29 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +35 -13
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +59 -26
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +19 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +50 -106
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +142 -54
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +4 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +21 -19
- package/dist/src/absence-observation-errors.js +1 -0
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +2 -2
- package/dist/src/adb-failure.js +2 -2
- package/dist/src/adb.js +1 -1
- package/dist/src/agent-browser-lifecycle.js +1 -1
- package/dist/src/agent-browser-process-record.js +1 -1
- package/dist/src/agent-browser-provider.js +1 -1
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/alert.js +1 -1
- package/dist/src/android-adb.d.ts +3 -2
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/android-system-surface-disclosure.js +1 -0
- package/dist/src/android-text-entry.js +1 -0
- package/dist/src/android.js +1 -1
- package/dist/src/app-backend.js +1 -1
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-inventory.d.ts +4 -0
- package/dist/src/app-launch.js +1 -1
- package/dist/src/app-lifecycle.js +4 -3
- package/dist/src/app-lifecycle2.js +2 -2
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime2.js +3 -3
- package/dist/src/app-resolution-facade.js +1 -1
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/app-state-runtime.d.ts +15 -0
- package/dist/src/apple-runner-platform.js +1 -1
- package/dist/src/application-lifecycle-interaction.js +1 -1
- package/dist/src/artifact-download.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/aws-device-farm-connection.js +1 -0
- package/dist/src/back-mode.js +1 -1
- package/dist/src/backend-snapshot-options.js +1 -1
- package/dist/src/boot-diagnostics.js +1 -1
- package/dist/src/browserstack-connection.js +1 -0
- package/dist/src/capture-disclosure.js +1 -0
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +36 -17
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +3 -1
- package/dist/src/cli.js +3 -4
- package/dist/src/client-companion-tunnel.js +1 -0
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +15 -7
- package/dist/src/cloud-artifacts.d.ts +3 -2
- package/dist/src/code-signature-cache.js +1 -1
- package/dist/src/code-signature.js +1 -1
- package/dist/src/command-metadata.js +73 -1
- package/dist/src/command-policy.js +1 -0
- package/dist/src/command-schema.js +3 -3
- package/dist/src/command-surface.js +1 -1
- package/dist/src/command-tools.js +2 -2
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection-verification.js +1 -0
- package/dist/src/connection.js +5 -5
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lease-beat.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon-client-liveness-probe.js +1 -1
- package/dist/src/daemon-policy-file.js +1 -1
- package/dist/src/daemon-registration-owner.js +1 -1
- package/dist/src/daemon-registration.js +1 -1
- package/dist/src/daemon-resolution.js +3 -1
- package/dist/src/debug-symbols-facade.js +1 -1
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-input-state.d.ts +6 -17
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/device-readiness-runtime.js +1 -1
- package/dist/src/device-release.js +1 -1
- package/dist/src/device-selection-resolver.js +1 -1
- package/dist/src/device-shell.js +1 -1
- package/dist/src/device.js +3 -1
- package/dist/src/devicectl.js +1 -1
- package/dist/src/diagnostics.js +1 -1
- package/dist/src/doctor-facade.js +1 -1
- package/dist/src/durable-capture-resource.js +1 -1
- package/dist/src/durable-resource.js +1 -1
- package/dist/src/engine-eval-script.js +1 -1
- package/dist/src/error.js +1 -1
- package/dist/src/exec.js +1 -1
- package/dist/src/expo-dev-client-launch.js +1 -0
- package/dist/src/file.js +3 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/gesture-admission.js +1 -1
- package/dist/src/gesture-plan-types.d.ts +2 -5
- package/dist/src/gesture-plan.js +1 -1
- package/dist/src/gesture-runtime.js +1 -1
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/hdc.js +1 -1
- package/dist/src/helper.js +2 -2
- package/dist/src/human-control.js +1 -1
- package/dist/src/ime-rebind.js +1 -1
- package/dist/src/ime-state.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -1
- package/dist/src/input-actions2.js +2 -2
- package/dist/src/install-source-network-transport.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-error.js +1 -0
- package/dist/src/interaction-positionals.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-operation-catalog.js +1 -1
- package/dist/src/interactor.js +5 -5
- package/dist/src/interactor2.js +1 -1
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +5 -1
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/inventory.js +2 -2
- package/dist/src/inventory2.js +1 -1
- package/dist/src/inventory6.js +1 -1
- package/dist/src/io.d.ts +2 -2
- package/dist/src/ios-client.js +1 -1
- package/dist/src/ios-settings.js +1 -1
- package/dist/src/ios-snapshot-acquisition.js +1 -1
- package/dist/src/ios-snapshot-adapter.js +1 -1
- package/dist/src/ios-snapshot-engine.js +1 -1
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/keyed-lock.js +1 -1
- package/dist/src/launch-confirmation.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +5 -564
- package/dist/src/limrun.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/load.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -1
- package/dist/src/log-stream.js +9 -9
- package/dist/src/mechanics.js +16 -16
- package/dist/src/metro.js +1 -1
- package/dist/src/metro2.js +1 -1
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/observability.js +1 -1
- package/dist/src/observation.js +1 -2
- package/dist/src/open-target-resolution.js +1 -1
- package/dist/src/output-path.js +1 -1
- package/dist/src/overlay.js +1 -3
- package/dist/src/perf-facade.js +1 -1
- package/dist/src/perf-runtime-operation-builder.js +1 -1
- package/dist/src/perf-runtime.js +1 -1
- package/dist/src/perf-target.js +1 -1
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-request-scope.js +1 -1
- package/dist/src/platform-runtime-android-adb-host.js +1 -1
- package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
- package/dist/src/platform-runtime-apple-resources.js +1 -0
- package/dist/src/platform-runtime-claim-recovery.js +1 -0
- package/dist/src/platform-runtime-daemon-services.js +1 -0
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-network-web-transport.js +1 -1
- package/dist/src/platform-runtime-open-target.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +4 -4
- package/dist/src/platform-runtime-runtime-hints.js +2 -2
- package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
- package/dist/src/platform-runtime-unavailable.js +1 -1
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/plugin.js +1 -0
- package/dist/src/plugins/webdriver.d.ts +111 -0
- package/dist/src/plugins/webdriver.js +1 -0
- package/dist/src/plugins.d.ts +2 -1
- package/dist/src/plugins2.js +1 -1
- package/dist/src/png-crop-bytes.js +1 -1
- package/dist/src/png-resize.js +1 -0
- package/dist/src/png-worker-client.js +1 -1
- package/dist/src/png-worker-contract.js +1 -1
- package/dist/src/process-entry.js +1 -1
- package/dist/src/process-exit.js +1 -1
- package/dist/src/process.js +1 -1
- package/dist/src/provider-credential-fingerprint.js +1 -1
- package/dist/src/provider-device-admission.js +1 -1
- package/dist/src/provider-device-runtime.d.ts +556 -0
- package/dist/src/provider-policy.js +1 -0
- package/dist/src/provider-profile-fields.js +1 -1
- package/dist/src/provider-webdriver.js +1 -2
- package/dist/src/proxy.js +2 -2
- package/dist/src/quality-warnings.js +1 -1
- package/dist/src/react-devtools.js +2 -0
- package/dist/src/react-native-overlay2.js +3 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/recording.js +2 -2
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/remote-bridge.js +1 -0
- package/dist/src/remote-config-core.js +1 -0
- package/dist/src/remote-config.js +1 -1
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay-backend-registry.js +1 -0
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/replay-maestro-backend.js +117 -0
- package/dist/src/replay-script-selection.js +1 -0
- package/dist/src/replay.js +1 -3
- package/dist/src/replay2.js +1 -0
- package/dist/src/reporting.js +3 -3
- package/dist/src/request-cancel.js +1 -1
- package/dist/src/request-providers.js +1 -1
- package/dist/src/request-runtime-binding.js +1 -1
- package/dist/src/result-serialization.js +1 -1
- package/dist/src/retry.js +1 -1
- package/dist/src/retry2.js +1 -0
- package/dist/src/runner-artifact-manifest.js +1 -1
- package/dist/src/runner-cache-retention.js +1 -0
- package/dist/src/runner-cache-trim.js +1 -0
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-dev-tools-security.js +1 -1
- package/dist/src/runner-device-readiness.js +1 -1
- package/dist/src/runner-device-set.js +1 -0
- package/dist/src/runner-error-classification.js +3 -3
- package/dist/src/runner-exchange.js +1 -1
- package/dist/src/runner-lease.js +1 -0
- package/dist/src/runner-operations-facade.js +1 -1
- package/dist/src/runner-retention.js +1 -0
- package/dist/src/runner-start-budget.js +1 -1
- package/dist/src/runner-startup-transport.js +1 -0
- package/dist/src/runner-toolchain-probe.js +2 -0
- package/dist/src/runner.js +2 -1
- package/dist/src/runtime-command-surface.js +1 -0
- package/dist/src/runtime-deployment.js +1 -0
- package/dist/src/runtime-factory.js +1 -0
- package/dist/src/runtime-session.js +1 -0
- package/dist/src/runtime-transport-hints.js +1 -1
- package/dist/src/runtime.js +2 -1
- package/dist/src/runtime10.js +2 -2
- package/dist/src/runtime2.js +4 -4
- package/dist/src/runtime3.js +1 -1
- package/dist/src/runtime4.js +5 -5
- package/dist/src/runtime5.js +1 -1
- package/dist/src/runtime6.js +1 -1
- package/dist/src/runtime7.js +1 -1
- package/dist/src/runtime8.js +1 -1
- package/dist/src/runtime9.js +1 -1
- package/dist/src/screen-recording-transport.js +1 -1
- package/dist/src/screenshot-density.js +1 -1
- package/dist/src/screenshot-image.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -1
- package/dist/src/screenshot3.js +5 -5
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +2 -2
- package/dist/src/sdk-contracts.d.ts +20 -29
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-finders.d.ts +1 -1
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.d.ts +4 -2
- package/dist/src/sdk-remote-config.d.ts +4 -0
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +5 -6
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +0 -0
- package/dist/src/selector-pipeline-policy.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +2 -2
- package/dist/src/session-allocation.js +1 -1
- package/dist/src/session-replay-runtime-failure-response.js +1 -0
- package/dist/src/session-runtime-admission.js +1 -1
- package/dist/src/session.js +1 -1
- package/dist/src/session2.js +5 -5
- package/dist/src/settings.js +1 -1
- package/dist/src/settings2.js +1 -1
- package/dist/src/simctl-settings.js +1 -1
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-boot.js +1 -1
- package/dist/src/simulator-state.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-capture-annotations.js +1 -1
- package/dist/src/snapshot-chrome.js +1 -0
- package/dist/src/snapshot-desktop-projection.js +1 -1
- package/dist/src/snapshot-evidence.js +1 -0
- package/dist/src/snapshot-node-lookup.js +1 -0
- package/dist/src/snapshot-occlusion.js +1 -0
- package/dist/src/snapshot-quality-verdict.js +1 -0
- package/dist/src/snapshot-runtime-binding.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-state.js +1 -1
- package/dist/src/snapshot.js +1 -1
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/snapshot3.js +1 -1
- package/dist/src/src.js +5 -1
- package/dist/src/src2.js +1 -1
- package/dist/src/src3.js +2 -1
- package/dist/src/store.js +1 -1
- package/dist/src/surface-snapshot2.js +1 -1
- package/dist/src/target-evidence-tree.js +1 -0
- package/dist/src/target-evidence.js +1 -1
- package/dist/src/text-entry-focus.js +1 -1
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/touch-runtime2.js +1 -1
- package/dist/src/tree.js +1 -1
- package/dist/src/tv-remote.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/undici.js +8 -8
- package/dist/src/update-check.js +1 -1
- package/dist/src/vars.js +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/video.js +2 -2
- package/dist/src/wait.js +1 -0
- package/dist/src/web.js +1 -1
- package/dist/src/web2.js +1 -1
- package/package.json +22 -19
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.23.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.manifest.json +0 -16
- package/dist/src/adb-transport.js +0 -1
- package/dist/src/alert-runtime.js +0 -1
- package/dist/src/app-deployment-resolution.js +0 -2
- package/dist/src/app-inventory-contract.js +0 -1
- package/dist/src/app-log-session-resource.js +0 -1
- package/dist/src/application-lifecycle-runtime.js +0 -1
- package/dist/src/auth-session.js +0 -1
- package/dist/src/cache.js +0 -1
- package/dist/src/capabilities.js +0 -1
- package/dist/src/capture.js +0 -1
- package/dist/src/catalog.js +0 -1
- package/dist/src/click-button.js +0 -1
- package/dist/src/client-metro-companion.js +0 -1
- package/dist/src/client-options.js +0 -3
- package/dist/src/compatibility-policy.js +0 -1
- package/dist/src/daemon-artifacts.js +0 -1
- package/dist/src/daemon-client-transport.js +0 -1
- package/dist/src/daemon-http.js +0 -1
- package/dist/src/device-claim-rule.js +0 -1
- package/dist/src/device-rotation.js +0 -1
- package/dist/src/device-session.js +0 -3
- package/dist/src/device2.js +0 -1
- package/dist/src/device3.js +0 -3
- package/dist/src/dispatch-resolve.js +0 -4
- package/dist/src/format.js +0 -1
- package/dist/src/gesture-plan-types.js +0 -1
- package/dist/src/host.js +0 -1
- package/dist/src/human-control-contract.js +0 -1
- package/dist/src/interaction-ref-policy.js +0 -1
- package/dist/src/interactor-operation-binding.js +0 -1
- package/dist/src/keyboard-actions.js +0 -1
- package/dist/src/lease-context.js +0 -1
- package/dist/src/lease-registry-scope.js +0 -1
- package/dist/src/lease-scope.js +0 -1
- package/dist/src/managed-device-scope.js +0 -1
- package/dist/src/observe-until.js +0 -1
- package/dist/src/output-common.js +0 -5
- package/dist/src/owner-identity.js +0 -3
- package/dist/src/path-resolution.js +0 -1
- package/dist/src/perf-runtime-plan.js +0 -1
- package/dist/src/platform-runtime-app-log-process.js +0 -1
- package/dist/src/platform-runtime-managed-owner.js +0 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +0 -1
- package/dist/src/png.js +0 -1
- package/dist/src/prepare-kind.js +0 -1
- package/dist/src/provider-device-runtimes.js +0 -1
- package/dist/src/provider-session-ownership.js +0 -2
- package/dist/src/providers.js +0 -1
- package/dist/src/registry.js +0 -68
- package/dist/src/request-admission.js +0 -1
- package/dist/src/request-cancellation.js +0 -1
- package/dist/src/request-progress-protocol.js +0 -1
- package/dist/src/runner-cache-metadata.js +0 -3
- package/dist/src/runner-disposal.js +0 -1
- package/dist/src/runner-session-types.js +0 -1
- package/dist/src/runtime-admission.js +0 -1
- package/dist/src/screen-recording-admission-ledger.js +0 -1
- package/dist/src/screen-recording-resource-recovery.js +0 -1
- package/dist/src/screenshot-result.js +0 -1
- package/dist/src/script.js +0 -1
- package/dist/src/scroll-command.js +0 -1
- package/dist/src/scroll-gesture.js +0 -1
- package/dist/src/scroll-indicator.js +0 -1
- package/dist/src/session-artifact-paths.js +0 -1
- package/dist/src/session-paths.js +0 -1
- package/dist/src/session-repair-tombstone.js +0 -1
- package/dist/src/session-routing.js +0 -1
- package/dist/src/session-snapshot.js +0 -1
- package/dist/src/snapshot4.js +0 -1
- package/dist/src/src4.js +0 -1
- package/dist/src/src5.js +0 -1
- package/dist/src/src6.js +0 -1
- package/dist/src/src7.js +0 -2
- package/dist/src/src8.js +0 -115
- package/dist/src/string-enum.js +0 -1
- package/dist/src/success-text.js +0 -1
- package/dist/src/timeouts.js +0 -1
- package/dist/src/touch-reference-frame.js +0 -1
- package/dist/src/transport.js +0 -3
- package/dist/src/ttl-memo.js +0 -1
- package/dist/src/verified-file.js +0 -1
- package/dist/src/viewport.js +0 -1
- package/dist/src/window-state.js +0 -1
- /package/dist/src/{doctor-output.js → doctor-lines.js} +0 -0
package/dist/src/adapter.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{K as e,P as t}from"./sdk-contracts.js";import{c as n,r}from"./diagnostics.js";import"./diagnostics2.js";import{Jr as i,Xr as a,Yr as o}from"./sdk-batch.js";import{h as s,l as c,u as l}from"./exec.js";import"./command.js";import"./process.js";import{r as u}from"./version.js";import{f as d}from"./host-file.js";import{t as f}from"./apple-runner-platform.js";import{t as p}from"./simctl.js";import{a as m,c as ee,d as te,i as ne,l as re,n as ie,o as ae,r as oe,s as se,t as ce,u as le}from"./cache.js";import{createHash as h,randomUUID as g}from"node:crypto";import _ from"node:path";import ue from"node:net";import{Buffer as v}from"node:buffer";const de={unsupported:`UNSUPPORTED_OPERATION`,"malformed-tree":`COMMAND_FAILED`,"stale-target":`COMMAND_FAILED`,timeout:`COMMAND_FAILED`,cancelled:`COMMAND_FAILED`,"process-crash":`COMMAND_FAILED`,"transport-failure":`COMMAND_FAILED`,preparing:`COMMAND_FAILED`};var y=class extends t{failureKind;failureCode;constructor(e,t,n=`iOS Simulator snapshot source ${e}: ${t}`,r={},i){super(de[e],n,{...r,bridgeFailure:e,bridgeFailureCode:t,...e===`cancelled`?{reason:`request_canceled`}:{}},i),this.name=`SnapshotSourceError`,this.failureKind=e,this.failureCode=t}};function b(e,t,n={},r){return new y(e,t,void 0,n,r)}function x(e){return e instanceof ee?new y(e.buildFailureKind,e.buildFailureCode,void 0,e.buildDetails,e.cause):e}function S(n){return n instanceof y||(n=x(n),n instanceof y)?n:e(n)?b(`cancelled`,`abort-signal`,{},n):n instanceof t&&typeof n.details?.timeoutMs==`number`?b(`timeout`,`host-operation-timeout`,{timeoutMs:n.details.timeoutMs},n):b(`transport-failure`,`unexpected-host-error`,{error:n instanceof Error?n.message:String(n)},n)}function C(e,t,n=Date.now){if(t?.aborted)throw b(`cancelled`,`abort-signal`);return ae(e,t,n)}function w(e,t){try{return se(e,t)}catch(e){throw x(e)}}async function T(e,t,n,r){let i=Math.min(t,w(e,n));await te({waitMs:i,signal:e.signal,stop:r,cancelled:()=>b(`cancelled`,`abort-signal`)})}var fe=class{entries=new Map;probeBackAfterUses;constructor(e=8){this.probeBackAfterUses=e}consume(e,t,n){if(n)return{nativeLevels:void 0,reason:`explicit-depth`};let r=this.currentEntry(e);return r===`unidentified`?{nativeLevels:void 0,reason:`unidentified-target`}:!r||r.nativeLevels>=t?{nativeLevels:void 0,reason:`no-hint`}:r.remainingUses<=0?{nativeLevels:void 0,reason:`probe-back`}:(--r.remainingUses,{nativeLevels:r.nativeLevels,reason:`hinted`})}learn(e,t,n,r){return n||!e.targetId?`ignored`:r.rejected>0&&r.acceptedLevels<t?(this.remember(e.targetId,{generation:e.generation,nativeLevels:r.acceptedLevels,remainingUses:this.probeBackAfterUses}),`learned`):r.rejected===0&&r.acceptedLevels>=t?this.entries.delete(e.targetId)?`forgotten`:`ignored`:this.currentEntry(e)?`kept`:`ignored`}currentEntry(e){if(!e.targetId)return`unidentified`;let t=this.entries.get(e.targetId);if(t){if(t.generation!==e.generation){this.entries.delete(e.targetId);return}return t}}remember(e,t){if(this.entries.delete(e),this.entries.size>=32){let e=this.entries.keys().next().value;e!==void 0&&this.entries.delete(e)}this.entries.set(e,t)}};const E=65536;function pe(){return{...m(async(e,t,n)=>await c(e,t,n)),projectRoot:u,homeDirectory:d,start:me,connect:he,emitDiagnostic:r,withDiagnosticTimer:n,readTargetProcessStartTime:re}}function me(e,t,n,r={}){if(r.signal?.aborted)throw b(`cancelled`,`abort-signal`);let i=l(`xcrun`,p(e,[`spawn`,e.udid,t,`serve`,n,`--idle-timeout`,`60`,`--exit-on-disconnect`,`false`]),{allowFailure:!0,captureOutput:!1,detached:!0}),a=i.child.pid??0;if(a<=0)throw b(`transport-failure`,`bridge-process-pid-missing`);let o=``;return i.child.stderr?.setEncoding(`utf8`),i.child.stderr?.on(`data`,e=>{o=ge(o,String(e))}),{pid:a,wait:i.wait,isAlive:()=>i.child.exitCode===null&&i.child.signalCode===null,signal:e=>{s(a,e)||i.child.kill(e)},readLog:()=>o}}async function he(e,t){if(t.signal?.aborted)throw b(`cancelled`,`abort-signal`);let n=Math.max(1,Math.floor(t.timeoutMs));return await new Promise((r,i)=>{let a=ue.createConnection({path:e}),o=!1,s=!1,c=setTimeout(()=>{p(b(`timeout`,`bridge-connect-timeout`)),a.destroy()},n),l=()=>{p(b(`cancelled`,`abort-signal`)),a.destroy()},u=()=>{o=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`error`,d),a.off(`close`,f),a.setTimeout(0),r(a)},d=e=>{p(e),a.destroy()},f=()=>{o||p(b(`transport-failure`,`bridge-closed-before-connect`))},p=e=>{s||o||(s=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`connect`,u),a.off(`error`,d),a.off(`close`,f),i(e))};a.once(`connect`,u),a.once(`error`,d),a.once(`close`,f),t.signal?.addEventListener(`abort`,l,{once:!0}),t.signal?.aborted&&l()})}function ge(e,t){let n=e+t;return n.length<=E?n:n.slice(n.length-E)}function _e(e,t,n){let r=h(`sha256`).update(t).digest(`hex`).slice(0,12),i=h(`sha256`).update(n).digest(`hex`).slice(0,12);return _.join(`/tmp`,`agent-device-ax-${r}-${e.processId()}-${i}`,`snapshot.sock`)}const D=new WeakSet;async function O(e,t){let n;try{n=(await t.wait).exitCode}catch{n=void 0}return D.has(t)||(D.add(t),e.emitDiagnostic({level:`error`,phase:`ios.snapshot-source.bridge-process-exit`,data:{pid:t.pid,...n===void 0?{}:{exitCode:n},stderr:ve(t.readLog())}})),b(`process-crash`,`bridge-exited`,{pid:t.pid,...n===void 0?{}:{exitCode:n}})}function ve(e){let t=v.from(e);return t.length<=65536?e:t.subarray(-65536).toString(`utf8`)}const k=`agent-device-simulator-ax-v1.8.0`;Object.freeze([`verb`,`requestId`,`pid`,`generation`,`snapshotTree`,`automationMode`,`maxDepth`,`maxNodes`,`maxDurationMs`,`maxResponseBytes`,`nativeLevelsHint`]),Object.freeze([`protocolVersion`,`sourceVersion`,`requestId`,`generation`,`ok`,`pid`,`tree`,`truncated`,`automationEnabled`,`recovery`,`error_kind`,`error_code`,`error`]),Object.freeze([`XC_kAXXCAttributeElementType`,`XC_kAXXCAttributeElementBaseType`,`XC_kAXXCAttributeLabel`,`XC_kAXXCAttributeValue`,`XC_kAXXCAttributePlaceholderValue`,`XC_kAXXCAttributeIdentifier`,`XC_kAXXCAttributeFrame`,`XC_kAXXCAttributeAutomationType`,`XC_kAXXCAttributeTraits`,`XC_kAXXCAttributeIsUserInteractionEnabled`,`XC_kAXXCAttributeChildren`]);const ye=[`requests`,`rejected`,`continuations`,`acceptedLevels`];function A(e){let t=e.recovery;if(!F(t))throw b(`malformed-tree`,`recovery-invalid`);let n=ye.map(e=>[e,t[e]]);if(n.some(([,e])=>!Number.isSafeInteger(e)||e<0))throw b(`malformed-tree`,`recovery-invalid`);return Object.freeze(Object.fromEntries(n))}function j(e,t){let n;try{n=v.from(JSON.stringify(e),`utf8`)}catch(e){throw b(`malformed-tree`,`request-not-json`,{},e)}let r=n.length+4;if(r>t.maxRequestBytes)throw b(`transport-failure`,`request-limit-exceeded`,{frameBytes:r,maxRequestBytes:t.maxRequestBytes});let i=v.alloc(4);return i.writeUInt32BE(n.length,0),v.concat([i,n])}var M=class{header=v.alloc(4);headerBytes=0;chunks=[];payloadBytes=0;expectedBodyBytes;frame;maxFrameBytes;constructor(e){if(!Number.isSafeInteger(e)||e<=0)throw b(`malformed-tree`,`frame-limit-invalid`,{maxFrameBytes:e});this.maxFrameBytes=e}push(e){if(this.frame)return this.acceptTrailingChunk(e);let t=this.readHeader(e);if(t&&(this.appendPayload(e,t.offset,t.bodyBytes),this.payloadBytes===t.bodyBytes))return this.frame=v.concat(this.chunks,t.bodyBytes),this.frame}acceptTrailingChunk(e){if(e.length>0)throw b(`malformed-tree`,`multiple-frames`,{trailingBytes:e.length});return this.frame}readHeader(e){if(this.headerBytes===4)return{offset:0,bodyBytes:this.expectedBodyBytes};let t=Math.min(4-this.headerBytes,e.length);if(e.copy(this.header,this.headerBytes,0,t),this.headerBytes+=t,this.headerBytes<4)return;let n=this.header.readUInt32BE(0);if(n===0||n>this.maxFrameBytes)throw b(`malformed-tree`,`frame-limit-exceeded`,{bodyBytes:n,maxFrameBytes:this.maxFrameBytes});return this.expectedBodyBytes=n,{offset:t,bodyBytes:n}}appendPayload(e,t,n){let r=n-this.payloadBytes,i=e.length-t;if(i>r)throw b(`malformed-tree`,`multiple-frames`,{trailingBytes:i-r});i!==0&&(this.chunks.push(e.subarray(t)),this.payloadBytes+=i)}finish(){if(this.frame)return this.frame;throw b(`transport-failure`,`bridge-frame-incomplete`,{headerBytes:this.headerBytes,payloadBytes:this.payloadBytes,expectedBodyBytes:this.expectedBodyBytes})}};function N(e){let t;try{t=JSON.parse(e.toString(`utf8`))}catch(e){throw b(`malformed-tree`,`response-not-json`,{},e)}if(!F(t))throw b(`malformed-tree`,`response-not-object`);return t}function P(e){return Object.freeze({verb:`describe`,requestId:e.requestId,pid:e.pid,generation:e.generation,snapshotTree:!0,automationMode:!0,maxDepth:e.maxDepth,maxNodes:e.maxNodes,maxDurationMs:e.maxDurationMs,maxResponseBytes:e.maxResponseBytes,...e.nativeLevelsHint===void 0?{}:{nativeLevelsHint:e.nativeLevelsHint}})}function be(e,t){if(e.protocolVersion!==1)throw b(`transport-failure`,`protocol-version-mismatch`,{expected:1,observed:e.protocolVersion});if(e.sourceVersion!==`agent-device-simulator-ax-v1.8.0`)throw b(`transport-failure`,`source-version-mismatch`,{expected:k,observed:e.sourceVersion});if(e.requestId!==t)throw b(`transport-failure`,`request-id-mismatch`,{expected:t,observed:e.requestId})}function xe(e,t){if(typeof e.pid!=`number`||e.pid!==t.pid)throw b(`stale-target`,`bridge-pid-mismatch`,{expectedPid:t.pid,observedPid:e.pid});if(e.generation!==t.generation)throw b(`stale-target`,`bridge-generation-mismatch`,{expectedGeneration:t.generation,observedGeneration:e.generation})}function Se(e){let t=e.error_kind,n=typeof e.error_code==`string`?e.error_code:`guest-error`,r=typeof e.error==`string`?e.error:void 0,i=r?{guestMessage:r.slice(0,1024)}:{};throw b(t===`unsupported`?`unsupported`:t===`malformed_tree`?`malformed-tree`:t===`application_not_responding`?`timeout`:t===`application_unavailable`?`transport-failure`:t===`bad_request`?`malformed-tree`:`transport-failure`,n,i)}function F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function Ce(e){let t=new M(e.limits.maxResponseBytes-4),n=w(e.deadline,`bridge-request-deadline`);return await new Promise((r,i)=>{let a=!1,o=!1,s=setTimeout(()=>{p(b(`timeout`,`bridge-request-deadline`,{bridgeRequestSent:o})),e.socket.destroy()},n),c=()=>{p(b(`cancelled`,`abort-signal`,{bridgeRequestSent:o})),e.socket.destroy()},l=n=>{try{if(!Buffer.isBuffer(n))throw b(`transport-failure`,`bridge-data-invalid`);let r=t.push(n);if(r){let t=N(r);if(be(t,e.requestId),xe(t,{pid:e.expectedPid,generation:e.expectedGeneration}),t.ok!==!0&&Se(t),typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);f(t);return}}catch(t){p(t),e.socket.destroy()}},u=e=>p(S(e)),d=()=>{a||(e.process.isAlive()?p(b(`transport-failure`,`bridge-connection-closed`)):O(e.host,e.process).then(p))};e.process.wait.then(()=>{a||O(e.host,e.process).then(p)},e=>{a||p(S(e))});let f=e=>m(()=>r(e)),p=e=>m(()=>i(e)),m=t=>{a||(a=!0,clearTimeout(s),e.deadline.signal?.removeEventListener(`abort`,c),e.socket.off(`data`,l),e.socket.off(`error`,u),e.socket.off(`close`,d),t())};e.socket.on(`data`,l),e.socket.on(`error`,u),e.socket.on(`close`,d),e.deadline.signal?.addEventListener(`abort`,c,{once:!0});try{if(e.deadline.signal?.aborted)throw b(`cancelled`,`abort-signal`);o=!0,e.socket.write(e.frame)}catch(t){p(S(t)),e.socket.destroy()}})}var we=class{sessions=new Map;requestQueues=new Map;ownerId=g();closed=!1;host;constructor(e){this.host=e}async request(e){if(this.closed)throw b(`unsupported`,`source-closed`);return await this.withSimulatorLock(e.target.simulator.udid,e.deadline,()=>this.requestInSimulator(e))}async requestInSimulator(e){if(this.closed)throw b(`unsupported`,`source-closed`);let t=e.deadline;w(t,`bridge-request-deadline`);let n=this.sessions.get(e.target.simulator.udid),r=await this.ensureSession(e,t);try{let n=await this.readTargetStartTime(e.target,t),i=await this.exchange(r,e,t);return await this.assertTargetStillCurrent(e.target,n,t),i}catch(e){throw await this.handleRequestFailure(e,r,n)}}async handleRequestFailure(e,t,n){let r=S(e);return Ee(r,t,n)?await this.removeSession(t,!0):r.failureKind===`process-crash`?await this.removeSession(t,!1):r.failureKind===`transport-failure`&&(t.socket?.destroy(),t.socket=void 0),r}async withSimulatorLock(e,t,n){let r=this.requestQueues.get(e)??Promise.resolve(),i,a=new Promise(e=>{i=e}),o=r.then(()=>a);this.requestQueues.set(e,o);try{return await Te(r,t),await n()}finally{i(),this.requestQueues.get(e)===o&&this.requestQueues.delete(e)}}async close(){if(this.closed)return;this.closed=!0;let e=[...this.sessions.values()];this.sessions.clear(),await Promise.all(e.map(async e=>await this.dispose(e,!0)))}async ensureSession(e,t){let n=e.target.simulator.udid,r=this.sessions.get(n);if(r&&r.bridgePath===e.bridge.path&&r.process.isAlive())return(!r.socket||r.socket.destroyed)&&(r.socket=await this.connectUntilReady(r,t)),r;r&&await this.removeSession(r,!0);let i=_e(this.host,e.target.simulator.udid,this.ownerId);await this.host.ensureDirectory(_.dirname(i)),await this.host.remove(i);let a=this.host.start(e.target.simulator,e.bridge.path,i,{signal:t.signal}),o={udid:e.target.simulator.udid,bridgePath:e.bridge.path,socketPath:i,process:a};this.sessions.set(n,o);try{return o.socket=await this.connectUntilReady(o,t),o}catch(e){throw await this.removeSession(o,!0),S(e)}}async connectUntilReady(e,t){let n;for(;;){let r=w(t,`bridge-connect-deadline`);if(!e.process.isAlive())throw await O(this.host,e.process);try{return await this.host.connect(e.socketPath,{signal:t.signal,timeoutMs:Math.min(250,r)})}catch(e){if(n=e,e instanceof y&&e.failureKind===`cancelled`)throw e;let r=Math.min(20,w(t,`bridge-connect-deadline`));try{await T(t,r,`bridge-connect-deadline`)}catch(e){throw S(e)}}if(n instanceof y&&n.failureKind===`timeout`)throw n}}async exchange(e,t,n){(!e.socket||e.socket.destroyed)&&(e.socket=await this.connectUntilReady(e,n));let r=g(),i=j(P({requestId:r,pid:t.target.pid,generation:t.target.generation,maxDepth:Math.min(t.limits.maxTraversalDepth,t.maxDepth),maxNodes:t.limits.maxNodes,maxDurationMs:w(n,`bridge-request-deadline`),maxResponseBytes:t.limits.maxResponseBytes,...t.nativeLevelsHint===void 0?{}:{nativeLevelsHint:t.nativeLevelsHint}}),t.limits);return await Ce({process:e.process,socket:e.socket,frame:i,requestId:r,deadline:n,limits:t.limits,expectedPid:t.target.pid,expectedGeneration:t.target.generation,host:this.host})}async readTargetStartTime(e,t){let n=await this.host.readTargetProcessStartTime(e.pid,{signal:t.signal,timeoutMs:w(t,`target-identity-deadline`)});if(!n)throw b(`stale-target`,`target-process-unavailable`,{pid:e.pid,generation:e.generation});if(e.processStartTime!==void 0&&e.processStartTime!==n)throw b(`stale-target`,`target-process-changed`,{pid:e.pid,generation:e.generation,expectedStartTime:e.processStartTime,observedStartTime:n});return n}async assertTargetStillCurrent(e,t,n){let r=await this.host.readTargetProcessStartTime(e.pid,{signal:n.signal,timeoutMs:w(n,`target-identity-deadline`)});if(r!==t)throw b(`stale-target`,`target-process-changed`,{pid:e.pid,generation:e.generation,expectedStartTime:t,observedStartTime:r})}async removeSession(e,t){this.sessions.get(e.udid)===e&&this.sessions.delete(e.udid),await this.dispose(e,t)}async dispose(e,t){e.socket?.destroy(),e.socket=void 0,t&&e.process.isAlive()&&(e.process.signal(`SIGTERM`),await I(e.process,500),e.process.isAlive()&&(e.process.signal(`SIGKILL`),await I(e.process,500))),await this.host.remove(e.socketPath)}};async function Te(e,t){let n=w(t,`bridge-request-deadline`);await Promise.race([e,T(t,n,`bridge-request-deadline`).then(()=>{throw b(`timeout`,`bridge-request-deadline`)})])}function Ee(e,t,n){return(e.failureKind===`cancelled`||e.failureKind===`timeout`)&&(e.details?.bridgeRequestSent===!0||n!==t)}async function I(e,t){await Promise.race([e.wait.catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}const L=16777216,R=12e4,z=1e4,De=Object.freeze({maxRequestBytes:65536,maxResponseBytes:4194304,maxNodes:5e3,maxTraversalDepth:64,maxDurationMs:5e3});function B(e){let n={...De,...e??{}};for(let[e,r]of Object.entries(n))if(!Number.isSafeInteger(r)||r<=0)throw new t(`INVALID_ARGS`,`Snapshot source limit ${e} must be a positive integer`,{name:e,value:r});if(n.maxRequestBytes>n.maxResponseBytes)throw new t(`INVALID_ARGS`,`Snapshot source request bytes cannot exceed response bytes`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});if(n.maxRequestBytes>L||n.maxResponseBytes>L)throw new t(`INVALID_ARGS`,`Snapshot source frame limits exceed the bridge bound`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes,maximumFrameBytes:L});if(n.maxNodes>z||n.maxTraversalDepth>128)throw new t(`INVALID_ARGS`,`Snapshot source tree limits exceed the bridge bound`,{maxNodes:n.maxNodes,maxTraversalDepth:n.maxTraversalDepth,maximumNodes:z,maximumDepth:128});if(n.maxDurationMs>R)throw new t(`INVALID_ARGS`,`Snapshot source duration exceeds the bridge bound`,{maxDurationMs:n.maxDurationMs,maximumDurationMs:R});if(n.maxRequestBytes<=4||n.maxResponseBytes<=4)throw new t(`INVALID_ARGS`,`Snapshot source frame limits must leave room for a body`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});return Object.freeze(n)}const V=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeRuntime.h`,`SnapshotBridgeCapture.h`,`SnapshotBridgeCapture.m`],Oe=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeCapture.m`];async function ke(e,t,n){let r=await ne(e,n).catch(e=>{throw x(e)}),i=t.trim();if(!i)throw b(`unsupported`,`simulator-runtime-missing`);return{...r,simulatorRuntime:i}}const H=12e4;async function Ae(e){let t=e.deadline,n=e.sourceRoot??je(e.host);try{let r=await oe(e.host,n,V,t),i=await ke(e.host,e.runtime,t),a=e.cacheRoot??_.join(e.host.homeDirectory(),`.agent-device`,`snapshot-source`),o=await ce({host:e.host,deadline:t,cacheRoot:a,binaryFilename:`snapshot-bridge`,lockDescription:`iOS Simulator snapshot bridge cache`,keyInputs:{schemaVersion:1,protocolVersion:1,sourceVersion:k,sourceHash:r,toolchain:i,compileArgv:U({architecture:i.architecture,sourceRoot:``,outputPath:``})},build:async r=>{let a=await ie({host:e.host,deadline:t,argv:U({architecture:i.architecture,sourceRoot:n,outputPath:r}),budgetMs:H,label:`bridge`});if(a.exitCode!==0||!e.host.exists(r))throw b(`unsupported`,`native-build-failed`,{exitCode:a.exitCode,stderr:a.stderr.slice(0,4096)})}});return{path:o.path,sourceHash:r,cacheKey:o.cacheKey,protocolVersion:1,sourceVersion:k}}catch(e){throw x(e)}}function U(e){return[`--sdk`,`iphonesimulator`,`clang`,`-arch`,e.architecture,`-mios-simulator-version-min=15.0`,`-fobjc-arc`,`-Wall`,`-Wextra`,`-framework`,`Foundation`,`-framework`,`CoreGraphics`,...Oe.map(t=>_.join(e.sourceRoot,t)),`-o`,e.outputPath]}function je(e){let t=e.projectRoot(),n=_.join(t,`apple`,`snapshot-bridge`);if(V.every(t=>e.exists(_.join(n,t))))return n;let r=_.join(t,`dist`,`apple`,`snapshot-bridge`);if(V.every(t=>e.exists(_.join(r,t))))return r;throw b(`unsupported`,`native-source-missing`,{projectRoot:t})}const Me=f+H;function Ne(e){let t=e.now??Date.now,n=new Map,r=le({waitMs:2e3,waitGrant:`first-caller`,retryAfterMs:6e4,now:t}),i=async(r,i)=>{let a=C(Me,i,t);try{let t=await e.host.withDiagnosticTimer(`ios.snapshot-source.prepare`,async()=>await Ae({host:e.host,runtime:r,limits:e.limits,deadline:a,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),{producer:e.producer});return n.set(r,t),t}catch(e){throw S(e)}};return{readyBinary:async(e,t,a)=>n.get(e)||await r.value(e,{start:t=>i(e,t),wait:(e,n)=>T(t,e,a,n),pending:()=>b(`preparing`,`bridge-preparation-pending`)}),close:()=>{n.clear(),r.close()}}}function Pe(e,t){return!o(e)||!o(t)||Math.abs(t.width-t.height)<=1?!1:Math.abs(e.width-t.height)<=1&&Math.abs(e.height-t.width)<=1}const W=Object.freeze({elementType:`XC_kAXXCAttributeElementType`,elementBaseType:`XC_kAXXCAttributeElementBaseType`,label:`XC_kAXXCAttributeLabel`,value:`XC_kAXXCAttributeValue`,placeholder:`XC_kAXXCAttributePlaceholderValue`,identifier:`XC_kAXXCAttributeIdentifier`,frame:`XC_kAXXCAttributeFrame`,automationType:`XC_kAXXCAttributeAutomationType`,traits:`XC_kAXXCAttributeTraits`,userInteractionEnabled:`XC_kAXXCAttributeIsUserInteractionEnabled`,children:`XC_kAXXCAttributeChildren`}),G=`Other.Other.Application.Group.Window.Sheet.Drawer.Alert.Dialog.Button.RadioButton.RadioGroup.CheckBox.DisclosureTriangle.PopUpButton.ComboBox.MenuButton.ToolbarButton.Popover.Keyboard.Key.NavigationBar.TabBar.TabGroup.Toolbar.StatusBar.Table.TableRow.TableColumn.Outline.OutlineRow.Browser.CollectionView.Slider.PageIndicator.ProgressIndicator.ActivityIndicator.SegmentedControl.Picker.PickerWheel.Switch.Toggle.Link.Image.Icon.SearchField.ScrollView.ScrollBar.StaticText.TextField.SecureTextField.DatePicker.TextView.Menu.MenuItem.MenuBar.MenuBarItem.Map.WebView.IncrementArrow.DecrementArrow.Timeline.RatingIndicator.ValueIndicator.SplitGroup.Splitter.RelevanceIndicator.ColorWell.HelpTag.Matte.DockItem.Ruler.RulerMarker.Grid.LevelIndicator.Cell.LayoutArea.LayoutItem.Handle.Stepper.Tab.TouchBar.StatusItem`.split(`.`),K={UIApplication:`Application`,UIWindow:`Window`},Fe=new Set(Object.values(W)),Ie=1n<<8n,Le=1n<<3n,Re=1n<<21n,ze={x:0,y:0,width:0,height:0};function Be(e,t,n){let r=Array.isArray(e)?e:[e];if(r.length===0||r.some(e=>!F(e)))throw b(`malformed-tree`,`guest-tree-root-invalid`);let i=[],a=[],o=0;for(let e of r)c(e,void 0,0,!1);if(i.length>n.maxNodes)throw b(`malformed-tree`,`node-limit-exceeded`,{nodeCount:i.length,maxNodes:n.maxNodes});if(o>n.maxTraversalDepth)throw b(`malformed-tree`,`traversal-depth-exceeded`,{maxTraversalDepth:o,maxAllowedDepth:n.maxTraversalDepth});if(typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);let s=Ge(i.filter(J)[0]);return s.kind===`reported`&&Y(i,s.rect),{nodes:i,maxTraversalDepth:o,viewport:s,opaqueRemoteElements:a.filter(e=>Ue(e,s)).length,unresolvedCoordinateSpaceWindows:Ke(i,s)};function c(e,t,r,s){if(i.length>=n.maxNodes)throw b(`malformed-tree`,`node-limit-exceeded`,{maxNodes:n.maxNodes});for(let t of Object.keys(e))if(!Fe.has(t))throw b(`malformed-tree`,`node-contains-unknown-field`,{key:t});let l=e[W.children];if(!Array.isArray(l))throw b(`malformed-tree`,`children-invalid`);let u=i.length,d=Ve(e,u,t,r);i.push(d),o=Math.max(o,r),He(d,l.length,s)&&a.push(d.rect);let f=s||d.type===`WebView`;for(let e of l){if(!F(e))throw b(`malformed-tree`,`child-invalid`);c(e,u,r+1,f)}}}function Ve(e,t,n,r){let i=X(e[W.elementType]),a=X(e[W.elementBaseType]),o=Xe(e[W.automationType]),s=We(e[W.frame]),c=Je(e[W.traits]),l=c===void 0?void 0:(c&Ie)===0n,u=c===void 0||(c&Le)===0n?void 0:!0,d=c===void 0||(c&Re)===0n?void 0:!0,f=Ye(e[W.userInteractionEnabled]),p=X(e[W.placeholder])?.trim();return{index:t,...n===void 0?{}:{parentIndex:n},...q(i,o)?{type:q(i,o)}:{},...i?{role:i}:{},...a&&a!==i?{subrole:a}:{},...X(e[W.label])?{label:X(e[W.label])}:{},...Z(e[W.value])?{value:Z(e[W.value])}:{},...p?{placeholder:p}:{},...X(e[W.identifier])?{identifier:X(e[W.identifier])}:{},...s?{rect:s}:{},...l===void 0?{}:{enabled:l},...u===void 0?{}:{selected:u},...d===void 0?{}:{focused:d},...f===void 0?{}:{userInteractionEnabled:f},depth:r}}function q(e,t){if(e!==void 0&&K[e])return K[e];if(e!==void 0&&G.includes(e))return e;if(t!==void 0)return G[t]??`Other`}function He(e,t,n){return n&&e.role===`AXRemoteElement`&&t===0}function Ue(e,t){return e===void 0?!0:o(e)?t.kind!==`reported`||a(e,t.rect):!1}function We(e){if(e===void 0)return;if(!F(e))throw b(`malformed-tree`,`frame-invalid`);let t=[`X`,`Y`,`Width`,`Height`].map(t=>e[t]);if(!t.every(e=>typeof e==`number`&&Number.isFinite(e)))throw b(`malformed-tree`,`frame-invalid`);let[n,r,i,a]=t;if(i<0||a<0)throw b(`malformed-tree`,`frame-invalid`);return{x:n,y:r,width:i,height:a}}function Ge(e){return!e||!J(e)?{kind:`missing`,reason:`not-provided`}:o(e.rect)?{kind:`reported`,rect:e.rect}:{kind:`missing`,reason:e.rect?`invalid`:`not-provided`}}function J(e){return e.type===`Application`||e.type===`Window`}function Y(e,t){for(let n of e)n.hittable=n.parentIndex!==void 0&&i(n.enabled!==!1,n.rect,t)}function Ke(e,t){return t.kind===`reported`?e.filter(n=>qe(n,e)&&Pe(n.rect??ze,t.rect)).length:0}function qe(e,t){return J(e)?!0:e.parentIndex!==void 0&&J(t[e.parentIndex]??e)}function X(e){return typeof e==`string`&&e.length>0?e:void 0}function Z(e){if(typeof e==`string`)return e.length>0?e:void 0;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(e!=null)throw b(`malformed-tree`,`scalar-invalid`)}function Je(e){if(e!=null){if(typeof e!=`string`||!/^\d{1,20}$/.test(e))throw b(`malformed-tree`,`traits-invalid`);return BigInt(e)}}function Ye(e){if(e!=null){if(typeof e!=`boolean`)throw b(`malformed-tree`,`user-interaction-invalid`);return e}}function Xe(e){if(e!=null){if(!Number.isSafeInteger(e))throw b(`malformed-tree`,`automation-type-invalid`);return e}}const Q=`simulator-ax-bridge`;function Ze(e={}){let t=e.host??pe(),n=new we(t),r=new fe,i=Ne({host:t,limits:B(e.limits),producer:Q,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),a=!1;return{acquire:async o=>{try{if(a)throw b(`unsupported`,`source-closed`);Qe(o);let s=B({...e.limits,...o.limits}),c=C(s.maxDurationMs,o.signal),l=et(o.hint,s.maxTraversalDepth),u=l+1,d=o.hint.rawTraversalDepth!==null;return await t.withDiagnosticTimer(`ios.snapshot-source.acquire`,async()=>{let e=await i.readyBinary(o.target.runtime,c,`bridge-preparation-deadline`),a=r.consume(o.target,u,d),f=await n.request({target:o.target,bridge:e,limits:s,maxDepth:l,nativeLevelsHint:a.nativeLevels,deadline:c});w(c,`snapshot-decode-deadline`);let p=tt(o.hint,o.target,f,s);return $e(t,r,o.target,u,d,a,f),{stage:`acquired`,acquisition:p}},{producer:Q})}catch(e){let t=S(e);return{stage:`failed`,failure:{kind:t.failureKind,code:t.failureCode,...t.details?{details:t.details}:{}}}}},close:async()=>{a||(a=!0,i.close(),await n.close())}}}function Qe(e){if(!e.target.simulator.udid.trim()||!e.target.runtime.trim()||!e.target.generation.trim()||!Number.isSafeInteger(e.target.pid)||e.target.pid<=0)throw new t(`INVALID_ARGS`,`Simulator snapshot source target identity is incomplete`);let n=e.hint;if(n.projection!==`raw`&&n.projection!==`regular`||![`full`,`surface-observation`].includes(n.acquisitionIntent)||typeof n.interactiveOnly!=`boolean`||typeof n.customActions!=`boolean`||!$(n.rawTraversalDepth)||!$(n.regularPresentedDepth))throw new t(`INVALID_ARGS`,`Simulator snapshot source capture hint is invalid`)}function $e(e,t,n,r,i,a,o){let s=A(o),c=o.truncated===!0,l=t.learn(n,r,i,s);e.emitDiagnostic({level:`debug`,phase:`ios_snapshot_source_recovery`,data:{producer:Q,...n.targetId?{targetId:n.targetId}:{},generation:n.generation,requestedLevels:r,hint:a.reason,...a.nativeLevels===void 0?{}:{hintedLevels:a.nativeLevels},...s,truncated:c,learning:l}})}function et(e,n){let r=e.rawTraversalDepth??n;if(r>n)throw new t(`INVALID_ARGS`,`Simulator snapshot source depth exceeds its bound`,{requested:r,maximum:n});return r}function $(e){return e===null||Number.isSafeInteger(e)&&e>=0}function tt(e,t,n,r){if(n.automationEnabled!==!0)throw b(`unsupported`,`automation-mode-unavailable`);let i=n.tree,a=n.truncated;if(typeof a!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);let o=Be(i,{truncated:a},r),s=n.generation;if(typeof s!=`string`||!s)throw b(`malformed-tree`,`generation-invalid`);if(o.opaqueRemoteElements>0)throw b(`unsupported`,`remote-content-boundary`,{remoteElements:o.opaqueRemoteElements});if(o.unresolvedCoordinateSpaceWindows>0)throw b(`unsupported`,`window-coordinate-space-unresolved`,{windows:o.unresolvedCoordinateSpaceWindows});let c=Object.freeze(o.nodes.map(e=>Object.freeze({...e,pid:t.pid}))),l=nt(e,a,o.viewport),u=Object.freeze({...t.targetId?{targetId:t.targetId}:{},generation:s}),d={producer:Q,nodes:c,truncated:a,viewport:o.viewport,lineage:u,residue:l};return e.acquisitionIntent===`full`?{...d,intent:`full`,hint:{...e,acquisitionIntent:`full`}}:{...d,intent:`surface-observation`,hint:{...e,acquisitionIntent:`surface-observation`}}}function nt(e,t,n){let r=n.kind===`reported`?[]:[{kind:`unavailable-fact`,fact:`hittability`}];return Object.freeze([...r,...e.interactiveOnly?[{kind:`unavailable-fact`,fact:`interactive-query`}]:[],...t?[{kind:`truncated`}]:[],...n.kind===`missing`?[{kind:`missing-viewport`,reason:n.reason}]:[]])}export{Ze as createSimulatorSnapshotSource};
|
|
1
|
+
import{P as e,q as t}from"./sdk-contracts.js";import{c as n,r}from"./diagnostics.js";import"./diagnostics2.js";import{Jr as i,Yr as a,qr as o}from"./sdk-batch.js";import{h as s,l as c,u as l}from"./exec.js";import"./command.js";import"./process.js";import{r as u}from"./version.js";import{f as d}from"./host-file.js";import{t as f}from"./apple-runner-platform.js";import{t as p}from"./simctl.js";import{a as m,c as ee,d as te,i as ne,l as re,n as ie,o as ae,r as oe,s as se,t as ce,u as le}from"./runtime4.js";import{createHash as h,randomUUID as g}from"node:crypto";import _ from"node:path";import ue from"node:net";import{Buffer as v}from"node:buffer";const de={unsupported:`UNSUPPORTED_OPERATION`,"malformed-tree":`COMMAND_FAILED`,"stale-target":`COMMAND_FAILED`,timeout:`COMMAND_FAILED`,cancelled:`COMMAND_FAILED`,"process-crash":`COMMAND_FAILED`,"transport-failure":`COMMAND_FAILED`,preparing:`COMMAND_FAILED`};var y=class extends e{failureKind;failureCode;constructor(e,t,n=`iOS Simulator snapshot source ${e}: ${t}`,r={},i){super(de[e],n,{...r,bridgeFailure:e,bridgeFailureCode:t,...e===`cancelled`?{reason:`request_canceled`}:{}},i),this.name=`SnapshotSourceError`,this.failureKind=e,this.failureCode=t}};function b(e,t,n={},r){return new y(e,t,void 0,n,r)}function x(e){return e instanceof ee?new y(e.buildFailureKind,e.buildFailureCode,void 0,e.buildDetails,e.cause):e}function S(n){return n instanceof y||(n=x(n),n instanceof y)?n:t(n)?b(`cancelled`,`abort-signal`,{},n):n instanceof e&&typeof n.details?.timeoutMs==`number`?b(`timeout`,`host-operation-timeout`,{timeoutMs:n.details.timeoutMs},n):b(`transport-failure`,`unexpected-host-error`,{error:n instanceof Error?n.message:String(n)},n)}function C(e,t,n=Date.now){if(t?.aborted)throw b(`cancelled`,`abort-signal`);return ae(e,t,n)}function w(e,t){try{return se(e,t)}catch(e){throw x(e)}}async function T(e,t,n,r){let i=Math.min(t,w(e,n));await te({waitMs:i,signal:e.signal,stop:r,cancelled:()=>b(`cancelled`,`abort-signal`)})}var fe=class{entries=new Map;probeBackAfterUses;constructor(e=8){this.probeBackAfterUses=e}consume(e,t,n){if(n)return{nativeLevels:void 0,reason:`explicit-depth`};let r=this.currentEntry(e);return r===`unidentified`?{nativeLevels:void 0,reason:`unidentified-target`}:!r||r.nativeLevels>=t?{nativeLevels:void 0,reason:`no-hint`}:r.remainingUses<=0?{nativeLevels:void 0,reason:`probe-back`}:(--r.remainingUses,{nativeLevels:r.nativeLevels,reason:`hinted`})}learn(e,t,n,r){return n||!e.targetId?`ignored`:r.rejected>0&&r.acceptedLevels<t?(this.remember(e.targetId,{generation:e.generation,nativeLevels:r.acceptedLevels,remainingUses:this.probeBackAfterUses}),`learned`):r.rejected===0&&r.acceptedLevels>=t?this.entries.delete(e.targetId)?`forgotten`:`ignored`:this.currentEntry(e)?`kept`:`ignored`}currentEntry(e){if(!e.targetId)return`unidentified`;let t=this.entries.get(e.targetId);if(t){if(t.generation!==e.generation){this.entries.delete(e.targetId);return}return t}}remember(e,t){if(this.entries.delete(e),this.entries.size>=32){let e=this.entries.keys().next().value;e!==void 0&&this.entries.delete(e)}this.entries.set(e,t)}};const E=65536;function pe(){return{...m(async(e,t,n)=>await c(e,t,n)),projectRoot:u,homeDirectory:d,start:me,connect:he,emitDiagnostic:r,withDiagnosticTimer:n,readTargetProcessStartTime:re}}function me(e,t,n,r={}){if(r.signal?.aborted)throw b(`cancelled`,`abort-signal`);let i=l(`xcrun`,p(e,[`spawn`,e.udid,t,`serve`,n,`--idle-timeout`,`60`,`--exit-on-disconnect`,`false`]),{allowFailure:!0,captureOutput:!1,detached:!0}),a=i.child.pid??0;if(a<=0)throw b(`transport-failure`,`bridge-process-pid-missing`);let o=``;return i.child.stderr?.setEncoding(`utf8`),i.child.stderr?.on(`data`,e=>{o=ge(o,String(e))}),{pid:a,wait:i.wait,isAlive:()=>i.child.exitCode===null&&i.child.signalCode===null,signal:e=>{s(a,e)||i.child.kill(e)},readLog:()=>o}}async function he(e,t){if(t.signal?.aborted)throw b(`cancelled`,`abort-signal`);let n=Math.max(1,Math.floor(t.timeoutMs));return await new Promise((r,i)=>{let a=ue.createConnection({path:e}),o=!1,s=!1,c=setTimeout(()=>{p(b(`timeout`,`bridge-connect-timeout`)),a.destroy()},n),l=()=>{p(b(`cancelled`,`abort-signal`)),a.destroy()},u=()=>{o=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`error`,d),a.off(`close`,f),a.setTimeout(0),r(a)},d=e=>{p(e),a.destroy()},f=()=>{o||p(b(`transport-failure`,`bridge-closed-before-connect`))},p=e=>{s||o||(s=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`connect`,u),a.off(`error`,d),a.off(`close`,f),i(e))};a.once(`connect`,u),a.once(`error`,d),a.once(`close`,f),t.signal?.addEventListener(`abort`,l,{once:!0}),t.signal?.aborted&&l()})}function ge(e,t){let n=e+t;return n.length<=E?n:n.slice(n.length-E)}function _e(e,t,n){let r=h(`sha256`).update(t).digest(`hex`).slice(0,12),i=h(`sha256`).update(n).digest(`hex`).slice(0,12);return _.join(`/tmp`,`agent-device-ax-${r}-${e.processId()}-${i}`,`snapshot.sock`)}const D=new WeakSet;async function O(e,t){let n;try{n=(await t.wait).exitCode}catch{n=void 0}return D.has(t)||(D.add(t),e.emitDiagnostic({level:`error`,phase:`ios.snapshot-source.bridge-process-exit`,data:{pid:t.pid,...n===void 0?{}:{exitCode:n},stderr:ve(t.readLog())}})),b(`process-crash`,`bridge-exited`,{pid:t.pid,...n===void 0?{}:{exitCode:n}})}function ve(e){let t=v.from(e);return t.length<=65536?e:t.subarray(-65536).toString(`utf8`)}const k=`agent-device-simulator-ax-v1.8.0`;Object.freeze([`verb`,`requestId`,`pid`,`generation`,`snapshotTree`,`automationMode`,`maxDepth`,`maxNodes`,`maxDurationMs`,`maxResponseBytes`,`nativeLevelsHint`]),Object.freeze([`protocolVersion`,`sourceVersion`,`requestId`,`generation`,`ok`,`pid`,`tree`,`truncated`,`automationEnabled`,`recovery`,`error_kind`,`error_code`,`error`]),Object.freeze([`XC_kAXXCAttributeElementType`,`XC_kAXXCAttributeElementBaseType`,`XC_kAXXCAttributeLabel`,`XC_kAXXCAttributeValue`,`XC_kAXXCAttributePlaceholderValue`,`XC_kAXXCAttributeIdentifier`,`XC_kAXXCAttributeFrame`,`XC_kAXXCAttributeAutomationType`,`XC_kAXXCAttributeTraits`,`XC_kAXXCAttributeIsUserInteractionEnabled`,`XC_kAXXCAttributeChildren`]);const ye=[`requests`,`rejected`,`continuations`,`acceptedLevels`];function A(e){let t=e.recovery;if(!F(t))throw b(`malformed-tree`,`recovery-invalid`);let n=ye.map(e=>[e,t[e]]);if(n.some(([,e])=>!Number.isSafeInteger(e)||e<0))throw b(`malformed-tree`,`recovery-invalid`);return Object.freeze(Object.fromEntries(n))}function j(e,t){let n;try{n=v.from(JSON.stringify(e),`utf8`)}catch(e){throw b(`malformed-tree`,`request-not-json`,{},e)}let r=n.length+4;if(r>t.maxRequestBytes)throw b(`transport-failure`,`request-limit-exceeded`,{frameBytes:r,maxRequestBytes:t.maxRequestBytes});let i=v.alloc(4);return i.writeUInt32BE(n.length,0),v.concat([i,n])}var M=class{header=v.alloc(4);headerBytes=0;chunks=[];payloadBytes=0;expectedBodyBytes;frame;maxFrameBytes;constructor(e){if(!Number.isSafeInteger(e)||e<=0)throw b(`malformed-tree`,`frame-limit-invalid`,{maxFrameBytes:e});this.maxFrameBytes=e}push(e){if(this.frame)return this.acceptTrailingChunk(e);let t=this.readHeader(e);if(t&&(this.appendPayload(e,t.offset,t.bodyBytes),this.payloadBytes===t.bodyBytes))return this.frame=v.concat(this.chunks,t.bodyBytes),this.frame}acceptTrailingChunk(e){if(e.length>0)throw b(`malformed-tree`,`multiple-frames`,{trailingBytes:e.length});return this.frame}readHeader(e){if(this.headerBytes===4)return{offset:0,bodyBytes:this.expectedBodyBytes};let t=Math.min(4-this.headerBytes,e.length);if(e.copy(this.header,this.headerBytes,0,t),this.headerBytes+=t,this.headerBytes<4)return;let n=this.header.readUInt32BE(0);if(n===0||n>this.maxFrameBytes)throw b(`malformed-tree`,`frame-limit-exceeded`,{bodyBytes:n,maxFrameBytes:this.maxFrameBytes});return this.expectedBodyBytes=n,{offset:t,bodyBytes:n}}appendPayload(e,t,n){let r=n-this.payloadBytes,i=e.length-t;if(i>r)throw b(`malformed-tree`,`multiple-frames`,{trailingBytes:i-r});i!==0&&(this.chunks.push(e.subarray(t)),this.payloadBytes+=i)}finish(){if(this.frame)return this.frame;throw b(`transport-failure`,`bridge-frame-incomplete`,{headerBytes:this.headerBytes,payloadBytes:this.payloadBytes,expectedBodyBytes:this.expectedBodyBytes})}};function N(e){let t;try{t=JSON.parse(e.toString(`utf8`))}catch(e){throw b(`malformed-tree`,`response-not-json`,{},e)}if(!F(t))throw b(`malformed-tree`,`response-not-object`);return t}function P(e){return Object.freeze({verb:`describe`,requestId:e.requestId,pid:e.pid,generation:e.generation,snapshotTree:!0,automationMode:!0,maxDepth:e.maxDepth,maxNodes:e.maxNodes,maxDurationMs:e.maxDurationMs,maxResponseBytes:e.maxResponseBytes,...e.nativeLevelsHint===void 0?{}:{nativeLevelsHint:e.nativeLevelsHint}})}function be(e,t){if(e.protocolVersion!==1)throw b(`transport-failure`,`protocol-version-mismatch`,{expected:1,observed:e.protocolVersion});if(e.sourceVersion!==`agent-device-simulator-ax-v1.8.0`)throw b(`transport-failure`,`source-version-mismatch`,{expected:k,observed:e.sourceVersion});if(e.requestId!==t)throw b(`transport-failure`,`request-id-mismatch`,{expected:t,observed:e.requestId})}function xe(e,t){if(typeof e.pid!=`number`||e.pid!==t.pid)throw b(`stale-target`,`bridge-pid-mismatch`,{expectedPid:t.pid,observedPid:e.pid});if(e.generation!==t.generation)throw b(`stale-target`,`bridge-generation-mismatch`,{expectedGeneration:t.generation,observedGeneration:e.generation})}function Se(e){let t=e.error_kind,n=typeof e.error_code==`string`?e.error_code:`guest-error`,r=typeof e.error==`string`?e.error:void 0,i=r?{guestMessage:r.slice(0,1024)}:{};throw b(t===`unsupported`?`unsupported`:t===`malformed_tree`?`malformed-tree`:t===`application_not_responding`?`timeout`:t===`application_unavailable`?`transport-failure`:t===`bad_request`?`malformed-tree`:`transport-failure`,n,i)}function F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function Ce(e){let t=new M(e.limits.maxResponseBytes-4),n=w(e.deadline,`bridge-request-deadline`);return await new Promise((r,i)=>{let a=!1,o=!1,s=setTimeout(()=>{p(b(`timeout`,`bridge-request-deadline`,{bridgeRequestSent:o})),e.socket.destroy()},n),c=()=>{p(b(`cancelled`,`abort-signal`,{bridgeRequestSent:o})),e.socket.destroy()},l=n=>{try{if(!Buffer.isBuffer(n))throw b(`transport-failure`,`bridge-data-invalid`);let r=t.push(n);if(r){let t=N(r);if(be(t,e.requestId),xe(t,{pid:e.expectedPid,generation:e.expectedGeneration}),t.ok!==!0&&Se(t),typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);f(t);return}}catch(t){p(t),e.socket.destroy()}},u=e=>p(S(e)),d=()=>{a||(e.process.isAlive()?p(b(`transport-failure`,`bridge-connection-closed`)):O(e.host,e.process).then(p))};e.process.wait.then(()=>{a||O(e.host,e.process).then(p)},e=>{a||p(S(e))});let f=e=>m(()=>r(e)),p=e=>m(()=>i(e)),m=t=>{a||(a=!0,clearTimeout(s),e.deadline.signal?.removeEventListener(`abort`,c),e.socket.off(`data`,l),e.socket.off(`error`,u),e.socket.off(`close`,d),t())};e.socket.on(`data`,l),e.socket.on(`error`,u),e.socket.on(`close`,d),e.deadline.signal?.addEventListener(`abort`,c,{once:!0});try{if(e.deadline.signal?.aborted)throw b(`cancelled`,`abort-signal`);o=!0,e.socket.write(e.frame)}catch(t){p(S(t)),e.socket.destroy()}})}var we=class{sessions=new Map;requestQueues=new Map;ownerId=g();closed=!1;host;constructor(e){this.host=e}async request(e){if(this.closed)throw b(`unsupported`,`source-closed`);return await this.withSimulatorLock(e.target.simulator.udid,e.deadline,()=>this.requestInSimulator(e))}async requestInSimulator(e){if(this.closed)throw b(`unsupported`,`source-closed`);let t=e.deadline;w(t,`bridge-request-deadline`);let n=this.sessions.get(e.target.simulator.udid),r=await this.ensureSession(e,t);try{let n=await this.readTargetStartTime(e.target,t),i=await this.exchange(r,e,t);return await this.assertTargetStillCurrent(e.target,n,t),i}catch(e){throw await this.handleRequestFailure(e,r,n)}}async handleRequestFailure(e,t,n){let r=S(e);return Ee(r,t,n)?await this.removeSession(t,!0):r.failureKind===`process-crash`?await this.removeSession(t,!1):r.failureKind===`transport-failure`&&(t.socket?.destroy(),t.socket=void 0),r}async withSimulatorLock(e,t,n){let r=this.requestQueues.get(e)??Promise.resolve(),i,a=new Promise(e=>{i=e}),o=r.then(()=>a);this.requestQueues.set(e,o);try{return await Te(r,t),await n()}finally{i(),this.requestQueues.get(e)===o&&this.requestQueues.delete(e)}}async close(){if(this.closed)return;this.closed=!0;let e=[...this.sessions.values()];this.sessions.clear(),await Promise.all(e.map(async e=>await this.dispose(e,!0)))}async ensureSession(e,t){let n=e.target.simulator.udid,r=this.sessions.get(n);if(r&&r.bridgePath===e.bridge.path&&r.process.isAlive())return(!r.socket||r.socket.destroyed)&&(r.socket=await this.connectUntilReady(r,t)),r;r&&await this.removeSession(r,!0);let i=_e(this.host,e.target.simulator.udid,this.ownerId);await this.host.ensureDirectory(_.dirname(i)),await this.host.remove(i);let a=this.host.start(e.target.simulator,e.bridge.path,i,{signal:t.signal}),o={udid:e.target.simulator.udid,bridgePath:e.bridge.path,socketPath:i,process:a};this.sessions.set(n,o);try{return o.socket=await this.connectUntilReady(o,t),o}catch(e){throw await this.removeSession(o,!0),S(e)}}async connectUntilReady(e,t){let n;for(;;){let r=w(t,`bridge-connect-deadline`);if(!e.process.isAlive())throw await O(this.host,e.process);try{return await this.host.connect(e.socketPath,{signal:t.signal,timeoutMs:Math.min(250,r)})}catch(e){if(n=e,e instanceof y&&e.failureKind===`cancelled`)throw e;let r=Math.min(20,w(t,`bridge-connect-deadline`));try{await T(t,r,`bridge-connect-deadline`)}catch(e){throw S(e)}}if(n instanceof y&&n.failureKind===`timeout`)throw n}}async exchange(e,t,n){(!e.socket||e.socket.destroyed)&&(e.socket=await this.connectUntilReady(e,n));let r=g(),i=j(P({requestId:r,pid:t.target.pid,generation:t.target.generation,maxDepth:Math.min(t.limits.maxTraversalDepth,t.maxDepth),maxNodes:t.limits.maxNodes,maxDurationMs:w(n,`bridge-request-deadline`),maxResponseBytes:t.limits.maxResponseBytes,...t.nativeLevelsHint===void 0?{}:{nativeLevelsHint:t.nativeLevelsHint}}),t.limits);return await Ce({process:e.process,socket:e.socket,frame:i,requestId:r,deadline:n,limits:t.limits,expectedPid:t.target.pid,expectedGeneration:t.target.generation,host:this.host})}async readTargetStartTime(e,t){let n=await this.host.readTargetProcessStartTime(e.pid,{signal:t.signal,timeoutMs:w(t,`target-identity-deadline`)});if(!n)throw b(`stale-target`,`target-process-unavailable`,{pid:e.pid,generation:e.generation});if(e.processStartTime!==void 0&&e.processStartTime!==n)throw b(`stale-target`,`target-process-changed`,{pid:e.pid,generation:e.generation,expectedStartTime:e.processStartTime,observedStartTime:n});return n}async assertTargetStillCurrent(e,t,n){let r=await this.host.readTargetProcessStartTime(e.pid,{signal:n.signal,timeoutMs:w(n,`target-identity-deadline`)});if(r!==t)throw b(`stale-target`,`target-process-changed`,{pid:e.pid,generation:e.generation,expectedStartTime:t,observedStartTime:r})}async removeSession(e,t){this.sessions.get(e.udid)===e&&this.sessions.delete(e.udid),await this.dispose(e,t)}async dispose(e,t){e.socket?.destroy(),e.socket=void 0,t&&e.process.isAlive()&&(e.process.signal(`SIGTERM`),await I(e.process,500),e.process.isAlive()&&(e.process.signal(`SIGKILL`),await I(e.process,500))),await this.host.remove(e.socketPath)}};async function Te(e,t){let n=w(t,`bridge-request-deadline`);await Promise.race([e,T(t,n,`bridge-request-deadline`).then(()=>{throw b(`timeout`,`bridge-request-deadline`)})])}function Ee(e,t,n){return(e.failureKind===`cancelled`||e.failureKind===`timeout`)&&(e.details?.bridgeRequestSent===!0||n!==t)}async function I(e,t){await Promise.race([e.wait.catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}const L=16777216,R=12e4,z=1e4,De=Object.freeze({maxRequestBytes:65536,maxResponseBytes:4194304,maxNodes:5e3,maxTraversalDepth:64,maxDurationMs:5e3});function B(t){let n={...De,...t??{}};for(let[t,r]of Object.entries(n))if(!Number.isSafeInteger(r)||r<=0)throw new e(`INVALID_ARGS`,`Snapshot source limit ${t} must be a positive integer`,{name:t,value:r});if(n.maxRequestBytes>n.maxResponseBytes)throw new e(`INVALID_ARGS`,`Snapshot source request bytes cannot exceed response bytes`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});if(n.maxRequestBytes>L||n.maxResponseBytes>L)throw new e(`INVALID_ARGS`,`Snapshot source frame limits exceed the bridge bound`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes,maximumFrameBytes:L});if(n.maxNodes>z||n.maxTraversalDepth>128)throw new e(`INVALID_ARGS`,`Snapshot source tree limits exceed the bridge bound`,{maxNodes:n.maxNodes,maxTraversalDepth:n.maxTraversalDepth,maximumNodes:z,maximumDepth:128});if(n.maxDurationMs>R)throw new e(`INVALID_ARGS`,`Snapshot source duration exceeds the bridge bound`,{maxDurationMs:n.maxDurationMs,maximumDurationMs:R});if(n.maxRequestBytes<=4||n.maxResponseBytes<=4)throw new e(`INVALID_ARGS`,`Snapshot source frame limits must leave room for a body`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});return Object.freeze(n)}const V=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeRuntime.h`,`SnapshotBridgeCapture.h`,`SnapshotBridgeCapture.m`],Oe=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeCapture.m`];async function ke(e,t,n){let r=await ne(e,n).catch(e=>{throw x(e)}),i=t.trim();if(!i)throw b(`unsupported`,`simulator-runtime-missing`);return{...r,simulatorRuntime:i}}const H=12e4;async function Ae(e){let t=e.deadline,n=e.sourceRoot??je(e.host);try{let r=await oe(e.host,n,V,t),i=await ke(e.host,e.runtime,t),a=e.cacheRoot??_.join(e.host.homeDirectory(),`.agent-device`,`snapshot-source`),o=await ce({host:e.host,deadline:t,cacheRoot:a,binaryFilename:`snapshot-bridge`,lockDescription:`iOS Simulator snapshot bridge cache`,keyInputs:{schemaVersion:1,protocolVersion:1,sourceVersion:k,sourceHash:r,toolchain:i,compileArgv:U({architecture:i.architecture,sourceRoot:``,outputPath:``})},build:async r=>{let a=await ie({host:e.host,deadline:t,argv:U({architecture:i.architecture,sourceRoot:n,outputPath:r}),budgetMs:H,label:`bridge`});if(a.exitCode!==0||!e.host.exists(r))throw b(`unsupported`,`native-build-failed`,{exitCode:a.exitCode,stderr:a.stderr.slice(0,4096)})}});return{path:o.path,sourceHash:r,cacheKey:o.cacheKey,protocolVersion:1,sourceVersion:k}}catch(e){throw x(e)}}function U(e){return[`--sdk`,`iphonesimulator`,`clang`,`-arch`,e.architecture,`-mios-simulator-version-min=15.0`,`-fobjc-arc`,`-Wall`,`-Wextra`,`-framework`,`Foundation`,`-framework`,`CoreGraphics`,...Oe.map(t=>_.join(e.sourceRoot,t)),`-o`,e.outputPath]}function je(e){let t=e.projectRoot(),n=_.join(t,`apple`,`snapshot-bridge`);if(V.every(t=>e.exists(_.join(n,t))))return n;let r=_.join(t,`dist`,`apple`,`snapshot-bridge`);if(V.every(t=>e.exists(_.join(r,t))))return r;throw b(`unsupported`,`native-source-missing`,{projectRoot:t})}const Me=f+H;function Ne(e){let t=e.now??Date.now,n=new Map,r=le({waitMs:2e3,waitGrant:`first-caller`,retryAfterMs:6e4,now:t}),i=async(r,i)=>{let a=C(Me,i,t);try{let t=await e.host.withDiagnosticTimer(`ios.snapshot-source.prepare`,async()=>await Ae({host:e.host,runtime:r,limits:e.limits,deadline:a,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),{producer:e.producer});return n.set(r,t),t}catch(e){throw S(e)}};return{readyBinary:async(e,t,a)=>n.get(e)||await r.value(e,{start:t=>i(e,t),wait:(e,n)=>T(t,e,a,n),pending:()=>b(`preparing`,`bridge-preparation-pending`)}),close:()=>{n.clear(),r.close()}}}function Pe(e,t){return!i(e)||!i(t)||Math.abs(t.width-t.height)<=1?!1:Math.abs(e.width-t.height)<=1&&Math.abs(e.height-t.width)<=1}const W=Object.freeze({elementType:`XC_kAXXCAttributeElementType`,elementBaseType:`XC_kAXXCAttributeElementBaseType`,label:`XC_kAXXCAttributeLabel`,value:`XC_kAXXCAttributeValue`,placeholder:`XC_kAXXCAttributePlaceholderValue`,identifier:`XC_kAXXCAttributeIdentifier`,frame:`XC_kAXXCAttributeFrame`,automationType:`XC_kAXXCAttributeAutomationType`,traits:`XC_kAXXCAttributeTraits`,userInteractionEnabled:`XC_kAXXCAttributeIsUserInteractionEnabled`,children:`XC_kAXXCAttributeChildren`}),G=`Other.Other.Application.Group.Window.Sheet.Drawer.Alert.Dialog.Button.RadioButton.RadioGroup.CheckBox.DisclosureTriangle.PopUpButton.ComboBox.MenuButton.ToolbarButton.Popover.Keyboard.Key.NavigationBar.TabBar.TabGroup.Toolbar.StatusBar.Table.TableRow.TableColumn.Outline.OutlineRow.Browser.CollectionView.Slider.PageIndicator.ProgressIndicator.ActivityIndicator.SegmentedControl.Picker.PickerWheel.Switch.Toggle.Link.Image.Icon.SearchField.ScrollView.ScrollBar.StaticText.TextField.SecureTextField.DatePicker.TextView.Menu.MenuItem.MenuBar.MenuBarItem.Map.WebView.IncrementArrow.DecrementArrow.Timeline.RatingIndicator.ValueIndicator.SplitGroup.Splitter.RelevanceIndicator.ColorWell.HelpTag.Matte.DockItem.Ruler.RulerMarker.Grid.LevelIndicator.Cell.LayoutArea.LayoutItem.Handle.Stepper.Tab.TouchBar.StatusItem`.split(`.`),K={UIApplication:`Application`,UIWindow:`Window`},Fe=new Set(Object.values(W)),Ie=1n<<8n,Le=1n<<3n,Re=1n<<21n,ze={x:0,y:0,width:0,height:0};function Be(e,t,n){let r=Array.isArray(e)?e:[e];if(r.length===0||r.some(e=>!F(e)))throw b(`malformed-tree`,`guest-tree-root-invalid`);let i=[],a=[],o=0;for(let e of r)c(e,void 0,0,!1);if(i.length>n.maxNodes)throw b(`malformed-tree`,`node-limit-exceeded`,{nodeCount:i.length,maxNodes:n.maxNodes});if(o>n.maxTraversalDepth)throw b(`malformed-tree`,`traversal-depth-exceeded`,{maxTraversalDepth:o,maxAllowedDepth:n.maxTraversalDepth});if(typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);let s=Ke(i.filter(J)[0]);return s.kind===`reported`&&qe(i,s.rect),{nodes:i,maxTraversalDepth:o,viewport:s,opaqueRemoteElements:a.filter(e=>We(e,s)).length,unresolvedCoordinateSpaceWindows:Je(i,s)};function c(e,t,r,s){if(i.length>=n.maxNodes)throw b(`malformed-tree`,`node-limit-exceeded`,{maxNodes:n.maxNodes});for(let t of Object.keys(e))if(!Fe.has(t))throw b(`malformed-tree`,`node-contains-unknown-field`,{key:t});let l=e[W.children];if(!Array.isArray(l))throw b(`malformed-tree`,`children-invalid`);let u=i.length,d=Ve(e,u,t,r);i.push(d),o=Math.max(o,r),Ue(d,l.length,s)&&a.push(d.rect);let f=s||He(d);for(let e of l){if(!F(e))throw b(`malformed-tree`,`child-invalid`);c(e,u,r+1,f)}}}function Ve(e,t,n,r){let i=Y(e[W.elementType]),a=Y(e[W.elementBaseType]),o=Ze(e[W.automationType]),s=Ge(e[W.frame]),c=Xe(e[W.traits]),l=c===void 0?void 0:(c&Ie)===0n,u=c===void 0||(c&Le)===0n?void 0:!0,d=c===void 0||(c&Re)===0n?void 0:!0,f=Z(e[W.userInteractionEnabled]),p=Y(e[W.placeholder])?.trim();return{index:t,...n===void 0?{}:{parentIndex:n},...q(i,o)?{type:q(i,o)}:{},...i?{role:i}:{},...a&&a!==i?{subrole:a}:{},...Y(e[W.label])?{label:Y(e[W.label])}:{},...X(e[W.value])?{value:X(e[W.value])}:{},...p?{placeholder:p}:{},...Y(e[W.identifier])?{identifier:Y(e[W.identifier])}:{},...s?{rect:s}:{},...l===void 0?{}:{enabled:l},...u===void 0?{}:{selected:u},...d===void 0?{}:{focused:d},...f===void 0?{}:{userInteractionEnabled:f},depth:r}}function q(e,t){if(e!==void 0&&K[e])return K[e];if(e!==void 0&&G.includes(e))return e;if(t!==void 0)return G[t]??`Other`}function He(e){return e.type===`WebView`||e.role===`_UISceneHostingView`}function Ue(e,t,n){return n&&e.role===`AXRemoteElement`&&t===0}function We(e,t){return e===void 0?!0:i(e)?t.kind!==`reported`||a(e,t.rect):!1}function Ge(e){if(e===void 0)return;if(!F(e))throw b(`malformed-tree`,`frame-invalid`);let t=[`X`,`Y`,`Width`,`Height`].map(t=>e[t]);if(!t.every(e=>typeof e==`number`&&Number.isFinite(e)))throw b(`malformed-tree`,`frame-invalid`);let[n,r,i,a]=t;if(i<0||a<0)throw b(`malformed-tree`,`frame-invalid`);return{x:n,y:r,width:i,height:a}}function Ke(e){return!e||!J(e)?{kind:`missing`,reason:`not-provided`}:i(e.rect)?{kind:`reported`,rect:e.rect}:{kind:`missing`,reason:e.rect?`invalid`:`not-provided`}}function J(e){return e.type===`Application`||e.type===`Window`}function qe(e,t){for(let n of e)n.hittable=n.parentIndex!==void 0&&o(n.enabled!==!1,n.rect,t)}function Je(e,t){return t.kind===`reported`?e.filter(n=>Ye(n,e)&&Pe(n.rect??ze,t.rect)).length:0}function Ye(e,t){return J(e)?!0:e.parentIndex!==void 0&&J(t[e.parentIndex]??e)}function Y(e){return typeof e==`string`&&e.length>0?e:void 0}function X(e){if(typeof e==`string`)return e.length>0?e:void 0;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(e!=null)throw b(`malformed-tree`,`scalar-invalid`)}function Xe(e){if(e!=null){if(typeof e!=`string`||!/^\d{1,20}$/.test(e))throw b(`malformed-tree`,`traits-invalid`);return BigInt(e)}}function Z(e){if(e!=null){if(typeof e!=`boolean`)throw b(`malformed-tree`,`user-interaction-invalid`);return e}}function Ze(e){if(e!=null){if(!Number.isSafeInteger(e))throw b(`malformed-tree`,`automation-type-invalid`);return e}}const Q=`simulator-ax-bridge`;function Qe(e={}){let t=e.host??pe(),n=new we(t),r=new fe,i=Ne({host:t,limits:B(e.limits),producer:Q,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),a=!1;return{acquire:async o=>{try{if(a)throw b(`unsupported`,`source-closed`);$e(o);let s=B({...e.limits,...o.limits}),c=C(s.maxDurationMs,o.signal),l=tt(o.hint,s.maxTraversalDepth),u=l+1,d=o.hint.rawTraversalDepth!==null;return await t.withDiagnosticTimer(`ios.snapshot-source.acquire`,async()=>{let e=await i.readyBinary(o.target.runtime,c,`bridge-preparation-deadline`),a=r.consume(o.target,u,d),f=await n.request({target:o.target,bridge:e,limits:s,maxDepth:l,nativeLevelsHint:a.nativeLevels,deadline:c});w(c,`snapshot-decode-deadline`);let p=nt(o.hint,o.target,f,s);return et(t,r,o.target,u,d,a,f),{stage:`acquired`,acquisition:p}},{producer:Q})}catch(e){let t=S(e);return{stage:`failed`,failure:{kind:t.failureKind,code:t.failureCode,...t.details?{details:t.details}:{}}}}},close:async()=>{a||(a=!0,i.close(),await n.close())}}}function $e(t){if(!t.target.simulator.udid.trim()||!t.target.runtime.trim()||!t.target.generation.trim()||!Number.isSafeInteger(t.target.pid)||t.target.pid<=0)throw new e(`INVALID_ARGS`,`Simulator snapshot source target identity is incomplete`);let n=t.hint;if(n.projection!==`raw`&&n.projection!==`regular`||![`full`,`surface-observation`].includes(n.acquisitionIntent)||typeof n.interactiveOnly!=`boolean`||typeof n.customActions!=`boolean`||!$(n.rawTraversalDepth)||!$(n.regularPresentedDepth))throw new e(`INVALID_ARGS`,`Simulator snapshot source capture hint is invalid`)}function et(e,t,n,r,i,a,o){let s=A(o),c=o.truncated===!0,l=t.learn(n,r,i,s);e.emitDiagnostic({level:`debug`,phase:`ios_snapshot_source_recovery`,data:{producer:Q,...n.targetId?{targetId:n.targetId}:{},generation:n.generation,requestedLevels:r,hint:a.reason,...a.nativeLevels===void 0?{}:{hintedLevels:a.nativeLevels},...s,truncated:c,learning:l}})}function tt(t,n){let r=t.rawTraversalDepth??n;if(r>n)throw new e(`INVALID_ARGS`,`Simulator snapshot source depth exceeds its bound`,{requested:r,maximum:n});return r}function $(e){return e===null||Number.isSafeInteger(e)&&e>=0}function nt(e,t,n,r){if(n.automationEnabled!==!0)throw b(`unsupported`,`automation-mode-unavailable`);let i=n.tree,a=n.truncated;if(typeof a!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);let o=Be(i,{truncated:a},r),s=n.generation;if(typeof s!=`string`||!s)throw b(`malformed-tree`,`generation-invalid`);if(o.opaqueRemoteElements>0)throw b(`unsupported`,`remote-content-boundary`,{remoteElements:o.opaqueRemoteElements});if(o.unresolvedCoordinateSpaceWindows>0)throw b(`unsupported`,`window-coordinate-space-unresolved`,{windows:o.unresolvedCoordinateSpaceWindows});let c=Object.freeze(o.nodes.map(e=>Object.freeze({...e,pid:t.pid}))),l=rt(e,a,o.viewport),u=Object.freeze({...t.targetId?{targetId:t.targetId}:{},generation:s}),d={producer:Q,nodes:c,truncated:a,viewport:o.viewport,lineage:u,residue:l};return e.acquisitionIntent===`full`?{...d,intent:`full`,hint:{...e,acquisitionIntent:`full`}}:{...d,intent:`surface-observation`,hint:{...e,acquisitionIntent:`surface-observation`}}}function rt(e,t,n){let r=n.kind===`reported`?[]:[{kind:`unavailable-fact`,fact:`hittability`}];return Object.freeze([...r,...e.interactiveOnly?[{kind:`unavailable-fact`,fact:`interactive-query`}]:[],...t?[{kind:`truncated`}]:[],...n.kind===`missing`?[{kind:`missing-viewport`,reason:n.reason}]:[]])}export{Qe as createSimulatorSnapshotSource};
|
package/dist/src/adb-executor.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`).map(e=>e.trim().split(/\s+/)).filter(e=>e.length>=3).map(([,e,n])=>{let r=e;return{local:r,remote:n,ownerId:t.get(r)}})}function
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{a as n,i as r,n as i,t as a}from"./device-shell.js";import{i as o,n as s,s as c,u as l}from"./adb-failure.js";import{t as u}from"./keyed-lock.js";import{AsyncLocalStorage as d}from"node:async_hooks";let f;const p=new d;function ee(e){f=e}function m(){if(!f)throw Error(`Android adb host port is not bound; import the platform composition wiring (src/platform-runtime-android-adb-host.ts) before using the adb/IME cluster.`);return f}async function te(e,t){let n=m(),r=p.getStore(),i=n.coerceAdbResult(r?await r(e,t):await n.execAdb(e,{...t,allowFailure:!0}));if(!t?.allowFailure&&i.exitCode!==0){let{androidAdbResultError:t}=await import(`./adb-failure.js`).then(e=>e.t),{serializeAndroidAdbInvocation:n}=await Promise.resolve().then(()=>ie);throw t(`adb ${n(e).join(` `)} exited with code ${i.exitCode}`,i)}return i}async function ne(e,t){return await p.run(e,t)}function re(e){m().emitDiagnostic(e)}var ie=e({ADB_GLOBAL_OPTIONS:()=>g,ADB_MANAGED_FORBIDDEN_COMMANDS:()=>y,ADB_WAIT_STATES:()=>v,ADB_WAIT_TRANSPORTS:()=>_,adoptAndroidAdbSerial:()=>w,androidAdbHostTarget:()=>S,androidAdbInvocation:()=>C,androidAdbPayloadWithoutSerial:()=>A,androidAdbSerialTarget:()=>x,androidManagedAdbEnvironment:()=>I,applyManagedAndroidAdbServer:()=>j,lowerAndroidAdbInvocation:()=>F,normalizeAndroidAdbInstallOptions:()=>h,parseAndroidAdbArgv:()=>D,requireAndroidAdbServerPort:()=>O,requireManagedAndroidAdbCommand:()=>N,requireManagedAndroidAdbSerial:()=>M,requireSameAndroidAdbServer:()=>k,serializeAndroidAdbInvocation:()=>T});function h(e){let{replace:t,...n}=e??{};return{installArgs:t?[`-r`]:[],execOptions:n}}const g={"-a":0,"-d":0,"-e":0,"-s":1,"-t":1,"-H":1,"-P":1,"-L":1,"--one-device":1,"--exit-on-write-error":0},_=[``,`usb-`,`local-`,`any-`],v=[`device`,`recovery`,`bootloader`,`sideload`,`sideload-window`],y=[`nodaemon`,`server`,`fork-server`,`kill-server`,`start-server`,`connect`,`disconnect`,`reconnect`,`attach`,`detach`,`pair`],ae=new Set(y);function b(e){return e.startsWith(`wait-for-`)}function oe(e){if(!b(e))return;let t=e.slice(9);return _.some(e=>t.startsWith(e)&&v.includes(t.slice(e.length)))?e:void 0}function se(e){return ae.has(e)}function x(e){return{selector:{kind:`serial`,serial:e},server:{kind:`ambient`}}}function S(){return{selector:{kind:`unspecified`},server:{kind:`ambient`}}}function C(e,t,n){return{target:e,command:t,...n?{rawArgv:n}:{}}}function w(e,t){return{...e,selector:{kind:`serial`,serial:t}}}function T(e){if(e.rawArgv)return r([],e.rawArgv);let{target:t,command:n}=e,i=[];return t.server.kind===`port`&&i.push(`-P`,String(t.server.port)),t.selector.kind===`serial`&&i.push(`-s`,t.selector.serial),t.hostGlobals&&i.push(...t.hostGlobals),t.waitFor&&i.push(t.waitFor),r(i,n)}const ce={"-s":`serial`,"-P":`server`};function E(e,t){let n=e[t],r=oe(n);if(r)return{kind:`wait`,waitFor:r,next:t+1};if(b(n))return{kind:`unknown-wait`,token:n,next:t+1};let i=ce[n];if(i===void 0){if(!n.startsWith(`-`))return{kind:`stop`,next:t};let r=g[n]??0;return{kind:`global`,tokens:[n,...e.slice(t+1,t+1+r)],next:t+1+r}}let a=e[t+1]??``;if(i===`serial`)return{kind:`serial`,serial:a,next:t+2};let o=Number(a);return Number.isInteger(o)?{kind:`server`,port:o,next:t+2}:{kind:`global`,tokens:[n,a],next:t+2}}function le(e,t){e.kind===`wait`?t.waitFor===void 0?t.waitFor=e.waitFor:t.hostGlobals.push(e.waitFor):e.kind===`unknown-wait`?t.hostGlobals.push(e.token):e.kind===`serial`?t.selector.kind===`unspecified`?t.selector={kind:`serial`,serial:e.serial}:t.selector.serial!==e.serial&&t.hostGlobals.push(`-s`,e.serial):e.kind===`server`?t.server={kind:`port`,port:e.port}:e.kind===`global`&&t.hostGlobals.push(...e.tokens)}function D(e){let t=S(),r={selector:t.selector,server:t.server,waitFor:void 0,hostGlobals:[]},i=0;for(;;){let t=i<e.length?E(e,i):{kind:`stop`,next:i};if(t.kind===`stop`)break;le(t,r),i=t.next}let{selector:a,server:o,waitFor:s,hostGlobals:c}=r,l={selector:a,server:o,...s?{waitFor:s}:{},...c.length>0?{hostGlobals:c}:{}},u=c.length>0||s!==void 0||a.kind!==`unspecified`||o.kind===`port`;return{target:l,command:n(e,0,i),rawArgv:u?e:void 0}}function ue(e){if(e.rawArgv===void 0)return e.target.server.kind===`port`?e.target.server.port:void 0}function O(e,t){return k(ue(e),t?.serverPort)}function k(e,t){if(e!==void 0&&t!==void 0&&e!==t)throw P(`server`);return e??t}function A(e,t){let r=0;for(;;){let i=r<e.length?E(e,r):{kind:`stop`,next:r};if(i.kind===`stop`)return;if(i.kind===`serial`)return i.serial===t?n(e,r,2):void 0;r=i.next}}function j(e,t){let{target:n,command:r}=e;return fe(n,t.port),N(r),C({selector:n.selector,server:{kind:`port`,port:t.port},...n.waitFor?{waitFor:n.waitFor}:{}},r)}function M(e,t){return de(e.selector,t),{...e,selector:{kind:`serial`,serial:t}}}function de(e,t){if(e.kind===`serial`&&e.serial!==t)throw P(`device`)}function fe(e,t){if(e.hostGlobals)throw P(`target`);k(t,e.server.kind===`port`?e.server.port:void 0)}function N(e){if(se(e.find(e=>!b(e))??``))throw P(`target`)}const pe={device:`Managed ADB transport cannot address another device.`,target:`Managed ADB transport cannot select another target.`,server:`Managed ADB transport cannot select another server.`};function P(e){throw new t(`COMMAND_FAILED`,pe[e],{reason:`managed-device-transport-mismatch`})}function F(e,t,n){let{serverPort:r,...i}=t??{},a=O(e,t),o=a===void 0?e:j(e,{port:a}),s=a===void 0?void 0:I(o.target,n,i.env);return{args:T(o),options:{...i,...s===void 0?{}:{env:s}}}}function I(e,t,n){return e.server.kind===`port`?{...t,...n??{},ADB_SERVER_SOCKET:void 0,ANDROID_ADB_SERVER_PORT:String(e.server.port),ANDROID_ADB_SERVER_ADDRESS:`127.0.0.1`}:n}const L=new WeakSet;function R(e){return me(typeof e==`function`?{exec:e}:e)}function me(e){if(L.has(e))return e;let t={...e,exec:l(z(e.exec)),...e.pull?{pull:l(z(e.pull))}:{},...e.install?{install:l(z(e.install))}:{},...e.installBundle?{installBundle:l(e.installBundle)}:{}};return L.add(t),t}function z(e){return async(...t)=>m().coerceAdbResult(await e(...t))}const B=new WeakSet;function he(e,n){let r=R(e);if(r.reverse&&B.has(r.reverse))return r.reverse;let i=r.reverse??V(r.exec,n),a=new Map,o=new Map,s={async ensure(e,n){await u(o,e.local,async()=>{let r=a.get(e.local);if(r&&r.ownerId!==e.ownerId)throw new t(`COMMAND_FAILED`,`Android port reverse ${e.local} is already owned by ${r.ownerId??`another session`}`,{current:r,requested:e});r?.remote!==e.remote&&(await i.ensure(e,n),a.set(e.local,{...e}))})},async remove(e,t){if(!a.has(e)){await i.remove(e,t);return}await i.remove(e,t),a.delete(e)},async removeAllOwned(e,t){let n=[...a.values()].filter(t=>t.ownerId===e).map(e=>e.local);if(n.length===0){await i.removeAllOwned(e,t);return}for(let e of n)await i.remove(e,t),a.delete(e)},async list(e){return i.list?await i.list(e):[...a.values()]}};return B.add(s),s}function V(e,t={}){let n=new Map,r=async t=>{let r=await e([`reverse`,`--list`],{allowFailure:!0,signal:t?.signal,timeoutMs:t?.timeoutMs});return r.exitCode===0?H(r.stdout,n):[]},i=async(t,r)=>{let i=await e([`reverse`,`--remove`,t],{allowFailure:!0,signal:r?.signal,timeoutMs:r?.timeoutMs});if(i.exitCode!==0&&!_e(i.stdout,i.stderr))throw s(`Failed to remove Android port reverse ${t}`,i,{local:t});n.delete(t)};return{async ensure(i,a){let o=t.noRebind===!0,c=await e([`reverse`,...o?[`--no-rebind`]:[],i.local,i.remote],{allowFailure:o,signal:a?.signal,timeoutMs:a?.timeoutMs});if(c.exitCode!==0){let e=(await r(a)).find(e=>e.local===i.local);throw e?ge(i,e):s(`Failed to ensure Android port reverse ${i.local}`,c,{local:i.local,remote:i.remote})}n.set(i.local,i.ownerId)},remove:i,async removeAllOwned(e,t){let r=[...n].filter(([,t])=>t===e).map(([e])=>e);for(let e of r)await i(e,t)},list:r}}function ge(e,n){return new t(`COMMAND_FAILED`,`Android port reverse ${e.local} is already mapped on the device`,{reason:`android_port_reverse_rebind_refused`,requested:e,existing:n,hint:`agent-device does not replace an existing reverse mapping on a shared device. Remove the mapping that holds device ${e.local}, or use another device port.`})}function H(e,t){return e.split(`
|
|
2
|
+
`).map(e=>e.trim().split(/\s+/)).filter(e=>e.length>=3).map(([,e,n])=>{let r=e;return{local:r,remote:n,ownerId:t.get(r)}})}function _e(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`listener`)&&n.includes(`not found`)}const U=new d;function W(e){return Q(ve(e.id))}function ve(e){return l(async(t,n)=>{let r=m(),i=async(t,n)=>{let i=J(e,t,n);return await r.withoutAdbCommandExecutorOverride(async()=>await r.execAdb(i.invocation,i.options))};return await be(`${n?.serverPort??``}/${e}`,n,async e=>await i(t,e),async e=>{await i([`wait-for-device`],{allowFailure:!0,timeoutMs:e,signal:n?.signal,env:n?.env,serverPort:n?.serverPort}).catch(()=>void 0)})})}function ye(e,t=new Map){return{has:e=>(t.get(e)??0)>Date.now(),mark:n=>{let r=Date.now();for(let[e,n]of t)n<=r&&t.delete(e);t.set(n,r+e)},forget:e=>{t.delete(e)}}}const G=ye(3e4);async function be(e,t,n,r){let i=Date.now(),a=await K(e,async()=>await n(t));if(!a.offline||G.has(e))return a.outcome();let o=t?.timeoutMs,s=()=>o===void 0?1/0:Math.floor(o-(Date.now()-i)),c=Math.min(15e3,Math.floor(s()/2));if(c<1)return a.outcome();await r(c),t?.signal?.throwIfAborted();let l=s();if(l<1)return a.outcome();let u=await K(e,async()=>await n(o===void 0?t:{...t,timeoutMs:l}));return u.offline&&G.mark(e),u.outcome()}async function K(e,t){try{let n=await t(),r=xe(n);return r||G.forget(e),{offline:r,outcome:()=>n}}catch(t){let n=o(t),r=Se(n);return!r&&Ce(n)&&G.forget(e),{offline:r,outcome:()=>{throw n}}}}function xe(e){if(e.exitCode===0)return!1;let t=c(e.stderr,e.stdout);return q(t?.reason,t?.hostRefusal)}function Se(e){return e instanceof t&&q(e.details?.adbFailure,e.details?.adbHostRefusal)}function q(e,t){return e===`device_offline`&&t===!0}function Ce(e){if(!(e instanceof t)||e.details?.timeoutMs!==void 0)return!1;let n=e.details?.exitCode;return typeof n==`number`&&n>=0}function we(e){return $((t,n)=>{let r=J(e,t,n);return m().spawnAdb(r.invocation,r.options)})}function J(e,t,n){let{serverPort:r,...i}=n??{};return{invocation:Te(e,t,r),options:i}}function Te(e,t,n){let r=D(t),i=w(r.target,e);if(n===void 0)return C(i,r.command,[`-s`,e,...t]);let a=j(r,{port:n});return C(M(a.target,e),a.command)}function Y(e){let t=W(e);return{exec:t,spawn:we(e.id),reverse:V(t),pull:async(e,n,r)=>await t([`pull`,e,n],r),install:async(e,n)=>{let{installArgs:r,execOptions:i}=h(n);return await t([`install`,...r,e],i)}}}function Ee(e,t){let n=U.getStore();return t?Q(t):n?.serial===e.id?Q(n.provider.exec):W(e)}function X(e,t){let n=U.getStore();return Pe(t?R(t):n?.serial===e.id?R(n.provider):Y(e))}function De(e){let t=U.getStore();return t?.serial===e.id?{mode:`transport-composed`,...t.provider.spawn?{spawn:$(t.provider.spawn)}:{}}:{mode:`local`}}function Oe(e){let t=U.getStore();return t?.serial===e.id?t.provider.text:void 0}function ke(e){let t=U.getStore();return t?.serial===e.id&&t.provider.touch?t.provider:void 0}function Z(e,t){if(t)return R(t);if(e)return X(e);let n=U.getStore();if(n)return R(n.provider)}async function Ae(e,t,n){if(!e)return await n();let r={provider:R(e),serial:t.serial},i=je(r);return await U.run(r,async()=>await m().withAdbCommandExecutorOverride(i,n))}function je(e){let t=Q(e.provider.exec);return(n,r,i)=>{if(n!==`adb`)return;let a=A(r,e.serial);if(a!==void 0)return m().withoutAdbCommandExecutorOverride(async()=>await t(a,i))}}async function Me(e,t,n){return await e(i(`adb`,`shell`,t),n)}async function Ne(e,t,n){return await e(i(`adb`,`exec-out`,t),n)}function Q(e){return async(t,n)=>(a(t,`adb`),await e(t,n))}function $(e){return(t,n)=>(a(t,`adb`),e(t,n))}function Pe(e){return{...e,exec:Q(e.exec),...e.spawn?{spawn:$(e.spawn)}:{}}}async function Fe(e,n,r){let{device:i,provider:a,...o}=r??{},s=Z(i,a),c=s?.pull,l=m();if(c)return await l.withoutAdbCommandExecutorOverride(async()=>await c(e,n,o));let u=s?.exec;if(!u)throw new t(`COMMAND_FAILED`,`Android adb pull requires an adb provider`);return await l.withoutAdbCommandExecutorOverride(async()=>await u([`pull`,e,n],o))}async function Ie(e,n){let{device:r,provider:i,...a}=n??{},o=Z(r,i),s=o?.install,c=m();if(s)return await c.withoutAdbCommandExecutorOverride(async()=>await s(e,a));let l=o?.exec;if(!l)throw new t(`COMMAND_FAILED`,`Android adb install requires an adb provider`);let{installArgs:u,execOptions:d}=h(a);return await c.withoutAdbCommandExecutorOverride(async()=>await l([`install`,...u,e],d))}export{te as C,m as S,F as _,Ee as a,ee as b,ke as c,Me as d,Ae as f,x as g,C as h,Y as i,De as l,S as m,Fe as n,X as o,he as p,W as r,Oe as s,Ie as t,Ne as u,D as v,ne as w,re as x,T as y};
|
package/dist/src/adb-failure.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
2
|
-
`).map(e=>e.trim()).filter(e=>e!==``);if(n===void 0||!r.every(e=>l.test(e)))return;let i=s.find(([,,e])=>e?.hostRefusal?.test(n));return i&&{...i[1],hostRefusal:!0}}function d(e,t=``){let n=e.toLowerCase(),r=t.toLowerCase(),i=u(n,r);if(i)return i;for(let[e,t,i]of s)if(e.test(n)||i?.matchStdout&&e.test(r))return t}function f(e){if(!(e instanceof
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{B as t,P as n}from"./sdk-contracts.js";import{i as r}from"./exec.js";import"./command.js";var i=e({androidAdbResultError:()=>h,androidDiscoveryCommandError:()=>_,attachAdbFailureHint:()=>f,attachAndroidDiscoveryTimeout:()=>v,attachAndroidHelperInstallTimeoutHint:()=>p,classifyAndroidAdbFailure:()=>d,discloseAdbInputDispatch:()=>y,isAdbHostRefusal:()=>b,withAdbFailureHints:()=>g});const a=String.raw`(?:adb|error): `;function o(e){return RegExp(`^${a}${e}$`)}const s=[[/device unauthorized|device still authorizing/,{reason:`device_unauthorized`,hint:`USB debugging is not authorized — accept the authorization prompt on the device screen (re-plug the cable if none appears), then retry.`},{hostRefusal:o(String.raw`device (?:unauthorized|still authorizing)\.?`)}],[/device offline/,{reason:`device_offline`,hint:`The device is connected but offline — wait for it to finish booting or run adb reconnect, then retry.`,retriable:!0},{hostRefusal:o(String.raw`device (?:'[^']*' )?offline`)}],[/more than one (?:device\/emulator|device and emulator)/,{reason:`multiple_devices`,hint:`Multiple Android devices are connected — pass --serial <serial> (see adb devices) to select one.`},{hostRefusal:o(String.raw`more than one (?:device/emulator|device and emulator)`)}],[/no devices\/emulators found|no devices found/,{reason:`no_devices`,hint:`No Android devices detected — boot an emulator or connect a device and verify it appears in adb devices.`},{hostRefusal:o(String.raw`no devices(?:/emulators)? found`)}],[/device (?:'[^']*' )?not found/,{reason:`device_not_found`,hint:`The device disconnected or is restarting — verify it is listed in adb devices, then retry.`,retriable:!0},{hostRefusal:o(String.raw`device (?:'[^']*' )?not found`)}],[/adb server version \(\d+\) doesn't match this client/,{reason:`server_version_mismatch`,hint:`Multiple adb installs conflict — adb restarts its server automatically, so retry; align PATH to a single adb to stop recurrences.`,retriable:!0}],[/transport error|connection reset|broken pipe|protocol fault/,{reason:`connection_dropped`,hint:`The adb connection dropped — retry; if it persists, run adb kill-server and reconnect the device.`,retriable:!0}],[/install_failed_insufficient_storage/,{reason:`install_insufficient_storage`,hint:`The device is out of storage — free up space or uninstall unused apps, then retry the install.`},{matchStdout:!0}],[/install_failed_update_incompatible/,{reason:`install_update_incompatible`,hint:`The installed app has an incompatible signature — uninstall the existing app first, then retry the install.`},{matchStdout:!0}],[/install_failed_version_downgrade/,{reason:`install_version_downgrade`,hint:`The APK is older than the installed app — uninstall the app first (or install with downgrade allowed), then retry.`},{matchStdout:!0}],[/install_failed_\w+|install_parse_failed_\w+/,{reason:`install_failed`,hint:`The Android package installer rejected the APK — see the INSTALL_FAILED code in the error output for the exact cause.`},{matchStdout:!0}]],c=Object.freeze({reason:`timeout`,hint:`adb timed out — the adb server may be wedged. Run adb kill-server && adb start-server, check adb devices, then retry.`}),l=/^(?:this adb server's \$adb_vendor_keys is not set|try 'adb kill-server' if that seems wrong\.|(?:otherwise|please) check (?:for|the) (?:a )?confirmation dialog on your device\.)$/;function u(e,t){if(t!==``)return;let[n,...r]=e.split(`
|
|
2
|
+
`).map(e=>e.trim()).filter(e=>e!==``);if(n===void 0||!r.every(e=>l.test(e)))return;let i=s.find(([,,e])=>e?.hostRefusal?.test(n));return i&&{...i[1],hostRefusal:!0}}function d(e,t=``){let n=e.toLowerCase(),r=t.toLowerCase(),i=u(n,r);if(i)return i;for(let[e,t,i]of s)if(e.test(n)||i?.matchStdout&&e.test(r))return t}function f(e){if(!(e instanceof n)||e.code!==`COMMAND_FAILED`)return e;let t=m(e);return t&&(e.details={...e.details,adbFailure:t.reason,...t.hostRefusal?{adbHostRefusal:!0}:{},...typeof e.details?.hint==`string`?{}:{hint:t.hint},...t.retriable!==void 0&&e.details?.retriable===void 0?{retriable:t.retriable}:{}}),e}function p(e){if(!r(e))return e;let t=e.details?.hint;if(typeof t==`string`&&t!==c.hint)return e;let n=f(e);return n.details={...n.details,hint:`The helper install timed out — some OEM builds (ColorOS is one) hold the first install of each package behind a system install-confirmation dialog and adb waits for it. Check the device screen, confirm any pending install prompt, then retry; if none is showing, run adb kill-server && adb start-server and retry.`},n}function m(e){return typeof e.details?.timeoutMs==`number`?c:d(typeof e.details?.stderr==`string`?e.details.stderr:``,typeof e.details?.stdout==`string`?e.details.stdout:``)}function h(e,t,r){let i=t.exitCode===0?{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode,...r}:{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode,processExitError:!0,...r};return f(new n(`COMMAND_FAILED`,e,i))}function g(e){return async(...t)=>{try{return await e(...t)}catch(e){throw f(e)}}}function _(e,t,r){let i=d(t.stderr,t.stdout);return new n(`COMMAND_FAILED`,e,{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode,processExitError:!0,hint:i?.hint??r,...i?{adbFailure:i.reason}:{},...i?.retriable===void 0?{}:{retriable:i.retriable}})}function v(e){return r(e)&&(e.details={...e.details,adbFailure:c.reason,...typeof e.details?.hint==`string`?{}:{hint:c.hint}}),e}function y(e){return e instanceof n?t(e,e.code===`TOOL_MISSING`||b(e)?`no`:`unknown`):e}function b(e){return e.details?.adbHostRefusal===!0}export{v as a,y as c,f as i,b as l,h as n,p as o,_ as r,d as s,i as t,g as u};
|
package/dist/src/adb.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import"./
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import"./retry2.js";import{a as t,d as n,u as r}from"./adb-executor.js";var i=e({isAndroidShellCommandUnsupported:()=>u,reportsAndroidNoShellCommand:()=>l,runAndroidAdb:()=>a,runAndroidExecOut:()=>s,runAndroidShell:()=>o});async function a(e,n,r){return await t(e)(n,r)}async function o(e,r,i){return await n(t(e),r,i)}async function s(e,n,i){return await r(t(e),n,i)}const c=`no shell command implementation`;function l(e){return e.toLowerCase().includes(c)}function u(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(c)||n.includes(`unknown command`)}export{s as a,a as i,u as n,o,l as r,i as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{r as t}from"./diagnostics.js";import"./diagnostics2.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{r as t}from"./diagnostics.js";import"./diagnostics2.js";import{sr as n}from"./sdk-batch.js";import{m as r}from"./file.js";import{r as i}from"./process.js";import{_ as a,d as o}from"./host-file.js";import"./agent-browser-process-record.js";import s from"node:path";var c=e({DEFAULT_AGENT_BROWSER_IDLE_TIMEOUT_MS:()=>l,cleanupManagedAgentBrowserOrphans:()=>f,cleanupManagedAgentBrowserOrphansForProviderStartup:()=>p,resolveAgentBrowserIdleTimeoutMs:()=>d});const l=3e5,u=new Map;function d(e){return m(e.AGENT_BROWSER_IDLE_TIMEOUT_MS)??m(e.AGENT_DEVICE_WEB_IDLE_TIMEOUT_MS)??3e5}async function f(e,a,o={}){let s=n((o.openWebSessionNames??[]).filter(e=>e.length>0));if(s.length>0)return h(`open-web-session`,{openWebSessionNames:s});let c=d(r()),l=_(e);if(l!==void 0&&Date.now()-l<c)return h(`recent-browser-activity`,{idleTimeoutMs:c,latestActivityMs:l});let u=o.ownedProcessRecords;if(!u)return g();let f=await i(u,{openWebSessionNames:s,purposes:[`managed-web-browser`],termTimeoutMs:1500,killTimeoutMs:1e3}),p=[...f.terminatedPids];return f.inspected>0&&t({level:`warn`,phase:`web_agent_browser_orphan_cleanup`,data:{reason:a,count:f.inspected,pids:[...f.inspectedPids],signalPids:p,ownershipLostPids:[...f.ownershipLostPids],stateDir:e.stateDir,installDir:e.installDir}}),{count:f.inspected,pids:[...f.inspectedPids],processes:[],signalPids:p}}async function p(e,t={}){let n=Date.now(),r=s.resolve(e.stateDir),i=u.get(r);if(!(i!==void 0&&n-i<3e4))return u.set(r,n),await f(e,`provider-startup`,t)}function m(e){if(e===void 0||e.trim()===``)return;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0?t:void 0}function h(e,t){return{count:0,pids:[],processes:[],signalPids:[],skipped:{reason:e,...t}}}function g(){return{count:0,pids:[],processes:[],signalPids:[]}}function _(e){let t=v(e.socketDir).map(e=>y(e)).filter(e=>e!==void 0);return t.length>0?Math.max(...t):void 0}function v(e){try{return a(e).map(t=>s.join(e,t))}catch{return[]}}function y(e){try{return o(e).mtimeMs}catch{return}}export{p as n,d as r,c as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{sr as t}from"./sdk-batch.js";import{D as n,S as r,f as i,k as a,v as o}from"./file.js";import{y as s}from"./exec.js";import"./command.js";import"./process.js";import c from"node:crypto";import l from"node:path";var u=e({agentBrowserChromeLaunchMarker:()=>d,appendAgentDeviceChromeArgs:()=>f,inspectManagedAgentBrowserProcesses:()=>_,matchAgentBrowserChromeProcess:()=>p,recordManagedAgentBrowserProcesses:()=>v,summarizeAgentBrowserProcesses:()=>m,summarizeManagedAgentBrowserProcesses:()=>g});function d(e){let t=c.createHash(`sha256`);return t.update(l.resolve(e.stateDir)),t.update(`\0`),t.update(l.resolve(e.installDir)),`--agent-device-managed-web=${t.digest(`hex`).slice(0,16)}`}function f(e,t){let n=d(t),r=e?.trim();return r?x(r).includes(n)?r:`${r},${n}`:n}function p(e,t){if(!(e.pid===o()||!S(e.command))){if(e.command.includes(d(t)))return{process:e,reason:`launch-marker`};if(w(t).some(t=>T(e,t)))return{process:e,reason:`managed-browser-home`}}}function m(e,t){return b(e,e=>p(e,t))}function h(e,t){return p(e,t)??C(e,t)}function g(e,t){return b(e,e=>h(e,t))}async function _(e){return m(await y(),e)}async function v(e,t){let r=await y(),o=g(r,e),s=i(o.pids,r),c={count:s.length,pids:s.map(({pid:e})=>e),processes:s.map(t=>({process:t,reason:h(t,e)?.reason??`descendant`}))},l=c.processes.flatMap(({process:e})=>{let t=a(e.pid),r=n(e.pid);return t&&r?[{pid:e.pid,startTime:t,command:r,purpose:`managed-web-browser`}]:[]});return l.length>0&&t.replace({kind:`daemon`},l),c}async function y(){return await s(async()=>await r({timeoutMs:1500}))}function b(e,t){let n=e.flatMap(e=>{let n=t(e);return n?[n]:[]});return{count:n.length,pids:n.map(e=>e.process.pid),processes:n}}function x(e){return e.split(/[,\n]/).map(e=>e.trim()).filter(Boolean)}function S(e){return/\b(?:Google Chrome for Testing|Chrome for Testing|Chromium|chrome|chrome\.exe|chromium|chromium-browser|headless_shell)\b/i.test(e)}function C(e,t){if(e.pid===o()||S(e.command))return;let n=E(e.command),r=E(l.resolve(t.installDir));return n.includes(`${r}/`)?{process:e,reason:`agent-browser-daemon`}:void 0}function w(e){return t([l.join(e.homeDir,`.agent-browser`,`browsers`),l.join(e.runtimeHomeDir,`.agent-browser`,`browsers`)])}function T(e,t){let n=E(e.command),r=`${E(l.resolve(t)).replace(/\/+$/,``)}/`;return n.includes(r)}function E(e){return e.replaceAll(`\\`,`/`)}export{v as i,f as n,_ as r,u as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{B as e,P as t}from"./sdk-contracts.js";import{A as n}from"./sdk-batch-runner.js";import{r}from"./diagnostics.js";import"./diagnostics2.js";import{t as i}from"./scroll-gesture.js";import{f as a}from"./owner-identity.js";import{r as o}from"./exec.js";import{t as s}from"./timeouts.js";import"./command.js";import"./process.js";import"./retry.js";import{n as c}from"./audio-probe-result.js";import{i as l}from"./agent-browser-process-record.js";import{n as ee}from"./agent-browser-lifecycle.js";import{i as te,n as u,r as ne}from"./agent-browser-tool.js";function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e,t){return d(e)?e[t]:void 0}function p(e,t){let n=f(e,t);return typeof n==`string`?n:void 0}function re(e,t){let n=f(e,t);return typeof n==`boolean`?n:void 0}function m(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}const ie=[g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M];function ae(e){let t=ie.map(e=>`${e.toString()};`).join(``),n=se(e.action),r=h(e.durationMs),i=h(e.bucketMs);return`(()=>{${t}return ${M.name}({action:${n},durationMs:${r},bucketMs:${i}})})()`}function oe(e){let t=c(ce(e),{source:`media-elements`,backend:`agent-browser`,durationMs:0,elapsedMs:0,bucketMs:1e3,activeFallback:!1,mediaElementCount:0,sourceCount:0});return{...t,source:`media-elements`,mediaElementCount:t.mediaElementCount??0}}function se(e){switch(e){case`start`:return`'start'`;case`stop`:return`'stop'`;default:return`'status'`}}function h(e){return e===void 0||!Number.isFinite(e)?`undefined`:String(Math.trunc(e))}function g(e){return!Number.isFinite(e)||e<=0?-90:Math.max(-90,Math.min(0,Math.round(20*Math.log10(e))))}function _(e,t){e.notes.includes(t)||e.notes.push(t)}function v(){return Array.from(document.querySelectorAll(`audio,video`))}function y(e,t){if(!e||e.state===`stopped`)return e;clearInterval(e.timer),clearTimeout(e.timeout),e.timer=void 0,e.timeout=void 0,e.state=`stopped`,e.active=!1,e.reason=t,e.stoppedAt=Date.now();for(let t of e.analysers)try{t.analyser.disconnect(),t.source.disconnect(),t.audible&&t.source.connect(e.context.destination)}catch{}if(e.resumeOnGesture){for(let t of[`click`,`pointerdown`,`keydown`])window.removeEventListener(t,e.resumeOnGesture,!0);e.resumeOnGesture=void 0}return e}function b(e){let t=window.AudioContext||window.webkitAudioContext;if(!t)return;let n=window[e];if(n&&n.state!==`closed`)return n;let r=new t;return window[e]=r,r}function x(e,t,n){if(!(!t.currentSrc&&!t.src&&t.readyState===0))try{window[n]||(window[n]=new WeakMap);let r=window[n].get(t);return r||(r=e.context.createMediaElementSource(t),window[n].set(t,r)),r.disconnect(),{source:r,audible:!0}}catch{return}}function S(e,t){if(!(!t||typeof t.getAudioTracks!=`function`)&&t.getAudioTracks().length!==0)return{source:e.context.createMediaStreamSource(t),audible:!1}}function C(e,t){if(typeof t.captureStream==`function`)return S(e,t.captureStream())}function w(e,t){let n=e.context.createAnalyser();n.fftSize=2048,t.source.connect(n),n.connect(t.audible?e.context.destination:e.sink),e.analysers.push({...t,analyser:n,buffer:new Float32Array(n.fftSize)})}function T(e,t){let n=v();e.mediaElementCount=n.length;for(let r of n){if(e.seen.has(r))continue;let n=S(e,r.srcObject)??C(e,r)??x(e,r,t);if(!n){_(e,`Some media elements do not expose capturable audio to Web Audio.`);continue}e.seen.add(r),w(e,n)}e.sourceCount=e.analysers.length,e.sourceCount===0&&_(e,`No capturable page media audio sources were found yet.`)}function E(e){let t=0,n=0,r=0;for(let i of e.analysers){i.analyser.getFloatTimeDomainData(i.buffer);for(let e of i.buffer)t+=e*e,n+=1,r=Math.max(r,Math.abs(e))}return{rms:n>0?Math.sqrt(t/n):0,peak:r}}function D(e){let t=Math.ceil(e.durationMs/e.bucketMs)+2;e.rmsDbfs.length>t&&e.rmsDbfs.splice(0,e.rmsDbfs.length-t),e.peakDbfs.length>t&&e.peakDbfs.splice(0,e.peakDbfs.length-t)}function O(e,t){if(!e||e.state!==`running`)return;T(e,t);let n=E(e),r=g(n.rms),i=g(n.peak);e.rmsDbfs.push(r),e.peakDbfs.push(i),e.heard=e.heard||r>-90||i>-90,D(e),Date.now()-e.startedAt>=e.durationMs&&y(e,`duration`)}function k(e,t){return{audio:`probe`,state:`stopped`,active:!1,heard:!1,source:`media-elements`,backend:`agent-browser`,durationMs:Number(e.durationMs)||1e4,elapsedMs:0,bucketMs:Number(e.bucketMs)||1e3,sampleCount:0,mediaElementCount:v().length,sourceCount:0,rmsDbfs:[],peakDbfs:[],notes:t}}function A(e,t,n,r){return e?{audio:`probe`,state:e.state,active:e.state===`running`,heard:e.heard,source:`media-elements`,backend:`agent-browser`,durationMs:e.durationMs,elapsedMs:Math.max(0,Math.min((e.stoppedAt||Date.now())-e.startedAt,e.durationMs)),bucketMs:e.bucketMs,sampleCount:e.rmsDbfs.length,mediaElementCount:v().length,sourceCount:e.sourceCount,rmsDbfs:e.rmsDbfs.slice(),peakDbfs:e.peakDbfs.slice(),startedAt:new Date(e.startedAt).toISOString(),stoppedAt:e.stoppedAt?new Date(e.stoppedAt).toISOString():void 0,reason:e.reason,notes:[n,r,...e.notes]}:k(t,[n,r])}function j(e,t,n,r,i,a,o){t&&y(t,`restarted`);let s=b(r);if(!s)return k(e,[`Web Audio API is not available in this browser context.`]);let c=s.createGain();c.gain.value=0,c.connect(s.destination);let l={state:`running`,active:!0,context:s,sink:c,seen:new WeakSet,analysers:[],mediaElementCount:0,sourceCount:0,durationMs:Math.max(100,Number(e.durationMs)||1e4),bucketMs:Math.max(100,Number(e.bucketMs)||1e3),startedAt:Date.now(),stoppedAt:void 0,reason:void 0,heard:!1,rmsDbfs:[],peakDbfs:[],notes:[]};try{s.resume()}catch{_(l,`AudioContext could not be resumed by the probe.`)}l.resumeOnGesture=()=>{try{s.resume()}catch{_(l,`AudioContext could not be resumed from a user gesture.`)}};for(let e of[`click`,`pointerdown`,`keydown`])window.addEventListener(e,l.resumeOnGesture,{capture:!0,once:!0});return T(l,i),l.timer=setInterval(()=>O(l,i),l.bucketMs),l.timeout=setTimeout(()=>y(l,`duration`),l.durationMs),window[n]=l,A(l,e,a,o)}function M(e){let t=`__agentDeviceAudioProbe`,n=`__agentDeviceAudioProbeSources`,r=`Audio probe samples HTML media elements exposed to Web Audio; it is not whole-tab or system audio capture.`,i=`URL-backed media elements may be routed through the probe AudioContext while they are observed.`,a=window[t];return a&&a.state===`running`&&Date.now()-a.startedAt>=a.durationMs&&(O(a,n),y(a,`duration`)),e.action===`start`?j(e,a,t,`__agentDeviceAudioProbeContext`,n,r,i):e.action===`stop`?(a&&O(a,n),y(a,`manual`),A(a,e,r,i)):(a&&O(a,n),A(a,e,r,i))}function ce(e){return d(e)?d(e.result)?e.result:e:{}}function le(e,t={}){let n=ue(e),r=me(t.limit),i=t.include===`headers`||t.include===`all`,a=n.slice(-r).reverse().map(e=>fe(e,i)),o=t.include===`body`||t.include===`all`?[`agent-browser network requests does not expose request or response bodies.`]:void 0;return{entries:a,backend:`agent-browser`,redacted:!1,...o?{notes:o}:{}}}function ue(e){let t=d(e)&&Array.isArray(e.requests)?e.requests:e;return Array.isArray(t)?t.filter(de).map(e=>({headers:N(e.headers),method:p(e,`method`),mimeType:p(e,`mimeType`),requestId:p(e,`requestId`),resourceType:p(e,`resourceType`),responseHeaders:N(e.responseHeaders),status:m(e,`status`),timestamp:pe(e.timestamp),url:p(e,`url`)})):[]}function de(e){return d(e)}function fe(e,t){let r=e.timestamp===void 0?void 0:P(e.timestamp),i=n({requestId:e.requestId,resourceType:e.resourceType,mimeType:e.mimeType});return n({timestamp:r,method:e.method,url:e.url,status:e.status,requestHeaders:t?e.headers:void 0,responseHeaders:t?e.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}function N(e){if(!d(e))return;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return Object.keys(t).length>0?t:void 0}function pe(e){if(typeof e==`number`||typeof e==`string`)return e}function P(e){if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)?P(t):e}let t=e>1e10?e:e*1e3,n=new Date(t);return Number.isNaN(n.getTime())?String(e):n.toISOString()}function me(e){return typeof e!=`number`||!Number.isInteger(e)?25:Math.max(1,Math.min(e,200))}async function he(e,t){let n=I(p(e,`snapshot`)??``,ge(f(e,`refs`)));return t&&await F(n,t),{nodes:n.map((e,t)=>({...e.node,index:t,ref:e.ref})),truncated:re(e,`truncated`)}}async function F(e,t){for(let n=0;n<e.length;n+=8){let r=e.slice(n,n+8),i=await Promise.all(r.map(e=>t(e.ref)));for(let[e,t]of i.entries())t&&(r[e].node.rect=t)}}function I(e,t){let n=new Map(t.map(e=>[e.ref,e])),r=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){let e=ye(t);if(!e)continue;i.add(e);let o=n.get(e)?.data,s=_e(t),c=L(t,o,s),l=ve(a,s);l!==void 0&&(c.parentIndex=l),r.push({ref:e,node:{...c,index:r.length}}),a.set(s,r.length-1)}for(let e of t)i.has(e.ref)||r.push({ref:e.ref,node:{...R(e.data),index:r.length}});return r}function L(e,t,n){let r=be(e)??V(t,[`role`,`type`]);return{index:0,type:r,role:r,label:xe(e)??V(t,[`label`,`name`,`text`]),value:Ce(e)??V(t,[`value`]),depth:n,enabled:H(t,[`enabled`])??(!Se(e)&&void 0),focused:H(t,[`focused`])}}function R(e){let t=V(e,[`role`,`type`]);return{index:0,type:t,role:t,label:V(e,[`label`,`name`,`text`]),value:V(e,[`value`]),enabled:H(e,[`enabled`]),focused:H(e,[`focused`])}}function ge(e){return Array.isArray(e)?e.flatMap(e=>{let t=d(e)?e:void 0,n=B(V(t,[`ref`,`id`])??String(e));return n?[{ref:n,data:t}]:[]}):d(e)?Object.entries(e).flatMap(([e,t])=>{let n=B(e);return n?[{ref:n,data:d(t)?t:void 0}]:[]}):[]}function _e(e){let t=e.match(/^\s*/)?.[0].length??0;return Math.floor(t/2)}function ve(e,t){for(let n=t-1;n>=0;--n){let t=e.get(n);if(t!==void 0)return t}}function ye(e){return B(z(e)?.match(/\bref\s*=\s*['"]?(@?e\d+)['"]?/i)?.[1]??e.match(/@?(e\d+)\b/i)?.[1])}function z(e){return e.replaceAll(/"(?:[^"\\]|\\.)*"/g,`""`).replaceAll(/'(?:[^'\\]|\\.)*'/g,`''`).match(/\[([^\]]*\bref\s*=\s*['"]?@?e\d+[^\]]*)\]\s*(?=:|$)/i)?.[1]}function B(e){let t=e?.trim().replace(/^@/,``);return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function be(e){return e.replaceAll(/\[[^\]]*ref[^\]]*\]/gi,``).replaceAll(/@?e\d+\b/gi,``).replaceAll(/^[\s|├└─>*-]+/g,``).trim().match(/^([A-Za-z][\w-]*)\b/)?.[1]}function xe(e){return e.match(/"([^"]+)"/)?.[1]??e.match(/'([^']+)'/)?.[1]}function Se(e){return/\bdisabled\b/i.test(z(e)??``)}function Ce(e){return we(e)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)}function we(e){return e.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0}function V(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function H(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`boolean`)return t}}function U(e){return typeof e==`string`}const W=`agent-browser`,G="Run `agent-device web setup` to install the managed web backend.";function Te(e={}){let t=e.session?.trim(),n=async(n,r)=>await Fe(n,{session:t,options:e,signal:r});return{async open(e){await n([`open`,e])},async close(){await n([`close`])},async startRecording(e){await n([`record`,`start`,e])},async stopRecording(){await n([`record`,`stop`])},async snapshot(e){return await je(t=>n(t,e?.signal),e)},async screenshot(e,t){await n([`screenshot`,...t?.fullscreen?[`--full`]:[],e])},async setViewport(e,t){await n([`set`,`viewport`,String(e),String(t)])},async click(e,t){await K(n,e,t)},async hover(e,t){await q(n,e,t)},async hoverRef(e){await n([`hover`,Z(e)])},async clickRef(e){await n([`click`,Z(e)])},async fill(e,t,r){if(await K(n,e,t),await n([`press`,Ue()]),r.length===0){await n([`press`,`Backspace`]);return}await n([`keyboard`,`type`,r])},async fillRef(e,t){await n([`fill`,Z(e),t])},async typeText(e){await n([`keyboard`,`type`,e])},async scroll(e,t){return await Ee(n,e,t),t?.durationMs===void 0?{}:{durationMs:t.durationMs}},async dumpNetwork(e){return le(await n([`network`,`requests`]),e)},async probeAudio(e){return oe(await n([`eval`,ae(e)]))}}}async function Ee(t,n,r){let i=Oe(De(r)),a=0;try{for(let e of i)await t(Ae(n,e.distance)),a+=1,e.delayAfterMs>0&&await s(e.delayAfterMs)}catch(t){throw e(t,a)}}function De(e){let t=e?.durationMs,n=t===void 0?{}:{durationMs:t};return e?.pixels===void 0?e?.amount===void 0?n:{distance:Math.max(1,Math.round(300*e.amount/i)),...n}:{distance:e.pixels,...n}}function Oe(e){let{distance:t,durationMs:n}=e;if(n===void 0||n<=0)return[{distance:t,delayAfterMs:0}];let r=Math.max(1,Math.min(20,Math.ceil(n/50))),i=n/Math.max(1,r-1);return ke(Math.round(t??300),r).map((e,t)=>({distance:e,delayAfterMs:t<r-1?i:0}))}function ke(e,t){let n=Math.floor(e/t),r=e-n*t;return Array.from({length:t},(e,t)=>t<r?n+1:n)}function Ae(e,t){return[`scroll`,e,...t===void 0?[]:[String(t)]]}async function K(e,t,n){await q(e,t,n),await e([`mouse`,`down`]),await e([`mouse`,`up`])}async function q(e,t,n){await e([`mouse`,`move`,String(Math.round(t)),String(Math.round(n))])}async function je(e,t){return await he(await e(Me(t)),t?.includeRects?async t=>await Ne(e,t):void 0)}function Me(e){return[`snapshot`,...e?.interactiveOnly?[`--interactive`]:[],...e?.raw?[]:[`--compact`],...typeof e?.depth==`number`?[`--depth`,String(e.depth)]:[],...e?.scope?[`--selector`,e.scope]:[]]}async function Ne(e,t){try{return We(await e([`get`,`box`,Z(t)]))}catch(e){if(Pe(e))return;throw e}}function Pe(e){let t=e instanceof Error?e.message:String(e);return!/\bstale\b/i.test(t)&&/\bbox\b|not visible|not found|no element/i.test(t)}async function Fe(e,t){let{session:n,options:r,signal:i}=t,a=[...e,`--json`,...n?[`--session`,n]:[]];return await Ie(a,r,e=>Y(ze(e.stdout,e.stderr,a,e.exitCode),e,a),i)}async function Ie(e,t,n,r){let i=``,a=``,o=0,s=!1,c=!1,l=u({stateDir:t.stateDir});try{await Re(t);let n=await te(e,{stateDir:t.stateDir,allowFailure:!0,timeoutMs:3e4,signal:r});i=n.stdout,a=n.stderr,o=n.exitCode,s=!0}catch(n){throw await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l}),Be(n,e)}try{let e=n({stdout:i,stderr:a,exitCode:o});return c=!0,e}finally{await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l})}}async function J(e){let t=e.options.ownedProcessRecords;if(!(!t||!e.status.installed))try{let n=e.options.openWebSessionNames?.()??[],r=e.options.session?.trim();Le(e,n.filter(e=>e!==r).length)?t.clear({kind:`daemon`}):await l(e.status,t)}catch(e){r({level:`warn`,phase:`web_agent_browser_process_record_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Le(e,t){return e.commandCompleted&&e.semanticSuccess&&e.cliArgs[0]===`close`&&e.exitCode===0&&t===0}async function Re(e){if(!e.openWebSessionNames)return;let t=u({stateDir:e.stateDir});if(t.installed)try{await ee(t,{openWebSessionNames:e.openWebSessionNames(),...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}catch(e){r({level:`warn`,phase:`web_agent_browser_provider_orphan_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Y(e,n,r){if(!d(e))return e;if((e.success??e.ok)===!1)throw new t(He(e.code),Ve(e),{cmd:W,args:r,hint:p(e,`hint`)??G,agentBrowserError:e.error});if(n.exitCode!==0)throw new t(`COMMAND_FAILED`,`agent-browser command failed`,o(n,{cmd:W,args:r,stdout:n.stdout.slice(0,500),stderr:n.stderr.slice(0,500),hint:p(e,`hint`)??G}));return Object.hasOwn(e,`data`)?e.data:e}function ze(e,n,r,i){try{return JSON.parse(e)}catch(a){let o=i!==0;throw new t(`COMMAND_FAILED`,o?`agent-browser command failed`:`agent-browser returned invalid JSON`,{cmd:W,args:r,...o?{exitCode:i}:{},stdout:e.slice(0,500),stderr:n.slice(0,500),hint:G},a instanceof Error?a:void 0)}}function Be(e,n){let r=ne(e);return r.code===`TOOL_MISSING`?new t(`TOOL_MISSING`,r.message,{...r.details??{},cmd:W,args:n,hint:X(r)},r):r.code===`COMMAND_FAILED`?new t(`COMMAND_FAILED`,r.message,{...r.details??{},cmd:W,args:n,hint:X(r)},r):r}function X(e){return typeof e.details?.hint==`string`?e.details.hint:G}function Ve(e){let t=e.error;if(typeof t==`string`&&t.trim())return t.trim();if(d(t)){let e=p(t,`message`)??p(t,`error`);if(e)return e}return p(e,`message`)??`agent-browser command failed`}function He(e){return typeof e==`string`&&e.length>0?e:`COMMAND_FAILED`}function Z(e){return e.startsWith(`@`)?e:`@${e}`}function Ue(){return a()===`darwin`?`Meta+a`:`Control+a`}function We(e){let t=d(e)&&d(e.box)?e.box:e;if(d(t))return Ge(t)??Ke(t)}function Ge(e){return Q(m(e,`x`),m(e,`y`),m(e,`width`),m(e,`height`))}function Ke(e){let t=m(e,`left`),n=m(e,`top`),r=m(e,`right`),i=m(e,`bottom`);return Q(t,n,$(r,t),$(i,n))}function Q(e,t,n,r){if(e!==void 0&&t!==void 0&&n!==void 0&&r!==void 0)return{x:e,y:t,width:n,height:r}}function $(e,t){return e===void 0||t===void 0?void 0:e-t}export{Te as createAgentBrowserWebProvider};
|
|
1
|
+
import{P as e,V as t}from"./sdk-contracts.js";import{G as n}from"./tv-remote.js";import{A as r}from"./sdk-batch-runner.js";import{r as i}from"./diagnostics.js";import"./diagnostics2.js";import{_ as a}from"./file.js";import{r as o}from"./exec.js";import{i as s}from"./retry.js";import"./command.js";import"./process.js";import"./retry2.js";import{n as c}from"./audio-probe-result.js";import{i as l}from"./agent-browser-process-record.js";import{n as ee}from"./agent-browser-lifecycle.js";import{i as te,n as u,r as ne}from"./agent-browser-tool.js";function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e,t){return d(e)?e[t]:void 0}function p(e,t){let n=f(e,t);return typeof n==`string`?n:void 0}function re(e,t){let n=f(e,t);return typeof n==`boolean`?n:void 0}function m(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}const ie=[g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M];function ae(e){let t=ie.map(e=>`${e.toString()};`).join(``),n=se(e.action),r=h(e.durationMs),i=h(e.bucketMs);return`(()=>{${t}return ${M.name}({action:${n},durationMs:${r},bucketMs:${i}})})()`}function oe(e){let t=c(ce(e),{source:`media-elements`,backend:`agent-browser`,durationMs:0,elapsedMs:0,bucketMs:1e3,activeFallback:!1,mediaElementCount:0,sourceCount:0});return{...t,source:`media-elements`,mediaElementCount:t.mediaElementCount??0}}function se(e){switch(e){case`start`:return`'start'`;case`stop`:return`'stop'`;default:return`'status'`}}function h(e){return e===void 0||!Number.isFinite(e)?`undefined`:String(Math.trunc(e))}function g(e){return!Number.isFinite(e)||e<=0?-90:Math.max(-90,Math.min(0,Math.round(20*Math.log10(e))))}function _(e,t){e.notes.includes(t)||e.notes.push(t)}function v(){return Array.from(document.querySelectorAll(`audio,video`))}function y(e,t){if(!e||e.state===`stopped`)return e;clearInterval(e.timer),clearTimeout(e.timeout),e.timer=void 0,e.timeout=void 0,e.state=`stopped`,e.active=!1,e.reason=t,e.stoppedAt=Date.now();for(let t of e.analysers)try{t.analyser.disconnect(),t.source.disconnect(),t.audible&&t.source.connect(e.context.destination)}catch{}if(e.resumeOnGesture){for(let t of[`click`,`pointerdown`,`keydown`])window.removeEventListener(t,e.resumeOnGesture,!0);e.resumeOnGesture=void 0}return e}function b(e){let t=window.AudioContext||window.webkitAudioContext;if(!t)return;let n=window[e];if(n&&n.state!==`closed`)return n;let r=new t;return window[e]=r,r}function x(e,t,n){if(!(!t.currentSrc&&!t.src&&t.readyState===0))try{window[n]||(window[n]=new WeakMap);let r=window[n].get(t);return r||(r=e.context.createMediaElementSource(t),window[n].set(t,r)),r.disconnect(),{source:r,audible:!0}}catch{return}}function S(e,t){if(!(!t||typeof t.getAudioTracks!=`function`)&&t.getAudioTracks().length!==0)return{source:e.context.createMediaStreamSource(t),audible:!1}}function C(e,t){if(typeof t.captureStream==`function`)return S(e,t.captureStream())}function w(e,t){let n=e.context.createAnalyser();n.fftSize=2048,t.source.connect(n),n.connect(t.audible?e.context.destination:e.sink),e.analysers.push({...t,analyser:n,buffer:new Float32Array(n.fftSize)})}function T(e,t){let n=v();e.mediaElementCount=n.length;for(let r of n){if(e.seen.has(r))continue;let n=S(e,r.srcObject)??C(e,r)??x(e,r,t);if(!n){_(e,`Some media elements do not expose capturable audio to Web Audio.`);continue}e.seen.add(r),w(e,n)}e.sourceCount=e.analysers.length,e.sourceCount===0&&_(e,`No capturable page media audio sources were found yet.`)}function E(e){let t=0,n=0,r=0;for(let i of e.analysers){i.analyser.getFloatTimeDomainData(i.buffer);for(let e of i.buffer)t+=e*e,n+=1,r=Math.max(r,Math.abs(e))}return{rms:n>0?Math.sqrt(t/n):0,peak:r}}function D(e){let t=Math.ceil(e.durationMs/e.bucketMs)+2;e.rmsDbfs.length>t&&e.rmsDbfs.splice(0,e.rmsDbfs.length-t),e.peakDbfs.length>t&&e.peakDbfs.splice(0,e.peakDbfs.length-t)}function O(e,t){if(!e||e.state!==`running`)return;T(e,t);let n=E(e),r=g(n.rms),i=g(n.peak);e.rmsDbfs.push(r),e.peakDbfs.push(i),e.heard=e.heard||r>-90||i>-90,D(e),Date.now()-e.startedAt>=e.durationMs&&y(e,`duration`)}function k(e,t){return{audio:`probe`,state:`stopped`,active:!1,heard:!1,source:`media-elements`,backend:`agent-browser`,durationMs:Number(e.durationMs)||1e4,elapsedMs:0,bucketMs:Number(e.bucketMs)||1e3,sampleCount:0,mediaElementCount:v().length,sourceCount:0,rmsDbfs:[],peakDbfs:[],notes:t}}function A(e,t,n,r){return e?{audio:`probe`,state:e.state,active:e.state===`running`,heard:e.heard,source:`media-elements`,backend:`agent-browser`,durationMs:e.durationMs,elapsedMs:Math.max(0,Math.min((e.stoppedAt||Date.now())-e.startedAt,e.durationMs)),bucketMs:e.bucketMs,sampleCount:e.rmsDbfs.length,mediaElementCount:v().length,sourceCount:e.sourceCount,rmsDbfs:e.rmsDbfs.slice(),peakDbfs:e.peakDbfs.slice(),startedAt:new Date(e.startedAt).toISOString(),stoppedAt:e.stoppedAt?new Date(e.stoppedAt).toISOString():void 0,reason:e.reason,notes:[n,r,...e.notes]}:k(t,[n,r])}function j(e,t,n,r,i,a,o){t&&y(t,`restarted`);let s=b(r);if(!s)return k(e,[`Web Audio API is not available in this browser context.`]);let c=s.createGain();c.gain.value=0,c.connect(s.destination);let l={state:`running`,active:!0,context:s,sink:c,seen:new WeakSet,analysers:[],mediaElementCount:0,sourceCount:0,durationMs:Math.max(100,Number(e.durationMs)||1e4),bucketMs:Math.max(100,Number(e.bucketMs)||1e3),startedAt:Date.now(),stoppedAt:void 0,reason:void 0,heard:!1,rmsDbfs:[],peakDbfs:[],notes:[]};try{s.resume()}catch{_(l,`AudioContext could not be resumed by the probe.`)}l.resumeOnGesture=()=>{try{s.resume()}catch{_(l,`AudioContext could not be resumed from a user gesture.`)}};for(let e of[`click`,`pointerdown`,`keydown`])window.addEventListener(e,l.resumeOnGesture,{capture:!0,once:!0});return T(l,i),l.timer=setInterval(()=>O(l,i),l.bucketMs),l.timeout=setTimeout(()=>y(l,`duration`),l.durationMs),window[n]=l,A(l,e,a,o)}function M(e){let t=`__agentDeviceAudioProbe`,n=`__agentDeviceAudioProbeSources`,r=`Audio probe samples HTML media elements exposed to Web Audio; it is not whole-tab or system audio capture.`,i=`URL-backed media elements may be routed through the probe AudioContext while they are observed.`,a=window[t];return a&&a.state===`running`&&Date.now()-a.startedAt>=a.durationMs&&(O(a,n),y(a,`duration`)),e.action===`start`?j(e,a,t,`__agentDeviceAudioProbeContext`,n,r,i):e.action===`stop`?(a&&O(a,n),y(a,`manual`),A(a,e,r,i)):(a&&O(a,n),A(a,e,r,i))}function ce(e){return d(e)?d(e.result)?e.result:e:{}}function le(e,t={}){let n=ue(e),r=me(t.limit),i=t.include===`headers`||t.include===`all`,a=n.slice(-r).reverse().map(e=>fe(e,i)),o=t.include===`body`||t.include===`all`?[`agent-browser network requests does not expose request or response bodies.`]:void 0;return{entries:a,backend:`agent-browser`,redacted:!1,...o?{notes:o}:{}}}function ue(e){let t=d(e)&&Array.isArray(e.requests)?e.requests:e;return Array.isArray(t)?t.filter(de).map(e=>({headers:N(e.headers),method:p(e,`method`),mimeType:p(e,`mimeType`),requestId:p(e,`requestId`),resourceType:p(e,`resourceType`),responseHeaders:N(e.responseHeaders),status:m(e,`status`),timestamp:pe(e.timestamp),url:p(e,`url`)})):[]}function de(e){return d(e)}function fe(e,t){let n=e.timestamp===void 0?void 0:P(e.timestamp),i=r({requestId:e.requestId,resourceType:e.resourceType,mimeType:e.mimeType});return r({timestamp:n,method:e.method,url:e.url,status:e.status,requestHeaders:t?e.headers:void 0,responseHeaders:t?e.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}function N(e){if(!d(e))return;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return Object.keys(t).length>0?t:void 0}function pe(e){if(typeof e==`number`||typeof e==`string`)return e}function P(e){if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)?P(t):e}let t=e>1e10?e:e*1e3,n=new Date(t);return Number.isNaN(n.getTime())?String(e):n.toISOString()}function me(e){return typeof e!=`number`||!Number.isInteger(e)?25:Math.max(1,Math.min(e,200))}async function he(e,t){let n=I(p(e,`snapshot`)??``,ge(f(e,`refs`)));return t&&await F(n,t),{nodes:n.map((e,t)=>({...e.node,index:t,ref:e.ref})),truncated:re(e,`truncated`)}}async function F(e,t){for(let n=0;n<e.length;n+=8){let r=e.slice(n,n+8),i=await Promise.all(r.map(e=>t(e.ref)));for(let[e,t]of i.entries())t&&(r[e].node.rect=t)}}function I(e,t){let n=new Map(t.map(e=>[e.ref,e])),r=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){let e=ye(t);if(!e)continue;i.add(e);let o=n.get(e)?.data,s=_e(t),c=L(t,o,s),l=ve(a,s);l!==void 0&&(c.parentIndex=l),r.push({ref:e,node:{...c,index:r.length}}),a.set(s,r.length-1)}for(let e of t)i.has(e.ref)||r.push({ref:e.ref,node:{...R(e.data),index:r.length}});return r}function L(e,t,n){let r=be(e)??V(t,[`role`,`type`]);return{index:0,type:r,role:r,label:xe(e)??V(t,[`label`,`name`,`text`]),value:Ce(e)??V(t,[`value`]),depth:n,enabled:H(t,[`enabled`])??(!Se(e)&&void 0),focused:H(t,[`focused`])}}function R(e){let t=V(e,[`role`,`type`]);return{index:0,type:t,role:t,label:V(e,[`label`,`name`,`text`]),value:V(e,[`value`]),enabled:H(e,[`enabled`]),focused:H(e,[`focused`])}}function ge(e){return Array.isArray(e)?e.flatMap(e=>{let t=d(e)?e:void 0,n=B(V(t,[`ref`,`id`])??String(e));return n?[{ref:n,data:t}]:[]}):d(e)?Object.entries(e).flatMap(([e,t])=>{let n=B(e);return n?[{ref:n,data:d(t)?t:void 0}]:[]}):[]}function _e(e){let t=e.match(/^\s*/)?.[0].length??0;return Math.floor(t/2)}function ve(e,t){for(let n=t-1;n>=0;--n){let t=e.get(n);if(t!==void 0)return t}}function ye(e){return B(z(e)?.match(/\bref\s*=\s*['"]?(@?e\d+)['"]?/i)?.[1]??e.match(/@?(e\d+)\b/i)?.[1])}function z(e){return e.replaceAll(/"(?:[^"\\]|\\.)*"/g,`""`).replaceAll(/'(?:[^'\\]|\\.)*'/g,`''`).match(/\[([^\]]*\bref\s*=\s*['"]?@?e\d+[^\]]*)\]\s*(?=:|$)/i)?.[1]}function B(e){let t=e?.trim().replace(/^@/,``);return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function be(e){return e.replaceAll(/\[[^\]]*ref[^\]]*\]/gi,``).replaceAll(/@?e\d+\b/gi,``).replaceAll(/^[\s|├└─>*-]+/g,``).trim().match(/^([A-Za-z][\w-]*)\b/)?.[1]}function xe(e){return e.match(/"([^"]+)"/)?.[1]??e.match(/'([^']+)'/)?.[1]}function Se(e){return/\bdisabled\b/i.test(z(e)??``)}function Ce(e){return we(e)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)}function we(e){return e.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0}function V(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function H(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`boolean`)return t}}function U(e){return typeof e==`string`}const W=`agent-browser`,G="Run `agent-device web setup` to install the managed web backend.";function Te(e={}){let t=e.session?.trim(),n=async(n,r)=>await Fe(n,{session:t,options:e,signal:r});return{async open(e){await n([`open`,e])},async close(){await n([`close`])},async startRecording(e){await n([`record`,`start`,e])},async stopRecording(){await n([`record`,`stop`])},async snapshot(e){return await je(t=>n(t,e?.signal),e)},async screenshot(e,t){await n([`screenshot`,...t?.fullscreen?[`--full`]:[],e])},async setViewport(e,t){await n([`set`,`viewport`,String(e),String(t)])},async click(e,t){await K(n,e,t)},async hover(e,t){await q(n,e,t)},async hoverRef(e){await n([`hover`,Z(e)])},async clickRef(e){await n([`click`,Z(e)])},async fill(e,t,r){if(await K(n,e,t),await n([`press`,Ue()]),r.length===0){await n([`press`,`Backspace`]);return}await n([`keyboard`,`type`,r])},async fillRef(e,t){await n([`fill`,Z(e),t])},async typeText(e){await n([`keyboard`,`type`,e])},async scroll(e,t){return await Ee(n,e,t),t?.durationMs===void 0?{}:{durationMs:t.durationMs}},async dumpNetwork(e){return le(await n([`network`,`requests`]),e)},async probeAudio(e){return oe(await n([`eval`,ae(e)]))}}}async function Ee(e,n,r){let i=Oe(De(r)),a=0;try{for(let t of i)await e(Ae(n,t.distance)),a+=1,t.delayAfterMs>0&&await s(t.delayAfterMs)}catch(e){throw t(e,a)}}function De(e){let t=e?.durationMs,r=t===void 0?{}:{durationMs:t};return e?.pixels===void 0?e?.amount===void 0?r:{distance:Math.max(1,Math.round(300*e.amount/n)),...r}:{distance:e.pixels,...r}}function Oe(e){let{distance:t,durationMs:n}=e;if(n===void 0||n<=0)return[{distance:t,delayAfterMs:0}];let r=Math.max(1,Math.min(20,Math.ceil(n/50))),i=n/Math.max(1,r-1);return ke(Math.round(t??300),r).map((e,t)=>({distance:e,delayAfterMs:t<r-1?i:0}))}function ke(e,t){let n=Math.floor(e/t),r=e-n*t;return Array.from({length:t},(e,t)=>t<r?n+1:n)}function Ae(e,t){return[`scroll`,e,...t===void 0?[]:[String(t)]]}async function K(e,t,n){await q(e,t,n),await e([`mouse`,`down`]),await e([`mouse`,`up`])}async function q(e,t,n){await e([`mouse`,`move`,String(Math.round(t)),String(Math.round(n))])}async function je(e,t){return await he(await e(Me(t)),t?.includeRects?async t=>await Ne(e,t):void 0)}function Me(e){return[`snapshot`,...e?.interactiveOnly?[`--interactive`]:[],...e?.raw?[]:[`--compact`],...typeof e?.depth==`number`?[`--depth`,String(e.depth)]:[],...e?.scope?[`--selector`,e.scope]:[]]}async function Ne(e,t){try{return We(await e([`get`,`box`,Z(t)]))}catch(e){if(Pe(e))return;throw e}}function Pe(e){let t=e instanceof Error?e.message:String(e);return!/\bstale\b/i.test(t)&&/\bbox\b|not visible|not found|no element/i.test(t)}async function Fe(e,t){let{session:n,options:r,signal:i}=t,a=[...e,`--json`,...n?[`--session`,n]:[]];return await Ie(a,r,e=>Y(ze(e.stdout,e.stderr,a,e.exitCode),e,a),i)}async function Ie(e,t,n,r){let i=``,a=``,o=0,s=!1,c=!1,l=u({stateDir:t.stateDir});try{await Re(t);let n=await te(e,{stateDir:t.stateDir,allowFailure:!0,timeoutMs:3e4,signal:r});i=n.stdout,a=n.stderr,o=n.exitCode,s=!0}catch(n){throw await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l}),Be(n,e)}try{let e=n({stdout:i,stderr:a,exitCode:o});return c=!0,e}finally{await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l})}}async function J(e){let t=e.options.ownedProcessRecords;if(!(!t||!e.status.installed))try{let n=e.options.openWebSessionNames?.()??[],r=e.options.session?.trim();Le(e,n.filter(e=>e!==r).length)?t.clear({kind:`daemon`}):await l(e.status,t)}catch(e){i({level:`warn`,phase:`web_agent_browser_process_record_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Le(e,t){return e.commandCompleted&&e.semanticSuccess&&e.cliArgs[0]===`close`&&e.exitCode===0&&t===0}async function Re(e){if(!e.openWebSessionNames)return;let t=u({stateDir:e.stateDir});if(t.installed)try{await ee(t,{openWebSessionNames:e.openWebSessionNames(),...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}catch(e){i({level:`warn`,phase:`web_agent_browser_provider_orphan_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Y(t,n,r){if(!d(t))return t;if((t.success??t.ok)===!1)throw new e(He(t.code),Ve(t),{cmd:W,args:r,hint:p(t,`hint`)??G,agentBrowserError:t.error});if(n.exitCode!==0)throw new e(`COMMAND_FAILED`,`agent-browser command failed`,o(n,{cmd:W,args:r,stdout:n.stdout.slice(0,500),stderr:n.stderr.slice(0,500),hint:p(t,`hint`)??G}));return Object.hasOwn(t,`data`)?t.data:t}function ze(t,n,r,i){try{return JSON.parse(t)}catch(a){let o=i!==0;throw new e(`COMMAND_FAILED`,o?`agent-browser command failed`:`agent-browser returned invalid JSON`,{cmd:W,args:r,...o?{exitCode:i}:{},stdout:t.slice(0,500),stderr:n.slice(0,500),hint:G},a instanceof Error?a:void 0)}}function Be(t,n){let r=ne(t);return r.code===`TOOL_MISSING`?new e(`TOOL_MISSING`,r.message,{...r.details??{},cmd:W,args:n,hint:X(r)},r):r.code===`COMMAND_FAILED`?new e(`COMMAND_FAILED`,r.message,{...r.details??{},cmd:W,args:n,hint:X(r)},r):r}function X(e){return typeof e.details?.hint==`string`?e.details.hint:G}function Ve(e){let t=e.error;if(typeof t==`string`&&t.trim())return t.trim();if(d(t)){let e=p(t,`message`)??p(t,`error`);if(e)return e}return p(e,`message`)??`agent-browser command failed`}function He(e){return typeof e==`string`&&e.length>0?e:`COMMAND_FAILED`}function Z(e){return e.startsWith(`@`)?e:`@${e}`}function Ue(){return a()===`darwin`?`Meta+a`:`Control+a`}function We(e){let t=d(e)&&d(e.box)?e.box:e;if(d(t))return Ge(t)??Ke(t)}function Ge(e){return Q(m(e,`x`),m(e,`y`),m(e,`width`),m(e,`height`))}function Ke(e){let t=m(e,`left`),n=m(e,`top`),r=m(e,`right`),i=m(e,`bottom`);return Q(t,n,$(r,t),$(i,n))}function Q(e,t,n,r){if(e!==void 0&&t!==void 0&&n!==void 0&&r!==void 0)return{x:e,y:t,width:n,height:r}}function $(e,t){return e===void 0||t===void 0?void 0:e-t}export{Te as createAgentBrowserWebProvider};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{I as t,P as n}from"./sdk-contracts.js";import{_ as r,a as i,g as a,h as o,k as s,m as c,p as l,t as u,v as d}from"./file.js";import{l as f}from"./exec.js";import"./command.js";import"./process.js";import{O as p,S as m,a as h,b as g,c as _,d as v,l as y,p as b,s as x,v as S}from"./host-file.js";import{n as C}from"./agent-browser-process-record.js";import{r as w}from"./agent-browser-lifecycle.js";import T from"node:crypto";import E from"node:path";async function D(e){x(e.packageRoot);let t=ee([`install`,`--prefix`,e.packageRoot,`--no-global`,`--no-audit`,`--no-fund`,`--no-save`,e.packageSpec]);await f(t.command,t.args,{env:c(),timeoutMs:e.timeoutMs})}function O(e){p(E.join(e.installDir,`manifest.json`),JSON.stringify({package:e.packageName,version:e.version,node:a(),installedAt:new Date().toISOString()},null,2))}function ee(e){if(r()!==`win32`)return{command:`npm`,args:e};let t=k(c());if(!t)throw new n(`TOOL_MISSING`,`npm not found in PATH`,{nodeExecPath:o(),hint:"Install Node.js with npm, or add npm to PATH, and run `agent-device web setup` again."});return{command:o(),args:[t,...e]}}function k(e){let t=e.npm_execpath?.trim();if(t){let e=E.resolve(t);if(E.basename(e)===`npm-cli.js`&&A(e))return e}let n=E.join(E.dirname(o()),`node_modules`,`npm`,`bin`,`npm-cli.js`);return A(n)?n:void 0}function A(e){try{return v(e).isFile()}catch{return!1}}var j=e({doctorManagedAgentBrowser:()=>R,getManagedAgentBrowserStatus:()=>z,mapManagedAgentBrowserError:()=>$,runManagedAgentBrowser:()=>I,setupManagedAgentBrowser:()=>L});const M=`0.27.1`,N=`agent-browser`,P=3e5,F=6e4;async function I(e,t){let n=z({stateDir:t.stateDir});if(!n.installed)throw J(n);return await B(n,e,t)}async function L(e){let t=z(e);X(t.nodeMajor);let n=d();return await i({acquire:()=>u({lockDirPath:E.join(t.installDir,`..`,`.agent-browser-install.lock`),owner:{pid:n,startTime:s(n),acquiredAtMs:Date.now()},timeoutMs:P,description:`managed agent-browser setup`}),task:async()=>{let t=z(e);if(t.installed)return t;x(t.installDir),await D({packageRoot:E.join(t.installDir,`package`),packageSpec:`${N}@${M}`,timeoutMs:P});let n=z(e);if(!n.entryScript)throw Y(n);return await B(n,[`install`],{timeoutMs:P}),await B(n,[`doctor`,`--offline`,`--quick`],{timeoutMs:F}),O({installDir:n.installDir,packageName:N,version:M}),await z(e)}})}async function R(e){let t=z(e);if(!t.installed)throw J(t);return{status:t,...await B(t,[`doctor`,`--offline`,`--quick`],{timeoutMs:F,allowFailure:!0})}}function z(e){let t=e.stateDir??c().AGENT_DEVICE_STATE_DIR??ne(),n=E.join(t,`tools`,`agent-browser`,M),r=K(n),i=q(n),o=W(r),s=E.join(n,`home`),l=Z(n),u=Q(n),d=o!==void 0&&U(n),f=Number.parseInt(a().replace(/^v/,``).split(`.`)[0]??`0`,10);return{version:M,stateDir:t,installDir:n,packageDir:r,binaryPath:i,entryScript:o,homeDir:s,runtimeHomeDir:l,socketDir:u,installed:d,nodeMajor:f,nodeSupported:f>=24}}async function B(e,t,n){if(!e.entryScript)throw J(e);return await f(o(),[e.entryScript,...t],{allowFailure:n.allowFailure,env:V(e,c()),timeoutMs:n.timeoutMs,signal:n.signal})}function V(e,t){return x(e.homeDir),H(e),x(e.socketDir),{...t,HOME:e.runtimeHomeDir,AGENT_BROWSER_SOCKET_DIR:e.socketDir,AGENT_BROWSER_IDLE_TIMEOUT_MS:String(w(t)),AGENT_BROWSER_ARGS:C(t.AGENT_BROWSER_ARGS,e)}}function H(e){if(e.runtimeHomeDir!==e.homeDir){x(E.dirname(e.runtimeHomeDir));try{let t=y(e.runtimeHomeDir);if(t.isSymbolicLink()&&S(e.runtimeHomeDir)===e.homeDir||t.isDirectory())return;t.isSymbolicLink()&&m(e.runtimeHomeDir)}catch(e){if(!te(e))throw e}try{h(e.homeDir,e.runtimeHomeDir)}catch{x(e.runtimeHomeDir)}}}function U(e){return _(E.join(e,`manifest.json`))}function W(e){let t;try{let n=JSON.parse(g(E.join(e,`package.json`)));t=typeof n==`object`&&n?n.bin:void 0}catch{return}let n=typeof t==`string`?t:typeof t==`object`&&t?t[N]:void 0;if(typeof n!=`string`)return;let r=E.resolve(e,n);return G(r)?r:void 0}function G(e){try{return v(e).isFile()}catch{return!1}}function K(e){return E.join(e,`package`,`node_modules`,N)}function q(e){let t=r()===`win32`?`${N}.cmd`:N;return E.join(e,`package`,`node_modules`,`.bin`,t)}function J(e){return new n(`TOOL_MISSING`,`Managed web browser backend is not installed.`,{version:M,installDir:e.installDir,hint:e.nodeSupported===!1?`Web automation requires Node 24+; current Node is ${a()}.`:"Run `agent-device web setup` to install the managed web backend."})}function Y(e){return new n(`TOOL_MISSING`,`Managed web backend install produced no runnable entry.`,{version:M,installDir:e.installDir,packageDir:e.packageDir,hint:`Remove ${e.installDir} and run \`agent-device web setup\` again.`})}function X(e){if(!(e>=24))throw new n(`UNSUPPORTED_OPERATION`,`Web automation requires Node 24 or newer.`,{currentNode:a(),requiredNodeMajor:24,hint:`Run agent-device with Node 24+ for web setup and web automation.`})}function Z(e){if(r()===`win32`)return E.join(e,`home`);let t=T.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return E.join(b(),`agent-device-web`,t)}function Q(e){let t=T.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return E.join(b(),`adw`,t)}function te(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}function ne(){return E.join(c().HOME??l(),`.agent-device`)}function $(e){let r=t(e);return r.code===`TOOL_MISSING`?new n(r.code,r.message,{...r.details??{},hint:typeof r.details?.hint==`string`?r.details.hint:"Run `agent-device web setup` to install the managed web backend."}):r}export{I as i,z as n,$ as r,j as t};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{P as t,at as n,c as r,l as i,nt as a}from"./sdk-contracts.js";import"./capture.js";import{n as o}from"./snapshot-capture-annotations.js";import{A as s,C as c,D as l,E as u,O as d,S as f,T as p,_ as m,v as h,w as g,x as _}from"./sdk-batch-runner.js";import{n as ee}from"./snapshot-diagnostics.js";import{c as v,n as y,r as te}from"./diagnostics.js";import"./diagnostics2.js";import{_ as ne,d as re,u as ie,v as b}from"./sdk-device.js";import{a as ae,o as x,p as oe}from"./lease-scope.js";import{Qr as se,T as ce,on as le}from"./sdk-batch.js";import{n as S,t as C}from"./catalog.js";import{B as ue,E as de,V as fe,i as pe}from"./registry.js";import{n as me}from"./success-text.js";import{t as w}from"./command-metadata.js";import{r as T}from"./daemon-artifacts.js";import{a as he,r as E,s as D}from"./daemon-client-transport.js";import{r as ge}from"./session-paths.js";import{t as O}from"./daemon-resolution.js";import{n as _e,t as ve}from"./client-metro.js";import{t as ye}from"./screenshot-result.js";import k from"node:fs";import A from"node:path";function j(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function M(e,t,n){return{deviceId:t,deviceName:n,...b(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function N(e,t){let n=c(e,`bundleId`),r=c(e,`package`);return{app:l(e,`app`),appPath:l(e,`appPath`),platform:u(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:j({session:t,bundleId:n,packageName:r})}}function be(e,n){let r=c(e,`bundleId`),i=c(e,`packageName`),a=r??i??c(e,`appId`),o=c(e,`launchTarget`)??i??r??a;if(!o)throw new t(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:e});return{appName:c(e,`appName`),appId:a,bundleId:r,packageName:i,launchTarget:o,installablePath:c(e,`installablePath`),archivePath:c(e,`archivePath`),materializationId:c(e,`materializationId`),materializationExpiresAt:c(e,`materializationExpiresAt`),identifiers:j({session:n,bundleId:r,packageName:i,appId:a})}}function xe(e){return{released:e.released===!0,materializationId:l(e,`materializationId`),identifiers:{}}}function P(e){let{record:t,platform:n,id:r,name:i,target:a}=I(e,`name`),o=F(t);return{platform:n,target:a,kind:g(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...re(n)&&o?{appleOs:o}:{},...Se(t),identifiers:M(n,r,i),...Ce(t),...L(n,r)}}function Se(e){let t=c(e,`model`),n=c(e,`osVersion`);return{...t?{model:t}:{},...n?{osVersion:n}:{}}}function Ce(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 we(e){let{record:t,platform:n,id:r,name:i,target:a}=I(e,`name`),o=l(t,`device`),s=F(t),u={session:i,...M(n,r,o)};return{name:i,address:c(t,`address`),createdAt:p(t,`createdAt`),sessionStateDir:c(t,`sessionStateDir`),runnerLogPath:c(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...s?{appleOs:s}:{},identifiers:u,...L(n,r,{simulatorSetPath:f(t,`ios_simulator_device_set`)})},identifiers:u}}function F(e){let t=e.appleOs;return ie(t)?t:void 0}function I(e,t){let n=m(e);return{record:n,platform:u(n,`platform`),id:l(n,`id`),name:l(n,t),target:_(n,`target`)}}function L(e,t,n={}){if(e===`ios`)return{ios:{udid:t,...n.simulatorSetPath===void 0?{}:{simulatorSetPath:n.simulatorSetPath}}};if(!b(e))return{};let r=n.serial??t;return e===`android`?{android:{serial:r}}:e===`harmonyos`?{harmonyos:{serial:r}}:{vega:{serial:r}}}function Te(e){if(!h(e))return;let t=e.platform,n=c(e,`metroHost`),r=typeof e.metroPort==`number`?e.metroPort:void 0,a=c(e,`bundleUrl`),o=c(e,`launchUrl`);return{platform:i(t)?t:void 0,metroHost:n,metroPort:r,bundleUrl:a,launchUrl:o}}function Ee(e){let t=e.platform,n=c(e,`id`),r=c(e,`device`);if(!ne(t)||!n||!r)return;let i=_(e,`target`),a=b(t)?c(e,`serial`)??n:void 0;return{platform:t,target:i,id:n,name:r,identifiers:{...M(t,n,r),...a?{serial:a}:{}},...L(t,t===`ios`?c(e,`device_udid`)??n:n,{simulatorSetPath:f(e,`ios_simulator_device_set`),serial:a})}}const De=[`explicit-selector`,`existing-session`,`single-booted-local`,`single-bootable-local`,`single-app-installed-local`,`preferred-local`,`single-provider-device`],Oe=[`session`,`local`,`provider`];function ke(e){if(!h(e))return;let{reason:t,source:n,candidateCount:r,bootOccurred:i}=e;if(!(!De.includes(t)||!Oe.includes(n)||typeof r!=`number`||!Number.isInteger(r)||r<0||typeof i!=`boolean`))return{reason:t,source:n,candidateCount:r,bootOccurred:i}}function Ae(e){if(h(e)&&typeof e.durationMs==`number`&&typeof e.measuredAt==`string`&&typeof e.method==`string`)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:c(e,`appTarget`),appBundleId:c(e,`appBundleId`)}}function R(e){if(!h(e)||typeof e.success!=`boolean`||typeof e.exitCode!=`number`||typeof e.stdout!=`string`||typeof e.stderr!=`string`)return;let t=z(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}const je=[`hint`,`diagnosticId`,`logPath`,`supportedOn`];function z(e){if(!h(e)||typeof e.code!=`string`||typeof e.message!=`string`)return;let t={code:e.code,message:e.message};Object.assign(t,Me(e.cause));for(let n of je){let r=e[n];typeof r==`string`&&(t[n]=r)}return h(e.details)&&(t.details=e.details),typeof e.retriable==`boolean`&&(t.retriable=e.retriable),t}function Me(e){let t=n(e);return t?{cause:t}:void 0}function Ne(e){let t=z(e.initialSnapshotError);return{...e.snapshot&&typeof e.snapshot==`object`?{snapshot:e.snapshot}:{},...t?{initialSnapshotError:t}:{}}}function Pe(e){return Array.isArray(e)?e:[]}function Fe(e){let t=ae(e);return s({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,...oe(t),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function B(e){return e??`default`}const V={...pe(),batch:de(Ie)};async function Ie(e,n,r){let i=V[e];if(!i)throw Error(`Missing daemon writer for batch command: ${e}`);let a=w(e);if(!a)throw Error(`Missing command metadata for batch command: ${e}`);try{return await H(i,a,a.readInput(n))}catch(n){let i=n instanceof Error?n.message:String(n);throw new t(`INVALID_ARGS`,`Batch step ${r} ${e} input is invalid: ${i}`,void 0,n)}}async function Le(e,t){let n=V[e];if(!n)throw Error(`Missing daemon writer for command: ${e}`);return await H(n,w(e),t)}async function H(e,t,n){let r=await e(n);return{...r,...t?{metadataFlags:fe(t,r.options)}:{}}}async function U(e,t={}){let{resolveClientSettings:n,ensureDaemon:r,attachSessionAddressHints:i}=await import(`./daemon-client-lifecycle.js`),a=e.meta?.requestId??y(),o=!!(e.meta?.debug||e.flags?.verbose),s=e.flags,{daemonAuthToken:c,...l}=s??{},u=s?{...e,flags:l}:e,d=n(u,t.authToken??c),f=le(ce(u.command),u),p=E({signal:t.signal,requestId:a});p.refuseIfAborted();let m=await p.guard(async()=>await v(`daemon_startup`,async()=>await r(d),{requestId:a,session:e.session})),h=m.info,g=await p.guard(async()=>await qe(h,d,u,t.signal));Ge(u.command);let _=Re(u,g,h,a,o,await ze(u,h));return te({level:`info`,phase:`daemon_request_prepare`,data:{requestId:a,command:u.command,session:u.session}}),await We(u,m,d,async()=>{let n=await v(`daemon_request`,async()=>await he(h,_,d.transportPreference,d.paths,f,{onProgress:t.onProgress,signal:t.signal}),{requestId:a,command:e.command});return i(n,u,d)})}function Re(e,t,n,r,i,a){return{...e,positionals:t.positionals,flags:t.flags,token:n.token,meta:{...Ve(e,t,r,i),...Be(n),providerCredentialFingerprint:a}}}async function ze(e,t){if(D(t)||e.command!==`lease_allocate`)return;let{leaseProvider:n,leaseBackend:r}=x(e);if(!n)return;let{providerCredentialFingerprint:i}=await import(`./provider-credential-fingerprint.js`).then(e=>e.t);return i(n,process.env,r)}function Be(e){let t=process.env.DEVELOPER_DIR;return D(e)?{developerDir:void 0}:t===void 0?{}:{developerDir:t}}function Ve(e,t,n,r){let i=e.meta??{};return{...i,requestId:n,debug:r,...He(i,e.flags),...Ue(t)}}function He(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 Ue(e){return{...e.uploadedArtifactId?{uploadedArtifactId:e.uploadedArtifactId}:{},...e.clientArtifactPaths?{clientArtifactPaths:e.clientArtifactPaths}:{},...e.installSource?{installSource:e.installSource}:{}}}async function We(e,n,r,i){let a,o=!1,s;try{a=await i()}catch(e){o=!0,s=e}let{cleanupDaemonAfterRequest:c}=await import(`./daemon-client-lifecycle.js`),l=await c(e,n,r,a);if(o)throw s;if(!l)throw new t(`COMMAND_FAILED`,`Daemon request produced no response after cleanup`);return l}function Ge(e){!Ke(e)||process.stderr.isTTY!==!0||process.env.CI||process.stderr.write(e===S.reinstall?`Reinstalling...
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{L as t,P as n,X as r,c as i,it as a,l as o,ot as s,rt as c}from"./sdk-contracts.js";import{V as l,v as u}from"./tv-remote.js";import{n as d}from"./snapshot-capture-annotations.js";import{A as f,C as p,D as m,E as h,O as ee,S as g,T as _,_ as v,b as y,g as b,v as x,w as te,x as ne,y as re}from"./sdk-batch-runner.js";import{n as ie}from"./snapshot-diagnostics.js";import{E as S,T as C,dt as w,gt as ae,ut as oe,vt as se,yt as ce}from"./back-mode.js";import{c as le,n as T,r as E}from"./diagnostics.js";import"./diagnostics2.js";import{b as D,d as ue,f as de,y as fe}from"./sdk-device.js";import{T as pe,Zr as me,an as he}from"./sdk-batch.js";import{J as ge,c as _e,j as ve,q as ye,t as be}from"./command-metadata.js";import{c as xe}from"./file.js";import{l as Se}from"./exec.js";import{C as Ce,E as we,F as Te,I as Ee,N as O,R as De,b as Oe,h as ke,i as Ae,j as je,m as Me,p as Ne,t as k,x as A,y as Pe,z as Fe}from"./daemon-resolution.js";import{r as Ie,t as Le}from"./output-path.js";import"./command.js";import"./process.js";import{a as Re}from"./version.js";import{a as ze,n as Be,t as Ve}from"./client-metro.js";import{createHash as He,randomUUID as Ue}from"node:crypto";import j from"node:fs";import We from"node:os";import M from"node:path";import{Transform as Ge,Writable as Ke}from"node:stream";import{pipeline as qe}from"node:stream/promises";import Je from"node:net";function Ye(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function N(e,t,n){return{deviceId:t,deviceName:n,...D(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function Xe(e,t){let n=p(e,`bundleId`),r=p(e,`package`);return{app:m(e,`app`),appPath:m(e,`appPath`),platform:h(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:Ye({session:t,bundleId:n,packageName:r})}}function Ze(e,t){let r=p(e,`bundleId`),i=p(e,`packageName`),a=r??i??p(e,`appId`),o=p(e,`launchTarget`)??i??r??a;if(!o)throw new n(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:e});return{appName:p(e,`appName`),appId:a,bundleId:r,packageName:i,launchTarget:o,installablePath:p(e,`installablePath`),archivePath:p(e,`archivePath`),materializationId:p(e,`materializationId`),materializationExpiresAt:p(e,`materializationExpiresAt`),identifiers:Ye({session:t,bundleId:r,packageName:i,appId:a})}}function Qe(e){return{released:e.released===!0,materializationId:m(e,`materializationId`),identifiers:{}}}function $e(e){let{record:t,platform:n,id:r,name:i,target:a}=it(e,`name`),o=rt(t);return{platform:n,target:a,kind:te(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...de(n)&&o?{appleOs:o}:{},...et(t),identifiers:N(n,r,i),...tt(t),...P(n,r)}}function et(e){let t=p(e,`model`),n=p(e,`osVersion`);return{...t?{model:t}:{},...n?{osVersion:n}:{}}}function tt(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 nt(e){let{record:t,platform:n,id:r,name:i,target:a}=it(e,`name`),o=m(t,`device`),s=rt(t),c={session:i,...N(n,r,o)};return{name:i,address:p(t,`address`),createdAt:_(t,`createdAt`),sessionStateDir:p(t,`sessionStateDir`),runnerLogPath:p(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...s?{appleOs:s}:{},identifiers:c,...P(n,r,{simulatorSetPath:g(t,`ios_simulator_device_set`)})},identifiers:c}}function rt(e){let t=e.appleOs;return ue(t)?t:void 0}function it(e,t){let n=v(e);return{record:n,platform:h(n,`platform`),id:m(n,`id`),name:m(n,t),target:ne(n,`target`)}}function P(e,t,n={}){if(e===`ios`)return{ios:{udid:t,...n.simulatorSetPath===void 0?{}:{simulatorSetPath:n.simulatorSetPath}}};if(!D(e))return{};let r=n.serial??t;return e===`android`?{android:{serial:r}}:e===`harmonyos`?{harmonyos:{serial:r}}:{vega:{serial:r}}}function at(e){if(!x(e))return;let t=e.platform,n=p(e,`metroHost`),r=typeof e.metroPort==`number`?e.metroPort:void 0,i=p(e,`bundleUrl`),a=p(e,`launchUrl`);return{platform:o(t)?t:void 0,metroHost:n,metroPort:r,bundleUrl:i,launchUrl:a}}function ot(e){let t=e.platform,n=p(e,`id`),r=p(e,`device`);if(!fe(t)||!n||!r)return;let i=ne(e,`target`),a=D(t)?p(e,`serial`)??n:void 0;return{platform:t,target:i,id:n,name:r,identifiers:{...N(t,n,r),...a?{serial:a}:{}},...P(t,t===`ios`?p(e,`device_udid`)??n:n,{simulatorSetPath:g(e,`ios_simulator_device_set`),serial:a})}}const st=[`explicit-selector`,`existing-session`,`single-booted-local`,`single-bootable-local`,`single-app-installed-local`,`preferred-local`,`single-provider-device`],ct=[`session`,`local`,`provider`];function lt(e){if(!x(e))return;let{reason:t,source:n,candidateCount:r,bootOccurred:i}=e;if(!(!st.includes(t)||!ct.includes(n)||typeof r!=`number`||!Number.isInteger(r)||r<0||typeof i!=`boolean`))return{reason:t,source:n,candidateCount:r,bootOccurred:i}}function ut(e){if(x(e)&&typeof e.durationMs==`number`&&typeof e.measuredAt==`string`&&typeof e.method==`string`)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:p(e,`appTarget`),appBundleId:p(e,`appBundleId`)}}function dt(e){if(!x(e)||typeof e.success!=`boolean`||typeof e.exitCode!=`number`||typeof e.stdout!=`string`||typeof e.stderr!=`string`)return;let t=pt(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}const ft=[`hint`,`diagnosticId`,`logPath`,`supportedOn`];function pt(e){if(!x(e)||typeof e.code!=`string`||typeof e.message!=`string`)return;let t={code:e.code,message:e.message};Object.assign(t,mt(e.cause));for(let n of ft){let r=e[n];typeof r==`string`&&(t[n]=r)}return x(e.details)&&(t.details=e.details),typeof e.retriable==`boolean`&&(t.retriable=e.retriable),t}function mt(e){let t=s(e);return t?{cause:t}:void 0}function ht(e){let t=pt(e.initialSnapshotError);return{...e.snapshot&&typeof e.snapshot==`object`?{snapshot:e.snapshot}:{},...t?{initialSnapshotError:t}:{}}}function gt(e){return Array.isArray(e)?e:[]}function _t(e){let t=oe(e);return f({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 F(e){return e??`default`}const vt={..._e(),batch:ve(yt)};async function yt(e,t,r){let i=vt[e];if(!i)throw Error(`Missing daemon writer for batch command: ${e}`);let a=be(e);if(!a)throw Error(`Missing command metadata for batch command: ${e}`);try{return await xt(i,a,a.readInput(t))}catch(t){let i=t instanceof Error?t.message:String(t);throw new n(`INVALID_ARGS`,`Batch step ${r} ${e} input is invalid: ${i}`,void 0,t)}}async function bt(e,t){let n=vt[e];if(!n)throw Error(`Missing daemon writer for command: ${e}`);return await xt(n,be(e),t)}async function xt(e,t,n){let r=await e(n);return{...r,...t?{metadataFlags:ge(t,r.options)}:{}}}async function St(e,t){let n=j.statSync(e),r=M.basename(e),i=n.isDirectory(),a=Tt(t)??wt(e,n),o=[];try{let t=i?await Ct(e,o):e,n=j.statSync(t);return{payloadPath:t,fileName:r,artifactType:i?`app-bundle`:`file`,platform:a,contentType:i?`application/gzip`:`application/octet-stream`,sha256:await Dt(t),sizeBytes:n.size,cleanup:()=>Et(o)}}catch(e){throw Et(o),e}}async function Ct(e,t){let n=j.mkdtempSync(M.join(We.tmpdir(),`agent-device-upload-${Ue()}-`));t.push(n);let r=M.join(n,`${M.basename(e)}.tar.gz`);return await Se(`tar`,[`czf`,r,`-C`,M.dirname(e),M.basename(e)],{env:{...process.env,COPYFILE_DISABLE:`1`}}),r}function wt(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 Tt(e){return e===`ios`||e===`android`?e:void 0}function Et(e){for(let t of e)j.rmSync(t,{recursive:!0,force:!0})}async function Dt(e){let t=He(`sha256`),r=new Ke({write(e,n,r){t.update(e),r()}});return await qe(j.createReadStream(e),r).catch(e=>{throw new n(`COMMAND_FAILED`,`Failed to read local artifact`,{},e instanceof Error?e:void 0)}),t.digest(`hex`)}function Ot(e){let{stage:t,fileName:n,startOffset:r,totalBytes:i,onProgress:a}=e,o=r,s=jt(i),c=Math.min(i,r+s);return new Ge({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 kt(){if(!(process.stderr.isTTY!==!0||process.env.CI))return e=>{process.stderr.write(`${At(e)}\n`)}}function At(e){switch(e.type){case`start`:return`Uploading ${e.fileName} (${I(e.totalBytes)}) via ${Mt(e.stage)} upload`;case`resume`:return`Resuming ${e.fileName} at ${I(e.transferredBytes)} of ${I(e.totalBytes)}`;case`progress`:return`Uploaded ${I(e.transferredBytes)} of ${I(e.totalBytes)} (${Nt(e.transferredBytes,e.totalBytes)})`;case`fallback`:return`Direct upload did not complete; retrying ${e.fileName} with ${Mt(e.to)} upload`}}function jt(e){return Math.max(8388608,Math.ceil(e*.05))}function Mt(e){return e===`direct`?`direct`:`legacy`}function Nt(e,t){return t<=0?`100%`:`${Math.min(100,Math.floor(e/t*100))}%`}function I(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 Pt=3e5,Ft=`uploadStreamRetryable`;async function It(e){return await L({...e,url:e.url,redirectCount:0,startOffset:0})}function Lt(e){return e instanceof n&&e.details?.[Ft]===!0}async function L(e){let t=await A(e.url.protocol),r=j.statSync(e.payloadPath).size,i=Bt(e.headers,e.startOffset,r);return zt(e.progress,e.startOffset,r),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:i,...e.signal?{signal:e.signal}:{}},t=>{s=!0,Ce(t).then(i=>{clearTimeout(l);let s=t.statusCode??500,c=t.headers.location;if(c&&Vt(s)){if(e.redirectCount>=5){o(new n(`COMMAND_FAILED`,`Artifact upload exceeded redirect limit`,{maxRedirects:5,url:e.url.toString()}));return}let t=new URL(c,e.url);L({...e,url:t,redirectCount:e.redirectCount+1}).then(a,o);return}let u=Ht(s)?Ut(t.headers,r):void 0;if(u!==void 0){if(u>=r){a({statusCode:200,statusMessage:`Upload already complete`,body:``});return}if(u<=e.startOffset){o(new n(`COMMAND_FAILED`,`Artifact upload resume did not advance`,{offset:u,previousOffset:e.startOffset,url:e.url.toString()}));return}L({...e,startOffset:u}).then(a,o);return}a({statusCode:s,statusMessage:t.statusMessage,body:i})}).catch(o)}),l=setTimeout(()=>{c.destroy(),o(new n(`COMMAND_FAILED`,e.timeoutMessage,{timeoutMs:Pt,...e.timeoutHint?{hint:e.timeoutHint}:{},...Rt(e)}))},Pt);c.on(`error`,t=>{if(!s){if(clearTimeout(l),e.signal?.aborted){o(e.signal.reason);return}o(new n(`COMMAND_FAILED`,e.errorMessage,{...e.errorHint?{hint:e.errorHint}:{},...Rt(e)},t))}}),c.on(`close`,()=>clearTimeout(l)),qe(j.createReadStream(e.payloadPath,{start:e.startOffset}),Ot({stage:e.progress?.stage??`legacy`,fileName:e.progress?.fileName??M.basename(e.payloadPath),startOffset:e.startOffset,totalBytes:r,onProgress:e.progress?.onProgress}),c).catch(e=>{if(s)return;c.destroy();let t=e instanceof Error?e:Error(String(e));o(new n(`COMMAND_FAILED`,`Failed to read local artifact`,{},t))})})}function Rt(e){return e.retryable===!0?{[Ft]:!0}:{}}function zt(e,t,n){e?.onProgress?.({type:t>0?`resume`:`start`,stage:e.stage,fileName:e.fileName,transferredBytes:t,totalBytes:n})}function Bt(e,t,n){return t<=0?e:{...e,"content-length":Math.max(n-t,0),"content-range":`bytes ${t}-${n-1}/${n}`}}function Vt(e){return[301,302,303,307,308].includes(e)}function Ht(e){return e===308}function Ut(e,t){let n=Wt(e[`x-upload-offset`]??e[`upload-offset`]);if(n!==void 0)return Math.min(n,t);let r=Gt(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 Wt(e){let t=Gt(e);if(t===void 0)return;let n=Number(t);return Number.isSafeInteger(n)&&n>=0?n:void 0}function Gt(e){return Array.isArray(e)?e[0]:e}const Kt=3e4;async function qt(e){let t=await St(e.localPath,e.platform),n=e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`,r=Ue();try{let i=await Qt({normalizedBase:n,token:e.token,artifact:t,uploadAttemptId:r,signal:e.signal});return i?.kind===`cache-hit`?i.uploadId:i?.kind===`direct-upload`?await Jt({normalizedBase:n,token:e.token,artifact:t,preflight:i,uploadAttemptId:r,onProgress:e.onProgress,signal:e.signal})||(e.onProgress?.({type:`fallback`,from:`direct`,to:`legacy`,fileName:t.fileName}),await Zt({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress,signal:e.signal})):await Zt({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress,signal:e.signal})}finally{t.cleanup()}}async function Jt(e){let t=async t=>(await nn(e.artifact,t,e.onProgress,e.signal),await rn({normalizedBase:e.normalizedBase,token:e.token,uploadId:t.uploadId,signal:e.signal}));try{return await t(e.preflight)}catch(n){if(e.signal?.aborted)throw n;return Xt(n)?await Yt(e,t):void 0}}async function Yt(e,t){let n=await Qt({normalizedBase:e.normalizedBase,token:e.token,artifact:e.artifact,uploadAttemptId:e.uploadAttemptId,signal:e.signal});if(n?.kind===`cache-hit`)return n.uploadId;if(n?.kind===`direct-upload`)try{return await t(n)}catch{return}}function Xt(e){return e instanceof n?Lt(e):!0}async function Zt(e){let{normalizedBase:t,token:r,artifact:i}=e,a=new URL(`upload`,t),o={"content-type":i.contentType,"x-artifact-type":i.artifactType,"x-artifact-filename":i.fileName,"x-artifact-hash":i.sha256,"x-artifact-hash-algorithm":`sha256`,"transfer-encoding":`chunked`};Object.assign(o,O(r));let s=await It({url:a,method:`POST`,headers:o,payloadPath:i.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.`,signal:e.signal,progress:{stage:`legacy`,fileName:i.fileName,onProgress:e.onProgress}});try{let e=JSON.parse(s.body);if(!e.ok||!e.uploadId)throw new n(`COMMAND_FAILED`,`Upload failed: ${s.body}`);return e.uploadId}catch(e){throw e instanceof n?e:new n(`COMMAND_FAILED`,`Invalid upload response: ${s.body}`)}}async function Qt(e){let t=new URL(`upload/preflight`,e.normalizedBase),n={"content-type":`application/json`};Object.assign(n,O(e.token));let r=await fetch(t,{method:`POST`,headers:n,signal:$t(e.signal,Kt),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(t=>{if(e.signal?.aborted)throw t});if(r?.ok)return en(await r.json().catch(()=>void 0))}function $t(e,t){let n=AbortSignal.timeout(t);return e?AbortSignal.any([e,n]):n}function en(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(tn(r))return{kind:`direct-upload`,uploadId:t.uploadId,url:n.url,headers:r}}function tn(e){return!e||typeof e!=`object`||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}async function nn(e,t,r,i){let a=await It({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,signal:i,progress:{stage:`direct`,fileName:e.fileName,onProgress:r}});if(a.statusCode<200||a.statusCode>=300)throw new n(`COMMAND_FAILED`,`Direct artifact upload failed`,{statusCode:a.statusCode,statusMessage:a.statusMessage})}async function rn(e){let t=new URL(`upload/finalize`,e.normalizedBase),r={"content-type":`application/json`};Object.assign(r,O(e.token));let i=await fetch(t,{method:`POST`,headers:r,signal:$t(e.signal,Kt),body:JSON.stringify({uploadId:e.uploadId})}).catch(t=>{throw e.signal?.aborted?t:new n(`COMMAND_FAILED`,`Failed to finalize direct artifact upload`,{},t)});if(!i.ok)throw new n(`COMMAND_FAILED`,`Direct artifact upload finalize failed`,{status:i.status,statusText:i.statusText});let a=await i.json().catch(()=>void 0);if(!a?.ok||!a.uploadId)throw new n(`COMMAND_FAILED`,`Invalid upload finalize response`);return a.uploadId}async function an(e,t,n){let r=[...e.positionals??[]],i=e.flags?{...e.flags}:void 0,a=e.meta?.installSource,o={},s,c=kt();if(!wn(t))return dn({positionals:r,flags:i,installSource:a,uploadedArtifactId:s,clientArtifactPaths:o});on(e),i=cn(e,r,i,o);let l=await fn(e,t,c,n);return l&&(a=l.installSource,s=l.uploadedArtifactId??s),e.command!==`install`&&e.command!==`reinstall`||(s=await sn(e,t,r,c,n)??s),dn({positionals:r,flags:i,installSource:a,uploadedArtifactId:s,clientArtifactPaths:o})}function on(e){if(e.flags?.saveScript!==void 0)throw new n(`INVALID_ARGS`,`--save-script is not supported against a remote daemon: the healed script would be written on the daemon host, not on this machine.`,{hint:`Run the script against a local daemon to capture a healed .ad, or re-run without --save-script.`,command:e.command})}async function sn(e,t,n,r,i){let a=n.length===1?0:1,o=n[a];if(o===void 0)return;if(o.startsWith(`remote:`)){n[a]=o.slice(7);return}let s=un(o,e.meta?.cwd);if(s)return await qt({localPath:s,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:r,signal:i})}function cn(e,t,n,r){let i=pn(e,t);if(!i)return n;i.positionalIndex!==void 0&&i.positionalPath!==void 0&&(t[i.positionalIndex]=i.positionalPath);let a=ln(n,i.flagKey??`out`,i.flagPath);return r[i.field]=i.localPath,a}function ln(e,t,n){return n===void 0?e:{...e??{},[t]:n}}function un(e,t){let n=M.isAbsolute(e)?e:M.resolve(t??process.cwd(),e);return j.existsSync(n)?n:void 0}function dn(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 fn(e,t,n,r){let i=e.meta?.installSource;if(e.command!==`install_source`||!i||i.kind!==`path`)return null;let a=i.path.trim();if(!a)return{installSource:i};if(a.startsWith(`remote:`))return{installSource:{...i,path:a.slice(7)}};let o=M.isAbsolute(a)?a:M.resolve(e.meta?.cwd??process.cwd(),a);if(!j.existsSync(o))return{installSource:{...i,path:o}};let s=await qt({localPath:o,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:n,signal:r});return{installSource:{...i,path:o},uploadedArtifactId:s}}function pn(e,t){if(e.command===`screenshot`){let n=vn(e,`path`,`.png`);return t[0]?{field:`path`,localPath:n,positionalIndex:0,positionalPath:Fe(`screenshot`,`.png`)}:{field:`path`,localPath:n,positionalIndex:0,flagPath:Fe(`screenshot`,`.png`)}}if(e.command===`record`&&(t[0]??``).toLowerCase()===`start`){if(!gn(e)&&e.flags?.platform===void 0)return null;let t=hn(e),n=_n(vn(e,`outPath`,t,1),e);return{field:`outPath`,localPath:n,positionalIndex:1,positionalPath:Fe(`recording`,M.extname(n)||t)}}return e.command===`test`?{field:`artifactsDir`,localPath:mn(e),flagKey:`artifactsDir`,flagPath:De(`test-artifacts`)}:null}function mn(e){let t=e.flags?.artifactsDir;return yn(R(t)?t:`.agent-device/test-artifacts`,e.meta?.cwd)}function hn(e){return Ie(e.flags?.platform)}function gn(e){return R(e.positionals?.[1])||R(e.flags?.out)}function _n(e,t){return t.flags?.platform===`web`?Le(e,hn(t)):e}function vn(e,t,n,r=0){let i=e.positionals?.[r]??e.flags?.out,a=`${t===`path`?`screenshot`:`recording`}-${Date.now()}${n}`;return yn(R(i)?i:a,e.meta?.cwd)}function yn(e,t){return M.isAbsolute(e)?e:M.resolve(t??process.cwd(),e)}function R(e){return typeof e==`string`&&e.trim().length>0}async function bn(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=xn(n,t),o=await Sn({baseUrl:e.baseUrl,token:e.token,artifactId:n.artifactId,destinationPath:r,requestScope:t.meta,isDirectory:n.artifactType===`test-artifacts`});i[n.field]=o,a.push({...n,localPath:o})}return i.artifacts=a,{ok:!0,data:i}}function xn(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 M.resolve(t.meta?.cwd??process.cwd(),r)}async function Sn(e){let{downloadRemoteArtifactFromUrl:t}=await import(`./artifact-download.js`);return await t({artifactUrl:new URL(Cn(e.baseUrl,e.artifactId)),token:e.token,artifactId:e.artifactId,destinationPath:e.destinationPath,requestScope:e.requestScope,...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs},...e.isDirectory===void 0?{}:{isDirectory:e.isDirectory}})}function Cn(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(`artifacts/${encodeURIComponent(t)}`,n).toString()}function wn(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}function z(e,t,r){return new n(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:e.meta?.requestId,line:t},r instanceof Error?r:void 0)}function Tn(e){let t=t=>(e.onError(t),!0);return{handleLine(n){let r;try{r=JSON.parse(n)}catch(r){return t(z(e.req,n,r))}if(Me(r))try{return e.onProgress?.(r.event),!1}catch(e){return t(e)}return ke(r)?(e.onResponse(r.response),!0):e.responseFormat===`socket-legacy`?(e.onResponse(r),!0):t(z(e.req,n,Error(`Missing daemon progress response envelope`)))}}}function En(e,t){return Pe(e)&&String(Array.isArray(t)?t.join(`,`):t??``).includes(`application/x-ndjson`)}function Dn(e,t){let{req:n,isSettled:r,resolve:i,reject:a,clearTimeout:o}=t,s=``,c=Tn({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=Oe(s,e);s=t.buffer;for(let e of t.lines)if(c.handleLine(e))return}),e.on(`end`,()=>{if(r())return;let e=s.trim();e&&c.handleLine(e)||(o(),a(z(n,e)))})}function On(e,t){let{req:r,handleResponseBody:i,reject:a,clearTimeout:o}=t,s=``,c=!1,l=Tn({req:r,onProgress:t.onProgress,responseFormat:`ndjson-envelope`,onResponse(e){c=!0,o(),i(JSON.stringify(e))},onError(e){c=!0,o(),a(e)}});e.setEncoding(`utf8`),e.on(`data`,e=>{if(c)return;let t=Oe(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(z(r,e)))}),e.on(`error`,e=>{c||(c=!0,o(),a(new n(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:r.meta?.requestId},e instanceof Error?e:void 0)))})}const kn=1e4,An=8388608;function jn(e,t){return Ee(e,`sessions/${encodeURIComponent(t.session)}/requests/${encodeURIComponent(t.requestId)}/diagnostics`)}function Mn(e){let{logPath:t,...n}=e;return n}async function Nn(e,t){let n=Mn(e),r=e.diagnosticsRecord,i=r?.requestId??t.requestId;if(!r)return B(n,t.endpoint,i,`the daemon named no diagnostics record`);try{let e=Ae(t.stateDir,r),a=await Pn({endpoint:t.endpoint,ref:r,destinationPath:e});return a?B(n,t.endpoint,i,a):{...n,logPath:e}}catch(e){return B(n,t.endpoint,i,e instanceof Error?e.message:String(e))}}function B(e,t,n,r){return{...e,logPathUnavailable:`remote daemon ${t.baseUrl}, request ${n??`unknown`}: ${r}`}}async function Pn(e){let{endpoint:t,ref:n,destinationPath:r}=e,i;try{i=new URL(jn(t.baseUrl,n))}catch{return`daemon base URL is not a valid URL`}try{let e=await A(i.protocol);return await j.promises.mkdir(M.dirname(r),{recursive:!0}),await new Promise(n=>{let a=!1,o=e=>{if(!a){if(a=!0,clearTimeout(c),e===void 0){n(void 0);return}j.promises.rm(r,{force:!0}).finally(()=>{n(e)})}},s=e.request({protocol:i.protocol,host:i.hostname,port:i.port,method:`GET`,path:i.pathname+i.search,headers:{...O(t.token),...Te(t.tenantId)}},e=>{let t=e.statusCode??500;if(t!==200){e.resume(),o(`HTTP ${t}`);return}let n=j.createWriteStream(r),i=0;e.on(`data`,e=>{i+=e.length,i>An&&(s.destroy(),n.destroy(),o(`record exceeds ${An} bytes`))}),e.on(`error`,e=>{n.destroy(),o(e.message)}),n.on(`error`,e=>{o(e.message)}),n.on(`finish`,()=>{o(void 0)}),e.pipe(n)}),c=setTimeout(()=>{o(`fetch timed out after ${kn}ms`),s.destroy()},kn);s.on(`error`,e=>{o(e.message)}),s.end()})}catch(e){return e instanceof Error?e.message:String(e)}}function Fn(e,t){let{info:r,req:i,stateDir:a,resolve:o,reject:s}=t;try{let t=In(e);if(t.error){Ln(t.error,{info:r,req:i,stateDir:a,reject:s});return}if(!t.result||typeof t.result!=`object`){s(new n(`COMMAND_FAILED`,`Invalid daemon RPC response`,{requestId:i.meta?.requestId}));return}Vn(r,i,t.result,o,s)}catch(t){s(new n(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:i.meta?.requestId,line:e},t instanceof Error?t:void 0))}}function In(e){return JSON.parse(e)}async function Ln(e,t){let{info:n,req:r,stateDir:i,reject:a}=t,o=r.meta?.requestId,s=Rn(e);if(!n.baseUrl){a(Bn(s,o));return}a(Bn(await Nn(s,{endpoint:{baseUrl:n.baseUrl,token:n.token,tenantId:r.meta?.tenantId},stateDir:i,requestId:o}),o))}function Rn(e){let t=e.data??{},n=zn(t.cause);return{code:a(t.code==null?void 0:String(t.code),`COMMAND_FAILED`),message:String(t.message??e.message??`Daemon RPC request failed`),cause:n,details:typeof t.details==`object`&&t.details?t.details:void 0,hint:typeof t.hint==`string`?t.hint:void 0,diagnosticId:typeof t.diagnosticId==`string`?t.diagnosticId:void 0,logPath:typeof t.logPath==`string`?t.logPath:void 0,diagnosticsRecord:r(t.diagnosticsRecord),retriable:typeof t.retriable==`boolean`?t.retriable:void 0,supportedOn:typeof t.supportedOn==`string`?t.supportedOn:void 0}}function zn(e){return s(e)}function Bn(e,t){return new n(a(e.code,`COMMAND_FAILED`),e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath,logPathUnavailable:e.logPathUnavailable,diagnosticsRecord:e.diagnosticsRecord,retriable:e.retriable,supportedOn:e.supportedOn,requestId:t},e.cause)}async function Vn(e,t,n,r,i){try{r(e.baseUrl&&n.ok?await bn(e,t,n):n)}catch(e){i(e)}}function Hn(e,t){let n=e.meta?.requestId??T();return Un(e.command)?{jsonrpc:`2.0`,id:n,method:Wn(e.command),params:{...Gn(e,e.command,t),...e.command===`lease_allocate`?ce(e.flags):{},...e.command===`lease_allocate`&&e.meta?.providerCredentialFingerprint?{providerCredentialFingerprint:e.meta.providerCredentialFingerprint}:{}}}:{jsonrpc:`2.0`,id:n,method:`agent_device.command`,params:e}}function Un(e){return e===`lease_allocate`||e===`lease_heartbeat`||e===`lease_release`}function Wn(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 Gn(e,t,n){return ae(w(e),t,{includeTokenParam:n.includeTokenParam,token:e.token,session:e.session})}async function Kn(e){let{info:t,statePaths:r,remote:i,timeoutMs:a,requestId:o,command:s,platform:c,session:l,action:u}=e,d=!i&&qn(s)?await(await import(`./daemon-client-liveness-probe.js`)).probeDaemonResponsive(t,{session:l}):void 0,f=d===!1,p;if(f){let{stopAndRetireDaemon:e}=await import(`./daemon-registration-owner.js`).then(e=>e.r);p=await e({paths:r,observed:{pid:t.pid,startTime:t.processStartTime??null},mode:`force`})}let m=p?.status===`retired`,h=p?.status===`retained`&&p.termination?.status!==`exited`;return E({level:`error`,phase:`daemon_request_timeout`,data:{timeoutMs:a,requestId:o,command:s,daemonPidReset:m?t.pid:void 0,daemonPidForceKilled:m?Zn(p):void 0,daemonRetirement:p,daemonPreservedAfterTimeout:h||!i&&!f,daemonLivenessProbeAnswered:d,daemonBaseUrl:t.baseUrl}}),new n(`COMMAND_FAILED`,`Daemon request timed out`,{timeoutMs:a,requestId:o,reason:`daemon_transport_timeout`,...p?{retirement:p,stateDir:r.baseDir}:{},hint:p?.status===`retained`?`The daemon could not be safely retired. State was retained at ${r.baseDir}. ${p.error?.hint??`Retry with --debug and inspect daemon diagnostics before retrying.`}`:Xn({remote:i,resetDaemon:m,command:s,applePlatformDeclared:Yn(c),session:l,action:u})})}function qn(e){return pe(e).onTimeout===`reset-daemon`}const Jn=new Set([`apple`,`ios`,`macos`]);function Yn(e){return e!==void 0&&Jn.has(e)}function Xn(e){let{remote:t,resetDaemon:n,command:r,applePlatformDeclared:i,session:a,action:o}=e;if(!n&&r===S.record&&o===`stop`)return`The ${t?`remote `:``}daemon may still be exporting the recording. Run agent-device record stop${a?` --session ${a}`:``} again to wait for that export and receive the completed recording.`;if(t)return`Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.`;if(n)return`Retry with --debug and check daemon diagnostics logs. The daemon did not answer the liveness probe and was reset after the timeout.`;let s=i&&r===S.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; the daemon was kept alive so the session can still be closed or inspected.${s}`}function Zn(e){if(!e||e.status===`absent`)return!1;let t=e.termination;return t?.status===`exited`&&t.mode===`forced`}function Qn(e){let t=or(e);if(!t||typeof t!=`object`)return null;let n=t,r=$n(n);if(!r)return null;let i=er(n);return i?{token:r,...i,transport:nr(n.transport),pid:xe(n.pid)?n.pid:0,version:V(n.version),codeOrigin:tr(n.codeOrigin),codeSignature:V(n.codeSignature),processStartTime:V(n.processStartTime),policyDigest:V(n.policyDigest)}:null}function $n(e){return typeof e.token==`string`&&e.token.length>0?e.token:null}function er(e){let t=rr(e.port),n=rr(e.httpPort);return t===void 0&&n===void 0?null:{port:t,httpPort:n}}function tr(e){return e===`installed`||e===`checkout`?e:void 0}function nr(e){return e===`socket`||e===`http`||e===`dual`?e:void 0}function V(e){return typeof e==`string`?e:void 0}function rr(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function ir(e){return{hasInfo:j.existsSync(e.infoPath),hasLock:j.existsSync(e.lockPath)}}function H(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}function ar(e,t=k(process.env.AGENT_DEVICE_STATE_DIR)){let n=[e.hasInfo?t.infoPath:null,e.hasLock?t.lockPath:null].filter(Boolean).join(` and `);return`Daemon startup did not establish a reachable owner. ${n?`State was retained at ${n}. `:``}Retry with --debug and inspect daemon diagnostics. Before upgrading, stop all older clients and daemons with their original CLI and prevent them from returning to this state directory. Unverified lock state requires confirming every user stopped before manual recovery; deleting metadata alone is not a safe reset.`}function or(e){if(!j.existsSync(e))return null;try{return JSON.parse(j.readFileSync(e,`utf8`))}catch{return null}}function U(e,n,r){return t({requestId:r,dispatched:n},e.reason)}function W(e,t){if(e?.aborted)throw U(e,`no`,t)}const sr={refuseIfAborted:()=>{},guard:async e=>await e()};function cr(e){let{signal:t,requestId:n}=e;return t?{refuseIfAborted(){if(t.aborted)throw U(t,`no`,n)},guard:async e=>{if(t.aborted)throw U(t,`no`,n);return await new Promise((r,i)=>{let a=()=>i(U(t,`unknown`,n));t.addEventListener(`abort`,a,{once:!0}),e().then(e=>{t.removeEventListener(`abort`,a),r(e)},e=>{t.removeEventListener(`abort`,a),i(e)})})}}:sr}const lr=3e3,ur=`daemon_endpoint_unavailable`;function dr(e){return e instanceof n&&e.code===`COMMAND_FAILED`&&e.details?.reason===ur}function G(e){return new n(`COMMAND_FAILED`,e===`http`?`Daemon HTTP endpoint is unavailable`:`Daemon socket endpoint is unavailable`,{reason:ur,transport:e})}async function fr(e,t,n){let r=Date.now()+(n??1/0),i=kr(e,t),a=Ar(e,t,i);return await pr(e,i,(r-Date.now())/(a?2:1))?Date.now()<r:a?await pr(e,a,r-Date.now())&&Date.now()<r:!1}async function pr(e,t,n){return t===`http`?await hr(e,n):await mr(e.port,n)}function mr(e,t=500){return!e||t<=0?Promise.resolve(!1):new Promise(n=>{let r=!1,i=Je.createConnection({host:`127.0.0.1`,port:e},()=>{a(!0)}),a=e=>{r||(r=!0,i.destroy(),n(e))};i.setTimeout(Math.min(500,Math.ceil(t))),i.on(`timeout`,()=>{a(!1)}),i.on(`error`,()=>{a(!1)})})}function hr(e,t){return yr(e,t).then(e=>e.reachable)}async function gr(e,t,r){let i=await yr(e,t,r);if(!e.baseUrl||!i.reachable)return i;let a=[i,i.upstream].find(e=>typeof e?.rpcProtocolVersion==`number`&&e.rpcProtocolVersion!==2);if(a)throw new n(`COMMAND_FAILED`,`Remote daemon RPC protocol is incompatible`,{daemonBaseUrl:e.baseUrl,clientVersion:Re(),remoteVersion:a.version,remoteService:a.service,supportedRpcProtocolVersion:2,remoteRpcProtocolVersion:a.rpcProtocolVersion,hint:`Upgrade agent-device on the client or remote host so both support the same daemon RPC protocol.`});return i}function _r(e){return vr(e,`health`)}function vr(e,t){return e.baseUrl?Ee(e.baseUrl,t):e.httpPort?`http://127.0.0.1:${e.httpPort}/${t}`:null}async function yr(e,t,n){let r=_r(e);if(!r)return{reachable:!1};let i=new URL(r),a=Math.min(e.baseUrl?lr:500,t??1/0);if(a<=0)return{reachable:!1,timedOut:!0};let o=performance.now()+a,s=AbortSignal.timeout(Math.ceil(a)),c=n?AbortSignal.any([s,n]):s,l=await Promise.race([A(i.protocol),new Promise(e=>{c.addEventListener(`abort`,()=>e(null),{once:!0})})]),u=()=>br(s,o);return!l||K(c,o)?u():await new Promise(t=>{let n=e.baseUrl?O(e.token):{},r=l.request({protocol:i.protocol,host:i.hostname,port:i.port,path:i.pathname+i.search,method:`GET`,timeout:a,signal:c,headers:n},e=>{let n=``;e.setEncoding(`utf8`),e.on(`data`,e=>{n+=e}),e.on(`end`,()=>{let r=e.statusCode??500;t(K(s,o)?{reachable:!1,timedOut:!0}:{reachable:r<500,statusCode:r,...xr(n)})}),e.on(`error`,()=>t(u())),e.on(`aborted`,()=>t(u()))});r.on(`timeout`,()=>{r.destroy(),t({reachable:!1,timedOut:!0})}),r.on(`error`,()=>{t(u())}),r.end()})}function br(e,t){return K(e,t)?{reachable:!1,timedOut:!0}:{reachable:!1}}function K(e,t){return e.aborted||performance.now()>=t}function xr(e){try{let t=JSON.parse(e),n=t.upstream&&typeof t.upstream==`object`?Sr(t.upstream):void 0;return{...Sr(t),...n?{upstream:n}:{}}}catch{return{}}}function Sr(e){return{service:typeof e.service==`string`?e.service:void 0,version:typeof e.version==`string`?e.version:void 0,rpcProtocolVersion:typeof e.rpcProtocolVersion==`number`?e.rpcProtocolVersion:void 0,...typeof e.instanceId==`string`?{instanceId:e.instanceId}:{},...typeof e.hostArch==`string`?{hostArch:e.hostArch}:{}}}async function Cr(e,t,r,i,a,o={}){try{return await wr(e,t,r,i,a,o)}catch(r){if(!(r instanceof n)||r.details?.reason!==`daemon_transport_timeout`)throw r;let a=r.details.timeoutMs;throw typeof a==`number`?await Kn({info:e,statePaths:i,...Fr(t,H(e),a)}):r}}async function wr(e,t,n,r,i,a={}){let o=kr(e,n),s=typeof i==`number`?performance.now()+i:void 0;W(a.signal,t.meta?.requestId);try{return await q(e,t,r,i,o,a)}catch(c){if(e.baseUrl&&Dr(c))return await Tr(e,t,r,i,s,o,a);Or(c)&&Vr(e);let l=Ar(e,n,o);if(!l||!jr(c,o))throw c;return await q(e,t,r,i,l,a)}}async function Tr(e,t,r,i,a,o,s){Vr(e);let c=Er(t,i,a),l=await gr(e,c,s.signal);W(s.signal,t.meta?.requestId);let u=Er(t,i,a,l.timedOut?c:void 0);if(!l.reachable)throw new n(`COMMAND_FAILED`,`Remote daemon is unavailable`,{daemonBaseUrl:e.baseUrl});e.remoteInstanceId=l.instanceId,e.remoteUpstreamInstanceId=l.upstream?.instanceId,Br(e,l);try{return await q(e,t,r,u,o,s)}catch(t){throw Or(t)&&Vr(e),t}}function Er(e,t,n,r){if(n===void 0||t===void 0)return;let i=n-performance.now();if(i>0&&(r===void 0||r>lr))return i;throw Y(t,e.meta?.requestId)}function Dr(e){return e instanceof n&&e.details?.reason===`remote_instance_mismatch`}function Or(e){return e instanceof n&&(e.details?.reason===`daemon_transport_failure`||e.details?.reason===`daemon_transport_timeout`||e.details?.reason===`daemon_response_read_failure`)}async function q(e,t,n,r,i,a){return i===`http`?await Rr(e,t,n,r,a):await Pr(e,t,r,a)}function kr(e,t){if(e.baseUrl){if(t===`socket`)throw new n(`COMMAND_FAILED`,`Remote daemon endpoint only supports HTTP transport`,{daemonBaseUrl:e.baseUrl});return`http`}if(t===`http`||t===`socket`)return Mr(e,t);let r=(e.transport===`socket`||e.transport===`dual`?[`socket`,`http`]:[`http`,`socket`]).find(t=>J(e,t));if(r)return r;throw new n(`COMMAND_FAILED`,`Daemon metadata has no reachable transport`)}function J(e,t){return t===`http`?!!e.httpPort:!!e.port}function Ar(e,t,n){if(t!==`auto`||e.baseUrl)return null;let r=n===`socket`?`http`:`socket`;return J(e,r)?r:null}function jr(e,t){return t===`socket`&&e instanceof n&&e.code===`COMMAND_FAILED`&&e.message===`Failed to communicate with daemon`&&e.details?.daemonSocketRequestWritten===!1}function Mr(e,t){if(J(e,t))return t;throw G(t)}function Nr(e,t,r,i={}){return E({level:`error`,phase:`daemon_request_socket_error`,data:{requestId:t,message:e instanceof Error?e.message:String(e)}}),new n(`COMMAND_FAILED`,`Failed to communicate with daemon`,{...i,reason:`daemon_transport_failure`,requestId:t,hint:r?`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 Pr(e,t,n,r){let i=e.port;if(!i)throw G(`socket`);let a=r.signal;return W(a,t.meta?.requestId),new Promise((e,o)=>{let s=!1,c=!1,l=Je.createConnection({host:`127.0.0.1`,port:i},()=>{if(a?.aborted){c=!0,d(a);return}s=!0,l.write(`${JSON.stringify(t)}\n`)}),u=typeof n==`number`?setTimeout(()=>{c||(c=!0,p(),o(Y(n,t.meta?.requestId)),l.destroy())},n):void 0,d=e=>{p(),u&&clearTimeout(u),l.destroy(),o(U(e,s?`unknown`:`no`,t.meta?.requestId))},f=()=>{c||(c=!0,d(a))},p=()=>{a&&a.removeEventListener(`abort`,f)};a&&a.addEventListener(`abort`,f,{once:!0}),Dn(l,{req:t,onProgress:r.onProgress,isSettled:()=>c,clearTimeout:()=>{u&&clearTimeout(u)},resolve:t=>{c=!0,p(),e(t)},reject:e=>{c=!0,p(),o(e)}}),l.on(`error`,e=>{c||(c=!0,u&&clearTimeout(u),p(),o(Nr(e,t.meta?.requestId,!1,{daemonSocketRequestWritten:s})))})})}function Y(e,t){return new n(`COMMAND_FAILED`,`Daemon request timed out`,{reason:`daemon_transport_timeout`,timeoutMs:e,requestId:t})}function Fr(e,t,n){return{remote:t,timeoutMs:n,requestId:e.meta?.requestId,command:e.command,platform:e.flags?.platform,session:e.session,action:e.positionals?.[0]}}function Ir(e){return{...e.remoteInstanceId?{[we]:e.remoteInstanceId}:{},...e.remoteUpstreamInstanceId?{[je]:e.remoteUpstreamInstanceId}:{}}}function Lr(e,t){return e===409&&t[`x-agent-device-instance-mismatch`]===`true`}async function Rr(e,t,r,i,a){let o=vr(e,`rpc`);if(!o)throw G(`http`);let s=new URL(o),c=JSON.stringify(Hn(t,{includeTokenParam:!e.baseUrl})),l={"content-type":`application/json`,"content-length":Buffer.byteLength(c)};e.baseUrl&&(Object.assign(l,O(e.token)),Object.assign(l,Ir(e)));let u=await A(s.protocol),d=a.signal;return W(d,t.meta?.requestId),await new Promise((o,f)=>{let p=!1,m=!1,h=()=>{d&&d.removeEventListener(`abort`,x)},ee=e=>{p||(p=!0,h(),o(e))},g=e=>{p||(p=!0,h(),f(e))},_=n=>{Fn(n,{info:e,req:t,stateDir:r.baseDir,resolve:ee,reject:g})},v=u.request({protocol:s.protocol,host:s.hostname,port:s.port,method:`POST`,path:s.pathname+s.search,headers:l},r=>{if(Lr(r.statusCode,r.headers??{})){r.resume(),b&&clearTimeout(b),g(new n(`COMMAND_FAILED`,`Remote daemon instance changed`,{reason:`remote_instance_mismatch`,daemonBaseUrl:e.baseUrl}));return}if(En(t,r.headers?.[`content-type`])){On(r,{req:t,onProgress:a.onProgress,reject:g,clearTimeout:()=>{b&&clearTimeout(b)},handleResponseBody:_});return}Ce(r).catch(e=>{throw new n(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:t.meta?.requestId,reason:`daemon_response_read_failure`},e instanceof Error?e:void 0)}).then(e=>{b&&clearTimeout(b),_(e)}).catch(e=>{b&&clearTimeout(b),g(e)})}),y=H(e),b=typeof i==`number`?setTimeout(()=>{g(Y(i,t.meta?.requestId)),v.destroy()},i):void 0,x=()=>{p||(b&&clearTimeout(b),g(U(d,m?`unknown`:`no`,t.meta?.requestId)),v.destroy())};d&&d.addEventListener(`abort`,x,{once:!0}),v.on(`error`,e=>{b&&clearTimeout(b),!p&&g(Nr(e,t.meta?.requestId,y))}),v.write(c),v.end(),m=!0})}let X;function zr(e,t){return e.baseUrl===t.baseUrl&&e.token===t.token&&e.pid===t.pid}function Br(e,t){!t.instanceId||t.upstream&&!t.upstream.instanceId||(X={baseUrl:e.baseUrl??``,token:e.token,pid:e.pid,health:Promise.resolve(t)})}function Vr(e){X&&zr(X,e)&&(X=void 0)}async function Hr(e){if(X&&zr(X,e))return await X.health;let t={baseUrl:e.baseUrl??``,token:e.token,pid:e.pid,health:gr(e)};X=t;try{let e=await t.health;return(!e.reachable||!e.instanceId||e.upstream&&!e.upstream.instanceId)&&X===t&&(X=void 0),e}catch(e){throw X===t&&(X=void 0),e}}async function Ur(e,t={}){let{resolveClientSettings:n,ensureDaemon:r,attachSessionAddressHints:i}=await import(`./daemon-client-lifecycle.js`),a=e.meta?.requestId??T(),o=!!(e.meta?.debug||e.flags?.verbose),s=e.flags,{daemonAuthToken:c,...l}=s??{},u=s?{...e,flags:l}:e,d=n(u,t.authToken??c),f=he(pe(u.command),u),p=cr({signal:t.signal,requestId:a});p.refuseIfAborted();let m=await p.guard(async()=>await le(`daemon_startup`,async()=>await r(d),{requestId:a,session:e.session})),h=m.info,ee=await p.guard(async()=>await $r(h,d,u,t.signal));Zr(u.command);let g=Wr(u,ee,h,a,o,await Gr(u,h));return E({level:`info`,phase:`daemon_request_prepare`,data:{requestId:a,command:u.command,session:u.session}}),await Xr(u,m,d,async()=>{let n=await le(`daemon_request`,async()=>await Cr(h,g,d.transportPreference,d.paths,f,{onProgress:t.onProgress,signal:t.signal}),{requestId:a,command:e.command});return i(n,u,d)})}function Wr(e,t,n,r,i,a){return{...e,positionals:t.positionals,flags:t.flags,token:n.token,meta:{...qr(e,t,r,i),...Kr(n),providerCredentialFingerprint:a}}}async function Gr(e,t){if(H(t)||e.command!==`lease_allocate`)return;let{leaseProvider:n,leaseBackend:r}=w(e);if(!n)return;let{providerCredentialFingerprint:i}=await import(`./provider-credential-fingerprint.js`).then(e=>e.t);return i(n,process.env,r)}function Kr(e){let t=process.env.DEVELOPER_DIR;return H(e)?{developerDir:void 0}:t===void 0?{}:{developerDir:t}}function qr(e,t,n,r){let i=e.meta??{};return{...i,requestId:n,debug:r,...Jr(i,e.flags),...Yr(t)}}function Jr(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 Yr(e){return{...e.uploadedArtifactId?{uploadedArtifactId:e.uploadedArtifactId}:{},...e.clientArtifactPaths?{clientArtifactPaths:e.clientArtifactPaths}:{},...e.installSource?{installSource:e.installSource}:{}}}async function Xr(e,t,r,i){let a,o=!1,s;try{a=await i()}catch(e){o=!0,s=e}let{cleanupDaemonAfterRequest:c}=await import(`./daemon-client-lifecycle.js`),l=await c(e,t,r,a);if(o)throw s;if(!l)throw new n(`COMMAND_FAILED`,`Daemon request produced no response after cleanup`);return l}function Zr(e){!Qr(e)||process.stderr.isTTY!==!0||process.env.CI||process.stderr.write(e===S.reinstall?`Reinstalling...
|
|
2
2
|
`:`Installing...
|
|
3
|
-
`)}function Ke(e){return e===S.install||e===S.reinstall||e===C.installSource}async function qe(e,t,n,r){let i=x(n);if(!D(e)||!i.leaseId)return await T(n,e,r??new AbortController().signal);let{buildUploadLeaseHeartbeat:a,runProtectedLeaseWork:o}=await import(`./daemon-client-lease-beat.js`);return await o({heartbeat:a(e,t,n),task:t=>T(n,e,r?AbortSignal.any([t,r]):t),callerSignal:r})}function W(e,t){return A.join(e,`metro-sessions`,`${ge(t)}.json`)}function G(e){let t=W(e.stateDir,e.session);k.mkdirSync(A.dirname(t),{recursive:!0}),k.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function Je(e){let t=W(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 K(e){k.rmSync(W(e.stateDir,e.session),{force:!0})}function Ye(e){let n=async(t,n)=>await e(C.humanControl,t,n);return{allocate:async t=>J(await e(C.leaseAllocate,[],{...t,leaseId:void 0})),heartbeat:async t=>J(await e(C.leaseHeartbeat,[],t)),release:async t=>{let n=await e(C.leaseRelease,[],t);return{released:n.released===!0,provider:h(n.provider)?n.provider:void 0}},humanControl:{list:async e=>{let r=await n([`list`],e);if(!Array.isArray(r.holds))throw new t(`COMMAND_FAILED`,`Daemon did not return human-control holds.`);return r.holds.map(q)},put:async(e,t={},r)=>q((await n([`put`,e,JSON.stringify(t)],r)).hold),remove:async(e,t)=>(await n([`remove`,e],t)).released===!0}}}function q(e){if(!h(e)||!h(e.scope)||e.state!==`active`&&e.state!==`activating`||typeof e.createdAt!=`number`||typeof e.updatedAt!=`number`)throw new t(`COMMAND_FAILED`,`Daemon returned an invalid human-control hold.`);return{id:l(e,`id`),scope:{backend:l(e.scope,`backend`),leaseProvider:c(e.scope,`leaseProvider`),deviceKey:l(e.scope,`deviceKey`)},state:e.state,reason:c(e,`reason`),createdAt:e.createdAt,updatedAt:e.updatedAt,...typeof e.expiresAt==`number`?{expiresAt:e.expiresAt}:{}}}function J(e){let t=e.lease;if(!h(t))throw Error(`Invalid lease response from daemon`);return{leaseId:l(t,`leaseId`),tenantId:l(t,`tenantId`),runId:l(t,`runId`),backend:l(t,`backend`),leaseProvider:c(t,`leaseProvider`),clientId:c(t,`clientId`),deviceKey:c(t,`deviceKey`),...t.retainOnClose===!0?{retainOnClose:!0}:{},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:()=>Y});function Y(e={},n={}){let i=n.transport??U,o=t=>r(t.responseLevel??e.responseLevel),s=async(t,n=[],r={},o,s)=>{let c=Q(e,r),l=c.requestId??y(),u=E({signal:c.signal,requestId:l});u.refuseIfAborted();let d={session:B(c.session),command:t,positionals:n,...s?{input:s}:{},flags:ue(c,o),runtime:c.runtime,meta:{...Fe(c),requestId:l}},f=await u.guard(async()=>await i(d,{authToken:c.daemonAuthToken,signal:c.signal}));return f.ok||a(f.error),f.data??{}},u=async(e={})=>{let t=await s(C.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(we)},d=async(e,t={})=>{let n=await Le(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},f=(t={})=>B(Q(e,t).session);return{command:{wait:async e=>await d(`wait`,e),alert:async(e={})=>await d(`alert`,e),appState:async(e={})=>await d(`appstate`,e),back:async(e={})=>await d(`back`,e),home:async(e={})=>await d(`home`,e),orientation:async e=>await d(`orientation`,e),fold:async e=>await d(`fold`,e),appSwitcher:async(e={})=>await d(`app-switcher`,e),actionButton:async(e={})=>await d(`action-button`,e),keyboard:async(e={})=>await d(`keyboard`,e),clipboard:async e=>await d(`clipboard`,e),tvRemote:async e=>await d(`tv-remote`,e),reactNative:async e=>await d(`react-native`,e),doctor:async(e={})=>await d(`doctor`,e),prepare:async e=>await d(`prepare`,e),viewport:async e=>await d(`viewport`,e)},devices:{list:async(e={})=>{let t=await d(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(P)},capabilities:async(e={})=>{let t=await d(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:P(t.device),availableCommands:n}},boot:async(e={})=>await d(`boot`,e),shutdown:async(e={})=>await d(`shutdown`,e)},sessions:{list:async(e={})=>await u(e),stateDir:async(t={})=>{let n=Q(e,t);return O(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir},close:async(t={})=>{let n=f(t);try{let e=await d(`close`,t);return{session:n,shutdown:R(e.shutdown),provider:Z(e.provider),savedScript:c(e,`savedScript`),identifiers:{session:n}}}finally{ut(e,t)}},saveScript:async(e={})=>{let n=await s(C.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),r=n.actionCount;if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw new t(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let i=l(n,`session`);return{session:i,savedScript:l(n,`savedScript`),actionCount:r,identifiers:{session:i}}},artifacts:async(e={})=>await d(`artifacts`,e)},apps:{install:async e=>N(await d(`install`,e),f(e)),reinstall:async e=>N(await d(`reinstall`,e),f(e)),installFromSource:async e=>be(await d(`install-from-source`,e),f(e)),list:async(e={})=>{let t=await d(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=f(t),r=await d(`open`,t);lt({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=Ee(r),a=c(r,`appBundleId`),o=a,s=me(r);return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:c(r,`sessionStateDir`),runnerLogPath:c(r,`runnerLogPath`),requestLogPath:c(r,`requestLogPath`),eventLogPath:c(r,`eventLogPath`),appName:c(r,`appName`),appBundleId:a,appId:o,selection:ke(r.selection),startup:Ae(r.startup),runtime:Te(r.runtime),device:i,...r.launchConfirmation===`accepted`?{launchConfirmation:`accepted`}:{},...Ne(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=f(e),n=await d(`close`,e);return{session:t,closedApp:e.app,shutdown:R(n.shutdown),savedScript:c(n,`savedScript`),identifiers:{session:t}}},push:async e=>await d(`push`,e),triggerEvent:async e=>await d(`trigger-app-event`,e)},materializations:{release:async e=>xe(await s(C.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:Ye(s),metro:{prepare:async t=>{let n=await ve({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 ot(e,n),n},reload:async(t={})=>await _e({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??st(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=f(e),n=await d(`snapshot`,e);return o(e)?n:it(n,t)},screenshot:async(e={})=>{let t=f(e),n=await d(`screenshot`,e);return o(e)?n:ye(n,t)},diff:async e=>await d(`diff`,e)},interactions:{click:async e=>await d(`click`,e),press:async e=>await d(`press`,e),longPress:async e=>await d(`longpress`,e),hover:async e=>await d(`hover`,e),swipe:async e=>await d(`swipe`,e),pan:async e=>await d(`gesture`,Ze(e)),drag:async e=>await d(`gesture`,Qe(e)),fling:async e=>await d(`gesture`,$e(e)),swipeGesture:async e=>await d(`gesture`,et(e)),focus:async e=>await d(`focus`,e),type:async e=>await d(`type`,e),fill:async e=>await d(`fill`,e),scroll:async e=>await d(`scroll`,e),pinch:async e=>await d(`gesture`,tt(e)),rotateGesture:async e=>await d(`gesture`,nt(e)),transformGesture:async e=>await d(`gesture`,rt(e)),get:async e=>await d(`get`,e),is:async e=>await d(`is`,e),find:async e=>await d(`find`,e)},replay:{run:async e=>await d(`replay`,e),test:async e=>await d(`test`,e)},batch:{run:async e=>await d(`batch`,e)},observability:{perf:async e=>await d(`perf`,e),logs:async(e={})=>await d(`logs`,e),events:async(e={})=>await d(`events`,e),network:async(e={})=>await d(`network`,e),audio:async(e={})=>await d(`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 d(`record`,e),trace:async e=>await d(`trace`,e)},settings:{update:async e=>await d(`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 $e(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function et(e){return{...e,kind:`swipe`}}function tt(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 nt(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 rt(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,n,r){if(e===void 0!=(n===void 0))throw new t(`INVALID_ARGS`,`gesture ${r} center requires both x and y`)}function it(e,t){let n=c(e,`appBundleId`);return{nodes:Pe(e.nodes),...typeof e.truncated==`boolean`?{truncated:e.truncated}:{},appName:c(e,`appName`),appBundleId:n,...at(e),identifiers:{session:t,appId:n,appBundleId:n}}}function at(e){let t=Z(e.visibility),n=Z(e.unchanged),r=d(e.keyboard),i=se(e.viewport),a=ee(e.snapshotDiagnostics);return{...r?{keyboard:r}:{},...i?{viewport:i}:{},...t?{visibility:t}:{},...o(e),...n?{unchanged:n}:{},...a?{snapshotDiagnostics:a}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function Z(e){return h(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:O(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:B(n.session)}}function ot(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;G({...$(e),hints:{metroHost:n.hostname,metroPort:r,bundleUrl:i}})}catch{}}function st(e){try{return Je($(e))}catch{return}}function ct(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 lt(e){try{let t=$(e.config,e.options),n=ct(e.runtime);if(n){G({...t,hints:n});return}e.sessionReused||K(t)}catch{}}function ut(e,t){try{K($(e,t))}catch{}}export{Y as n,U as r,Xe as t};
|
|
3
|
+
`)}function Qr(e){return e===S.install||e===S.reinstall||e===C.installSource}async function $r(e,t,n,r){let i=w(n);if(!H(e)||!i.leaseId)return await an(n,e,r??new AbortController().signal);let{buildUploadLeaseHeartbeat:a,runProtectedLeaseWork:o}=await import(`./daemon-client-lease-beat.js`);return await o({heartbeat:a(e,t,n),task:t=>an(n,e,r?AbortSignal.any([t,r]):t),callerSignal:r})}function ei(e,t){return M.join(e,`metro-sessions`,`${Ne(t)}.json`)}function ti(e){let t=ei(e.stateDir,e.session);j.mkdirSync(M.dirname(t),{recursive:!0}),j.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function ni(e){let t=ei(e.stateDir,e.session),n;try{n=j.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;try{let e={metroHost:typeof i.metroHost==`string`?i.metroHost:void 0,metroPort:typeof i.metroPort==`number`?i.metroPort:void 0,bundleUrl:typeof i.bundleUrl==`string`?i.bundleUrl:void 0};if(typeof i.controlBaseUrl!=`string`&&Object.values(e).every(e=>e===void 0))return;let t=typeof i.controlBaseUrl==`string`?new URL(i.controlBaseUrl):ze({runtime:e});return t.protocol===`http:`||t.protocol===`https:`?{controlBaseUrl:t.toString(),...Array.isArray(i.deviceBaseUrls)?{deviceBaseUrls:i.deviceBaseUrls.filter(e=>typeof e==`string`)}:{}}:void 0}catch{return}}function ri(e){j.rmSync(ei(e.stateDir,e.session),{force:!0})}function ii(e){let t=async(t,n)=>await e(C.humanControl,t,n);return{allocate:async t=>oi(await e(C.leaseAllocate,[],{...t,leaseId:void 0})),heartbeat:async t=>oi(await e(C.leaseHeartbeat,[],t)),release:async t=>{let n=await e(C.leaseRelease,[],t);return{released:n.released===!0,provider:x(n.provider)?n.provider:void 0}},humanControl:{list:async e=>{let r=await t([`list`],e);if(!Array.isArray(r.holds))throw new n(`COMMAND_FAILED`,`Daemon did not return human-control holds.`);return r.holds.map(ai)},put:async(e,n={},r)=>ai((await t([`put`,e,JSON.stringify(n)],r)).hold),remove:async(e,n)=>(await t([`remove`,e],n)).released===!0}}}function ai(e){if(!x(e)||!x(e.scope)||e.state!==`active`&&e.state!==`activating`||typeof e.createdAt!=`number`||typeof e.updatedAt!=`number`)throw new n(`COMMAND_FAILED`,`Daemon returned an invalid human-control hold.`);return{id:m(e,`id`),scope:{backend:m(e.scope,`backend`),leaseProvider:p(e.scope,`leaseProvider`),deviceKey:m(e.scope,`deviceKey`)},state:e.state,reason:p(e,`reason`),createdAt:e.createdAt,updatedAt:e.updatedAt,...typeof e.expiresAt==`number`?{expiresAt:e.expiresAt}:{}}}function oi(e){let t=e.lease;if(!x(t))throw Error(`Invalid lease response from daemon`);return{leaseId:m(t,`leaseId`),tenantId:m(t,`tenantId`),runId:m(t,`runId`),backend:m(t,`backend`),leaseProvider:p(t,`leaseProvider`),clientId:p(t,`clientId`),deviceKey:p(t,`deviceKey`),...t.retainOnClose===!0?{retainOnClose:!0}:{},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}}function si(e){return{...typeof e.path==`string`?{path:e.path}:{},...typeof e.width==`number`?{width:e.width}:{},...typeof e.height==`number`?{height:e.height}:{},...typeof e.logicalWidth==`number`?{logicalWidth:e.logicalWidth}:{},...typeof e.logicalHeight==`number`?{logicalHeight:e.logicalHeight}:{},...typeof e.pixelDensity==`number`?{pixelDensity:e.pixelDensity}:{},...u(e.displayRotation)?{displayRotation:e.displayRotation}:{},...e.overlayRefs?{overlayRefs:e.overlayRefs}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function ci(e,t){let n=li(e);return{path:m(e,`path`),width:n?.width,height:n?.height,logicalWidth:n?.logicalWidth,logicalHeight:n?.logicalHeight,pixelDensity:n?.pixelDensity,...n?.displayRotation?{displayRotation:n.displayRotation}:{},overlayRefs:n?.overlayRefs,...n?.warnings?{warnings:n.warnings}:{},identifiers:{session:t}}}function li(e){if(!x(e))return;let t=fi(e);return si({path:ui(e,`path`),width:Z(e,`width`),height:Z(e,`height`),logicalWidth:Z(e,`logicalWidth`),logicalHeight:Z(e,`logicalHeight`),pixelDensity:Z(e,`pixelDensity`),displayRotation:u(e.displayRotation)?e.displayRotation:void 0,overlayRefs:di(e.overlayRefs),...t===void 0?{}:{warnings:t}})}function Z(e,t){let n=e[t];return typeof n==`number`?n:void 0}function ui(e,t){let n=e[t];return typeof n==`string`?n:void 0}function di(e){if(Array.isArray(e))return e.filter(gi).flatMap(e=>{let t=pi(e);return t?[t]:[]})}function fi(e){if(Array.isArray(e.warnings))return l(e).filter(e=>e.length>0)}function pi(e){if(typeof e.ref!=`string`||e.ref.length===0)return;let t=mi(e);if(t)return{ref:e.ref,...hi(e),...t}}function mi(e){let t=y(e.rect);if(!t)return;let n=y(e.overlayRect);if(!n)return;let r=re(e.center);return r?{rect:t,overlayRect:n,center:r}:void 0}function hi(e){return typeof e.label==`string`&&e.label.length>0?{label:e.label}:{}}function gi(e){return x(e)}var _i=e({createAgentDeviceClient:()=>vi});function vi(e={},t={}){let r=t.transport??Ur,a=t=>i(t.responseLevel??e.responseLevel),o=async(t,n=[],i={},a,o)=>{let s=Q(e,i),l=s.requestId??T(),u=cr({signal:s.signal,requestId:l});u.refuseIfAborted();let d={session:F(s.session),command:t,positionals:n,...o?{input:o}:{},flags:ye(s,a),runtime:s.runtime,meta:{..._t(s),requestId:l}},f=await u.guard(async()=>await r(d,{authToken:s.daemonAuthToken,signal:s.signal}));return f.ok||c(f.error),f.data??{}},s=async(e={})=>{let t=await o(C.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(nt)},u=async(e,t={})=>{let n=await bt(e,t);return await o(n.command,n.positionals,n.options,n.metadataFlags,n.input)},d=(t={})=>F(Q(e,t).session);return{command:{wait:async e=>await u(`wait`,e),alert:async(e={})=>await u(`alert`,e),appState:async(e={})=>await u(`appstate`,e),back:async(e={})=>await u(`back`,e),home:async(e={})=>await u(`home`,e),orientation:async e=>await u(`orientation`,e),fold:async e=>await u(`fold`,e),appSwitcher:async(e={})=>await u(`app-switcher`,e),actionButton:async(e={})=>await u(`action-button`,e),keyboard:async(e={})=>await u(`keyboard`,e),clipboard:async e=>await u(`clipboard`,e),tvRemote:async e=>await u(`tv-remote`,e),reactNative:async e=>await u(`react-native`,e),doctor:async(e={})=>await u(`doctor`,e),prepare:async e=>await u(`prepare`,e),viewport:async e=>await u(`viewport`,e)},devices:{list:async(e={})=>{let t=await u(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map($e)},capabilities:async(e={})=>{let t=await u(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:$e(t.device),availableCommands:n}},boot:async(e={})=>await u(`boot`,e),shutdown:async(e={})=>await u(`shutdown`,e)},sessions:{list:async(e={})=>await s(e),stateDir:async(t={})=>{let n=Q(e,t);return k(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir},close:async(t={})=>{let n=d(t);try{let e=await u(`close`,t);return{session:n,shutdown:dt(e.shutdown),provider:b(e.provider),savedScript:p(e,`savedScript`),identifiers:{session:n}}}finally{Mi(e,t)}},saveScript:async(e={})=>{let t=await o(C.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),r=t.actionCount;if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw new n(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let i=m(t,`session`);return{session:i,savedScript:m(t,`savedScript`),actionCount:r,identifiers:{session:i}}},artifacts:async(e={})=>await u(`artifacts`,e)},apps:{install:async e=>Xe(await u(`install`,e),d(e)),reinstall:async e=>Xe(await u(`reinstall`,e),d(e)),installFromSource:async e=>Ze(await u(`install-from-source`,e),d(e)),list:async(e={})=>{let t=await u(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=d(t),r=await u(`open`,t);ji({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=ot(r),a=p(r,`appBundleId`),o=a,s=l(r);return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:p(r,`sessionStateDir`),runnerLogPath:p(r,`runnerLogPath`),requestLogPath:p(r,`requestLogPath`),eventLogPath:p(r,`eventLogPath`),appName:p(r,`appName`),appBundleId:a,appId:o,selection:lt(r.selection),startup:ut(r.startup),runtime:at(r.runtime),device:i,...r.launchConfirmation===`accepted`?{launchConfirmation:`accepted`}:{},...ht(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 u(`close`,e);return{session:t,closedApp:e.app,shutdown:dt(n.shutdown),savedScript:p(n,`savedScript`),identifiers:{session:t}}},push:async e=>await u(`push`,e),triggerEvent:async e=>await u(`trigger-app-event`,e)},materializations:{release:async e=>Qe(await o(C.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:ii(o),metro:{prepare:async t=>{let n=await Ve({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 Oi(e,n),n},reload:async(t={})=>await Be({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:ki(e)??e.runtime,timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=d(e),n=await u(`snapshot`,e);return a(e)?n:Ei(n,t)},screenshot:async(e={})=>{let t=d(e),n=await u(`screenshot`,e);return a(e)?n:ci(n,t)},diff:async e=>await u(`diff`,e)},interactions:{click:async e=>await u(`click`,e),press:async e=>await u(`press`,e),longPress:async e=>await u(`longpress`,e),hover:async e=>await u(`hover`,e),swipe:async e=>await u(`swipe`,e),pan:async e=>await u(`gesture`,yi(e)),drag:async e=>await u(`gesture`,bi(e)),fling:async e=>await u(`gesture`,xi(e)),swipeGesture:async e=>await u(`gesture`,Si(e)),focus:async e=>await u(`focus`,e),type:async e=>await u(`type`,e),fill:async e=>await u(`fill`,e),scroll:async e=>await u(`scroll`,e),pinch:async e=>await u(`gesture`,Ci(`pinch`,e)),rotateGesture:async e=>await u(`gesture`,Ci(`rotate`,e)),transformGesture:async e=>await u(`gesture`,wi(e)),get:async e=>await u(`get`,e),is:async e=>await u(`is`,e),find:async e=>await u(`find`,e)},replay:{run:async e=>await u(`replay`,e),test:async e=>await u(`test`,e)},batch:{run:async e=>await u(`batch`,e)},observability:{perf:async e=>await u(`perf`,e),logs:async(e={})=>await u(`logs`,e),events:async(e={})=>await u(`events`,e),network:async(e={})=>await u(`network`,e),audio:async(e={})=>await u(`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 u(`record`,e),trace:async e=>await u(`trace`,e)},settings:{update:async e=>await u(`settings`,e)}}}function yi(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 bi(e){return{...e,kind:`drag`}}function xi(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function Si(e){return{...e,kind:`swipe`}}function Ci(e,t){let{x:n,y:r,...i}=t;return Ti(n,r,e),{...i,kind:e,...n===void 0&&r===void 0?{}:{origin:{x:n,y:r}}}}function wi(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 Ti(e,t,r){if(e===void 0!=(t===void 0))throw new n(`INVALID_ARGS`,`gesture ${r} center requires both x and y`)}function Ei(e,t){let n=p(e,`appBundleId`);return{nodes:gt(e.nodes),...typeof e.truncated==`boolean`?{truncated:e.truncated}:{},appName:p(e,`appName`),appBundleId:n,...Di(e),identifiers:{session:t,appId:n,appBundleId:n}}}function Di(e){let t=b(e.visibility),n=b(e.unchanged),r=ee(e.keyboard),i=me(e.viewport),a=ie(e.snapshotDiagnostics);return{...r?{keyboard:r}:{},...i?{viewport:i}:{},...t?{visibility:t}:{},...d(e),...n?{unchanged:n}:{},...a?{snapshotDiagnostics:a}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:k(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:F(n.session)}}function Oi(e,t){try{let n=new Set;for(let e of[t.iosRuntime,t.androidRuntime])try{let t=Ai(e);t&&n.add(t.controlBaseUrl)}catch{}ti({...$(e),hints:{controlBaseUrl:new URL(`.`,t.statusUrl).toString(),deviceBaseUrls:[...n]}})}catch{}}function ki(e){try{let t=ni($(e));return t?{bundleUrl:t.controlBaseUrl}:void 0}catch{return}}function Ai(e){let{metroHost:t,metroPort:n,bundleUrl:r}=e??{};if(t!==void 0||n!==void 0||r!==void 0)return{controlBaseUrl:ze({runtime:e}).toString()}}function ji(e){try{let t=$(e.config,e.options),n=Ai(e.runtime);if(n){let r=e.options.runtime===void 0?ni(t):void 0;if(r&&(e.sessionReused||r.deviceBaseUrls?.includes(n.controlBaseUrl)))return;ti({...t,hints:n});return}e.sessionReused||ri(t)}catch{}}function Mi(e,t){try{ri($(e,t))}catch{}}export{Hr as a,Cr as c,Qn as d,ar as f,Ur as i,ir as l,vi as n,fr as o,si as r,dr as s,_i as t,H as u};
|