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/cli.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import{F as e,J as t,P as n,nt as r}from"./sdk-contracts.js";import{t as i}from"./capture.js";import{d as a,f as o,s,u as c}from"./sdk-batch-runner.js";import{a as l,i as u,l as d,n as f,o as p,r as m}from"./diagnostics.js";import"./diagnostics2.js";import{n as h,r as g}from"./agent-device-client.js";import{s as ee,t as te,u as ne}from"./sdk-batch.js";import{i as re,r as _,t as v}from"./catalog.js";import{n as y,r as b}from"./back-mode.js";import{L as ie}from"./registry.js";import{p as ae}from"./exec.js";import{n as oe}from"./command-metadata.js";import"./command.js";import{t as se}from"./session-artifact-paths.js";import{a as ce}from"./version.js";import{t as le}from"./daemon-resolution.js";import{r as x,t as ue}from"./command-schema.js";import{i as S,r as C,t as de}from"./cli-config.js";import{t as fe}from"./update-check.js";import{n as pe,r as me,t as he}from"./cli-command-aliases.js";import{exitAfterFlush as w}from"./process-exit.js";import{A as ge,D as _e,M as ve,f as ye,h as be,j as xe,k as Se,r as Ce}from"./connection-runtime.js";import{i as we}from"./auth-session.js";import T from"node:fs";import{pathToFileURL as Te}from"node:url";const E=`open <app> --relaunch`,Ee={start:{command:`open`,example:E},restart:{command:`open`,example:E},touch:{command:`press`,example:`press`},input:{command:`fill`,example:`fill`},settext:{command:`fill`,example:`fill`},entertext:{command:`fill`,example:`fill`},screencap:{command:`screenshot`,example:`screenshot`},capture:{command:`screenshot`,example:`screenshot`},dismiss:{command:`keyboard`,example:`keyboard dismiss`},"get-text":{command:`get`,example:`get text`},gettext:{command:`get`,example:`get text`},get_text:{command:`get`,example:`get text`},"open-url":{command:`open`,example:`open <url>`},"close-session":{command:`close`,example:`close`}};function D(e){if(e.length<=2)return[];let t=re(),n=t.filter(t=>t.startsWith(e));return n.length>0?n.sort(O).slice(0,3):k(e,t)}function O(e,t){return e.length-t.length||e.localeCompare(t)}function k(e,t){let n=t.map(t=>({name:t,distance:Oe(e,t)})).filter(t=>t.distance<=De(e));if(n.length===0)return[];let r=Math.min(...n.map(e=>e.distance));return n.filter(e=>e.distance===r).sort((e,t)=>e.name.localeCompare(t.name)).slice(0,3).map(e=>e.name)}function De(e){return e.length<4?1:e.length<=6?2:3}function Oe(e,t){return e===t?0:e.startsWith(t)||t.startsWith(e)?Math.abs(e.length-t.length):ke(e,t)}function ke(e,t){let n=e.length+1,r=t.length+1,i=Array.from({length:n},()=>Array(r).fill(0));for(let e=0;e<n;e+=1)i[e][0]=e;for(let e=0;e<r;e+=1)i[0][e]=e;for(let a=1;a<n;a+=1)for(let n=1;n<r;n+=1){let r=e[a-1]===t[n-1]?0:1;i[a][n]=Math.min(i[a-1][n]+1,i[a][n-1]+1,i[a-1][n-1]+r)}return i[n-1][r-1]}function A(e){let t=e.toLowerCase(),n=Ee[t]?.example;if(n)return n;let r=D(t);if(r.length!==0)return r.length===1?r[0]:`one of: ${r.join(`, `)}`}const Ae=new Set([`--bundle-id`,`--bundleid`,`--bundle`,`--package`,`--package-name`,`--packagename`,`--app-id`,`--appid`,`--pkg`]),je=new Set([`--session-locked`,`--session-lock-conflicts`]),Me={"--output":`--out`,"--path":`--out`};function Ne(e,t){let n=e.toLowerCase(),r=Me[n];if(r&&Pe(r,t))return r;let i=Fe(n,t);if(i.length!==0)return i.length===1?i[0]:`one of: ${i.join(`, `)}`}function Pe(e,t){let n=b().find(t=>t.names.includes(e));return n?S(n.key,t):!1}function Fe(e,t){let n=j(e);if(n.length<=2)return[];let r=Ie(t),i=r.filter(e=>j(e).startsWith(n));return i.length>0?i.sort(O).slice(0,3):k(n,r.map(e=>j(e))).map(e=>`--${e}`)}function Ie(e){let t=new Set;for(let n of b()){if(!S(n.key,e))continue;let r=n.names[0];r&&t.add(r)}return[...t]}function j(e){return e.replace(/^--?/,``)}function Le(e,t){let n=e.toLowerCase();if(Ae.has(n))return`Unknown flag: ${e}. The app or bundle id is a positional argument, e.g. ${E}.`;if(je.has(n))return`Unknown flag: ${e}. Use --session-lock reject|strip instead.`;if(n===i.cliToken)return`Unknown flag: ${e}. ${i.migration.screenshot}. ${i.migration.record}.`;let r=Ne(e,t);return r?`Unknown flag: ${e}. Did you mean ${r}?`:`Unknown flag: ${e}`}function M(e){let t={json:!1,help:!1,version:!1},r=null,i=null,a=[],o=[],s=[],c=!0;for(let o=0;o<e.length;o+=1){let l=e[o];if(c&&l===`--`){c=!1;continue}if(!c){r?a.push(l):(i=l,r=L(l));continue}if(Ve(r)){a.push(l);continue}let u=l.startsWith(`--`),d=l.startsWith(`-`)&&l.length>1;if(!u&&!d){r?a.push(l):(i=l,r=L(l));continue}let[f,p]=u?N(l):[l,void 0];if(ze(r,f))continue;let m=He(f,r);if(Be(r,m)){a.push(l);continue}if(!m){if(qe(r,a,l)){r?a.push(l):r=l;continue}throw new n(`INVALID_ARGS`,Le(f,r))}let h=Ge(m,f,p,e[o+1]);h.consumeNext&&(o+=1);let g=t[m.key];if(m.multiple){let e=Array.isArray(g)?[...g,h.value]:g===void 0?[h.value]:[g,h.value];t[m.key]=e}else t[m.key]=h.value;s.push({key:m.key,token:f})}return Re(i,t),{command:r,positionals:a,flags:t,warnings:o,providedFlags:s}}function Re(e,t){if(e)for(let n of he(e)?.impliedFlags??[])t[n]=!0}function ze(e,t){return t===`-c`&&(e===`snapshot`||e===`diff`)}function Be(e,t){return e===`react-devtools`?!t||!S(t.key,e):!1}function Ve(e){return e===`cdp`}function He(e,t){let n=b().filter(t=>t.names.includes(e));if(n.length<=1)return n[0]??y(e);if(t){let e=n.find(e=>S(e.key,t));if(e)return e}return y(e)}function Ue(e,t){let r=t?.strictFlags??!0,i=[...e.warnings],a=C({json:!1,help:!1,version:!1},t?.defaultFlags??{});if(C(a,e.flags),e.command&&!_(e.command)&&!a.help){let t=A(e.command),r=t?`Unknown command: ${e.command}. Did you mean ${t}?`:`Unknown command: ${e.command}`;throw new n(`INVALID_ARGS`,r)}let o=e.providedFlags.filter(t=>!S(t.key,e.command));if(o.length>0){let t=o.map(e=>e.token),s=$e(e.command,t);if(r)throw new n(`INVALID_ARGS`,s);i.push(s);for(let e of o)delete a[e.key]}let s=Ze(e);if(s.length>0){let t=Qe(e.command,e.positionals[0],s);if(r)throw new n(`INVALID_ARGS`,t);i.push(t);for(let e of s)delete a[e.key]}for(let t of Object.keys(a))a[t]!==void 0&&(S(t,e.command)||delete a[t]);Xe(e,a),We(e),ne(e.command,a);let c=Ye({command:e.command,positionals:e.positionals,flags:a,warnings:i});if(ue(c.command,c.positionals),c.command===`batch`&&+!!a.steps+ +!!a.stepsFile!=1)throw new n(`INVALID_ARGS`,`batch requires exactly one step source: --steps or --steps-file.`);return c}function We(e){if(e.command!==`back`)return;let t=e.providedFlags.filter(e=>e.key===`backMode`);if(!(new Set(t.map(e=>e.token)).size<=1))throw new n(`INVALID_ARGS`,`back accepts only one explicit mode flag: use either --in-app or --system.`)}function N(e){let t=e.indexOf(`=`);return t===-1?[e,void 0]:[e.slice(0,t),e.slice(t+1)]}function Ge(e,t,r,i){if(e.setValue!==void 0){if(r!==void 0)throw new n(`INVALID_ARGS`,`Flag ${t} does not take a value.`);return{value:e.setValue,consumeNext:!1}}if(e.type===`boolean`){if(r!==void 0)throw new n(`INVALID_ARGS`,`Flag ${t} does not take a value.`);return{value:!0,consumeNext:!1}}if(e.type===`booleanOrString`){if(r!==void 0){if(r.trim().length===0)throw new n(`INVALID_ARGS`,`Flag ${t} requires a non-empty value when provided.`);return{value:r,consumeNext:!1}}return i===void 0||F(i)?{value:!0,consumeNext:!1}:Ke(i)?{value:i,consumeNext:!0}:{value:!0,consumeNext:!1}}let a=r??i;if(a===void 0||r===void 0&&F(a))throw new n(`INVALID_ARGS`,`Flag ${t} requires a value.`);if(e.type===`string`)return{value:a,consumeNext:r===void 0};if(e.type===`enum`){if(!e.enumValues?.includes(a))throw new n(`INVALID_ARGS`,`Invalid ${P(t)}: ${a}`);return{value:a,consumeNext:r===void 0}}let o=Number(a);if(!Number.isFinite(o)||typeof e.min==`number`&&o<e.min||typeof e.max==`number`&&o>e.max)throw new n(`INVALID_ARGS`,`Invalid ${P(t)}: ${a}`);return{value:e.type===`int`?Math.floor(o):o,consumeNext:r===void 0}}function P(e){return e.replace(/^-+/,``)}function F(e){if(!e.startsWith(`-`)||e===`-`)return!1;let[t]=e.startsWith(`--`)?N(e):[e,void 0];return y(t)!==void 0}function Ke(e){let t=e.trim();return!t||/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(t)?!1:!!(t.startsWith(`./`)||t.startsWith(`../`)||t.startsWith(`~/`)||t.startsWith(`/`)||t.includes(`/`)||t.includes(`\\`))}function qe(e,t,n){if(!Je(n)||!e)return!1;let r=x(e);if(!r||r.allowsExtraPositionals)return!0;let i=r.positionalArgs??[];return i.length===0?!1:t.length<i.length||i.some(e=>e.includes(`?`))}function Je(e){return/^-\d+(\.\d+)?$/.test(e)}function Ye(e){if(e.flags.help)return e;if(e.command===`snapshot`&&e.flags.snapshotDiff){let{snapshotDiff:t,...n}=e.flags;return{command:`diff`,positionals:[`snapshot`,...e.positionals],flags:n,warnings:e.warnings}}return e}function Xe(e,t){let n=x(e.command)?.explicitOnlyFlags;if(n===void 0)return;let r=new Set(e.providedFlags.map(e=>e.key));for(let e of n)r.has(e)||delete t[e]}function Ze(e){let t=x(e.command)?.flagsByAction,n=e.positionals[0];if(t===void 0||n===void 0||!Object.hasOwn(t,n))return[];let r=t[n];if(r===void 0)return[];let i=new Set(Object.values(t).flat());return e.providedFlags.filter(e=>i.has(e.key)&&!r.includes(e.key))}function Qe(e,t,n){return`${e} ${t} does not read ${n.map(e=>e.token).join(`, `)}. Run \`${e} ${t} --help\` for the options it reads.`}function $e(e,t){return e?t.length===1?`Flag ${t[0]} is not supported for command ${e}.`:`Flags ${t.join(`, `)} are not supported for command ${e}.`:t.length===1?`Flag ${t[0]} requires a command that supports it.`:`Flags ${t.join(`, `)} require a command that supports them.`}async function I(){let{buildUsageText:e}=await import(`./cli-help.js`).then(e=>e.n);return e()}async function et(e){let{buildCommandUsageText:t}=await import(`./cli-help.js`).then(e=>e.n);return t(L(e))}function L(e){let t=me(e);if(t)throw new n(`INVALID_ARGS`,t);return pe(e)}function tt(){return{renderedToStderr:!1}}function nt(e){return t=>{t.type===`command`&&(e.renderedToStderr=!0,process.stderr.write(`${t.message}\n`))}}function rt(e){return oe(e)}const it={connect:async()=>(await import(`./connection.js`)).connectCommand,disconnect:async()=>(await import(`./connection.js`)).disconnectCommand,connection:async()=>(await import(`./connection.js`)).connectionCommand,auth:async()=>(await import(`./auth.js`)).authCommand,plugins:async()=>(await import(`./plugins2.js`)).pluginsCommand,daemon:async()=>(await import(`./daemon.js`)).daemonCommand,device:async()=>(await import(`./device3.js`)).deviceCommand,proxy:async()=>(await import(`./proxy.js`)).proxyCommand,takeover:async()=>(await import(`./takeover.js`)).takeoverCommand,replay:async()=>(await import(`./replay.js`)).replayCommand,screenshot:async()=>(await import(`./screenshot3.js`)).screenshotCommand,diff:async()=>(await import(`./screenshot3.js`)).diffCommand,record:async()=>(await import(`./recording.js`)).recordingCommand};async function R(e){let t={...e.flags},n=it[e.command];return n&&await(await n())({...e,flags:t})?!0:rt(e.command)?await at({...e,command:e.command,flags:t}):!1}async function at(e){let{runGenericClientBackedCommand:t}=await import(`./generic.js`);return await t(e)}function ot(e){return[`exec`,`--yes`,`--package`,`agent-react-devtools@0.5.0`,`--`,`agent-react-devtools`,...e]}function st(e){return e===`ios-instance`}function ct(e){return e[0]===`wait`&&e.includes(`--connected`)}function lt(e,t,n){n===0||!ct(e)||!st(t?.leaseBackend)||process.stderr.write([`Hint: Remote iOS React DevTools connects during JavaScript startup.`,"If the app was already open before `agent-device react-devtools start`, relaunch it with `agent-device open <bundle-id> --platform ios --relaunch`, then retry `agent-device react-devtools wait --connected`.",``].join(`
|
|
2
|
-
`)
|
|
3
|
-
`)}function q(e){let t=e.effectiveFlags,n=e.connectionMetadata;return{session:t.session,requestId:e.requestId,stateDir:t.stateDir,daemonBaseUrl:t.daemonBaseUrl,daemonAuthToken:t.daemonAuthToken,daemonTransport:t.daemonTransport,daemonServerMode:t.daemonServerMode,tenant:t.tenant,sessionIsolation:t.sessionIsolation,runId:t.runId,leaseId:t.leaseId,leaseBackend:t.leaseBackend,leaseProvider:n?.leaseProvider,clientId:n?.clientId,deviceKey:n?.deviceKey,providerApp:t.providerApp,providerOsVersion:t.providerOsVersion,providerProject:t.providerProject,providerBuild:t.providerBuild,providerSessionName:t.providerSessionName,providerDeviceOrientation:t.providerDeviceOrientation,providerGeoLocation:t.providerGeoLocation,providerTimezone:t.providerTimezone,providerAppiumVersion:t.providerAppiumVersion,providerLanguage:t.providerLanguage,providerLocale:t.providerLocale,providerNetworkProfile:t.providerNetworkProfile,providerCustomNetwork:t.providerCustomNetwork,providerNoResignApp:t.providerNoResignApp,awsProjectArn:t.awsProjectArn,awsDeviceArn:t.awsDeviceArn,awsAppArn:t.awsAppArn,awsRegion:t.awsRegion,awsInteractionMode:t.awsInteractionMode,runtime:e.resolvedRuntime,lockPolicy:e.binding.lockPolicy,lockPlatform:e.binding.defaultPlatform,cwd:process.cwd(),debug:e.debugOutputEnabled,cost:t.cost,responseLevel:t.responseLevel}}function jt(e){let t=e.effectiveFlags.daemonBaseUrl;return e.debugOutputEnabled&&!e.effectiveFlags.json&&!t?Yt(e.daemonPaths.logPath):null}async function Mt(e){if(e.command!==`test`)return;let{createReplayTestReporterRuntime:t}=await import(`./reporting.js`);return t({debug:e.debugOutputEnabled,verbose:e.effectiveFlags.verbose,json:e.effectiveFlags.json,reporter:e.effectiveFlags.reporter,reportJunit:e.effectiveFlags.reportJunit})}async function Nt(e,t,r,i){let{command:a,positionals:o,effectiveFlags:s}=e;if(a===`batch`){if(!e.parsedBatchSteps)throw new n(`INVALID_ARGS`,`batch requires --steps or --steps-file.`);let c=e.parsedBatchSteps.map((t,n)=>({...t,input:e.binding.lockPolicy&&e.flags.platform===void 0?{...t.input}:V(t.input,{policyOverrides:s,configuredPlatform:s.platform,configuredSession:s.session,inheritedPlatform:s.platform})}));if(await R({command:a,positionals:o,flags:{...s,batchSteps:c},client:t,debug:e.debugOutputEnabled,replayTestReporterRuntime:r,commandProgress:i}))return}else if(a===`runtime`)throw new n(`INVALID_ARGS`,`runtime command was removed. Use connect --remote-config <path> for remote runs, or metro prepare --remote-config <path> for inspection.`);else if(await R({command:a,positionals:o,flags:s,client:t,debug:e.debugOutputEnabled,replayTestReporterRuntime:r,commandProgress:i}))return;throw new n(`INVALID_ARGS`,Lt(a))}async function Pt(n,r,i){let a=e(n),o=t(a,{diagnosticId:l().diagnosticId,logPath:u({force:!0})?.path});if(r.command===`close`&&zt(a)){r.effectiveFlags.json&&await W({success:!0,data:{closed:`session`,source:`no-daemon`}});return}r.effectiveFlags.json?await W({success:!1,error:o}):(await U(o,{showDetails:r.debugOutputEnabled}),r.debugOutputEnabled&&Ft(r,o)),i&&i(),await w(1)}const J=64e3;function Ft(e,t){if(!e.effectiveFlags.daemonBaseUrl){Y(`daemon log`,e.daemonPaths.logPath);return}let n=t.diagnosticsRecord;n&&Y(`remote diagnostics`,se(e.daemonPaths.baseDir,n))}function Y(e,t){try{if(T.existsSync(t)){let n=T.readFileSync(t,`utf8`).split(`
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{I as t,P as n,Y as r,d as i,p as a,rt as o}from"./sdk-contracts.js";import{lt as s}from"./tv-remote.js";import{d as c,f as l,s as u,u as d}from"./sdk-batch-runner.js";import{D as f,O as ee,T as p,b as m,mt as h,pt as te,ut as g,x as _}from"./back-mode.js";import{a as v,i as y,l as ne,n as re,o as ie,r as b}from"./diagnostics.js";import"./diagnostics2.js";import{E as ae,T as oe,s as se}from"./sdk-device.js";import{i as ce,n as le}from"./agent-device-client.js";import{s as ue,t as de,u as fe}from"./sdk-batch.js";import{t as pe}from"./sdk-remote-config.js";import{W as me,n as he}from"./command-metadata.js";import{z as ge}from"./file.js";import{p as _e}from"./exec.js";import{i as ve,t as ye}from"./daemon-resolution.js";import"./command.js";import{a as be}from"./version.js";import{n as xe,r as Se}from"./remote-config-core.js";import{r as x,t as Ce}from"./command-schema.js";import{n as S,r as C,t as we}from"./cli-config.js";import{t as Te}from"./update-check.js";import{n as Ee,r as De,t as Oe}from"./cli-command-aliases.js";import{exitAfterFlush as w}from"./process-exit.js";import{t as ke}from"./remote-bridge.js";import T from"node:crypto";import E from"node:fs";import D from"node:path";import{pathToFileURL as Ae}from"node:url";const O=`open <app> --relaunch`,je={start:{command:`open`,example:O},restart:{command:`open`,example:O},touch:{command:`press`,example:`press`},input:{command:`fill`,example:`fill`},settext:{command:`fill`,example:`fill`},entertext:{command:`fill`,example:`fill`},screencap:{command:`screenshot`,example:`screenshot`},capture:{command:`screenshot`,example:`screenshot`},dismiss:{command:`keyboard`,example:`keyboard dismiss`},"get-text":{command:`get`,example:`get text`},gettext:{command:`get`,example:`get text`},get_text:{command:`get`,example:`get text`},"open-url":{command:`open`,example:`open <url>`},"close-session":{command:`close`,example:`close`}};function Me(e){if(e.length<=2)return[];let t=ee(),n=t.filter(t=>t.startsWith(e));return n.length>0?n.sort(Ne).slice(0,3):Pe(e,t)}function Ne(e,t){return e.length-t.length||e.localeCompare(t)}function Pe(e,t){let n=t.map(t=>({name:t,distance:Ie(e,t)})).filter(t=>t.distance<=Fe(e));if(n.length===0)return[];let r=Math.min(...n.map(e=>e.distance));return n.filter(e=>e.distance===r).sort((e,t)=>e.name.localeCompare(t.name)).slice(0,3).map(e=>e.name)}function Fe(e){return e.length<4?1:e.length<=6?2:3}function Ie(e,t){return e===t?0:e.startsWith(t)||t.startsWith(e)?Math.abs(e.length-t.length):Le(e,t)}function Le(e,t){let n=e.length+1,r=t.length+1,i=Array.from({length:n},()=>Array(r).fill(0));for(let e=0;e<n;e+=1)i[e][0]=e;for(let e=0;e<r;e+=1)i[0][e]=e;for(let a=1;a<n;a+=1)for(let n=1;n<r;n+=1){let r=e[a-1]===t[n-1]?0:1;i[a][n]=Math.min(i[a-1][n]+1,i[a][n-1]+1,i[a-1][n-1]+r)}return i[n-1][r-1]}function Re(e){let t=e.toLowerCase(),n=je[t]?.example;if(n)return n;let r=Me(t);if(r.length!==0)return r.length===1?r[0]:`one of: ${r.join(`, `)}`}const ze=new Set([`--bundle-id`,`--bundleid`,`--bundle`,`--package`,`--package-name`,`--packagename`,`--app-id`,`--appid`,`--pkg`]),Be=new Set([`--session-locked`,`--session-lock-conflicts`]),Ve={"--output":`--out`,"--path":`--out`};function He(e,t){let n=e.toLowerCase(),r=Ve[n];if(r&&Ue(r,t))return r;let i=We(n,t);if(i.length!==0)return i.length===1?i[0]:`one of: ${i.join(`, `)}`}function Ue(e,t){let n=_().find(t=>t.names.includes(e));return n?C(n.key,t):!1}function We(e,t){let n=k(e);if(n.length<=2)return[];let r=Ge(t),i=r.filter(e=>k(e).startsWith(n));return i.length>0?i.sort(Ne).slice(0,3):Pe(n,r.map(e=>k(e))).map(e=>`--${e}`)}function Ge(e){let t=new Set;for(let n of _()){if(!C(n.key,e))continue;let r=n.names[0];r&&t.add(r)}return[...t]}function k(e){return e.replace(/^--?/,``)}function Ke(e,t){let n=e.toLowerCase();if(ze.has(n))return`Unknown flag: ${e}. The app or bundle id is a positional argument, e.g. ${O}.`;if(Be.has(n))return`Unknown flag: ${e}. Use --session-lock reject|strip instead.`;if(n===s.cliToken)return`Unknown flag: ${e}. ${s.migration.screenshot}. ${s.migration.record}.`;let r=He(e,t);return r?`Unknown flag: ${e}. Did you mean ${r}?`:`Unknown flag: ${e}`}function A(e){let t={json:!1,help:!1,version:!1},r=null,i=null,a=[],o=[],s=[],c=!0;for(let o=0;o<e.length;o+=1){let l=e[o];if(c&&l===`--`){c=!1;continue}if(!c){r?a.push(l):(i=l,r=P(l));continue}if(Xe(r)){a.push(l);continue}let u=l.startsWith(`--`),d=l.startsWith(`-`)&&l.length>1;if(!u&&!d){r?a.push(l):(i=l,r=P(l));continue}let[f,ee]=u?j(l):[l,void 0];if(Je(r,f))continue;let p=Ze(f,r);if(Ye(r,p)){a.push(l);continue}if(!p){if(rt(r,a,l)){r?a.push(l):r=l;continue}throw new n(`INVALID_ARGS`,Ke(f,r))}let m=et(p,f,ee,e[o+1]);m.consumeNext&&(o+=1);let h=t[p.key];if(p.multiple){let e=Array.isArray(h)?[...h,m.value]:h===void 0?[m.value]:[h,m.value];t[p.key]=e}else t[p.key]=m.value;s.push({key:p.key,token:f})}return qe(i,t),{command:r,positionals:a,flags:t,warnings:o,providedFlags:s}}function qe(e,t){if(e)for(let n of Oe(e)?.impliedFlags??[])t[n]=!0}function Je(e,t){return t===`-c`&&(e===`snapshot`||e===`diff`)}function Ye(e,t){return e===`react-devtools`?!t||!C(t.key,e):!1}function Xe(e){return e===`cdp`}function Ze(e,t){let n=_().filter(t=>t.names.includes(e));if(n.length<=1)return n[0]??m(e);if(t){let e=n.find(e=>C(e.key,t));if(e)return e}return m(e)}function Qe(e,t){let r=t?.strictFlags??!0,i=[...e.warnings],a=S({json:!1,help:!1,version:!1},t?.defaultFlags??{});if(S(a,e.flags),e.command&&!f(e.command)&&!a.help){let t=Re(e.command),r=t?`Unknown command: ${e.command}. Did you mean ${t}?`:`Unknown command: ${e.command}`;throw new n(`INVALID_ARGS`,r)}let o=e.providedFlags.filter(t=>!C(t.key,e.command));if(o.length>0){let t=o.map(e=>e.token),s=lt(e.command,t);if(r)throw new n(`INVALID_ARGS`,s);i.push(s);for(let e of o)delete a[e.key]}let s=st(e);if(s.length>0){let t=ct(e.command,e.positionals[0],s);if(r)throw new n(`INVALID_ARGS`,t);i.push(t);for(let e of s)delete a[e.key]}for(let t of Object.keys(a))a[t]!==void 0&&(C(t,e.command)||delete a[t]);ot(e,a),$e(e),fe(e.command,a);let c=at({command:e.command,positionals:e.positionals,flags:a,warnings:i});if(Ce(c.command,c.positionals),c.command===`batch`&&+!!a.steps+ +!!a.stepsFile!=1)throw new n(`INVALID_ARGS`,`batch requires exactly one step source: --steps or --steps-file.`);return c}function $e(e){if(e.command!==`back`)return;let t=e.providedFlags.filter(e=>e.key===`backMode`);if(!(new Set(t.map(e=>e.token)).size<=1))throw new n(`INVALID_ARGS`,`back accepts only one explicit mode flag: use either --in-app or --system.`)}function j(e){let t=e.indexOf(`=`);return t===-1?[e,void 0]:[e.slice(0,t),e.slice(t+1)]}function et(e,t,r,i){if(e.setValue!==void 0){if(r!==void 0)throw new n(`INVALID_ARGS`,`Flag ${t} does not take a value.`);return{value:e.setValue,consumeNext:!1}}if(e.type===`boolean`){if(r!==void 0)throw new n(`INVALID_ARGS`,`Flag ${t} does not take a value.`);return{value:!0,consumeNext:!1}}if(e.type===`booleanOrString`){if(r!==void 0){if(r.trim().length===0)throw new n(`INVALID_ARGS`,`Flag ${t} requires a non-empty value when provided.`);return{value:r,consumeNext:!1}}return i===void 0||tt(i)?{value:!0,consumeNext:!1}:nt(i)?{value:i,consumeNext:!0}:{value:!0,consumeNext:!1}}let a=r??i;if(a===void 0||r===void 0&&tt(a))throw new n(`INVALID_ARGS`,`Flag ${t} requires a value.`);if(e.type===`string`)return{value:a,consumeNext:r===void 0};if(e.type===`enum`){if(!e.enumValues?.includes(a))throw new n(`INVALID_ARGS`,`Invalid ${M(t)}: ${a}`);return{value:a,consumeNext:r===void 0}}let o=Number(a);if(!Number.isFinite(o)||typeof e.min==`number`&&o<e.min||typeof e.max==`number`&&o>e.max)throw new n(`INVALID_ARGS`,`Invalid ${M(t)}: ${a}`);return{value:e.type===`int`?Math.floor(o):o,consumeNext:r===void 0}}function M(e){return e.replace(/^-+/,``)}function tt(e){if(!e.startsWith(`-`)||e===`-`)return!1;let[t]=e.startsWith(`--`)?j(e):[e,void 0];return m(t)!==void 0}function nt(e){let t=e.trim();return!t||/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(t)?!1:!!(t.startsWith(`./`)||t.startsWith(`../`)||t.startsWith(`~/`)||t.startsWith(`/`)||t.includes(`/`)||t.includes(`\\`))}function rt(e,t,n){if(!it(n)||!e)return!1;let r=x(e);if(!r||r.allowsExtraPositionals)return!0;let i=r.positionalArgs??[];return i.length===0?!1:t.length<i.length||i.some(e=>e.includes(`?`))}function it(e){return/^-\d+(\.\d+)?$/.test(e)}function at(e){if(e.flags.help)return e;if(e.command===`snapshot`&&e.flags.snapshotDiff){let{snapshotDiff:t,...n}=e.flags;return{command:`diff`,positionals:[`snapshot`,...e.positionals],flags:n,warnings:e.warnings}}return e}function ot(e,t){let n=x(e.command)?.explicitOnlyFlags;if(n===void 0)return;let r=new Set(e.providedFlags.map(e=>e.key));for(let e of n)r.has(e)||delete t[e]}function st(e){let t=x(e.command)?.flagsByAction,n=e.positionals[0];if(t===void 0||n===void 0||!Object.hasOwn(t,n))return[];let r=t[n];if(r===void 0)return[];let i=new Set(Object.values(t).flat());return e.providedFlags.filter(e=>i.has(e.key)&&!r.includes(e.key))}function ct(e,t,n){return`${e} ${t} does not read ${n.map(e=>e.token).join(`, `)}. Run \`${e} ${t} --help\` for the options it reads.`}function lt(e,t){return e?t.length===1?`Flag ${t[0]} is not supported for command ${e}.`:`Flags ${t.join(`, `)} are not supported for command ${e}.`:t.length===1?`Flag ${t[0]} requires a command that supports it.`:`Flags ${t.join(`, `)} require a command that supports them.`}async function N(){let{buildUsageText:e}=await import(`./cli-help.js`).then(e=>e.n);return e()}async function ut(e){let{buildCommandUsageText:t}=await import(`./cli-help.js`).then(e=>e.n);return t(P(e))}function P(e){let t=De(e);if(t)throw new n(`INVALID_ARGS`,t);return Ee(e)}function dt(){return{renderedToStderr:!1}}function ft(e){return t=>{t.type===`command`&&(e.renderedToStderr=!0,process.stderr.write(`${t.message}\n`))}}function pt(e){return he(e)}const mt={connect:async()=>(await import(`./connection.js`)).connectCommand,disconnect:async()=>(await import(`./connection.js`)).disconnectCommand,connection:async()=>(await import(`./connection.js`)).connectionCommand,auth:async()=>(await import(`./auth.js`)).authCommand,plugins:async()=>(await import(`./plugins2.js`)).pluginsCommand,daemon:async()=>(await import(`./daemon.js`)).daemonCommand,device:async()=>(await import(`./device.js`)).deviceCommand,proxy:async()=>(await import(`./proxy.js`)).proxyCommand,takeover:async()=>(await import(`./takeover.js`)).takeoverCommand,replay:async()=>(await import(`./replay.js`)).replayCommand,screenshot:async()=>(await import(`./screenshot3.js`)).screenshotCommand,diff:async()=>(await import(`./screenshot3.js`)).diffCommand,record:async()=>(await import(`./recording.js`)).recordingCommand};async function ht(e){let t={...e.flags},n=mt[e.command];return n&&await(await n())({...e,flags:t})?!0:pt(e.command)?await gt({...e,command:e.command,flags:t}):!1}async function gt(e){let{runGenericClientBackedCommand:t}=await import(`./generic.js`);return await t(e)}function _t(e){return[`exec`,`--yes`,`--package`,`agent-cdp@1.6.1`,`--`,`agent-cdp`,...e]}function vt(e){return e.some(e=>e===`--url`||e.startsWith(`--url=`))}function yt(e){return e[0]===`target`&&(e[1]===`list`||e[1]===`select`)&&!vt(e)}function bt(e){let t=new URL(e);t.search=``,t.hash=``;let n=t.pathname.replace(/\/+$/,``);return t.pathname=n.endsWith(`/index.bundle`)?n.slice(0,-13)||`/`:n||`/`,t.toString().replace(/\/+$/,``)}function xt(e){let t=e?.metroPublicBaseUrl?.trim();return t?bt(t):null}function St(e,t={}){if(!yt(e)||!t.flags?.metroProxyBaseUrl||!ke(t.flags.leaseBackend))return e;let r=xt(t.flags);if(!r)throw new n(`INVALID_ARGS`,`cdp remote bridge target discovery requires a React Native dev-server public base URL.`,{hint:`Include metroPublicBaseUrl in the remote config so cdp can reach the local or tunneled Metro/Re.Pack CDP endpoint without bridge proxy authentication.`});return[...e,`--url`,r]}async function Ct(e,t={}){let n=St(e,t);return(await _e(`npm`,_t(n),{cwd:t.cwd??process.cwd(),env:t.env??process.env,allowFailure:!0,onStdoutChunk:e=>{process.stdout.write(e)},onStderrChunk:e=>{process.stderr.write(e)}})).exitCode}const F=`${u} Run agent-device help batch for the commands batch accepts and for runnable step examples.`,wt=`${de} Run agent-device help batch for the commands batch accepts and for runnable step examples.`;function Tt(e){let t;try{t=JSON.parse(e)}catch{throw new n(`INVALID_ARGS`,`Batch steps must be valid JSON.`)}if(!Array.isArray(t)||t.length===0)throw new n(`INVALID_ARGS`,`Batch steps must be a non-empty JSON array.`);return t.map((e,t)=>Et(e,t+1))}function Et(e,t){let r=l(e,t,F),i=[`positionals`,`flags`].filter(e=>e in r);if(i.length>0){let e=i.map(e=>`"${e}"`).join(`, `);throw new n(`INVALID_ARGS`,`Batch step ${t} uses removed field(s): ${e}. Use {"command":"...","input":{...}}. Example: {"command":"open","input":{"app":"settings","platform":"ios"}}.`,{hint:F})}me(r,[`command`,`input`,`runtime`],`Batch step ${t}`,F);let a=d(r.runtime,t);return{command:ue(r.command,t,wt),input:c(r,t,F),...a===void 0?{}:{runtime:a}}}function Dt(e,t={}){let n=Ot(t),r={...e};return n.defaultPlatform&&r.platform===void 0&&(r.platform=n.defaultPlatform),r}function Ot(e){let t=e.env??process.env,n=e.inheritedPlatform??e.configuredPlatform??At(t.AGENT_DEVICE_PLATFORM),r=Mt(e.configuredSession??t.AGENT_DEVICE_SESSION);return{defaultPlatform:n,lockPolicy:kt(e.policyOverrides,t,r)}}function kt(e,t,n){let r=e?.sessionLock??jt(t.AGENT_DEVICE_SESSION_LOCK);if(r)return r;if(n)return`reject`}function At(e){if(e===void 0)return;let t=e.trim().toLowerCase();if(t){if(t===`ios`||t===`android`||t===`apple`)return t;throw new n(`INVALID_ARGS`,`Invalid AGENT_DEVICE_PLATFORM: ${e}. Use ios, android, or apple.`)}}function jt(e){if(e===void 0)return;let t=e.trim().toLowerCase();if(t){if(t===`reject`||t===`strip`)return t;throw new n(`INVALID_ARGS`,`Invalid session lock mode: ${e}. Use reject or strip.`)}}function Mt(e){return typeof e==`string`&&e.trim().length>0}const Nt=pe.map(e=>e.key);function I(e){let t={};for(let n of Nt){let r=e[n];r!==void 0&&(t[n]=r)}return t}function Pt(e){return e.remoteConfig?{...I(Se({configPath:e.remoteConfig,cwd:e.cwd,env:e.env}).profile),remoteConfig:e.remoteConfig}:{}}function Ft(e,t){let n=A(e),r=t?.env??process.env,i=t?.cwd??process.cwd(),a=It(n.command)?Pt({remoteConfig:n.flags.remoteConfig,cwd:i,env:r}):{},o=S(we({command:n.command,cwd:i,cliFlags:n.flags,env:r}),a);return{...Qe(n,{strictFlags:t?.strictFlags,defaultFlags:o}),providedFlags:n.providedFlags}}function It(e){return e!==null}function Lt(e){let t=ae(e),n=i(t);return{platform:t,target:e.target,leaseBackend:n,identityFlag:n?se(t):void 0,id:e.id}}function Rt(e){return`${e.platform}:${e.target??`mobile`}:${e.id}`}function L(e){let t=[e.leaseBackend?a(e.leaseBackend):void 0,e.recordedPlatform].filter(e=>e!==void 0);if(t.some(e=>t.some(t=>oe(e,t)))||oe(e.requestedPlatform,t[0]??e.recordedPlatform))return{ok:!1,boundPlatform:t[0],requestedPlatform:e.requestedPlatform};let n=[...t,e.requestedPlatform].filter(e=>e!==void 0);return{ok:!0,platform:n.find(e=>e!==`apple`)??n[0]}}function zt(e,t){return t!==void 0&&e.platform===void 0?!1:L({leaseBackend:e.leaseBackend,recordedPlatform:e.platform,requestedPlatform:t}).ok}function R(e){let t=V(e);if(!E.existsSync(t))return null;let n;try{n=JSON.parse(E.readFileSync(t,`utf8`))}catch(t){return Zt(e,t),null}return $t(n)?n:(Zt(e),null)}function Bt(e){let t=V({stateDir:e.stateDir,session:e.state.session});E.mkdirSync(D.dirname(t),{recursive:!0}),Yt(t,e.state),Yt(H(e.stateDir),{session:e.state.session})}function Vt(e){return{baseUrl:Xt(e.daemonBaseUrl),transport:e.daemonTransport,serverMode:e.daemonServerMode}}function z(e){E.rmSync(V(e),{force:!0});let t=H(e.stateDir);Kt(e.stateDir)===e.session&&E.rmSync(t,{force:!0})}function Ht(e){let t=e.validateRemoteConfigHash??!0,r=e.remoteConfig?xe({configPath:e.remoteConfig,cwd:e.cwd,env:e.env}):void 0,i=R(e)??(e.allowActiveFallback?U({stateDir:e.stateDir}):null);if(!i||r&&i.remoteConfigPath!==r)return null;if(t&&B(i.remoteConfigPath)!==i.remoteConfigHash)throw new n(`INVALID_ARGS`,`Active remote connection config changed. Run agent-device connect --force to refresh it.`,{remoteConfig:i.remoteConfigPath});let a=Jt(i,e),o=g(i);return{runtime:i.runtime,connection:h(o),flags:{...a,remoteConfig:i.remoteConfigPath,daemonBaseUrl:i.daemon?.baseUrl??a.daemonBaseUrl,daemonAuthToken:a.daemonAuthToken,daemonTransport:i.daemon?.transport??a.daemonTransport,daemonServerMode:i.daemon?.serverMode??a.daemonServerMode,...te(o),sessionIsolation:`tenant`,session:i.session,platform:i.platform??a.platform,target:i.target??a.target}}}function Ut(e){return h(g(e))}function Wt(e,t){return{leaseProvider:e.leaseProvider??t.leaseProvider,clientId:e.clientId??t.clientId,deviceKey:e.deviceKey??t.deviceKey}}function Gt(e,t){return!t||(t.leaseProvider===void 0||e.leaseProvider===t.leaseProvider)&&(t.clientId===void 0||e.clientId===t.clientId)}function B(e){try{return T.createHash(`sha256`).update(E.readFileSync(e)).digest(`hex`)}catch(t){throw new n(`INVALID_ARGS`,`Remote config file not found: ${e}`,{cause:t instanceof Error?t.message:String(t)})}}function V(e){return D.join(e.stateDir,`remote-connections`,`${Qt(e.session)}.json`)}function H(e){return D.join(e,`remote-connections`,`.active-session.json`)}function U(e){let t=Kt(e.stateDir);return t?R({stateDir:e.stateDir,session:t}):null}function Kt(e){let t=H(e);if(E.existsSync(t))try{let e=JSON.parse(E.readFileSync(t,`utf8`));return typeof e.session==`string`?e.session:void 0}catch{return}}function qt(e){if(e)return T.createHash(`sha256`).update(e).digest(`hex`).slice(0,12)}function Jt(e,t){try{return Se({configPath:e.remoteConfigPath,cwd:t.cwd,env:t.env}).profile}catch(e){if(t.validateRemoteConfigHash===!1)return{};throw e}}function Yt(e,t){ge({destination:e,contents:`${JSON.stringify(t,null,2)}\n`,mode:384})}function Xt(e){if(!e)return;let t=new URL(e);t.username=``,t.password=``;for(let e of Array.from(t.searchParams.keys()))/(auth|key|password|secret|token)/i.test(e)&&t.searchParams.delete(e);return t.toString().replace(/\/+$/,``)}function Zt(e,t){b({level:`warn`,phase:`remote_connection_state_invalid`,data:{session:e.session,cause:t instanceof Error?t.message:t?String(t):void 0}}),z(e)}function Qt(e){let t=e.replaceAll(/[^a-zA-Z0-9._-]/g,`_`);return t?t===e?t:`${t}-${T.createHash(`sha256`).update(e).digest(`hex`).slice(0,8)}`:`default`}function $t(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return t.version===1&&en(t,[`session`,`remoteConfigPath`,`remoteConfigHash`,`tenant`,`runId`,`connectedAt`,`updatedAt`])&&tn(t,[`leaseId`,`leaseBackend`,`leaseProvider`,`deviceKey`,`clientId`])&&nn(t.daemon)}function en(e,t){return t.every(t=>typeof e[t]==`string`)}function tn(e,t){return t.every(t=>e[t]===void 0||typeof e[t]==`string`)}function nn(e){return e===void 0?!0:!e||typeof e!=`object`||Array.isArray(e)?!1:rn(e)}function rn(e){let t=e;return(t.baseUrl===void 0||typeof t.baseUrl==`string`)&&(t.authToken===void 0||typeof t.authToken==`string`)&&(t.transport===void 0||typeof t.transport==`string`)&&(t.serverMode===void 0||typeof t.serverMode==`string`)}async function an(e,t){let r=await e.text(),i={};if(r.trim().length>0)try{i=JSON.parse(r)}catch(r){throw new n(`COMMAND_FAILED`,t.invalidJsonMessage,{status:e.status},r instanceof Error?r:void 0)}if(!e.ok)throw new n(`UNAUTHORIZED`,t.rejectedMessage,{status:e.status,response:i});return i}const on=1e3;async function sn(e){return await cn({command:e.command,flags:e.flags,stateDir:e.stateDir,allowInteractiveLogin:e.command===`connect`&&!e.flags.noLogin,env:e.env})}async function cn(e){let t=e.env??e.io?.env??process.env;if(!e.flags.daemonBaseUrl)return{flags:e.flags,source:`none`};if(X(e.flags.daemonAuthToken))return{flags:e.flags,source:`flag`};if(X(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{flags:e.flags,source:`env`};if(!Sn(e.flags.daemonBaseUrl,t))return{flags:e.flags,source:`none`};let r=await mn({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});if(r)return{flags:{...e.flags,daemonAuthToken:r.accessToken},source:`cli-session`};if(!e.allowInteractiveLogin)throw e.flags.noLogin?new n(`UNAUTHORIZED`,`Remote daemon authentication is required.`,{hint:`Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.`}):xn(e.command,t);let i=await W({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});return{flags:{...e.flags,daemonAuthToken:i.accessToken},source:`login`}}async function ln(e){let t=e.env??e.io?.env??process.env;if(X(e.flags.daemonAuthToken))return{accessToken:e.flags.daemonAuthToken,cloudBaseUrl:J(t)};if(X(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{accessToken:t.AGENT_DEVICE_DAEMON_AUTH_TOKEN,cloudBaseUrl:J(t)};let r=await mn({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});if(r)return{accessToken:r.accessToken,cloudBaseUrl:r.cloudBaseUrl};if(e.flags.noLogin)throw new n(`UNAUTHORIZED`,`Cloud connection profile authentication is required.`,{hint:`Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.`});let i=await W({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io,commandLabel:`agent-device connect`});return{accessToken:i.accessToken,cloudBaseUrl:i.session.cloudBaseUrl}}async function W(e){let t=e.env??e.io?.env??process.env,r=vn(t,e.io);if(r===`non-interactive`)throw xn(e.commandLabel??`agent-device connect`,t);let i=J(t),a=await K({baseUrl:i,pathName:`/api/control-plane/device-auth/start`,body:{client:`agent-device`,tenant:e.flags.tenant,runId:e.flags.runId,daemonBaseUrl:e.flags.daemonBaseUrl,session:e.flags.session},fetchImpl:e.io?.fetch});await _n(a);let o=X(a.verificationUriComplete)?a.verificationUriComplete:a.verificationUri;if(r===`local-browser`)Y(e.io,`Opening ${a.verificationUri}...\n`),await wn(o,e.io);else{let t=Cn(a.verificationUri,a.userCode);Y(e.io,`Open this URL on your machine:\n${t}\n\nWaiting for approval for 10 minutes...\n`)}let s=await gn({cloudBaseUrl:i,deviceCode:a.deviceCode,expiresIn:a.expiresIn,interval:a.interval,fetchImpl:e.io?.fetch,now:e.io?.now}),c=s.cliSession?.refreshCredential??s.cliSession?.refreshToken;if(!X(s.accessToken)||!X(c))throw new n(`UNAUTHORIZED`,`Device authorization did not return CLI credentials.`);let l=new Date(e.io?.now?.()??Date.now()).toISOString(),u={version:1,id:s.cliSession?.id??`cli-${Date.now().toString(36)}`,cloudBaseUrl:i,workspaceId:s.cliSession?.workspaceId,accountId:s.cliSession?.accountId,name:s.cliSession?.name,refreshCredential:c,createdAt:l,expiresAt:s.cliSession?.expiresAt};return dn({stateDir:e.stateDir,session:u}),{accessToken:s.accessToken,expiresAt:s.expiresAt,session:u}}function un(e){let t=G(e.stateDir);if(!E.existsSync(t))return null;try{let e=JSON.parse(E.readFileSync(t,`utf8`));return e.version!==1||!X(e.id)||!X(e.cloudBaseUrl)||!X(e.refreshCredential)||!X(e.createdAt)?null:e}catch{return null}}function dn(e){let t=G(e.stateDir);E.mkdirSync(D.dirname(t),{recursive:!0,mode:448}),E.writeFileSync(t,`${JSON.stringify(e.session,null,2)}\n`,{mode:384});try{E.chmodSync(t,384)}catch{}}function fn(e){let t=G(e.stateDir);return E.existsSync(t)?(E.rmSync(t,{force:!0}),!0):!1}function G(e){return D.join(e,`auth`,`cli-session.json`)}function pn(e){let t=un({stateDir:e.stateDir});return t?{authenticated:!0,source:`cli-session`,sessionId:t.id,cloudBaseUrl:t.cloudBaseUrl,workspaceId:t.workspaceId,accountId:t.accountId,name:t.name,createdAt:t.createdAt,expiresAt:t.expiresAt,expired:Tn(t.expiresAt,e.now)}:{authenticated:!1,source:`none`}}async function mn(e){let t=un({stateDir:e.stateDir});return!t||Tn(t.expiresAt,e.io?.now)?null:{accessToken:(await hn({session:t,flags:e.flags,env:e.env,io:e.io})).accessToken,cloudBaseUrl:J(e.env,t.cloudBaseUrl)}}async function hn(e){let t=await K({baseUrl:J(e.env,e.session.cloudBaseUrl),pathName:`/api/control-plane/cli-session/refresh`,body:{refreshCredential:e.session.refreshCredential,tenant:e.flags.tenant,runId:e.flags.runId,daemonBaseUrl:e.flags.daemonBaseUrl,session:e.flags.session},fetchImpl:e.io?.fetch});if(X(t.accessToken))return{accessToken:t.accessToken,expiresAt:t.expiresAt};throw t.status===`revoked`||t.error===`revoked`?new n(`UNAUTHORIZED`,`Stored cloud CLI session was revoked.`,{hint:`Run agent-device auth login again, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.`,status:t.status,error:t.error}):new n(`UNAUTHORIZED`,`Failed to refresh CLI session.`,{hint:`Run agent-device auth login again, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.`,status:t.status,error:t.error})}async function gn(e){let t=e.now??Date.now,r=Math.min((e.expiresIn??600)*1e3,6e5),i=t()+r,a=Math.max(on,(e.interval??5)*1e3);for(;t()<i;){let t=await K({baseUrl:e.cloudBaseUrl,pathName:`/api/control-plane/device-auth/poll`,body:{deviceCode:e.deviceCode},fetchImpl:e.fetchImpl});if(t.status===`approved`||X(t.accessToken))return t;if(t.status===`slow_down`||t.error===`slow_down`)a+=on;else if(t.status!==`authorization_pending`&&t.error!==`authorization_pending`)throw new n(`UNAUTHORIZED`,`Device authorization was not approved.`,{status:t.status,error:t.error});await En(a)}throw new n(`TIMEOUT`,`Device authorization expired before approval.`)}async function K(e){let t=await(e.fetchImpl??fetch)(new URL(e.pathName,e.baseUrl),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e.body),signal:AbortSignal.timeout(15e3)});return await an(t,{invalidJsonMessage:`Cloud auth endpoint returned invalid JSON (${t.status}).`,rejectedMessage:`Cloud auth endpoint rejected the request.`})}async function _n(e){if(!X(e.deviceCode))throw q(`deviceCode`);if(!X(e.userCode))throw q(`userCode`);if(!X(e.verificationUri))throw q(`verificationUri`);let{isSafeBrowserUrl:t}=await import(`./browser-launch.js`);if(!t(e.verificationUri))throw q(`verificationUri`);if(X(e.verificationUriComplete)&&!t(e.verificationUriComplete))throw q(`verificationUriComplete`)}function q(e){return new n(`COMMAND_FAILED`,`Cloud auth start returned an unusable response.`,{field:e})}function vn(e,t){let n=t?.stdinIsTTY??process.stdin.isTTY,r=t?.stdoutIsTTY??process.stdout.isTTY;return yn(e)||!n||!r?`non-interactive`:bn(e)?`device-code`:`local-browser`}function yn(e){return e.CI===`true`||e.GITHUB_ACTIONS===`true`||e.BUILDKITE===`true`}function bn(e){return!!(e.SSH_TTY||e.SSH_CONNECTION||e.CODESPACES===`true`||e.GITPOD_WORKSPACE_ID||e.REMOTE_CONTAINERS===`true`)}function xn(e,t){let r=J(t);return new n(`UNAUTHORIZED`,`${e} cannot perform interactive login in CI or a non-interactive shell.`,{hint:`Create a service/API token: ${new URL(`/api-keys`,r).toString()} Then set AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_...`})}function J(e,t){let r=e.AGENT_DEVICE_CLOUD_BASE_URL??t??`https://cloud.agent-device.dev`;try{return new URL(r).toString().replace(/\/+$/,``)}catch(e){throw new n(`INVALID_ARGS`,`Invalid AGENT_DEVICE_CLOUD_BASE_URL.`,{cloudBaseUrl:r},e instanceof Error?e:void 0)}}function Sn(e,t){if(t.AGENT_DEVICE_CLOUD_AUTH===`1`||t.AGENT_DEVICE_CLOUD_AUTH===`true`||X(t.AGENT_DEVICE_CLOUD_BASE_URL))return!0;try{let t=new URL(e).hostname.toLowerCase();return t===`agent-device.dev`||t.endsWith(`.agent-device.dev`)}catch{return!1}}function Cn(e,t){let n=new URL(e);return n.searchParams.set(`user_code`,t),n.toString()}async function wn(e,t){if(t?.openBrowser){await t.openBrowser(e);return}let{openUrlInBrowser:n}=await import(`./browser-launch.js`);await n(e)||Y(t,`Open this URL on your machine:\n${e}\n`)}function Y(e,t){(e?.stderr??process.stderr).write(t)}function Tn(e,t){if(!e)return!1;let n=Date.parse(e);return!Number.isFinite(n)||n<=(t?.()??Date.now())}function X(e){return typeof e==`string`&&e.trim().length>0}async function En(e){await new Promise(t=>setTimeout(t,e))}p.runtime;async function Dn(e){let{command:t,request:n,transport:r,transportOptions:i}=e;return await r({...n,command:t},i)}var On=e({runCli:()=>$});const Z=(e,t={})=>import(`./error.js`).then(e=>e.t).then(({printHumanError:n})=>n(e,t)),Q=e=>import(`./json.js`).then(({printJson:t})=>t(e)),kn={sendToDaemon:ce},An=new Set([`launchUrl`,`kind`,`metroBearerToken`,`metroKind`,`metroListenHost`,`metroNoInstallDeps`,`metroNoReuseExisting`,`metroPreparePort`,`metroProbeTimeoutMs`,`metroProjectRoot`,`metroProxyBaseUrl`,`metroPublicBaseUrl`,`metroRuntimeFile`,`metroStartupTimeoutMs`,`metroStatusHost`]),jn=new Set([`connect`,`connection`,`close`,`daemon`,`plugins`,`device`,`disconnect`,`metro`,`proxy`,`session`,`takeover`]);async function $(e,t=kn){let n=re(),r=be(),i=Gn(e),a=e.includes(`--json`),o=sr(e)??process.env.AGENT_DEVICE_SESSION??`default`;await ne({session:o,requestId:n,command:e[0],debug:i},async()=>{let{parsed:o,command:s,positionals:c}=await Nn(e,{version:r,jsonRequested:a,debugEnabled:i}),l=Jn(s,o.providedFlags),u=await Pn(o,{command:s,positionals:c,requestId:n,debugOutputEnabled:l});Mn(u.effectiveFlags);let d=null;try{if(s===`react-devtools`){await w(await Fn(u,t));return}if(s===`web`){let{runWebCommand:e}=await import(`./web.js`);await w(await e(c,{flags:u.effectiveFlags,stateDir:u.daemonPaths.baseDir}));return}if(Te({command:s,currentVersion:r,stateDir:u.daemonPaths.baseDir,flags:u.effectiveFlags}),await In(u,t),Mn(u.effectiveFlags),s===`cdp`){await w(await Ct(c,{flags:u.effectiveFlags,runtime:u.resolvedRuntime,cwd:process.cwd(),env:process.env}));return}d=Rn(u);let e=await zn(u),n=dt();await Bn(u,le(Ln(u),{transport:ir({command:s,flags:u.effectiveFlags,replayTestReporterRuntime:e,commandProgress:n,transport:t.sendToDaemon})}),e,n)}catch(e){await Vn(e,u,d)}finally{d&&d()}})}function Mn(e){e.daemonAuthToken&&ie(e.daemonAuthToken)}async function Nn(e,t){let i;try{i=Ft(e,{cwd:process.cwd(),env:process.env})}catch(e){b({level:`error`,phase:`cli_parse_failed`,data:{error:e instanceof Error?e.message:String(e)}});let n=r(e,{diagnosticId:v().diagnosticId,logPath:y({force:!0})?.path});return t.jsonRequested?await Q({success:!1,error:n}):await Z(n,{showDetails:t.debugEnabled}),w(1)}for(let e of i.warnings)process.stderr.write(`Warning: ${e}\n`);if(i.flags.version)return process.stdout.write(`${t.version}\n`),w(0);let a=i.command===`help`,o=i.flags.help;if(a||o){if(a&&i.positionals.length>1)return await Z(new n(`INVALID_ARGS`,`help accepts at most one command.`)),w(1);let e=a?i.positionals[0]:i.command;if(!e)return process.stdout.write(`${await N()}\n`),w(0);let t=await ut(e);return t?(process.stdout.write(t),w(0)):(await Z(new n(`INVALID_ARGS`,Kn(e))),process.stdout.write(`${await N()}\n`),w(1))}return i.command?{parsed:i,command:i.command,positionals:i.positionals}:(process.stdout.write(`${await N()}\n`),w(1))}async function Pn(e,n){let i=new Set(e.providedFlags.map(e=>e.key));try{let t=Ot({policyOverrides:e.flags,configuredPlatform:e.flags.platform,configuredSession:e.flags.session}),r=t.lockPolicy?{...e.flags}:Dt(e.flags,{policyOverrides:e.flags,configuredPlatform:e.flags.platform,configuredSession:e.flags.session}),a=ye(r.stateDir),o=r.session??`default`,s=Zn({command:n.command,explicitFlagKeys:i,stateDir:a.baseDir,session:o,remoteConfig:r.remoteConfig,hasResolvedSession:r.session!==void 0}),c=s?nr(r,s.flags,i):r;return{...n,binding:t,flags:r,daemonPaths:a,sessionName:o,connectionDefaults:s,explicitFlagKeys:i,effectiveFlags:c,resolvedRuntime:s?.runtime,connectionMetadata:s?.connection,parsedBatchSteps:void 0}}catch(i){let a=t(i),o=r(a,{diagnosticId:v().diagnosticId,logPath:y({force:!0})?.path});return e.flags.json?await Q({success:!1,error:o}):await Z(o,{showDetails:n.debugOutputEnabled}),w(1)}}async function Fn(e,t){let{runReactDevtoolsCommand:n}=await import(`./react-devtools.js`),{daemonAuthToken:r,...i}=e.effectiveFlags;return await n(e.positionals,{flags:{...i,leaseProvider:e.connectionDefaults?.connection?.leaseProvider},stateDir:e.daemonPaths.baseDir,session:e.effectiveFlags.session??e.sessionName,cwd:process.cwd(),env:process.env,configureDirectPortReverse:async()=>{let n=await Dn({route:`react-devtools`,command:p.runtime,request:{positionals:[`port-reverse`],flags:{...i,leaseProvider:e.connectionDefaults?.connection?.leaseProvider,devicePort:8097,hostPort:8097,portReverseName:`react-devtools`},session:e.effectiveFlags.session??e.sessionName},transport:t.sendToDaemon,transportOptions:{authToken:r}});n.ok||o(n.error)}})}async function In(e,t){if(e.command===`batch`){if(e.positionals.length>0)throw new n(`INVALID_ARGS`,`batch does not accept positional arguments.`);e.parsedBatchSteps=Yn(e.flags)}if($n(e.command)&&(e.effectiveFlags=(await sn({command:e.command,flags:e.effectiveFlags,stateDir:e.daemonPaths.baseDir,env:process.env})).flags),e.effectiveFlags.remoteConfig&&Qn(e.command)){let n=le(Ln(e),{transport:ar(t.sendToDaemon)}),{materializeRemoteConnectionForCommand:r}=await import(`./connection-runtime.js`),i=await r({command:e.command,flags:e.effectiveFlags,client:n,runtime:e.resolvedRuntime,positionals:e.positionals,batchSteps:e.parsedBatchSteps,forceRuntimePrepare:rr(e.explicitFlagKeys)});e.effectiveFlags=i.flags,e.resolvedRuntime=i.runtime,e.connectionMetadata=i.connection}er({command:e.command,flags:e.effectiveFlags,runtime:e.resolvedRuntime,explicitFlagKeys:e.explicitFlagKeys,hadConnectionDefaults:!!e.connectionDefaults})&&process.stderr.write(`Warning: open is using explicit remote daemon or tenant flags without saved Metro runtime hints. React Native apps may launch without bundle/runtime hints; prefer connect --remote-config <path> first or pass --remote-config <path> on this command.
|
|
2
|
+
`)}function Ln(e){let t=e.effectiveFlags,n=e.connectionMetadata;return{session:t.session,requestId:e.requestId,stateDir:t.stateDir,daemonBaseUrl:t.daemonBaseUrl,daemonAuthToken:t.daemonAuthToken,daemonTransport:t.daemonTransport,daemonServerMode:t.daemonServerMode,tenant:t.tenant,sessionIsolation:t.sessionIsolation,runId:t.runId,leaseId:t.leaseId,leaseBackend:t.leaseBackend,leaseProvider:n?.leaseProvider,clientId:n?.clientId,deviceKey:n?.deviceKey,providerApp:t.providerApp,providerOsVersion:t.providerOsVersion,providerDeviceType:t.providerDeviceType,providerProject:t.providerProject,providerBuild:t.providerBuild,providerSessionName:t.providerSessionName,providerDeviceOrientation:t.providerDeviceOrientation,providerGeoLocation:t.providerGeoLocation,providerTimezone:t.providerTimezone,providerAppiumVersion:t.providerAppiumVersion,providerLanguage:t.providerLanguage,providerLocale:t.providerLocale,providerNetworkProfile:t.providerNetworkProfile,providerCustomNetwork:t.providerCustomNetwork,providerNoResignApp:t.providerNoResignApp,awsProjectArn:t.awsProjectArn,awsDeviceArn:t.awsDeviceArn,awsAppArn:t.awsAppArn,awsRegion:t.awsRegion,awsInteractionMode:t.awsInteractionMode,runtime:e.resolvedRuntime,lockPolicy:e.binding.lockPolicy,lockPlatform:e.binding.defaultPlatform,cwd:process.cwd(),debug:e.debugOutputEnabled,cost:t.cost,responseLevel:t.responseLevel}}function Rn(e){let t=e.effectiveFlags.daemonBaseUrl;return e.debugOutputEnabled&&!e.effectiveFlags.json&&!t?cr(e.daemonPaths.logPath):null}async function zn(e){if(e.command!==`test`)return;let{createReplayTestReporterRuntime:t}=await import(`./reporting.js`);return t({debug:e.debugOutputEnabled,verbose:e.effectiveFlags.verbose,json:e.effectiveFlags.json,reporter:e.effectiveFlags.reporter,reportJunit:e.effectiveFlags.reportJunit})}async function Bn(e,t,r,i){let{command:a,positionals:o,effectiveFlags:s}=e;if(a===`batch`){if(!e.parsedBatchSteps)throw new n(`INVALID_ARGS`,`batch requires --steps or --steps-file.`);let c=e.parsedBatchSteps.map((t,n)=>({...t,input:e.binding.lockPolicy&&e.flags.platform===void 0?{...t.input}:Dt(t.input,{policyOverrides:s,configuredPlatform:s.platform,configuredSession:s.session,inheritedPlatform:s.platform})}));if(await ht({command:a,positionals:o,flags:{...s,batchSteps:c},client:t,debug:e.debugOutputEnabled,replayTestReporterRuntime:r,commandProgress:i}))return}else if(a===`runtime`)throw new n(`INVALID_ARGS`,`runtime command was removed. Use connect --remote-config <path> for remote runs, or metro prepare --remote-config <path> for inspection.`);else if(await ht({command:a,positionals:o,flags:s,client:t,debug:e.debugOutputEnabled,replayTestReporterRuntime:r,commandProgress:i}))return;throw new n(`INVALID_ARGS`,qn(a))}async function Vn(e,n,i){let a=t(e),o=r(a,{diagnosticId:v().diagnosticId,logPath:y({force:!0})?.path});if(n.command===`close`&&Xn(a)){n.effectiveFlags.json&&await Q({success:!0,data:{closed:`session`,source:`no-daemon`}});return}n.effectiveFlags.json?await Q({success:!1,error:o}):(await Z(o,{showDetails:n.debugOutputEnabled}),n.debugOutputEnabled&&Un(n,o)),i&&i(),await w(1)}const Hn=64e3;function Un(e,t){if(!e.effectiveFlags.daemonBaseUrl){Wn(`daemon log`,e.daemonPaths.logPath);return}let n=t.diagnosticsRecord;n&&Wn(`remote diagnostics`,ve(e.daemonPaths.baseDir,n))}function Wn(e,t){try{if(E.existsSync(t)){let n=E.readFileSync(t,`utf8`).split(`
|
|
4
3
|
`),r=n.slice(Math.max(0,n.length-200)).join(`
|
|
5
|
-
`);r.length>
|
|
4
|
+
`);r.length>Hn&&(r=r.slice(r.length-Hn)),r.trim().length>0&&process.stderr.write(`\n[${e}]\n${r}\n`)}}catch{}}function Gn(e){try{let t=A(e);return Jn(t.command??``,t.providedFlags)}catch{return e.includes(`--debug`)||e.includes(`-v`)||e.includes(`--verbose`)}}function Kn(e){let t=Re(e);return t?`Unknown command: ${e}. Did you mean ${t}?`:`Unknown command: ${e}`}function qn(e){return f(e)?(b({level:`error`,phase:`cli_known_command_unhandled`,data:{command:e}}),`Command is registered but no CLI handler accepted it: ${e}`):`Unknown command: ${e}`}function Jn(e,t){return t.some(t=>t.key===`verbose`&&(t.token===`--debug`||t.token===`-v`||e!==`test`))}function Yn(e){let t=``;if(e.steps)t=e.steps;else if(e.stepsFile)try{t=E.readFileSync(e.stepsFile,`utf8`)}catch(t){let r=t instanceof Error?t.message:String(t);throw new n(`INVALID_ARGS`,`Failed to read --steps-file ${e.stepsFile}: ${r}`)}return Tt(t)}function Xn(e){return e.code===`COMMAND_FAILED`?e.details?.kind===`daemon_startup_failed`?!0:e.message.toLowerCase().includes(`failed to start daemon`)?typeof e.details?.infoPath==`string`||typeof e.details?.lockPath==`string`:!1:!1}function Zn(e){return e.command===`connect`||e.command===`connection`||e.command===`daemon`||e.command===`plugins`||e.command===`proxy`?null:Ht({stateDir:e.stateDir,session:e.session,remoteConfig:e.remoteConfig,cwd:process.cwd(),env:process.env,allowActiveFallback:!e.explicitFlagKeys.has(`session`)&&(!e.remoteConfig||e.command===`disconnect`||!e.hasResolvedSession),validateRemoteConfigHash:e.command!==`disconnect`})}function Qn(e){return!jn.has(e)}function $n(e){return e!==`auth`&&e!==`connection`&&e!==`daemon`&&e!==`plugins`&&e!==`device`&&e!==`proxy`}function er(e){return e.command!==`open`||e.runtime||e.flags.bundleUrl||e.flags.metroHost||e.flags.metroPort||e.flags.remoteConfig||e.hadConnectionDefaults?!1:tr(e.explicitFlagKeys)}function tr(e){return e.has(`daemonBaseUrl`)||e.has(`daemonTransport`)||e.has(`tenant`)||e.has(`sessionIsolation`)||e.has(`runId`)||e.has(`leaseId`)||e.has(`leaseBackend`)}function nr(e,t,n){let r={...e};for(let[e,i]of Object.entries(t))i!==void 0&&(n.has(e)||(r[e]=i));return r}function rr(e){for(let t of An)if(e.has(t))return!0;return!1}function ir(e){let{command:t,flags:n,replayTestReporterRuntime:r,transport:i}=e;if(n.json)return ar(i);let a=t===`test`&&r?r.onProgress:ft(e.commandProgress);return async(e,n)=>{let r={...n,onProgress:a};return await or(i,{...e,meta:{...e.meta,requestProgress:t===`test`?`replay-test`:`command`}},r)}}function ar(e){return async(t,n)=>await or(e,t,n)}async function or(e,t,n){return await e(t,n)}function sr(e){for(let t=0;t<e.length;t+=1){let n=e[t];if(n.startsWith(`--session=`)){let e=n.slice(10).trim();return e.length>0?e:null}if(n===`--session`){let n=e[t+1]?.trim();return n&&!n.startsWith(`-`)?n:null}}return null}Ae(process.argv[1]??``).href===import.meta.url&&$(process.argv.slice(2)).catch(async e=>{let n=t(e);await Z(r(n),{showDetails:!0}),await w(1)});function cr(e){try{let t=E.existsSync(e)?E.statSync(e).size:0,n=!1,r=setInterval(()=>{if(!n&&E.existsSync(e))try{let n=E.statSync(e);if(n.size<t&&(t=0),n.size<=t)return;let r=E.openSync(e,`r`);try{let e=Buffer.alloc(n.size-t);E.readSync(r,e,0,e.length,t),t=n.size,e.length>0&&process.stdout.write(e.toString(`utf8`))}finally{E.closeSync(r)}}catch{}},200);return()=>{n=!0,clearInterval(r)}}catch{return null}}export{yt as S,Gt as _,pn as a,Bt as b,Vt as c,qt as d,B as f,R as g,U as h,ln as i,Ut as l,L as m,W as n,an as o,Wt as p,fn as r,$ as runCli,Rt as s,On as t,zt as u,z as v,I as x,Lt as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{D as e,N as t,k as n,y as r}from"./file.js";import{d as i}from"./exec.js";import"./command.js";import"./process.js";import{a,c as o,d as s,f as c,i as l,l as u,m as d,o as f,p,r as m,s as h,t as g,u as _}from"./base-url.js";import{createHash as v}from"node:crypto";import y from"node:fs";import b from"node:path";import{fileURLToPath as x}from"node:url";const S=`companion-tunnel`;function C(e){return v(`sha256`).update(e).digest(`hex`)}function w(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function T(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.tenantId==`string`&&typeof t.runId==`string`&&typeof t.leaseId==`string`)return{tenantId:t.tenantId,runId:t.runId,leaseId:t.leaseId}}function E(e,t){return e.tenantId===t.tenantId&&e.runId===t.runId&&e.leaseId===t.leaseId}function D(e,t,n,r){let i=r??b.join(e,`.agent-device`);if(!n)return{statePath:b.join(i,`${t.slug}.json`),logPath:b.join(i,`${t.slug}.log`)};let a=C(n).slice(0,12),o=b.join(i,t.slug);return{statePath:b.join(o,`${t.slug}-${a}.json`),logPath:b.join(o,`${t.slug}-${a}.log`)}}function O(e){try{let t=JSON.parse(y.readFileSync(e,`utf8`));if(!Number.isInteger(t.pid)||Number(t.pid)<=0||typeof t.serverBaseUrl!=`string`||typeof t.localBaseUrl!=`string`||typeof t.tokenHash!=`string`||t.tokenHash.length===0)return null;let n=Array.isArray(t.consumers)?t.consumers.filter(e=>typeof e==`string`&&e.length>0):[];return{pid:Number(t.pid),startTime:typeof t.startTime==`string`?t.startTime:void 0,command:typeof t.command==`string`?t.command:void 0,serverBaseUrl:t.serverBaseUrl,localBaseUrl:t.localBaseUrl,launchUrl:w(t.launchUrl),registerPath:w(t.registerPath),unregisterPath:w(t.unregisterPath),devicePort:Number.isInteger(t.devicePort)?Number(t.devicePort):void 0,session:w(t.session),bridgeScope:T(t.bridgeScope),tokenHash:t.tokenHash,consumers:n}}catch{return null}}function k(e,t){y.mkdirSync(b.dirname(e),{recursive:!0}),y.writeFileSync(e,`${JSON.stringify(t,null,2)}\n`,`utf8`)}function A(e){y.mkdirSync(b.dirname(e),{recursive:!0}),y.closeSync(y.openSync(e,`a`))}function j(e){try{y.unlinkSync(e)}catch{}}function M(e){try{y.readdirSync(e).length===0&&y.rmdirSync(e)}catch{}}function N(e,t){let n=b.dirname(e.statePath),r=b.dirname(e.logPath);j(e.statePath),j(e.logPath),M(n),r!==n&&M(r),b.basename(n)===t.slug&&M(b.dirname(n))}function P(e,t){return e.includes(t.runArg)}function F(t,i){if(!r(t.pid))return!1;if(t.startTime){let e=n(t.pid);if(!e||e!==t.startTime)return!1}let a=e(t.pid);return!a||!P(a,i.definition)||!t.bridgeScope?!1:t.serverBaseUrl===g(i.serverBaseUrl)&&t.localBaseUrl===g(i.localBaseUrl)&&t.launchUrl===w(i.launchUrl)&&t.registerPath===w(i.registerPath)&&t.unregisterPath===w(i.unregisterPath)&&t.devicePort===i.devicePort&&t.session===w(i.session)&&E(t.bridgeScope,i.bridgeScope)&&t.tokenHash===C(i.bearerToken)}function I(e){return w(e.consumerKey)??w(e.profileKey)??null}function L(e,t){return!t||e.consumers.includes(t)?e:{...e,consumers:[...e.consumers,t]}}function R(e,t){return t?{...e,consumers:e.consumers.filter(e=>e!==t)}:{...e,consumers:[]}}async function z(n,i){if(!r(n.pid))return;let a=e(n.pid);if(!(!a||!P(a,i))){try{process.kill(n.pid,`SIGTERM`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}if(!await t(n.pid,1e3)){try{process.kill(n.pid,`SIGKILL`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}await t(n.pid,1e3)}}}function B(e,t,n){n===void 0?delete e[t]:e[t]=n}function V(e,t){let n={...t};return n[s]=g(e.serverBaseUrl),n[m]=e.bearerToken,n[f]=g(e.localBaseUrl),n[p]=D(e.projectRoot,e.definition,e.profileKey,e.stateDir).statePath,n[_]=e.bridgeScope.tenantId,n[u]=e.bridgeScope.runId,n[o]=e.bridgeScope.leaseId,B(n,a,w(e.launchUrl)),B(n,h,w(e.registerPath)),B(n,d,w(e.unregisterPath)),B(n,l,e.devicePort===void 0?void 0:String(e.devicePort)),B(n,c,w(e.session)),n}function H(e){let t=x(import.meta.url),n=b.extname(t)||`.js`,r=[b.join(b.dirname(t),`${S}${n}`),b.join(b.dirname(t),`internal`,`${S}${n}`)].find(e=>y.existsSync(e));if(!r)throw Error(`${e.displayName} entrypoint not found. Rebuild the package to include the companion worker entry.`);return r}function U(t,r){let a=H(t.definition),o=a.endsWith(`.ts`)?[`--experimental-strip-types`]:[];y.mkdirSync(b.dirname(r),{recursive:!0});let s=y.openSync(r,`a`),c=0;try{c=i(process.execPath,[...o,a,t.definition.runArg],{env:V(t,t.env??process.env),stdio:[`ignore`,s,s]})}finally{y.closeSync(s)}if(!Number.isInteger(c)||c<=0)throw Error(`Failed to start ${t.definition.displayName} process.`);return{pid:c,startTime:n(c)??void 0,command:e(c)??void 0,serverBaseUrl:g(t.serverBaseUrl),localBaseUrl:g(t.localBaseUrl),launchUrl:w(t.launchUrl),registerPath:w(t.registerPath),unregisterPath:w(t.unregisterPath),devicePort:t.devicePort,session:w(t.session),bridgeScope:t.bridgeScope,tokenHash:C(t.bearerToken),consumers:[]}}async function W(e){let t=I(e),n=D(e.projectRoot,e.definition,e.profileKey,e.stateDir),r=O(n.statePath);if(r&&F(r,e)){let e=L(r,t);return e!==r&&k(n.statePath,e),{pid:r.pid,spawned:!1,statePath:n.statePath,logPath:n.logPath}}r&&(await z(r,e.definition),N(n,e.definition)),A(n.statePath);let i;try{i=U(e,n.logPath),k(n.statePath,L(i,t))}catch(t){throw i&&await z(i,e.definition).catch(()=>{}),N(n,e.definition),t}return{pid:i.pid,spawned:!0,statePath:n.statePath,logPath:n.logPath}}async function G(e){let t=I(e),n=D(e.projectRoot,e.definition,e.profileKey,e.stateDir),r=O(n.statePath);if(!r)return N(n,e.definition),{stopped:!1,statePath:n.statePath};let i=R(r,t);return i.consumers.length>0?(k(n.statePath,i),{stopped:!1,statePath:n.statePath}):(await z(r,e.definition),N(n,e.definition),{stopped:!0,statePath:n.statePath})}export{G as n,W as t};
|
package/dist/src/client-metro.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{F as e,P as t}from"./sdk-contracts.js";import{O as n}from"./owner-identity.js";import{n as r}from"./path-resolution.js";import{d as i,m as a}from"./exec.js";import{t as o}from"./timeouts.js";import"./file.js";import"./command.js";import"./process.js";import"./retry.js";import{t as s}from"./base-url.js";import{t as c}from"./client-metro-companion.js";import{n as l,r as u}from"./project-runtime.js";import{t as d}from"./runtime-transport-hints.js";import f from"node:fs";import p from"node:path";function m(e,t,n=`index.bundle`){let r=new URL(`${s(e)}/${n}`);return r.searchParams.set(`platform`,t),r.searchParams.set(`dev`,`true`),r.searchParams.set(`minify`,`false`),r.toString()}const h=8081,g=`.expo/.virtual-metro-entry.bundle`;function _(e,n){if(e==null||e===``)return n;let r=Number.parseInt(String(e),10);if(!Number.isInteger(r)||r<1||r>65535)throw new t(`INVALID_ARGS`,`Invalid Metro port: ${String(e)}. Use 1-65535.`);return r}function v(e){let n=S(e.bundleUrl),r=n??e.runtime?.bundleUrl,i=!!n,a=!!S(r),o=d({metroHost:y(e,i,a),metroPort:b(e,i,a),bundleUrl:r});if(!o)throw new t(`INVALID_ARGS`,`Unable to resolve Metro host and port for reload.`);let s=ee(r);return{reloadUrl:x(o,o.scheme,`${s}/reload`),messageSocketUrl:x(o,o.scheme===`https`?`wss`:`ws`,`${s}/message`)}}function y(e,t,n){return S(e.metroHost)??(t?void 0:S(e.runtime?.metroHost))??(n?void 0:`localhost`)}function b(e,t,n){if(e.metroPort!==void 0)return _(e.metroPort,h);if(!t)return e.runtime?.metroPort??(n?void 0:h)}function ee(e){let t=S(e);if(!t)return``;let n;try{n=new URL(t)}catch{return``}let r=n.pathname.replace(/\/+$/,``),i=`/${g}`;if(r.endsWith(i))return r.slice(0,-i.length);let a=r.lastIndexOf(`/`);return(a>=0?r.slice(a+1):r).endsWith(`.bundle`)&&a>0?r.slice(0,a):``}function x(e,t,n){let r=new URL(`${t}://localhost`);return r.hostname=e.host,r.port=String(e.port),r.pathname=n,r.toString()}function S(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function C(e){return typeof e==`string`&&e.trim()?s(e.trim()):``}function w(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function T(e,t,n){return r(e,{env:t,cwd:n})}function E(e){try{return f.accessSync(e,f.constants.F_OK),!0}catch{return!1}}function D(e){try{return f.statSync(e).isDirectory()}catch{return!1}}function O(e){let n=p.join(e,`package.json`),r=u(e);if(!r)throw new t(`INVALID_ARGS`,`package.json not found at ${n}`);return r}const k=[{file:`pnpm-lock.yaml`,command:`pnpm`},{file:`yarn.lock`,command:`yarn`},{file:`bun.lock`,command:`bun`},{file:`bun.lockb`,command:`bun`},{file:`package-lock.json`,command:`npm`}];function te(e){let t=e;for(;;){for(let{file:e,command:n}of k)if(E(p.join(t,e)))return{command:n,installArgs:[`install`]};if(E(p.join(t,`.git`)))return null;let e=p.dirname(t);if(e===t)return null;t=e}}function A(e){return te(e)??{command:`npm`,installArgs:[`install`]}}function j(e,t){if(t!==`auto`)return t;let n=l(e);return n===`expo`||n===`repack`?n:`react-native`}function M(e,t){return typeof{...e.dependencies??{},...e.devDependencies??{}}[t]==`string`}function N(e,t){return[`js`,`mjs`,`cjs`,`ts`,`mts`,`cts`].some(n=>E(p.join(e,`${t}.config.${n}`)))}function P(e,t){return N(e,`rspack`)?`rspack`:N(e,`webpack`)?`webpack`:M(t,`@rspack/core`)?`rspack`:M(t,`webpack`)?`webpack`:`rspack`}function F(e,t,n){if(e==null||e===``)return t;let r=Number.parseInt(String(e),10);return Number.isInteger(r)?Math.max(r,n):t}function ne(e){return e===`expo`?g:`index.bundle`}function I(e,t,n){return{platform:t,bundleUrl:m(e,t,ne(n))}}function L(e,t){return{platform:t,metroHost:w(e?.metro_host),metroPort:e?.metro_port,bundleUrl:w(e?.metro_bundle_url),launchUrl:w(e?.launch_url)}}function R(e,t){if(D(p.join(e,`node_modules`)))return{installed:!1};let n=A(e);try{a(n.command,n.installArgs,{cwd:e,env:t})}catch(e){throw z(e,n)}return{installed:!0,packageManager:n.command}}function z(n,r){let i=e(n),a=`Dependency install failed using detected package manager "${r.command}". If dependencies are already installed (for example via a monorepo root install), pass --no-install-deps to skip this step, or install manually with "${r.command} ${r.installArgs.join(` `)}" from the project root.`;return new t(i.code,i.message,{...i.details??{},hint:a,packageManager:r.command},i)}async function B(e){await o(e)}async function V(e,n,r={}){try{let t=await fetch(e,{headers:r,signal:AbortSignal.timeout(n)});return{ok:t.ok,status:t.status,body:await t.text()}}catch(r){throw r instanceof Error&&r.name===`TimeoutError`?new t(`COMMAND_FAILED`,`Timed out fetching ${e} after ${n}ms`):r}}async function H(e,t){try{let n=await V(e,t);return n.ok&&n.body.includes(`packager-status:running`)}catch{return!1}}function U(e,t,n,r){return e===`expo`?{command:`npx`,installArgs:[`expo`,`start`,`--host`,`lan`,`--port`,String(n)]}:e===`repack`?{command:`npx`,installArgs:[`react-native`,t===`webpack`?`webpack-start`:`rspack-start`,`--host`,r,`--port`,String(n)]}:{command:`npx`,installArgs:[`react-native`,`start`,`--host`,r,`--port`,String(n)]}}function W(e,n,r,a,o,s,c){let l=U(n,r,a,o);f.mkdirSync(p.dirname(s),{recursive:!0});let u=f.openSync(s,`a`),d=0;try{d=i(l.command,l.installArgs,{cwd:e,env:c,stdio:[`ignore`,u,u]})}finally{f.closeSync(u)}if(!Number.isInteger(d)||d<=0)throw new t(`COMMAND_FAILED`,`Failed to start React Native dev server. Expected a detached child PID.`);return{pid:d}}async function G(e){if(!(!Number.isInteger(e)||e<=0)){try{process.kill(e,`SIGTERM`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}if(!await n(e,1e3)){try{process.kill(e,`SIGKILL`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}await n(e,1e3)}}}function K(e,t){return{Authorization:`Bearer ${t}`,"Content-Type":`application/json`,...e.includes(`ngrok`)?{"ngrok-skip-browser-warning":`1`}:{}}}function q(e,n){let r=new t(`COMMAND_FAILED`,e);return r.retryable=n,r}function J(e,t){return!!(e>=500||e===408||e===425||e===429||JSON.stringify(t).includes(`Metro companion is not connected`))}function Y(e){return!!(e&&typeof e==`object`&&`retryable`in e&&e.retryable===!0)}async function X(e){let t;try{t=await fetch(`${e.baseUrl}/api/metro/bridge`,{method:`POST`,headers:K(e.baseUrl,e.bearerToken),body:JSON.stringify({...e.scope,...e.runtime?{ios_runtime:e.runtime}:{},timeout_ms:e.timeoutMs}),signal:AbortSignal.timeout(e.timeoutMs)})}catch(t){throw t instanceof Error&&t.name===`TimeoutError`?q(`/api/metro/bridge timed out after ${e.timeoutMs}ms calling ${e.baseUrl}/api/metro/bridge`,!0):q(t instanceof Error?t.message:String(t),!0)}let n=Z(await t.text(),t.status,e.baseUrl);if(!t.ok)throw q(`/api/metro/bridge failed (${t.status}): ${JSON.stringify(n)}`,J(t.status,n));return ie(n)}function Z(e,t,n){if(!e)return{};try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`Expected a JSON object`);return t}catch(r){let i=e.slice(0,200);throw q(`/api/metro/bridge returned invalid JSON (${t}) from ${n}: ${r instanceof Error?r.message:String(r)}. body=${JSON.stringify(i)}`,J(t,e))}}function re(e){return{enabled:e.enabled,baseUrl:e.base_url,statusUrl:e.status_url??``,bundleUrl:e.bundle_url??``,iosRuntime:L(e.ios_runtime,`ios`),androidRuntime:L(e.android_runtime,`android`),upstream:{bundleUrl:e.upstream.bundle_url??``,host:e.upstream.host??``,port:e.upstream.port??0,statusUrl:e.upstream.status_url??``},probe:{reachable:e.probe.reachable,statusCode:e.probe.status_code,latencyMs:e.probe.latency_ms,detail:e.probe.detail}}}function ie(e){let t=e.data??e;if(!t||typeof t!=`object`||Array.isArray(t))throw q(`/api/metro/bridge returned malformed descriptor: Expected a JSON object.`,!1);try{return re(t)}catch(e){throw q(`/api/metro/bridge returned malformed descriptor: ${e instanceof Error?e.message:String(e)}`,!1)}}function Q(e,t,n,r,i){let a=[`Metro bridge is required for this run but could not be configured via ${e}/api/metro/bridge.`];return t&&a.push(`bridgeError=${t}`),n?.probe.reachable===!1&&a.push(`bridgeProbe=${n.probe.detail||`unreachable (status ${n.probe.statusCode||0})`}`),r&&r!==t&&a.push(`initialBridgeError=${r}`),i&&a.push(`metroCompanionLog=${i}`),a.join(` `)}function ae(e,n){if(!n?.iosRuntime.bundleUrl)throw new t(`COMMAND_FAILED`,Q(e,`bridge descriptor is missing ios_runtime.metro_bundle_url`,n))}function oe(e,n,r){let i=n||w(r.AGENT_DEVICE_METRO_BEARER_TOKEN)||``,a=i||e&&w(r.AGENT_DEVICE_DAEMON_AUTH_TOKEN)||``;if(e&&!a)throw new t(`INVALID_ARGS`,`metro prepare requires proxy auth when --proxy-base-url is provided. Pass --bearer-token or set AGENT_DEVICE_METRO_BEARER_TOKEN or AGENT_DEVICE_DAEMON_AUTH_TOKEN.`);if(!e&&i)throw new t(`INVALID_ARGS`,`metro prepare requires --proxy-base-url when proxy auth is provided.`);return{proxyEnabled:!!(e&&a),proxyBaseUrl:e,proxyBearerToken:a}}function se(e){if(!e?.tenantId||!e.runId||!e.leaseId)throw new t(`INVALID_ARGS`,`metro prepare with proxy requires tenantId, runId, and leaseId bridge scope.`);return e}function ce(e,n){if(!(e||n))throw new t(`INVALID_ARGS`,`metro prepare requires --public-base-url <url> or --proxy-base-url <url>.`)}function le(e,t,n){return e.runtimeFilePath?T(e.runtimeFilePath,t,n):null}function ue(e,t,n,r){return T(e.logPath??p.join(r,`.agent-device`,`metro.log`),t,n)}function $(e){let t=e.env??process.env,n=process.cwd(),r=T(e.projectRoot??n,t,n),i=e.kind??`auto`,a=null,o;i===`auto`?(a=O(r),o=j(a,i)):o=i;let s=null;o===`repack`&&(a??=O(r),s=P(r,a));let c=C(e.publicBaseUrl),l=C(e.proxyBaseUrl);ce(c,l);let{proxyEnabled:u,proxyBaseUrl:d,proxyBearerToken:f}=oe(l,w(e.proxyBearerToken)??``,t);return{env:t,projectRoot:r,kind:o,repackBundler:s,metroPort:_(e.metroPort??8081,8081),listenHost:w(e.listenHost)??`0.0.0.0`,statusHost:w(e.statusHost)??`127.0.0.1`,publicBaseUrl:c,proxyBaseUrl:d,proxyBearerToken:f,bridgeScope:u?se(e.bridgeScope):null,startupTimeoutMs:F(e.startupTimeoutMs,18e4,3e4),probeTimeoutMs:F(e.probeTimeoutMs,1e4,1e3),reuseExisting:e.reuseExisting??!0,installProjectDeps:e.installDependenciesIfNeeded??!0,runtimeFilePath:le(e,t,n),logPath:ue(e,t,n,r)}}async function de(e,t,n){let r=Date.now()+t;for(;Date.now()<r;){let t=r-Date.now();if(await H(e,Math.min(n,Math.max(t,1))))return!0;let i=Math.min(500,Math.max(r-Date.now(),0));i>0&&await B(i)}return!1}async function fe(e){let n=Date.now()+e.startupTimeoutMs,r=null,i=null;for(;Date.now()<n;){try{let t=await X({baseUrl:e.baseUrl,bearerToken:e.bearerToken,scope:e.scope,runtime:e.runtime,timeoutMs:e.probeTimeoutMs});if(t.probe.reachable!==!1)return t;r=t,i=null}catch(n){if(i=n instanceof Error?n.message:String(n),!Y(n))throw new t(`COMMAND_FAILED`,Q(e.baseUrl,i,r,e.initialBridgeError,e.companionLogPath),void 0,n)}let a=Math.min(1e3,Math.max(n-Date.now(),0));a>0&&await B(a)}throw new t(`COMMAND_FAILED`,Q(e.baseUrl,i,r,e.initialBridgeError,e.companionLogPath))}async function pe(e){let n=`http://${e.statusHost}:${e.metroPort}/status`;if(e.reuseExisting&&await H(n,e.probeTimeoutMs))return{started:!1,reused:!0,pid:0,statusUrl:n};let r=W(e.projectRoot,e.kind,e.repackBundler,e.metroPort,e.listenHost,e.logPath,e.env);if(await de(n,e.startupTimeoutMs,e.probeTimeoutMs))return{started:!0,reused:!1,pid:r.pid,statusUrl:n};throw await G(r.pid).catch(()=>{}),new t(`COMMAND_FAILED`,`React Native dev server did not become ready at ${n} within ${e.startupTimeoutMs}ms. Check ${e.logPath}.`,{logPath:e.logPath})}async function me(e,t){let n=t.bridgeScope;if(!n)return null;let r=null,i=null;try{r=await X({baseUrl:t.proxyBaseUrl,bearerToken:t.proxyBearerToken,scope:n,timeoutMs:t.probeTimeoutMs})}catch(e){if(!Y(e))throw e;i=e instanceof Error?e.message:String(e)}return(!r||r.probe.reachable===!1)&&(r=await he(e,t,n,r,i)),ae(t.proxyBaseUrl,r),r}async function he(e,n,r,i,a){let o;try{o=(await c({projectRoot:n.projectRoot,serverBaseUrl:n.proxyBaseUrl,bearerToken:n.proxyBearerToken,bridgeScope:r,localBaseUrl:`http://${n.statusHost}:${n.metroPort}`,launchUrl:w(e.launchUrl),profileKey:w(e.companionProfileKey),consumerKey:w(e.companionConsumerKey),env:n.env})).logPath}catch(e){throw new t(`COMMAND_FAILED`,Q(n.proxyBaseUrl,e instanceof Error?e.message:String(e),i,a),void 0,e)}try{return await fe({baseUrl:n.proxyBaseUrl,bearerToken:n.proxyBearerToken,scope:r,probeTimeoutMs:n.probeTimeoutMs,startupTimeoutMs:n.startupTimeoutMs,initialBridgeError:a,companionLogPath:o})}catch(e){throw e instanceof Error?e:Error(String(e))}}function ge(e,t){return{baseIosRuntime:e?I(e,`ios`,t):{platform:`ios`},baseAndroidRuntime:e?I(e,`android`,t):{platform:`android`}}}function _e(e,t){e&&(f.mkdirSync(p.dirname(e),{recursive:!0}),f.writeFileSync(e,JSON.stringify(t,null,2)))}async function ve(e={}){let t=$(e),n=t.installProjectDeps?R(t.projectRoot,t.env):{installed:!1},r=await pe(t),{baseIosRuntime:i,baseAndroidRuntime:a}=ge(t.publicBaseUrl,t.kind),o=await me(e,t),s=o?.iosRuntime??i,c=o?.androidRuntime??a,l={projectRoot:t.projectRoot,kind:t.kind,dependenciesInstalled:n.installed,packageManager:n.packageManager??null,started:r.started,reused:r.reused,pid:r.pid,logPath:t.logPath,statusUrl:r.statusUrl,runtimeFilePath:t.runtimeFilePath,iosRuntime:s,androidRuntime:c,bridge:o};return _e(t.runtimeFilePath,l),l}function ye(e){let t=e.trimStart().slice(0,15).toLowerCase();return t.startsWith(`<!doctype`)||t.startsWith(`<html`)}async function be(e,n){await new Promise((r,i)=>{let a=new WebSocket(e),o=e=>{clearTimeout(s);try{a.close()}catch{}i(new t(`COMMAND_FAILED`,e))},s=setTimeout(()=>{o(`Timed out broadcasting reload to ${e} after ${n}ms`)},n);a.addEventListener(`open`,()=>{a.send(JSON.stringify({version:2,method:`reload`}));let e=()=>{if(a.bufferedAmount===0){clearTimeout(s),a.close(),r();return}setTimeout(e,20)};e()}),a.addEventListener(`error`,()=>{o(`Failed to reach the dev server message socket at ${e}`)})})}async function xe(e={}){let n=F(e.timeoutMs,1e4,1e3),{reloadUrl:r,messageSocketUrl:i}=v(e),a=await V(r,n);if(a.ok&&!ye(a.body))return{reloaded:!0,reloadUrl:r,status:a.status,body:a.body,transport:`http`};try{await be(i,n)}catch(e){throw new t(`COMMAND_FAILED`,`React Native dev server reload failed (${a.status}).`,{reloadUrl:r,status:a.status,body:a.body.slice(0,500),messageSocketUrl:i,hint:`Verify Metro or Re.Pack is running and the target React Native app is connected to this dev server instance.`},e instanceof Error?e:void 0)}return{reloaded:!0,reloadUrl:i,status:a.status,body:``,transport:`message-socket`}}export{xe as n,m as r,ve as t};
|
|
1
|
+
import{I as e,P as t}from"./sdk-contracts.js";import{L as n,N as r}from"./file.js";import{d as i,m as a}from"./exec.js";import{i as o}from"./retry.js";import"./command.js";import"./process.js";import{r as s,t as c}from"./runtime-transport-hints.js";import"./retry2.js";import{h as l,t as u}from"./base-url.js";import{n as d,t as f}from"./client-companion-tunnel.js";import{n as p,r as m}from"./project-runtime.js";import h from"node:fs";import g from"node:path";const _=8081;function v(e,n){if(e==null||e===``)return n;let r=Number.parseInt(String(e),10);if(!Number.isInteger(r)||r<1||r>65535)throw new t(`INVALID_ARGS`,`Invalid Metro port: ${String(e)}. Use 1-65535.`);return r}function y(e){let n=s(e.bundleUrl),r=n??e.runtime?.bundleUrl,i=c({bundleUrl:r,metroHost:s(e.metroHost)??(n?void 0:s(e.runtime?.metroHost))??(r?void 0:`localhost`),metroPort:e.metroPort===void 0?n?void 0:e.runtime?.metroPort??(r?void 0:_):v(e.metroPort,_)});if(!i)throw new t(`INVALID_ARGS`,`Unable to resolve Metro host and port for reload.`);return i}function ee(e){let t=y(e),n=t.pathname.replace(/\/+$/,``),r=new URL(t);r.pathname=`${n}/reload`;let i=new URL(t);return i.protocol=t.protocol===`https:`?`wss:`:`ws:`,i.pathname=`${n}/message`,{reloadUrl:r.toString(),messageSocketUrl:i.toString()}}const b={slug:`metro-companion`,runArg:l,displayName:`Metro companion`};async function te(e){return await f({...e,definition:b,registerPath:e.registerPath??`/api/metro/companion/register`})}async function x(e){return await d({...e,definition:b})}function S(e,t,n=`index.bundle`){let r=new URL(`${u(e)}/${n}`);return r.searchParams.set(`platform`,t),r.searchParams.set(`dev`,`true`),r.searchParams.set(`minify`,`false`),r.toString()}function C(e){return typeof e==`string`&&e.trim()?u(e.trim()):``}function w(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function T(e,t,r){return n(e,{env:t,cwd:r})}function E(e){try{return h.accessSync(e,h.constants.F_OK),!0}catch{return!1}}function D(e){try{return h.statSync(e).isDirectory()}catch{return!1}}function O(e){let n=g.join(e,`package.json`),r=m(e);if(!r)throw new t(`INVALID_ARGS`,`package.json not found at ${n}`);return r}const k=[{file:`pnpm-lock.yaml`,command:`pnpm`},{file:`yarn.lock`,command:`yarn`},{file:`bun.lock`,command:`bun`},{file:`bun.lockb`,command:`bun`},{file:`package-lock.json`,command:`npm`}];function A(e){let t=e;for(;;){for(let{file:e,command:n}of k)if(E(g.join(t,e)))return{command:n,installArgs:[`install`]};if(E(g.join(t,`.git`)))return null;let e=g.dirname(t);if(e===t)return null;t=e}}function j(e){return A(e)??{command:`npm`,installArgs:[`install`]}}function M(e,t){if(t!==`auto`)return t;let n=p(e);return n===`expo`||n===`repack`?n:`react-native`}function N(e,t){return typeof{...e.dependencies??{},...e.devDependencies??{}}[t]==`string`}function P(e,t){return[`js`,`mjs`,`cjs`,`ts`,`mts`,`cts`].some(n=>E(g.join(e,`${t}.config.${n}`)))}function F(e,t){return P(e,`rspack`)?`rspack`:P(e,`webpack`)?`webpack`:N(t,`@rspack/core`)?`rspack`:N(t,`webpack`)?`webpack`:`rspack`}function I(e,t,n){if(e==null||e===``)return t;let r=Number.parseInt(String(e),10);return Number.isInteger(r)?Math.max(r,n):t}function ne(e){return e===`expo`?`.expo/.virtual-metro-entry.bundle`:`index.bundle`}function L(e,t,n){return{platform:t,bundleUrl:S(e,t,ne(n))}}function R(e,t){return{platform:t,metroHost:w(e?.metro_host),metroPort:e?.metro_port,bundleUrl:w(e?.metro_bundle_url),launchUrl:w(e?.launch_url)}}function z(e,t){if(D(g.join(e,`node_modules`)))return{installed:!1};let n=j(e);try{a(n.command,n.installArgs,{cwd:e,env:t})}catch(e){throw B(e,n)}return{installed:!0,packageManager:n.command}}function B(n,r){let i=e(n),a=`Dependency install failed using detected package manager "${r.command}". If dependencies are already installed (for example via a monorepo root install), pass --no-install-deps to skip this step, or install manually with "${r.command} ${r.installArgs.join(` `)}" from the project root.`;return new t(i.code,i.message,{...i.details??{},hint:a,packageManager:r.command},i)}async function V(e){await o(e)}async function H(e,n,r={}){try{let t=await fetch(e,{headers:r,signal:AbortSignal.timeout(n)});return{ok:t.ok,status:t.status,body:await t.text()}}catch(r){throw r instanceof Error&&r.name===`TimeoutError`?new t(`COMMAND_FAILED`,`Timed out fetching ${e} after ${n}ms`):r}}async function U(e,t){try{let n=await H(e,t);return n.ok&&n.body.includes(`packager-status:running`)}catch{return!1}}function W(e,t,n,r){return e===`expo`?{command:`npx`,installArgs:[`expo`,`start`,`--host`,`lan`,`--port`,String(n)]}:e===`repack`?{command:`npx`,installArgs:[`react-native`,t===`webpack`?`webpack-start`:`rspack-start`,`--host`,r,`--port`,String(n)]}:{command:`npx`,installArgs:[`react-native`,`start`,`--host`,r,`--port`,String(n)]}}function G(e,n,r,a,o,s,c){let l=W(n,r,a,o);h.mkdirSync(g.dirname(s),{recursive:!0});let u=h.openSync(s,`a`),d=0;try{d=i(l.command,l.installArgs,{cwd:e,env:c,stdio:[`ignore`,u,u]})}finally{h.closeSync(u)}if(!Number.isInteger(d)||d<=0)throw new t(`COMMAND_FAILED`,`Failed to start React Native dev server. Expected a detached child PID.`);return{pid:d}}async function K(e){if(!(!Number.isInteger(e)||e<=0)){try{process.kill(e,`SIGTERM`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}if(!await r(e,1e3)){try{process.kill(e,`SIGKILL`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}await r(e,1e3)}}}function q(e,t){return{Authorization:`Bearer ${t}`,"Content-Type":`application/json`,...e.includes(`ngrok`)?{"ngrok-skip-browser-warning":`1`}:{}}}function J(e,n){let r=new t(`COMMAND_FAILED`,e);return r.retryable=n,r}function Y(e,t){return!!(e>=500||e===408||e===425||e===429||JSON.stringify(t).includes(`Metro companion is not connected`))}function X(e){return!!(e&&typeof e==`object`&&`retryable`in e&&e.retryable===!0)}async function Z(e){let t;try{t=await fetch(`${e.baseUrl}/api/metro/bridge`,{method:`POST`,headers:q(e.baseUrl,e.bearerToken),body:JSON.stringify({...e.scope,...e.runtime?{ios_runtime:e.runtime}:{},timeout_ms:e.timeoutMs}),signal:AbortSignal.timeout(e.timeoutMs)})}catch(t){throw t instanceof Error&&t.name===`TimeoutError`?J(`/api/metro/bridge timed out after ${e.timeoutMs}ms calling ${e.baseUrl}/api/metro/bridge`,!0):J(t instanceof Error?t.message:String(t),!0)}let n=re(await t.text(),t.status,e.baseUrl);if(!t.ok)throw J(`/api/metro/bridge failed (${t.status}): ${JSON.stringify(n)}`,Y(t.status,n));return ae(n)}function re(e,t,n){if(!e)return{};try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`Expected a JSON object`);return t}catch(r){let i=e.slice(0,200);throw J(`/api/metro/bridge returned invalid JSON (${t}) from ${n}: ${r instanceof Error?r.message:String(r)}. body=${JSON.stringify(i)}`,Y(t,e))}}function ie(e){return{enabled:e.enabled,baseUrl:e.base_url,statusUrl:e.status_url??``,bundleUrl:e.bundle_url??``,iosRuntime:R(e.ios_runtime,`ios`),androidRuntime:R(e.android_runtime,`android`),upstream:{bundleUrl:e.upstream.bundle_url??``,host:e.upstream.host??``,port:e.upstream.port??0,statusUrl:e.upstream.status_url??``},probe:{reachable:e.probe.reachable,statusCode:e.probe.status_code,latencyMs:e.probe.latency_ms,detail:e.probe.detail}}}function ae(e){let t=e.data??e;if(!t||typeof t!=`object`||Array.isArray(t))throw J(`/api/metro/bridge returned malformed descriptor: Expected a JSON object.`,!1);try{return ie(t)}catch(e){throw J(`/api/metro/bridge returned malformed descriptor: ${e instanceof Error?e.message:String(e)}`,!1)}}function Q(e,t,n,r,i){let a=[`Metro bridge is required for this run but could not be configured via ${e}/api/metro/bridge.`];return t&&a.push(`bridgeError=${t}`),n?.probe.reachable===!1&&a.push(`bridgeProbe=${n.probe.detail||`unreachable (status ${n.probe.statusCode||0})`}`),r&&r!==t&&a.push(`initialBridgeError=${r}`),i&&a.push(`metroCompanionLog=${i}`),a.join(` `)}function oe(e,n){if(!n?.iosRuntime.bundleUrl)throw new t(`COMMAND_FAILED`,Q(e,`bridge descriptor is missing ios_runtime.metro_bundle_url`,n))}function se(e,n,r){let i=n||w(r.AGENT_DEVICE_METRO_BEARER_TOKEN)||``,a=i||e&&w(r.AGENT_DEVICE_DAEMON_AUTH_TOKEN)||``;if(e&&!a)throw new t(`INVALID_ARGS`,`metro prepare requires proxy auth when --proxy-base-url is provided. Pass --bearer-token or set AGENT_DEVICE_METRO_BEARER_TOKEN or AGENT_DEVICE_DAEMON_AUTH_TOKEN.`);if(!e&&i)throw new t(`INVALID_ARGS`,`metro prepare requires --proxy-base-url when proxy auth is provided.`);return{proxyEnabled:!!(e&&a),proxyBaseUrl:e,proxyBearerToken:a}}function ce(e){if(!e?.tenantId||!e.runId||!e.leaseId)throw new t(`INVALID_ARGS`,`metro prepare with proxy requires tenantId, runId, and leaseId bridge scope.`);return e}function le(e,n){if(!(e||n))throw new t(`INVALID_ARGS`,`metro prepare requires --public-base-url <url> or --proxy-base-url <url>.`)}function ue(e,t,n){return e.runtimeFilePath?T(e.runtimeFilePath,t,n):null}function de(e,t,n,r){return T(e.logPath??g.join(r,`.agent-device`,`metro.log`),t,n)}function fe(e){let t=e.env??process.env,n=process.cwd(),r=T(e.projectRoot??n,t,n),i=e.kind??`auto`,a=null,o;i===`auto`?(a=O(r),o=M(a,i)):o=i;let s=null;o===`repack`&&(a??=O(r),s=F(r,a));let c=C(e.publicBaseUrl),l=C(e.proxyBaseUrl);le(c,l);let{proxyEnabled:u,proxyBaseUrl:d,proxyBearerToken:f}=se(l,w(e.proxyBearerToken)??``,t);return{env:t,projectRoot:r,kind:o,repackBundler:s,metroPort:v(e.metroPort??8081,8081),listenHost:w(e.listenHost)??`0.0.0.0`,statusHost:w(e.statusHost)??`127.0.0.1`,publicBaseUrl:c,proxyBaseUrl:d,proxyBearerToken:f,bridgeScope:u?ce(e.bridgeScope):null,startupTimeoutMs:I(e.startupTimeoutMs,18e4,3e4),probeTimeoutMs:I(e.probeTimeoutMs,1e4,1e3),reuseExisting:e.reuseExisting??!0,installProjectDeps:e.installDependenciesIfNeeded??!0,runtimeFilePath:ue(e,t,n),logPath:de(e,t,n,r)}}async function pe(e,t,n){let r=Date.now()+t;for(;Date.now()<r;){let t=r-Date.now();if(await U(e,Math.min(n,Math.max(t,1))))return!0;let i=Math.min(500,Math.max(r-Date.now(),0));i>0&&await V(i)}return!1}async function me(e){let n=Date.now()+e.startupTimeoutMs,r=null,i=null;for(;Date.now()<n;){try{let t=await Z({baseUrl:e.baseUrl,bearerToken:e.bearerToken,scope:e.scope,runtime:e.runtime,timeoutMs:e.probeTimeoutMs});if(t.probe.reachable!==!1)return t;r=t,i=null}catch(n){if(i=n instanceof Error?n.message:String(n),!X(n))throw new t(`COMMAND_FAILED`,Q(e.baseUrl,i,r,e.initialBridgeError,e.companionLogPath),void 0,n)}let a=Math.min(1e3,Math.max(n-Date.now(),0));a>0&&await V(a)}throw new t(`COMMAND_FAILED`,Q(e.baseUrl,i,r,e.initialBridgeError,e.companionLogPath))}async function he(e){let n=`http://${e.statusHost}:${e.metroPort}/status`;if(e.reuseExisting&&await U(n,e.probeTimeoutMs))return{started:!1,reused:!0,pid:0,statusUrl:n};let r=G(e.projectRoot,e.kind,e.repackBundler,e.metroPort,e.listenHost,e.logPath,e.env);if(await pe(n,e.startupTimeoutMs,e.probeTimeoutMs))return{started:!0,reused:!1,pid:r.pid,statusUrl:n};throw await K(r.pid).catch(()=>{}),new t(`COMMAND_FAILED`,`React Native dev server did not become ready at ${n} within ${e.startupTimeoutMs}ms. Check ${e.logPath}.`,{logPath:e.logPath})}async function ge(e,t){let n=t.bridgeScope;if(!n)return null;let r=null,i=null;try{r=await Z({baseUrl:t.proxyBaseUrl,bearerToken:t.proxyBearerToken,scope:n,timeoutMs:t.probeTimeoutMs})}catch(e){if(!X(e))throw e;i=e instanceof Error?e.message:String(e)}return(!r||r.probe.reachable===!1)&&(r=await $(e,t,n,r,i)),oe(t.proxyBaseUrl,r),r}async function $(e,n,r,i,a){let o;try{o=(await te({projectRoot:n.projectRoot,serverBaseUrl:n.proxyBaseUrl,bearerToken:n.proxyBearerToken,bridgeScope:r,localBaseUrl:`http://${n.statusHost}:${n.metroPort}`,launchUrl:w(e.launchUrl),profileKey:w(e.companionProfileKey),consumerKey:w(e.companionConsumerKey),env:n.env})).logPath}catch(e){throw new t(`COMMAND_FAILED`,Q(n.proxyBaseUrl,e instanceof Error?e.message:String(e),i,a),void 0,e)}try{return await me({baseUrl:n.proxyBaseUrl,bearerToken:n.proxyBearerToken,scope:r,probeTimeoutMs:n.probeTimeoutMs,startupTimeoutMs:n.startupTimeoutMs,initialBridgeError:a,companionLogPath:o})}catch(e){throw e instanceof Error?e:Error(String(e))}}function _e(e,t){return{baseIosRuntime:e?L(e,`ios`,t):{platform:`ios`},baseAndroidRuntime:e?L(e,`android`,t):{platform:`android`}}}function ve(e,t){e&&(h.mkdirSync(g.dirname(e),{recursive:!0}),h.writeFileSync(e,JSON.stringify(t,null,2)))}async function ye(e={}){let t=fe(e),n=t.installProjectDeps?z(t.projectRoot,t.env):{installed:!1},r=await he(t),{baseIosRuntime:i,baseAndroidRuntime:a}=_e(t.publicBaseUrl,t.kind),o=await ge(e,t),s=o?.iosRuntime??i,c=o?.androidRuntime??a,l={projectRoot:t.projectRoot,kind:t.kind,dependenciesInstalled:n.installed,packageManager:n.packageManager??null,started:r.started,reused:r.reused,pid:r.pid,logPath:t.logPath,statusUrl:r.statusUrl,runtimeFilePath:t.runtimeFilePath,iosRuntime:s,androidRuntime:c,bridge:o};return ve(t.runtimeFilePath,l),l}function be(e){let t=e.trimStart().slice(0,15).toLowerCase();return t.startsWith(`<!doctype`)||t.startsWith(`<html`)}async function xe(e,n){await new Promise((r,i)=>{let a=new WebSocket(e),o=e=>{clearTimeout(s);try{a.close()}catch{}i(new t(`COMMAND_FAILED`,e))},s=setTimeout(()=>{o(`Timed out broadcasting reload to ${e} after ${n}ms`)},n);a.addEventListener(`open`,()=>{a.send(JSON.stringify({version:2,method:`reload`}));let e=()=>{if(a.bufferedAmount===0){clearTimeout(s),a.close(),r();return}setTimeout(e,20)};e()}),a.addEventListener(`error`,()=>{o(`Failed to reach the dev server message socket at ${e}`)})})}async function Se(e={}){let n=I(e.timeoutMs,1e4,1e3),{reloadUrl:r,messageSocketUrl:i}=ee(e),a=await H(r,n);if(a.ok&&!be(a.body))return{reloaded:!0,reloadUrl:r,status:a.status,body:a.body,transport:`http`};try{await xe(i,n)}catch(e){throw new t(`COMMAND_FAILED`,`React Native dev server reload failed (${a.status}).`,{reloadUrl:r,status:a.status,body:a.body.slice(0,500),messageSocketUrl:i,hint:`Verify Metro or Re.Pack is running and the target React Native app is connected to this dev server instance.`},e instanceof Error?e:void 0)}return{reloaded:!0,reloadUrl:i,status:a.status,body:``,transport:`message-socket`}}export{y as a,x as i,Se as n,S as r,ye as t};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { B as
|
|
2
|
-
import {
|
|
3
|
-
import { A as
|
|
1
|
+
import { B as SnapshotUnchanged, D as IosSnapshotObservation, E as AppleApplicationState, F as SnapshotNode, H as SnapshotVisibility, N as SnapshotCommandOptionFields, O as IosTargetActivation, P as SnapshotKeyboardBandFact, R as SnapshotQualityVerdict, S as DeviceTarget, T as PublicPlatform, V as SnapshotViewportSize, X as NormalizedError, _ as SessionIsolationMode, a as DaemonRequest, f as LeaseBackend, g as ResponseLevel, i as DaemonLockPolicy, m as NetworkIncludeMode, o as DaemonResponse, q as DaemonError, r as DaemonInstallSource, s as DaemonResponseData, t as DaemonArtifact, v as SessionRuntimeHints, w as PlatformSelector, x as DeviceKind, y as AppleOS } from "./sdk-contracts.js";
|
|
2
|
+
import { t as AppsFilter } from "./app-inventory.js";
|
|
3
|
+
import { A as SetFoldPoseInput, C as ScrollInputDirection, D as DeviceRotation, E as TransformGestureParams, O as FoldPose, S as ScrollDirection, T as SwipePreset, a as AndroidSnapshotBackendMetadata, b as ScrollCommandResult, c as ScreenshotResultData, d as MACOS_PERMISSION_TARGETS, f as MOBILE_PERMISSION_TARGETS, i as CloudProviderSessionResult, j as BackMode, k as FoldScreenCoordinateSpace, l as SnapshotDiagnosticsSummary, m as PermissionMode, p as PermissionAction, s as FindLocator, t as AgentArtifactsResult, u as SessionSurface, v as TextSizeCategory, w as SwipePattern, y as TvRemoteButton } from "./cloud-artifacts.js";
|
|
4
4
|
import { _ as PressCommandResponseData, f as ClickCommandResponseData, g as LongPressCommandResponseData, h as HoverCommandResponseData, m as FindCommandResponseData, p as FillCommandResponseData, v as SettleObservation, y as ClickButton } from "./sdk-selectors.js";
|
|
5
|
+
import { n as GesturePointerCount } from "./gesture-plan-types.js";
|
|
5
6
|
import { a as RemoteConnectionProfileFields, c as MetroPrepareResult, i as CloudProviderProfileFields, l as MetroReloadOptions, s as MetroPrepareOptions, u as MetroReloadResult } from "./sdk-remote-config.js";
|
|
6
7
|
import { t as BatchRunResult } from "./sdk-batch-runner.js";
|
|
7
8
|
//#region packages/contracts/src/json.d.ts
|
|
@@ -57,7 +58,7 @@ type AgentDeviceClientConfig = RemoteConnectionProfileFields & CloudProviderProf
|
|
|
57
58
|
iosXctestDerivedDataPath?: string;
|
|
58
59
|
iosXctestEnvDir?: string;
|
|
59
60
|
};
|
|
60
|
-
type AgentDeviceRequestOverrides = Pick<AgentDeviceClientConfig, 'session' | 'lockPolicy' | 'lockPlatform' | 'requestId' | 'daemonBaseUrl' | 'daemonAuthToken' | 'daemonTransport' | 'daemonServerMode' | 'tenant' | 'sessionIsolation' | 'runId' | 'leaseId' | 'leaseBackend' | 'leaseProvider' | 'deviceKey' | 'clientId' | 'providerApp' | 'providerOsVersion' | 'providerProject' | 'providerBuild' | 'providerSessionName' | 'providerDeviceOrientation' | 'providerGeoLocation' | 'providerTimezone' | 'providerAppiumVersion' | 'providerLanguage' | 'providerLocale' | 'providerNetworkProfile' | 'providerCustomNetwork' | 'providerNoResignApp' | 'awsProjectArn' | 'awsDeviceArn' | 'awsAppArn' | 'awsRegion' | 'awsInteractionMode' | 'leaseTtlMs' | 'cwd' | 'debug' | 'cost' | 'responseLevel' | 'iosXctestrunFile' | 'iosXctestDerivedDataPath' | 'iosXctestEnvDir'> & {
|
|
61
|
+
type AgentDeviceRequestOverrides = Pick<AgentDeviceClientConfig, 'session' | 'lockPolicy' | 'lockPlatform' | 'requestId' | 'daemonBaseUrl' | 'daemonAuthToken' | 'daemonTransport' | 'daemonServerMode' | 'tenant' | 'sessionIsolation' | 'runId' | 'leaseId' | 'leaseBackend' | 'leaseProvider' | 'deviceKey' | 'clientId' | 'providerApp' | 'providerOsVersion' | 'providerDeviceType' | 'providerProject' | 'providerBuild' | 'providerSessionName' | 'providerDeviceOrientation' | 'providerGeoLocation' | 'providerTimezone' | 'providerAppiumVersion' | 'providerLanguage' | 'providerLocale' | 'providerNetworkProfile' | 'providerCustomNetwork' | 'providerNoResignApp' | 'awsProjectArn' | 'awsDeviceArn' | 'awsAppArn' | 'awsRegion' | 'awsInteractionMode' | 'leaseTtlMs' | 'cwd' | 'debug' | 'cost' | 'responseLevel' | 'iosXctestrunFile' | 'iosXctestDerivedDataPath' | 'iosXctestEnvDir'> & {
|
|
61
62
|
/**
|
|
62
63
|
* Cancels this one call. Already aborted: the call rejects without sending anything
|
|
63
64
|
* (`details.dispatched: 'no'`). Aborted in flight: the request's connection closes, the daemon
|
|
@@ -363,8 +364,9 @@ type SnapshotCaptureAnnotations = {
|
|
|
363
364
|
warnings?: string[];
|
|
364
365
|
/** The Apple runner re-activated the session app while serving this capture (#2682). */
|
|
365
366
|
targetActivation?: IosTargetActivation;
|
|
367
|
+
observation?: IosSnapshotObservation;
|
|
366
368
|
};
|
|
367
|
-
type PublicSnapshotCaptureAnnotations = Pick<SnapshotCaptureAnnotations, 'androidSnapshot' | 'warnings' | 'targetActivation'> & {
|
|
369
|
+
type PublicSnapshotCaptureAnnotations = Pick<SnapshotCaptureAnnotations, 'androidSnapshot' | 'warnings' | 'targetActivation' | 'observation'> & {
|
|
368
370
|
snapshotQuality?: SnapshotQualityVerdict;
|
|
369
371
|
};
|
|
370
372
|
//#endregion
|
|
@@ -582,6 +584,8 @@ type FillOptions = DeviceCommandBaseOptions & SelectorSnapshotCommandOptions & I
|
|
|
582
584
|
delayMs?: number;
|
|
583
585
|
/** Publish this fill value as `${VAR}` when script recording is armed. */
|
|
584
586
|
recordAs?: string;
|
|
587
|
+
/** The text came from the CLI's stdin; keep it out of diagnostics and recorded actions. */
|
|
588
|
+
textStdin?: boolean;
|
|
585
589
|
verify?: boolean;
|
|
586
590
|
};
|
|
587
591
|
type PinchOptions = DeviceCommandBaseOptions & {
|
|
@@ -954,8 +958,12 @@ type SettingsUpdateOptions = (DeviceCommandBaseOptions & {
|
|
|
954
958
|
permission: PermissionTarget;
|
|
955
959
|
mode?: PermissionMode;
|
|
956
960
|
/**
|
|
957
|
-
* The app the permission changes, by bundle id
|
|
958
|
-
*
|
|
961
|
+
* The app the permission changes, by bundle id, package name, or app name, resolved as `open`
|
|
962
|
+
* resolves it: an iOS simulator matches display names and accepts only an installed bundle
|
|
963
|
+
* id, Android accepts only an installed package and matches other names against installed
|
|
964
|
+
* package names, and a Limrun iOS session resolves only the `settings` alias. One that
|
|
965
|
+
* resolves to nothing is refused with `app_not_installed`. Without it the app bound to the
|
|
966
|
+
* session is used; with it no app has to be running or open, because `simctl privacy` and
|
|
959
967
|
* Android's `pm` need only the id. macOS permissions are host-level TCC grants, so naming an
|
|
960
968
|
* app there is refused rather than dropped.
|
|
961
969
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { D as IosSnapshotObservation, F as SnapshotNode, M as ScreenshotOverlayRef, R as SnapshotQualityVerdict, T as PublicPlatform, V as SnapshotViewportSize, n as DaemonArtifactType, z as SnapshotState } from "./sdk-contracts.js";
|
|
2
2
|
import { v as SettleObservation } from "./sdk-selectors.js";
|
|
3
3
|
//#region packages/contracts/src/back-mode.d.ts
|
|
4
4
|
declare const BACK_MODES: readonly ['in-app', 'system'];
|
|
@@ -295,6 +295,7 @@ type BackendSnapshotResult = {
|
|
|
295
295
|
};
|
|
296
296
|
quality?: SnapshotQualityVerdict;
|
|
297
297
|
warnings?: string[];
|
|
298
|
+
observation?: IosSnapshotObservation;
|
|
298
299
|
};
|
|
299
300
|
type AndroidSnapshotBackendMetadata = {
|
|
300
301
|
backend: 'android-helper';
|
|
@@ -399,4 +400,4 @@ type CloudArtifactProvider = {
|
|
|
399
400
|
listCloudArtifacts?: (query: CloudArtifactsQuery) => Promise<CloudArtifactsResult | undefined>;
|
|
400
401
|
};
|
|
401
402
|
//#endregion
|
|
402
|
-
export {
|
|
403
|
+
export { SetFoldPoseInput as A, ScrollInputDirection as C, DeviceRotation as D, TransformGestureParams as E, FoldPose as O, ScrollDirection as S, SwipePreset as T, SettingOptions as _, AndroidSnapshotBackendMetadata as a, ScrollCommandResult as b, ScreenshotResultData as c, MACOS_PERMISSION_TARGETS as d, MOBILE_PERMISSION_TARGETS as f, ReadableSetting as g, ReadSettingResult as h, CloudProviderSessionResult as i, BackMode as j, FoldScreenCoordinateSpace as k, SnapshotDiagnosticsSummary as l, PermissionMode as m, CloudArtifactProvider as n, BackendSnapshotResult as o, PermissionAction as p, CloudArtifactsResult as r, FindLocator as s, AgentArtifactsResult as t, SessionSurface as u, TextSizeCategory as v, SwipePattern as w, ScrollExecutionOptions as x, TvRemoteButton as y };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{z as e}from"./file.js";import{a as t,r as n,s as r,t as i}from"./code-signature.js";import a from"node:crypto";import o from"node:fs";import s from"node:os";import c from"node:path";function l(e,a){let o=t(a),s=t(e),c=v(s,o),l=i(o,s),d=u(c,o,l);if(d)return n(d.files);let p;try{p=r(s,o)}catch{return`unknown`}return f(p.files,l)&&_(c,p),n(p.files)}function u(e,t,n){let r=p(e);if(!(!r||!f(r.files,n))){for(let[e,n,i]of r.files){let r=d(c.resolve(t,e));if(!r?.isFile()||r.size!==n||Math.trunc(r.mtimeMs)!==i)return}for(let e of r.absentPaths)if(d(c.resolve(t,e))?.isFile())return;return r}}function d(e){try{return o.statSync(e)}catch{return}}function f(e,t){return e.some(([e])=>e===t)}function p(e){let t=m(e);if(!t)return;let n=[];for(let e of t.files){let t=g(e);if(!t)return;n.push(t)}if(t.absent.every(e=>typeof e==`string`))return{files:n,absentPaths:t.absent}}function m(e){let t=h(e);if(t===void 0)return;let n;try{n=JSON.parse(t)}catch{return}if(!n||typeof n!=`object`)return;let r=n;if(r.version===2&&!(!Array.isArray(r.files)||!Array.isArray(r.absent)))return{files:r.files,absent:r.absent}}function h(e){let t;try{t=o.openSync(e,`r`)}catch{return}try{let e=process.getuid?.();return e!==void 0&&o.fstatSync(t).uid!==e?void 0:o.readFileSync(t,`utf8`)}catch{return}finally{o.closeSync(t)}}function g(e){if(!Array.isArray(e)||e.length!==3)return;let[t,n,r]=e;if(typeof t==`string`&&typeof n==`number`&&typeof r==`number`)return[t,n,r]}function _(t,n){let r={version:2,files:[...n.files],absent:[...n.absentPaths]};try{o.mkdirSync(c.dirname(t),{recursive:!0,mode:448}),e({destination:t,contents:JSON.stringify(r),mode:384})}catch{}}function v(e,t){let n=a.createHash(`sha1`).update(`${t} ${e}`).digest(`hex`),r=`agent-device-code-signature-${process.getuid?.()??`user`}`;return c.join(s.tmpdir(),r,`${n}.json`)}export{l as resolveCachedDaemonCodeSignature};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{c as e,r as t}from"./version.js";import n from"node:crypto";import r from"node:fs";import i from"node:path";const a=/(['"])(\.\.?\/[^'"]*)\1/g,o=/(['"])(@[^'"/\s]+\/[^'"\s]+)\1/g,s=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`];function c(){let e=process.argv[1];return e?u(e):`unknown`}function l(n=t()){return e(n)?`checkout`:`installed`}function u(e,n=t()){try{return g(d(e,n).files)}catch{return`unknown`}}function d(e,t){let n=h(t),i=[h(e)],a=new Set,o=[],s=new Set,c={root:n,packages:new Map,absentPaths:s,stamp:e=>{if(a.has(e))return!1;a.add(e);let t=r.statSync(e);if(!t.isFile())return!1;let i=m(n,e);return o.push([i,t.size,Math.trunc(t.mtimeMs)]),!0},follow:e=>{for(let t of e.missedCandidates)s.add(m(n,t));e.filePath&&i.push(e.filePath)}};for(;i.length>0;){let e=i.pop();if(e===void 0||a.has(e)||!c.stamp(e))continue;let t=r.readFileSync(e,`utf8`);for(let n of _(t))c.follow(w(e,n));f(t,c)}return{files:o,absentPaths:[...s]}}function f(e,t){for(let n of v(e)){let{name:e,subpath:r}=y(n),i=p(e,t);if(!i)continue;let a=S(i.manifest,r);a!==void 0&&t.follow(w(i.manifestPath,a))}}function p(e,t){let n=t.packages.get(e);if(n!==void 0)return n;let r=b(t.root,e,t.absentPaths);return t.packages.set(e,r),r&&t.stamp(r.manifestPath),r}function m(e,t){let n=i.resolve(t);return i.relative(i.resolve(e),n)||n}function h(e){try{return r.realpathSync.native(e)}catch{return i.resolve(e)}}function g(e){let t=e.map(([e,t,n])=>`${e}:${t}:${n}`).sort().join(`|`),r=n.createHash(`sha1`).update(t).digest(`hex`);return`graph:${e.length}:${r}`}function _(e){let t=new Set;a.lastIndex=0;let n=null;for(;(n=a.exec(e))!==null;)t.add(n[2]);return[...t]}function v(e){let t=new Set;o.lastIndex=0;let n=null;for(;(n=o.exec(e))!==null;)t.add(n[2]);return[...t]}function y(e){let t=e.split(`/`),n=t.slice(2).join(`/`);return{name:t.slice(0,2).join(`/`),subpath:n?`./${n}`:`.`}}function b(e,t,n){let a=i.join(e,`node_modules`,t,`package.json`);if(!E(a))return n.add(m(e,a)),null;let o=h(a);if(x(e,o))return null;try{return{manifestPath:o,manifest:JSON.parse(r.readFileSync(o,`utf8`))}}catch{return null}}function x(e,t){let n=i.relative(i.join(e,`node_modules`),t);return n!==``&&!n.startsWith(`..`)&&!i.isAbsolute(n)}function S(e,t){if(!e||typeof e!=`object`)return;let n=e.exports;if(!n||typeof n!=`object`)return;let r=n[t],i=typeof r==`string`?r:C(r);return typeof i==`string`&&i.startsWith(`.`)?i:void 0}function C(e){if(!(!e||typeof e!=`object`))return e.default}function w(e,t){let n=i.resolve(i.dirname(e),t),r=[];for(let e of T(n)){if(E(e))return{filePath:e,missedCandidates:r};r.push(e)}return{filePath:null,missedCandidates:r}}function*T(e){yield e;for(let t of s)yield`${e}${t}`;for(let t of s)yield i.join(e,`index${t}`)}function E(e){try{return r.statSync(e).isFile()}catch{return!1}}export{h as a,l as i,u as n,c as o,g as r,d as s,m as t};
|