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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{Y as t,at as n,c as r,t as i,u as a}from"./tv-remote.js";import{i as o,v as s}from"./sdk-batch-runner.js";import{E as c,R as l,T as u,n as ee,t as d}from"./back-mode.js";import{c as te}from"./diagnostics.js";import"./diagnostics2.js";import{O as ne,a as re,f as ie,i as ae,n as f,u as p}from"./sdk-device.js";import{m as oe}from"./sdk-batch.js";import{t as se}from"./recording-scope.js";import{t as ce}from"./session.js";import{i as le}from"./snapshot-chrome.js";import{n as ue,r as de}from"./device-isolation.js";import{a as fe,i as pe,r as me}from"./device-inventory-context.js";import{AsyncLocalStorage as he}from"node:async_hooks";const ge=[`id`,`deviceId`,`device_id`,`serial`,`udid`,`device_udid`,`identifier`],m={ios:`iOS`,ipados:`iPadOS`,tvos:`tvOS`,watchos:`watchOS`,visionos:`visionOS`,macos:`macOS`,apple:`Apple`,android:`Android`,linux:`Linux`,web:`Web`};function _e(e,t){let n=t??{};switch(e.command){case c.devices:return ve(n.devices);case c.apps:return ye(n.apps,e.flags?.appsFilter);case c.boot:return h(`Booted`,n,!0);case c.shutdown:return h(`Shut down`,n,!1);case c.install:return g(`Installed`,n);case c.reinstall:return g(`Reinstalled`,n);case c.screenshot:return be(e,n);default:return{}}}function ve(e){if(!Array.isArray(e))return{};let t=e.flatMap(e=>{let t=xe(e);return t?[t]:[]}),n=t.slice(0,5),r=Math.max(0,t.length-n.length),i=t.slice(0,3);return{summary:w(`Found ${t.length} ${T(`device`,t.length)}`,i.map(e=>x(e,!0)),Math.max(0,t.length-i.length)),details:{deviceCount:t.length,devices:n,...r>0?{omittedDeviceCount:r}:{}}}}function ye(e,t){if(!Array.isArray(e))return{};let n=e.flatMap(e=>{let t=E(e);return t?[t]:[]}),r=n.slice(0,5),i=Math.max(0,n.length-r.length),a=n.slice(0,3);return{summary:w(`Found ${n.length} ${T(`app`,n.length)}`,a,Math.max(0,n.length-a.length)),details:{appCount:n.length,apps:r,...i>0?{omittedAppCount:i}:{},...t===`all`||t===`user-installed`?{filter:t}:{}}}}function h(e,t,n){let r=v(t);if(!r)return{};let i={device:r,...b(t),booted:n};return{summary:`${e} ${x(i,!1)}`,details:i}}function g(e,t){let n=E(t.appName),r=E(t.bundleId),i=S(t,[`packageName`,`package`]),a=E(t.platform),o=E(t.launchTarget),s=S(t,[`bundleId`,`packageName`,`package`,`appId`,`launchTarget`]),c=Te(n,s);if(!c)return{};let l={};return C(l,`appName`,n),C(l,`bundleId`,r),C(l,`packageName`,i),C(l,`platform`,a),o!==s&&C(l,`launchTarget`,o),{summary:`${e} ${c}`,details:l}}function be(e,t){let n=_(e,t);return n?{details:{requestedFileName:n}}:{}}function _(e,t){let n=M(e.meta?.clientArtifactPaths?.path)??M(t.path);if(n)return j(n)}function xe(e){if(!s(e))return;let t=v(e);if(t)return{name:t,...b(e)}}function v(e){let t=S(e,[`name`,`deviceName`,`device`]);return!t||!Se(e,t)?t:Ce(e)}function Se(e,t){let n=y(t);return ge.some(t=>{let r=E(e[t]);return r!==void 0&&y(r)===n})}function y(e){return e.toLowerCase()}function Ce(e){let t=E(e.appleOs),n=E(e.platform),r=E(e.kind),i=we(t,n);return i&&(r===`simulator`||r===`emulator`)?`${i} ${r}`:i?`${i} device`:r===`simulator`?`Simulator`:r===`emulator`?`Emulator`:`Unnamed device`}function we(e,t){let n=e??t;if(!(!n||!Object.hasOwn(m,n)))return m[n]}function b(e){let t=E(e.platform),n=E(e.appleOs),r=E(e.kind),i=E(e.target);return{...t?{platform:t}:{},...n?{appleOs:n}:{},...r?{kind:r}:{},...i?{target:i}:{},...typeof e.booted==`boolean`?{booted:e.booted}:{}}}function x(e,t){let n=E(e.name)??E(e.device)??`device`,r=E(e.platform),i=E(e.appleOs),a=[r,i===r?void 0:i,E(e.kind),E(e.target),t&&typeof e.booted==`boolean`?e.booted?`booted`:`stopped`:void 0].filter(e=>!!e);return a.length>0?`${n} (${a.join(`, `)})`:n}function Te(e,t){return e&&t&&e!==t?`${e} (${t})`:e??t}function S(e,t){for(let n of t){let t=E(e[n]);if(t)return t}}function C(e,t,n){n&&(e[t]=n)}function w(e,t,n){let r=[...t,...n>0?[`+${n} more`]:[]];return r.length>0?`${e}: ${r.join(`, `)}`:e}function T(e,t){return t===1?e:`${e}s`}function E(e){let t=M(e);if(!t)return;let n=t.trim(),r=Array.from(n);return r.length<=120?n:`${r.slice(0,119).join(``)}…`}function D(e){return E(e)}function O(e){return typeof e==`boolean`?e:void 0}function k(e,t){let n=D(e);return n&&t.includes(n)?n:void 0}function A(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function j(e){let t=M(e);return t?E(t.split(/[\\/]/).at(-1)):void 0}function M(e){if(typeof e==`string`)return e.trim().length>0?e:void 0}function N(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}const P=[`up`,`down`,`left`,`right`],F=[`top`,`bottom`];function Ee(e){return`${e.command===c.reinstall?`Reinstalled`:`Installed`} ${Ae(e.result??{})??`app`}`}function De(e){let t=e.result??{};switch(e.command){case c.scroll:return Me(t);case c.screenshot:return Fe(t);case c.home:return`Went home`;case c.back:return Ie(t);case c.appSwitcher:return`Opened app switcher`;case c.actionButton:return`Pressed Action Button`;case c.orientation:return Re(t);case c.fold:return Le(t);case c.viewport:return ze(t);case c.clipboard:return Be(t);case c.keyboard:return Ve(t);case c.tvRemote:return We(t);case c.gesture:return Ge(t);case c.swipe:return Ke(t);case c.trace:return L(`trace`,e);case c.record:return L(`recording`,e);default:return}}function Oe(e){let t=e.result??{};switch(e.command){case c.scroll:return A({direction:k(t.direction,P),edge:k(t.edge,F),passes:N(t.passes),amount:N(t.amount),pixels:N(t.pixels),durationMs:N(t.durationMs),x1:N(t.x1),y1:N(t.y1),x2:N(t.x2),y2:N(t.y2)});case c.screenshot:return A({requestedFileName:I(t)});case c.back:return A({mode:k(t.mode,d)});case c.orientation:return A({orientation:k(t.orientation,r)});case c.fold:return A({pose:k(t.pose,a)});case c.viewport:return A({width:N(t.width),height:N(t.height)});case c.clipboard:return A({action:k(t.action,[`read`,`write`])});case c.keyboard:return Ue(t);case c.tvRemote:return A({button:k(t.button,i),durationMs:N(t.durationMs)});case c.gesture:case c.swipe:return qe(t);case c.trace:case c.record:return A({action:k(t.action,[`start`,`stop`]),fileName:R(e),showTouches:O(t.showTouches)});default:return{}}}function ke(e,t){if(e.command!==c.screenshot)return t;let n=_(e,t);return n?{...t,requestedFileName:n}:t}function Ae(e){let t=D(e.appName),n=Ye(e,[`bundleId`,`packageName`,`appBundleId`,`launchTarget`]);return t&&n&&t!==n?`${t} (${n})`:t??n??je(e)}function je(e){let t=D(e.app);return t&&!t.includes(`/`)&&!t.includes(`\\`)?t:void 0}function Me(e){let t=k(e.direction,P),n=k(e.edge,F),r=N(e.passes);return n?Ne(n,r):t?Pe(t,e):`Scrolled`}function Ne(e,t){return t===0?`Already at ${e}`:t===void 0?`Scrolled to ${e}`:`Scrolled to ${e} in ${t} ${t===1?`pass`:`passes`}`}function Pe(e,t){let n=N(t.pixels);if(n!==void 0)return`Scrolled ${e} by ${n}px`;let r=N(t.amount);return r===void 0?`Scrolled ${e}`:`Scrolled ${e} by ${r}`}function Fe(e){let t=I(e);return t?`Captured screenshot ${t}`:`Captured screenshot`}function I(e){return j(e.requestedFileName)??j(e.path)}function Ie(e){return k(e.mode,d)===`system`?`Went back using system navigation`:`Went back`}function Le(e){let t=k(e.pose,a);return t?`Folded to ${t}`:`Changed fold pose`}function Re(e){let t=k(e.orientation,r);return t?O(e.confirmed)===!1?`Requested ${t} (unconfirmed)`:`Rotated to ${t}`:`Changed orientation`}function ze(e){let t=N(e.width),n=N(e.height);return t!==void 0&&n!==void 0?`Set viewport to ${t}×${n}`:`Changed viewport`}function Be(e){let t=k(e.action,[`read`,`write`]);return t===`read`?`Read clipboard`:t===`write`?`Updated clipboard`:`Used clipboard`}function Ve(e){let t=M(e.action);if(!t||!le(t))return`Used keyboard`;if(t===`dismiss`)return He(e);if(t===`enter`||t===`return`)return`Pressed keyboard return`;let n=O(e.visible);return n===void 0?`Inspected keyboard`:n?`Keyboard is visible`:`Keyboard is hidden`}function He(e){return O(e.dismissed)===!1?`Keyboard was already hidden`:`Dismissed keyboard`}function Ue(e){let t=M(e.action);return A({action:t&&le(t)?t:void 0,platform:k(e.platform,[`ios`,`android`]),visible:O(e.visible),wasVisible:O(e.wasVisible),dismissed:O(e.dismissed),attempts:N(e.attempts),mechanism:k(e.mechanism,[`dismissKey`])})}function We(e){let t=k(e.button,i);return t?`Pressed TV remote ${t}`:`Used TV remote`}function Ge(e){let t=k(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]);return t?`Ran ${t} gesture`:`Ran gesture`}function Ke(e){let t=N(e.count);return t!==void 0&&t>1?`Swiped ${t} times`:`Swiped`}function qe(e){return A({kind:k(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]),durationMs:N(e.durationMs),pointerCount:N(e.pointerCount),x1:N(e.x1),y1:N(e.y1),x2:N(e.x2),y2:N(e.y2),count:N(e.count),pauseMs:N(e.pauseMs),pattern:k(e.pattern,[`one-way`,`ping-pong`]),scale:N(e.scale)})}function L(e,t){let n=Je(e,k(t.result?.action,[`start`,`stop`])),r=R(t);return r?`${n} ${r}`:n}function Je(e,t){return t===`start`?e===`trace`?`Started trace`:`Started recording`:t===`stop`?e===`trace`?`Stopped trace`:`Stopped recording`:e===`trace`?`Updated trace`:`Updated recording`}function R(e){let t=e.result??{};return j(t.requestedFileName)??j(t.outPath)??j(t.path)??j(e.positionals[1])}function Ye(e,t){for(let n of t){let t=D(e[n]);if(t)return t}}function Xe(e){switch(e.command){case c.open:return`Opened ${z(e)??`session`}`;case c.close:return`Closed ${D(e.result?.session)??`session`}`;case c.click:case c.press:return`Tapped ${z(e)??`target`}`;case c.longPress:return`Long pressed ${z(e)??`target`}`;case c.hover:return`Hovered ${z(e)??`target`}`;case c.fill:return`Filled ${z(e)??`target`}`;case c.type:return`Typed text`;case c.install:case c.reinstall:case u.installSource:return Ee(e);default:return De(e)??`Ran ${e.command}`}}function Ze(e){return A({command:e.command,positionals:B(e),flags:mt(e),...Qe(e),...$e(e),...et(e),...Oe(e)})}function Qe(e){if(!tt(e.command))return{};let t=e.result??{};return A({ref:X(t),targetLabel:z(e),selectorChainLength:dt(t.selectorChain)?.length,x:N(t.x),y:N(t.y),x2:N(t.x2),y2:N(t.y2),durationMs:N(t.durationMs)})}function $e(e){if(!nt(e.command))return{};let t=e.result??{};return A({platform:k(t.platform,re),target:k(t.target,f),appName:D(t.appName),appBundleId:D(t.appBundleId),bundleId:D(t.bundleId),packageName:D(t.packageName),launchTarget:D(t.launchTarget)})}function et(e){let t=e.result??{};return e.command===c.snapshot?Array.isArray(t.nodes)?{nodeCount:t.nodes.length}:{}:e.command!==c.wait&&e.command!==c.find&&e.command!==c.get&&e.command!==c.is?{}:A({waitedMs:N(t.waitedMs),found:O(t.found)})}function tt(e){return e===c.click||e===c.press||e===c.longPress||e===c.hover||e===c.focus||e===c.fill}function nt(e){return e===c.open||e===c.install||e===c.reinstall||e===u.installSource}function z(e){let t=e.result??{};return rt(t)??it(t)??at(t)??U(e.positionals[0])}function rt(e){let t=X(e);if(t)return t.startsWith(`@`)?t:`@${t}`}function it(e){let t=N(e.x),n=N(e.y);if(t!==void 0&&n!==void 0)return`(${t}, ${n})`}function at(e){return D(e.appName)??D(e.appBundleId)??D(e.bundleId)??D(e.packageName)}function B(e){if(e.positionals.length!==0)return e.command===c.type?[W(`text`)]:e.command===c.fill?ot(e):e.command===c.find?st(e):e.command===c.clipboard?ct(e):e.command===c.push?V(e,`app`,`payload`):e.command===c.triggerAppEvent?V(e,`event`,`payload`):e.positionals.map(H)}function ot(e){let t=W(`text`),n=e.result??{},r=X(n);if(r)return[`@${r}`,t];if(D(n.selector))return[W(`target`),t];let i=N(n.x),a=N(n.y);return i!==void 0&&a!==void 0?[String(i),String(a),t]:[t]}function st(e){let t=+!!ut(e.positionals[0]);if(e.positionals[t]===void 0)return;let n=t+1,r=[...t===1?[String(e.positionals[0])]:[],W(`query`)],i=e.positionals[n];return i?i===`fill`||i===`type`?[...r,i,W(`text`)]:[...r,...e.positionals.slice(n).map(lt)]:r}function ct(e){let t=e.positionals[0]?.toLowerCase();return t===`read`?[`read`]:t===`write`?[`write`,W(`text`)]:e.positionals.map(H)}function V(e,t,n){let[r,i,...a]=e.positionals;return[...r?[W(t)]:[],...i?[W(n)]:[],...a.map(H)]}function lt(e){return e===`click`||e===`focus`||e===`exists`||e===`get`||e===`text`||e===`attrs`||e===`wait`?e:H(e)}function H(e){return U(e)??W(`arg`)}function U(e){if(!e)return;let t=e.trim();if(/^@[a-zA-Z0-9:_-]+$/.test(t))return t}function W(e){return`<${e}>`}function ut(e){return e===`text`||e===`label`||e===`value`||e===`role`||e===`id`}function dt(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)?e:void 0}const ft={enums:[{source:`platform`,values:ae},{source:`target`,values:f}]},pt={booleans:[{source:`settle`}],numbers:[{source:`settleQuietMs`}]},G={[c.open]:{booleans:[{source:`relaunch`},{source:`testIme`}],enums:[{source:`surface`,values:ce}]},[c.click]:K(),[c.press]:K(),[c.longPress]:K(),[c.hover]:K(),[c.fill]:q(),[c.type]:q(),[c.scroll]:{numbers:[{source:`pixels`},{source:`durationMs`}]},[c.gesture]:J(),[c.swipe]:J(),[c.screenshot]:{booleans:[{source:`overlayRefs`},{source:`screenshotFullscreen`,output:`fullscreen`},{source:`screenshotNoStabilize`,output:`noStabilize`},{source:`screenshotNormalizeStatusBar`,output:`normalizeStatusBar`}],numbers:[{source:`screenshotPixelDensity`,output:`pixelDensity`},{source:`screenshotScale`,output:`scale`}]},[c.snapshot]:{booleans:[{source:`snapshotInteractiveOnly`,output:`interactiveOnly`},{source:`snapshotDiff`,output:`diff`},{source:`snapshotRaw`,output:`raw`},{source:`snapshotCustomActions`,output:`actions`},{source:`snapshotForceFull`,output:`forceFull`}],numbers:[{source:`snapshotDepth`,output:`depth`}]},[c.back]:{enums:[{source:`backMode`,output:`mode`,values:d}]},[c.record]:{booleans:[{source:`hideTouches`}],numbers:[{source:`fps`}],enums:[{source:`recordingScope`,output:`scope`,values:se}]},[c.apps]:{enums:[{source:`appsFilter`,output:`filter`,values:[`user-installed`,`all`]}]},[c.boot]:{booleans:[{source:`headless`}]},[c.close]:{booleans:[{source:`shutdown`}]}};function mt(e){let t=e.flags??{},n={},r=Object.hasOwn(G,e.command)?G[e.command]:void 0;return Y(n,t,ft),Y(n,t,r),Y(n,t,ht(e.command)),Object.keys(n).length>0?n:void 0}function ht(e){return oe(e)?pt:void 0}function K(){return{booleans:[{source:`doubleTap`}],numbers:[{source:`count`},{source:`intervalMs`},{source:`holdMs`},{source:`jitterPx`}],enums:[{source:`clickButton`,values:ee}]}}function q(){return{numbers:[{source:`delayMs`}]}}function J(){return{numbers:[{source:`pointerCount`},{source:`count`},{source:`pauseMs`}],enums:[{source:`pattern`,values:t}]}}function Y(e,t,n){n&&(gt(e,t,n.booleans??[]),_t(e,t,n.numbers??[]),vt(e,t,n.enums??[]))}function gt(e,t,n){for(let r of n)yt(e,r.output??r.source,t[r.source])}function _t(e,t,n){for(let r of n)bt(e,r.output??r.source,t[r.source])}function vt(e,t,n){for(let r of n)xt(e,r.output??r.source,t[r.source],r.values)}function X(e){let t=D(e.ref);if(!t)return;let n=t.startsWith(`@`)?t.slice(1):t;return/^[a-zA-Z0-9:_-]+$/.test(n)?n:void 0}function yt(e,t,n){typeof n==`boolean`&&(e[t]=n)}function bt(e,t,n){let r=N(n);r!==void 0&&(e[t]=r)}function xt(e,t,n,r){let i=k(n,r);i!==void 0&&(e[t]=i)}async function Z(e){let{resolveInventoryDeviceSelection:t}=await import(`./device-selection-resolver.js`).then(e=>e.t);return await t(e)}const Q=new he;function St(t,n){return!p(n)&&t instanceof e&&t.code===`DEVICE_NOT_FOUND`}function Ct(e,t){return!p(e)&&(!e.platform||e.platform===`apple`||e.platform===`ios`)&&e.target!==`desktop`&&(!t||t.kind===`device`)}async function wt(e,t={}){return(await $(e,t)).device}async function $(e,t={}){let n={...Dt(e),androidAvdSelection:t.androidAvdSelection??`running-only`},{iosSimulatorSetPath:r,...i}=n,a=jt(n,t),o={platform:n.platform,target:e.target,cacheHit:!1};return await te(`resolve_target_device`,async()=>{let e=kt(a);if(e)return o.cacheHit=!0,e;let s=await pe(n),c=[...s.devices];if(ie(i.platform)&&s.source===`local`){let e=await Tt(c,i,{simulatorSetPath:r,appleSimulatorAppTarget:t.appleSimulatorAppTarget});return At(a,e)}return At(a,await Z({devices:c,selector:i,source:s.source}))},o)}async function Tt(t,n,r){let i;try{i=await Z({devices:t,selector:n,source:`local`,appleSimulatorAppTarget:r.appleSimulatorAppTarget})}catch(e){if(!St(e,n))throw e}let a=await Et(n,r,i?.device);if(a)return a;if(i)return i;throw new e(`DEVICE_NOT_FOUND`,`No devices found`,{selector:n})}async function Et(e,t,n){if(Ct(e,n))try{return await Z({devices:await me({platform:e.platform??`ios`,target:e.target,iosSimulatorSetPath:t.simulatorSetPath,kind:`simulator`}),selector:e,source:`local`})}catch(e){if(fe(e))throw e;return}}function Dt(t){let n=t.platform;if(t.target&&!n)throw new e(`INVALID_ARGS`,`Device target selector requires --platform. Use --platform ios|macos|android|vega|linux|apple with --target mobile|tv|desktop.`);let r=ne({simulatorSetPath:de(t.iosSimulatorDeviceSet),platform:n,target:t.target}),i=ue(t.androidDeviceAllowlist);return{platform:n,target:t.target,deviceName:t.device,udid:t.udid,serial:t.serial,leaseId:t.leaseId,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId,iosSimulatorSetPath:r,androidSerialAllowlist:i?Array.from(i).sort():void 0}}async function Ot(e){return Q.getStore()?await e():await Q.run(new Map,e)}function kt(e){let t=Q.getStore()?.get(e);if(t)return{...t,device:{...t.device}}}function At(e,t){return Q.getStore()?.set(e,{...t,device:{...t.device}}),t}function jt(e,t){let{appleSimulatorAppTarget:n,...r}=t;return JSON.stringify({request:e,options:r})}function Mt(e){return{appleSimulatorAppTarget:Nt(e)}}function Nt(e){return e&&!o(e)?e:void 0}const Pt=new WeakMap;function Ft(e){if(!e)return;let t=Pt.get(e);if(t)return t;let n=Lt(e.nodes??[]);if(n)return Pt.set(e,n),n}function It(e){return Ft({nodes:e,createdAt:0})}const Lt=n,Rt=`This replay request carries no script sources. Replay scripts are read by the client and sent with the request; upgrade the agent-device client that issued it to a version that sends script sources.`;function zt(t,n){let r=t.files[n];if(r===void 0)throw new e(`INVALID_ARGS`,`replay script source is missing ${n}; it was not part of the script sources sent with this request.`,{path:n,entry:t.entry});return r}function Bt(e){let t=l(e);for(let n of e){if(n.command!==`open`)continue;let e=n.positionals?.[0];return Ut(e)?{appTarget:e,platform:t}:{appTarget:void 0,platform:t}}return{appTarget:void 0,platform:t}}function Vt(e,t){return t===`ios`?Wt(e)??{}:{}}function Ht(e,t){let n=Bt(t);return e?.platform!==void 0||!n.platform?e??{}:{...e,platform:n.platform}}function Ut(e){return!!(e&&e.trim()&&!e.includes(`$`)&&!o(e))}function Wt(e){let t=Nt(e);return t?{appleSimulatorAppTarget:t}:void 0}export{ke as _,Rt as a,It as c,wt as d,$ as f,B as g,Xe as h,Bt as i,Mt as l,Ze as m,Vt as n,zt as o,Ot as p,Ht as r,Ft as s,Wt as t,Dt as u,_e as v};
|
package/dist/src/replay.js
CHANGED
|
@@ -1,3 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{
|
|
2
|
-
---
|
|
3
|
-
`)}\n`}function x(t,n){let r={config:S(n.metadata),warnings:[],unsupported:[]},i=[];for(let[e,a]of t.entries()){let t=n.actionLines?.[e]??e+1,o=w(a,n.resolveSelector);switch(o.kind){case`commands`:i.push(...o.commands),K(r,o.warnings,a,t);break;case`config`:r.config.appId??=o.appId,i.push(...o.commands),K(r,o.warnings,a,t);break;case`unsupported`:r.unsupported.push({line:t,action:X(a),message:o.message})}}if(r.unsupported.length>0)throw new e(`INVALID_ARGS`,`Cannot export replay to Maestro YAML: unsupported .ad action ${Y(r.unsupported)}.`,{unsupported:r.unsupported});return{yaml:J(r.config,i),warnings:r.warnings}}function S(e){return e?.env&&Object.keys(e.env).length>0?{env:e.env}:{}}const C={...m,click:T,press:T,longpress:E,fill:A,type:j,wait:M,find:P,screenshot:F,scroll:I,swipe:L};function w(e,t){return C[e.command]?.(e,t)??{kind:`unsupported`,message:`${e.command} has no Maestro equivalent`}}function T(e,t){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`${e.command} requires a target`};let i=B(n,r,t);if(!i)return{kind:`unsupported`,message:`tap target is not Maestro-compatible`};let a=V(e);return a.ok?e.flags?.doubleTap===!0?{kind:`commands`,commands:[{doubleTapOn:i}],warnings:[...N(n),...k(e,`doubleTapOn`)]}:typeof e.flags?.holdMs==`number`?{kind:`commands`,commands:[{longPressOn:i}],warnings:[...N(n),O(e.flags.holdMs),...k(e,`longPressOn`)]}:{kind:`commands`,commands:[W(i,a.options)],warnings:N(n)}:{kind:`unsupported`,message:a.message}}function E(e,t){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`longpress requires a target`};let i=B(n,r,t);return i?{kind:`commands`,commands:[{longPressOn:i}],warnings:[...N(n),...D(e).map(O)]}:{kind:`unsupported`,message:`longpress target is not Maestro-compatible`}}function D(e){let[t,n,r]=e.positionals,i=Z(t)&&Z(n)?r:n;return i&&Z(i)?[Number(i)]:[]}function O(e){return`long-press duration exports as Maestro longPressOn; Maestro uses its default long-press duration instead of ${e}ms`}function k(e,t){let n=[];return typeof e.flags?.count==`number`&&e.flags.count>1&&n.push(`tap --count ${e.flags.count} is not represented by Maestro ${t}`),typeof e.flags?.intervalMs==`number`&&e.flags.intervalMs>0&&n.push(`tap --interval-ms ${e.flags.intervalMs} is not represented by Maestro ${t}`),n}function A(e,t){let[n,r]=e.positionals;if(!n||r===void 0)return{kind:`unsupported`,message:`fill requires a target and text`};let i=B(n,void 0,t);return i?r.length===0?{kind:`commands`,commands:[{tapOn:i},`eraseText`],warnings:[...N(n),`fill "" exports as tapOn + eraseText; Maestro erases at most its 50-character default`]}:{kind:`commands`,commands:[{tapOn:i},{inputText:r}],warnings:[...N(n),`fill exports as tapOn + inputText; Maestro may append text instead of replacing existing field contents`]}:{kind:`unsupported`,message:`fill target is not Maestro-compatible`}}function j(e){let[t]=e.positionals;if(t===void 0)return{kind:`unsupported`,message:`type requires text`};let n=G(t);return n===null?{kind:`commands`,commands:[{inputText:t}]}:{kind:`commands`,commands:[{eraseText:n}]}}function M(e,t){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`wait requires a target or duration`};if(Z(n))return{kind:`commands`,commands:[{waitForAnimationToEnd:{timeout:Number(n)}}],warnings:[`wait <ms> exports as waitForAnimationToEnd and may return before the full duration`]};if(n===`absent`)return{kind:`unsupported`,message:`strict wait absent requires zero selector matches and is unsupported by Maestro`};if(n===`text`&&r)return{kind:`commands`,commands:[{extendedWaitUntil:{visible:r,timeout:q(e,l.extendedWaitUntilTimeoutMs)}}]};let i=t(n);return i?{kind:`commands`,commands:[{extendedWaitUntil:{visible:i,timeout:q(e,l.extendedWaitUntilTimeoutMs)}}],warnings:N(n)}:{kind:`unsupported`,message:`wait selector is not Maestro-compatible`}}function N(e){return n(e,`label`)?[`label= selectors export as Maestro text; Maestro text matching is broader than agent-device label-only matching`]:[]}function P(e){let[t,n,r]=e.positionals;return t!==`text`||!n||!r?{kind:`unsupported`,message:`only find text <query> exists|missing exports to Maestro`}:r===`exists`?{kind:`commands`,commands:[{assertVisible:n}]}:r===`missing`||r===`not-exists`?{kind:`commands`,commands:[{assertNotVisible:n}]}:{kind:`unsupported`,message:`find text assertion "${r}" is unsupported`}}function F(e){let[t]=e.positionals;return t?{kind:`commands`,commands:[{takeScreenshot:t}]}:{kind:`unsupported`,message:`screenshot requires an output path`}}function I(e){let[t]=e.positionals;if(t&&t!==`down`)return{kind:`unsupported`,message:`scroll ${t} is not exported yet`};let n=typeof e.flags?.until==`string`?e.flags.until:void 0;return{kind:`commands`,commands:[`scroll`],warnings:n===void 0?[]:[`scroll --until ${n} is not represented by Maestro scroll`]}}function L(e){let t=R(e);if(!t)return{kind:`unsupported`,message:`only coordinate swipe exports to Maestro`};let n=z(e);if(n===null)return{kind:`unsupported`,message:`swipe count must be a positive integer`};let r=ee(e);return r?{kind:`unsupported`,message:r}:{kind:`commands`,commands:Array.from({length:n},()=>({swipe:t}))}}function R(e){let[t,n,r,i]=e.positionals;if(!(!Z(t)||!Z(n)||!Z(r)||!Z(i)))return{start:p(t,n),end:p(r,i),duration:100}}function z(e){let t=e.flags?.count??1;return Number.isInteger(t)&&t>=1?t:null}function ee(e){if(e.flags?.pauseMs!==void 0)return`swipe --pause-ms has no Maestro equivalent`;if(e.flags?.pattern&&e.flags.pattern!==`one-way`)return`swipe ping-pong pattern has no Maestro equivalent`}function B(e,t,n){return Z(e)&&Z(t)?{point:p(e,t)}:e.startsWith(`@`)?null:n(e)}function V(e){let t=U(e);return t?{ok:!1,message:t}:{ok:!0,options:H(e)}}function H(e){let t={};return typeof e.flags?.count==`number`&&e.flags.count>1&&(t.repeat=e.flags.count),typeof e.flags?.intervalMs==`number`&&e.flags.intervalMs>0&&(t.delay=e.flags.intervalMs),t}function U(e){if(e.flags?.jitterPx!==void 0)return`tap --jitter-px has no Maestro equivalent`;if(e.flags?.clickButton&&e.flags.clickButton!==`primary`)return`tap --button ${e.flags.clickButton} has no Maestro equivalent`}function W(e,t){return Object.keys(t).length===0?{tapOn:e}:typeof e==`string`?{tapOn:{text:e,...t}}:e&&typeof e==`object`&&!Array.isArray(e)?{tapOn:{...e,...t}}:{tapOn:e}}function G(e){return e.length===0||![...e].every(e=>e===`\b`)?null:e.length}function K(e,t,n,r){for(let i of t??[])e.warnings.push({line:r,action:X(n),message:i})}function q(e,t){let n=e.positionals.at(-1);return n&&Z(n)?Number(n):t}function J(e,t){return b(Object.keys(e).length>0?[e,t]:[t])}function Y(e){return e.map(e=>`line ${e.line} (${e.action}): ${e.message}`).join(`; `)}function X(e){return[e.command,...e.positionals??[]].join(` `).trim()}function Z(e){return e!==void 0&&Number.isFinite(Number(e))}const Q=async e=>{let{positionals:t}=e;return t[0]===`export`?await te(e):$(e)};function $({positionals:t,flags:n}){if(t.length>1)throw new e(`INVALID_ARGS`,`replay accepts exactly one input path: replay <path>`);if(n.out!==void 0)throw new e(`INVALID_ARGS`,`replay --out is only supported with replay export.`);return!1}async function te({positionals:t,flags:n}){ne(t,n);let c=t[1];if(!c)throw new e(`INVALID_ARGS`,`replay export requires an input path.`);let l=o(c),p=d.readFileSync(l,`utf8`),m=i(p),h=x(m.actions,{actionLines:m.actionLines,metadata:a(p),resolveSelector:e=>r(e,s)}),g=typeof n.out==`string`?o(n.out):void 0;g&&(d.mkdirSync(f.dirname(g),{recursive:!0}),d.writeFileSync(g,h.yaml));for(let e of h.warnings)process.stderr.write(`Warning: line ${e.line}: ${e.message}\n`);return await u(n,{format:`maestro`,sourcePath:l,...g?{path:g}:{yaml:h.yaml},warnings:h.warnings},()=>g??h.yaml),!0}function ne(t,n){if(t.length>2)throw new e(`INVALID_ARGS`,`replay export accepts exactly one input path: replay export <file.ad>`);if(n.replayUpdate)throw new e(`INVALID_ARGS`,`replay export does not support --update.`);if(n.replayMaestro)throw new e(`INVALID_ARGS`,`replay export reads .ad files; omit --maestro.`);if(n.replayEnv?.length)throw new e(`INVALID_ARGS`,`replay export does not evaluate --env substitutions.`)}export{Q as replayCommand};
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{F as t,I as n}from"./back-mode.js";import{L as r}from"./file.js";import{t as i}from"./shared.js";import a from"node:fs";import o from"node:path";const s=async e=>{let{positionals:t}=e;return t[0]===`export`?await l(e):c(e)};function c({positionals:t,flags:n}){if(t.length>1)throw new e(`INVALID_ARGS`,`replay accepts exactly one input path: replay <path>`);if(n.out!==void 0)throw new e(`INVALID_ARGS`,`replay --out is only supported with replay export.`);return!1}async function l({positionals:s,flags:c}){u(s,c);let l=s[1];if(!l)throw new e(`INVALID_ARGS`,`replay export requires an input path.`);let d=r(l),f=a.readFileSync(d,`utf8`),p=t(f),m=await(await import(`./replay-backend-registry.js`).then(e=>e.n)).getReplayBackend(`maestro`),h=m.exportReplayScript(p.actions,{actionLines:p.actionLines,metadata:n(f)}),g=typeof c.out==`string`?r(c.out):void 0;g&&(a.mkdirSync(o.dirname(g),{recursive:!0}),a.writeFileSync(g,h.yaml));for(let e of h.warnings)process.stderr.write(`Warning: line ${e.line}: ${e.message}\n`);return await i(c,{format:m.id,sourcePath:d,...g?{path:g}:{yaml:h.yaml},warnings:h.warnings},()=>g??h.yaml),!0}function u(t,n){if(t.length>2)throw new e(`INVALID_ARGS`,`replay export accepts exactly one input path: replay export <file.ad>`);if(n.replayUpdate)throw new e(`INVALID_ARGS`,`replay export does not support --update.`);if(n.replayMaestro)throw new e(`INVALID_ARGS`,`replay export reads .ad files; omit --maestro.`);if(n.replayEnv?.length)throw new e(`INVALID_ARGS`,`replay export does not evaluate --env substitutions.`)}export{s as replayCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./wait.js";const t=`replay_target_guard_mismatch`,n=e.landmarkIdentityMismatch;export{n,t};
|
package/dist/src/reporting.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{t}from"./
|
|
2
|
-
`)}function Se(e,t,n){let r=e.title?.trim(),
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{M as t}from"./command-metadata.js";import{n}from"./entities.js";import{r}from"./replay-divergence.js";import{t as i}from"./status-markers.js";import{n as a,t as o}from"./color.js";import s from"node:fs";import c from"node:os";import l from"node:path";import{pathToFileURL as u}from"node:url";const ee=[`onSuiteStart`,`onTestStart`,`onTestStep`,`onTestResult`,`onSuiteEnd`,`getExitCode`];async function te(e){let t=re(e.modulePath);return ae(await ne(await ie(t),e.modulePath)({spec:e.raw,modulePath:t}),e.modulePath)}function ne(t,n){let r=t.createReporter??t.default??t.reporter;if(!r)throw new e(`INVALID_ARGS`,`Custom test reporter ${n} must export default, createReporter, or reporter.`);return typeof r==`function`?r:()=>r}function re(e){if(e.startsWith(`file:`))return e;let t=e.startsWith(`~/`)?l.join(c.homedir(),e.slice(2)):e;return l.resolve(process.cwd(),t)}async function ie(t){try{return await(t.startsWith(`file:`)?import(t):import(u(t).href))}catch(n){let r=n instanceof Error?n.message:String(n);throw new e(`INVALID_ARGS`,`Failed to load custom test reporter ${t}: ${r}`)}}function ae(t,n){if(!t||typeof t!=`object`)throw new e(`INVALID_ARGS`,`Custom test reporter ${n} must export a reporter object or factory.`);let r=t;if(typeof r.name!=`string`||r.name.trim().length===0)throw new e(`INVALID_ARGS`,`Custom test reporter ${n} must define name.`);for(let t of ee)if(r[t]!==void 0&&typeof r[t]!=`function`)throw new e(`INVALID_ARGS`,`Custom test reporter ${n} ${t} must be a function.`);return r}function d(e){let t=Math.max(0,e)/1e3;return t>=10?`${t.toFixed(1)}s`:t>=1?`${t.toFixed(2)}s`:`${t.toFixed(3).replace(/0+$/,``).replace(/\.$/,``)}s`}function oe(e){if(e.status===`skipped`)return[];let t=p(e);return t.length===0?[]:[e.attempts>1?`steps (attempt ${e.attempts}):`:`steps:`,...t.map(({stop:e,start:t})=>_(e,t))]}function f(e){let t=p(e),n=t.findIndex(({stop:e})=>e.ok===!1);if(n<0)return[];let r=t.slice(Math.max(0,n-2),n+1);return[e.attempts>1?`steps (attempt ${e.attempts}):`:`steps:`,...r.map(({stop:e,start:t})=>_(e,t))]}function p(e){let t=ce(e);if(!t)return[];let n=le(t);if(n.length===0)return[];let r=[],i=[];for(let e of n){if(ue(e)){r.push(e);continue}de(e)&&i.push({stop:e,start:se(r,e)})}return i}function se(e,t){let n=t.command,r=e.findIndex(e=>e.step===t.step&&(n===void 0||e.command===void 0||e.command===n));if(!(r<0))return e.splice(r,1)[0]}function ce(e){return e.artifactsDir?l.join(e.artifactsDir,`attempt-${e.attempts}`,`replay-timing.ndjson`):void 0}function le(e){try{return s.readFileSync(e,`utf8`).split(/\r?\n/).filter(e=>e.trim().length>0).flatMap(e=>{try{let t=JSON.parse(e);return v(t)?[t]:[]}catch{return[]}})}catch{return[]}}function ue(e){return e.type===`replay_action_start`&&m(e)&&h(e,`line`)&&g(e,`command`)&&(e.positionals===void 0||Array.isArray(e.positionals))}function de(e){return pe([e.type===`replay_action_stop`&&m(e)&&h(e,`line`)&&g(e,`command`),fe(e,`ok`),h(e,`durationMs`),g(e,`errorCode`),e.resultTiming===void 0||v(e.resultTiming)])}function m(e){return typeof e.step==`number`}function h(e,t){return e[t]===void 0||typeof e[t]==`number`}function g(e,t){return e[t]===void 0||typeof e[t]==`string`}function fe(e,t){return e[t]===void 0||typeof e[t]==`boolean`}function pe(e){return e.every(Boolean)}function _(e,t){return` ${e.ok===!1?`[FAIL] `:e.ok===!0?``:`[info] `}${he(t,e)}${me(e,t)}`}function me(e,t){let n=t?.line??e.line,r=[typeof n==`number`?`line ${n}`:``,typeof e.durationMs==`number`?d(e.durationMs):``,e.errorCode??``,e.resultTiming?`timing ${JSON.stringify(e.resultTiming)}`:``].filter(Boolean);return r.length>0?` (${r.join(`, `)})`:``}function he(e,t){return[ge(e?.command??t.command),...(e?.positionals??[]).map(_e)].join(` `)}function ge(e){return e??`unknown`}function _e(e){return typeof e==`string`?JSON.stringify(e):typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function v(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}const y={interval:80,frames:[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`]},ve=y.interval;function ye(e={}){let t=new Set,n=!1,r=0,i=0,a=()=>{t.clear(),n=!1,r=0},o=t=>{if(!e.liveProgress)return;let a=be(i);i+=1;let o=Se(t.test,e,a),s=D(n?r:0,e.columns,e.terminalReflowsOnResize!==!1);return n=!0,r=A(o),{text:`${s}${o}`,newline:!1}},s=i=>{if(je(i.test)){let e=Me(i.test);if(t.has(e))return;t.add(e)}let a=xe(i.test,e);if(!a)return;let o=n?`${D(r,e.columns,e.terminalReflowsOnResize!==!1)}${a}`:a;return n=!1,r=0,{text:o,newline:!0}};return{render(e){if(e.type===`suite-start`){a();return}return e.type===`test-step`?o(e):e.type===`test-result`?s(e):void 0}}}function be(e){return y.frames[e%y.frames.length]??y.frames[0]}function xe(e,t={}){if(e.status===`fail`&&e.retrying)return;let n=[S(e)];return Te(n,e,t),t.verbose&&n.push(...Ie(e)),n.join(`
|
|
2
|
+
`)}function Se(e,t,n){let r=e.title?.trim(),i=l.basename(e.file),o=a(process.stderr),s=Ce(n,{useColor:o}),c=`${E(e,{useColor:o})}${we(e,{useColor:o})}`,u=`${s} `;return k(r?`${u}${k(r,Math.max(0,O(t.columns)-A(u)-A(c)))}${c}`:`${u}${i}${c}`,t.columns)}function Ce(e,t={}){return t.useColor?T(e,`blue`):e}function we(e,t={}){let n=`${e.stepIndex??0}/${e.stepTotal??0}`,r=e.stepCommand?.trim(),i=e.stepValue?.trim();if(!t.useColor)return` [${[n,r,i].filter(Boolean).join(` `)}]`;let a=T(`[`,`dim`),o=T(`]`,`dim`);return` ${a}${[T(n,`dim`),r?T(r,`magenta`):``,i?T(i,`green`):``].filter(Boolean).join(` `)}${o}`}function Te(e,t,n){if(Ee(t,n))return;let r=De(t),i=Oe(t);r&&e.push(r),i&&e.push(i),b(e,t),e.push(...x(t))}function Ee(e,t){return t.verbose===!0&&e.status===`fail`}function De(e){return e.status===`fail`&&e.title?.trim()?` file: ${l.basename(e.file)}`:void 0}function Oe(e){let t=e.message?.replaceAll(/\s+/g,` `).trim();if(t)return` ${e.status===`fail`?`failed at: ${t}`:t}`}function b(e,t){let n=t.hint?.replaceAll(/\s+/g,` `).trim();t.status===`fail`&&n&&e.push(` hint: ${n}`)}function x(e){if(e.status!==`fail`||e.retrying)return[];let t=[];return e.session&&t.push(` session: ${e.session}`),e.artifactsDir&&t.push(` artifacts: ${e.artifactsDir}`),t}function S(e){let t=a(process.stderr);return`${w(e)} ${C(e)}${E(e,{useColor:t})}${e.durationMs===void 0?``:` ${Ae(e,{useColor:t})}`}`}function C(e){let t=e.title?.trim(),n=l.basename(e.file);return t||n}function w(e){return e.status===`pass`?i(`pass`,{passFormat:e.attempt&&e.attempt>1?`yellow`:`green`}):i(e.status===`fail`?`fail`:`skip`)}function T(e,t){return o(e,t,{validateStream:!1})}function E(e,t={}){if(typeof e.shardIndex!=`number`)return``;let n=typeof e.shardCount==`number`?e.shardCount:`?`,r=ke(e),i=` [${e.shardIndex+1}/${n}${r?` ${r}`:``}]`;return t.useColor?T(i,`dim`):i}function ke(e){return e.deviceName?.trim()||e.deviceId?.trim()||void 0}function Ae(e,t={}){let n=d(e.durationMs??0);return t.useColor?T(n,`yellow`):n}function je(e){return e.status===`pass`||e.status===`skip`||e.status===`fail`&&!e.retrying}function Me(e){let t=typeof e.shardIndex==`number`?e.shardIndex:``;return[e.status,e.index,e.total,e.file,e.title??``,t].join(`\0`)}function D(e,t,n){let r=n?Math.max(1,Math.ceil(e/O(t))):1,i=`\r\x1B[2K`;for(let e=1;e<r;e+=1)i+=`\x1B[1A\r\x1B[2K`;return i}function O(e){let t=typeof e==`function`?e():e;return typeof t==`number`&&Number.isFinite(t)&&t>0?Math.floor(t):80}function k(e,t){let n=O(t);return A(e)<=n?e:n<=0?``:n<=3?`.`.repeat(n):`${Pe(e,n-3)}...${Ne(e)?`\x1B[0m`:``}`}function A(e){let t=0;for(let n=0;n<e.length;){let r=j(e,n);if(r){n+=r.length;continue}t+=1,n+=1}return t}function Ne(e){return e.includes(`\x1B[`)}function Pe(e,t){if(t<=0)return``;let n=0,r=``;for(let i=0;i<e.length&&n<t;){let t=j(e,i);if(t){r+=t,i+=t.length;continue}r+=e[i],i+=1,n+=1}return r}function j(e,t){if(!e.startsWith(`\x1B[`,t))return null;for(let n=t+2;n<e.length;n+=1)if(Fe(e.charCodeAt(n)))return e.slice(t,n+1);return null}function Fe(e){return e>=64&&e<=126}function Ie(e){return e.status!==`pass`&&e.status!==`fail`||!e.artifactsDir||!e.attempt?[]:oe(e.status===`pass`?Le(e):Re(e)).map(e=>` ${e}`)}function Le(e){return{...M(e),status:`passed`,replayed:0,healed:0}}function Re(e){return{...M(e),status:`failed`,error:{code:`COMMAND_FAILED`,message:e.message??`Unknown test failure`}}}function M(e){return{file:e.file,title:e.title,durationMs:e.durationMs??0,attempts:e.attempt??1,artifactsDir:e.artifactsDir,session:e.session??``}}function N(e){return+(e.failed>0)}function ze(e){return e.status===`failed`}function P(e){return e.status===`passed`&&e.attempts>1}function F(e){let t=G(e),n=l.basename(e.file);return`${t&&t.length>0?t:n}${K(e)}`}function Be(e){return`${G(e)??l.basename(e.file)}${K(e)}`}function I(e,t){return`artifactsDir`in e&&e.artifactsDir?`${t}: ${e.artifactsDir}`:void 0}function Ve(e){return G(e)?`file: ${l.basename(e.file)}`:void 0}function L(e){return e.hint?`hint: ${e.hint}`:void 0}function R(e,t){return e.diagnosticId?`${t}: ${e.diagnosticId}`:void 0}function z(e,t){return e.logPath?`${t}: ${e.logPath}`:void 0}function B(e,t,n={}){n.includeMessage&&e.push(`errorMessage: ${t.message}`),U(e,L(t)),U(e,R(t,`diagnosticId`)),U(e,z(t,`logPath`)),n.includeDetails!==!1&&V(e,t,n.detailsIndent)}function V(e,t,n){let r=t.details?JSON.stringify(t.details,null,n):void 0;r&&e.push(`details: ${r}`)}function He(e,t){!(`shardIndex`in t)||typeof t.shardIndex!=`number`||(e.push(`shardIndex: ${t.shardIndex}`),U(e,typeof t.shardCount==`number`?`shardCount: ${t.shardCount}`:void 0),U(e,typeof t.deviceId==`string`?`deviceId: ${t.deviceId}`:void 0),U(e,typeof t.deviceName==`string`?`deviceName: ${t.deviceName}`:void 0))}function H(e){return((`warnings`in e?e.warnings:void 0)??[]).map(e=>`warning: ${t(e)}`)}function U(e,t){t&&e.push(t)}function W(e){return(Math.max(0,e)/1e3).toFixed(3)}function Ue(e){return e!==void 0}function G(e){let t=e.title?.trim();return t&&t.length>0?t:void 0}function K(e){if(!(`shardIndex`in e)||typeof e.shardIndex!=`number`)return``;let t=typeof e.shardCount==`number`?e.shardCount:`?`,n=We(e);return` [${e.shardIndex+1}/${t}${n?` ${n}`:``}]`}function We(e){return(`deviceName`in e?e.deviceName?.trim():void 0)||(`deviceId`in e?e.deviceId?.trim():void 0)||void 0}function Ge(){let e,t,n,r=!1,i=(n,r)=>{o(),t=n.type===`test-step`?n:void 0,e??=ye({verbose:r.verbose,liveProgress:q(r),columns:()=>r.stderr.columns,terminalReflowsOnResize:Ke()});let i=e.render(n);i&&(r.stderr.write(i.newline?`${i.text}\n`:i.text),n.type===`test-step`&&q(r)&&a(r))},a=r=>{n||!t||(n=setInterval(()=>{if(!t)return;let n=e?.render(t);n&&r.stderr.write(n.newline?`${n.text}\n`:n.text)},ve),n.unref?.())},o=()=>{n&&=(clearInterval(n),void 0)},s=e=>{r||!q(e)||(e.stderr.write(`\x1B[?25l`),r=!0)},c=e=>{r&&=(e.stderr.write(`\x1B[?25h`),!1)};return{name:`default`,onSuiteStart:(e,t)=>{s(t),i({type:`suite-start`,suite:e},t)},onTestStep:(e,t)=>{i({type:`test-step`,test:e},t)},onTestResult:(e,t)=>{i({type:`test-result`,test:e},t)},onSuiteEnd:(e,n)=>{o(),t=void 0,c(n),qe(e,n)},getExitCode:N}}function q(e){return e.stderr.isTTY&&!process.env.CI}function Ke(){return!process.env.TMUX&&!process.env.STY}function qe(e,t){let n=e.tests.filter(P);t.stdout.write(`${Ye(e,n.length)}\n`),Je(e.tests,t),nt(e.tests.filter(ze),t),tt(n,t)}function Je(e,t){let n=e.map(e=>({result:e,lines:H(e)})).filter(e=>e.lines.length>0);if(n.length!==0){t.stdout.write(`
|
|
3
3
|
`),t.stdout.write(`Warnings:
|
|
4
|
-
`);for(let{result:e,lines:r}of n)for(let n of r)t.stdout.write(` ${F(e)}: ${n}\n`)}}function Ye(e,t){let n=typeof e.durationMs==`number`?e.durationMs:void 0,r=
|
|
4
|
+
`);for(let{result:e,lines:r}of n)for(let n of r)t.stdout.write(` ${F(e)}: ${n}\n`)}}function Ye(e,t){let n=typeof e.durationMs==`number`?e.durationMs:void 0,r=a();return`Test summary: ${Xe(e.passed,{useColor:r})} ${Ze(e.total,{useColor:r})}${e.failed>0?`, ${e.failed} failed`:``}${t>0?`, ${t} flaky`:``}${n===void 0?``:` in ${Qe(n,{useColor:r})}`}`}function Xe(e,t={}){let n=`${e} passed`;return t.useColor?o(n,`green`):n}function Ze(e,t={}){let n=`(${e})`;return t.useColor?o(n,`dim`):n}function Qe(e,t={}){let n=d(e);return t.useColor?o(n,`yellow`):n}function $e(){return a()?o(`✓`,`yellow`):`✓`}function et(e){return[L(e.error),I(e,`artifacts`),z(e.error,`log`),R(e.error,`diagnostic`)].filter(Ue)}function tt(e,t){if(e.length!==0){t.stdout.write(`
|
|
5
5
|
`),t.stdout.write(`Flaky tests:
|
|
6
6
|
`);for(let n of e){t.stdout.write(` ${$e()} ${F(n)} after ${n.attempts} attempts${at(n)}\n`);for(let e of n.attemptFailures??[]){let n=typeof e.durationMs==`number`?` (${d(e.durationMs)})`:``;t.stdout.write(` attempt ${e.attempt} failed${n}: ${e.message}\n`)}}}}function nt(e,t){if(e.length!==0){t.stdout.write(`
|
|
7
7
|
`),t.stdout.write(`Failures:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{L as e,P as t}from"./sdk-contracts.js";const n=new Set,r=new Map;function i(e,t){if(typeof e==`string`&&e.length>0)return e;let n=(typeof t==`string`?t:typeof t==`number`&&Number.isFinite(t)?String(t):`generated`).trim().replaceAll(/[^a-zA-Z0-9_-]/g,`_`).slice(0,32)||`generated`,r=Math.random().toString(36).slice(2,10);return`req:${n}:${process.pid}:${Date.now()}:${r}`}const a=5e4,o=1e4;function s(e){if(e.size<=a)return;let t=0;for(let n of e.keys()){if(t>=o)break;e.delete(n),t++}}function c(e){if(e.size<=a)return;let t=0;for(let n of e){if(t>=o)break;e.delete(n),t++}}function l(e){if(!e)return;if(r.has(e))throw new t(`INVALID_ARGS`,`Request ID is already in flight: ${e}`,{requestId:e,reason:`duplicate_request_id`});s(r);let i=new AbortController;return r.set(e,i),n.has(e)&&i.abort(),{requestId:e,controller:i}}function u(t){t&&(c(n),n.add(t),r.get(t)?.abort(e()))}function d(e,t){e&&(t&&(t.requestId!==e||r.get(e)!==t.controller)||(n.delete(e),r.delete(e)))}function f(e){e&&d(e.requestId,e)}function p(e){return e?n.has(e):!1}function m(e){if(e)return r.get(e)?.signal}function h(t){if(p(t))throw e()}export{u as a,h as c,p as i,d as n,l as o,m as r,i as s,f as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./process.js";import{t as e}from"./platform-runtime-android-mechanics.js";import{r as t,t as n}from"./register-builtins.js";function r(e={}){let t=e.providers??{},n=s(t);return Object.freeze({hasConfiguredResolvers:n,run:async(n,r)=>{let a=o(await i(t,e.defaultWebProvider,n),n),s={androidAdbExecutor:a.androidAdb?.executor};return await d(await l(a),async()=>await r(s))}})}async function i(e,t,n){if(e.webProvider||!n.useDefaultWebProvider||!t)return e;let{createAgentBrowserWebProvider:r}=await import(`./
|
|
1
|
+
import"./process.js";import{t as e}from"./platform-runtime-android-mechanics.js";import{r as t,t as n}from"./register-builtins.js";function r(e={}){let t=e.providers??{},n=s(t);return Object.freeze({hasConfiguredResolvers:n,run:async(n,r)=>{let a=o(await i(t,e.defaultWebProvider,n),n),s={androidAdbExecutor:a.androidAdb?.executor};return await d(await l(a),async()=>await r(s))}})}async function i(e,t,n){if(e.webProvider||!n.useDefaultWebProvider||!t)return e;let{createAgentBrowserWebProvider:r}=await import(`./src2.js`).then(e=>e.i),i=await r({session:n.session?.name??n.requestedSession,stateDir:t.stateDir,openWebSessionNames:t.openWebSessionNames,ownedProcessRecords:t.ownedProcessRecords});return{...e,webProvider:()=>i}}const a=[{resolverKey:`androidAdbProvider`,resolve(e,t){let n=e.androidAdbProvider;if(!n||!c(`androidAdbProvider`,t.device))return{};let r=n(t);return{androidAdb:{provider:r,executor:typeof r==`function`?r:r?.exec,serial:t.device.id}}},async appendWrapper(t,n){if(!t.androidAdb?.provider)return;let{withAndroidAdbProvider:r}=await e();u(n,t.androidAdb,(e,n)=>r(e,{serial:t.androidAdb?.serial??``},n))}},{resolverKey:`appleRunnerProvider`,resolve(e,t){let n=e.appleRunnerProvider;return!n||!c(`appleRunnerProvider`,t.device)?{}:{appleRunner:{provider:n(t),deviceId:t.device.id,requestId:t.requestId}}},async appendWrapper(e,t){if(!e.appleRunner?.provider)return;let{withAppleRunnerProvider:n}=await import(`./runner.js`).then(e=>e.t),r=e.appleRunner;t.push(async e=>await n(r.provider,{deviceId:r.deviceId??``,requestId:r.requestId},e))}},{resolverKey:`appleToolProvider`,resolve(e,t){let n=e.appleToolProvider;return!n||!c(`appleToolProvider`,t.device)?{}:{appleTool:{provider:n(t)}}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:n}=await import(`./tool-provider-facade.js`);u(t,e.appleTool,n)}},{resolverKey:`vegaToolProvider`,resolve(e,t){let n=e.vegaToolProvider;return!n||!c(`vegaToolProvider`,t.device)?{}:{vegaTool:{provider:n(t)}}},async appendWrapper(e,t){if(!e.vegaTool?.provider)return;let{withVegaToolProvider:n}=await import(`./platform-runtime.js`).then(e=>e.G);u(t,e.vegaTool,n)}},{resolverKey:`linuxToolProvider`,resolve(e,t){let n=e.linuxToolProvider;return!n||!c(`linuxToolProvider`,t.device)?{}:{linuxTool:{provider:n(t)}}},async appendWrapper(e,t){if(!e.linuxTool?.provider)return;let{withLinuxToolProvider:n}=await import(`./platform-runtime.js`).then(e=>e.S);u(t,e.linuxTool,n)}},{resolverKey:`webProvider`,resolve(e,t){let n=e.webProvider;return!n||!c(`webProvider`,t.device)?{}:{web:{provider:n(t)}}},async appendWrapper(e,t){if(!e.web?.provider)return;let{withWebProvider:n}=await import(`./src2.js`).then(e=>e.i);u(t,e.web,n)}},{resolverKey:`appleRunnerScreenRecordingTransport`,resolve(e,t){let n=e.appleRunnerScreenRecordingTransport;return n?{appleRunnerScreenRecording:{provider:n(t)}}:{}},async appendWrapper(e,t){let n=e.appleRunnerScreenRecording?.provider;if(!n&&!e.appleRunner?.provider)return;let{withAppleRunnerScreenRecordingTransport:r}=await import(`./platform-runtime-screen-recording-apple-runner-transport.js`);t.push(async e=>await r(n,e))}},{resolverKey:`appleSimulatorScreenRecordingTransport`,resolve(e,t){let n=e.appleSimulatorScreenRecordingTransport;return n?{appleSimulatorScreenRecording:{provider:n(t)}}:{}},async appendWrapper(e,t){let n=e.appleSimulatorScreenRecording?.provider;if(!n&&!e.appleRunner?.provider)return;let{withAppleSimulatorScreenRecordingTransport:r}=await import(`./platform-runtime-screen-recording-apple-transport.js`);t.push(async e=>await r(n,e))}}];function o(e,t){return a.reduce((n,r)=>({...n,...r.resolve(e,t)}),{})}function s(e){return a.some(t=>!!e[t.resolverKey])}function c(e,n){return t(n.platform)?.providers?.platformGatedResolvers.includes(e)??!1}n();async function l(e){let t=[];for(let n of a)await n.appendWrapper(e,t);return t}function u(e,t,n){let r=t?.provider;r&&e.push(async e=>await n(r,e))}async function d(e,t){let n=t;for(let t of[...e].reverse()){let e=n;n=async()=>await t(e)}return await n()}export{r as createComposedRequestPlatformProviders};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{U as e}from"./sdk-contracts.js";import{N as t,P as n}from"./sdk-device.js";import{Xt as r}from"./sdk-batch.js";import{o as i}from"./version.js";import{n as a}from"./provider-device-admission.js";import{t as o}from"./async-lifecycle.js";const s=i({ttlMs:5e3});async function c(e,t){if(a(e))return;let n=u(e);s.get(n)!==!0&&await t.ensureLocalDeviceReady(e)&&l(n)}function l(e){s.set(e,!0)}function u(e){let t=e.kind===`simulator`?e.simulatorSetPath??``:``;return JSON.stringify([e.platform,e.kind,e.id,e.target??``,t])}const d=Object.freeze({acceptAlert:`mutates`,actionButton:`mutates`,appLogCleanup:`repeatable`,appLogDoctor:`repeatable`,appLogInspect:`repeatable`,appLogReattach:`repeatable`,appLogStart:`repeatable`,appState:`repeatable`,appSwitcher:`mutates`,applyRuntimeHints:`mutates`,audioProbeCleanup:`repeatable`,audioProbeQuery:`repeatable`,audioProbeReattach:`repeatable`,audioProbeStart:`repeatable`,awaitAlert:`repeatable`,back:`mutates`,bootTarget:`mutates`,bootTargetHeadless:`mutates`,captureScreenshot:`repeatable`,captureSnapshot:`repeatable`,captureSnapshotWithCustomActions:`repeatable`,captureSnapshotWithoutActiveApp:`repeatable`,clearRuntimeHints:`mutates`,closeApplication:`mutates`,configureProviderPortReverse:`repeatable`,deployApp:`mutates`,deployMaterializedApp:`mutates`,dismissAlert:`mutates`,ensureReady:`repeatable`,fillPoint:`mutates`,fillRef:`mutates`,finalizeApplicationClose:`mutates`,findText:`repeatable`,focusPoint:`mutates`,gestureViewport:`repeatable`,home:`mutates`,hoverPoint:`mutates`,hoverRef:`mutates`,keyboardDismiss:`mutates`,keyboardEnter:`mutates`,keyboardStatus:`repeatable`,listApps:`repeatable`,longPressPoint:`mutates`,materializeAppSource:`repeatable`,networkDump:`repeatable`,openApplication:`mutates`,perfFrames:`repeatable`,perfMemorySample:`repeatable`,perfMemorySnapshot:`repeatable`,perfNativeCaptureCleanup:`repeatable`,perfNativeCaptureReattach:`repeatable`,perfNativeCaptureStart:`repeatable`,perfProfileReport:`repeatable`,performDirectionalFlingPlan:`mutates`,performGesturePlan:`mutates`,performMultiTouchGesturePlan:`mutates`,performTargetAuthoredDrag:`mutates`,prepareAppleRunner:`repeatable`,prepareApplicationOpen:`repeatable`,readAlert:`repeatable`,readClipboard:`repeatable`,readSetting:`repeatable`,readTextAtPoint:`repeatable`,resolveOpenTarget:`repeatable`,screenRecordingCleanup:`repeatable`,screenRecordingReattach:`repeatable`,screenRecordingStart:`repeatable`,scrollDirection:`mutates`,sendPushNotification:`mutates`,setFoldPose:`mutates`,setOrientation:`mutates`,setSetting:`mutates`,setViewport:`mutates`,shutdownTarget:`mutates`,tapElementSelector:`mutates`,tapPoint:`mutates`,tapRef:`mutates`,triggerAppEvent:`mutates`,tvRemote:`mutates`,typeText:`mutates`,writeClipboard:`mutates`});function f(){return{dispatchedSteps:0}}function p(e){return e.internal?.dispatchLedger??f()}function m(e,t){let n={};for(let[r,i]of Object.entries(e.operations))n[r]=typeof i==`function`&&d[r]===`mutates`?h(i,t):i;return Object.freeze({...e,operations:Object.freeze(n)})}function h(e,t){return(...n)=>{let r=e(...n);return r instanceof Promise?r.then(e=>(t.dispatchedSteps+=1,e)):(t.dispatchedSteps+=1,r)}}function g(e,t){return async n=>{let r=f(),i=await e({...n,internal:{...n.internal,dispatchLedger:r}});return t.dispatchedSteps+=r.dispatchedSteps,i.ok||r.dispatchedSteps===0?i:_(i,r.dispatchedSteps)}}function _(e,t){let{dispatchedSteps:n,...r}=e.error.details??{},i=typeof n==`number`?n-t:0;return{...e,error:{...e.error,details:i>0?{...r,dispatchedSteps:i}:r}}}async function v(e,t){switch(e.owner.kind){case`provider-runtime`:return;case`local-family`:await c(e.device,t)}}function y(e){let i=new o,a=new Map,s=async t=>(await e.admitDeviceClaim(t.device,t.owner),t);return{inspectFacts:async t=>(e.admitDevice?.(t),await e.gateway.inspectFacts(t)),bindDevice:async(o,c)=>{e.admitDevice?.(o);let l=n(t(o)),u=a.get(l);return u||(u=e.gateway.bind({device:o,intent:{kind:`ordinary`},scope:e.scope}).then(e=>i.use(e)).then(s),a.set(l,u),u.catch(()=>{a.get(l)===u&&a.delete(l)})),m(r(await u,c),e.dispatchLedger)},bindExactDevice:async(t,n,a,o,c)=>{e.admitDevice?.(t);let l={kind:`exact-owner`,owner:n,fence:a},u=await e.gateway.bind({device:t,intent:l,scope:c}),d=await b(i,u,c),f=await s(d);return m(r(f,o),e.dispatchLedger)},[Symbol.asyncDispose]:async()=>{await i[Symbol.asyncDispose]()}}}async function b(t,n,r){try{return t.use(n)}catch(t){try{await n[Symbol.asyncDispose]()}catch(n){r.diagnostics.emit({level:`error`,phase:`request_runtime_late_binding_cleanup_failed`,data:{error:e(n),primaryError:e(t)}})}throw t}}export{p as i,v as n,g as r,y as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{H as t,U as n}from"./tv-remote.js";import{t as r}from"./snapshot-capture-annotations.js";import{b as i}from"./sdk-device.js";import{n as a,t as o}from"./deploy-result-target.js";var s=e({serializeCloseResult:()=>_,serializeDeployResult:()=>p,serializeDevice:()=>d,serializeInstallFromSourceResult:()=>m,serializeOpenResult:()=>h,serializeSessionListEntry:()=>u,serializeSnapshotResult:()=>f});function c(e,t={}){let n=t.includeSerial??!0,r=l(e);return{platform:e.platform,target:e.target,device:e.name,id:e.id,...e.platform===`ios`?{device_udid:e.ios?.udid??e.id,ios_simulator_device_set:e.ios?.simulatorSetPath??null}:{},...n&&r?{serial:r}:{}}}function l(e){return i(e.platform)?e.identifiers.serial??e.id:void 0}function u(e){return{name:e.name,...e.address?{address:e.address}:{},...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...c(e.device,{includeSerial:!1}),createdAt:e.createdAt}}function d(e){return{platform:e.platform,...e.appleOs?{appleOs:e.appleOs}:{},id:e.id,name:e.name,kind:e.kind,target:e.target,...e.model?{model:e.model}:{},...e.osVersion?{osVersion:e.osVersion}:{},...typeof e.booted==`boolean`?{booted:e.booted}:{},...e.claimedBy?{claimedBy:e.claimedBy}:{}}}function f(e){return{nodes:e.nodes,...e.truncated===void 0?{}:{truncated:e.truncated},...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.visibility?{visibility:e.visibility}:{},...e.keyboard?{keyboard:e.keyboard}:{},...e.viewport?{viewport:e.viewport}:{},...r({...e,...e.snapshotQuality?{quality:e.snapshotQuality}:{}}),...e.unchanged?{unchanged:e.unchanged}:{},...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{},...e.fallbackScreenshotPath?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...e.refsGeneration===void 0?{}:{refsGeneration:e.refsGeneration}}}function p(e){return n({app:e.app,appPath:e.appPath,platform:e.platform,...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.package?{package:e.package}:{}},`Installed: ${o(e)}`)}function m(e){return n({launchTarget:e.launchTarget,...e.appName?{appName:e.appName}:{},...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.packageName?{package:e.packageName}:{},...e.installablePath?{installablePath:e.installablePath}:{},...e.archivePath?{archivePath:e.archivePath}:{},...e.materializationId?{materializationId:e.materializationId}:{},...e.materializationExpiresAt?{materializationExpiresAt:e.materializationExpiresAt}:{}},`Installed: ${a(e)}`)}function h(e){let t=e.appName??e.appBundleId??e.session;return n({session:e.session,...e.warnings?.length?{warnings:e.warnings}:{},...g(e),...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.selection?{selection:e.selection}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?c(e.device):{},...e.launchConfirmation?{launchConfirmation:e.launchConfirmation}:{},...e.snapshot?{snapshot:e.snapshot}:{},...e.initialSnapshotError?{initialSnapshotError:e.initialSnapshotError}:{}},t?`Opened: ${t}`:`Opened`)}function g(e){return{...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...e.requestLogPath?{requestLogPath:e.requestLogPath}:{},...e.eventLogPath?{eventLogPath:e.eventLogPath}:{}}}function _(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...`provider`in e&&e.provider?{provider:e.provider}:{},...t(e.session?`Closed: ${e.session}`:`Closed`)}}export{d as n,s as t};
|
package/dist/src/retry.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{L as e,P as t}from"./sdk-contracts.js";import{r as n}from"./diagnostics.js";function r(e){return[`1`,`true`,`yes`,`on`].includes((e??``).trim().toLowerCase())}const i={maxAttempts:3,baseDelayMs:200,maxDelayMs:2e3,jitter:.2};var a=class e{startedAtMs;expiresAtMs;constructor(e,t){this.startedAtMs=e,this.expiresAtMs=e+Math.max(0,t)}static fromTimeoutMs(t,n=Date.now()){return new e(n,t)}remainingMs(e=Date.now()){return Math.max(0,this.expiresAtMs-e)}elapsedMs(e=Date.now()){return Math.max(0,e-this.startedAtMs)}isExpired(e=Date.now()){return this.remainingMs(e)<=0}};async function o(n,r={},a={}){let o={maxAttempts:r.maxAttempts??i.maxAttempts,baseDelayMs:r.baseDelayMs??i.baseDelayMs,maxDelayMs:r.maxDelayMs??i.maxDelayMs,jitter:r.jitter??i.jitter,shouldRetry:r.shouldRetry},d=!1,f;for(let t=1;t<=o.maxAttempts;t+=1){if(a.signal?.aborted)throw e();if(a.deadline?.isExpired()&&t>1)break;try{let e=await n({attempt:t,maxAttempts:o.maxAttempts,deadline:a.deadline});return a.onEvent?.({phase:a.phase,event:`succeeded`,attempt:t,maxAttempts:o.maxAttempts,elapsedMs:a.deadline?.elapsedMs(),remainingMs:a.deadline?.remainingMs()}),u({phase:a.phase,event:`succeeded`,attempt:t,maxAttempts:o.maxAttempts,elapsedMs:a.deadline?.elapsedMs(),remainingMs:a.deadline?.remainingMs()}),e}catch(e){f=e;let n=a.classifyReason?.(e),r={phase:a.phase,event:`attempt_failed`,attempt:t,maxAttempts:o.maxAttempts,elapsedMs:a.deadline?.elapsedMs(),remainingMs:a.deadline?.remainingMs(),reason:n};if(a.onEvent?.(r),u(r),t>=o.maxAttempts||o.shouldRetry&&!o.shouldRetry(e,t))break;let i=c(o.baseDelayMs,o.maxDelayMs,o.jitter,t),p=a.deadline?Math.min(i,a.deadline.remainingMs()):i;if(p<=0)break;let m={phase:a.phase,event:`retry_scheduled`,attempt:t,maxAttempts:o.maxAttempts,delayMs:p,elapsedMs:a.deadline?.elapsedMs(),remainingMs:a.deadline?.remainingMs(),reason:n};a.onEvent?.(m),u(m),a.retryWakeSignal&&!d?d=await s(p,a.signal,a.retryWakeSignal)===`signaled`:await l(p,a.signal)}}let p={phase:a.phase,event:`exhausted`,attempt:o.maxAttempts,maxAttempts:o.maxAttempts,elapsedMs:a.deadline?.elapsedMs(),remainingMs:a.deadline?.remainingMs(),reason:a.classifyReason?.(f)};throw a.onEvent?.(p),u(p),f||new t(`COMMAND_FAILED`,`retry failed`)}function s(e,t,n){return new Promise(r=>{let i=!1,a=e=>{i||(i=!0,clearTimeout(o),t?.removeEventListener(`abort`,s),n.removeEventListener(`abort`,c),r(e))},o=setTimeout(()=>a(`delay`),e),s=()=>a(`delay`),c=()=>a(`signaled`);if(t?.addEventListener(`abort`,s,{once:!0}),n.addEventListener(`abort`,c,{once:!0}),t?.aborted){a(`delay`);return}n.aborted&&a(`signaled`)})}function c(e,t,n,r){let i=Math.min(t,e*2**(r-1)),a=i*n;return Math.max(0,i+(Math.random()*2-1)*a)}function l(e,t){return new Promise(n=>{if(t?.aborted){n();return}let r=!1,i=()=>{r||(r=!0,t&&t.removeEventListener(`abort`,o),n())},a=setTimeout(i,e);function o(){clearTimeout(a),i()}t&&t.addEventListener(`abort`,o,{once:!0})})}function u(e){n({level:e.event===`attempt_failed`||e.event===`exhausted`?`warn`:`debug`,phase:`retry`,data:{...e}})}export{l as i,r as n,o as r,a as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{i as t,n,r,t as i}from"./retry.js";var a=e({Deadline:()=>i,isEnvTruthy:()=>n,retryWithPolicy:()=>r,sleep:()=>t});export{a as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"node:crypto";import t from"node:fs";import n from"node:path";const r=134217728,i=4095;function a(e,t,n){let r=_(e);if(r===null)return{ok:!1,refusal:{reason:`root_unusable`,path:e}};let i=o(e,t,r);if(`reason`in i)return{ok:!1,refusal:i};let a=c(n,e,r);if(!a.ok)return{ok:!1,refusal:a.refusal};let s=[];for(let e of a.roots){let t=h(r,e,a.roots);if(!t.ok)return{ok:!1,refusal:t.refusal};s.push(...t.entries)}return s.length===0?{ok:!1,refusal:{reason:`root_unusable`,path:n.join(`, `)}}:(s.sort((e,t)=>e.path.localeCompare(t.path)),{ok:!0,artifacts:{xctestrunPath:t,xctestrunSize:i.size,xctestrunDigest:i.digest,productPaths:[...n],entries:s}})}function o(e,t,n){let r=g(e,t)??t,i=_(t);return i===null?{reason:`root_unusable`,path:r}:N(i,n)?s(t)?v(t)??{reason:`root_unusable`,path:r}:{reason:`root_unusable`,path:r}:{reason:`root_escapes_cache`,path:r,target:i}}function s(e){try{return t.lstatSync(e).isFile()}catch{return!1}}function c(e,t,n){let r=[];for(let i of e){let e=_(i);if(e===null)return{ok:!1,refusal:C(t,i)};if(!N(e,n))return{ok:!1,refusal:{reason:`root_escapes_cache`,path:g(t,i)??i,target:e}};r.push(e)}let i=l(r);return i.length>0?{ok:!0,roots:i}:{ok:!1,refusal:{reason:`root_unusable`,path:e.join(`, `)}}}function l(e){let t=[];for(let n of new Set([...e].sort()))t.some(e=>N(n,e))||t.push(n);return t}function u(e,r,i){let a=[],o=[r];for(;o.length>0;){let r=o.pop(),s;try{s=t.readdirSync(r)}catch{return{ok:!1,refusal:{reason:`root_unusable`,path:g(e,r)??void 0}}}for(let c of s){let s=n.join(r,c),l=g(e,s);if(l===null)return{ok:!1,refusal:{reason:`root_unusable`,path:s}};let u;try{u=t.lstatSync(s)}catch{return{ok:!1,refusal:{reason:`root_unusable`,path:l}}}if(!m(u))return{ok:!1,refusal:{reason:`root_unusable`,path:l}};if(u.isSymbolicLink()&&d(s,i)===null)return{ok:!1,refusal:{reason:`symlink_escapes_cache`,path:l,target:f(s)??`(unreadable)`}};u.isDirectory()?o.push(s):a.push({relativePath:l,fullPath:s,stat:u})}}return{ok:!0,leaves:a}}function d(e,t){let n=f(e);if(n===null)return null;let r=p(e,n);return r===null?null:t.some(e=>N(r,e))?n:null}function f(e){try{return t.readlinkSync(e)}catch{return null}}function p(e,t){let r=_(n.dirname(e));if(r===null)return null;let i=n.isAbsolute(t)?n.resolve(t):n.resolve(r,t);return _(i)??i}function m(e){return e.isDirectory()||e.isFile()||e.isSymbolicLink()}function h(e,t,n){let a=u(e,t,n);if(!a.ok)return{ok:!1,refusal:a.refusal};let o=[];for(let e of a.leaves){if(e.stat.isSymbolicLink()){let t=f(e.fullPath);if(t===null)return{ok:!1,refusal:{reason:`root_unusable`,path:e.relativePath}};o.push({path:e.relativePath,symlink:t});continue}if(e.stat.size>r)return{ok:!1,refusal:{reason:`root_unusable`,path:e.relativePath}};let t=v(e.fullPath);if(!t)return{ok:!1,refusal:{reason:`root_unusable`,path:e.relativePath}};o.push({path:e.relativePath,size:t.size,mode:e.stat.mode&i,digest:t.digest})}return{ok:!0,entries:o}}function g(e,t){let r=n.relative(n.resolve(e),n.resolve(t));return r===``||r.startsWith(`..`)||n.isAbsolute(r)?null:r}function _(e){try{return t.realpathSync(e)}catch{return null}}function v(n){try{let i=t.statSync(n);if(!i.isFile()||i.size>r)return null;let a=e.createHash(`sha256`);return a.update(t.readFileSync(n)),{digest:a.digest(`hex`),size:i.size}}catch{return null}}function y(e,t){let n=t.artifacts,r=n?_(e):null;if(!n||!D(n)||r===null||!N(n.xctestrunPath,e))return{ok:!1,mismatch:null};let i=x(n,r);if(i)return{ok:!1,mismatch:i};let a=b(n,r,c(n.productPaths,e,r));return a?{ok:!1,mismatch:a}:{ok:!0,xctestrunPath:n.xctestrunPath,productPaths:[...n.productPaths]}}function b(e,t,n){if(!n.ok)return S(n.refusal);let r=new Map(e.entries.map(e=>[e.path,e]));for(let e of n.roots){let i=w(t,e,n.roots,r);if(i)return i}let i=r.keys().next();return i.done?null:{path:i.value,reason:`missing`}}function x(e,t){let n=E(e.xctestrunPath,e.xctestrunSize,e.xctestrunDigest);if(n)return n;let r=_(e.xctestrunPath);return r!==null&&N(r,t)?null:{path:e.xctestrunPath,reason:`root_escapes_cache`,target:r??`(?)`}}function S(e){return e.reason===`root_unusable`?{path:e.path??`(cache root)`,reason:`root_unusable`}:{...e}}function C(e,t){return{reason:`root_unusable`,path:g(e,t)??void 0}}function w(e,t,n,r){let i=u(e,t,n);if(!i.ok)return i.refusal?S(i.refusal):{path:t,reason:`root_unusable`};for(let e of i.leaves){let t=r.get(e.relativePath);if(!t)return{path:e.relativePath,reason:`undeclared_entry`};let n=T(e.fullPath,e.relativePath,t);if(n)return n;r.delete(e.relativePath)}return null}function T(e,t,n){if(`symlink`in n){let r=f(e);return r===null?{path:t,reason:`missing`}:r===n.symlink?null:{path:t,reason:`symlink_target_changed`,expected:n.symlink,actual:r}}return E(e,n.size,n.digest,n.mode,t)}function E(e,n,r,a,o){let s=o??e,c;try{c=t.lstatSync(e)}catch{return{path:s,reason:`missing`}}if(!c.isFile())return{path:s,reason:`kind_changed`};if(c.size!==n)return{path:s,reason:`size_changed`,expected:n,actual:c.size};if(a!==void 0&&(c.mode&i)!==a)return{path:s,reason:`mode_changed`,expected:a,actual:c.mode&i};let l=v(e);return l?l.digest===r?null:{path:s,reason:`digest_mismatch`}:{path:s,reason:`file_too_large`,size:c.size}}function D(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.xctestrunPath==`string`&&A(t.xctestrunSize)&&typeof t.xctestrunDigest==`string`&&j(t.productPaths)&&M(t.entries)&&t.entries.every(O)}function O(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.path!=`string`||!k(t.path)?!1:typeof t.symlink==`string`?t.digest===void 0:typeof t.digest==`string`&&A(t.size)&&typeof t.mode==`number`}function k(e){return!e.startsWith(`/`)&&!e.startsWith(`..`)&&!n.isAbsolute(e)}function A(e){return Number.isInteger(e)&&e>=0}function j(e){return M(e)&&e.every(e=>typeof e==`string`)}function M(e){return Array.isArray(e)&&e.length>0}function N(e,t){let r=n.relative(n.resolve(t),n.resolve(e));return r!==``&&!r.startsWith(`..`)&&!n.isAbsolute(r)}export{a as buildRunnerCacheArtifactManifest,y as validateRunnerCacheArtifactManifest};
|
|
1
|
+
import e from"node:crypto";import t from"node:fs";import n from"node:path";const r=134217728,i=4095;function a(e,t,n){let r=_(e);if(r===null)return{ok:!1,refusal:{reason:`root_unusable`,path:e}};let i=o(e,t,r);if(`reason`in i)return{ok:!1,refusal:i};let a=c(n,e,r);if(!a.ok)return{ok:!1,refusal:a.refusal};let s=[];for(let e of a.roots){let t=h(r,e,a.roots);if(!t.ok)return{ok:!1,refusal:t.refusal};s.push(...t.entries)}return s.length===0?{ok:!1,refusal:{reason:`root_unusable`,path:n.join(`, `)}}:(s.sort((e,t)=>e.path.localeCompare(t.path)),{ok:!0,artifacts:{xctestrunPath:t,xctestrunSize:i.size,xctestrunDigest:i.digest,productPaths:[...n],entries:s}})}function o(e,t,n){let r=g(e,t)??t,i=_(t);return i===null?{reason:`root_unusable`,path:r}:N(i,n)?s(t)?v(t)??{reason:`root_unusable`,path:r}:{reason:`root_unusable`,path:r}:{reason:`root_escapes_cache`,path:r,target:i}}function s(e){try{return t.lstatSync(e).isFile()}catch{return!1}}function c(e,t,n){let r=[];for(let i of e){let e=_(i);if(e===null)return{ok:!1,refusal:C(t,i)};if(!N(e,n))return{ok:!1,refusal:{reason:`root_escapes_cache`,path:g(t,i)??i,target:e}};r.push(e)}let i=l(r);return i.length>0?{ok:!0,roots:i}:{ok:!1,refusal:{reason:`root_unusable`,path:e.join(`, `)}}}function l(e){let t=[];for(let n of new Set([...e].sort()))t.some(e=>N(n,e))||t.push(n);return t}function u(e,r,i){let a=[],o=[r];for(;o.length>0;){let r=o.pop(),s;try{s=t.readdirSync(r)}catch{return{ok:!1,refusal:{reason:`root_unusable`,path:g(e,r)??void 0}}}for(let c of s){let s=n.join(r,c),l=g(e,s);if(l===null)return{ok:!1,refusal:{reason:`root_unusable`,path:s}};let u;try{u=t.lstatSync(s)}catch{return{ok:!1,refusal:{reason:`root_unusable`,path:l}}}if(!m(u))return{ok:!1,refusal:{reason:`root_unusable`,path:l}};if(u.isSymbolicLink()&&d(s,i)===null)return{ok:!1,refusal:{reason:`symlink_escapes_cache`,path:l,target:f(s)??`(unreadable)`}};u.isDirectory()?o.push(s):a.push({relativePath:l,fullPath:s,stat:u})}}return{ok:!0,leaves:a}}function d(e,t){let n=f(e);if(n===null)return null;let r=p(e,n);return r===null?null:t.some(e=>N(r,e))?n:null}function f(e){try{return t.readlinkSync(e)}catch{return null}}function p(e,t){let r=_(n.dirname(e));if(r===null)return null;let i=n.isAbsolute(t)?n.resolve(t):n.resolve(r,t);return _(i)??i}function m(e){return e.isDirectory()||e.isFile()||e.isSymbolicLink()}function h(e,t,n){let a=u(e,t,n);if(!a.ok)return{ok:!1,refusal:a.refusal};let o=[];for(let e of a.leaves){if(e.stat.isSymbolicLink()){let t=f(e.fullPath);if(t===null)return{ok:!1,refusal:{reason:`root_unusable`,path:e.relativePath}};o.push({path:e.relativePath,symlink:t});continue}if(e.stat.size>r)return{ok:!1,refusal:{reason:`root_unusable`,path:e.relativePath}};let t=v(e.fullPath);if(!t)return{ok:!1,refusal:{reason:`root_unusable`,path:e.relativePath}};o.push({path:e.relativePath,size:t.size,mode:e.stat.mode&i,digest:t.digest})}return{ok:!0,entries:o}}function g(e,t){let r=n.relative(n.resolve(e),n.resolve(t));return r===``||r.startsWith(`..`)||n.isAbsolute(r)?null:r}function _(e){try{return t.realpathSync(e)}catch{return null}}function v(n){try{let i=t.statSync(n);if(!i.isFile()||i.size>r)return null;let a=e.createHash(`sha256`);return a.update(t.readFileSync(n)),{digest:a.digest(`hex`),size:i.size}}catch{return null}}function y(e,t){let n=t.artifacts,r=n?_(e):null;if(!n||!D(n)||r===null||!N(n.xctestrunPath,e))return{ok:!1,mismatch:null};let i=x(n,r);if(i)return{ok:!1,mismatch:i};let a=b(n,r,c(n.productPaths,e,r));return a?{ok:!1,mismatch:a}:{ok:!0,xctestrunPath:n.xctestrunPath,productPaths:[...n.productPaths]}}function b(e,t,n){if(!n.ok)return S(n.refusal);let r=new Map(e.entries.map(e=>[e.path,e]));for(let e of n.roots){let i=w(t,e,n.roots,r);if(i)return i}let i=r.keys().next();return i.done?null:{path:i.value,reason:`missing`}}function x(e,t){let n=E(e.xctestrunPath,e.xctestrunSize,e.xctestrunDigest);if(n)return n;let r=_(e.xctestrunPath);return r!==null&&N(r,t)?null:{path:e.xctestrunPath,reason:`root_escapes_cache`,target:r??`(?)`}}function S(e){return e.reason===`root_unusable`?{path:e.path??`(cache root)`,reason:`root_unusable`}:{...e}}function C(e,t){return{reason:`root_unusable`,path:g(e,t)??void 0}}function w(e,t,n,r){let i=u(e,t,n);if(!i.ok)return i.refusal?S(i.refusal):{path:t,reason:`root_unusable`};for(let e of i.leaves){let t=r.get(e.relativePath);if(!t)return{path:e.relativePath,reason:`undeclared_entry`};let n=T(e.fullPath,e.relativePath,t);if(n)return n;r.delete(e.relativePath)}return null}function T(e,t,n){if(`symlink`in n){let r=f(e);return r===null?{path:t,reason:`missing`}:r===n.symlink?null:{path:t,reason:`symlink_target_changed`,expected:n.symlink,actual:r}}return E(e,n.size,n.digest,n.mode,t)}function E(e,n,r,a,o){let s=o??e,c;try{c=t.lstatSync(e)}catch{return{path:s,reason:`missing`}}if(!c.isFile())return{path:s,reason:`kind_changed`};if(c.size!==n)return{path:s,reason:`size_changed`,expected:n,actual:c.size};if(a!==void 0&&(c.mode&i)!==a)return{path:s,reason:`mode_changed`,expected:a,actual:c.mode&i};let l=v(e);return l?l.digest===r?null:{path:s,reason:`digest_mismatch`}:{path:s,reason:`file_too_large`,size:c.size}}function D(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.xctestrunPath==`string`&&A(t.xctestrunSize)&&typeof t.xctestrunDigest==`string`&&j(t.productPaths)&&M(t.entries)&&t.entries.every(O)}function O(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.path!=`string`||!k(t.path)?!1:typeof t.symlink==`string`?t.digest===void 0:typeof t.digest==`string`&&A(t.size)&&typeof t.mode==`number`}function k(e){return!e.startsWith(`/`)&&!e.startsWith(`..`)&&!n.isAbsolute(e)}function A(e){return Number.isInteger(e)&&e>=0}function j(e){return M(e)&&e.every(e=>typeof e==`string`)}function M(e){return Array.isArray(e)&&e.length>0}function N(e,t){let r=n.relative(n.resolve(t),n.resolve(e));return r!==``&&!r.startsWith(`..`)&&!n.isAbsolute(r)}export{a as buildRunnerCacheArtifactManifest,N as isPathInsideDirectory,y as validateRunnerCacheArtifactManifest};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{x as e}from"./apple-runner-platform.js";import{E as t,_ as n,c as r,x as i}from"./runner-lease.js";import a from"node:fs";import o from"node:path";const s=864e5,c=/^cache-[0-9a-f]{16}$/;function l(e=process.env){let t=e.AGENT_DEVICE_IOS_RUNNER_CACHE_KEEP?.trim();return!t||!/^\d+$/.test(t)?3:Number(t)}async function u(e,t=process.env,n=Date.now()){let r=l(t);if(r===0||t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim())return[];let i=f(o.dirname(e)).filter(t=>t.derived!==e).sort((e,t)=>t.lastUsedMs-e.lastUsedMs).slice(r-1).filter(e=>n-e.lastUsedMs>=s),a=[];for(let{derived:e}of i)try{await m(e,n)&&a.push(e)}catch(t){d(e,t)}return a}function d(t,n){e({level:`warn`,phase:`runner_xctestrun_cache_eviction_failed`,data:{derived:t,error:n instanceof Error?n.message:String(n)}})}function f(e){let t;try{t=a.readdirSync(e,{withFileTypes:!0}).filter(e=>e.isDirectory()&&c.test(e.name)).map(e=>e.name)}catch{return[]}return t.map(t=>{let n=o.join(e,t);return{derived:n,lastUsedMs:p(n)}})}function p(e){try{return a.statSync(t(e)).mtimeMs}catch{return 0}}async function m(e,c){let l;try{l=await n(e,0)}catch{return!1}try{if(c-p(e)<s)return!1;let n=o.basename(e);return!r().some(({xctestrunPath:t,cacheKey:r})=>r===n||t.startsWith(`${e}${o.sep}`))&&(await a.promises.rm(t(e),{force:!0}),await a.promises.rm(e,{recursive:!0,force:!0}),i(`clean`,`stale_cache_evicted`,{derived:e}),!0)}finally{await l().catch(()=>void 0)}}export{u as evictStaleRunnerCaches};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./runner.js";import{isPathInsideDirectory as t}from"./runner-artifact-manifest.js";import n from"node:fs";import r from"node:path";async function i(e,t,n){if(!a(e,n))return[];let r=o(e,t);return r?await c(e,e,r):[]}function a(e,t){try{let i=r.join(n.realpathSync(r.dirname(t)),r.basename(t));return n.realpathSync(e)===i}catch{return!1}}function o(i,a){let o=new Set([e]);try{let e=n.realpathSync(i);for(let c of a){let a=n.realpathSync(c);if(!t(c,i)||!t(a,e))return null;o.add(s(r.relative(i,c))),o.add(s(r.relative(e,a)))}}catch{return null}return o}function s(e){let t=e.split(r.sep);return t.slice(0,t[0]===`Build`?2:1).join(r.sep)}async function c(e,t,i){let a=[];for(let o of await n.promises.readdir(t,{withFileTypes:!0})){let s=r.join(t,o.name),l=r.relative(e,s);if(!i.has(l)){if(o.isDirectory()&&[...i].some(e=>e.startsWith(`${l}${r.sep}`))){a.push(...await c(e,s,i));continue}await n.promises.rm(s,{recursive:!0,force:!0}),a.push(l)}}return a}export{i as trimRunnerBuildScratch};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{F as t,I as n,K as r,P as i,V as a,z as o}from"./sdk-contracts.js";import{v as s}from"./sdk-batch-runner.js";import{c,r as l}from"./diagnostics.js";import"./diagnostics2.js";import{d as u,p as d}from"./sdk-device.js";import{o as f}from"./sdk-remote-config.js";import{S as p,T as m,h,j as g,m as _,t as v,w as y,y as ee}from"./owner-identity.js";import{h as te,i as ne,m as re,n as ie,o as ae,p as oe,u as se}from"./exec.js";import{a as ce,t as le}from"./file.js";import"./command.js";import"./process.js";import{a as ue,r as de}from"./version.js";import{t as fe}from"./ttl-memo.js";import{i as pe,n as me,r as he}from"./retry.js";import{o as ge}from"./device-shell.js";import{t as _e}from"./keyed-lock.js";import{n as ve,t as ye}from"./boot-diagnostics.js";import{i as be,r as xe}from"./request-cancel.js";import{t as Se}from"./request.js";import{a as Ce,n as we,o as Te,r as Ee}from"./tool-provider.js";import{t as De}from"./physical-device-control.js";import{a as Oe,o as ke}from"./runner.js";import{C as Ae,L as je,M as Me,P as Ne,W as Pe,a as Fe,d as Ie,h as Le,r as Re,t as ze,u as b,v as Be}from"./host.js";import{o as Ve,s as He}from"./apple-runner-platform.js";import{c as Ue,g as We,h as Ge,i as Ke,l as qe,m as Je,t as Ye}from"./runner-cache-metadata.js";import{t as Xe}from"./plist-xml.js";import{n as Ze,t as Qe}from"./runner-owner-state.js";import{l as $e,n as et}from"./simctl.js";import{C as tt,S as nt,T as rt,_ as it,a as at,b as ot,c as st,d as ct,f as lt,h as ut,i as dt,l as x,n as ft,o as pt,p as mt,r as ht,s as gt,t as _t,w as vt,x as yt,y as bt}from"./runner-session-types.js";import{A as xt,D as St,E as Ct,M as S,O as wt,P as C,S as Tt,_ as Et,a as w,b as T,f as Dt,g as Ot,h as kt,i as At,j as jt,l as Mt,n as Nt,o as Pt,u as Ft,v as It,w as E}from"./runner-error-classification.js";import{A as Lt,D as Rt,F as zt,I as Bt,L as Vt,M as Ht,P as Ut,R as Wt,S as Gt,T as Kt,V as qt,_ as Jt,a as Yt,b as D,c as Xt,d as Zt,f as Qt,h as $t,i as O,j as en,m as tn,n as nn,o as rn,p as an,r as on,t as k,u as sn,v as cn,w as ln,y as un}from"./runner-disposal.js";import A from"node:fs";import dn from"node:path";const fn={runCmdStreaming:oe,runCmdSync:re,runCmdBackground:se,requireExecSuccess:ae,isCommandTimeoutError:ne,commandDeveloperDir:ie,shellQuote:ge,emitDiagnostic:l,withDiagnosticTimer:c,retryWithPolicy:pe,isEnvTruthy:he,deadlineFromTimeoutMs:(e,t)=>me.fromTimeoutMs(e,t),isProcessAlive:_,isProcessGroupAlive:h,readProcessStartTime:y,readProcessCommand:p,signalPidsBestEffort:m,signalProcessGroupBestEffort:te,findProjectRoot:de,readVersion:ue,acquireProcessLock:le,withProcessLock:ce,withKeyedLock:_e,publishFileSync:g,classifyOwnerLiveness:v,readHostCpuArchSync:ee,createTtlMemo:fe,parseBooleanLiteral:f,isRecord:s,emitRequestProgress:Se,getRequestSignal:xe,isRequestCanceled:be,classifyBootFailure:ve,bootFailureHint:ye,runAppleToolCommand:Ce,runXcrun:Te,readApplePlistJson:Ee,hasScopedAppleToolProvider:we,buildSimctlArgsForDevice:et,simulatorAddressFor:$e,resolveIosPhysicalDeviceControl:De,visitXmlPlistEntries:Xe,leaseOwnerStateDir:Ze,hasDeviceClaimAuthority:e=>Qe()?.(e)??!1};function pn(e=process.env){return Ae(e.AGENT_DEVICE_IOS_RUNNER_DETACH??``)!==!1}async function mn(e,t){if(!pn())return 0;let n=0;for(let[r,i]of e){let e=hn(i);if(!e.detached){b({level:`debug`,phase:`ios_runner_session_detach_skipped`,data:{deviceId:r,sessionId:i.sessionId,lane:e.lane,reason:e.reason,outstandingCharges:i.commandCharges.outstandingChargeCount,hasAbandonedCharges:i.commandCharges.hasAbandonedCharges}});continue}n+=1,t(r,i),b({level:`info`,phase:`ios_runner_session_detached`,data:{deviceId:r,lane:e.lane,sessionId:i.sessionId,runnerPid:i.child.pid,port:i.port,runnerLogPath:i.runnerLogPath}})}return n}function hn(e){let t=He(e.device);if(!t.handoff)return{detached:!1,lane:void 0,reason:t.reason};let n=t.lane,r=gt(e);if(!r.detach)return{detached:!1,lane:n,reason:r.reason};let i=e.lease;if(!i)return{detached:!1,lane:n,reason:`lease_absent`};if(!Yt(e.child.pid))return{detached:!1,lane:n,reason:`runner_process_dead`};try{D(sn(i))}catch{return{detached:!1,lane:n,reason:`lease_write_failed`}}return e.endOutputObservation?.(),ft(e,`stopped`),{detached:!0,lane:n}}async function gn(e,t){if(!pn())return null;let n=He(e),r=(t,r)=>(b({level:`debug`,phase:`ios_runner_lease_adoption_skipped`,data:{deviceId:e.id,lane:n.handoff?n.lane:void 0,runnerPid:r?.runnerPid,port:r?.port,reason:t}}),null);if(!n.handoff)return r(n.reason);let i=$t(e.id);if(i.type===`absent`)return r(`lease_absent`);if(i.type===`refused`)return r(i.reason,i.lease);let a=i.lease;if(a.simulatorSetPath!==ut(e))return r(`simulator_set_mismatch`,a);let o=_n(a,t.expectedRunnerSessionId);if(`refusal`in o)return r(o.refusal,a);let s=vn(e,a,t.budget);if(`refusal`in s)return r(s.refusal,a);let c=o.value,l=s.value,u=await yn(e,a.port,n.lane,t.budget);if(u!==`answered`)return r(u,a);if(!an(a,c))return r(`runner_pid_recycled`,a);let d=Sn(e,a,c,l);try{D(d.lease)}catch{return r(`lease_write_failed`,a)}return b({level:`info`,phase:`ios_runner_lease_adopted`,data:{deviceId:e.id,lane:n.lane,sessionId:d.sessionId,runnerPid:c,port:a.port,previousOwnerPid:a.ownerPid}}),d}function _n(e,t){if(t!==void 0&&e.sessionId!==t)return{refusal:`session_identity_mismatch`};let n=e.runnerPid;return n?Be(n)?cn(e,n)?{value:n}:{refusal:`runner_pid_recycled`}:{refusal:`runner_process_dead`}:{refusal:`runner_pid_missing`}}function vn(e,t,n){let r=xn(e,n);return r?t.cacheKey!==r.cacheKey||!t.xctestrunPath.startsWith(`${r.derived}${dn.sep}`)?{refusal:`artifact_fingerprint_mismatch`}:{value:r}:{refusal:`expected_derived_unresolved`}}async function yn(e,t,n,i){let a=n===`physical_coredevice`?5e3:500,o=bn(i,a);if(o<=0)return`probe_budget_exhausted`;let s=Date.now(),c=!1;try{let n=await lt(e,t,C({command:`uptime`}),o,i?.signal);return c=xt(wt(await n.text())),c?`answered`:`probe_failed`}catch(e){if(r(e))throw e;return`probe_failed`}finally{b({level:`debug`,phase:`ios_runner_lease_adoption_probe`,durationMs:Date.now()-s,data:{deviceId:e.id,port:t,lane:n,budgetCapMs:a,timeoutMs:o,answered:c}})}}function bn(e,t){return e?.deadline?Math.min(t,Math.floor(e.deadline.remainingMs())):t}function xn(e,t){try{let n=qe(e,void 0,t);return{derived:Ge(e,n),cacheKey:Je(n)}}catch(e){if(r(e))throw e;return null}}function Sn(e,t,n,r){let i=t.sessionId,a={xctestrunPath:t.xctestrunPath,...r,cache:`exact`,artifact:`valid`,buildMs:0,xctestrunPathSource:`manifest`,reason:`adopted_from_lease`},{child:o,wait:s}=Cn(n);return{sessionId:i,device:e,deviceId:e.id,port:t.port,xctestrunPath:t.xctestrunPath,xctestrunArtifact:a,jsonPath:t.jsonPath,testPromise:s,child:o,runnerLogPath:t.runnerLogPath,state:`ready`,commandCharges:new _t,lease:Zt({device:e,sessionId:i,runnerPid:n,port:t.port,xctestrunPath:t.xctestrunPath,cacheKey:r.cacheKey,jsonPath:t.jsonPath,runnerLogPath:t.runnerLogPath})}}function Cn(e){let t={pid:e,exitCode:null};return{child:t,wait:new Promise(n=>{let r=setInterval(()=>{Be(e)||(clearInterval(r),t.exitCode=-1,n({stdout:``,stderr:``,exitCode:-1}))},1e3);r.unref?.()})}}function wn(){let e=new AbortController,t=!1,n=``;return{wake:e.signal,observe:r=>{if(t)return;let i=n+r;if(i.includes(`AGENT_DEVICE_RUNNER_LISTENER_READY`)){t=!0,n=``,e.abort();return}n=i.slice(-33)},finish:()=>{t=!0,n=``,e.abort()}}}function Tn(e){let t=e.logPath;A.mkdirSync(dn.dirname(t),{recursive:!0});let n=A.openSync(t,`a`),r=bt(t,n),i=En(()=>{try{A.closeSync(n)}catch{}}),a=wn();try{let t=Ne(`xcodebuild`,[`test-without-building`,`-only-testing`,`AgentDeviceRunnerUITests/RunnerTests/testCommand`,`-parallel-testing-enabled`,`NO`,`-test-timeouts-enabled`,`NO`,`-collect-test-diagnostics`,`never`,We(e.device),`1`,`-destination-timeout`,`20`,`-xctestrun`,e.xctestrunPath,`-derivedDataPath`,e.derivedPath,...it(e.device,Ve(e.device))],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(e.port)},detached:!0,signal:e.signal,stdio:[`ignore`,n,n],captureOutput:!1}),o=rt({file:r,onOutput:t=>{a.observe(t),(e.traceLogPath||e.verbose)&&nt(t,void 0,e.traceLogPath,e.verbose)}}),s=En(()=>{o.stop(),i()}),c=()=>{o.drain(),i(),a.finish()};return t.wait.then(c,c),{...t,startupRetryWake:a.wake,endOutputObservation:s,readLogTail:e=>tt(r,e)}}catch(e){throw i(),e}}function En(e){let t=!1;return()=>{t||(t=!0,e())}}const j=new Map,Dn=new Map,M=new Map,On=1e4;function N(e,t){return Pe(Dn,e,t)}async function P(e,t){R(e.id);let n=t.startAdmission,r=n??Lt(e.id),i=N(e.id,async()=>{let{openRunnerStartBudget:n,reserveRunnerStartOwnerInterest:i}=await import(`./runner-start-budget.js`);Ht(r),Gt(e.id,r);let a=n(t),o=i(r,t);try{let n=j.get(e.id);if(n){Mn(n,t.expectedRunnerSessionId);let r=await In(e,n,a.phase);if(r)return r}return await un(e.id,async()=>await An(e,t,a,r))}catch(e){throw a.exhausted.aborted?a.exhausted.reason:e}finally{a.close(),o()}}),{raceRunnerStartAgainstCaller:a}=await import(`./runner-start-budget.js`);return await a(n?i:i.finally(()=>Rt(r)),r,t.signal)}const kn=1e4;async function An(e,t,r,i){let a={},o=r.phase,s=o.signal,c=nr(t.runnerLeaseContext,e.id);b({level:`debug`,phase:`ios_runner_session_startup`,data:{deviceId:e.id,logicalLeaseContext:c}});let l=await V(a,`adopt_detached_runner`,async()=>await gn(e,{budget:o,expectedRunnerSessionId:t.expectedRunnerSessionId}));if(l)return l.startupTimings=a,l.logicalLeaseContext=c,Gt(e.id,i),j.set(e.id,l),l;Nn(t.expectedRunnerSessionId),await V(a,`cleanup_stale_xcodebuild`,async()=>{await tn(e,rn,c)}),await V(a,`ensure_booted`,async()=>{await Xn(e)});let u=await V(a,`verify_device_readiness`,async()=>await(await import(`./runner-device-readiness.js`)).preflightIosRunnerDeviceReadiness(e,{budgetMs:Math.min(kn,o.deadline?.remainingMs()??kn),signal:s}));await V(a,`verify_host_dev_tools_security`,async()=>{let{assertDevToolsSecurityForIosRunner:t}=await import(`./runner-dev-tools-security.js`);await t(e)}),t.cleanStaleBundles?await V(a,`cleanup_stale_bundles`,async()=>{await Ln(e)}):(a.cleanup_stale_bundles=0,b({level:`debug`,phase:`ios_runner_startup_cleanup_stale_bundles_skipped`}));let d,f,p,m,h=vt(t.logPath,e.id),g;try{d=await V(a,`ensure_xctestrun`,async()=>await ln(e,{...t,startAdmission:i,budget:Ke($n(t,r),s)})),a.build_xctestrun=d.buildMs,f=await V(a,`allocate_port`,async()=>await yt()),{xctestrunPath:p,jsonPath:m}=await V(a,`prepare_xctestrun_env`,async()=>await Wt(d.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(f)},Vt({deviceId:e.id,ownerToken:Jt(),port:f}),{iosXctestEnvDir:t.iosXctestEnvDir})),d.buildMs>0&&Ie({type:`command`,status:`progress`,message:`Starting XCTest runner...`}),g=await V(a,`launch_xcodebuild`,async()=>(await ot(h).catch(()=>{}),await Tn({device:e,port:f,xctestrunPath:p,derivedPath:d.derived,signal:s,logPath:h,traceLogPath:t.traceLogPath,verbose:t.verbose})))}catch(e){throw At(e,u)}let _=ht(e.id,f),v=Zt({device:e,sessionId:_,runnerPid:g.child.pid,port:f,xctestrunPath:p,cacheKey:d.cacheKey,jsonPath:m,runnerLogPath:h}),y={sessionId:_,device:e,deviceId:e.id,port:f,xctestrunPath:p,xctestrunArtifact:d,jsonPath:m,runnerLogPath:h,testPromise:g.wait,child:g.child,endOutputObservation:g.endOutputObservation,readLogTail:g.readLogTail,state:`starting`,commandCharges:new _t,startupRetryWake:g.startupRetryWake,launchDeadline:ze.fromTimeoutMs(er(r)),startupTimings:a,startupDeviceStates:u,logicalLeaseContext:c,lease:v,speculative:t.speculative===!0};if(s?.aborted)throw await O(y,{graceful:!1,waitTimeoutMs:k,leaseLockHeld:!0}),n();await jn(e,y,i);try{D(v)}catch(t){throw await L(e.id,y,{graceful:!1,waitTimeoutMs:k,leaseLockHeld:!0}),t}return j.set(e.id,y),y}async function jn(e,t,n){if(!zt(e.id,n))throw await O(t,{graceful:!1,waitTimeoutMs:k,leaseLockHeld:!0}),Bt(n.retired??`device_teardown`)}function Mn(e,t){if(t!==void 0&&e.sessionId!==t)throw Pn()}function Nn(e){if(e!==void 0)throw Pn()}function Pn(){return new i(`COMMAND_FAILED`,`Apple runner session ownership changed before command dispatch`,{reason:`runner_session_ownership_changed`})}async function Fn(e,t){let n=Bn(t);return n===`gone`?(await V({},`stop_stale_session`,async()=>{await L(e.id,t,{graceful:!1,waitTimeoutMs:k})}),!1):n!==`starting`&&n!==`ready`?!1:n===`starting`&&t.launchDeadline?.isExpired()?(b({level:`warn`,phase:`ios_runner_session_invalidated`,data:{deviceId:e.id,sessionId:t.sessionId,reason:`runner_launch_budget_exhausted`}}),await V({},`stop_expired_starting_session`,async()=>{await L(e.id,t,{graceful:!1,waitTimeoutMs:k})}),!1):mt(t.device,e)?!0:(await V({},`stop_other_simulator_set_session`,async()=>{await L(e.id,t)}),!1)}async function In(e,t,n){if(!await Fn(e,t))return null;let r=t.xctestrunArtifact;if(r?.cache===`external`)return b({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.state===`ready`,cache:r.cache,logicalLeaseContext:t.logicalLeaseContext}}),t;let i=qe(e,void 0,n),a=Ge(e,i),o=Je(i);return r?.derived!==a||r.cacheKey!==o?(b({level:`debug`,phase:`ios_runner_session_artifact_stale`,data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:r?.derived,expectedDerived:a,currentCacheKey:r?.cacheKey,expectedCacheKey:o}}),await V({},`stop_stale_artifact_session`,async()=>{await L(e.id,t)}),null):(b({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.state===`ready`,logicalLeaseContext:t.logicalLeaseContext}}),t)}async function Ln(e){e.kind===`simulator`&&await Promise.allSettled(Ye.map(async t=>{let n=await Rn(e,t);!n||zn(n)}))}async function Rn(e,t){try{return await je(Fe(e,[`uninstall`,e.id,t]),{allowFailure:!0,timeoutMs:On})}catch(n){b({level:`warn`,phase:`ios_runner_startup_cleanup_stale_bundle_failed`,data:{deviceId:e.id,bundleId:t,timeoutMs:On,error:n instanceof Error?n.message:String(n)}});return}}function zn(e){if(e.exitCode===0)return!0;let t=`${e.stdout}\n${e.stderr}`.toLowerCase();return t.includes(`not installed`)||t.includes(`found nothing`)||t.includes(`no such file`)||t.includes(`invalid device`)||t.includes(`could not find`)}function F(e){let t=j.get(e);return t?{sessionId:t.sessionId,liveness:Bn(t)}:null}function Bn(e){return st({state:e.state,processRunning:Yt(e.child.pid)})}async function I(e,t){await N(e.deviceId,async()=>{j.get(e.deviceId)===e&&dt(e)&&(b({level:`warn`,phase:`ios_runner_session_invalidated`,data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await L(e.deviceId,e,{graceful:!1,waitTimeoutMs:k}))})}async function L(e,t,n={}){let r=t??j.get(e);r&&dt(r)&&(await O(r,n),j.get(e)===r&&j.delete(e))}function Vn(e){R(e);let t=Hn();if(t<=0||!j.has(e))return;let n=setTimeout(()=>{M.delete(e),b({level:`info`,phase:`ios_runner_idle_stop`,data:{deviceId:e,idleMs:t}}),z(e).catch(t=>{b({level:`warn`,phase:`ios_runner_idle_stop_failed`,data:{deviceId:e,error:t instanceof Error?t.message:String(t)}})})},t);n.unref?.(),M.set(e,n),b({level:`debug`,phase:`ios_runner_idle_stop_scheduled`,data:{deviceId:e,idleMs:t}})}function R(e){let t=M.get(e);t&&(clearTimeout(t),M.delete(e))}function Hn(e=process.env){let t=e.AGENT_DEVICE_IOS_RUNNER_IDLE_STOP_MS?.trim();if(t){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.floor(e)}return 3e5}function Un(e,t){e.speculative&&!Tt(t)&&(e.speculative=!1)}async function Wn(e){return await N(e,async()=>{let t=j.get(e);return t?.speculative?(b({level:`debug`,phase:`ios_runner_speculative_released`,data:{deviceId:e,sessionId:t.sessionId,ready:t.state===`ready`}}),await z(e),!0):!1})}async function z(e){await Gn(e)}async function Gn(e,t){R(e);try{await N(e,async()=>{await un(e,async()=>{await L(e,void 0,{leaseLockHeld:!0}),await on(e)}),t?.()})}finally{t?.()}}async function Kn(e,t){let n=j.get(e);if(t.retain&&!at(n)){Vn(e);return}t.retain&&b({level:`info`,phase:`ios_runner_retain_skipped_busy`,data:{deviceId:e}});let r=Kt(e);try{await Xt(e),await Gn(e,r)}finally{r()}}async function qn(){let e=Array.from(j.values()),t=Ut(e.map(e=>e.deviceId));try{await nn(e);for(let t of e)j.get(t.deviceId)===t&&j.delete(t.deviceId)}finally{t()}}async function Jn(){return await mn(j,e=>{j.delete(e),R(e)})}async function Yn(){let e=Ut(j.keys());try{await qn();let e=Array.from(j.keys());await Promise.allSettled(e.map(async e=>{await z(e)})),await Xt()}finally{e()}}function Xn(e){return e.kind===`simulator`?e.booted?(b({level:`debug`,phase:`ios_runner_startup_ensure_booted_skipped`,data:{deviceId:e.id}}),Promise.resolve()):Zn(e):Promise.resolve()}async function Zn(e){await je(Fe(e,[`bootstatus`,e.id,`-b`]),{timeoutMs:x})}function Qn(e){if(!u(e.platform))throw new i(`UNSUPPORTED_PLATFORM`,`Unsupported platform for iOS runner: ${e.platform}`);if(e.kind!==`simulator`&&e.kind!==`device`)throw new i(`UNSUPPORTED_OPERATION`,`Unsupported iOS device kind for runner: ${e.kind}`)}async function B(e,t,n,r,i,a){tr(t,n.command);let{executeRunnerExchange:o}=await import(`./runner-exchange.js`);return o(e,t,n,r,i,e=>I(t,e),a)}function $n(e,t){let n=Ue(t.phase,`runner_xctestrun_build`)??t.timeoutMs,r=pt(e.buildTimeoutMs);return r===void 0?n:Math.min(r,n)}function er(e){let t=Math.floor(e.phase.deadline?.remainingMs()??e.timeoutMs);return e.explicit?t:Math.min(x,t)}async function V(e,t,n){let r=Date.now();try{return await n()}finally{let n=Date.now()-r;e[t]=n,b({level:`debug`,phase:`ios_runner_startup_${t}`,durationMs:n})}}function tr(e,t){if(e.startupTimingsReported||!e.startupTimings)return;e.startupTimingsReported=!0;let n=Object.values(e.startupTimings).reduce((e,t)=>e+t,0);b({level:`info`,phase:`ios_runner_session_startup_timings`,durationMs:n,data:{command:t,sessionId:e.sessionId,ready:e.state===`ready`,logicalLeaseContext:e.logicalLeaseContext,timings:e.startupTimings}})}function nr(e,t){if(!e)return;let n={leaseId:H(e.leaseId),clientId:H(e.clientId),tenantId:H(e.tenantId),runId:H(e.runId),leaseProvider:H(e.leaseProvider),deviceKey:H(e.deviceKey)??t},r=Object.entries(n).filter(([,e])=>e!==void 0);return r.length>0?Object.fromEntries(r):void 0}function H(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}async function rr(e){let{device:t,session:n,command:r,transportError:i,options:a,signal:o,invalidationReason:s}=e;return await ir(await ur(t,n,r,i,a,o),{command:r,session:n,transportError:i,options:a,invalidationReason:s,invalidateSession:e.invalidateSession})}async function ir(e,t){if(e.type===`recovered`)return sr(e,t);let n=ar(e,t);if(e.type===`skipInvalidation`)throw cr(e,t,n);return await lr(e,t,n)}function ar(e,t){return`runnerAnswer`in e?o(e.runnerAnswer,e.dispatched):T(t.command)?o(t.transportError,`unknown`):o(or(t,e.lostReply),`unknown`)}function or(e,t){let{command:n,transportError:r,options:a}=e,o=r.details?.reason,s=r.details?.hint;return new i(`COMMAND_FAILED`,`cause`in t?wr(n.command,t.cause):t.message,{command:n.command,commandId:n.commandId,...t.lifecycleState===void 0?{}:{lifecycleState:t.lifecycleState},reason:Nt,...o===void 0?{}:{transportReason:o},recovery:t.recovery,...W(r),hint:typeof s==`string`?s:t.hint,logPath:a.logPath??r.details?.logPath,transportError:r.message},r)}function sr(e,t){return K({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),e.data}function cr(e,t,n){return K({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),n}async function lr(e,t,n){throw K({command:t.command,session:t.session,transportError:t.transportError,decision:`retained`,reason:e.reason,lifecycleState:e.lifecycleState}),await t.invalidateSession(t.session,t.invalidationReason),n}async function ur(e,t,n,r,i,a){if(n.command===`status`||!n.commandId?.trim())return{type:`retainInvalidation`,reason:`status_recovery_unavailable`,lostReply:{recovery:`status_recovery_unavailable`,cause:`status recovery was unavailable`,hint:G(n.command)}};let o=W(r),s;try{s=await B(e,t,{command:`status`,statusCommandId:n.commandId},i.logPath,3e3,a)}catch(e){return b({level:`debug`,phase:`ios_runner_command_status_recovery_failed`,data:{command:n.command,commandId:n.commandId,error:e instanceof Error?e.message:String(e),...o}}),{type:`retainInvalidation`,reason:`status_probe_failed`,lostReply:{recovery:`status_probe_failed`,cause:`the status probe failed`,hint:G(n.command)}}}let c=typeof s.lifecycleState==`string`?s.lifecycleState:``,l=pr(t,n,c);return b({level:`debug`,phase:`ios_runner_command_status_recovery`,data:{command:n.command,commandId:n.commandId,lifecycleState:c,...o,...l===void 0?{}:{abandonedChargeSettled:l}}}),mr(s,c,n,r,i)}const dr=new Set([`completed`,`failed`]),fr=new Set([`accepted`,`started`]);function pr(e,t,n){if(dr.has(n))return e.commandCharges.settleTerminalEvidence(t.commandId)}function mr(e,t,n,r,i){if(t===`completed`)return hr(e,n,r);if(t===`failed`){let a=St(typeof e.lifecycleErrorCode==`string`?e.lifecycleErrorCode:void 0);return{type:`skipInvalidation`,reason:`runner_reported_failure`,lifecycleState:t,dispatched:a.details.dispatched,runnerAnswer:gr(e,a,n,r,i)}}return fr.has(t)?{type:`skipInvalidation`,reason:`command_still_in_flight`,lifecycleState:t,lostReply:{recovery:`command_still_in_flight`,lifecycleState:t,message:`Runner command "${n.command}" is still ${t} after the transport response was lost.`,hint:br(n.command,t,W(r))}}:{type:`retainInvalidation`,reason:t?`unknown_lifecycle_state`:`missing_lifecycle_state`,lifecycleState:t,lostReply:{recovery:`lifecycle_state_not_recoverable`,lifecycleState:t,cause:`lifecycle status was ${t?`"${t}"`:`missing`}`,hint:G(n.command)}}}function hr(e,t,n){let r=_r(e.lifecycleResponseJson);return r?{type:`recovered`,data:r,reason:`completed_with_retained_response`,lifecycleState:`completed`}:{type:`skipInvalidation`,reason:T(t)?`read_only_completed_without_retained_response`:`completed_without_retained_response`,lifecycleState:`completed`,lostReply:{recovery:`completed_without_retained_response`,lifecycleState:`completed`,message:`Runner command "${t.command}" completed after the transport response was lost, but no recoverable response was retained.`,hint:vr(t.command,W(n))}}}function gr(e,t,n,r,a){let o=typeof e.lifecycleErrorMessage==`string`?e.lifecycleErrorMessage:`Runner command failed`,s=typeof e.lifecycleErrorHint==`string`?e.lifecycleErrorHint:void 0,c=W(r);return new i(t.code,o,{command:n.command,commandId:n.commandId,lifecycleState:`failed`,recovery:`runner_reported_failure`,...t.details,...c,hint:s??yr(n.command,c),logPath:a.logPath,transportError:r.message},r)}function _r(e){if(typeof e!=`string`||e.trim().length===0)return;let t;try{t=wt(e)}catch{return}return xt(t)?jt(t):void 0}function vr(e,t){return`${U(t)}The runner is still reachable and reports "${e}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`}function yr(e,t){return`${U(t)}The runner is still reachable and reports "${e}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`}function br(e,t,n){return`${U(n)}The runner is still reachable and reports "${e}" is ${t}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`}function U(e){return e.readinessPreflightSkipped===!0?`This hot command skipped the uptime preflight because the runner had just completed a healthy interaction; status recovery confirmed the runner still observed it. `:``}function xr(e,t){let n=e.details?.[t];return typeof n==`boolean`?n:void 0}function Sr(e,t){let n=e.details?.[t];return typeof n==`string`?n:void 0}function Cr(e,t){let n=e.details?.[t];return typeof n==`number`?n:void 0}function W(e){let t={},n=xr(e,`runnerReadinessPreflightSkipped`);n!==void 0&&(t.readinessPreflightSkipped=n);let r=Sr(e,`runnerReadinessPreflightSkipReason`);r!==void 0&&(t.readinessPreflightSkipReason=r);let i=Cr(e,`runnerReadinessPreflightSkippedAgeMs`);return i!==void 0&&(t.readinessPreflightSkippedAgeMs=i),t}function wr(e,t){return`Runner command "${e}" lost its transport response and ${t}, so agent-device invalidated the runner session instead of replaying the command.`}function G(e){return`The runner did not confirm that "${e}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`}function K(e){let{command:t,session:n,transportError:r,decision:i,reason:a,lifecycleState:o}=e;b({level:i===`retained`?`warn`:`debug`,phase:`ios_runner_command_invalidation_decision`,data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:o!==void 0,sessionId:n.sessionId,transportError:r.message}})}const q=new Map;function Tr(e,t){let n=e.requestId?.trim();if(n)return`request:${n}`;let r=t.commandId?.trim();if(r)return`command:${r}`}function Er(e){if(!e)return;let t=Y(e);t.touchedSession=!0,X(e,t)}function Dr(e){return e?q.get(e)?.touchedSession===!0:!1}function Or(e){if(!e)return!0;let t=Y(e);return t.recycles>=1?(X(e,t),!1):(X(e,t),!0)}function J(e){if(!e)return;let t=Y(e);t.recycles+=1,X(e,t)}function kr(e,t){return b({level:`warn`,phase:`ios_runner_recycle_budget_exhausted`,data:{command:e.command,commandId:e.commandId,requestId:t.requestId,maxRecycles:1}}),o(new i(`COMMAND_FAILED`,`iOS runner was already restarted during this request and "${e.command}" still failed, so agent-device stopped instead of paying for another runner boot.`,{command:e.command,commandId:e.commandId,recovery:`runner_recycle_budget_exhausted`,hint:"Check the runner log for the underlying failure before retrying — a provisioning or code-signing error there means the runner cannot install on this device, and no retry will help. If the runner is healthy, the current screen is likely too heavy or animating for accessibility capture: the app session is preserved, so run `screenshot` for visual truth and interact by coordinates, or navigate to another screen.",logPath:t.logPath}),`no`)}function Y(e){return Ar(),q.get(e)??{touchedSession:!1,recycles:0,lastAtMs:Date.now()}}function X(e,t){t.lastAtMs=Date.now(),q.delete(e),q.set(e,t)}function Ar(){let e=Date.now()-6e5;for(let[t,n]of q)n.lastAtMs<e&&q.delete(t);for(;q.size>512;){let e=q.keys().next().value;if(e===void 0)break;q.delete(e)}}async function jr(e,t){E(t.requestId);let n=S(t),r=C({command:`uptime`}),a=en(e.id),o;try{for(let i=1;i<=2;i+=1){let s=await Mr({device:e,command:r,options:{...t,startAdmission:a},signal:n,attempt:i,recoveryReason:o});if(s.kind===`prepared`)return s.result;o=s.recoveryReason}}finally{Rt(a)}throw new i(`COMMAND_FAILED`,`iOS runner prepare failed`)}async function Mr(e){let{device:t,command:n,options:r,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),c=await P(t,{...r,cleanStaleBundles:a>1||r.cleanStaleBundles,...Vr(r,`runner_session`)}),l=Date.now()-s;try{return{kind:`prepared`,result:Kr(t,await Br(t,c,n,r,i,l,{recoveryReason:o}))}}catch(e){return await Nr({device:t,session:c,command:n,options:r,signal:i,attempt:a,error:e})}}async function Nr(e){let{device:n,session:i,command:a,options:o,signal:s,attempt:c,error:l}=e,u=t(l,`COMMAND_FAILED`);if(r(u))throw await Z(i,`prepare_runner_request_canceled`),l;if(c===1&&Ur(u,i))return{kind:`prepared`,result:await Pr({device:n,session:i,command:a,options:o,signal:s,error:u})};if(!Fr(u))throw l;let d=u.message||`runner_health_failed`;if(c>=2)throw await Z(i,`prepare_runner_health_failed`),l;return E(o.requestId),await I(i,`prepare_runner_health_retry`),b({level:`warn`,phase:`ios_runner_prepare_health_retry`,data:{command:a.command,commandId:a.commandId,sessionId:i.sessionId,attempt:c,maxAttempts:2,reason:d}}),{kind:`retry`,recoveryReason:d}}async function Pr(e){let{device:t,session:n,command:r,options:i,signal:a,error:o}=e,s=o.message||`runner_health_failed`;await I(n,`prepare_cached_runner_health_failed`),await qt(n.xctestrunArtifact,s);let c=Date.now(),l=await P(t,{...i,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0,...Vr(i,`runner_rebuild`)}),u=Date.now()-c;try{let e=await Br(t,l,r,i,a,u,{recoveryReason:s});return b({level:`info`,phase:`ios_runner_prepare_bad_cache_recovered`,data:{command:r.command,commandId:r.commandId,sessionId:l.sessionId,xctestrunPath:l.xctestrunArtifact?.xctestrunPath,reason:s}}),Kr(t,e)}catch(e){await Z(l,`prepare_rebuilt_runner_health_failed`);let n=Wr(e,l,s);throw qr(t,{cache:l.xctestrunArtifact?.cache,artifact:l.xctestrunArtifact?.artifact,buildMs:l.xctestrunArtifact?.buildMs,connectMs:u,healthCheckMs:0,xctestrunPath:l.xctestrunArtifact?.xctestrunPath,failureReason:n.message}),n}}async function Z(e,t){try{await I(e,t)}catch{}}function Fr(e){return r(e)?!1:w(e)||It(e)}async function Ir(e,n,r){let i={entered:!1};try{return await Lr(e,n,r,i)}catch(e){let n=t(e);throw i.entered?Mt(n)?a(n,`no`):n:o(n,`no`)}}async function Lr(e,i,a,o){E(a.requestId);let s=S(a),c=Tr(a,i),l,u=!1,d=F(e.id)?.liveness??`gone`;try{if((d===`gone`||d===`stopped`)&&Dr(c)){if(!Or(c))throw kr(i,a);u=!0}l=await P(e,a),Mn(l,a.expectedRunnerSessionId),Un(l,i),u&&J(c),Er(c);let t=ct;if(l.state!==`ready`){let{readRunnerStartupTimeoutMs:e}=await import(`./runner-exchange.js`);t=e(l)}return o.entered=!0,await B(e,l,i,a.logPath,t,s)}catch(o){if(a.expectedRunnerSessionId!==void 0)throw o;let c=t(o,`COMMAND_FAILED`);if((l?l.state===`starting`:d!==`ready`)&&r(c))throw l&&!Ct(a)&&await Z(l,`runner_startup_request_canceled`),n({...c.details,readinessPhase:`runner-start`},c);if(Et(c,i)&&l)return E(a.requestId),await Rr({device:e,session:l,command:i,options:a,signal:s,restartReason:`runner_connect_failed_before_command_send`,firstAttemptDispatched:Dt(c)});if(l&&Ot(c))return E(a.requestId),await Rr({device:e,session:l,command:i,options:a,signal:s,restartReason:`runner_readiness_preflight_failed_before_command_send`,recoveredDiagnosticPhase:`ios_runner_readiness_preflight_recovered`,firstAttemptDispatched:`no`});if(l&&w(c)&&!Ft(c))return await rr({device:e,session:l,command:i,transportError:c,options:a,signal:s,invalidationReason:`transport_error_after_command_send`,invalidateSession:I});throw o}}async function Rr(e){let{device:n,command:r,options:i,signal:a,restartReason:s}=e,c=Tr(i,r);if(!Or(c))throw o(kr(r,i),e.firstAttemptDispatched);await I(e.session,s);let l=await P(n,{...i,cleanStaleBundles:!0}).catch(t=>{throw Q(t,e)});J(c);try{let t=await B(n,l,r,i.logPath,x,a);return e.recoveredDiagnosticPhase&&b({level:`debug`,phase:e.recoveredDiagnosticPhase,data:{command:r.command,commandId:r.commandId,recovery:`session_restarted`,sessionId:l.sessionId}}),t}catch(o){let s=t(o,`COMMAND_FAILED`);if(w(s)&&!Ft(s))try{return await rr({device:n,session:l,command:r,transportError:s,options:i,signal:a,invalidationReason:`transport_error_after_retry_command_send`,invalidateSession:I})}catch(t){throw Q(t,e,l)}throw Q(o,e,l)}}function Q(e,t,n){return e instanceof i?zr(new i(e.code,e.message,{...e.details??{},runnerRestarted:!0,runnerRestartReason:t.restartReason,runnerRestartCommand:t.command.command,...t.command.commandId?{runnerRestartCommandId:t.command.commandId}:{},runnerInvalidatedSessionId:t.session.sessionId,...n?{runnerRestartSessionId:n.sessionId}:{},...e.details?.logPath===void 0&&t.options.logPath?{logPath:t.options.logPath}:{}},e.cause??e),t.firstAttemptDispatched,n):e}function zr(e,t,n){return!n||t===`unknown`?o(e,t):a(e,Mt(e)?`no`:`unknown`)}async function Br(e,t,n,r,i,a,o){let s=Date.now(),c=Hr(r.prepareDeadline,r.healthTimeoutMs,`runner_health`);return Gr(await B(e,t,n,r.logPath,c,i),t,a,Date.now()-s,o)}function Vr(e,t){if(!e.prepareDeadline)return{};let n=Hr(e.prepareDeadline,e.buildTimeoutMs,t);return{buildTimeoutMs:n,startupTimeoutMs:n}}function Hr(e,t,n){if(!e)return t??45e3;let r=Math.floor(e.remainingMs());if(r<=0)throw new i(`COMMAND_FAILED`,`prepare ios-runner timed out`,{phase:n,reason:`prepare_deadline_expired`});return r}function Ur(e,t){let n=t.xctestrunArtifact;return!n||n.cache===`miss`?!1:kt(e)}function Wr(e,n,r){let a=t(e,`COMMAND_FAILED`);return new i(a.code,`artifact restored but runner did not connect`,{...a.details??{},restoredFailureReason:r,xctestrunPath:n.xctestrunArtifact?.xctestrunPath,artifact:n.xctestrunArtifact?.artifact,cache:n.xctestrunArtifact?.cache,reason:a.message},a)}function Gr(e,t,n,r,i){let a=t.xctestrunArtifact,o={...i?.recoveryReason?{recoveryReason:i.recoveryReason}:{},...i?.failureReason?{failureReason:i.failureReason}:{}};return a?{runner:e,cache:a.cache,artifact:a.artifact,buildMs:a.buildMs,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),xctestrunPath:a.xctestrunPath,...o}:{runner:e,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),...o}}function Kr(e,t){return qr(e,t),t}function qr(e,t){b({level:t.failureReason?`warn`:`info`,phase:`apple_runner_prepare`,data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,timingContainment:t.buildMs===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}const Jr={maxAttempts:8,baseDelayMs:200,maxDelayMs:1e3,jitter:0};function Yr(e){return Pt(e)?8:w(e)?3:1}async function Xr(e,t,n={}){Qn(e),E(n.requestId);let r=C(t),i=$(e,n);if(!T(r))return i.runCommand(e,r,n);let a;try{return await Me(()=>(E(n.requestId),i.runCommand(e,r,n)),{...Jr,shouldRetry:(e,t)=>(E(n.requestId),Pt(e)&&(a=e),t<Yr(e))},{signal:S(n)})}catch(e){throw a&&Ct(n)?a:e}}async function Zr(e,t={}){if(d(e))try{await Xr(e,{command:`targetReset`},t)}catch(t){b({level:`warn`,phase:`ios_runner_target_reset_failed`,data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}}),await z(e.id)}}function Qr(e,t={}){if(d(e)){if(Le()){b({level:`debug`,phase:`ios_runner_cache_prewarm_unavailable`,data:{deviceId:e.id}});return}return ei({device:e,options:t,failurePhase:`ios_runner_cache_prewarm_failed`,task:async t=>{await ln(e,{...t,budget:Ke(t.buildTimeoutMs,t.signal)})}})}}function $r(e,t={}){if(!d(e))return;let n=$(e,t).prewarm;if(!n){b({level:`debug`,phase:`ios_runner_session_prewarm_unavailable`,data:{deviceId:e.id}});return}return ei({device:e,options:t,failurePhase:`ios_runner_session_prewarm_failed`,task:async t=>{await n(e,t)}})}function ei(e){let{device:t,options:n,failurePhase:r,task:i}=e,{propagateError:a=!1,...o}=n;return i(o).catch(e=>{if(b({level:`warn`,phase:r,data:{deviceId:t.id,error:e instanceof Error?e.message:String(e)}}),a)throw e})}async function ti(e,t){Qn(e),E(t.requestId);let n=C({command:`uptime`}),r=$(e,t);if(r.prepare)return await r.prepare(e,t);let i=Date.now();return{runner:await r.runCommand(e,n,t),connectMs:0,healthCheckMs:Math.max(0,Date.now()-i)}}function $(e,t){return ke(e,ii,{requestId:t.requestId})}function ni(e,t={}){return d(e)?$(e,t).hasLiveSession(e):!1}async function ri(e,t={}){if(!d(e))return!1;let n=$(e,t).releaseSpeculativeSession;return n?await n(e):!1}const ii=Oe(Ir,{prepare:jr,hasLiveSession:e=>F(e.id)?.liveness===`ready`,releaseSpeculativeSession:async e=>await Wn(e.id),prewarm:async(e,t)=>{let{healthCheck:n,...r}=t;if(n===!1){await P(e,{...r,speculative:!0});return}await jr(e,{...r,speculative:!0,healthTimeoutMs:ct})}});var ai=e({cleanupRunnerLeasesForOwner:()=>Qt,readRunnerSessionLiveness:()=>F});Re(fn);export{Qr as a,Xr as c,Kn as d,Yn as f,ti as i,Jn as l,ni as n,$r as o,z as p,Zr as r,ri as s,ai as t,F as u};
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{B as t,H as n,I as r,L as i,P as a,q as o}from"./sdk-contracts.js";import{v as s}from"./sdk-batch-runner.js";import{c,r as l}from"./diagnostics.js";import"./diagnostics2.js";import{f as u,g as d,h as f}from"./sdk-device.js";import{o as p}from"./sdk-remote-config.js";import{A as m,D as h,a as g,b as ee,k as te,o as _,t as ne,w as re,y as ie,z as ae}from"./file.js";import{h as oe,i as se,m as ce,n as le,o as ue,p as de,u as fe}from"./exec.js";import{n as pe,r as me,t as he}from"./retry.js";import"./command.js";import"./process.js";import{a as ge,o as _e,r as ve}from"./version.js";import"./retry2.js";import{s as ye}from"./device-shell.js";import{t as be}from"./keyed-lock.js";import{n as xe,t as Se}from"./boot-diagnostics.js";import{t as Ce}from"./parser.js";import{i as we,r as Te}from"./request-cancel.js";import{t as Ee}from"./request.js";import{a as De,n as Oe,o as ke,r as Ae}from"./tool-provider.js";import{t as je}from"./physical-device-control.js";import{T as Me,_ as Ne,b as Pe,d as Fe,f as v,g as Ie,h as Le,l as Re,m as ze,n as Be,p as y,s as b,u as Ve,v as He,w as Ue}from"./runner.js";import{A as We,B as Ge,C as Ke,D as qe,E as Je,F as Ye,G as Xe,H as Ze,I as Qe,P as $e,Q as et,S as tt,U as x,W as nt,X as rt,Y as it,d as at,et as ot,f as st,g as ct,j as lt,k as ut,m as dt,o as ft,q as pt,r as mt,s as ht,tt as gt,x as S}from"./apple-runner-platform.js";import{i as _t,r as vt}from"./runner-toolchain-probe.js";import{t as yt}from"./plist-xml.js";import{n as bt,t as xt}from"./runner-owner-state.js";import{n as St,u as Ct}from"./simctl.js";import{c as wt,d as Tt,f as Et,i as Dt,l as Ot,n as kt,o as At,p as jt,r as Mt,s as Nt,t as Pt,u as Ft}from"./runner-startup-transport.js";import{A as It,D as Lt,E as Rt,I as zt,M as Bt,O as Vt,P as Ht,R as C,S as Ut,_ as Wt,a as w,b as Gt,f as Kt,g as qt,h as Jt,i as Yt,j as Xt,l as Zt,n as Qt,o as $t,r as en,u as tn,v as nn,w as T}from"./runner-error-classification.js";import{a as rn,i as an,n as on,r as sn,t as cn}from"./runner-device-set.js";import{C as ln,D as un,S as dn,T as fn,_ as pn,a as mn,b as hn,f as gn,g as _n,h as vn,i as yn,l as bn,m as xn,n as Sn,o as Cn,p as wn,r as Tn,s as En,t as Dn,u as On,v as kn,w as An,x as E,y as jn}from"./runner-lease.js";import Mn from"node:crypto";import D from"node:fs";import Nn from"node:os";import O from"node:path";const Pn={runCmdStreaming:de,runCmdSync:ce,runCmdBackground:fe,requireExecSuccess:ue,isCommandTimeoutError:se,commandDeveloperDir:le,shellQuote:ye,emitDiagnostic:l,withDiagnosticTimer:c,retryWithPolicy:me,isEnvTruthy:pe,deadlineFromTimeoutMs:(e,t)=>he.fromTimeoutMs(e,t),isProcessAlive:ie,isProcessGroupAlive:ee,readProcessStartTime:te,readProcessCommand:h,signalPidsBestEffort:m,signalProcessGroupBestEffort:oe,findProjectRoot:ve,readVersion:ge,acquireProcessLock:ne,withProcessLock:g,withKeyedLock:be,publishFileSync:ae,classifyOwnerLiveness:_,readHostCpuArchSync:re,createTtlMemo:_e,parseBooleanLiteral:p,isRecord:s,emitRequestProgress:Ee,getRequestSignal:Te,isRequestCanceled:we,classifyBootFailure:xe,bootFailureHint:Se,runAppleToolCommand:De,runXcrun:ke,readApplePlistJson:Ae,hasScopedAppleToolProvider:Oe,buildSimctlArgsForDevice:St,simulatorAddressFor:Ct,resolveIosPhysicalDeviceControl:je,visitXmlPlistEntries:yt,leaseOwnerStateDir:bt,hasDeviceClaimAuthority:e=>xt()?.(e)??!1},Fn=new Set([`RUNNER_PRODUCT_MISSING`,`RUNNER_PRODUCT_REPAIR_FAILED`]),In=[`--force`,`--preserve-metadata=identifier,entitlements,flags,runtime`,`--sign`,`-`];async function Ln(e,t,n){if(!d(e))return;if(t.length===0)throw new a(`COMMAND_FAILED`,`Missing macOS runner product`,{reason:`RUNNER_PRODUCT_MISSING`,xctestrunPath:n});let r=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of r)if(!D.existsSync(e))throw new a(`COMMAND_FAILED`,`Missing macOS runner product`,{reason:`RUNNER_PRODUCT_MISSING`,productPath:e,xctestrunPath:n});for(let e of r)await Vn(e)||await Rn(e,n)}async function Rn(e,t){try{let t=O.join(e,`Contents`,`Frameworks`),n=D.existsSync(t)?D.readdirSync(t).sort().map(e=>O.join(t,e)):[];for(let e of n)await x(`codesign`,[...In,e]);await x(`codesign`,[...In,e])}catch(n){let i=r(n,`COMMAND_FAILED`);throw zn(e,t,i.message,i.details)}if(!await Vn(e))throw zn(e,t,`Product still fails code signature verification after re-signing`)}function zn(e,t,n,r){return new a(`COMMAND_FAILED`,`Failed to repair macOS runner product signature`,{reason:`RUNNER_PRODUCT_REPAIR_FAILED`,productPath:e,xctestrunPath:t,error:n,details:r})}function Bn(e){if(!(e instanceof a))return!1;let t=e.details&&typeof e.details==`object`?e.details.reason:void 0;return typeof t==`string`&&Fn.has(t)}async function Vn(e){return(await x(`codesign`,[`--verify`,`--deep`,`--strict`,e],{allowFailure:!0})).exitCode===0}const Hn=new Set([`ProductPaths`,`DependentProductPaths`,`TestHostPath`,`TestBundlePath`,`UITargetAppPath`]);async function Un(e){let t=await Kn(e);if(!t||t.length===0)return null;let n=O.dirname(e),r=new Set,i=Wn(t,n);for(let e of i.testRootPaths){if(!D.existsSync(e))return null;r.add(e)}for(let e of Gn(i)){if(!e)return null;r.add(e)}return Array.from(r)}function Wn(e,t){let n=[],r=new Set,i=[];for(let a of e){if(a.startsWith(`__TESTHOST__/`)){i.push(a.slice(13));continue}if(!a.startsWith(`__TESTROOT__/`))continue;let e=a.slice(13);n.push(O.join(t,e));let o=$n(e);o&&r.add(O.join(t,o))}return{testRootPaths:n,hostRoots:Array.from(r),hostRelativePaths:i}}function Gn(e){return e.hostRelativePaths.map(t=>{let n=e.hostRoots.find(e=>D.existsSync(O.join(e,t)));return n?O.join(n,t):null})}async function Kn(e){let t=await Qe(e);if(t)return qn(t);if(process.platform===`darwin`)return null;try{return Zn(D.readFileSync(e,`utf8`))}catch{return null}}function qn(e){let t=new Set;for(let n of[e,...Jn(e),...Yn(e)])for(let e of Xn(n))t.add(e);return Array.from(t)}function Jn(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!lt(e))continue;let t=e.TestTargets;Array.isArray(t)&&n.push(...t.filter(lt))}return n}function Yn(e){return Object.values(e).filter(e=>lt(e)&&`TestBundlePath`in e)}function Xn(e){let t=new Set;for(let[n,r]of Object.entries(e))if(Hn.has(n)){if(typeof r==`string`){t.add(r);continue}if(Array.isArray(r))for(let e of r)typeof e==`string`&&t.add(e)}return Array.from(t)}function Zn(e){return Qn(Ce(e))}function Qn(e){let t=new Set;return et(e,(e,n)=>{if(Hn.has(e)){if(n.name===`string`&&n.text){t.add(n.text);return}if(n.name===`array`)for(let e of n.children)e.name===`string`&&e.text&&t.add(e.text)}}),Array.from(t)}function $n(e){let t=/\.app(?:\/|$)/.exec(e);return!t||t.index===void 0?null:e.slice(0,t.index+4)}const er=[`CFBundleIcons`,`CFBundleIcons~ipad`];async function tr(e){await nr(gr(e))}async function nr(e){let t=e.filter(pr);if(t.length===0)return;let n=e.filter(e=>hr(e)&&!mr(e));for(let e of t){let t=fr(e,n);t&&await rr(t,e)}}async function rr(e,t){let n=ir(e,t),r=await ar(e,t);(n||r)&&(await cr(t),dr(t))}function ir(e,t){let n=!1;for(let r of D.readdirSync(e,{withFileTypes:!0}))!r.isFile()||!ur(r.name)||lr(O.join(e,r.name),O.join(t,r.name))&&(n=!0);return n}async function ar(e,t){let n=O.join(e,`Info.plist`),r=O.join(t,`Info.plist`),i=await Qe(n),a=await Qe(r);if(!i||!a)return!1;let o=or(i,a);if(o.length===0)return!1;for(let e of o)await sr(r,e.key,e.value,e.shouldInsert);return!0}function or(e,t){return er.flatMap(n=>{let r=e[n];return r===void 0||JSON.stringify(t[n])===JSON.stringify(r)?[]:[{key:n,value:r,shouldInsert:t[n]===void 0}]})}async function sr(e,t,n,r){Ge(await x(`plutil`,[r?`-insert`:`-replace`,t,`-json`,JSON.stringify(n),e],{allowFailure:!0}),`Failed to update XCTest runner icon plist`,{key:t,plistPath:e})}async function cr(e){Ge(await x(`codesign`,[`--force`,`--sign`,`-`,`--timestamp=none`,`--generate-entitlement-der`,e],{allowFailure:!0}),`Failed to sign XCTest runner app after icon update`,{runnerAppPath:e})}function lr(e,t){if(D.existsSync(t)){let n=D.readFileSync(e),r=D.readFileSync(t);return!n.equals(r)&&(D.copyFileSync(e,t),!0)}return D.copyFileSync(e,t),!0}function ur(e){return/^AppIcon.*\.png$/.test(e)||e===`Assets.car`}function dr(e){let t=new Date;D.utimesSync(e,t,t)}function fr(e,t){let n=O.dirname(e);return t.find(e=>O.dirname(e)===n&&O.basename(e)===`AgentDeviceRunner.app`)??t.find(t=>O.dirname(t)===n&&t!==e)??null}function pr(e){return hr(e)&&mr(e)&&(e.includes(`Debug-iphonesimulator`)||e.includes(`Release-iphonesimulator`)||e.includes(`Debug-appletvsimulator`)||e.includes(`Release-appletvsimulator`))}function mr(e){return O.basename(e).endsWith(`-Runner.app`)}function hr(e){return O.basename(e).endsWith(`.app`)}function gr(e){if(!D.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop();for(let r of D.readdirSync(e,{withFileTypes:!0})){if(!r.isDirectory())continue;let i=O.join(e,r.name);if(hr(i)){t.push(i);continue}n.push(i)}}return t.sort((e,t)=>e.localeCompare(t))}const k=`AgentDeviceRunner.env`,_r=`session`,vr=`${Cr(`${k}.${_r}`)}-`;function yr(e){return Sr(`${_r}-${e.deviceId}-${e.ownerToken}-${e.port}`)}function br(e){return`${vr}${Cr(Sr(e))}-[0-9]`}function xr(e){let t=e?O.basename(e):``;if(t.startsWith(`${k}.`))return Cr(t)}function Sr(e){return e.replaceAll(/[^a-zA-Z0-9._-]/g,`_`)}function Cr(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const wr={PreferredScreenCaptureFormat:`screenshots`,SystemAttachmentLifetime:`keepNever`,UserAttachmentLifetime:`keepNever`};async function Tr(e,t,n,r={}){let i=r.iosXctestEnvDir?.trim(),a=i?O.resolve(i):O.dirname(e);D.mkdirSync(a,{recursive:!0});let o=Sr(n),s=O.join(a,`${k}.${o}.json`),c=O.join(a,`${k}.${o}.xctestrun`),l=await Er(e);return kr(l,e=>{e.EnvironmentVariables={...e.EnvironmentVariables,...t}}),Or(l),await Dr(l,s,c),{xctestrunPath:c,jsonPath:s}}async function Er(e){let t=await x(`plutil`,[`-convert`,`json`,`-o`,`-`,e],{allowFailure:!0});if(t.exitCode!==0||!t.stdout.trim())throw new a(`COMMAND_FAILED`,`Failed to read xctestrun plist`,{xctestrunPath:e,stderr:t.stderr});try{let e=JSON.parse(t.stdout);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Root must be an object`);return e}catch(t){throw new a(`COMMAND_FAILED`,`Failed to parse xctestrun JSON`,{xctestrunPath:e,error:String(t)})}}async function Dr(e,t,n){Ye({destination:t,contents:JSON.stringify(e,null,2),mode:384});let r=Ge(await x(`plutil`,[`-convert`,`xml1`,`-o`,`-`,t],{allowFailure:!0}),`Failed to write xctestrun plist`,{tmpXctestrunPath:n});Ye({destination:n,contents:r.stdout,mode:384})}function Or(e){kr(e,e=>Object.assign(e,wr),{requireTestBundlePath:!0})}function kr(e,t,n={}){let r=e.TestConfigurations;if(Array.isArray(r))for(let e of r)!e||typeof e!=`object`||Ar(e.TestTargets,t,n);for(let n of Object.values(e)){let e=jr(n,{requireTestBundlePath:!0});e&&t(e)}}function Ar(e,t,n){if(Array.isArray(e))for(let r of e){let e=jr(r,n);e&&t(e)}}function jr(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return null;let n=e;return t.requireTestBundlePath&&!n.TestBundlePath?null:n}const Mr=new Map,A=new Map;function Nr(e){return qr(Jr(e,!0))}function Pr(e){return qr(Jr(e,!1))}function Fr(e){e.retryPending=!1;let t=A.get(e.deviceId);t&&(t.inFlight.delete(e),Kr(e.deviceId,t))}function Ir(e){let t=Gr(e);t.pendingTeardowns+=1;for(let e of t.inFlight)e.close(`device_teardown`);let n=!1;return()=>{n||(n=!0,--t.pendingTeardowns,Kr(e,t))}}function Lr(e){let t=[...new Set([...A.keys(),...e??[]])].map(e=>Ir(e));return()=>{for(let e of t.splice(0))e()}}function Rr(e){return(A.get(e)?.pendingTeardowns??0)>0}function zr(e){let t=e;return!t.mintedByStart||t.admitted||t.retired!==`device_teardown`||Rr(t.deviceId)?!1:(t.readmit(),!0)}function Br(e,t){return t&&!t.admitted?!1:!Rr(e)}function Vr(e){return i({runnerStartRetired:!0,runnerStartRetirementReason:e})}function j(e,t){if(!Br(e,t))throw Vr(t?.retired??`device_teardown`)}function Hr(e,t){return t.aborted?`already-spent`:(e.interestedWaiters.add(t),`interested`)}function Ur(e,t){let n=e;return n.interestedWaiters.delete(t),!n.admitted||n.interestedWaiters.size>0?!1:n.close(`last_waiter_canceled`)}function Wr(e,t){e.interestedWaiters.delete(t)}function Gr(e){let t=A.get(e);if(t)return t;let n={pendingTeardowns:0,inFlight:new Set};return A.set(e,n),n}function Kr(e,t){t.pendingTeardowns<=0&&t.inFlight.size===0&&A.delete(e)}function qr(e){return Gr(e.deviceId).inFlight.add(e),e}function Jr(e,t){let n=new Set,r;return{deviceId:e,interestedWaiters:n,mintedByStart:t,retryPending:!1,get admitted(){return r===void 0},get retired(){return r},close(t){return!r&&(r=t,S({level:`debug`,phase:`ios_runner_start_admission_retired`,data:{deviceId:e,reason:t}}),!0)},readmit(){r=void 0,S({level:`debug`,phase:`ios_runner_start_admission_readmitted`,data:{deviceId:e}})}}}const M=new Set;function Yr(e,t,n){let r={deviceId:e,startAdmission:n,child:t};M.add(r),t.on(`close`,()=>{M.delete(r)})}function Xr(e){return ei(e).map(e=>e.child)}function Zr(e){return ei(e).filter(e=>e.startAdmission===void 0||!Qr(e.startAdmission)).map(e=>e.child)}function Qr(e){let t=e;return t.interestedWaiters.size>0||t.retryPending}function $r(e){e.retryPending=!0}function ei(e){return[...M].filter(t=>e===void 0||t.deviceId===e)}function ti(e){for(let t of M)t.child===e&&M.delete(t)}async function ni(e,t){let n=ii(t);if(n)return n;let r=Ke(),i=b(e,r,t.budget),a=y(e,i),o=await ot(Mr,a,async()=>await gt({acquire:()=>pn(a),task:()=>oi({device:e,options:t,projectRoot:r,expectedCacheMetadata:i,derived:a,forceRebuild:t.forceRunnerXctestrunRebuild===!0})}));return o.artifact===`rebuilt`&&ri(a),o}async function ri(e){try{let{evictStaleRunnerCaches:t}=await import(`./runner-cache-retention.js`);await t(e)}catch(t){S({level:`warn`,phase:`runner_xctestrun_cache_eviction_unavailable`,data:{derived:e,error:t instanceof Error?t.message:String(t)}})}}function ii(e){let t=e.iosXctestrunFile?.trim();if(!t)return null;let n=O.resolve(t);if(!D.existsSync(n))throw new a(`COMMAND_FAILED`,`Configured iOS XCTest runner .xctestrun file not found`,{configKey:`iosXctestrunFile`,xctestrunPath:n});let r=e.iosXctestDerivedDataPath?.trim(),i=r?O.resolve(r):ai(n);return E(`reuse`,`external_xctestrun`,{derived:i,xctestrunPath:n}),{xctestrunPath:n,derived:i,cache:`external`,artifact:`valid`,buildMs:0,xctestrunPathSource:`external`}}function ai(e){let t=Mn.createHash(`sha1`);t.update(e);let n=t.digest(`hex`).slice(0,12);return O.join(Nn.tmpdir(),`agent-device-ios-xctest-derived`,n)}async function oi(e){let{device:t,options:n,projectRoot:r,expectedCacheMetadata:i,derived:a}=e;hn(a,e.forceRebuild);let o=await ln({derived:a,expectedCacheMetadata:i}),s=o.reason===`reuse_ready`?`exact`:`miss`;return await si({device:t,derived:a,expectedCacheMetadata:i,existing:o,cache:s})||(o.reason!==`reuse_ready`&&dn(o,a),o.reason!==`cache_metadata_missing`&&(kn(a),jn(a)),await ci({device:t,options:n,projectRoot:r,expectedCacheMetadata:i,derived:a,cache:s,reason:o.reason}))}async function si(e){let{device:t,derived:n,expectedCacheMetadata:r,existing:i,cache:a}=e;if(i.reason!==`reuse_ready`)return null;let o=await ui(t,n,r,i);return o?{xctestrunPath:o,derived:n,cache:a,cacheKey:v(r),artifact:`valid`,buildMs:0,xctestrunPathSource:`manifest`}:null}async function ci(e){let{device:t,options:n,projectRoot:r,expectedCacheMetadata:i,derived:o,cache:s,reason:c}=e,l=Pe(r);if(!D.existsSync(l))throw new a(`COMMAND_FAILED`,`iOS runner project not found`,{projectPath:l});let u=_t(n.budget,`runner_xctestrun_build`),d=Date.now();tt({type:`command`,status:`progress`,message:`Building Apple runner...`}),await gi(t,l,o,n,u);let f=Math.max(0,Date.now()-d),p=fi(o,t);if(!p)throw new a(`COMMAND_FAILED`,`Failed to locate .xctestrun after build`);let m=await Un(p);if(!m)throw new a(`COMMAND_FAILED`,`Runner build is missing expected products`,{xctestrunPath:p});return await Ln(t,m,p),await nr(m),fn(await un(o,i,p,m),o),await li(ze(t,i),o,[p,...m]),E(`build`,`built_new`,{derived:o,xctestrunPath:p}),{xctestrunPath:p,derived:o,cache:s,cacheKey:v(i),artifact:`rebuilt`,buildMs:f,xctestrunPathSource:`build`,reason:c}}async function li(e,t,n){try{let{trimRunnerBuildScratch:r}=await import(`./runner-cache-trim.js`);(await r(t,n,e)).length>0&&E(`clean`,`build_scratch_trimmed`,{derived:t})}catch(e){S({level:`warn`,phase:`runner_xctestrun_cache_trim_failed`,data:{derived:t,error:e instanceof Error?e.message:String(e)}})}}async function ui(e,t,n,r){try{return await Ln(e,r.productPaths,r.xctestrunPath),fn(await un(t,n,r.xctestrunPath,r.productPaths),t),E(`reuse`,`reuse_ready`,{derived:t,xctestrunPath:r.xctestrunPath}),r.xctestrunPath}catch(e){if(!Bn(e))throw e;return E(`rebuild`,`repair_failed`,{derived:t,xctestrunPath:r.xctestrunPath}),null}}async function di(e){try{let t=Ke(),n=b(e,t),r=y(e,n);return(await ln({derived:r,expectedCacheMetadata:n})).reason===`reuse_ready`}catch{return!1}}function fi(e,t){let n=pi(e);return n.length===0?null:(n.sort((e,n)=>mi(e,n,t)),n[0]?.path??null)}function pi(e){if(!D.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop(),r=D.readdirSync(e,{withFileTypes:!0});for(let i of r){let r=O.join(e,i.name);if(i.isDirectory()){n.push(r);continue}if(i.isFile()&&i.name.endsWith(`.xctestrun`))try{let e=D.statSync(r);t.push({path:r,mtimeMs:e.mtimeMs})}catch{}}}return t}function mi(e,t,n){if(n){let r=hi(t.path,n)-hi(e.path,n);if(r!==0)return r}return t.mtimeMs-e.mtimeMs||e.path.localeCompare(t.path)}function hi(e,t){let n=0,r=e.toLowerCase();O.basename(r).startsWith(`agentdevicerunner.env.`)&&(n-=1e3),r.includes(`${O.sep}macos${O.sep}`)&&(n-=5e3);let i=at(t);return i.preferred.length>0&&(i.preferred.some(e=>r.includes(e))?n+=2e3:n-=500),i.disallowed.some(e=>r.includes(e))&&(n-=2500),n}async function gi(e,t,n,r,i){j(e.id,r.startAdmission);let s=Fe(process.env),c=He(process.env,e.kind===`device`,e),l=e.kind===`device`?[`-allowProvisioningUpdates`]:[],u=Ie(),d=Re(process.env),f=Ne();try{await Xe(`xcodebuild`,[`build-for-testing`,`-project`,t,`-scheme`,`AgentDeviceRunner`,`-parallel-testing-enabled`,`NO`,Le(e),`1`,...rn(e,mt(e)),`-derivedDataPath`,n,...Ve(n),...u,...d,...f,...s,...l,...c],{detached:!0,timeoutMs:i,signal:r.budget?.signal,onSpawn:t=>{Yr(e.id,t,r.startAdmission)},onStdoutChunk:e=>{Ft(e,r.logPath,r.traceLogPath,r.verbose)},onStderrChunk:e=>{Ft(e,r.logPath,r.traceLogPath,r.verbose)}})}catch(t){if(o(t))throw t;let n=t instanceof a?t:new a(`COMMAND_FAILED`,String(t)),i=on(e),{reason:s,hint:c,matched:l}=en(new a(n.code,n.message,{...n.details,...i})),u=qe(n),d=`xcodebuild build-for-testing failed`;throw new a(`COMMAND_FAILED`,s===`simulator_set_destination_not_found`?an(d,e,i):d,{reason:s,error:n.message,details:n.details,logPath:r.logPath,hint:c,startupRuleMatched:l,startupHostDeadlineHit:u,...i})}}const _i={starting:[`ready`,`draining`,`stopped`],ready:[`draining`,`stopped`],draining:[`stopped`],stopped:[]};function N(e,t){_i[e.state].includes(t)&&(e.state=t)}function vi(e){return e.state===`starting`||e.state===`ready`}function P(e){return e?.runnerMainThreadBusy===!0}var yi=class{charges=[];get hasOutstandingCharges(){return this.charges.length>0}get outstandingChargeCount(){return this.charges.length}get hasAbandonedCharges(){return this.charges.some(e=>e.abandoned)}charge(e){this.charges.push({commandId:Ci(e),abandoned:!1})}markAbandoned(e){let t=this.findChargeIndex(e);t!==-1&&(this.charges[t].abandoned=!0)}withdrawUnsent(e){let t=this.findChargeIndex(e);t!==-1&&this.charges.splice(t,1)}settleAnswered(e){let t=this.findChargeIndex(e);if(t===-1)return;let n=this.charges[t];if(this.charges.splice(t,1),n.abandoned)return;let r=this.charges.findIndex((e,n)=>n<t&&e.abandoned);r!==-1&&this.charges.splice(r,1)}settleTerminalEvidence(e){let t=Ci(e);if(t===``)return!1;let n=this.charges.filter(e=>e.commandId!==t||!e.abandoned);return n.length!==this.charges.length&&(this.charges=n,!0)}findChargeIndex(e){let t=Ci(e);if(t===``)return-1;for(let e=this.charges.length-1;e>=0;--e)if(this.charges[e].commandId===t)return e;return-1}};const bi=new Set([`completed`,`failed`]),xi=new Set([`accepted`,`started`]);function Si(e,t,n){if(bi.has(n))return e.commandCharges.settleTerminalEvidence(t.commandId)}function Ci(e){return e?.trim()??``}function wi(e){return e.state===`ready`?e.retention?{detach:!1,reason:`retained_idle`}:e.commandCharges.hasOutstandingCharges?{detach:!1,reason:`command_in_flight`}:P(e)?{detach:!1,reason:`main_thread_occupied`}:{detach:!0}:{detach:!1,reason:`runner_never_served_a_command`}}function Ti(e){return e.processRunning?e.state:`gone`}function Ei(e,t){return`${e}:${t}:${Date.now()}`}function Di(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Math.floor(e):void 0}var Oi=e({RUNNER_INVALIDATE_WAIT_TIMEOUT_MS:()=>F,abortRunnerSessionsAndPrepProcesses:()=>Mi,cleanupOwnedIosRunnerLease:()=>ji,disposeRunnerSession:()=>I,isRunnerProcessAlive:()=>L,runnerLeaseCleanupAdapter:()=>Ai,stopRunnerPrepProcesses:()=>Ni,stopRunnerPrepProcessesWithoutLiveOwner:()=>Pi});const F=1e3,ki=2e3,Ai={cleanupRunnerProcessTree:z,cleanupRunnerXcodebuildProcesses:Ki,cleanupTempFile:At};async function I(e,t={}){e.retention?.cancel(),e.listenerWatch?.close(),N(e,`draining`);let n=!1;if(t.graceful!==!1)n=await Ii(e);else if(d(e.device)){await Ri([e]),await Bi(e,t);return}else await z(e.child.pid,`SIGTERM`);n||(await Li(e,t.waitTimeoutMs??1e4),Wi(e.child.pid)&&await z(e.child.pid,`SIGKILL`)),await Bi(e,t)}async function ji(e){await Tn(e,Ai)}async function Mi(e){let t=Xr(),n=e.filter(e=>d(e.device)),r=e.filter(e=>!d(e.device));for(let t of e)t.retention?.cancel(),t.listenerWatch?.close(),N(t,`draining`);await R(r,`SIGINT`),await Gi(t,`SIGINT`),await R(r,`SIGTERM`),await Gi(t,`SIGTERM`),await R(r,`SIGKILL`),await Gi(t,`SIGKILL`),await Ri(n),await Promise.allSettled(e.map(async e=>{await Bi(e)}))}async function Ni(e){await Fi(Xr(e))}async function Pi(e){await Fi(Zr(e))}async function Fi(e){await Promise.allSettled(e.map(async e=>{try{await z(e.pid,`SIGTERM`),await z(e.pid,`SIGKILL`)}finally{ti(e)}}))}async function Ii(e){try{return await kt(e.device,e.endpoint,C({command:`shutdown`}),void 0,15e3),!1}catch{return d(e.device)?(await Ri([e]),!0):(await z(e.child.pid,`SIGTERM`),!1)}}async function Li(e,t){let n;try{return await Promise.race([e.testPromise.then(()=>!0,()=>!0),new Promise(e=>{n=setTimeout(()=>e(!1),t)})])||!Wi(e.child.pid)}finally{n&&clearTimeout(n)}}async function Ri(e){if(e.length===0)return;await R(e,`SIGINT`);let t=await zi(e,5e3);await R(t,`SIGTERM`),await R(await zi(t,2e3),`SIGKILL`)}async function zi(e,t){let n=await Promise.all(e.map(async e=>await Li(e,t)));return e.filter((e,t)=>!n[t])}async function Bi(e,t={}){await Vi(e,t),At(e.xctestrunPath),At(e.jsonPath),N(e,`stopped`)}async function Vi(e,t){let n=async()=>{if(!Hi(e))try{await Ui(e.device)}finally{gn(e.lease)}};if(t.leaseLockHeld){await n();return}try{await vn(e.deviceId,n)}catch(t){S({level:`warn`,phase:`ios_runner_disposal_lease_lock_unavailable`,data:{deviceId:e.deviceId,sessionId:e.sessionId,error:t instanceof Error?t.message:String(t)}})}}function Hi(e){let t=mn(e.deviceId);return t!==null&&t!==e.lease?.ownerToken}async function Ui(e){e.kind===`simulator`&&await Promise.allSettled(Be.map(async t=>{try{await pt(ct(e,[`terminate`,e.id,t]),{allowFailure:!0,timeoutMs:ki})}catch(n){S({level:`warn`,phase:`ios_runner_simulator_app_terminate_failed`,data:{deviceId:e.id,bundleId:t,timeoutMs:ki,error:n instanceof Error?n.message:String(n)}})}}))}function Wi(e){return e?L(e)||We(e):!1}function L(e){return e?ut(e):!1}async function R(e,t){await Promise.allSettled(e.map(async e=>{await z(e.child.pid,t)}))}async function Gi(e,t){await Promise.allSettled(e.map(async e=>{await z(e.pid,t),t===`SIGKILL`&&ti(e)}))}async function z(e,t){if(!e||e<=0)return;rt(e,t),it([e],t);let n=t===`SIGINT`?`INT`:t===`SIGTERM`?`TERM`:`KILL`;try{await x(`pkill`,[`-${n}`,`-P`,String(e)],{allowFailure:!0})}catch{}}async function Ki(e){let{deviceId:t}=e,n=`xcodebuild.*test-without-building.*${xr(e.xctestrunPath)??br(t)}`;for(let e of[`TERM`,`KILL`])try{await x(`pkill`,[`-${e}`,`-f`,n],{allowFailure:!0,timeoutMs:2e3})}catch(n){S({level:`warn`,phase:`ios_runner_stale_xcodebuild_kill_failed`,data:{deviceId:t,signal:e,error:n instanceof Error?n.message:String(n)}})}}function qi(e=process.env){return $e(e.AGENT_DEVICE_IOS_RUNNER_DETACH??``)!==!1}async function Ji(e,t){if(!qi())return 0;let n=0;for(let[r,i]of e){let e=Yi(i);if(!e.detached){S({level:`debug`,phase:`ios_runner_session_detach_skipped`,data:{deviceId:r,sessionId:i.sessionId,lane:e.lane,reason:e.reason,outstandingCharges:i.commandCharges.outstandingChargeCount,hasAbandonedCharges:i.commandCharges.hasAbandonedCharges}});continue}n+=1,t(r,i),S({level:`info`,phase:`ios_runner_session_detached`,data:{deviceId:r,lane:e.lane,sessionId:i.sessionId,runnerPid:i.child.pid,port:i.endpoint.port,runnerLogPath:i.runnerLogPath}})}return n}function Yi(e){let t=ht(e.device);if(!t.handoff)return{detached:!1,lane:void 0,reason:t.reason};let n=t.lane,r=wi(e);if(!r.detach)return{detached:!1,lane:n,reason:r.reason};let i=e.lease;if(!i)return{detached:!1,lane:n,reason:`lease_absent`};if(!L(e.child.pid))return{detached:!1,lane:n,reason:`runner_process_dead`};try{_n(Dn(i))}catch{return{detached:!1,lane:n,reason:`lease_write_failed`}}return e.listenerWatch?.close(),e.endOutputObservation?.(),N(e,`stopped`),{detached:!0,lane:n}}async function Xi(e,t){if(!qi())return null;let n=ht(e),r=(t,r)=>(S({level:`debug`,phase:`ios_runner_lease_adoption_skipped`,data:{deviceId:e.id,lane:n.handoff?n.lane:void 0,runnerPid:r?.runnerPid,port:r?.port,reason:t}}),null);if(!n.handoff)return r(n.reason);let i=On(e.id);if(i.type===`absent`)return r(`lease_absent`);if(i.type===`refused`)return r(i.reason,i.lease);let a=i.lease,o=En(a);if(!o)return r(`runner_token_missing`,a);if(a.simulatorSetPath!==sn(e))return r(`simulator_set_mismatch`,a);let s=Zi(a,t.expectedRunnerSessionId);if(`refusal`in s)return r(s.refusal,a);let c=Qi(e,a,t.budget);if(`refusal`in c)return r(c.refusal,a);let l=s.value,u=c.value,d=await $i(e,o,n.lane,t.budget);if(d!==`answered`)return r(d,a);if(!Cn(a,l))return r(`runner_pid_recycled`,a);let f=na(e,a,o,l,u);try{_n(f.lease)}catch{return r(`lease_write_failed`,a)}return S({level:`info`,phase:`ios_runner_lease_adopted`,data:{deviceId:e.id,lane:n.lane,sessionId:f.sessionId,runnerPid:l,port:a.port,previousOwnerPid:a.ownerPid}}),f}function Zi(e,t){if(t!==void 0&&e.sessionId!==t)return{refusal:`session_identity_mismatch`};let n=e.runnerPid;return n?ut(n)?xn(e,n)?{value:n}:{refusal:`runner_pid_recycled`}:{refusal:`runner_process_dead`}:{refusal:`runner_pid_missing`}}function Qi(e,t,n){let r=ta(e,n);return r?t.cacheKey!==r.cacheKey||!t.xctestrunPath.startsWith(`${r.derived}${O.sep}`)?{refusal:`artifact_fingerprint_mismatch`}:{value:r}:{refusal:`expected_derived_unresolved`}}async function $i(e,t,n,r){let i=n===`physical_coredevice`?5e3:500,a=ea(r,i);if(a<=0)return`probe_budget_exhausted`;let s=Date.now(),c=!1;try{let n=await Dt(e,t,C({command:`uptime`}),a,r?.signal);return c=It(Vt(await n.text())),c?`answered`:`probe_failed`}catch(e){if(o(e))throw e;return`probe_failed`}finally{S({level:`debug`,phase:`ios_runner_lease_adoption_probe`,durationMs:Date.now()-s,data:{deviceId:e.id,port:t.port,lane:n,budgetCapMs:i,timeoutMs:a,answered:c}})}}function ea(e,t){return e?.deadline?Math.min(t,Math.floor(e.deadline.remainingMs())):t}function ta(e,t){try{let n=b(e,void 0,t);return{derived:y(e,n),cacheKey:v(n)}}catch(e){if(o(e))throw e;return null}}function na(e,t,n,r,i){let a=t.sessionId,o={xctestrunPath:t.xctestrunPath,...i,cache:`exact`,artifact:`valid`,buildMs:0,xctestrunPathSource:`manifest`,reason:`adopted_from_lease`},{child:s,wait:c}=ra(r);return{sessionId:a,device:e,deviceId:e.id,endpoint:n,xctestrunPath:t.xctestrunPath,xctestrunArtifact:o,jsonPath:t.jsonPath,testPromise:c,child:s,runnerLogPath:t.runnerLogPath,state:`ready`,commandCharges:new yi,lease:Sn({device:e,sessionId:a,runnerPid:r,endpoint:n,xctestrunPath:t.xctestrunPath,cacheKey:i.cacheKey,jsonPath:t.jsonPath,runnerLogPath:t.runnerLogPath})}}function ra(e){let t={pid:e,exitCode:null};return{child:t,wait:new Promise(n=>{let r=setInterval(()=>{ut(e)||(clearInterval(r),t.exitCode=-1,n({stdout:``,stderr:``,exitCode:-1}))},1e3);r.unref?.()})}}function ia(){let e=new AbortController,t=!1,n=``;return{wake:e.signal,observe:r=>{if(t)return;let i=n+r;if(i.includes(`AGENT_DEVICE_RUNNER_LISTENER_READY`)){t=!0,n=``,e.abort();return}n=i.slice(-33)},finish:()=>{t=!0,n=``,e.abort()}}}function aa(e){let t=e.logPath;D.mkdirSync(O.dirname(t),{recursive:!0});let n=D.openSync(t,`a`),r=Nt(t,n),i=oa(()=>{try{D.closeSync(n)}catch{}}),a=ia();try{let t=nt(`xcodebuild`,[`test-without-building`,`-only-testing`,`AgentDeviceRunnerUITests/RunnerTests/testCommand`,`-parallel-testing-enabled`,`NO`,`-test-timeouts-enabled`,`NO`,`-collect-test-diagnostics`,`never`,Le(e.device),`1`,`-destination-timeout`,`20`,`-xctestrun`,e.xctestrunPath,`-derivedDataPath`,e.derivedPath,...rn(e.device,ft(e.device))],{allowFailure:!0,detached:!0,signal:e.signal,stdio:[`ignore`,n,n],captureOutput:!1}),o=jt({file:r,onOutput:t=>{a.observe(t),(e.traceLogPath||e.verbose)&&Ft(t,void 0,e.traceLogPath,e.verbose)}}),s=oa(()=>{o.stop(),i()}),c=()=>{o.drain(),i(),a.finish()};return t.wait.then(c,c),{...t,startupRetryWake:a.wake,endOutputObservation:s,readLogTail:e=>Tt(r,e)}}catch(e){throw i(),e}}function oa(e){let t=!1;return()=>{t||(t=!0,e())}}const B=new Map,sa=new Map,ca=1e4;function V(e,t){return ot(sa,e,t)}async function H(e,t){let n=t.startAdmission,r=n??Nr(e.id),i=V(e.id,async()=>{let{openRunnerStartBudget:n,reserveRunnerStartOwnerInterest:i}=await import(`./runner-start-budget.js`);zr(r),j(e.id,r);let a=n(t),o=i(r,t);try{let n=B.get(e.id);if(n){fa(n,t.expectedRunnerSessionId);let r=await ga(e,n,a.phase);if(r)return r.retention?.cancel(),r}return await vn(e.id,async()=>await ua(e,t,a,r))}catch(e){throw a.exhausted.aborted?a.exhausted.reason:e}finally{a.close(),o()}}),{raceRunnerStartAgainstCaller:a}=await import(`./runner-start-budget.js`);return await a(n?i:i.finally(()=>Fr(r)),r,t.signal)}const la=1e4;async function ua(e,t,n,r){let a={},o=n.phase,s=o.signal,c=Pa(t.runnerLeaseContext,e.id);S({level:`debug`,phase:`ios_runner_session_startup`,data:{deviceId:e.id,logicalLeaseContext:c}});let l=await J(a,`adopt_detached_runner`,async()=>await Xi(e,{budget:o,expectedRunnerSessionId:t.expectedRunnerSessionId}));if(l)return l.startupTimings=a,l.logicalLeaseContext=c,j(e.id,r),B.set(e.id,l),l;pa(t.expectedRunnerSessionId),await J(a,`cleanup_stale_xcodebuild`,async()=>{await bn(e,Ai,c)}),await J(a,`ensure_booted`,async()=>{j(e.id,r),await Oa(e)});let u=await J(a,`verify_device_readiness`,async()=>await(await import(`./runner-device-readiness.js`)).preflightIosRunnerDeviceReadiness(e,{budgetMs:Math.min(la,o.deadline?.remainingMs()??la),signal:s}));await J(a,`verify_host_dev_tools_security`,async()=>{let{assertDevToolsSecurityForIosRunner:t}=await import(`./runner-dev-tools-security.js`);await t(e)}),t.cleanStaleBundles?await J(a,`cleanup_stale_bundles`,async()=>{await _a(e)}):(a.cleanup_stale_bundles=0,S({level:`debug`,phase:`ios_runner_startup_cleanup_stale_bundles_skipped`}));let d,f,p,m,h=Et(t.logPath,e.id),g;try{d=await J(a,`ensure_xctestrun`,async()=>await ni(e,{...t,startAdmission:r,budget:vt(ja(t,n),s)})),a.build_xctestrun=d.buildMs,f=await J(a,`allocate_port`,async()=>({port:await Ot(),token:Xt()})),{xctestrunPath:p,jsonPath:m}=await J(a,`prepare_xctestrun_env`,async()=>await Tr(d.xctestrunPath,zt(f),yr({deviceId:e.id,ownerToken:wn(),port:f.port}),{iosXctestEnvDir:t.iosXctestEnvDir})),d.buildMs>0&&tt({type:`command`,status:`progress`,message:`Starting XCTest runner...`}),g=await J(a,`launch_xcodebuild`,async()=>(await wt(h).catch(()=>{}),j(e.id,r),await aa({device:e,xctestrunPath:p,derivedPath:d.derived,signal:s,logPath:h,traceLogPath:t.traceLogPath,verbose:t.verbose})))}catch(e){throw Yt(e,u)}let ee=Ei(e.id,f.port),te=Sn({device:e,sessionId:ee,runnerPid:g.child.pid,endpoint:f,xctestrunPath:p,cacheKey:d.cacheKey,jsonPath:m,runnerLogPath:h}),_={sessionId:ee,device:e,deviceId:e.id,endpoint:f,xctestrunPath:p,xctestrunArtifact:d,jsonPath:m,runnerLogPath:h,testPromise:g.wait,child:g.child,endOutputObservation:g.endOutputObservation,readLogTail:g.readLogTail,state:`starting`,commandCharges:new yi,startupRetryWake:g.startupRetryWake,launchDeadline:st.fromTimeoutMs(Ma(n)),startupTimings:a,startupDeviceStates:u,logicalLeaseContext:c,lease:te,speculative:t.speculative===!0};if(s?.aborted)throw await I(_,{graceful:!1,waitTimeoutMs:F,leaseLockHeld:!0}),i();await da(e,_,r);try{_n(te)}catch(t){throw await G(e.id,_,{graceful:!1,waitTimeoutMs:F,leaseLockHeld:!0}),t}return B.set(e.id,_),_}async function da(e,t,n){if(!Br(e.id,n))throw await I(t,{graceful:!1,waitTimeoutMs:F,leaseLockHeld:!0}),Vr(n.retired??`device_teardown`)}function fa(e,t){if(t!==void 0&&e.sessionId!==t)throw ma()}function pa(e){if(e!==void 0)throw ma()}function ma(){return new a(`COMMAND_FAILED`,`Apple runner session ownership changed before command dispatch`,{reason:`runner_session_ownership_changed`})}async function ha(e,t){let n=ya(t);return n===`gone`?(await J({},`stop_stale_session`,async()=>{await G(e.id,t,{graceful:!1,waitTimeoutMs:F})}),!1):n!==`starting`&&n!==`ready`?!1:n===`starting`&&t.launchDeadline?.isExpired()?(S({level:`warn`,phase:`ios_runner_session_invalidated`,data:{deviceId:e.id,sessionId:t.sessionId,reason:`runner_launch_budget_exhausted`}}),await J({},`stop_expired_starting_session`,async()=>{await G(e.id,t,{graceful:!1,waitTimeoutMs:F})}),!1):cn(t.device,e)?!0:(await J({},`stop_other_simulator_set_session`,async()=>{await G(e.id,t)}),!1)}async function ga(e,t,n){if(!await ha(e,t))return null;let r=t.xctestrunArtifact;if(r?.cache===`external`)return S({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.state===`ready`,cache:r.cache,logicalLeaseContext:t.logicalLeaseContext}}),t;let i=b(e,void 0,n),a=y(e,i),o=v(i);return r?.derived!==a||r.cacheKey!==o?(S({level:`debug`,phase:`ios_runner_session_artifact_stale`,data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:r?.derived,expectedDerived:a,currentCacheKey:r?.cacheKey,expectedCacheKey:o}}),await J({},`stop_stale_artifact_session`,async()=>{await G(e.id,t)}),null):(S({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.state===`ready`,logicalLeaseContext:t.logicalLeaseContext}}),t)}async function _a(e){e.kind===`simulator`&&await Promise.allSettled(Be.map(async t=>{await va(e,t)}))}async function va(e,t){try{await pt(ct(e,[`uninstall`,e.id,t]),{allowFailure:!0,timeoutMs:ca})}catch(n){S({level:`warn`,phase:`ios_runner_startup_cleanup_stale_bundle_failed`,data:{deviceId:e.id,bundleId:t,timeoutMs:ca,error:n instanceof Error?n.message:String(n)}})}}function U(e){let t=B.get(e);return t?{sessionId:t.sessionId,liveness:ya(t)}:null}function ya(e){return Ti({state:e.state,processRunning:L(e.child.pid)})}async function W(e,t){await V(e.deviceId,async()=>{B.get(e.deviceId)===e&&vi(e)&&(S({level:`warn`,phase:`ios_runner_session_invalidated`,data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await G(e.deviceId,e,{graceful:!1,waitTimeoutMs:F}))})}async function G(e,t,n={}){let r=t??B.get(e);r&&vi(r)&&(await I(r,n),B.get(e)===r&&B.delete(e))}async function ba(e,t,n){await V(e.deviceId,async()=>{B.get(e.deviceId)===e&&e.retention===t&&(S({level:n===`listener_lost`?`warn`:`info`,phase:n===`listener_lost`?`ios_runner_warm_stop`:`ios_runner_idle_stop`,data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:n}}),await G(e.deviceId,e,{graceful:n!==`listener_lost`,waitTimeoutMs:F}))})}function xa(e,t){e.speculative&&!Ut(t)&&(e.speculative=!1)}async function Sa(e){return await V(e,async()=>{let t=B.get(e);return t?.speculative?(S({level:`debug`,phase:`ios_runner_speculative_released`,data:{deviceId:e,sessionId:t.sessionId,ready:t.state===`ready`}}),await K(e),!0):!1})}async function K(e){await Ca(e)}async function Ca(e,t){try{await V(e,async()=>{await vn(e,async()=>{let t=B.get(e);await G(e,t,{leaseLockHeld:!0,graceful:t?.state===`ready`&&!P(t)&&!t.listenerWatch?.lost}),await ji(e)}),t?.()})}finally{t?.()}}async function wa(e,t){let n=B.get(e),r=P(n),i=Ir(e);try{if(t.retain&&n?.state===`ready`&&!r){if(await V(e,async()=>{let t=B.get(e);if(!t)return!1;let{retainRunnerSession:n}=await import(`./runner-retention.js`);return await n(t,(e,n)=>ba(t,e,n))?(i(),!0):(S({level:`info`,phase:P(t)?`ios_runner_retain_skipped_busy`:`ios_runner_retain_skipped`,data:{deviceId:e,sessionId:t.sessionId,state:t.state}}),!1)}))return}else t.retain&&r&&n&&S({level:`info`,phase:`ios_runner_retain_skipped_busy`,data:{deviceId:e,sessionId:n.sessionId,state:n.state}});await Ni(e),await Ca(e,i)}finally{i()}}async function Ta(){let e=Array.from(B.values()),t=Lr(e.map(e=>e.deviceId));try{await Mi(e);for(let t of e)B.get(t.deviceId)===t&&B.delete(t.deviceId)}finally{t()}}async function Ea(){return await Ji(B,e=>{B.delete(e)})}async function Da(){let e=Lr(B.keys());try{await Ta();let e=Array.from(B.keys());await Promise.allSettled(e.map(async e=>{await K(e)})),await Ni()}finally{e()}}function Oa(e){return e.kind===`simulator`?e.booted?(S({level:`debug`,phase:`ios_runner_startup_ensure_booted_skipped`,data:{deviceId:e.id}}),Promise.resolve()):ka(e):Promise.resolve()}async function ka(e){await pt(ct(e,[`bootstatus`,e.id,`-b`]),{timeoutMs:Pt})}function Aa(e){if(!u(e.platform))throw new a(`UNSUPPORTED_PLATFORM`,`Unsupported platform for iOS runner: ${e.platform}`);if(e.kind!==`simulator`&&e.kind!==`device`)throw new a(`UNSUPPORTED_OPERATION`,`Unsupported iOS device kind for runner: ${e.kind}`)}async function q(e,t,n,r,i,a){Na(t,n.command);let{executeRunnerExchange:o}=await import(`./runner-exchange.js`),s=await o(e,t,n,r,i,e=>W(t,e),a);if(B.get(e.id)===t&&t.state===`ready`){let{observeRunnerListener:e}=await import(`./runner-retention.js`);e(t,()=>{let e=t.retention;if(e)return ba(t,e,`listener_lost`)})}return s}function ja(e,t){let n=_t(t.phase,`runner_xctestrun_build`)??t.timeoutMs,r=Di(e.buildTimeoutMs);return r===void 0?n:Math.min(r,n)}function Ma(e){let t=Math.floor(e.phase.deadline?.remainingMs()??e.timeoutMs);return e.explicit?t:Math.min(Pt,t)}async function J(e,t,n){let r=Date.now();try{return await n()}finally{let n=Date.now()-r;e[t]=n,S({level:`debug`,phase:`ios_runner_startup_${t}`,durationMs:n})}}function Na(e,t){if(e.startupTimingsReported||!e.startupTimings)return;e.startupTimingsReported=!0;let n=Object.values(e.startupTimings).reduce((e,t)=>e+t,0);S({level:`info`,phase:`ios_runner_session_startup_timings`,durationMs:n,data:{command:t,sessionId:e.sessionId,ready:e.state===`ready`,logicalLeaseContext:e.logicalLeaseContext,timings:e.startupTimings}})}function Pa(e,t){if(!e)return;let n={leaseId:Y(e.leaseId),clientId:Y(e.clientId),tenantId:Y(e.tenantId),runId:Y(e.runId),leaseProvider:Y(e.leaseProvider),deviceKey:Y(e.deviceKey)??t},r=Object.entries(n).filter(([,e])=>e!==void 0);return r.length>0?Object.fromEntries(r):void 0}function Y(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}async function Fa(e){let{device:t,session:n,command:r,transportError:i,options:a,signal:o,invalidationReason:s}=e;return await Ia(await Ha(t,n,r,i,a,o),{command:r,session:n,transportError:i,options:a,invalidationReason:s,invalidateSession:e.invalidateSession})}async function Ia(e,t){if(e.type===`recovered`)return za(e,t);let n=La(e,t);if(e.type===`skipInvalidation`)throw Ba(e,t,n);return await Va(e,t,n)}function La(e,n){return`runnerAnswer`in e?t(e.runnerAnswer,e.dispatched):Gt(n.command)?t(n.transportError,`unknown`):t(Ra(n,e.lostReply),`unknown`)}function Ra(e,t){let{command:n,transportError:r,options:i}=e,o=r.details?.reason,s=r.details?.hint;return new a(`COMMAND_FAILED`,`cause`in t?eo(n.command,t.cause):t.message,{command:n.command,commandId:n.commandId,...t.lifecycleState===void 0?{}:{lifecycleState:t.lifecycleState},reason:Qt,...o===void 0?{}:{transportReason:o},recovery:t.recovery,...X(r),hint:typeof s==`string`?s:t.hint,logPath:i.logPath??r.details?.logPath,transportError:r.message},r)}function za(e,t){return no({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),e.data}function Ba(e,t,n){return no({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),n}async function Va(e,t,n){throw no({command:t.command,session:t.session,transportError:t.transportError,decision:`retained`,reason:e.reason,lifecycleState:e.lifecycleState}),await t.invalidateSession(t.session,t.invalidationReason),n}async function Ha(e,t,n,r,i,a){if(n.command===`status`||!n.commandId?.trim())return{type:`retainInvalidation`,reason:`status_recovery_unavailable`,lostReply:{recovery:`status_recovery_unavailable`,cause:`status recovery was unavailable`,hint:to(n.command)}};let o=X(r),s;try{s=await q(e,t,{command:`status`,statusCommandId:n.commandId},i.logPath,3e3,a)}catch(e){return S({level:`debug`,phase:`ios_runner_command_status_recovery_failed`,data:{command:n.command,commandId:n.commandId,error:e instanceof Error?e.message:String(e),...o}}),{type:`retainInvalidation`,reason:`status_probe_failed`,lostReply:{recovery:`status_probe_failed`,cause:`the status probe failed`,hint:to(n.command)}}}let c=typeof s.lifecycleState==`string`?s.lifecycleState:``,l=Si(t,n,c);return S({level:`debug`,phase:`ios_runner_command_status_recovery`,data:{command:n.command,commandId:n.commandId,lifecycleState:c,...o,...l===void 0?{}:{abandonedChargeSettled:l}}}),Ua(s,c,n,r,i)}function Ua(e,t,n,r,i){if(t===`completed`)return Wa(e,n,r);if(t===`failed`){let a=Lt(typeof e.lifecycleErrorCode==`string`?e.lifecycleErrorCode:void 0);return{type:`skipInvalidation`,reason:`runner_reported_failure`,lifecycleState:t,dispatched:a.details.dispatched,runnerAnswer:Ga(e,a,n,r,i)}}return xi.has(t)?{type:`skipInvalidation`,reason:`command_still_in_flight`,lifecycleState:t,lostReply:{recovery:`command_still_in_flight`,lifecycleState:t,message:`Runner command "${n.command}" is still ${t} after the transport response was lost.`,hint:Ya(n.command,t,X(r))}}:{type:`retainInvalidation`,reason:t?`unknown_lifecycle_state`:`missing_lifecycle_state`,lifecycleState:t,lostReply:{recovery:`lifecycle_state_not_recoverable`,lifecycleState:t,cause:`lifecycle status was ${t?`"${t}"`:`missing`}`,hint:to(n.command)}}}function Wa(e,t,n){let r=Ka(e.lifecycleResponseJson);return r?{type:`recovered`,data:r,reason:`completed_with_retained_response`,lifecycleState:`completed`}:{type:`skipInvalidation`,reason:Gt(t)?`read_only_completed_without_retained_response`:`completed_without_retained_response`,lifecycleState:`completed`,lostReply:{recovery:`completed_without_retained_response`,lifecycleState:`completed`,message:`Runner command "${t.command}" completed after the transport response was lost, but no recoverable response was retained.`,hint:qa(t.command,X(n))}}}function Ga(e,t,n,r,i){let o=typeof e.lifecycleErrorMessage==`string`?e.lifecycleErrorMessage:`Runner command failed`,s=typeof e.lifecycleErrorHint==`string`?e.lifecycleErrorHint:void 0,c=X(r);return new a(t.code,o,{command:n.command,commandId:n.commandId,lifecycleState:`failed`,recovery:`runner_reported_failure`,...t.details,...c,hint:s??Ja(n.command,c),logPath:i.logPath,transportError:r.message},r)}function Ka(e){if(typeof e!=`string`||e.trim().length===0)return;let t;try{t=Vt(e)}catch{return}return It(t)?Bt(t):void 0}function qa(e,t){return`${Xa(t)}The runner is still reachable and reports "${e}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`}function Ja(e,t){return`${Xa(t)}The runner is still reachable and reports "${e}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`}function Ya(e,t,n){return`${Xa(n)}The runner is still reachable and reports "${e}" is ${t}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`}function Xa(e){return e.readinessPreflightSkipped===!0?`This hot command skipped the uptime preflight because the runner had just completed a healthy interaction; status recovery confirmed the runner still observed it. `:``}function Za(e,t){let n=e.details?.[t];return typeof n==`boolean`?n:void 0}function Qa(e,t){let n=e.details?.[t];return typeof n==`string`?n:void 0}function $a(e,t){let n=e.details?.[t];return typeof n==`number`?n:void 0}function X(e){let t={},n=Za(e,`runnerReadinessPreflightSkipped`);n!==void 0&&(t.readinessPreflightSkipped=n);let r=Qa(e,`runnerReadinessPreflightSkipReason`);r!==void 0&&(t.readinessPreflightSkipReason=r);let i=$a(e,`runnerReadinessPreflightSkippedAgeMs`);return i!==void 0&&(t.readinessPreflightSkippedAgeMs=i),t}function eo(e,t){return`Runner command "${e}" lost its transport response and ${t}, so agent-device invalidated the runner session instead of replaying the command.`}function to(e){return`The runner did not confirm that "${e}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`}function no(e){let{command:t,session:n,transportError:r,decision:i,reason:a,lifecycleState:o}=e;S({level:i===`retained`?`warn`:`debug`,phase:`ios_runner_command_invalidation_decision`,data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:o!==void 0,sessionId:n.sessionId,transportError:r.message}})}const Z=new Map;function ro(e,t){let n=e.requestId?.trim();if(n)return`request:${n}`;let r=t.commandId?.trim();if(r)return`command:${r}`}function io(e){if(!e)return;let t=lo(e);t.touchedSession=!0,Q(e,t)}function ao(e){return e?Z.get(e)?.touchedSession===!0:!1}function oo(e){if(!e)return!0;let t=lo(e);return t.recycles>=1?(Q(e,t),!1):(Q(e,t),!0)}function so(e){if(!e)return;let t=lo(e);t.recycles+=1,Q(e,t)}function co(e,n){return S({level:`warn`,phase:`ios_runner_recycle_budget_exhausted`,data:{command:e.command,commandId:e.commandId,requestId:n.requestId,maxRecycles:1}}),t(new a(`COMMAND_FAILED`,`iOS runner was already restarted during this request and "${e.command}" still failed, so agent-device stopped instead of paying for another runner boot.`,{command:e.command,commandId:e.commandId,recovery:`runner_recycle_budget_exhausted`,hint:"Check the runner log for the underlying failure before retrying — a provisioning or code-signing error there means the runner cannot install on this device, and no retry will help. If the runner is healthy, the current screen is likely too heavy or animating for accessibility capture: the app session is preserved, so run `screenshot` for visual truth and interact by coordinates, or navigate to another screen.",logPath:n.logPath}),`no`)}function lo(e){return uo(),Z.get(e)??{touchedSession:!1,recycles:0,lastAtMs:Date.now()}}function Q(e,t){t.lastAtMs=Date.now(),Z.delete(e),Z.set(e,t)}function uo(){let e=Date.now()-6e5;for(let[t,n]of Z)n.lastAtMs<e&&Z.delete(t);for(;Z.size>512;){let e=Z.keys().next().value;if(e===void 0)break;Z.delete(e)}}async function fo(e,t){T(t.requestId);let n=Ht(t),r=C({command:`uptime`}),i=Pr(e.id),o;try{for(let a=1;a<=2;a+=1){let s=await po({device:e,command:r,options:{...t,startAdmission:i},signal:n,attempt:a,recoveryReason:o});if(s.kind===`prepared`)return s.result;o=s.recoveryReason}}finally{Fr(i)}throw new a(`COMMAND_FAILED`,`iOS runner prepare failed`)}async function po(e){let{device:t,command:n,options:r,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),c=await H(t,{...r,cleanStaleBundles:a>1||r.cleanStaleBundles,...wo(r,`runner_session`)}),l=Date.now()-s;try{return{kind:`prepared`,result:ko(t,await Co(t,c,n,r,i,l,{recoveryReason:o}))}}catch(e){return await mo({device:t,session:c,command:n,options:r,signal:i,attempt:a,error:e})}}async function mo(e){let{device:t,session:n,command:i,options:a,signal:s,attempt:c,error:l}=e;j(t.id,a.startAdmission);let u=r(l,`COMMAND_FAILED`);if(o(u))throw await go(n,`prepare_runner_request_canceled`),l;if(c===1&&Eo(u,n))return{kind:`prepared`,result:await ho({device:t,session:n,command:i,options:a,signal:s,error:u})};if(!_o(u))throw l;let d=u.message||`runner_health_failed`;if(c>=2)throw await go(n,`prepare_runner_health_failed`),l;return T(a.requestId),await W(n,`prepare_runner_health_retry`),S({level:`warn`,phase:`ios_runner_prepare_health_retry`,data:{command:i.command,commandId:i.commandId,sessionId:n.sessionId,attempt:c,maxAttempts:2,reason:d}}),{kind:`retry`,recoveryReason:d}}async function ho(e){let{device:t,session:n,command:r,options:i,signal:a,error:o}=e,s=o.message||`runner_health_failed`;await W(n,`prepare_cached_runner_health_failed`),await An(n.xctestrunArtifact,s);let c=Date.now(),l=await H(t,{...i,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0,...wo(i,`runner_rebuild`)}),u=Date.now()-c;try{let e=await Co(t,l,r,i,a,u,{recoveryReason:s});return S({level:`info`,phase:`ios_runner_prepare_bad_cache_recovered`,data:{command:r.command,commandId:r.commandId,sessionId:l.sessionId,xctestrunPath:l.xctestrunArtifact?.xctestrunPath,reason:s}}),ko(t,e)}catch(e){await go(l,`prepare_rebuilt_runner_health_failed`);let n=Do(e,l,s);throw Ao(t,{cache:l.xctestrunArtifact?.cache,artifact:l.xctestrunArtifact?.artifact,buildMs:l.xctestrunArtifact?.buildMs,connectMs:u,healthCheckMs:0,xctestrunPath:l.xctestrunArtifact?.xctestrunPath,failureReason:n.message}),n}}async function go(e,t){try{await W(e,t)}catch{}}function _o(e){return o(e)?!1:w(e)||nn(e)}async function vo(e,i,a){let o={entered:!1};try{return await yo(e,i,a,o)}catch(e){let i=r(e);throw o.entered?Zt(i)?n(i,`no`):i:t(i,`no`)}}async function yo(e,t,n,a){T(n.requestId);let s=Ht(n),c=ro(n,t),l,u=!1,d=U(e.id)?.liveness??`gone`;try{if((d===`gone`||d===`stopped`)&&ao(c)){if(!oo(c))throw co(t,n);u=!0}l=await H(e,n),fa(l,n.expectedRunnerSessionId),xa(l,t),u&&so(c),io(c);let r=Mt;if(l.state!==`ready`){let{readRunnerStartupTimeoutMs:e}=await import(`./runner-exchange.js`);r=e(l)}return a.entered=!0,await q(e,l,t,n.logPath,r,s)}catch(a){if(n.expectedRunnerSessionId!==void 0)throw a;let c=r(a,`COMMAND_FAILED`);if((l?l.state===`starting`:d!==`ready`)&&o(c))throw l&&!Rt(n)&&await go(l,`runner_startup_request_canceled`),i({...c.details,readinessPhase:`runner-start`},c);if(Wt(c,t)&&l)return T(n.requestId),await bo({device:e,session:l,command:t,options:n,signal:s,restartReason:`runner_connect_failed_before_command_send`,firstAttemptDispatched:Kt(c)});if(l&&qt(c))return T(n.requestId),await bo({device:e,session:l,command:t,options:n,signal:s,restartReason:`runner_readiness_preflight_failed_before_command_send`,recoveredDiagnosticPhase:`ios_runner_readiness_preflight_recovered`,firstAttemptDispatched:`no`});if(l&&w(c)&&!tn(c))return await Fa({device:e,session:l,command:t,transportError:c,options:n,signal:s,invalidationReason:`transport_error_after_command_send`,invalidateSession:W});throw a}}async function bo(e){let{device:n,command:i,options:a,signal:o,restartReason:s}=e,c=ro(a,i);if(!oo(c))throw t(co(i,a),e.firstAttemptDispatched);await W(e.session,s);let l=await H(n,{...a,cleanStaleBundles:!0}).catch(t=>{throw xo(t,e)});so(c);try{let t=await q(n,l,i,a.logPath,Pt,o);return e.recoveredDiagnosticPhase&&S({level:`debug`,phase:e.recoveredDiagnosticPhase,data:{command:i.command,commandId:i.commandId,recovery:`session_restarted`,sessionId:l.sessionId}}),t}catch(t){let s=r(t,`COMMAND_FAILED`);if(w(s)&&!tn(s))try{return await Fa({device:n,session:l,command:i,transportError:s,options:a,signal:o,invalidationReason:`transport_error_after_retry_command_send`,invalidateSession:W})}catch(t){throw xo(t,e,l)}throw xo(t,e,l)}}function xo(e,t,n){return e instanceof a?So(new a(e.code,e.message,{...e.details??{},runnerRestarted:!0,runnerRestartReason:t.restartReason,runnerRestartCommand:t.command.command,...t.command.commandId?{runnerRestartCommandId:t.command.commandId}:{},runnerInvalidatedSessionId:t.session.sessionId,...n?{runnerRestartSessionId:n.sessionId}:{},...e.details?.logPath===void 0&&t.options.logPath?{logPath:t.options.logPath}:{}},e.cause??e),t.firstAttemptDispatched,n):e}function So(e,r,i){return!i||r===`unknown`?t(e,r):n(e,Zt(e)?`no`:`unknown`)}async function Co(e,t,n,r,i,a,o){let s=Date.now(),c=To(r.prepareDeadline,r.healthTimeoutMs,`runner_health`);return Oo(await q(e,t,n,r.logPath,c,i),t,a,Date.now()-s,o)}function wo(e,t){if(!e.prepareDeadline)return{};let n=To(e.prepareDeadline,e.buildTimeoutMs,t);return{buildTimeoutMs:n,startupTimeoutMs:n}}function To(e,t,n){if(!e)return t??45e3;let r=Math.floor(e.remainingMs());if(r<=0)throw new a(`COMMAND_FAILED`,`prepare ios-runner timed out`,{phase:n,reason:`prepare_deadline_expired`});return r}function Eo(e,t){let n=t.xctestrunArtifact;return!n||n.cache===`miss`?!1:Jt(e)}function Do(e,t,n){let i=r(e,`COMMAND_FAILED`);return new a(i.code,`artifact restored but runner did not connect`,{...i.details??{},restoredFailureReason:n,xctestrunPath:t.xctestrunArtifact?.xctestrunPath,artifact:t.xctestrunArtifact?.artifact,cache:t.xctestrunArtifact?.cache,reason:i.message},i)}function Oo(e,t,n,r,i){let a=t.xctestrunArtifact,o={...i?.recoveryReason?{recoveryReason:i.recoveryReason}:{},...i?.failureReason?{failureReason:i.failureReason}:{}};return a?{runner:e,cache:a.cache,artifact:a.artifact,buildMs:a.buildMs,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),xctestrunPath:a.xctestrunPath,...o}:{runner:e,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),...o}}function ko(e,t){return Ao(e,t),t}function Ao(e,t){S({level:t.failureReason?`warn`:`info`,phase:`apple_runner_prepare`,data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,timingContainment:t.buildMs===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}const jo={maxAttempts:8,baseDelayMs:200,maxDelayMs:1e3,jitter:0};function Mo(e){return $t(e)?8:w(e)?3:1}async function No(e,t,n={}){Aa(e),T(n.requestId);let r=C(t),i=$(e,n);if(!Gt(r))return i.runCommand(e,r,n);let a;try{return await Ze(()=>(T(n.requestId),i.runCommand(e,r,n)),{...jo,shouldRetry:(e,t)=>(T(n.requestId),$t(e)&&(a=e),t<Mo(e))},{signal:Ht(n)})}catch(e){throw a&&Rt(n)?a:e}}async function Po(e,t={}){if(f(e))try{await No(e,{command:`targetReset`},t)}catch(t){S({level:`warn`,phase:`ios_runner_target_reset_failed`,data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}}),await K(e.id)}}function Fo(e,t={}){if(f(e)){if(Je()){S({level:`debug`,phase:`ios_runner_cache_prewarm_unavailable`,data:{deviceId:e.id}});return}return Lo({device:e,options:t,failurePhase:`ios_runner_cache_prewarm_failed`,task:async t=>{await ni(e,{...t,budget:vt(t.buildTimeoutMs,t.signal)})}})}}function Io(e,t={}){if(!f(e))return;let n=$(e,t).prewarm;if(!n){S({level:`debug`,phase:`ios_runner_session_prewarm_unavailable`,data:{deviceId:e.id}});return}return Lo({device:e,options:t,failurePhase:`ios_runner_session_prewarm_failed`,task:async t=>{await n(e,t)}})}function Lo(e){let{device:t,options:n,failurePhase:r,task:i}=e,{propagateError:a=!1,...o}=n;return i(o).catch(e=>{if(S({level:`warn`,phase:r,data:{deviceId:t.id,error:e instanceof Error?e.message:String(e)}}),a)throw e})}async function Ro(e,t){Aa(e),T(t.requestId);let n=C({command:`uptime`}),r=$(e,t);if(r.prepare)return await r.prepare(e,t);let i=Date.now();return{runner:await r.runCommand(e,n,t),connectMs:0,healthCheckMs:Math.max(0,Date.now()-i)}}function $(e,t){return Me(e,Vo,{requestId:t.requestId})}function zo(e,t={}){return f(e)?$(e,t).hasLiveSession(e):!1}async function Bo(e,t={}){if(!f(e))return!1;let n=$(e,t).releaseSpeculativeSession;return n?await n(e):!1}const Vo=Ue(vo,{prepare:fo,hasLiveSession:e=>U(e.id)?.liveness===`ready`,releaseSpeculativeSession:async e=>await Sa(e.id),prewarm:async(e,t)=>{let{healthCheck:n,...r}=t;if(n===!1){await H(e,{...r,speculative:!0});return}await fo(e,{...r,speculative:!0,healthTimeoutMs:Mt})}});var Ho=e({cleanupRunnerLeasesForOwner:()=>yn,readRunnerSessionLiveness:()=>U});dt(Pn);export{fi as C,tr as D,Wr as E,Un as O,Ur as S,$r as T,N as _,Fo as a,Si as b,No as c,wa as d,Da as f,xi as g,Pi as h,Ro as i,Ea as l,Oi as m,zo as n,Io as o,K as p,Po as r,Bo as s,Ho as t,U as u,P as v,di as w,Hr as x,Di as y};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{h as t}from"./sdk-device.js";import{U as n}from"./apple-runner-platform.js";import{r}from"./runner-error-classification.js";const i=`Developer mode is disabled for Apple development tools`;async function a(e){if(!t(e)||e.kind!==`device`)return;let r=await n(`DevToolsSecurity`,[`-status`],{allowFailure:!0,timeoutMs:2e3}),i=`${r.stdout}\n${r.stderr}`;if(/developer mode is currently disabled/i.test(i))throw o(i.trim())}function o(t){let n=new e(`COMMAND_FAILED`,i,{devToolsSecurityStatus:t}),{reason:a,hint:o}=r(n);return new e(`COMMAND_FAILED`,i,{reason:a,hint:o,devToolsSecurityStatus:t})}export{a as assertDevToolsSecurityForIosRunner};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{h as t}from"./sdk-device.js";import{V as n}from"./apple-runner-platform.js";import"./runner-error-classification.js";async function r(r,a){if(!t(r)||r.kind!==`device`)return;let o=await n(r).readDeviceReadiness(r,a.budgetMs,a.signal);if(a.signal?.throwIfAborted(),!o.available)return;let s=i(o);if(s)throw new e(`COMMAND_FAILED`,s.message,{reason:s.reason,hint:s.hint,deviceId:r.id,developerMode:o.developerMode,developerDiskImage:o.developerDiskImage});return{developerMode:o.developerMode,developerDiskImage:o.developerDiskImage,developerDiskImageHint:o.remedies.developerDiskImageUnavailable}}function i(e){if(e.developerMode===`disabled`)return{reason:`device_developer_mode_disabled`,message:`The iOS device reports that Developer Mode is turned off`,hint:e.remedies.developerModeOff}}export{r as preflightIosRunnerDeviceReadiness};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Z as e}from"./apple-runner-platform.js";import{t}from"./runner-toolchain-probe.js";function n(t){return e(t).simulatorSetPath}function r(t,n){let r=e(t),i=e(n);return r.udid===i.udid&&r.simulatorSetPath===i.simulatorSetPath}function i(e,t){let r=n(e);return r===void 0?[`-destination`,t]:[`-destination`,t,`-DVTSimulatorSetLocation=${r}`]}function a(e){let r=n(e);if(r===void 0)return{};let i=t(e);return i===void 0?{simulatorSetPath:r}:{simulatorSetPath:r,xcodeVersion:i}}function o(e,t,n){return`${e}: xcodebuild found no simulator ${t.id} in simulator set ${n.simulatorSetPath}${n.xcodeVersion===void 0?``:` with Xcode ${n.xcodeVersion}`}`}export{i as a,o as i,a as n,n as r,r as t};
|