agent-device 0.21.24 → 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/android/ime-helper/dist/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.24.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/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+Environment.swift +18 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +1 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +59 -26
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +47 -103
- 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/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/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-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/apple-runner-platform.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 -1
- package/dist/src/back-mode.js +1 -1
- package/dist/src/boot-diagnostics.js +1 -1
- package/dist/src/browserstack-connection.js +1 -1
- package/dist/src/capture-disclosure.js +1 -0
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +17 -14
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +3 -1
- package/dist/src/cli.js +3 -3
- package/dist/src/client-companion-tunnel.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +8 -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 -1
- package/dist/src/connection.js +3 -3
- 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 +5 -3
- 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-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-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 +1 -1
- 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/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/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 +2 -10
- 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/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/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-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 -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.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-policy.js +1 -1
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/proxy.js +2 -2
- package/dist/src/quality-warnings.js +1 -1
- 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-config-core.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/runner-cache-retention.js +1 -1
- package/dist/src/runner-cache-trim.js +1 -1
- 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 -1
- package/dist/src/runner-error-classification.js +3 -3
- package/dist/src/runner-exchange.js +1 -1
- package/dist/src/runner-lease.js +1 -1
- 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 +1 -1
- package/dist/src/runner.js +2 -1
- package/dist/src/runtime-command-surface.js +1 -0
- package/dist/src/runtime-deployment.js +1 -1
- 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 -1
- package/dist/src/runtime2.js +5 -2
- package/dist/src/runtime3.js +1 -5
- package/dist/src/runtime4.js +5 -1
- package/dist/src/runtime5.js +1 -5
- 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/screenshot-image.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -0
- package/dist/src/screenshot3.js +5 -5
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +1 -1
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.d.ts +4 -2
- package/dist/src/sdk-selectors.d.ts +4 -5
- 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 -0
- 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/simulator.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 +2 -0
- 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 +9 -11
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.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/browserstack-device-features.js +0 -1
- package/dist/src/browserstack.js +0 -1
- package/dist/src/cache.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/daemon-client-transport.js +0 -1
- package/dist/src/daemon-http.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 -2
- package/dist/src/gesture-plan-types.js +0 -1
- package/dist/src/host.js +0 -1
- package/dist/src/ime-settings-record.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/manifest.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/provider-session-ownership.js +0 -2
- package/dist/src/providers.js +0 -1
- package/dist/src/registry.js +0 -68
- package/dist/src/remote-connection-state.js +0 -1
- 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 -2
- 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/runtime11.js +0 -2
- 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-snapshot.js +0 -1
- package/dist/src/snapshot-private-evidence.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/transport.js +0 -3
- package/dist/src/ttl-memo.js +0 -1
- package/dist/src/verified-file.js +0 -1
- package/dist/src/window-state.js +0 -1
- /package/dist/src/{doctor-output.js → doctor-lines.js} +0 -0
package/dist/src/settings.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as
|
|
1
|
+
import{B as e,F as t,P as n}from"./sdk-contracts.js";const r=[`grant`,`deny`,`reset`],i=[`full`,`limited`],a=[`all`,`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`],o=[`accessibility`,`screen-recording`,`input-monitoring`],s=[`extra-small`,`small`,`medium`,`large`,`extra-large`,`extra-extra-large`,`extra-extra-extra-large`,`accessibility-medium`,`accessibility-large`,`accessibility-extra-large`,`accessibility-extra-extra-large`,`accessibility-extra-extra-extra-large`],c=[`light`,`dark`,`toggle`],l=[`on`,`true`,`1`],u=[`off`,`false`,`0`];function d(e,t){return Object.freeze({setting:`text-size`,category:e,platformValue:t})}function f(e){return`Text size is ${e.category}`}function p(e,t,n){return e===`clear-app-state`?`Cleared user data for ${n}`:e===`text-size`?`Text size set to ${t}`:`Updated setting: ${e}`}function m(e,t,n){let r=t.trim().toLowerCase();return r===`clear-app-state`?e===`macos-host`?`unknown`:`app-scoped`:r===`permission`?e===`macos-host`?`device-level`:`app-scoped`:r===`location`?h(e,n):`unknown`}function h(e,t){let n=t?.trim().toLowerCase();return n===`set`?`device-level`:G(n)===void 0?`unknown`:e===`apple`?`app-scoped`:e===`mobile`?`device-level`:`unknown`}function g(e,t,n){let r=t===void 0?e:`${e} ${t}`;return{code:`INVALID_ARGS`,message:`settings ${r} applies to the target itself, not to an app: ${n} names nothing it can grant or revoke.`,details:{reason:`setting_app_not_consumed`,dispatched:`no`,setting:r,app:n},hint:`Drop the --app option and run \`settings ${r}\`, or aim the app at an app-scoped setting such as \`settings permission grant location --app ${n}\`.`}}const _=`setting_app_not_package`;async function v(r,i){try{return await i(r)}catch(i){throw i instanceof n?(i.code===`APP_NOT_INSTALLED`&&(i.details={...i.details,...t(),app:r,hint:`Run apps --all for the exact bundle id or package name, or install the app, then retry with that id in --app.`}),e(i,`no`)):i}}const y=`<wifi|airplane|location> <on|off>`,b=`location set <lat> <lon>`,x=`animations <on|off>`,S=`appearance <${c.join(`|`)}>`,C=`faceid <match|nonmatch|enroll|unenroll>`,w=`touchid <match|nonmatch|enroll|unenroll>`,T=`fingerprint <match|nonmatch>`,E=`clear-app-state [app-id]`,D=`reset-keychain clear`,O=`text-size [${s.join(`|`)}]`,k=`permission <${r.join(`|`)}> <${a.join(`|`)}> [${i.join(`|`)}]`,A=`permission <grant|reset> <${o.join(`|`)}>`,j=`macOS supports only settings ${S} and settings ${A}. wifi|airplane|location|animations|text-size remain unsupported on macOS.`,M=[`settings ${y}`,`settings ${b}`,`settings ${x}`,`settings ${S}`,`settings ${O}`,`settings ${C}`,`settings ${w}`,`settings ${T}`,`settings ${E}`,`settings ${D}`,`settings ${k}`,`settings ${A}`].join(` | `),N=`settings requires ${y}, ${b}, ${x}, ${S}, ${O}, ${C}, ${w}, ${T}, ${E}, ${D}, ${k}, or ${A}`;function P(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function F(e){return`Unsupported macOS setting: ${e}. ${j}`}function I(e){let t=R(e);if(t!==void 0)return t;throw new n(`INVALID_ARGS`,L(e))}function L(e){return`Invalid text size: ${e??``}. Use ${s.join(`|`)}.`}function R(e){return V(s,e)}const z=Object.freeze({message:`Reading or setting a text size is supported on iOS and iPadOS simulators.`,hint:"Run `xcrun simctl ui <device> content_size` on a booted iPhone or iPad simulator.",reason:`setting-unsupported-on-leaf`}),B=Object.freeze({message:`Face ID and Touch ID simulation is supported on iOS and iPadOS simulators.`,hint:"Select a booted iPhone or iPad simulator, then run `settings faceid <state>` or `settings touchid <state>`.",reason:`setting-unsupported-on-leaf`});function V(e,t){let n=t?.trim().toLowerCase();return n===void 0?void 0:e.find(e=>e===n)}function H(e){let t=V(r,e);if(t!==void 0)return t;throw new n(`INVALID_ARGS`,`Invalid permission action: ${e}. Use ${r.join(`|`)}.`)}function U(e){let t=V(a,e);if(t!==void 0)return t;throw new n(`INVALID_ARGS`,`permission setting requires a target: ${a.join(`|`)}`)}function W(e){let t=V(c,e);if(t!==void 0)return t;throw new n(`INVALID_ARGS`,`Invalid appearance state: ${e}. Use ${c.join(`|`)}.`)}function G(e){if(e===void 0)return;let t=e.toLowerCase();if(l.includes(t))return!0;if(u.includes(t))return!1}function K(e){let t=G(e);if(t!==void 0)return t;throw new n(`INVALID_ARGS`,`Invalid setting state: ${e}`)}export{R as C,d as D,m as E,I as S,g as T,P as _,a,U as b,_ as c,M as d,s as f,L as g,F as h,o as i,N as l,p as m,B as n,r as o,f as p,z as r,i as s,c as t,A as u,W as v,v as w,K as x,H as y};
|
package/dist/src/settings2.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{P as e,et as t}from"./sdk-contracts.js";import{runHarmonyShell as n}from"./hdc.js";async function r(r,i,a,o){if(i!==`clear-app-state`)throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS setting "${i}" is not supported`,{hint:`HarmonyOS currently supports settings clear-app-state for an app bundle only.`});if(a!==`clear`)throw new e(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!o)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`,t());return await n(r,[`aa`,`force-stop`,o],{timeoutMs:15e3}),await n(r,[`bm`,`clean`,`-n`,o,`-d`,`-c`],{timeoutMs:15e3}),{bundleId:o,forceStopped:!0,clearedData:!0,clearedCache:!0}}export{r as setHarmonySetting};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{P as e,et as t}from"./sdk-contracts.js";import{b as n,v as r,x as i,y as a}from"./settings.js";import{n as o}from"./location-coordinates.js";async function s(e){switch(e.setting){case`appearance`:return await c(e);case`permission`:return await l(e);case`location`:return await u(e)}}async function c({runSimctl:t,udid:n,state:i}){let a=r(i),o;if(a===`toggle`){let r=await t([`ui`,n,`appearance`]),i=m(r.stdout,r.stderr);if(!i)throw new e(`COMMAND_FAILED`,`Unable to determine current iOS appearance for toggle`,{stdout:r.stdout,stderr:r.stderr});o=i===`dark`?`light`:`dark`}else o=a;await t([`ui`,n,`appearance`,o])}async function l(e){let{runSimctl:t,udid:n,deviceId:r,state:i,options:o}=e,s=a(i),c=s===`deny`?`revoke`:s,l=p(o?.permissionTarget,o?.permissionMode),u=await d(e);try{await t([`privacy`,n,c,l,u])}catch(e){throw h(e)?g(c,l,u,r,e):e}}async function u(e){let{runSimctl:t,udid:n,state:r,options:a}=e;if(r.toLowerCase()===`set`){let{latitude:e,longitude:r}=o(a);return await t([`location`,n,`set`,`${e},${r}`]),{latitude:e,longitude:r}}await t([`privacy`,n,i(r)?`grant`:`revoke`,`location`,await d(e)])}async function d({setting:n,appBundleId:r,resolveApp:i}){if(r)return await i(r);throw new e(`INVALID_ARGS`,`${n} setting requires an active app in session`,t())}const f={all:`all`,camera:`camera`,microphone:`microphone`,contacts:`contacts`,"contacts-limited":`contacts-limited`,notifications:`notifications`,calendar:`calendar`,location:`location`,"location-always":`location-always`,"media-library":`media-library`,motion:`motion`,reminders:`reminders`,siri:`siri`};function p(t,r){let i=n(t);if(i===`photos`){let t=r?.trim().toLowerCase();if(!t||t===`full`)return`photos`;if(t===`limited`)return`photos-add`;throw new e(`INVALID_ARGS`,`Invalid photos mode: ${r}. Use full|limited.`)}if(r?.trim())throw new e(`INVALID_ARGS`,`Permission mode is only supported for photos. Received: ${r}.`);return f[i]}function m(e,t){let n=/\b(light|dark|unsupported|unknown)\b/i.exec(`${e}\n${t}`);if(!n)return null;let r=n[1]?.toLowerCase();return r===`dark`?`dark`:r===`light`?`light`:null}function h(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=String(t.details?.stderr??``).toLowerCase();return/failed to (set|grant|revoke|reset) access/.test(n)&&n.includes(`operation not permitted`)}function g(t,n,r,i,a){return t===`reset`?new e(`UNSUPPORTED_OPERATION`,`iOS simulator does not support resetting ${n} permission via simctl privacy on this runtime.`,{deviceId:i,appBundleId:r,hint:`Use reinstall to force a fresh prompt, or reset simulator content and settings.`},a):new e(`UNSUPPORTED_OPERATION`,`iOS simulator does not support setting ${n} permission via simctl privacy on this runtime.`,{deviceId:i,appBundleId:r,hint:"Privacy support varies by Xcode runtime: run `xcrun simctl privacy help` for its documented services, or use the `all` target, which applies the action to every service this runtime can change."},a)}export{s as t};
|
package/dist/src/simulator.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{o as t,r as n}from"./exec.js";import{r,t as i}from"./retry.js";import"./command.js";import{
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{o as t,r as n}from"./exec.js";import{r,t as i}from"./retry.js";import"./command.js";import{o as a}from"./version.js";import"./retry2.js";import{n as o,t as s}from"./boot-diagnostics.js";import{l as c,r as l,u}from"./config.js";import{a as d,o as f}from"./tool-provider.js";import{i as p,n as m}from"./simctl.js";const h=a({ttlMs:5e3});function g(e){return`${e.id}|${e.simulatorSetPath??``}`}function _(e){return h.get(g(e))===!0}function v(e){h.set(g(e),!0)}function y(t,n){if(t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`${n} is only supported on iOS simulators`)}async function b(e={}){await d(`open`,[`-a`,`Simulator`],{allowFailure:!0,signal:e.signal,timeoutMs:u})}async function x(a,c={}){if(a.kind!==`simulator`)return;if(c.signal?.throwIfAborted(),(_(a)?`Booted`:await S(a,c.signal))===`Booted`){v(a);return}let u=i.fromTimeoutMs(l),d,p;try{await r(async({deadline:r})=>{if(r?.isExpired())throw new e(`COMMAND_FAILED`,`iOS simulator boot deadline exceeded`,{timeoutMs:l});let i=Math.max(1e3,r?.remainingMs()??18e4);d=await f(m(a,[`boot`,a.id]),{allowFailure:!0,signal:c.signal,timeoutMs:i});let o=`${d.stdout}\n${d.stderr}`.toLowerCase(),s=o.includes(`already booted`)||o.includes(`current state: booted`);if(d.exitCode!==0&&!s)throw new e(`COMMAND_FAILED`,`simctl boot failed`,n(d));p=await f(m(a,[`bootstatus`,a.id,`-b`]),{allowFailure:!0,signal:c.signal,timeoutMs:i}),t(p,`simctl bootstatus failed`);let u=await S(a,c.signal);if(u!==`Booted`)throw new e(`COMMAND_FAILED`,`Simulator is still booting`,{state:u})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let t=o({error:e,stdout:p?.stdout??d?.stdout,stderr:p?.stderr??d?.stderr,context:{platform:`ios`,phase:`boot`}});return t!==`IOS_BOOT_TIMEOUT`&&t!==`CI_RESOURCE_STARVATION_SUSPECTED`}},{deadline:u,phase:`boot`,signal:c.signal,classifyReason:e=>o({error:e,stdout:p?.stdout??d?.stdout,stderr:p?.stderr??d?.stderr,context:{platform:`ios`,phase:`boot`}})})}catch(t){let n=o({error:t,stdout:p?.stdout??d?.stdout,stderr:p?.stderr??d?.stderr,context:{platform:`ios`,phase:`boot`}});throw new e(`COMMAND_FAILED`,`iOS simulator failed to boot`,{platform:`ios`,deviceId:a.id,timeoutMs:l,elapsedMs:u.elapsedMs(),reason:n,hint:s(n),boot:d,bootstatus:p})}v(a),await b({signal:c.signal})}async function S(e,t){let n=m(e,[`list`,`devices`,`-j`]),r=await f(n,{allowFailure:!0,signal:t,timeoutMs:c});return r.exitCode===0?p(r.stdout,e.id):null}export{_ as i,v as n,y as r,x as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./android-input-ownership.js";import{Ir as t}from"./sdk-batch.js";import{n,r}from"./android-system-chrome.js";const i=[`status`,`get`,`dismiss`,`enter`,`return`];function a(e){return i.includes(e)}const o=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),s={strippedIndexes:new Set,refs:new Set};function c(e){let n=new Set(e.filter(e=>t(e.type??``)===`keyboard`).map(e=>e.index));if(n.size===0)return s;let r=new Map(e.map(e=>[e.index,e])),i=p(e,r,n),a=new Set(i),o=x(e,r,i);for(let t of p(e,r,o))a.add(t);for(let t of l(e,r,o,n,i))a.delete(t);let c=new Set(e.filter(e=>e.ref&&a.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...a].filter(e=>!n.has(e))),refs:c}}function l(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=d(t,n,r);if(o.size===0)return a;let s=f(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&u(n,t,o)&&a.add(n.index);return a}function u(e,t,n){if(!e.rect)return!1;let r=S(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function d(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=S(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function f(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function p(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)C(i,t,n)&&r.add(i.index);return r}function m(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(n(e))return!0;let i=new Set,a=e;for(;a?.bundleId===`com.android.systemui`&&!i.has(a.index);){if(r(a.identifier))return!0;i.add(a.index),a=a.parentIndex===void 0?void 0:t.get(a.parentIndex)}return!1}function h(t,n){let r=new Map(t.map(e=>[e.index,e])),i=new Set(t.filter(e).map(e=>e.index)),a=new Set([...i].filter(e=>{let t=r.get(e)?.parentIndex,n=t===void 0?void 0:r.get(t);return!n||!i.has(n.index)})),o=n===`com.android.systemui`?new Set:g(t,r,i),c=new Set([...i].filter(e=>!a.has(e)));for(let e of o)c.add(e);let l=new Set(t.filter(e=>e.ref&&(i.has(e.index)||o.has(e.index))).map(e=>e.ref));return c.size===0&&l.size===0?s:{strippedIndexes:c,refs:l}}function g(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&m(e,t)).map(e=>e.index))}function _(e,t){let n=c(e),r=h(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function v(e,t){let{strippedIndexes:n}=_(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function y(e,t){return _(e,t).refs}function b(e){return c(e).refs}function x(e,n,r){let i=new Set;for(let e of r){let r=n.get(e);if(!r||t(r.type??``)!==`keyboard`)continue;let a=S(r,n);a!==void 0&&i.add(a)}for(let a of i){let s=new Set([a]);e.some(e=>o.has(t(e.type??``))&&!r.has(e.index)&&C(e,n,s))&&i.delete(a)}return i}function S(e,n){let r=typeof e.parentIndex==`number`?n.get(e.parentIndex):void 0;for(;r;){if(t(r.type??``)===`window`)return r.index;r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}}function C(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}export{a as i,y as n,v as r,b as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Br as e,Hr as t,Ur as n}from"./sdk-batch.js";const r=[`button`,`menu`,`textfield`,`searchfield`,`checkbox`,`radio`,`switch`];function i(e,t){let n=e.nodes??[];return t.scope&&(n=a(n,t.scope,e=>!t.interactiveOnly||n.slice(e.start,e.end).some(c))),t.interactiveOnly&&(n=o(n)),typeof t.depth==`number`&&(n=s(n,t.depth)),{...e,nodes:n}}function a(r,i,a){let o=t(i);if(!o)return n(r);let s=e(r,o,a);if(!s)return[];let c=r.slice(s.start,s.end);return n(c,c[0]?.depth??0)}function o(e){if(e.length===0)return e;let t=new Map(e.map(e=>[e.index,e])),r=new Set;for(let n of e){if(!c(n))continue;let e=n;for(;e&&!r.has(e.index);)r.add(e.index),e=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0}return r.size===0?e:n(e.filter(e=>r.has(e.index)))}function s(e,t){return n(e.filter(e=>(e.depth??0)<=t))}function c(e){if([e.focused,e.hittable,e.rect].some(Boolean))return!0;let t=`${e.type??``} ${e.role??``} ${e.subrole??``}`.toLowerCase();return r.some(e=>t.includes(e))}export{i as n,a as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createHash as e}from"node:crypto";const t=new WeakMap;function n(e,n){i(e)&&t.set(e,n)}function r(e){return i(e)?t.get(e):void 0}function i(e){return typeof e==`object`&&!!e||typeof e==`function`}function a(t){let n=Buffer.alloc(16);for(let e of t)s(n,o(e));return{digest:`ax1:${e(`sha256`).update(n).update(`\0`).update(String(t.length)).digest(`hex`).slice(0,16)}`,nodeCount:t.length}}function o(t){return e(`sha256`).update(t.type??``).update(`\0`).update(t.label??``).update(`\0`).update(t.identifier??``).digest().subarray(0,16)}function s(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function c(e){let{digest:t,nodeCount:n}=a(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=l(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function l(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}export{n,r,c as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Mr as e,Pr as t,Vr as n}from"./sdk-batch.js";function r(e,t){return e.find(e=>n(e,t))??null}function i(n,r){let i=e(n);return i&&t(i)?i:a(n,r)}function a(n,r){if(!n.rect)return;let i=n.rect.y+n.rect.height/2,a=null;for(let n of r){if(!n.rect)continue;let r=e(n);if(!r||!t(r))continue;let o=n.rect.y+n.rect.height/2,s=Math.abs(o-i);(!a||s<a.distance)&&(a={label:r,distance:s})}return a?.label}export{r as n,i as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as e}from"./sdk-contracts.js";import{$r as t,Ar as n,Ir as r,Kr as i,Wr as a}from"./sdk-batch.js";import{n as o,t as s}from"./rect-center.js";const c=[`tabbar`,`toolbar`,`navigationbar`,`bottomnavigation`,`bottomnavigationview`,`sheet`,`dialog`,`alert`,`popover`,`menu`],l=[`tabbar`,`toolbar`,`navigationbar`],u=[`toolbar`],d=[`scrollbar`,`scrollindicator`],f=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`edittext`,`checkbox`,`radio`,`switch`,`cell`];function p(e){let t=new Map,n=new Map;for(let r of e){if(t.set(r.index,r),typeof r.parentIndex!=`number`)continue;let e=n.get(r.parentIndex);e?e.push(r):n.set(r.parentIndex,[r])}return{byIndex:t,childrenByParent:n}}function m(e,t={}){if(e.length<2)return e;let n=p(e),r={nodes:e,byIndex:n.byIndex,neighbourhood:n,overlayPositions:e.flatMap((e,r)=>w(e,n,t)?[r]:[]),coverCache:new Map},i=[];for(let[n,a]of e.entries())C(a)&&v(r,n,a,t)&&i.push(n);return g(e,i)}function h(e,t){let n=[];for(let[r,i]of e.entries())C(i)&&t(i)&&n.push(r);return g(e,n)}function g(e,t){if(t.length===0)return e;let n=[...e];for(let r of t){let t=e[r];n[r]={...t,hittable:!1,interactionBlocked:`covered`,presentationHints:z(t.presentationHints)}}return n}function _(e){return e.interactionBlocked!==void 0}function v(t,n,r,i){let a=t.coverCache.get(n);if(a!==void 0)return a;t.coverCache.set(n,null);let o=R(r.rect);if(!o)return b(t,n,null);let s=e(o),c=i.isAdditionalOverlayNode?.(r)===!0;for(let e of t.overlayPositions){if(!y(t,e,n,c,i))continue;let a=t.nodes[e];if(x(t,e,r,o,s,i))return b(t,n,a)}return b(t,n,null)}function y(e,t,n,r,i){let a=e.nodes[t];return a?t>n?!0:t===n||r?!1:i.isAdditionalOverlayNode?.(a)===!0:!1}function b(e,t,n){return e.coverCache.set(t,n),n}function x(e,t,n,r,a,o){if(!e.nodes[t])return!1;let s=S(e,t,n,r,o);return!!(s&&i(s,a.x,a.y))}function S(e,t,n,r,i){let a=e.nodes[t];if(!a||!w(a,e.neighbourhood,i)||I(n,a,e.byIndex))return null;let o=R(a.rect);return!o||s(r,o)||v(e,t,a,i)?null:o}function C(e){return R(e.rect)?e.hittable===!0||N(e)?!0:!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()):!1}function w(e,t,r){return!R(e.rect)||n(e)||k(e,t.byIndex)||T(e,t)||E(e,t)?!1:P(e,c)||A(e,t.byIndex,r)}function T(e,t){if(!P(e,l)||typeof e.parentIndex!=`number`)return!1;let n=R(e.rect);return n?(t.childrenByParent.get(e.parentIndex)??[]).some(t=>t.index!==e.index&&s(n,t.rect)):!1}function E(e,t){if(!P(e,u)||typeof e.parentIndex!=`number`)return!1;let n=R(e.rect);if(!n)return!1;let r=t.childrenByParent.get(e.parentIndex),i=r.findIndex(t=>t.index===e.index),a=D(r,i),o=!1;for(let[e,t]of r.entries())if(!(e===i||!O(n,t))){if(e<a||e>i)return!1;o=!0}return o}function D(e,t){for(let n=t-1;n>=0;n--)if(P(e[n],u))return n+1;return 0}function O(e,n){let r=P(n,l)||a(n)&&!P(n,d),i=R(n.rect);return!!(r&&i&&t(e,i))}function k(e,t){if(!P(e,l))return!1;let r=R(e.rect);if(!r)return!1;let i=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,a=new Set;for(;i&&!a.has(i.index);){if(n(i)){let e=R(i.rect);return!!(e&&s(r,e))}a.add(i.index),i=typeof i.parentIndex==`number`?t.get(i.parentIndex):void 0}return!1}function A(e,t,n){return n.isAdditionalOverlayNode?.(e)===!0&&!j(e,t,n)}function j(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(M(r,n))return!0;i.add(r.index),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}function M(e,t){return t.isAdditionalOverlayNode?.(e)===!0&&R(e.rect)!==null&&!n(e)}function N(e){return P(e,f)}function P(e,t){let n=F(e);return t.some(e=>n.includes(e))}function F(e){return[e.type,e.role,e.subrole].map(e=>r(e??``)).join(` `)}function I(e,t,n){return L(e,t,n)||L(t,e,n)}function L(e,t,n){let r=typeof t.parentIndex==`number`?n.get(t.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(r.index===e.index)return!0;i.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}return!1}function R(e){let t=o(e);return t&&t.width>0&&t.height>0?t:null}function z(e){return Array.from(new Set([...e??[],`covered`]))}export{h as n,_ as r,m as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./snapshot-quality-backend-capabilities.js";const t={healthy:!0,recovered:!0,sparse:!0},n={"ax-rejected":!0,"sparse-tree":!0,budget:!0,"no-nodes":!0,"capture-failed":!0,"presentation-failed":!0,deferred:!0,"requested-backend":!0};function r(e,t){return typeof t==`string`&&Object.hasOwn(e,t)}function i(i){if(!i||typeof i!=`object`)return;let s=i;if(!r(t,s.state)||!r(e,s.backend))return;let c=a(s.timing);return{state:s.state,backend:s.backend,reason:typeof s.reason==`string`?s.reason:void 0,reasonCode:r(n,s.reasonCode)?s.reasonCode:void 0,customActions:o(s.customActions),effectiveDepth:typeof s.effectiveDepth==`number`?s.effectiveDepth:void 0,collapsedLeafIndexes:Array.isArray(s.collapsedLeafIndexes)?s.collapsedLeafIndexes.filter(e=>typeof e==`number`):void 0,...c?{timing:c}:{}}}function a(e){if(!e||typeof e!=`object`)return;let t=e;if(typeof t.acquisitionMs==`number`&&typeof t.presentationMs==`number`)return{acquisitionMs:t.acquisitionMs,presentationMs:t.presentationMs}}function o(e){if(!e||typeof e!=`object`)return;let t=e;if(typeof t.read==`number`&&typeof t.candidates==`number`)return{read:t.read,candidates:t.candidates,truncated:typeof t.truncated==`number`?t.truncated:0,blocked:t.blocked===!0}}function s(e){return e?.state===`sparse`}function c(e){return e?.backend===`private-ax`?`private-ax`:void 0}export{c as n,i as r,s as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e,s as t}from"./sdk-contracts.js";import{h as n,p as r}from"./sdk-device.js";import{Bt as i}from"./sdk-batch.js";import{
|
|
1
|
+
import{P as e,s as t}from"./sdk-contracts.js";import{h as n,p as r}from"./sdk-device.js";import{Bt as i}from"./sdk-batch.js";import{c as a}from"./device-shell.js";import{d as o}from"./replay-script-selection.js";import{n as s}from"./provider-device-admission.js";import{n as c}from"./request-runtime-binding.js";import{i as l}from"./internal/daemon.js";import{a as u}from"./runtime-session.js";import{a as d,i as f,n as p,t as m}from"./session-runtime-admission.js";async function h(e,t,n,r){let i=r??e.lookup(t),a=i?e.requireCurrent(i):void 0;return{ref:i,session:a,device:a?.device??await o(n??{})}}async function g(e,t,n,r){if(!e&&!r)throw Error(`Platform resource cleanup was not injected`);try{return await n()}finally{!e&&!s(t)&&await r.cleanupSessionlessExecutionHost(t)}}function _(e){let{sessionName:t,sessionScope:n,device:r,snapshot:i,appBundleId:a}=e;return{name:t,sessionScope:n,device:r,createdAt:Date.now(),appBundleId:a,snapshot:i,...i?.comparisonSafe===!0?{lastComparisonSafeSnapshot:i}:{},actions:[]}}async function v(e,t){if(!n(e)||e.kind!==`simulator`)return;let r=await t.appleSessionObservation.resolveSoleForegroundApp({simulatorSetPath:e.simulatorSetPath});if(!r)return;let i=y(r.device,r.app.bundleId),a=`One booted device found ("${r.device.name}", udid ${r.device.id}) with ${r.app.bundleId} running. Run: ${i}`;return a.length<=350?a:void 0}function y(e,t){let n=e.simulatorSetPath?` --ios-simulator-device-set ${a(e.simulatorSetPath)}`:``;return`agent-device open ${t} --platform ios --udid ${e.id}${n}`}function b(e){let{readTextAtPoint:t}=e.operations,n=t?{operations:{readTextAtPoint:t}}:void 0;return Object.freeze(n?{readTextAtPoint:async e=>await n.operations.readTextAtPoint(e)}:{})}function x(e){let{findText:t}=e.operations;return Object.freeze(t?{findText:async e=>{e.signal?.throwIfAborted();try{let n=await t(e);return e.signal?.throwIfAborted(),n}catch{return e.signal?.throwIfAborted(),{found:!1}}}}:{})}function S(e){let{focusPoint:t,typeText:n}=e.operations;return Object.freeze({...t?{focusPoint:t}:{},...n?{typeText:n}:{}})}async function C(e){let{command:t,device:n,session:r,plan:i}=e,a=await m({device:n,plan:i,inspectFacts:e.inspectFacts});if(!a.admitted)return{ok:!1,response:await j({operation:a.operation,fact:a.fact,session:r,device:n,command:t,platformServices:e.platformServices})};let o=await T(e.bindDevice,a,e.readiness,e.platformServices);return Object.freeze({ok:!0,capture:async e=>await o.captureSnapshot(e),...o.readTextAtPoint?{readTextAtPoint:o.readTextAtPoint}:{},...o.findText?{findText:o.findText}:{},...o.focusPoint?{focusPoint:o.focusPoint}:{},...o.typeText?{typeText:o.typeText}:{}})}async function w(t,n){let{req:a,sessionName:o,sessionStore:s}=t,{ref:c,session:d,device:f}=await h(s,o,a.flags,t.sessionRef);if(a.flags?.snapshotObserveOnly===!0&&(n!==`snapshot`||!r(f)||!d?.appBundleId))throw new e(`UNSUPPORTED_OPERATION`,`observe-only snapshot requires an iOS or iPadOS app session.`);let p=u(a.flags?.snapshotScope,d);if(!p.ok)return{ok:!1,response:p};let m=await C({command:n,device:f,session:d,plan:i({customActions:a.flags?.snapshotCustomActions===!0,hasActiveApp:d?.appBundleId!==void 0}),inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice,readiness:!d});if(!m.ok)return m;let g=l({flags:a.flags,logPath:t.logPath,meta:a.meta,session:d,snapshotScope:p.scope});return Object.freeze({ok:!0,ref:c,session:d,device:f,snapshotScope:p.scope,captureSnapshot:async()=>await m.capture(g)})}async function T(e,t,n,r){let i=p(e),a=async(e,t)=>{let a=await i(e,t);return n&&await c(a,r),a},{device:o,plan:s}=d(t);switch(s.kind){case`active-app`:return O(await a(o,s.use));case`selector-active-app`:return await E(a,o,s);case`custom-actions-active-app`:return k(await a(o,s.use));case`without-active-app`:return A(await a(o,s.use));case`selector-without-active-app`:return await D(a,o,s);case`custom-actions-without-active-app`:return k(await a(o,s.use))}}async function E(e,t,n){switch(n.intent){case`capture-only`:return O(await e(t,n.use));case`element-text`:{let r=await e(t,n.use);return{...O(r),...b(r)}}case`wait-observation`:{let r=await e(t,n.use);return{...O(r),...x(r)}}case`find-focus`:{let r=await e(t,n.use);return{...O(r),...S(r)}}case`find-type`:{let r=await e(t,n.use);return{...O(r),...S(r)}}}}async function D(e,t,n){switch(n.intent){case`capture-only`:return A(await e(t,n.use));case`element-text`:{let r=await e(t,n.use);return{...A(r),...b(r)}}case`wait-observation`:{let r=await e(t,n.use);return{...A(r),...x(r)}}case`find-focus`:{let r=await e(t,n.use);return{...A(r),...S(r)}}case`find-type`:{let r=await e(t,n.use);return{...A(r),...S(r)}}}}function O(e){return Object.freeze({captureSnapshot:async t=>await e.operations.captureSnapshot(t)})}function k(e){return Object.freeze({captureSnapshot:async t=>await e.operations.captureSnapshotWithCustomActions(t)})}function A(e){return Object.freeze({captureSnapshot:async t=>await e.operations.captureSnapshotWithoutActiveApp(t)})}async function j(e){if(e.operation===`captureSnapshot`||e.operation===`focusPoint`||e.operation===`typeText`)return f(e.command,e.fact);if(e.operation===`captureSnapshotWithCustomActions`)return M(e);let n=await v(e.device,e.platformServices);return t(`SESSION_NOT_FOUND`,`iOS ${e.command} requires an active app session on the target device. Run open first (for example: open --session ${e.session?.name??`sim`} --platform ios --device "<name>" <app>).`,{reason:`ios_app_session_required`,...n?{hint:n}:{}})}function M(e){let n=e.command===`diff`?`--actions requires an iOS simulator: custom actions are read through the private accessibility snapshot backend, which ${e.device.platform}/${e.device.kind} targets do not have.`:`--actions requires an iOS simulator: custom actions are unavailable on this ${e.device.platform}/${e.device.kind} target.`;return t(`UNSUPPORTED_OPERATION`,n,{reason:e.fact.available?void 0:e.fact.reason},{hint:e.command===`diff`||e.fact.available||!e.fact.hint?`Re-run without --actions, or target an iOS simulator.`:e.fact.hint})}export{g as a,h as i,w as n,_ as r,C as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{P as e,Y as t,_ as n,k as r}from"./sdk-contracts.js";import{V as i}from"./tv-remote.js";import{i as a}from"./snapshot-capture-annotations.js";import{i as o}from"./snapshot-diagnostics.js";import{l as s}from"./android-input-ownership.js";import{r as c}from"./diagnostics.js";import"./diagnostics2.js";import{E as l}from"./sdk-device.js";import{n as u}from"./android-snapshot-quality.js";import{i as d}from"./android-system-chrome.js";import{r as f}from"./request-cancel.js";import"./request.js";import{$ as p,Dt as m,H as h,I as g}from"./internal/daemon.js";import{t as _}from"./quality-warnings.js";import{t as v}from"./snapshot-quality-verdict.js";import{d as y,r as b,t as x}from"./runtime-session.js";import{i as S,r as C}from"./capture-disclosure.js";import{a as w,i as T,n as E,t as D}from"./screenshot-runtime.js";import{a as O,n as k,r as A}from"./snapshot-runtime-binding.js";import{promises as j}from"node:fs";import M from"node:os";import N from"node:path";function P(e){return{captureFailed:!0,error:e}}function F(e){return{path:e,overlayRefsRequested:!0,overlayRefsAnnotated:!1,overlayRefSource:`unavailable`}}function I(e,t){let n={path:e,overlayRefsRequested:!0,overlayRefSource:`session-snapshot`};return L(t)?{...n,overlayRefsAnnotated:!0,overlayRefs:t}:{...n,overlayRefsAnnotated:!1,overlayRefs:[]}}function L(e){return e.length>0}function R(e,t){return{path:e,overlayRefsRequested:!0,overlayRefsAnnotated:!1,overlayRefSource:`session-snapshot`,overlayAnnotationError:t}}function z(e){return`captureFailed`in e?{overlayRefCount:void 0,overlayRefsAnnotated:void 0}:{overlayRefCount:`overlayRefs`in e?e.overlayRefs.length:0,overlayRefsAnnotated:e.overlayRefsAnnotated}}function ee(e){return u(e)===`accessibility-timeout`}async function B(e){if(e.command!==`snapshot`||e.device.platform!==`android`)return;let n=t(e.error);if(ee(n))return{ok:!1,error:{...n,details:{...n.details??{},androidSnapshotTimeoutScreenshot:await V(e)}}}}async function V(n){try{let t=await T({device:n.device,overlayRefs:!1,inspectFacts:n.inspectFacts,platformServices:n.platformServices,bindDevice:n.bindDevice});if(!t.ok)throw new e(`UNSUPPORTED_OPERATION`,`The target does not support screenshot capture, so no timeout evidence was taken.`);let r=await j.mkdtemp(N.join(M.tmpdir(),`agent-device-android-snapshot-timeout-`)),i=N.join(r,`snapshot-timeout-overlay-refs.png`);await t.runtime.captureScreenshot({outPath:i,options:{appBundleId:n.session?.appBundleId,stabilize:!1,surface:n.session?.surface},execution:E(h(n.logPath,{screenshotNoStabilize:!0},n.session?.appBundleId,n.session?.trace?.outPath))}),await j.access(i);let a=await H(i,n.session);return c({level:`warn`,phase:`android_snapshot_timeout_screenshot_captured`,data:{path:i,...z(a)}}),a}catch(e){let n=t(e);return c({level:`warn`,phase:`android_snapshot_timeout_screenshot_failed`,data:{error:n.message}}),P(n.message)}}async function H(e,n){if(!n?.snapshot)return F(e);try{return I(e,await w({screenshotPath:e,snapshot:n.snapshot}))}catch(n){let r=t(n);return c({level:`warn`,phase:`android_snapshot_timeout_screenshot_overlay_failed`,data:{path:e,error:r.message}}),R(e,r.message)}}function U(e){let{verdict:t,appBundleId:n,latch:r}=e;return!t||t.backend===`android-helper`?{latch:r}:t.state===`healthy`?{latch:void 0}:t.state!==`recovered`||t.reasonCode===`requested-backend`?{latch:r}:t.reasonCode===`deferred`?r!==void 0&&r.appBundleId===n?{latch:r}:{warning:_(t.backend),latch:{appBundleId:n}}:{latch:{appBundleId:n}}}function W(e){let{session:t,data:n,verdict:r,internalObservation:a}=e;if(a||!t)return n;let o=U({verdict:r,appBundleId:t.appBundleId,latch:t.recoveredSnapshotWarningLatch});return t.recoveredSnapshotWarningLatch=o.latch,o.warning?{...n,warnings:[o.warning,...i(n)]}:n}async function G(e){let t=await k(e,e.command);if(!t.ok)return t.response;let{ref:n,session:r,device:i,snapshotScope:a}=t;return await O(r,i,async()=>{let{req:o,logPath:c,sessionStore:l}=e,u=n?.address??e.sessionName,d={},{runtime:f,sessions:p}=await K({createCommandSurface:e.createCommandSurface,req:o,sessionName:u,logPath:c,sessionStore:l,ref:n,session:r,device:i,snapshotScope:a,capturedQuality:d,captureSnapshotData:t.captureSnapshot}),m=()=>{let e=p.getRef();return e?l.requireCurrent(e):void 0},h;try{h=await e.execute({runtime:f,sessionName:u,req:o,snapshotScope:a,getSession:m})}catch(t){let n=await B({error:t,command:e.command,logPath:c,session:r,device:i,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(!n)throw t;return n}let g=m();Q({req:o,sessionName:u,sessionStore:l,ref:p.getRef(),result:h.record});let _=W({session:g,data:h.data,verdict:d.value,internalObservation:o.internal?.observationOnly===!0});return{ok:!0,data:s(h.data,_)}},e.platformResourceCleanup)}async function K(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,session:a,device:o,snapshotScope:s}=e,c=x({sessionName:n,sessionStore:i,ref:e.ref,recordOptions:{includeSnapshot:!0},setRecord:(e,r,a)=>{let s=$(e),c=J(r,s,q(t)),l=c?r.snapshot:s.snapshot,u=a?i.update(a,{}):A({sessionName:n,sessionScope:g(t),device:o,snapshot:l,appBundleId:e.appBundleId});return u.appName=e.appName??r?.appName,y(u,{snapshot:l,scopeSource:X({current:r,keepCurrentSnapshot:c,refScopedSnapshot:q(t)}),keptCurrentSnapshot:c,previousGeneration:r?.snapshotGeneration}),Y(u,c,t.command===`snapshot`&&t.internal?.observationOnly!==!0),a??i.publish(n,u)}});return{runtime:await e.createCommandSurface({backend:Z({req:t,logPath:r,session:a,device:o,snapshotScope:s,capturedQuality:e.capturedQuality,captureSnapshotData:e.captureSnapshotData}),...S(`snapshot`),signal:f(t.meta?.requestId),sessions:c}),sessions:c}}function q(e){return e.flags?.snapshotScope?.trim().startsWith(`@`)===!0}function J(e,t,n){return n&&t.snapshot?.nodes.length===0&&e?.snapshot!==void 0}function Y(e,t,n){!t&&n&&p(e)}function X(e){let{current:t,keepCurrentSnapshot:n,refScopedSnapshot:r}=e;if(r)return n?t?.snapshotScopeSource:t?.snapshotScopeSource??t?.snapshot}function Z(e){let{req:t,logPath:n,session:r,device:i,snapshotScope:s}=e;return{platform:l(i),captureSnapshot:async c=>{let l=await b({device:i,session:r,flags:t.flags,logPath:n,snapshotScope:s,signal:c.signal,captureData:e.captureSnapshotData}),u=a(l);e.capturedQuality.value=u.quality;let d=o(r);return{snapshot:l.snapshot,...u,...d?{snapshotDiagnostics:d}:{},appName:r?.appBundleId?r.appName??r.appBundleId:void 0,appBundleId:r?.appBundleId}}}}function Q(e){e.ref&&e.sessionStore.recordAction(e.ref,{command:e.req.command,positionals:e.req.positionals??[],flags:e.req.flags??{},result:te(e.result),interactiveObservation:m(e.req)})}function $(t){if(!t.snapshot)throw new e(`UNKNOWN`,`snapshot runtime did not produce session state`);return t}function te(e){return e.kind===`snapshot`?{nodes:e.nodes,truncated:e.truncated}:{mode:e.mode,baselineInitialized:e.baselineInitialized,summary:e.summary}}async function ne(e){let t=e.session;if(!t||!v(e.verdict)||e.req.internal?.observationOnly===!0)return;let n=await re({...e,session:t});if(n===void 0)return;let{path:r,displayRotation:i}=n;return{path:r,artifact:{field:`fallbackScreenshotPath`,artifactType:`screenshot`,path:r,fileName:`snapshot-fallback.png`,...i?{displayRotation:i}:{}}}}async function re(e){let{req:t,session:n}=e;try{let r=await T({device:n.device,overlayRefs:!1,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return r.ok?await D({createCommandSurface:e.createCommandSurface,session:n,sessionName:e.sessionName,captureScreenshot:r.runtime.captureScreenshot,dispatchContext:h(e.logPath,t.flags,n.appBundleId,n.trace?.outPath,t.meta?.requestId,t.meta)}):void 0}catch{return}}async function ie(e){let t={},i=await G({...e,command:`snapshot`,execute:async({runtime:i,sessionName:a,req:o,snapshotScope:c,getSession:l})=>{let u=await i.capture.snapshot({session:a,...r(o.flags,n),scope:c});u.targetActivation&&(t.targetActivation??=u.targetActivation);let f=ae(o,l()),p=d(u.nodes),m=s(u,p===u.nodes?u:{...u,nodes:p}),h=l(),g=await ne({createCommandSurface:e.createCommandSurface,req:o,session:h,sessionName:a,logPath:e.logPath,verdict:u.snapshotQuality,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice}),_=s(m,g?{...m,fallbackScreenshotPath:g.path,artifacts:[g.artifact]}:m);return{data:f===void 0?_:s(_,{..._,refsGeneration:f}),record:{kind:`snapshot`,nodes:u.nodes.length,truncated:u.truncated}}}});return C(i,t)}function ae(e,t){return e.internal?.observationOnly===!0?void 0:t?.snapshotGeneration}export{G as n,ie as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{A as t,j as n,v as r,y as i}from"./sdk-contracts.js";import"./
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{A as t,j as n,v as r,y as i}from"./sdk-contracts.js";import"./tv-remote.js";import{i as a}from"./snapshot-capture-annotations.js";import{d as o,n as s}from"./android-input-ownership.js";import{Gr as c,Ir as l,Jr as u,Mr as d,Pr as f}from"./sdk-batch.js";import{n as p,t as m}from"./snapshot-occlusion.js";import{t as h}from"./snapshot-desktop-projection.js";import{a as g}from"./ios-snapshot-planning.js";function _(e,t,n){if(n?.(e.length+t.length)===!1)return;let r=v(t);if(r.length===0)return 0;let i=1/0,a=-1/0;for(let e of r)i=Math.min(i,e.x),a=Math.max(a,e.endX);let o=v(e).filter(e=>e.x<a&&e.endX>i);if(o.length===0)return 0;let s=[...r.flatMap(e=>[e.x,e.endX]),...o.flatMap(e=>[Math.max(e.x,i),Math.min(e.endX,a)])];if(n?.(r.length+o.length+s.length)===!1)return;r.sort(y),o.sort(y);let c=[...new Set(s)].sort((e,t)=>e-t),l=[],u=[],d=0,f=0,p=0,m=0;for(let e=0;e<c.length-1;e+=1){let t=c[e],i=c[e+1];for(l=l.filter(e=>e.endX>t),u=u.filter(e=>e.endX>t);d<r.length&&r[d].x<=t;)l.push(r[d]),d+=1;for(;f<o.length&&o[f].x<=t;)u.push(o[f]),f+=1;if(n?.(1+l.length+u.length)===!1)return;let a=b(l),s=b(u),h=i-t;p+=h*x(a),m+=h*S(a,s)}return p<=0?0:m/p}function v(e){return e.filter(u).map(e=>({...e,endX:e.x+e.width}))}function y(e,t){return e.x-t.x||e.endX-t.endX}function b(e){let t=e.map(e=>({start:e.y,end:e.y+e.height})).sort((e,t)=>e.start-t.start||e.end-t.end),n=[];for(let e of t){let t=n.at(-1);!t||e.start>t.end?n.push({...e}):t.end=Math.max(t.end,e.end)}return n}function x(e){return e.reduce((e,t)=>e+t.end-t.start,0)}function S(e,t){let n=0,r=0,i=0;for(;r<e.length&&i<t.length;){let a=e[r],o=t[i];n+=Math.max(0,Math.min(a.end,o.end)-Math.max(a.start,o.start)),a.end<=o.end?r+=1:i+=1}return n}function C(e,t=new Map){if(t.size===0)return new Set;let n=D(e),r=O(e,n),i={remaining:Math.max(1024,e.length*128),exhausted:!1},a=w(n,{footprints:r,siblingOrders:t,budget:i});return i.exhausted?new Set:L(a,n)}function w(e,t){let n=new Set;for(let r of e.values())for(let e of r)if(T(e,r,t)&&n.add(e.index),t.budget.exhausted)return n;return n}function T(e,t,n){let r=n.siblingOrders.get(e.index),i=n.footprints.get(e.index);if(!r||!i)return!1;for(let e of t){if(!F(n.budget))return!1;if(E(r,i,e,n))return!0}return!1}function E(e,t,n,r){let i=r.siblingOrders.get(n.index),a=r.footprints.get(n.index);if(!i||!a?.hasAction||i.group!==e.group||i.order<=e.order)return!1;let o=P(a,`paint`,r.budget),s=P(t,`show`,r.budget);if(r.budget.exhausted)return!1;let c=_(o,s,e=>I(r.budget,e));return c!==void 0&&c>=.9}function D(e){let t=new Map;for(let n of e){if(typeof n.parentIndex!=`number`)continue;let e=t.get(n.parentIndex)??[];e.push(n),t.set(n.parentIndex,e)}return t}function O(e,t){let n=new Map;for(let r=e.length-1;r>=0;--r){let i=e[r],a=t.get(i.index)??[],o=a.flatMap(e=>n.get(e.index)??[]);n.set(i.index,k(i,a.length,o))}return n}function k(e,t,n){let r=j(e,t),i=r??M(e);return{...i?{showRect:i}:{},showChildren:r?[]:n,...r?{paintRect:r}:{},paintChildren:r?[]:n,hasAction:e.hittable===!0||n.some(A)}}function A(e){return e.hasAction}function j(e,t){if(u(e.rect))return e.hittable===!0||c(e.type)||t===0&&N(e)?e.rect:void 0}function M(e){return u(e.rect)&&N(e)?e.rect:void 0}function N(e){return!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim())}function P(e,t,n){let r=[],i=[e];for(;i.length>0;){if(!F(n))return r;let e=i.pop(),a=t===`paint`?e.paintRect:e.showRect;a&&r.push(a),i.push(...t===`paint`?e.paintChildren:e.showChildren)}return r}function F(e){return I(e,1)}function I(e,t){return t>e.remaining?(e.exhausted=!0,!1):(e.remaining-=t,!0)}function L(e,t){let n=new Set,r=[...e];for(;r.length>0;){let e=r.pop();if(!n.has(e)){n.add(e);for(let n of t.get(e)??[])r.push(n.index)}}return n}function R(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r.at(-1).depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r.at(-1)?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function z(e){let t=[],n=[];for(let r of e){let e=r.depth??0;for(;t.length>0&&e<=t.at(-1);)t.pop();let i=l(r.type??``),a=f(d(r));if((i===`group`||i===`ioscontentgroup`)&&!a){t.push(e);continue}let o=Math.max(0,e-t.length);n.push({...r,depth:o})}return n}var B=e({buildSnapshotState:()=>V});function V(e,o){let s=e?.nodes??[],c=o?.snapshotRaw,l=H(e,s,c===!0),u=R(c?l:z(l)),d=o?.snapshotScope&&G(e?.backend)?h(u,o.snapshotScope):u,f=a(e).quality;return{nodes:r(c?d:m(d,U(e?.backend))),truncated:e?.truncated,createdAt:Date.now(),...n(e),...f?{snapshotQuality:f}:{},...e.comparisonIdentity?{comparisonKey:g(e.comparisonIdentity)}:{},...e.systemSurface?{iosSystemSurfaceBundleId:e.systemSurface.bundleId}:{},...e.targetActivation?{targetActivation:e.targetActivation}:{},...e.keyboard?{keyboard:e.keyboard}:{},...e.viewport?{viewport:e.viewport}:{},presentationKey:i(t(o)),comparisonSafe:K(e?.backend,o)}}function H(e,t,n){return e.backend===`android`&&!n?W(e,t):t}function U(e){return e===`android`?{isAdditionalOverlayNode:s}:{}}function W(e,t){let n=o(e),r=C(n?.nodes??t,n?.androidSiblingOrderByNodeIndex);return p(t,e=>{let t=n?.sourceIndexByNodeIndex.get(e.index)??e.index;return r.has(t)})}function G(e){return e===void 0||e===`linux-atspi`||e===`harmonyos-arkui`||e===`web`}function K(e,t){return e===`android`&&t?.snapshotInteractiveOnly!==!0&&typeof t?.snapshotDepth!=`number`&&!t?.snapshotScope}export{B as n,V as t};
|
package/dist/src/snapshot.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{o as t}from"./version.js";import{m as n,x as r,y as i}from"./host-file.js";import{runHarmonyHdc as a,runHarmonyShell as o}from"./hdc.js";import{randomUUID as s}from"node:crypto";import c from"node:path";const l=t({ttlMs:2e3,scheduleExpiry:!0});async function u(e,t={}){let l=`/data/local/tmp/agent-device-layout-${s()}.json`,u=await n(`agent-device-harmony-layout-`),d=c.join(u,`layout.json`);try{return await o(e,[`uitest`,`dumpLayout`,`-p`,l],{timeoutMs:3e4}),await a(e,[`file`,`recv`,l,d],{timeoutMs:15e3}),m(p(await i(d)),t)}finally{await o(e,[`rm`,`-f`,l],{allowFailure:!0}).catch(()=>{}),await r(u)}}async function d(t){let n=t.id,r=l.get(n);if(r)return r;let i=(await u(t)).nodes.find(e=>e.type===`Application`&&e.rect)?.rect;if(!i||i.width<=0||i.height<=0)throw new e(`COMMAND_FAILED`,`HarmonyOS snapshot did not expose an application viewport`);return l.set(n,i),i}function f(e){l.delete(e.id)}function p(t){try{let e=JSON.parse(t);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`layout root is not an object`);return e}catch(t){throw new e(`COMMAND_FAILED`,`HarmonyOS uitest returned an invalid layout JSON document`,{cause:t instanceof Error?t.message:String(t)})}}function m(e,t){let{nodes:n,truncated:r,analysis:i}=h(e,{maxNodes:5e3,maxDepth:t.depth??1/0,interactiveOnly:t.interactiveOnly===!0});return{nodes:n,...r?{truncated:!0}:{},analysis:i}}function h(e,t){let n=[],r=0,i=0,a=!1,o=(e,s,c)=>{r+=1,i=Math.max(i,s);let l=c;if(n.length>=t.maxNodes)a=!0;else{let r=g(e.attributes??{},n.length,s,c);l=!t.interactiveOnly||r.hittable===!0?n.push(r)-1:c}if(s<t.maxDepth)for(let t of e.children??[])o(t,s+1,l)};return o(e,0),{nodes:n,truncated:a,analysis:{rawNodeCount:r,maxDepth:i}}}function g(e,t,n,r){let i=_(e,`text`)??_(e,`originalText`),a=_(e,`description`),o=_(e,`id`)??_(e,`key`),s=v(_(e,`bounds`));return{index:t,type:_(e,`type`)===`root`?`Application`:_(e,`type`),...a?{label:a}:{},...i?{value:i}:{},...o?{identifier:o}:{},...s?{rect:s}:{},enabled:_(e,`enabled`)!==`false`,focused:_(e,`focused`)===`true`,visibleToUser:_(e,`visible`)!==`false`,hittable:_(e,`clickable`)===`true`,depth:n,...r===void 0?{}:{parentIndex:r}}}function _(e,t){let n=e[t];return typeof n==`string`?n:void 0}function v(e){if(!e)return;let t=/^\[(-?\d+),(-?\d+)\]\[(-?\d+),(-?\d+)\]$/.exec(e);if(!t)return;let[,n,r,i,a]=t,o=Number(n),s=Number(r),c=Number(i)-o,l=Number(a)-s;return c>=0&&l>=0?{x:o,y:s,width:c,height:l}:void 0}export{f as invalidateHarmonyGestureViewport,d as readHarmonyGestureViewport,u as snapshotHarmony};
|
package/dist/src/snapshot2.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{t}from"./
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{r as t}from"./diagnostics.js";import"./diagnostics2.js";import{_ as n}from"./file.js";import"./process.js";import{c as r}from"./host-file.js";import{n as i,t as a}from"./tool-provider2.js";import o from"node:path";import{fileURLToPath as s}from"node:url";const c={"push button":`Button`,"toggle button":`Button`,"push button menu":`Button`,label:`StaticText`,static:`StaticText`,caption:`StaticText`,text:`TextField`,entry:`TextField`,"password text":`TextField`,"spin button":`TextField`,terminal:`TextArea`,"document text":`TextArea`,paragraph:`TextArea`,frame:`Window`,window:`Window`,dialog:`Dialog`,alert:`Alert`,"file chooser":`Dialog`,"color chooser":`Dialog`,"font chooser":`Dialog`,panel:`Group`,filler:`Group`,section:`Group`,form:`Group`,grouping:`Group`,"layered pane":`Group`,"glass pane":`Group`,"root pane":`Group`,"option pane":`Group`,"internal frame":`Group`,"desktop frame":`Group`,"block quote":`Group`,article:`Group`,comment:`Group`,landmark:`Group`,log:`Group`,marquee:`Group`,math:`Group`,notification:`Group`,"content deletion":`Group`,"content insertion":`Group`,mark:`Group`,suggestion:`Group`,"scroll pane":`ScrollArea`,"scroll bar":`ScrollBar`,"menu bar":`MenuBar`,menu:`Menu`,"popup menu":`Menu`,"menu item":`MenuItem`,"check menu item":`MenuItem`,"radio menu item":`MenuItem`,"tearoff menu item":`MenuItem`,"check box":`CheckBox`,"radio button":`RadioButton`,switch:`Switch`,"combo box":`ComboBox`,"page tab":`Tab`,"page tab list":`TabList`,table:`Table`,"tree table":`Table`,"table cell":`Cell`,"table row":`Row`,"table column header":`Cell`,"table row header":`Cell`,"column header":`Cell`,"row header":`Cell`,list:`List`,"list item":`ListItem`,"list box":`List`,tree:`Tree`,"tree item":`TreeItem`,"description list":`List`,"description term":`ListItem`,"description value":`ListItem`,"tool bar":`Toolbar`,"status bar":`StatusBar`,"info bar":`StatusBar`,slider:`Slider`,"progress bar":`ProgressBar`,"level bar":`ProgressBar`,image:`Image`,icon:`Image`,animation:`Image`,canvas:`Image`,"drawing area":`Image`,video:`Video`,audio:`Audio`,link:`Link`,hyperlink:`Link`,separator:`Separator`,application:`Application`,"tool tip":`Tooltip`,timer:`Timer`,heading:`Heading`,footnote:`Footnote`,"title bar":`TitleBar`,"date editor":`DateEditor`,rating:`Slider`};function l(e){let t=e.toLowerCase().trim();return c[t]||t.split(/[\s_-]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)}const u=`atspi-dump.py`;let d=null;function f(){if(d)return d;let t=o.dirname(s(import.meta.url));for(let e=0;e<6;e++){let e=o.join(t,`linux`,u);if(r(e))return d=e,e;t=o.dirname(t)}throw new e(`TOOL_MISSING`,`Cannot find ${u}. Ensure the agent-device package is installed correctly.`)}async function p(t,r={}){let o=a().accessibility;if(o)return await o.captureTree(t,r);if(n()!==`linux`)throw new e(`UNSUPPORTED_PLATFORM`,`AT-SPI2 bridge is only available on Linux`);if(!await a().whichCommand(`python3`))throw new e(`TOOL_MISSING`,`python3 is required for AT-SPI2 accessibility snapshots on Linux.`);let s=r.maxNodes??1500,c=r.maxDepth??12,u=r.maxApps??24,d=[f(),`--surface`,t,`--max-nodes`,String(s),`--max-depth`,String(c),`--max-apps`,String(u)],p=await i(`python3`,d,{allowFailure:!0,timeoutMs:3e4,signal:r.signal});if(p.exitCode!==0){let t=p.stderr.trim();throw t.includes(`No module named`)||t.includes(`gi.require_version`)?new e(`TOOL_MISSING`,`AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.`,{cause:t}):new e(`COMMAND_FAILED`,`AT-SPI2 snapshot failed (exit ${p.exitCode}): ${t||p.stdout}`)}let m;try{m=JSON.parse(p.stdout)}catch{throw new e(`COMMAND_FAILED`,`AT-SPI2 snapshot returned invalid JSON: ${p.stdout.slice(0,200)}`)}if(m.error)throw new e(`COMMAND_FAILED`,`AT-SPI2: ${m.error}`);return{nodes:(m.nodes??[]).map(e=>({index:e.index,type:l(e.role),role:e.role,label:e.label??void 0,value:e.value??void 0,rect:e.rect??void 0,enabled:e.enabled??void 0,selected:e.selected??void 0,hittable:e.hittable??void 0,depth:e.depth,parentIndex:e.parentIndex??void 0,pid:e.pid??void 0,appName:e.appName??void 0,windowTitle:e.windowTitle??void 0})),truncated:m.truncated,surface:t}}function m(e){return e===`desktop`?`desktop`:e===`frontmost-app`||e===`app`?`frontmost-app`:(e===`menubar`&&t({level:`warn`,phase:`linux_snapshot`,data:{message:`menubar surface is not supported on Linux, falling back to desktop`}}),`desktop`)}async function h(e,t){let n=await p(m(e),{signal:t});return{nodes:n.nodes,truncated:n.truncated}}async function g(e,t,n){let{nodes:r}=await h(n),i=r.filter(n=>{let r=n.rect;return r?e>=r.x&&t>=r.y&&e<=r.x+r.width&&t<=r.y+r.height:!1}).sort((e,t)=>{let n=e.depth??0,r=t.depth??0;return n===r?_(e.rect)-_(t.rect):r-n});for(let e of i){let t=v(e);if(t.trim())return t}return``}function _(e){return(e?.width??0)*(e?.height??0)}function v(e){for(let t of[e.value,e.label,e.identifier])if(typeof t==`string`&&t.length>0)return t;return``}export{g as readLinuxTextAtPoint,h as snapshotLinux};
|
package/dist/src/snapshot3.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{r as t}from"./diagnostics.js";import"./diagnostics2.js";import{f as n}from"./owner-identity.js";import"./process.js";import{c as r}from"./host-file.js";import{n as i,t as a}from"./tool-provider2.js";import o from"node:path";import{fileURLToPath as s}from"node:url";const c={"push button":`Button`,"toggle button":`Button`,"push button menu":`Button`,label:`StaticText`,static:`StaticText`,caption:`StaticText`,text:`TextField`,entry:`TextField`,"password text":`TextField`,"spin button":`TextField`,terminal:`TextArea`,"document text":`TextArea`,paragraph:`TextArea`,frame:`Window`,window:`Window`,dialog:`Dialog`,alert:`Alert`,"file chooser":`Dialog`,"color chooser":`Dialog`,"font chooser":`Dialog`,panel:`Group`,filler:`Group`,section:`Group`,form:`Group`,grouping:`Group`,"layered pane":`Group`,"glass pane":`Group`,"root pane":`Group`,"option pane":`Group`,"internal frame":`Group`,"desktop frame":`Group`,"block quote":`Group`,article:`Group`,comment:`Group`,landmark:`Group`,log:`Group`,marquee:`Group`,math:`Group`,notification:`Group`,"content deletion":`Group`,"content insertion":`Group`,mark:`Group`,suggestion:`Group`,"scroll pane":`ScrollArea`,"scroll bar":`ScrollBar`,"menu bar":`MenuBar`,menu:`Menu`,"popup menu":`Menu`,"menu item":`MenuItem`,"check menu item":`MenuItem`,"radio menu item":`MenuItem`,"tearoff menu item":`MenuItem`,"check box":`CheckBox`,"radio button":`RadioButton`,switch:`Switch`,"combo box":`ComboBox`,"page tab":`Tab`,"page tab list":`TabList`,table:`Table`,"tree table":`Table`,"table cell":`Cell`,"table row":`Row`,"table column header":`Cell`,"table row header":`Cell`,"column header":`Cell`,"row header":`Cell`,list:`List`,"list item":`ListItem`,"list box":`List`,tree:`Tree`,"tree item":`TreeItem`,"description list":`List`,"description term":`ListItem`,"description value":`ListItem`,"tool bar":`Toolbar`,"status bar":`StatusBar`,"info bar":`StatusBar`,slider:`Slider`,"progress bar":`ProgressBar`,"level bar":`ProgressBar`,image:`Image`,icon:`Image`,animation:`Image`,canvas:`Image`,"drawing area":`Image`,video:`Video`,audio:`Audio`,link:`Link`,hyperlink:`Link`,separator:`Separator`,application:`Application`,"tool tip":`Tooltip`,timer:`Timer`,heading:`Heading`,footnote:`Footnote`,"title bar":`TitleBar`,"date editor":`DateEditor`,rating:`Slider`};function l(e){let t=e.toLowerCase().trim();return c[t]||t.split(/[\s_-]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)}const u=`atspi-dump.py`;let d=null;function f(){if(d)return d;let t=o.dirname(s(import.meta.url));for(let e=0;e<6;e++){let e=o.join(t,`linux`,u);if(r(e))return d=e,e;t=o.dirname(t)}throw new e(`TOOL_MISSING`,`Cannot find ${u}. Ensure the agent-device package is installed correctly.`)}async function p(t,r={}){let o=a().accessibility;if(o)return await o.captureTree(t,r);if(n()!==`linux`)throw new e(`UNSUPPORTED_PLATFORM`,`AT-SPI2 bridge is only available on Linux`);if(!await a().whichCommand(`python3`))throw new e(`TOOL_MISSING`,`python3 is required for AT-SPI2 accessibility snapshots on Linux.`);let s=r.maxNodes??1500,c=r.maxDepth??12,u=r.maxApps??24,d=[f(),`--surface`,t,`--max-nodes`,String(s),`--max-depth`,String(c),`--max-apps`,String(u)],p=await i(`python3`,d,{allowFailure:!0,timeoutMs:3e4,signal:r.signal});if(p.exitCode!==0){let t=p.stderr.trim();throw t.includes(`No module named`)||t.includes(`gi.require_version`)?new e(`TOOL_MISSING`,`AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.`,{cause:t}):new e(`COMMAND_FAILED`,`AT-SPI2 snapshot failed (exit ${p.exitCode}): ${t||p.stdout}`)}let m;try{m=JSON.parse(p.stdout)}catch{throw new e(`COMMAND_FAILED`,`AT-SPI2 snapshot returned invalid JSON: ${p.stdout.slice(0,200)}`)}if(m.error)throw new e(`COMMAND_FAILED`,`AT-SPI2: ${m.error}`);return{nodes:(m.nodes??[]).map(e=>({index:e.index,type:l(e.role),role:e.role,label:e.label??void 0,value:e.value??void 0,rect:e.rect??void 0,enabled:e.enabled??void 0,selected:e.selected??void 0,hittable:e.hittable??void 0,depth:e.depth,parentIndex:e.parentIndex??void 0,pid:e.pid??void 0,appName:e.appName??void 0,windowTitle:e.windowTitle??void 0})),truncated:m.truncated,surface:t}}function m(e){return e===`desktop`?`desktop`:e===`frontmost-app`||e===`app`?`frontmost-app`:(e===`menubar`&&t({level:`warn`,phase:`linux_snapshot`,data:{message:`menubar surface is not supported on Linux, falling back to desktop`}}),`desktop`)}async function h(e,t){let n=await p(m(e),{signal:t});return{nodes:n.nodes,truncated:n.truncated}}async function g(e,t,n){let{nodes:r}=await h(n),i=r.filter(n=>{let r=n.rect;return r?e>=r.x&&t>=r.y&&e<=r.x+r.width&&t<=r.y+r.height:!1}).sort((e,t)=>{let n=e.depth??0,r=t.depth??0;return n===r?_(e.rect)-_(t.rect):r-n});for(let e of i){let t=v(e);if(t.trim())return t}return``}function _(e){return(e?.width??0)*(e?.height??0)}function v(e){for(let t of[e.value,e.label,e.identifier])if(typeof t==`string`&&t.length>0)return t;return``}export{g as readLinuxTextAtPoint,h as snapshotLinux};
|
|
1
|
+
import{P as e,et as t,s as n}from"./sdk-contracts.js";import{H as r,U as i}from"./tv-remote.js";import{c as a}from"./back-mode.js";import{r as o}from"./diagnostics.js";import"./diagnostics2.js";import{A as s,f as c,g as l,m as u}from"./sdk-device.js";import{Ht as d,Ir as f,Ut as p,et as m,nt as h,on as g,pr as _,rt as v,sn as y,tt as b,zt as ee}from"./sdk-batch.js";import"./alert-contract.js";import{C as x,E as S,T as te,_ as ne,g as re,h as ie,l as ae,m as oe,p as C,r as w}from"./settings.js";import{t as T}from"./location-coordinates.js";import{t as se}from"./absence-observation-errors.js";import{H as E,Ot as D,a as O,bt as ce,i as le,s as k,tt as A}from"./internal/daemon.js";import{t as j}from"./wait.js";import{r as M,u as N}from"./runtime-session.js";import{n as P,t as F}from"./capture-disclosure.js";import{n as I,t as L}from"./snapshot-runtime.js";import{a as R,i as z}from"./snapshot-runtime-binding.js";import{a as B,c as V,f as H,g as U,h as W,m as ue,o as de,p as fe,s as pe,t as me}from"./selector-runtime.js";async function he(e){let{device:t,action:n,inspectFacts:r,bindDevice:i,platformServices:a}=e,o={command:`alert`,device:t,inspectFacts:r,bindDevice:i,platformServices:a,readiness:!e.session};if(n===`wait`){let e=await k({...o,use:v});if(e.type===`response`)return{ok:!1,response:e.response};let t=e.runtime;return{ok:!0,execute:e=>_e(t,e)}}if(n===`accept`){let e=await k({...o,use:m});if(e.type===`response`)return{ok:!1,response:e.response};let t=e.runtime;return{ok:!0,execute:e=>ve(t,e)}}if(n===`dismiss`){let e=await k({...o,use:b});if(e.type===`response`)return{ok:!1,response:e.response};let t=e.runtime;return{ok:!0,execute:e=>ye(t,e)}}let s=await k({...o,use:h});if(s.type===`response`)return{ok:!1,response:s.response};let c=s.runtime;return{ok:!0,execute:e=>ge(c,e)}}async function ge(e,t){return await e.operations.readAlert(t)}async function _e(e,t){return await e.operations.awaitAlert(t)}async function ve(e,t){return await e.operations.acceptAlert(t)}async function ye(e,t){return await e.operations.dismissAlert(t)}async function be(e){let{req:t,logPath:n,sessionStore:r,ref:i,device:a,inspectFacts:o,bindDevice:s,platformServices:c}=e,l=i?r.requireCurrent(i):void 0,u=await he({device:a,action:Se(t.positionals?.[0]),session:l,inspectFacts:o,bindDevice:s,platformServices:c});if(!u.ok)return u.response;l=i?r.requireCurrent(i):void 0,l&&ce(t)===`may-invalidate`&&A(l);let d=E(n,t.flags,l?.appBundleId,l?.trace?.outPath),f=await u.execute({timeoutMs:y(t.positionals?.[1])??1e4,...xe(l),execution:O(d)});return D(r,i,t,t.command,f),{ok:!0,data:f}}function xe(e){return{...e?.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...e?.surface===void 0?{}:{surface:e.surface}}}function Se(e){return e===`accept`||e===`dismiss`||e===`wait`?e:`get`}function Ce(e){let t=e.positionals?.[0]?.toLowerCase(),r=e.positionals?.[1]?.toLowerCase(),i=e.positionals?.[2]?.toLowerCase();if(t===`clear-app-state`)return{ok:!0,parsed:{leg:`write`,args:{setting:t,state:`clear`,appBundleId:r===`clear`?e.positionals?.[2]:e.positionals?.[1]}}};let a=ee(e.positionals);if(a.kind===`read`)return{ok:!0,parsed:{leg:`read`,setting:a.setting}};if(!t||!r||t===`permission`&&!i||t===`location`&&r===`set`&&(!e.positionals?.[2]||!e.positionals?.[3])||t===`reset-keychain`&&e.positionals?.[2]!==void 0)return n(`INVALID_ARGS`,ae);let o=r;if(t===`text-size`){let e=x(r);if(e===void 0)return n(`INVALID_ARGS`,re(r));o=e}return{ok:!0,parsed:{leg:`write`,args:{setting:t,state:o,permissionTarget:i,permissionMode:e.positionals?.[3],latitude:e.positionals?.[2],longitude:e.positionals?.[3]}}}}function we(e){if(e.setting===`permission`)return{permissionTarget:e.permissionTarget,permissionMode:e.permissionMode};if(e.setting===`location`&&e.state===`set`)return{latitude:T(e.latitude,`latitude`),longitude:T(e.longitude,`longitude`)}}function Te(e,t,n){let{setting:r,state:i}=e;return r===`clear-app-state`?{setting:`clear-app-state`,state:`clear`,appBundleId:t,platform:n}:r===`location`&&i===`set`?{setting:r,state:i,latitude:e.latitude,longitude:e.longitude,platform:n}:r===`permission`?{setting:r,state:i,permissionTarget:e.permissionTarget,permissionMode:e.permissionMode,platform:n}:{setting:r,state:i,appBundleId:t,platform:n}}function Ee(e){return typeof e.message==`string`&&e.message.length>0?e.message:void 0}async function De(e,t,n){let{setting:a,state:o}=t,s=await e.operations.setSetting(t);return s&&typeof s==`object`?i({setting:a,state:o,...s},Ee(s)??n):{setting:a,state:o,...r(n)}}async function Oe(e){return e.parsed.leg===`read`?await ke(e,e.parsed.setting):await Ae(e,e.parsed.args)}async function ke(e,t){let{req:n,logPath:i,sessionStore:a,ref:s,device:c,inspectFacts:l,bindDevice:u,platformServices:f}=e,p=s?a.requireCurrent(s):void 0,m=G(c,t);if(m!==void 0)return m;let h=await k({command:`settings ${t}`,device:c,use:d,inspectFacts:l,bindDevice:u,platformServices:f,readiness:!p});if(h.type===`response`)return h.response;p=s?a.requireCurrent(s):void 0,o({level:`debug`,phase:`settings_read`,data:{setting:t,platform:c.platform}});let g=E(i,n.flags,p?.appBundleId,p?.trace?.outPath),_=await h.runtime.operations.readSetting({setting:t,execution:O(g)}),v={..._,...r(C(_))};return D(a,s,n,n.command,v),{ok:!0,data:v}}async function Ae(e,t){let{req:n,logPath:r,sessionStore:i,ref:a,device:s,inspectFacts:c,bindDevice:l,platformServices:u}=e,d=a?i.requireCurrent(a):void 0,{setting:f,state:m}=t,h=G(s,f);if(h!==void 0)return h;let g=je(s,n,f,m);if(g!==void 0)return g;let _=await k({command:`settings`,device:s,use:p,inspectFacts:c,bindDevice:l,platformServices:u,readiness:!d});if(_.type===`response`)return _.response;d=a?i.requireCurrent(a):void 0;let v=Me(n,t,d,s),y=Ne(t,v);if(y!==void 0)return y;d&&A(d),o({level:`debug`,phase:`settings_apply`,data:Te(t,v,s.platform)});let b=await De(_.runtime,Pe(t,v,E(r,n.flags,v,d?.trace?.outPath)),oe(f,m,v));return D(i,a,n,n.command,b),{ok:!0,data:b}}function G(e,t){if(l(e)&&!ne(t))return n(`INVALID_ARGS`,ie(t));if(t===`text-size`&&c(e.platform)&&!u(e))return n(`UNSUPPORTED_OPERATION`,w.message,{deviceKind:e.kind,appleOs:s(e),reason:w.reason},{hint:w.hint})}function K(e){let t=e.input?.app;if(typeof t!=`string`)return;let n=t.trim();return n.length>0?n:void 0}function q(e){return l(e)?`macos-host`:c(e.platform)?`apple`:`mobile`}function je(e,t,r,i){let a=K(t);if(a===void 0||S(q(e),r,i)!==`device-level`)return;let o=te(r,i,a);return n(o.code,o.message,o.details,{hint:o.hint})}function Me(e,t,n,r){let i=S(q(r),t.setting,t.state)===`app-scoped`?K(e):void 0;return t.appBundleId??i??e.internal?.settingsAppBundleId??n?.appBundleId}function Ne(e,r){if(e.setting===`clear-app-state`&&!r)return n(`INVALID_ARGS`,`settings clear-app-state requires an app id when no app is bound to the session`,t())}function Pe(e,t,n){let r=we(e);return{setting:e.setting,state:e.state,...t===void 0?{}:{appBundleId:t},...r===void 0?{}:{options:r},execution:O(n)}}async function Fe(e){return await I({...e,command:`diff`,execute:async({runtime:e,sessionName:t,req:n,snapshotScope:r})=>{let i=await e.capture.diffSnapshot({session:t,interactiveOnly:n.flags?.snapshotInteractiveOnly,depth:n.flags?.snapshotDepth,scope:r,raw:n.flags?.snapshotRaw});return{data:i,record:{kind:`diff`,mode:`snapshot`,baselineInitialized:i.baselineInitialized,summary:i.summary}}}})}function Ie(e){return e!==`sleep`}const Le=[`application`,`window`,`tabbar`,`scrollbar`,`image`],Re=new Set([`tab bar`]);async function ze(e,t){if(t.ok||!Be(t.error.details?.reason)||t.error.details?.captureStalled===!0||t.error.details?.captureTruncated===!0)return t;let r=await Ve(e).catch(()=>null);return r?n(t.error.code,`${t.error.message}. Current surface: ${r.summary}.`,{...t.error.details??{},currentSurface:r.details}):t}function Be(e){return e===j.targetAbsent||e===j.stableTimeout}async function Ve(e){let t={...e.req.flags,snapshotInteractiveOnly:!0},n=await M({device:e.device,session:e.session,flags:t,logPath:e.logPath??``,captureData:async()=>await e.capture(le({flags:t,logPath:e.logPath??``,meta:e.req.meta,session:e.session,snapshotScope:void 0}))});F(e.captureProof,n.snapshot);let r=[...n.snapshot.nodes].sort(He),i=J(r,6,{includeIdentifiers:!0});if(i.length===0)return null;let a=J(r.filter(e=>!Z(e)),4,{includeIdentifiers:!1}),o=J(r.filter(We),4,{includeIdentifiers:!0});return{summary:(a.length>0?a:i.slice(0,4)).join(`, `),details:{labels:i,...o.length>0?{buttons:o}:{}}}}function J(e,t,n){let r=new Set,i=[];for(let a of e){let e=X(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function He(e,t){return Y(e)-Y(t)||Ue(e,t)}function Y(e){let t=!!X(e,{includeIdentifiers:!1});return(Z(e)?2:0)+ +!t}function Ue(e,t){return e.rect&&t.rect?e.rect.y-t.rect.y||e.rect.x-t.rect.x:e.rect?-1:t.rect?1:(e.depth??0)-(t.depth??0)||e.index-t.index}function X(e,t){let n=(t.includeIdentifiers?[e.label,e.value,e.identifier]:[e.label,e.value]).map(e=>typeof e==`string`?e.trim():``).find(e=>e.length>0);return n?n.replaceAll(/\s+/g,` `).slice(0,80):``}function Z(e){let t=f(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return Le.some(e=>t.includes(e))||Re.has(n)||n.endsWith(`.fill`)}function We(e){let t=`${e.type??``} ${e.role??``} ${e.subrole??``}`;return f(t).includes(`button`)}async function Ge(e){let{req:t,sessionName:n,sessionStore:r}=e,i=Q(t);if(`ok`in i)return i;let a=i,{ref:o,session:s,device:c}=await z(r,n,t.flags),l=await Ke(e,a,s,c);if(l&&`ok`in l)return l;let u=l,d=t.internal?.replayLandmarkGuard,f=qe(a,s);if(`ok`in f)return f;let{waitParsed:p,staleRefsWarning:m}=f;return e.consumedSnapshot??={},e.captureProof??={},a.kind===`sleep`?await $({...e,ref:o},p,s,c,u,m,d):P({response:await R(s,c,()=>$({...e,ref:o},p,s,c,u,m,d),e.platformResourceCleanup),consumedTree:me(e),captureProof:e.captureProof})}function Q(e){let t=g(e.positionals??[]);if(!t)return n(`INVALID_ARGS`,`wait requires a duration or text`);if(t.kind===`invalid`)return n(`INVALID_ARGS`,t.message);if(t.kind!==`absent`)return t;let r=a({depth:e.flags?.snapshotDepth,scope:e.flags?.snapshotScope});if(!r)return t;let i=se(r,`wait`);return n(i.code,i.message,i.details)}async function Ke(e,t,n,r){if(!Ie(t.kind))return;let i=await H({command:`wait`,device:r,session:n,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return i.ok?i.operations:i.response}function qe(e,t){if(e.kind!==`ref`)return{waitParsed:e};let n=U(e.rawRef);return n.ok?{waitParsed:{...e,rawRef:n.ref},staleRefsWarning:N({session:t,ref:n.ref,mintedGeneration:n.generation})}:n.response}async function $(e,t,n,r,i,a,o){let{req:s,sessionName:c,sessionStore:l}=e,u=await V({...e,ref:e.ref,session:n,device:r,bound:i}),d=await pe(async()=>{let r=await u.selectors.wait({session:c,requestId:s.meta?.requestId,target:Je(t,n,o)}),i=de(r);fe(l,e.ref,s,ue(r),i,`landmark`);let d=W(r);return a?{...d,warning:a}:d}),f=i?await ze({req:s,logPath:e.logPath,session:n,device:r,capture:i.capture,captureProof:e.captureProof},d):d;return await B(e,f,`wait`)}function Je(e,t,n){switch(e.kind){case`sleep`:return{kind:`sleep`,durationMs:e.durationMs};case`selector`:return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...n?{recordedLandmark:n}:{}};case`absent`:return{kind:`absent`,selector:e.selectorExpression,timeoutMs:e.timeoutMs};case`ref`:return Xe(e,t);case`stable`:return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};case`text`:return Ze(e);default:return Ye(e)}}function Ye(e){throw Error(`Unsupported wait positional target: ${String(e)}`)}function Xe(t,n){if(!n?.snapshot)throw new e(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:t.rawRef,timeoutMs:t.timeoutMs}}function Ze(t){let n=_(t.text);if(!n.ok)throw new e(n.code,n.message);return{kind:`text`,text:n.text,timeoutMs:t.timeoutMs}}const Qe={snapshot:async({req:e,createCommandSurface:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformServices:s,platformResourceCleanup:c})=>await L({createCommandSurface:t,req:e,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformServices:s,platformResourceCleanup:c}),diff:async({req:e,createCommandSurface:t,sessionName:r,logPath:i,sessionStore:a,inspectFacts:o,bindDevice:s,platformServices:c,platformResourceCleanup:l})=>e.positionals?.[0]===`snapshot`?await Fe({createCommandSurface:t,req:e,sessionName:r,logPath:i,sessionStore:a,inspectFacts:o,bindDevice:s,platformServices:c,platformResourceCleanup:l}):n(`INVALID_ARGS`,`diff currently supports only: diff snapshot`),wait:async({req:e,createCommandSurface:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformServices:s,platformResourceCleanup:c})=>await Ge({createCommandSurface:t,req:e,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformServices:s,platformResourceCleanup:c}),alert:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o,platformResourceCleanup:s})=>{let{ref:c,session:l,device:u}=await z(r,t,e.flags);return await R(l,u,async()=>await be({req:e,logPath:n,sessionStore:r,ref:c,device:u,inspectFacts:i,bindDevice:a,platformServices:o}),s)},settings:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformServices:o,platformResourceCleanup:s})=>{let c=Ce(e);if(!c.ok)return c;let{ref:l,session:u,device:d}=await z(r,t,e.flags);return await R(u,d,async()=>await Oe({req:e,logPath:n,sessionStore:r,ref:l,device:d,parsed:c.parsed,inspectFacts:i,bindDevice:a,platformServices:o}),s)}};async function $e(e){let t=e.req.command,n=Qe[t];return n?await n(e):null}export{$e as handleSnapshotCommands};
|
package/dist/src/src.js
CHANGED
|
@@ -1 +1,5 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{$t as n}from"./sdk-batch.js";import{i as r,n as i,o as a,r as o,s,t as c}from"./device2.js";import{i as l,n as u,r as d,t as f}from"./client-options.js";import{a as p,c as m,i as h,l as g,n as _,o as v,r as y,s as b,t as x}from"./device-session.js";import{scryptSync as S}from"node:crypto";function C(e){if(e.runtimeInstance!==void 0){let t=e.runtimeInstance.trim();if(!t)throw TypeError(`Limrun runtimeInstance must be a non-empty string`);return t}let t=JSON.stringify({provider:`limrun`,region:e.region?.trim().toLowerCase()||`default`,apiKey:e.apiKey,attachedIos:e.instances?.ios?.apiUrl,attachedAndroid:e.instances?.android?.apiUrl});return`principal-${S(t,`agent-device:limrun-runtime-owner:v1`,32,{N:16384,r:8,p:1,maxmem:67108864}).toString(`hex`)}`}function w(e,t,r){let a=new T(e,t);if(!r?.includePlatformModule)return a;let o=n(i,C(e));if(o.kind!==`provider-runtime`)throw TypeError(`Invalid Limrun runtime owner`);return Object.freeze({runtime:a,platformModule:Object.freeze({owner:o,loadRuntime:async e=>await E(a,o.instance,e)})})}var T=class{limrun;sessions=new Map;keepAliveTimers=new Map;appAliases=new Map;options;dependencies;provider=i;leaseLifecycle={allocate:async(e,t)=>await this.allocate(e,t),release:async e=>await this.release(e)};appCatalog=async(e,t)=>{let{assertLimrunUploadedAppAccess:n,listLimrunAppAssets:r}=await import(`./app-catalog.js`);return n(e.publicNetworkOnly),(await r(this.orgClient(`Listing uploaded apps`,`Run open <bundle-or-package-id> first; apps then lists the apps installed on the instance.`),e.platform,t)).map(e=>e.name)};recoverExpiredLease=async e=>{if(e.leaseProvider!==this.provider||!s(e.backend))throw new t(`UNSUPPORTED_OPERATION`,`Limrun cannot recover this expired lease.`,{leaseId:e.leaseId,leaseProvider:e.leaseProvider,leaseBackend:e.backend});await this.release(e)};deviceInventoryProvider=async e=>{if(e.leaseProvider!==this.provider||!e.leaseId)return null;let t=this.sessions.get(e.leaseId);return t?e.platform&&e.platform!==t.platform?[]:[t.device]:null};constructor(e,t){if(!e.apiKey&&!e.instances?.ios&&!e.instances?.android)throw TypeError(`Limrun runtime requires an apiKey or instance access`);this.options=e,this.dependencies=t,this.limrun=e.apiKey?new l(u({apiKey:e.apiKey,clientVersion:t.clientVersion})):void 0}ownsDevice(e){return a(e.id)!==void 0}hasLiveSession(e){return this.getSessionForDevice(e)!==void 0}getInteractor(e,t){let n=this.getSessionForDevice(e);if(n)return n.platform===`ios`?_(n):b(n)}getDeviceSession(e){let t=this.getSessionForDevice(e);return t?x(t):void 0}async installApp(e,t,n,r,i,a){return await this.installInstallablePath(e,n,{...r,appIdentifierHint:r?.appIdentifierHint??t,packageNameHint:r?.packageNameHint??t},i,a)}async installInstallablePath(e,t,n,r,i){let a=this.getSessionForDevice(e);if(!a)return;let o=this.orgClient(`Uploading an app`);return a.platform===`ios`?await h(o,a,t,n,r,i):await g(o,a,t,n,r,i)}async configurePortReverse(e){let t=this.requireAndroidPortReverseSession(e.leaseId);if(t)return await v(t,e),D(e)}async shutdown(){let e=[...this.sessions.values()];await Promise.allSettled(e.map(async e=>await this.terminateSession(e))),this.sessions.clear(),this.appAliases.clear()}async allocate(e,t){if(e.leaseProvider!==this.provider)return;let n=s(e.backend);if(!n)return;let{rejectRefusedLimrunProfileFields:r}=await import(`./session-allocation.js`);r(t);let i=this.sessions.get(e.leaseId);if(i)return{limrunInstanceId:i.instanceId,device:i.device};let a=await this.attachSession(n,e)??await this.createSession(n,e,t);return this.sessions.set(e.leaseId,a),this.options.keepAlive&&this.startKeepAlive(e.leaseId,a),{limrunInstanceId:a.instanceId,device:a.device}}async attachSession(e,t){let{ios:n,android:i}=this.options.instances??{},a=n=>{let i=o(n);return{lease:t,instanceId:i,ownership:`attached`,device:r(e,t,i)}};return e===`android`?i&&await m({...a(i.apiUrl),...i},this.dependencies):n&&await y({...a(n.apiUrl),...n},this.dependencies)}async createSession(e,t,n){let{allocateLimrunAndroidSession:r,allocateLimrunIosSession:i,resolvePreinstalledAppId:a,resolveRequestedLimrunAppAsset:o}=await import(`./session-allocation.js`),s=this.orgClient(`Creating an instance`),c=await o(s,e,n),l=this.sessionAllocationParams(s,t,c),u=e===`ios`?await i(l):await r(l);if(c)try{let e=await a(u,c);this.appAliases.set(t.leaseId,{assetName:c.name,installedAppId:e})}catch(e){throw await this.terminateSession(u),e}return u}sessionAllocationParams(e,t,n){return{limrun:e,lease:t,metadata:this.buildInstanceMetadata(t),region:this.options.region,app:n,dependencies:this.dependencies}}buildInstanceMetadata(e){return{displayName:`agent-device-${e.tenantId}-${e.runId}`,labels:{tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId,provider:e.leaseProvider??`limrun`,source:f}}}async release(e){let t=this.sessions.get(e.leaseId);return t?(await this.terminateSession(t),this.sessions.delete(e.leaseId),this.appAliases.delete(e.leaseId),{limrunInstanceId:t.instanceId}):await this.releaseRecoveredSession(e)}async releaseRecoveredSession(e){let t=s(e.backend),n=this.limrun;if(!t||!n)return;let r=`provider=${i},leaseId=${e.leaseId}`,a=(t===`ios`?await n.iosInstances.list({labelSelector:r}):await n.androidInstances.list({labelSelector:r})).getPaginatedItems().map(e=>e.metadata.id);for(let e of a)t===`ios`?await n.iosInstances.delete(e):await n.androidInstances.delete(e);if(a.length!==0)return{limrunInstanceId:a[0],limrunInstanceCount:a.length}}startKeepAlive(e,t){let n=setInterval(()=>{try{t.client.keepAlive()}catch{}},3e4);n.unref(),this.keepAliveTimers.set(e,n)}async terminateSession(e){let t=e.lease.leaseId;if(clearInterval(this.keepAliveTimers.get(t)),this.keepAliveTimers.delete(t),e.client.disconnect(),e.platform===`android`&&await p(e),e.ownership===`attached`)return;let n=this.orgClient(`Deleting an instance`);e.platform===`ios`?await n.iosInstances.delete(e.instanceId):await n.androidInstances.delete(e.instanceId)}orgClient(e,t){return d(this.limrun,e,t)}getSessionForDevice(e){let t=a(e.id);if(!t)return;let n=this.sessions.get(t.leaseId);return n?.platform===t.platform?n:void 0}resolveAppReference(e,t){let n=a(e.id);if(!n)return t;let r=this.appAliases.get(n.leaseId);return r?.assetName===t?r.installedAppId:t}currentAppLogReader(e){let t=this.getSessionForDevice(e);if(!t)return;let n=x(t);return{platform:t.platform,leaseId:t.lease.leaseId,instanceId:t.instanceId,ownership:t.ownership,readLogs:async(e,t)=>n.platform===`ios`?await n.readLogs(e,t):await n.readLogs(t),[Symbol.asyncDispose]:async()=>void 0}}async reconnectAppLogReader(e,t){let{reconnectLimrunAppLogReader:n}=await import(`./app-log-reconnect.js`);return await n({limrun:this.limrun,instances:this.options.instances,descriptor:e,dependencies:this.dependencies,signal:t})}requireAndroidPortReverseSession(e){let t=this.sessions.get(e);if(!t||t.platform===`android`)return t;throw O(`port reverse`,`Direct Limrun iOS sessions cannot reach local host ports; use a bridge public URL.`)}};async function E(e,n,r){let{createLimrunPlatformRuntimeOwner:i}=await import(`./app-log-runtime2.js`);return i({host:r,runtimeInstance:n,ownsDevice:t=>e.ownsDevice(t),hasLiveSession:t=>e.hasLiveSession(t),getInteractor:(t,n)=>e.getInteractor(t,n),getDeviceSession:t=>e.getDeviceSession(t),resolveAppReference:(t,n)=>e.resolveAppReference(t,n),openCurrent:async t=>e.currentAppLogReader(t),reconnect:async(t,n)=>await e.reconnectAppLogReader(t,n),listApps:async(n,r,i)=>{i.throwIfAborted();let a=e.getDeviceSession(n);if(!a)throw new t(`DEVICE_NOT_FOUND`,`Limrun app inventory session is unavailable`,{deviceId:n.id});return(await a.listApps(r)).map(e=>({id:e.id,name:e.name??e.id}))},getAppState:async(n,r)=>{r.throwIfAborted();let i=e.getDeviceSession(n);if(i?.platform!==`android`)throw new t(`UNSUPPORTED_OPERATION`,`Limrun Android appstate requires an active provider session`);let a=await i.getForegroundApp(r);return r.throwIfAborted(),{package:a?.appId,activity:a?.activity}},deployApp:async(t,n,r,i)=>await e.installApp(t,n.app,n.appPath,{relaunch:n.replaceExisting,appIdentifierHint:n.app,packageNameHint:n.app},r,i),deployMaterializedApp:async(t,n,r,i)=>await e.installInstallablePath(t,n.artifact.installablePath,{appIdentifierHint:n.artifact.bundleId,packageNameHint:n.artifact.packageName},r,i),configurePortReverse:async t=>await e.configurePortReverse(t)})}function D(e){return{leaseId:e.leaseId,devicePort:e.devicePort,hostPort:e.hostPort,name:e.name}}function O(e,n){throw new t(`UNSUPPORTED_OPERATION`,n,{command:e})}async function k(e){let n=await M(e);if(n)return n;if(!e.apiKey)throw new t(`INVALID_ARGS`,`Limrun verification requires an API key or instance access.`);let r=new l({...u({apiKey:e.apiKey,clientVersion:e.clientVersion}),timeout:15e3,maxRetries:0}),i={limit:1,...e.region?{region:e.region}:{}};try{e.platform===`android`?await r.androidInstances.list(i):await r.iosInstances.list(i)}catch(e){let n=A(e);throw n===401||n===403?new t(`UNAUTHORIZED`,`Limrun rejected connection verification.`,{status:n,hint:`Check LIMRUN_API_KEY and its organization access.`}):new t(`COMMAND_FAILED`,`Limrun connection verification failed.`,{hint:`Check Limrun service access, LIMRUN_REGION, and network connectivity, then retry.`},e)}let a=e.platform===`android`?`Android`:`iOS`,o=e.platform===`android`?`emulator`:`simulator`;return{provider:`limrun`,service:`Limrun`,verificationMessage:`Credentials and ${a} instance access verified.`,device:{status:`deferred`,name:`Provider-selected ${a} ${o}`,platform:e.platform},app:{status:`missing`,message:`Run apps to choose an uploaded asset before allocation.`}}}function A(e){if(!e||typeof e!=`object`)return;let t=e.status;return typeof t==`number`?t:void 0}function j(e){let t={logLevel:`none`,maxReconnectAttempts:0},{ios:n,android:r}=e.instances??{};return e.platform===`android`?r&&import(`./instance-client.js`).then(e=>e.n).then(({createInstanceClient:e})=>e({...t,...r})):n&&import(`./ios-client.js`).then(e=>e.n).then(({createInstanceClient:e})=>e({...t,...n}))}async function M(e){let n=j(e);if(!n)return;let r=e.platform===`android`,i=r?`Android`:`iOS`;try{(await n).disconnect()}catch(e){throw new t(`COMMAND_FAILED`,`Limrun ${i} instance access failed.`,{hint:r?`Check LIM_ANDROID_INSTANCE_URL, LIM_ANDROID_INSTANCE_TOKEN, and LIM_ANDROID_INSTANCE_ADB_URL, and that the instance is still running.`:`Check LIM_IOS_INSTANCE_URL and LIM_IOS_INSTANCE_TOKEN, and that the instance is still running.`},e)}return{provider:`limrun`,service:`Limrun`,verificationMessage:`Existing ${i} instance access verified. A daemon started with these variables drives it without creating or deleting it.`,device:{status:`verified`,name:`Existing ${i} ${r?`emulator`:`simulator`}`,platform:e.platform},app:{status:`missing`,message:`Run open <bundle-or-package-id> to use an app installed on the instance.`}}}var N=e({LIMRUN_PROFILE_FIELDS:()=>c,LIMRUN_PROVIDER:()=>i,createLimrunRuntime:()=>w,verifyLimrunConnection:()=>k});export{k as n,w as r,N as t};
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{P as t,V as n}from"./sdk-contracts.js";import"./tv-remote.js";import{i as r}from"./sdk-batch-runner.js";import{Zt as i}from"./sdk-batch.js";import{n as a}from"./app-inventory.js";import{A as o,C as s,D as c,E as l,F as u,I as d,L as f,M as p,N as m,O as h,P as g,R as ee,S as te,T as ne,_,b as re,g as ie,j as ae,k as oe,m as se,v as ce,w as le,x as ue,y as de}from"./log-stream.js";import{i as fe,r as pe,t as me}from"./ios-client.js";import{t as he}from"./instance-client.js";import{createHash as ge,scryptSync as _e}from"node:crypto";import v from"node:fs";import ve from"node:os";import y from"node:path";import{promises as ye}from"fs";import"net";import be from"os";import b,{basename as xe}from"path";import Se,{createHash as Ce}from"crypto";import"child_process";import{setTimeout as we}from"node:timers/promises";const x=`limrun`,Te={provider:x,label:`Limrun`,fields:{providerApp:`consumed`,providerOsVersion:`refused`,providerDeviceType:`refused`,providerProject:`refused`,providerBuild:`refused`,providerSessionName:`refused`,providerDeviceOrientation:`refused`,providerGeoLocation:`refused`,providerTimezone:`refused`,providerAppiumVersion:`refused`,providerLanguage:`refused`,providerLocale:`refused`,providerNetworkProfile:`refused`,providerCustomNetwork:`refused`,providerNoResignApp:`refused`,awsProjectArn:`refused`,awsDeviceArn:`refused`,awsAppArn:`refused`,awsRegion:`refused`,awsInteractionMode:`refused`}},Ee=x;function De(e){if(e===`ios-instance`)return`ios`;if(e===`android-instance`)return`android`}function Oe(e,t,n){return{platform:e===`ios`?`apple`:`android`,...e===`ios`?{appleOs:`ios`}:{},id:Ae(e,t.leaseId),name:`Limrun ${e} ${n.slice(0,8)}`,kind:e===`ios`?`simulator`:`emulator`,target:`mobile`,booted:!0}}function ke(e){return`attached-${ge(`sha256`).update(e).digest(`hex`).slice(0,12)}`}function S(e){let[t,n,r]=e.split(`:`);if(t===Ee&&(n===`ios`||n===`android`)&&r)return{platform:n,leaseId:r}}function Ae(e,t){return`${Ee}:${e}:${t}`}function je(e){let t=S(e.id);return!t||e.target!==`mobile`?!1:t.platform===`ios`?Me(e):Ne(e)}function Me(e){return e.platform===`apple`&&e.appleOs===`ios`&&e.kind===`simulator`&&e.iosPhysicalDeviceBackend===void 0}function Ne(e){return e.platform===`android`&&e.appleOs===void 0&&e.kind===`emulator`&&e.iosPhysicalDeviceBackend===void 0}function C(e,t,n,r,i){if(r===`m`)throw TypeError(`Private method is not writable`);if(r===`a`&&!i)throw TypeError(`Private accessor was defined without a setter`);if(typeof t==`function`?e!==t||!i:!t.has(e))throw TypeError(`Cannot write private member to an object whose class did not declare it`);return r===`a`?i.call(e,n):i?i.value=n:t.set(e,n),n}function w(e,t,n,r){if(n===`a`&&!r)throw TypeError(`Private accessor was defined without a getter`);if(typeof t==`function`?e!==t||!r:!t.has(e))throw TypeError(`Cannot read private member from an object whose class did not declare it`);return n===`m`?r:n===`a`?r.call(e):r?r.value:t.get(e)}let Pe=function(){let{crypto:e}=globalThis;if(e?.randomUUID)return Pe=e.randomUUID.bind(e),e.randomUUID();let t=new Uint8Array(1),n=e?()=>e.getRandomValues(t)[0]:()=>Math.random()*255&255;return`10000000-1000-4000-8000-100000000000`.replace(/[018]/g,e=>(e^n()&15>>e/4).toString(16))};const Fe=/^[a-z][a-z0-9+.-]*:/i,Ie=e=>Fe.test(e);let T=e=>(T=Array.isArray,T(e)),Le=T;function Re(e){return typeof e==`object`?e??{}:{}}function ze(e){if(!e)return!0;for(let t in e)return!1;return!0}function Be(e,t){return Object.prototype.hasOwnProperty.call(e,t)}const Ve=(e,t)=>{if(typeof t!=`number`||!Number.isInteger(t))throw new p(`${e} must be an integer`);if(t<0)throw new p(`${e} must be a positive integer`);return t},He=e=>{try{return JSON.parse(e)}catch{return}},E=`0.60.0`;function Ue(){return typeof Deno<`u`&&Deno.build!=null?`deno`:typeof EdgeRuntime<`u`?`edge`:Object.prototype.toString.call(globalThis.process===void 0?0:globalThis.process)===`[object process]`?`node`:`unknown`}const We=()=>{let e=Ue();if(e===`deno`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":E,"X-Stainless-OS":qe(Deno.build.os),"X-Stainless-Arch":Ke(Deno.build.arch),"X-Stainless-Runtime":`deno`,"X-Stainless-Runtime-Version":typeof Deno.version==`string`?Deno.version:Deno.version?.deno??`unknown`};if(typeof EdgeRuntime<`u`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":E,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":`edge`,"X-Stainless-Runtime-Version":globalThis.process.version};if(e===`node`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":E,"X-Stainless-OS":qe(globalThis.process.platform??`unknown`),"X-Stainless-Arch":Ke(globalThis.process.arch??`unknown`),"X-Stainless-Runtime":`node`,"X-Stainless-Runtime-Version":globalThis.process.version??`unknown`};let t=Ge();return t?{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":E,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`unknown`,"X-Stainless-Runtime":`browser:${t.browser}`,"X-Stainless-Runtime-Version":t.version}:{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":E,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`unknown`,"X-Stainless-Runtime":`unknown`,"X-Stainless-Runtime-Version":`unknown`}};function Ge(){if(typeof navigator>`u`||!navigator)return null;for(let{key:e,pattern:t}of[{key:`edge`,pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`ie`,pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`ie`,pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`chrome`,pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`firefox`,pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`safari`,pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}]){let n=t.exec(navigator.userAgent);if(n)return{browser:e,version:`${n[1]||0}.${n[2]||0}.${n[3]||0}`}}return null}const Ke=e=>e===`x32`?`x32`:e===`x86_64`||e===`x64`?`x64`:e===`arm`?`arm`:e===`aarch64`||e===`arm64`?`arm64`:e?`other:${e}`:`unknown`,qe=e=>(e=e.toLowerCase(),e.includes(`ios`)?`iOS`:e===`android`?`Android`:e===`darwin`?`MacOS`:e===`win32`?`Windows`:e===`freebsd`?`FreeBSD`:e===`openbsd`?`OpenBSD`:e===`linux`?`Linux`:e?`Other:${e}`:`Unknown`);let Je;const Ye=()=>Je??=We();function Xe(){if(typeof fetch<`u`)return s.fetch;throw Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Limrun({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function Ze(...e){let t=globalThis.ReadableStream;if(t===void 0)throw Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new t(...e)}function Qe(e){let t=Symbol.asyncIterator in e?e[Symbol.asyncIterator]():e[Symbol.iterator]();return Ze({start(){},async pull(e){let{done:n,value:r}=await t.next();n?e.close():e.enqueue(r)},async cancel(){await t.return?.()}})}async function $e(e){if(typeof e!=`object`||!e)return;if(e[Symbol.asyncIterator]){await e[Symbol.asyncIterator]().return?.();return}let t=e.getReader(),n=t.cancel();t.releaseLock(),await n}const et=({headers:e,body:t})=>({bodyHeaders:{"content-type":`application/json`},body:JSON.stringify(t)});function tt(e){return Object.entries(e).filter(([e,t])=>t!==void 0).map(([e,t])=>{if(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)return`${encodeURIComponent(e)}=${encodeURIComponent(t)}`;if(t===null)return`${encodeURIComponent(e)}=`;throw new p(`Cannot stringify type ${typeof t}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join(`&`)}const D={off:0,error:200,warn:300,info:400,debug:500},nt=(e,t,n)=>{if(e){if(Be(D,e))return e;A(n).warn(`${t} was set to ${JSON.stringify(e)}, expected one of ${JSON.stringify(Object.keys(D))}`)}};function O(){}function k(e,t,n){return!t||D[e]>D[n]?O:t[e].bind(t)}const rt={error:O,warn:O,info:O,debug:O};let it=new WeakMap;function A(e){let t=e.logger,n=e.logLevel??`off`;if(!t)return rt;let r=it.get(t);if(r&&r[0]===n)return r[1];let i={error:k(`error`,t,n),warn:k(`warn`,t,n),info:k(`info`,t,n),debug:k(`debug`,t,n)};return it.set(t,[n,i]),i}const j=e=>(e.options&&(e.options={...e.options},delete e.options.headers),e.headers&&=Object.fromEntries((e.headers instanceof Headers?[...e.headers]:Object.entries(e.headers)).map(([e,t])=>[e,e.toLowerCase()===`authorization`||e.toLowerCase()===`api-key`||e.toLowerCase()===`x-api-key`||e.toLowerCase()===`cookie`||e.toLowerCase()===`set-cookie`?`***`:t])),`retryOfRequestLogID`in e&&(e.retryOfRequestLogID&&(e.retryOf=e.retryOfRequestLogID),delete e.retryOfRequestLogID),e);async function at(e,t){let{response:n,requestLogID:r,retryOfRequestLogID:i,startTime:a}=t,o=await(async()=>{if(n.status===204)return null;if(t.options.__binaryResponse)return n;let e=n.headers.get(`content-type`)?.split(`;`)[0]?.trim();return e?.includes(`application/json`)||e?.endsWith(`+json`)?n.headers.get(`content-length`)===`0`?void 0:await n.json():await n.text()})();return A(e).debug(`[${r}] response parsed`,j({retryOfRequestLogID:i,url:n.url,status:n.status,body:o,durationMs:Date.now()-a})),o}var M,ot=class e extends Promise{constructor(e,t,n=at){super(e=>{e(null)}),this.responsePromise=t,this.parseResponse=n,M.set(this,void 0),C(this,M,e,`f`)}_thenUnwrap(t){return new e(w(this,M,`f`),this.responsePromise,async(e,n)=>t(await this.parseResponse(e,n),n))}asResponse(){return this.responsePromise.then(e=>e.response)}async withResponse(){let[e,t]=await Promise.all([this.parse(),this.asResponse()]);return{data:e,response:t}}parse(){return this.parsedPromise||=this.responsePromise.then(e=>this.parseResponse(w(this,M,`f`),e)),this.parsedPromise}then(e,t){return this.parse().then(e,t)}catch(e){return this.parse().catch(e)}finally(e){return this.parse().finally(e)}};M=new WeakMap;var N,st=class{constructor(e,t,n,r){N.set(this,void 0),C(this,N,e,`f`),this.options=r,this.response=t,this.body=n}hasNextPage(){return this.getPaginatedItems().length?this.nextPageRequestOptions()!=null:!1}async getNextPage(){let e=this.nextPageRequestOptions();if(!e)throw new p("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await w(this,N,`f`).requestAPIList(this.constructor,e)}async*iterPages(){let e=this;for(yield e;e.hasNextPage();)e=await e.getNextPage(),yield e}async*[(N=new WeakMap,Symbol.asyncIterator)](){for await(let e of this.iterPages())for(let t of e.getPaginatedItems())yield t}},ct=class extends ot{constructor(e,t,n){super(e,t,async(e,t)=>new n(e,t.response,await at(e,t),t.options))}async*[Symbol.asyncIterator](){let e=await this;for await(let t of e)yield t}},P=class extends st{constructor(e,t,n,r){super(e,t,n,r),this.items=n||[]}getPaginatedItems(){return this.items??[]}nextPageRequestOptions(){let e=this.getPaginatedItems();if(!(typeof this.options.query==`object`&&`endingBefore`in(this.options.query||{}))){let t=e[e.length-1]?.metadata.id;return t?{...this.options,query:{...Re(this.options.query),startingAfter:t}}:null}let t=e[0]?.metadata.id;return t?{...this.options,query:{...Re(this.options.query),endingBefore:t}}:null}};const lt=()=>{if(typeof File>`u`){let{process:e}=globalThis,t=typeof e?.versions?.node==`string`&&parseInt(e.versions.node.split(`.`))<20;throw Error("`File` is not defined as a global, which is required for file uploads."+(t?" Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`.":``))}};function F(e,t,n){return lt(),new File(e,t??`unknown_file`,n)}function ut(e){return(typeof e==`object`&&!!e&&(`name`in e&&e.name&&String(e.name)||`url`in e&&e.url&&String(e.url)||`filename`in e&&e.filename&&String(e.filename)||`path`in e&&e.path&&String(e.path))||``).split(/[\\/]/).pop()||void 0}const dt=e=>typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`,ft=e=>typeof e==`object`&&!!e&&typeof e.size==`number`&&typeof e.type==`string`&&typeof e.text==`function`&&typeof e.slice==`function`&&typeof e.arrayBuffer==`function`,pt=e=>typeof e==`object`&&!!e&&typeof e.name==`string`&&typeof e.lastModified==`number`&&ft(e),mt=e=>typeof e==`object`&&!!e&&typeof e.url==`string`&&typeof e.blob==`function`;async function ht(e,t,n){if(lt(),e=await e,pt(e))return e instanceof File?e:F([await e.arrayBuffer()],e.name);if(mt(e)){let r=await e.blob();return t||=new URL(e.url).pathname.split(/[\\/]/).pop(),F(await I(r),t,n)}let r=await I(e);if(t||=ut(e),!n?.type){let e=r.find(e=>typeof e==`object`&&`type`in e&&e.type);typeof e==`string`&&(n={...n,type:e})}return F(r,t,n)}async function I(e){let t=[];if(typeof e==`string`||ArrayBuffer.isView(e)||e instanceof ArrayBuffer)t.push(e);else if(ft(e))t.push(e instanceof Blob?e:await e.arrayBuffer());else if(dt(e))for await(let n of e)t.push(...await I(n));else{let t=e?.constructor?.name;throw Error(`Unexpected data type: ${typeof e}${t?`; constructor: ${t}`:``}${gt(e)}`)}return t}function gt(e){return typeof e!=`object`||!e?``:`; props: [${Object.getOwnPropertyNames(e).map(e=>`"${e}"`).join(`, `)}]`}var L=class{constructor(e){this._client=e}},_t=class extends L{get(e,t){return this._client.get(`/v1/analytics`,{query:vt(e),...t})}getInstances(e,t){return this._client.get(`/v1/analytics/instances`,{query:vt(e),...t})}};function vt(e){let{startedAt:t,stoppedAt:n,...r}=e,i={...r};for(let[e,r]of Object.entries({startedAt:t,stoppedAt:n}))if(r!==void 0)for(let[t,n]of Object.entries(r))n!==void 0&&(i[`${e}[${t}]`]=n);return i}const yt=Symbol(`brand.privateNullableHeaders`);function*bt(e){if(!e)return;if(yt in e){let{values:t,nulls:n}=e;yield*t.entries();for(let e of n)yield[e,null];return}let t=!1,n;e instanceof Headers?n=e.entries():Le(e)?n=e:(t=!0,n=Object.entries(e??{}));for(let e of n){let n=e[0];if(typeof n!=`string`)throw TypeError(`expected header name to be a string`);let r=Le(e[1])?e[1]:[e[1]],i=!1;for(let e of r)e!==void 0&&(t&&!i&&(i=!0,yield[n,null]),yield[n,e])}}const R=e=>{let t=new Headers,n=new Set;for(let r of e){let e=new Set;for(let[i,a]of bt(r)){let r=i.toLowerCase();e.has(r)||(t.delete(i),e.add(r)),a===null?(t.delete(i),n.add(r)):(t.append(i,a),n.delete(r))}}return{[yt]:!0,values:t,nulls:n}};function xt(e){return e.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}const St=Object.freeze(Object.create(null)),z=((e=xt)=>function(t,...n){if(t.length===1)return t[0];let r=!1,i=[],a=t.reduce((t,a,o)=>{/[?#]/.test(a)&&(r=!0);let s=n[o],c=(r?encodeURIComponent:e)(``+s);return o!==n.length&&(s==null||typeof s==`object`&&s.toString===Object.getPrototypeOf(Object.getPrototypeOf(s.hasOwnProperty??St)??St)?.toString)&&(c=s+``,i.push({start:t.length+a.length,length:c.length,error:`Value of type ${Object.prototype.toString.call(s).slice(8,-1)} is not a valid path parameter`})),t+a+(o===n.length?``:c)},``),o=a.split(/[?#]/,1)[0],s=/(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi,c;for(;(c=s.exec(o))!==null;)i.push({start:c.index,length:c[0].length,error:`Value "${c[0]}" can\'t be safely passed as a path parameter`});if(i.sort((e,t)=>e.start-t.start),i.length>0){let e=0,t=i.reduce((t,n)=>{let r=` `.repeat(n.start-e),i=`^`.repeat(n.length);return e=n.start+n.length,t+r+i},``);throw new p(`Path parameters result in path with invalid segments:\n${i.map(e=>e.error).join(`
|
|
2
|
+
`)}\n${a}\n${t}`)}return a})(xt);var B=class extends L{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/gradle_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/gradle_instances`,P,{query:e,...t})}delete(e,t){return this._client.delete(z`/v1/gradle_instances/${e}`,{...t,headers:R([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(z`/v1/gradle_instances/${e}`,t)}},Ct=class extends L{create(e,t){return this._client.post(`/v1/scoped_tokens`,{body:e,...t})}},wt=class extends L{list(e={},t){return this._client.get(`/v1/assets`,{query:e,...t})}delete(e,t){return this._client.delete(z`/v1/assets/${e}`,{...t,headers:R([{Accept:`*/*`},t?.headers])})}get(e,t={},n){return this._client.get(z`/v1/assets/${e}`,{query:t,...n})}getOrCreate(e,t){return this._client.put(`/v1/assets`,{body:e,...t})}};function Tt(e,t){if(!t)return{body:e};let n=0;return{body:new ReadableStream({pull(r){if(n>=e.length){r.close();return}let i=e.subarray(n,Math.min(n+262144,e.length));n+=i.length,r.enqueue(i),t(n,e.length)}}),duplex:`half`}}var Et=class extends wt{async getOrUpload(e,t){let n=await this.getOrCreate({name:e.name??xe(e.path),kind:e.kind??`App`,...e.platform&&{platform:e.platform},...e.ttl&&{ttl:e.ttl},...e.uploadOptions},t),r=await ye.readFile(e.path),i=Ce(`md5`).update(r).digest(`hex`);if(n.md5&&n.md5===i)return{id:n.id,name:n.name,signedDownloadUrl:n.signedDownloadUrl,kind:n.kind,...n.platform&&{platform:n.platform},md5:n.md5,...n.expiresAt&&{expiresAt:n.expiresAt}};let a=await s.fetch(n.signedUploadUrl,{headers:{...e.onUploadProgress&&{"Content-Length":r.length.toString()},"Content-Type":`application/octet-stream`},method:`PUT`,...Tt(r,e.onUploadProgress)});if(a.status!==200)throw Error(`Failed to upload asset: ${a.status} ${await a.text()}`);return{id:n.id,name:n.name,signedDownloadUrl:n.signedDownloadUrl,kind:n.kind,...n.platform&&{platform:n.platform},md5:i,...n.expiresAt&&{expiresAt:n.expiresAt}}}},Dt=class extends L{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/ios_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/ios_instances`,P,{query:e,...t})}delete(e,t){return this._client.delete(z`/v1/ios_instances/${e}`,{...t,headers:R([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(z`/v1/ios_instances/${e}`,t)}},Ot=class extends Dt{listSessionArtifacts(e,t,n){return this._client.get(z`/v1/ios_instances/${e}/session_artifacts`,{query:t?{kind:t}:void 0,...n})}listRecordings(e,t){return this.listSessionArtifacts(e,`recording`,t)}listAppLogs(e,t){return this.listSessionArtifacts(e,`appLog`,t)}listEvents(e,t){return this.listSessionArtifacts(e,`eventLog`,t)}},kt=class extends L{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/android_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/android_instances`,P,{query:e,...t})}delete(e,t){return this._client.delete(z`/v1/android_instances/${e}`,{...t,headers:R([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(z`/v1/android_instances/${e}`,t)}},At=class extends kt{listSessionArtifacts(e,t,n){return this._client.get(z`/v1/android_instances/${e}/session_artifacts`,{query:t?{kind:t}:void 0,...n})}listRecordings(e,t){return this.listSessionArtifacts(e,`recording`,t)}listAppLogs(e,t){return this.listSessionArtifacts(e,`appLog`,t)}listEvents(e,t){return this.listSessionArtifacts(e,`eventLog`,t)}},jt=class extends L{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/xcode_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/xcode_instances`,P,{query:e,...t})}delete(e,t){return this._client.delete(z`/v1/xcode_instances/${e}`,{...t,headers:R([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(z`/v1/xcode_instances/${e}`,t)}};function Mt(e){let t=e.status.token;if(!t)throw Error(`Instance ${e.metadata.id} came back without its token: the credential used can read it but not control it.`);return t}var V=class extends Error{constructor(e){super(`Instance ${e} was gone before it reported any cache status`),this.instanceId=e,this.name=`XcodeCacheGoneError`}},H=class extends Error{constructor(e,t,n){super(`Timed out after ${Math.round(t/1e3)}s waiting for the cache ${e} to finish`+(n?` (last phase: ${n[e].phase})`:``)),this.side=e,this.timeoutMs=t,this.cache=n,this.name=`XcodeCacheTimeoutError`}};const Nt={restore:12e5,save:72e4};function Pt(e){return e===`disabled`||e===`unsupported`||e===`restored`||e===`skipped`||e===`failed`}function Ft(e){return e===`disabled`||e===`published`||e===`skipped`||e===`failed`||e===`timed_out`}function It(e,t){return t===`restore`?Pt(e.restore.phase):Ft(e.save.phase)}function Lt(e,t={}){let n=t.side??`restore`,r=t.timeoutMs??Nt[n],i=e.baseURL;for(;i.endsWith(`/`);)i=i.slice(0,-1);let a=`${i}/v1/xcode_instances/${encodeURIComponent(e.instanceId)}/cache`;return new Promise((i,o)=>{let c,l=``,u=!1,d=e=>{if(!u){u=!0,clearTimeout(f),t.signal?.removeEventListener(`abort`,p);try{g.close()}catch{}e()}},f=setTimeout(()=>d(()=>o(new H(n,r,c))),r),p=()=>d(()=>o(t.signal?.reason??Error(`aborted`))),m=!1,h=()=>{m||u||(m=!0,s.fetch(a,{headers:{Authorization:`Bearer ${e.apiKey}`,Accept:`application/json`}}).then(async t=>{if(m=!1,t.status!==404){await t.text().catch(()=>void 0);return}d(()=>c?i({cache:c,gone:!0}):o(new V(e.instanceId)))}).catch(()=>{m=!1}))},g=te({url:a,fetch:async(t,n)=>{let r=await s.fetch(t,n);return r.status===404&&d(()=>c?i({cache:c,gone:!0}):o(new V(e.instanceId))),r},onConnect:()=>t.onOpen?.(),headers:{Authorization:`Bearer ${e.apiKey}`,Accept:`text/event-stream`},onMessage:e=>{if(e.event!==`cache`&&e.event!==`gone`)return;let r;try{r=JSON.parse(typeof e.data==`string`?e.data:String(e.data))}catch(e){d(()=>o(Error(`Cache stream sent unreadable data: ${e}`)));return}if(c=r,e.event===`gone`){h();return}let a=`${r.restore.phase}/${r.restore.reason??``}|${r.save.phase}/${r.save.reason??``}`;a!==l&&(l=a,t.onUpdate?.(r)),It(r,n)&&d(()=>i({cache:r,gone:!1}))}});if(t.signal?.aborted){p();return}t.signal?.addEventListener(`abort`,p,{once:!0})})}var Rt=class extends V{constructor(e){super(e),this.name=`XcodeSnapshotGoneError`,this.message=`Instance ${e} was gone before it reported any disk snapshot status`}},zt=class extends H{constructor(e){super(e.side,e.timeoutMs,e.cache),this.name=`XcodeSnapshotTimeoutError`,this.message=e.message.replace(`the cache `,`the disk snapshot `),this.snapshot=e.cache?U(e.cache):void 0}};function U(e){let{cacheKey:t,...n}=e.save;return{...e,save:{...n,...t===void 0?{}:{snapshotKey:t}}}}async function Bt(e,t={}){let{onUpdate:n,...r}=t;try{let t=await Lt(e,{...r,...n?{onUpdate:e=>n(U(e))}:{}});return{snapshot:U(t.cache),gone:t.gone}}catch(e){throw e instanceof V?new Rt(e.instanceId):e instanceof H?new zt(e):e}}function Vt(e,t){let n=b.resolve(e),r=`limsync-cache-${b.basename(n)}-${Se.createHash(`sha1`).update(n).digest(`hex`).slice(0,8)}`;return{cacheKey:r,basisCacheDir:t??b.join(be.tmpdir(),r)}}function W(e,t,n,r){return e.getOrCreate({name:t,ttl:n||`336h`,...r}).catch(e=>{let n=`Failed to create upload URL for asset '${t}': ${e instanceof Error?e.message:e}`;throw Error(n,{cause:e})})}const Ht=[`none`,`error`,`warn`,`info`,`debug`];function Ut(e,t){let n=Ht.indexOf(t),r=e=>n>=Ht.indexOf(e);return(t,n)=>{r(t)&&(t===`error`||t===`warn`?console[t](e,n):console.log(e,n))}}function Wt(e){return(t,n)=>{if(t.trim()===``)throw Error(`commandLine must not be empty`);if(n?.timeoutSeconds!==void 0&&(!Number.isInteger(n.timeoutSeconds)||n.timeoutSeconds<1||n.timeoutSeconds>21600))throw Error(`timeoutSeconds must be an integer between 1 and 21600`);let r={command:`run`,commandLine:t,cwd:n?.cwd??`.`,...n?.env?.length&&{env:n.env},...n?.timeoutSeconds!==void 0&&{timeoutSeconds:n.timeoutSeconds}};return _(r,e)}}const Gt=/^[A-Z0-9_]+$/,Kt=4096,qt=65536;function Jt(e){let t=Object.entries(e);if(t.length>32)throw Error(`too many build settings: got ${t.length}, max 32`);let n=0;for(let[e,r]of t){if(!Gt.test(e))throw Error(`invalid build setting key "${e}": keys must match ^[A-Z0-9_]+$`);if(typeof r!=`string`)throw Error(`invalid build setting value for "${e}": value must be a string`);let t=Buffer.byteLength(r,`utf8`);if(t>Kt)throw Error(`build setting value for "${e}" is too large: got ${t} bytes, max ${Kt} bytes`);if(n+=Buffer.byteLength(e,`utf8`)+t,n>qt)throw Error(`build settings payload is too large: max ${qt} bytes`)}}const Yt=e=>new Promise(t=>setTimeout(t,e)),Xt=/failed: (?:502|503|504)\b|\bEOF\b|ECONNRESET|ECONNREFUSED|socket hang up|fetch failed/i;function Zt(e){let t=e instanceof Error?e.message:String(e);return Xt.test(t)}async function Qt(e,t={}){let n=t.sleep??Yt,r=t.attempts??5,i=t.retryOn??Zt,a;for(let o=1;o<=r;o++)try{return await e()}catch(e){if(!i(e))throw e;if(a=e,o<r){let r=e instanceof Error?e.message:String(e);t.log?.(`Retrying after error (${r.trim()})...`),await n(2e3*o)}}throw a}function $t(e){if(e===``||e.startsWith(`/`)||e.includes(`\\`)||e.includes(`\0`))throw Error(`invalid sandbox home path from server: ${e}`);let t=e.split(`/`);if(t.some(e=>e===``||e===`.`||e===`..`))throw Error(`invalid sandbox home path from server: ${e}`);return t.join(`/`)}async function en(e,t){let n=await K(await s.fetch(`${e}/info`,{method:`GET`,headers:{Authorization:`Bearer ${t}`}}),`GET /info`);if(!n.homeDir)throw Error(`GET /info response is missing homeDir`);return{homeDir:$t(n.homeDir),...n.xcode?{xcode:n.xcode}:{}}}function tn(e){let t=new URL(e);if(t.protocol===`https:`)t.protocol=`wss:`;else if(t.protocol===`http:`)t.protocol=`ws:`;else throw Error(`Unsupported apiUrl protocol for rbe tunnel: ${t.protocol}`);return t.pathname=`${t.pathname.replace(/\/+$/,``)}/rbe/tunnel`,t.search=``,t.hash=``,t.toString()}var nn=class extends p{constructor(e){super(`Remote build execution is not available on this Xcode instance (${e} returned 404). Its limbuild may predate RBE support, or you may be targeting the wrong environment (for example production instead of staging).`),this.name=`RbeUnsupportedError`}},rn=class extends p{constructor(e){super(`Xcode version selection is not available on this sandbox (${e} returned 404): its daemon predates Xcode selection. Create a new sandbox, or omit the Xcode version to build with its default.`),this.name=`XcodeSelectionUnsupportedError`}};function an(e,t){return on(e,t,e=>new rn(e))}function G(e,t){return on(e,t,e=>new nn(e))}async function on(e,t,n){if(e.status===404)throw await e.text().catch(()=>void 0),n(t);return K(e,t)}async function K(e,t){let n=await e.text();if(!e.ok)throw de(t,e.status,n,e.headers);if(!n.trim())throw Error(`${t} returned an empty response`);return JSON.parse(n)}var sn=class extends jt{listBuildLogs(e,t){return this._client.get(z`/v1/xcode_instances/${e}/build_logs`,t)}listBazelBuildLogs(e,t){return this._client.get(z`/v1/xcode_instances/${e}/bazel_build_logs`,t)}create(e,t){if(e.spec?.snapshot!==void 0){let{snapshot:n,cache:r,...i}=e.spec;if(r!==void 0)throw Error(`Use either spec.snapshot or the legacy spec.cache, not both.`);return super.create({...e,spec:{...i,cache:n}},t)}return super.create(e,t)}getSnapshot(e,t){return this.getCache(e,t)._thenUnwrap(U)}bindSnapshotKey(e,t,n){return this.bindCacheKey(e,t,n)._thenUnwrap(U)}followSnapshot(e,t){let n=this._client.apiKey;if(!n)throw Error(`Following disk snapshot status needs an API key on the client`);return Bt({baseURL:this._client.baseURL,apiKey:n,instanceId:e},t)}getCache(e,t){return this._client.get(z`/v1/xcode_instances/${e}/cache`,t)}bindCacheKey(e,t,n){return this._client.put(z`/v1/xcode_instances/${e}/cache`,{body:{key:t},...n})}followCache(e,t){let n=this._client.apiKey;if(!n)throw Error(`Following cache status needs an API key on the client`);return Lt({baseURL:this._client.baseURL,apiKey:n,instanceId:e},t)}async createClient(e){let t,n;if(`instance`in e){if(!e.instance.status.apiUrl)throw Error(`Instance not ready: apiUrl is not available`);t=e.instance.status.apiUrl,n=Mt(e.instance)}else t=e.apiUrl,n=e.token;let r=Ut(`[XcodeInstance]`,e.logLevel??`info`),i=this._client,a,o=()=>(a??=en(t,n),a),c=async e=>{let r,i;if(`status`in e){if(!e.status.apiUrl)throw Error(`Simulator instance not ready: apiUrl is not available`);r=e.status.apiUrl,i=Mt(e)}else r=e.apiUrl,i=e.token;return K(await s.fetch(`${t}/simulator`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify({apiUrl:r,token:i})}),`POST /simulator`)},l=async e=>{try{return await i.iosInstances.delete(e),!0}catch{return!1}};return{async sync(e,i){let{cacheKey:a,basisCacheDir:s}=Vt(e,i?.basisCacheDir),c=i?.additionalFiles&&i.additionalFiles.length>0?await o():void 0,l=i?.additionalFiles?.map(e=>({localPath:e.localPath,remotePath:c&&e.remotePath.startsWith(`~/`)?`${c.homeDir}/${e.remotePath.slice(2)}`:e.remotePath})),u={apiUrl:t,token:n,udid:a,install:i?.install??!0,ignoreFn:await pe(e,{basisCacheDir:s,log:r,xcodeDefaults:!0,...i?.include?{include:i.include}:{},...i?.ignore?{additional:i.ignore}:{}}),basisCacheDir:s,watch:i?.watch??!0,launchMode:`ForegroundIfRunning`,log:r,syncSymlinks:!0,...l?{additionalFiles:l}:{},...i?.onSyncComplete?{onSyncComplete:i.onSyncComplete}:{}},d=await ie(e,u),f={};return d.bytesSent!==void 0&&(f.bytesSent=d.bytesSent),d.stopWatching&&(f.stopWatching=d.stopWatching),f},xcodebuild(e,a){if(a?.reactNative?.devServerURL&&e?.configuration===`Release`)throw Error(`reactNative.devServerURL is only supported for Debug builds`);if(e?.onlyTesting?.length&&e?.skipTesting?.length)throw Error(`onlyTesting and skipTesting are mutually exclusive; pass one`);if((e?.onlyTesting?.length||e?.skipTesting?.length)&&e?.action!==`build-for-testing`)throw Error(`onlyTesting/skipTesting require action: 'build-for-testing'`);if(e?.runTests===!1&&e?.action!==`build-for-testing`)throw Error(`runTests: false requires action: 'build-for-testing'`);if(e?.action===`build-for-testing`&&e.sdk!==void 0&&e.sdk!==`iphonesimulator`)throw Error(`action: 'build-for-testing' requires the iphonesimulator sdk`);a?.buildSettings&&Jt(a.buildSettings);let o={command:`xcodebuild`,...e&&{xcodebuild:e},...a?.xcodegen&&{xcodegen:a.xcodegen},...a?.reactNative&&{reactNative:a.reactNative},...a?.signing&&{signing:a.signing},...a?.cloudSigning&&{cloudSigning:a.cloudSigning},...a?.appstore&&{testflight:a.appstore},...a?.buildSettings&&{buildSettings:a.buildSettings},...a?.env?.length&&{env:a.env},...a?.gitInit!==void 0&&{gitInit:a.gitInit},...a?.logProcessor&&{logProcessor:a.logProcessor},...a?.webhook&&{webhook:a.webhook}},s={apiUrl:t,token:n,log:r,...a?.onXctestEvent&&{onXctestEvent:a.onXctestEvent}};if(a?.upload&&`assetName`in a.upload){let e=W(i.assets,a.upload.assetName,a.upload.ttl,a.upload.uploadOptions).then(e=>(o.signedUploadUrl=e.signedUploadUrl,o.assetId=e.id,o.additionalMetadata={signedDownloadUrl:e.signedDownloadUrl},o));return _(e,s)}return a?.upload&&`signedUploadUrl`in a.upload&&(o.signedUploadUrl=a.upload.signedUploadUrl),_(o,s)},run:Wt({apiUrl:t,token:n,log:r}),observeBuildLogs(e,i){return ce(e,{apiUrl:t,token:n,log:r,...i})},async getSimulator(){return K(await s.fetch(`${t}/simulator`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /simulator`)},attachSimulator:c,attachNewSimulator:async()=>{let e=await i.iosInstances.create({wait:!0});try{await c(e)}catch(t){throw await l(e.metadata.id),t}return{iosInstanceId:e.metadata.id,simulator:e}},deleteSimulator:l,async getXcode(){return an(await s.fetch(`${t}/xcode`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /xcode`)},async setXcode(e){return an(await s.fetch(`${t}/xcode`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify({version:e})}),`POST /xcode`)},getInfo:()=>en(t,n),async startRbe(e){return G(await s.fetch(`${t}/rbe`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify(e??{})}),`POST /rbe`)},async getRbe(){return G(await s.fetch(`${t}/rbe`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /rbe`)},async stopRbe(){return G(await s.fetch(`${t}/rbe`,{method:`DELETE`,headers:{Authorization:`Bearer ${n}`}}),`DELETE /rbe`)},async startRbeTunnel(r){return se(tn(t),n,r?.host??`127.0.0.1`,r?.port??8980,{mode:`multiplexed`,logLevel:r?.logLevel??e.logLevel??`info`})},async uploadLatestRbeBuild(e){let r,a;if(e.assetName!==void 0){if(!e.assetName)throw Error(`assetName must not be empty`);let t=await W(i.assets,e.assetName,e.ttl);r=t.signedUploadUrl,a=t.signedDownloadUrl}else r=e.signedUploadUrl;return{...await Qt(async()=>{let e=await s.fetchLongRequest(`${t}/rbe/upload`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify({signedUploadUrl:r})});if(e.status===404)throw await e.text().catch(()=>void 0),Error(`POST /rbe/upload returned 404: the instance may no longer exist, or its limbuild predates RBE upload support. Recreate the instance and retry.`);return K(e,`POST /rbe/upload`)},{retryOn:e=>Zt(e)||re(e,400)&&/no successful RBE app build/i.test(e.body)}),...a&&{signedDownloadUrl:a}}},async getActiveRbeBuilds(){return G(await s.fetch(`${t}/rbe/builds/active`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /rbe/builds/active`)},async getRecentRbeBuilds(){return G(await s.fetch(`${t}/rbe/builds/recent`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /rbe/builds/recent`)},waitForRbeBuildEnd(e,r){return new Promise((i,a)=>{if(r?.signal?.aborted){a(Error(`waiting for build ${e} was aborted`));return}let o=!1,c=()=>{f.close(),r?.signal?.removeEventListener(`abort`,d)},l=e=>{o||(o=!0,c(),i(e))},u=e=>{o||(o=!0,c(),a(e))},d=()=>u(Error(`waiting for build ${e} was aborted`)),f=te({url:`${t}/exec/${e}/events`,fetch:ue(s.fetch,t=>u(Error(`build event stream for ${e} is unreachable: ${t instanceof Error?t.message:t}`))),headers:{Authorization:`Bearer ${n}`},onMessage:t=>{if(t.event!==`end`)return;let n;try{n=JSON.parse(t.data)}catch(t){u(Error(`invalid build end event for ${e}: ${t}`));return}l(n)},onDisconnect:()=>{u(Error(`build event stream for ${e} ended without a terminal event (the build may have finished and its live stream been removed)`))}});r?.signal?.addEventListener(`abort`,d,{once:!0})})}}}};function cn(e){let t=e.endsWith(`/`)?e.slice(0,-1):e,n=t.split(`/`);return n[n.length-1]===`local.properties`||n.length===1&&(t===`.gradle`||t===`.kotlin`||t===`build`)}var ln=class extends B{listBuildLogs(e,t){return this._client.get(z`/v1/gradle_instances/${e}/build_logs`,t)}async createClient(e){let t,n;if(`instance`in e){if(!e.instance.status.apiUrl)throw Error(`Instance not ready: apiUrl is not available`);t=e.instance.status.apiUrl,n=Mt(e.instance)}else t=e.apiUrl,n=e.token;let r=Ut(`[GradleInstance]`,e.logLevel??`info`),i=this._client;return{async sync(e,i){let{cacheKey:a,basisCacheDir:o}=Vt(e,i?.basisCacheDir),s=i?.ignore,c={apiUrl:t,token:n,udid:a,install:!1,ignoreFn:await pe(e,{basisCacheDir:o,log:r,xcodeDefaults:!1,nestedGitignore:!0,additional:s?e=>cn(e)||s(e):cn,...i?.include?{include:i.include}:{}}),basisCacheDir:o,watch:i?.watch??!1,launchMode:`ForegroundIfRunning`,log:r,syncSymlinks:!0,...i?.additionalFiles&&{additionalFiles:i.additionalFiles},...i?.onSyncComplete&&{onSyncComplete:i.onSyncComplete}},l=await ie(e,c),u={};return l.bytesSent!==void 0&&(u.bytesSent=l.bytesSent),l.stopWatching&&(u.stopWatching=l.stopWatching),u},run:Wt({apiUrl:t,token:n,log:r}),gradlebuild(e){let a={command:`gradlebuild`,...e?.env?.length&&{env:e.env},...e?.tasks?.length&&{tasks:e.tasks},...e?.projectPath&&{projectPath:e.projectPath},...e?.reactNative&&{reactNative:e.reactNative},...e?.signing&&{signing:e.signing},...e?.webhook&&{webhook:e.webhook},...e?.playstore&&{playstore:e.playstore}};if(e?.upload&&`assetName`in e.upload){let o=W(i.assets,e.upload.assetName,e.upload.ttl).then(e=>(a.signedUploadUrl=e.signedUploadUrl,a.additionalMetadata={signedDownloadUrl:e.signedDownloadUrl},a));return _(o,{apiUrl:t,token:n,log:r})}return e?.upload&&`signedUploadUrl`in e.upload&&(a.signedUploadUrl=e.upload.signedUploadUrl),_(a,{apiUrl:t,token:n,log:r})},observeBuildLogs(e,i){return ce(e,{apiUrl:t,token:n,log:r,...i})}}}};B.prototype.listBuildLogs=ln.prototype.listBuildLogs,B.prototype.createClient=ln.prototype.createClient;const q=e=>{if(globalThis.process!==void 0)return globalThis.process.env?.[e]?.trim()||void 0;if(globalThis.Deno!==void 0)return globalThis.Deno.env?.get?.(e)?.trim()||void 0};var J,Y,X,un,Z=class{constructor({baseURL:e=q(`LIMRUN_BASE_URL`),apiKey:t=q(`LIM_API_KEY`)??null,...n}={}){J.add(this),X.set(this,void 0),this.androidInstances=new At(this),this.assets=new Et(this),this.iosInstances=new Ot(this),this.xcodeInstances=new sn(this),this.gradleInstances=new B(this),this.analytics=new _t(this),this.scopedTokens=new Ct(this);let r={apiKey:t,...n,baseURL:e||`https://api.limrun.com`};this.baseURL=r.baseURL,this.timeout=r.timeout??Y.DEFAULT_TIMEOUT,this.logger=r.logger??console;let i=`warn`;this.logLevel=i,this.logLevel=nt(r.logLevel,`ClientOptions.logLevel`,this)??nt(q(`LIMRUN_LOG`),`process.env['LIMRUN_LOG']`,this)??i,this.fetchOptions=r.fetchOptions,this.maxRetries=r.maxRetries??2,this.fetch=r.fetch??Xe(),C(this,X,et,`f`);let a=q(`LIMRUN_CUSTOM_HEADERS`);if(a){let e={};for(let t of a.split(`
|
|
3
|
+
`)){let n=t.indexOf(`:`);n>=0&&(e[t.substring(0,n).trim()]=t.substring(n+1).trim())}r.defaultHeaders={...e,...r.defaultHeaders}}this._options=r,this.apiKey=t}withOptions(e){return new this.constructor({...this._options,baseURL:this.baseURL,maxRetries:this.maxRetries,timeout:this.timeout,logger:this.logger,logLevel:this.logLevel,fetch:this.fetch,fetchOptions:this.fetchOptions,apiKey:this.apiKey,...e})}defaultQuery(){return this._options.defaultQuery}validateHeaders({values:e,nulls:t}){if(!(this.apiKey&&e.get(`authorization`))&&!t.has(`authorization`))throw Error(`Could not resolve authentication method. Expected the apiKey to be set. Or for the "Authorization" headers to be explicitly omitted`)}async authHeaders(e){if(this.apiKey!=null)return R([{Authorization:`Bearer ${this.apiKey}`}])}stringifyQuery(e){return tt(e)}getUserAgent(){return`${this.constructor.name}/JS ${E}`}defaultIdempotencyKey(){return`stainless-node-retry-${Pe()}`}makeStatusError(e,t,n,r){return l.generate(e,t,n,r)}buildURL(e,t,n){let r=!w(this,J,`m`,un).call(this)&&n||this.baseURL,i=Ie(e)?new URL(e):new URL(r+(r.endsWith(`/`)&&e.startsWith(`/`)?e.slice(1):e)),a=this.defaultQuery(),o=Object.fromEntries(i.searchParams);return(!ze(a)||!ze(o))&&(t={...o,...a,...t}),typeof t==`object`&&t&&!Array.isArray(t)&&(i.search=this.stringifyQuery(t)),i.toString()}async prepareOptions(e){}async prepareRequest(e,{url:t,options:n}){}get(e,t){return this.methodRequest(`get`,e,t)}post(e,t){return this.methodRequest(`post`,e,t)}patch(e,t){return this.methodRequest(`patch`,e,t)}put(e,t){return this.methodRequest(`put`,e,t)}delete(e,t){return this.methodRequest(`delete`,e,t)}methodRequest(e,t,n){return this.request(Promise.resolve(n).then(n=>({method:e,path:t,...n})))}request(e,t=null){return new ot(this,this.makeRequest(e,t,void 0))}async makeRequest(e,t,n){let r=await e,i=r.maxRetries??this.maxRetries;t??=i,await this.prepareOptions(r);let{req:a,url:o,timeout:s}=await this.buildRequest(r,{retryCount:i-t});await this.prepareRequest(a,{url:o,options:r});let l=`log_`+(Math.random()*(1<<24)|0).toString(16).padStart(6,`0`),u=n===void 0?``:`, retryOf: ${n}`,d=Date.now();if(A(this).debug(`[${l}] sending request`,j({retryOfRequestLogID:n,method:r.method,url:o,options:r,headers:a.headers})),r.signal?.aborted)throw new c;let p=new AbortController,m=await this.fetchWithTimeout(o,a,s,p).catch(f),h=Date.now();if(m instanceof globalThis.Error){let e=`retrying, ${t} attempts remaining`;if(r.signal?.aborted)throw new c;let i=ee(m)||/timed? ?out/i.test(String(m)+(`cause`in m?String(m.cause):``));if(t)return A(this).info(`[${l}] connection ${i?`timed out`:`failed`} - ${e}`),A(this).debug(`[${l}] connection ${i?`timed out`:`failed`} (${e})`,j({retryOfRequestLogID:n,url:o,durationMs:h-d,message:m.message})),this.retryRequest(r,t,n??l);throw A(this).info(`[${l}] connection ${i?`timed out`:`failed`} - error; no more retries left`),A(this).debug(`[${l}] connection ${i?`timed out`:`failed`} (error; no more retries left)`,j({retryOfRequestLogID:n,url:o,durationMs:h-d,message:m.message})),i?new ne:new le({cause:m})}let g=`[${l}${u}] ${a.method} ${o} ${m.ok?`succeeded`:`failed`} with status ${m.status} in ${h-d}ms`;if(!m.ok){let e=await this.shouldRetry(m);if(t&&e){let e=`retrying, ${t} attempts remaining`;return await $e(m.body),A(this).info(`${g} - ${e}`),A(this).debug(`[${l}] response error (${e})`,j({retryOfRequestLogID:n,url:m.url,status:m.status,headers:m.headers,durationMs:h-d})),this.retryRequest(r,t,n??l,m.headers)}let i=e?`error; no more retries left`:`error; not retryable`;A(this).info(`${g} - ${i}`);let a=await m.text().catch(e=>f(e).message),o=He(a),s=o?void 0:a;throw A(this).debug(`[${l}] response error (${i})`,j({retryOfRequestLogID:n,url:m.url,status:m.status,headers:m.headers,message:s,durationMs:Date.now()-d})),this.makeStatusError(m.status,o,s,m.headers)}return A(this).info(g),A(this).debug(`[${l}] response start`,j({retryOfRequestLogID:n,url:m.url,status:m.status,headers:m.headers,durationMs:h-d})),{response:m,options:r,controller:p,requestLogID:l,retryOfRequestLogID:n,startTime:d}}getAPIList(e,t,n){return this.requestAPIList(t,n&&`then`in n?n.then(t=>({method:`get`,path:e,...t})):{method:`get`,path:e,...n})}requestAPIList(e,t){let n=this.makeRequest(t,null,void 0);return new ct(this,n,e)}async fetchWithTimeout(e,t,n,r){let{signal:i,method:a,...o}=t||{},s=this._makeAbort(r);i&&i.addEventListener(`abort`,s,{once:!0});let c=setTimeout(s,n),l=globalThis.ReadableStream&&o.body instanceof globalThis.ReadableStream||typeof o.body==`object`&&o.body!==null&&Symbol.asyncIterator in o.body,u={signal:r.signal,...l?{duplex:`half`}:{},method:`GET`,...o};a&&(u.method=a.toUpperCase());try{return await this.fetch.call(void 0,e,u)}finally{clearTimeout(c)}}async shouldRetry(e){let t=e.headers.get(`x-should-retry`);return t===`true`?!0:t===`false`?!1:e.status===408||e.status===409||e.status===429||e.status>=500}async retryRequest(e,t,n,r){let i,a=r?.get(`retry-after-ms`);if(a){let e=parseFloat(a);Number.isNaN(e)||(i=e)}let o=r?.get(`retry-after`);if(o&&!i){let e=parseFloat(o);i=Number.isNaN(e)?Date.parse(o)-Date.now():e*1e3}if(i===void 0){let n=e.maxRetries??this.maxRetries;i=this.calculateDefaultRetryTimeoutMillis(t,n)}return await fe(i),this.makeRequest(e,t-1,n)}calculateDefaultRetryTimeoutMillis(e,t){let n=t-e;return Math.min(.5*2**n,8)*(1-Math.random()*.25)*1e3}async buildRequest(e,{retryCount:t=0}={}){let n={...e},{method:r,path:i,query:a,defaultBaseURL:o}=n,s=this.buildURL(i,a,o);`timeout`in n&&Ve(`timeout`,n.timeout),n.timeout=n.timeout??this.timeout;let{bodyHeaders:c,body:l}=this.buildBody({options:n});return{req:{method:r,headers:await this.buildHeaders({options:e,method:r,bodyHeaders:c,retryCount:t}),...n.signal&&{signal:n.signal},...globalThis.ReadableStream&&l instanceof globalThis.ReadableStream&&{duplex:`half`},...l&&{body:l},...this.fetchOptions??{},...n.fetchOptions??{}},url:s,timeout:n.timeout}}async buildHeaders({options:e,method:t,bodyHeaders:n,retryCount:r}){let i={};this.idempotencyHeader&&t!==`get`&&(e.idempotencyKey||=this.defaultIdempotencyKey(),i[this.idempotencyHeader]=e.idempotencyKey);let a=R([i,{Accept:`application/json`,"User-Agent":this.getUserAgent(),"X-Stainless-Retry-Count":String(r),...e.timeout?{"X-Stainless-Timeout":String(Math.trunc(e.timeout/1e3))}:{},...Ye()},await this.authHeaders(e),this._options.defaultHeaders,n,e.headers]);return this.validateHeaders(a),a.values}_makeAbort(e){return()=>e.abort()}buildBody({options:e}){let{body:t,headers:n}=e;if(!t)return t==null&&`body`in e?w(this,X,`f`).call(this,{body:t,headers:R([n])}):{bodyHeaders:void 0,body:void 0};let r=R([n]);return ArrayBuffer.isView(t)||t instanceof ArrayBuffer||t instanceof DataView||typeof t==`string`&&r.values.has(`content-type`)||globalThis.Blob&&t instanceof globalThis.Blob||t instanceof FormData||t instanceof URLSearchParams||globalThis.ReadableStream&&t instanceof globalThis.ReadableStream?{bodyHeaders:void 0,body:t}:typeof t==`object`&&(Symbol.asyncIterator in t||Symbol.iterator in t&&`next`in t&&typeof t.next==`function`)?{bodyHeaders:void 0,body:Qe(t)}:typeof t==`object`&&r.values.get(`content-type`)===`application/x-www-form-urlencoded`?{bodyHeaders:{"content-type":`application/x-www-form-urlencoded`},body:this.stringifyQuery(t)}:w(this,X,`f`).call(this,{body:t,headers:r})}};Y=Z,X=new WeakMap,J=new WeakSet,un=function(){return this.baseURL!==`https://api.limrun.com`},Z.Limrun=Y,Z.DEFAULT_TIMEOUT=3e5,Z.LimrunError=p,Z.APIError=l,Z.APIConnectionError=le,Z.APIConnectionTimeoutError=ne,Z.APIUserAbortError=c,Z.NotFoundError=m,Z.ConflictError=o,Z.RateLimitError=u,Z.BadRequestError=oe,Z.AuthenticationError=h,Z.InternalServerError=ae,Z.PermissionDeniedError=g,Z.UnprocessableEntityError=d,Z.toFile=ht,Z.AndroidInstances=At,Z.Assets=Et,Z.IosInstances=Ot,Z.XcodeInstances=sn,Z.GradleInstances=B,Z.Analytics=_t,Z.ScopedTokens=Ct,process.platform;function dn(e){return e?.trim()||void 0}async function fn(e,t,n=`Limrun provider operation aborted`,r){if(!t)try{return await e}finally{r?.()}return await new Promise((i,a)=>{let o=()=>a(t.reason??Error(n));if(t.aborted){e.then(e=>{r?.(),i(e)},e=>{r?.(),a(e)}),o();return}t.addEventListener(`abort`,o,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,o),r?.(),i(e)},e=>{t.removeEventListener(`abort`,o),r?.(),a(e)})})}function pn(){let e=new Set;return{wait:async(t,n,r)=>{let i,a=new Promise(t=>{i=()=>{e.delete(a),t()}});return e.add(a),await fn(t,n,r,i)},[Symbol.asyncDispose]:async()=>{for(;e.size>0;)await Promise.all(e)}}}async function Q(e,t,n,r){return await(e?e.wait(t,n,r):fn(t,n,r))}async function mn(e,t){let n=await he({apiUrl:e.apiUrl,adbUrl:e.adbUrl,token:e.token,logLevel:`warn`}),r={platform:`android`,lease:e.lease,instanceId:e.instanceId,ownership:e.ownership,device:e.device,client:n,token:e.token,dependencies:t},i={exec:async(e,t)=>await bn(r,e,t),text:async e=>{let{createLimrunAndroidTextInjector:t}=await import(`./android-text-entry.js`);await t(n)(e)}};return i.reverse=await t.android.createPortReverse(i.exec,{noRebind:e.ownership===`attached`}),Object.assign(r,{adbProvider:i})}function hn(e){return e.dependencies.android.createInteractor(e.device,e.adbProvider)}async function gn(e,t,n,r,i,a){i?.throwIfAborted();let o=dn(r?.packageNameHint);r?.relaunch&&o&&await t.dependencies.android.forceStopApp(async(e,n)=>await bn(t,e,n),o,i);let s=await Q(a,e.assets.getOrUpload({path:n,name:En(o,n)},{signal:i}),i);await Q(a,t.client.sendAsset(s.signedDownloadUrl),i),i?.throwIfAborted();let c=o?await t.dependencies.android.inferAppName(o):void 0;return{...o?{packageName:o,launchTarget:o}:{},...c?{appName:c}:{}}}async function _n(e,t){await e.adbProvider.reverse?.ensure({local:Tn(t.devicePort),remote:Tn(t.hostPort),ownerId:t.name})}async function vn(e){await e.adbTunnelPromise?.catch(()=>{});let t=e.adbSerial;t&&(await yn(e),await e.dependencies.host.runAdb(e.dependencies.android.hostAdbInvocation([`disconnect`,t]),{allowFailure:!0,timeoutMs:1e4}).catch(()=>{})),e.adbTunnel?.close(),e.adbTunnel=void 0,e.adbSerial=void 0,e.adbTunnelPromise=void 0}async function yn(e){let t=e.adbProvider.reverse;if(!t?.list)return;let n=await t.list().catch(()=>[]),r=new Set,i=[],a=e.ownership===`attached`;for(let e of n)e.ownerId?r.add(e.ownerId):a||i.push(e.local);await Promise.allSettled([...[...r].map(async e=>await t.removeAllOwned(e)),...i.map(async e=>await t.remove(e))])}async function bn(e,t,n){let{invocation:r,result:i}=await xn(e,t,n);return await Sn(r,i,n?.allowFailure,e.dependencies)}async function xn(e,t,n){let r=await Cn(e),i=e.dependencies.android.deviceAdbInvocation(r,t);return{invocation:i,result:await e.dependencies.host.runAdb(i,{allowFailure:n?.allowFailure,binaryStdout:n?.binaryStdout,stdin:n?.stdin,timeoutMs:n?.timeoutMs??3e4,signal:n?.signal})}}async function Sn(e,t,n,r){if(t.exitCode!==0&&n!==!0)throw await r.android.adbError(`Limrun Android ADB command failed`,t,e);return t}async function Cn(e){if(e.adbSerial)return e.adbSerial;let t=e.adbTunnelPromise??wn(e);e.adbTunnelPromise=t;try{return await t}catch(n){throw e.adbTunnelPromise===t&&(e.adbTunnelPromise=void 0),n}}async function wn(e){let t=await e.client.startAdbTunnel(),n=`${t.address.address}:${t.address.port}`;return e.adbTunnel=t,e.adbSerial=n,n}function Tn(e){if(!Number.isInteger(e)||e<1||e>65535)throw new t(`INVALID_ARGS`,`Invalid Android tcp reverse port: ${e}`);return`tcp:${e}`}function En(e,t){let n=y.extname(t)||`.apk`;return`${e?.replaceAll(/[^a-zA-Z0-9_.-]+/g,`-`)||`android-app`}${n}`}function Dn(e){let t=Array.isArray(e)?e:[e],n=[],r=(e,t,i)=>{let a=n.length;n.push(On(e,{index:a,depth:t,parentIndex:i}));for(let n of Fn(e))r(n,t+1,a)};for(let e of t)r(e,0);return n}function On(e,t){return{index:t.index,type:kn(e),role:An(e),label:jn(e),value:Mn(e),identifier:Nn(e),rect:Pn(e),enabled:e.enabled,selected:e.selected,hittable:e.hittable,depth:t.depth,parentIndex:t.parentIndex}}function kn(e){return e.elementType??e.type}function An(e){return e.role??kn(e)}function jn(e){return e.label??e.AXLabel??void 0}function Mn(e){return e.value??e.AXValue??void 0}function Nn(e){return e.identifier??e.AXUniqueId??void 0}function Pn(e){let t=e.rect??e.frame;if(!(!t||typeof t.x!=`number`||typeof t.y!=`number`||typeof t.width!=`number`||typeof t.height!=`number`))return{x:t.x,y:t.y,width:t.width,height:t.height}}function Fn(e){return e.children??e.nodes??e.elements??[]}function In(e){return e.key===`id`?{AXUniqueId:e.value}:e.key===`value`?{AXValue:e.value}:{AXLabel:e.value}}async function Ln(e,t){let n=await me({apiUrl:e.apiUrl,token:e.token,logLevel:`warn`});return{platform:`ios`,lease:e.lease,instanceId:e.instanceId,ownership:e.ownership,device:e.device,client:n,token:e.token,dependencies:t}}async function Rn(e,t,n,r,i,a){i?.throwIfAborted();let o=await Hn(n,t.dependencies);try{i?.throwIfAborted();let n=await Q(a,e.assets.getOrUpload({path:o.uploadPath,name:o.assetName},{signal:i}),i),s=(await zn(t,n.signedDownloadUrl,{md5:n.md5,relaunch:r?.relaunch,appIdentifierHint:r?.appIdentifierHint},i,a)).appId;return{...s?{bundleId:s,launchTarget:s}:{},...o.appName?{appName:o.appName}:{}}}finally{await o.cleanup()}}async function zn(e,n,r,i,a){i?.throwIfAborted();let o=await Q(a,e.client.listApps(),i).catch(e=>{if(i?.aborted)throw e}),s=dn((await Q(a,e.client.installApp(n,{md5:r?.md5,launchMode:r?.relaunch?`RelaunchIfRunning`:`ForegroundIfRunning`}),i)).bundleId),c=dn(r?.appIdentifierHint),l=[];for(let t of Wn){t>0&&await we(t,void 0,{signal:i}),l=await Q(a,e.client.listApps(),i);let n=qn({resultBundleId:s,requestedBundleId:c,beforeInstallApps:o,afterInstallApps:l});if(n)return{appId:n}}throw new t(`COMMAND_FAILED`,`Limrun iOS app installation could not be verified.`,{resultBundleId:s,requestedBundleId:c,installedUserApps:l.filter(Yn).map(e=>e.bundleId).sort()})}function Bn(e){return new Vn(e)}var Vn=class{session;constructor(e){this.session=e}async open(e,t){if(t?.url){await this.launch(e,t.launchArgs),await this.session.client.openUrl(t.url);return}if(r(e)){await this.session.client.openUrl(e);return}await this.launch(e,t?.launchArgs)}async launch(e,n=[]){let r=await this.session.dependencies.ios.resolveAppAlias(e);if(n.length===0){await this.session.client.launchApp(r);return}let i=await this.session.client.simctl([`launch`,`--terminate-running-process`,`booted`,r,...n]).wait();if(i.code!==0)throw new t(`COMMAND_FAILED`,`Limrun iOS could not launch ${r} with arguments.`,{bundleId:r,exitCode:i.code,stderr:i.stderr.trim()})}async openDevice(){}async close(e){e&&await this.session.client.terminateApp(await this.session.dependencies.ios.resolveAppAlias(e)).catch(()=>{})}async tap(e,t){await this.session.client.tap(e,t)}async tapElementSelector(e){await this.session.client.tapElement(In(e))}async doubleTap(e,t){await this.session.client.performActions([{type:`tap`,x:e,y:t},{type:`wait`,durationMs:Kn},{type:`tap`,x:e,y:t}])}async longPress(e,t,n=Gn){await this.session.client.performActions([{type:`touchDown`,x:e,y:t},{type:`wait`,durationMs:n},{type:`touchUp`,x:e,y:t}])}async focus(e,t){await this.tap(e,t)}async type(e,t){await this.enterText(e,t)}async fill(e,t,n,r){let{awaitLimrunTextEntryFocus:i,readLimrunUnambiguousTapTargets:a,readLimrunTextEntryFocus:o}=await import(`./text-entry-focus.js`),s=a(await this.session.client.elementTree(),e,t);await this.tap(e,t);let c=await i({targetsAtPoint:s,readFocus:async()=>o(await this.session.client.elementTree()),sleep:e=>we(e),x:e,y:t});return await this.session.client.pressKey(`a`,[`command`]),n.length===0?(await this.session.client.pressKey(`delete`),{textEntryReadiness:c}):(await this.enterText(n,r),{textEntryReadiness:c})}async enterText(e,t){if(t&&t>0){let r=0;try{for(let n of Array.from(e))await this.session.client.typeText(n,!1,{requireFocus:!1}),r+=1,await we(t)}catch(e){throw n(e,r)}return}await this.session.client.typeText(e,!1,{requireFocus:!1})}async scroll(e,t){await this.session.client.scroll(e,t?.pixels??300)}async screenshot(e){let{transcodeScreenshotToPngAsync:t}=await import(`./png-worker-client.js`).then(e=>e.s),n=await this.session.client.screenshot(),r=await t(Buffer.from(n.base64,`base64`),`Limrun iOS screenshot`);v.mkdirSync(y.dirname(e),{recursive:!0}),await v.promises.writeFile(e,r)}async snapshot(){let{captureLimrunIosSnapshot:e}=await import(`./ios-snapshot-adapter.js`);return await e(this.session)}async back(){await this.session.client.pressKey(`escape`)}async home(){await this.session.client.performActions([{type:`buttonDown`,button:`home`},{type:`buttonUp`,button:`home`}])}async readClipboard(){return(await this.pasteboard([`pbpaste`,`booted`])).stdout.replaceAll(`\r
|
|
4
|
+
`,`
|
|
5
|
+
`).replace(/\n$/,``)}async writeClipboard(e){await this.pasteboard([`pbcopy`,`booted`],e)}async pasteboard(e,n){let r=await this.session.client.simctl(e,n===void 0?void 0:{stdin:n}).wait();if(r.code!==0)throw new t(`COMMAND_FAILED`,`Limrun iOS could not access the clipboard.`,{command:e[0],exitCode:r.code,stderr:r.stderr.trim()});return r}async setOrientation(e){if(e===`portrait-upside-down`)throw Xn(`orientation`,`Limrun iOS direct sessions support portrait and landscape orientation, not portrait upside-down.`);await this.session.client.setOrientation(e===`portrait`?`Portrait`:`Landscape`)}async setSetting(e,t,n,r){let{setLimrunIosSetting:i}=await import(`./ios-settings.js`);return await i(this.session,e,t,n,r)}};async function Hn(e,t){if(!(await v.promises.stat(e)).isDirectory())return{uploadPath:e,assetName:y.basename(e),appName:Un(e),cleanup:async()=>{}};let n=await v.promises.mkdtemp(y.join(ve.tmpdir(),`agent-device-limrun-ios-app-`)),r=y.join(n,`${y.basename(e)}.zip`);try{await t.host.archiveDirectory({sourceDirectory:y.dirname(e),entryName:y.basename(e),archivePath:r})}catch(e){throw await v.promises.rm(n,{recursive:!0,force:!0}),e}return{uploadPath:r,assetName:y.basename(r),appName:await t.ios.readBundleAppName(e)??Un(e),cleanup:async()=>{await v.promises.rm(n,{recursive:!0,force:!0})}}}function Un(e){return y.basename(e).replace(/\.(?:app|ipa|apk|aab|zip)$/i,``)||void 0}const Wn=[0,250],Gn=800,Kn=80;function qn(e){let t=new Set(e.afterInstallApps.map(e=>e.bundleId));return(e.resultBundleId&&t.has(e.resultBundleId)?e.resultBundleId:void 0)??(e.requestedBundleId&&t.has(e.requestedBundleId)?e.requestedBundleId:void 0)??Jn(e.beforeInstallApps,e.afterInstallApps)}function Jn(e,t){if(!e)return;let n=new Set(e.map(e=>e.bundleId)),r=t.filter(e=>Yn(e)&&!n.has(e.bundleId));return r.length===1?r[0]?.bundleId:void 0}function Yn(e){return!e.bundleId.startsWith(`com.apple.`)&&!e.installType.toLowerCase().includes(`system`)}function Xn(e,n){throw new t(`UNSUPPORTED_OPERATION`,n,{command:e})}function $(e){return e.platform===`android`?Zn(e):Qn(e)}function Zn(e){let t=e.adbProvider.exec;return{platform:`android`,device:e.device,interactor:hn(e),adb:e.adbProvider,listApps:async n=>await e.dependencies.android.listApps(t,a(n)),getForegroundApp:async n=>await e.dependencies.android.getForegroundApp(e.device,t,n),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},getKeyboardState:async()=>await e.dependencies.android.getKeyboardState(t),dismissKeyboard:async()=>await e.dependencies.android.dismissKeyboard(t),readLogs:async n=>await e.dependencies.android.readLogs(t,n),...$n(e.client,e.token,e.dependencies.host),installRemoteApp:async t=>{await e.client.sendAsset(t)}}}function Qn(e){return{platform:`ios`,device:e.device,interactor:Bn(e),viewport:{width:e.client.deviceInfo.screenWidth,height:e.client.deviceInfo.screenHeight},listApps:async t=>(await e.client.listApps()).filter(e=>a(t)===`all`||Yn(e)).map(e=>({id:e.bundleId,name:e.name,installType:e.installType})).sort((e,t)=>e.id.localeCompare(t.id)),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},readLogs:async(t,n)=>await e.client.appLogTail(t,n),...$n(e.client,e.token,e.dependencies.host),installRemoteApp:async(t,n)=>await zn(e,t,n),runSimctl:t=>e.client.simctl(t)}}function $n(e,t,n){return{startRecording:async t=>{await e.startRecording(t)},stopRecording:async()=>({downloadUrl:await e.stopRecording({})}),downloadRecording:async e=>{await n.downloadFile({url:e.downloadUrl,headers:{Authorization:`Bearer ${t}`},destinationPath:e.outPath,timeoutMs:6e4})}}}const er=`agent-device-cli`;function tr(e){return{apiKey:e.apiKey,defaultHeaders:{"x-agent-device-client":er,"x-agent-device-version":e.clientVersion}}}function nr(e,n,r=`This daemon drives an existing Limrun instance with its own token. Set LIMRUN_API_KEY, or ask the instance owner to do this.`){if(e)return e;throw new t(`UNSUPPORTED_OPERATION`,`${n} requires a Limrun API key.`,{hint:r})}function rr(e){if(e.runtimeInstance!==void 0){let t=e.runtimeInstance.trim();if(!t)throw TypeError(`Limrun runtimeInstance must be a non-empty string`);return t}let t=JSON.stringify({provider:`limrun`,region:e.region?.trim().toLowerCase()||`default`,apiKey:e.apiKey,attachedIos:e.instances?.ios?.apiUrl,attachedAndroid:e.instances?.android?.apiUrl});return`principal-${_e(t,`agent-device:limrun-runtime-owner:v1`,32,{N:16384,r:8,p:1,maxmem:67108864}).toString(`hex`)}`}function ir(e,t,n){let r=new ar(e,t);if(!n?.includePlatformModule)return r;let a=i(x,rr(e));if(a.kind!==`provider-runtime`)throw TypeError(`Invalid Limrun runtime owner`);return Object.freeze({runtime:r,platformModule:Object.freeze({owner:a,loadRuntime:async e=>await or(r,a.instance,e)})})}var ar=class{limrun;sessions=new Map;keepAliveTimers=new Map;appAliases=new Map;options;dependencies;provider=x;leaseLifecycle={allocate:async(e,t)=>await this.allocate(e,t),release:async e=>await this.release(e)};appCatalog=async(e,t)=>{let{assertLimrunUploadedAppAccess:n,listLimrunAppAssets:r}=await import(`./app-catalog.js`);return n(e.publicNetworkOnly),(await r(this.orgClient(`Listing uploaded apps`,`Run open <bundle-or-package-id> first; apps then lists the apps installed on the instance.`),e.platform,t)).map(e=>e.name)};recoverExpiredLease=async e=>{if(e.leaseProvider!==this.provider||!De(e.backend))throw new t(`UNSUPPORTED_OPERATION`,`Limrun cannot recover this expired lease.`,{leaseId:e.leaseId,leaseProvider:e.leaseProvider,leaseBackend:e.backend});await this.release(e)};deviceInventoryProvider=async e=>{if(e.leaseProvider!==this.provider||!e.leaseId)return null;let t=this.sessions.get(e.leaseId);return t?e.platform&&e.platform!==t.platform?[]:[t.device]:null};constructor(e,t){if(!e.apiKey&&!e.instances?.ios&&!e.instances?.android)throw TypeError(`Limrun runtime requires an apiKey or instance access`);this.options=e,this.dependencies=t,this.limrun=e.apiKey?new Z(tr({apiKey:e.apiKey,clientVersion:t.clientVersion})):void 0}ownsDevice(e){return S(e.id)!==void 0}hasLiveSession(e){return this.getSessionForDevice(e)!==void 0}getInteractor(e,t){let n=this.getSessionForDevice(e);if(n)return n.platform===`ios`?Bn(n):hn(n)}getDeviceSession(e){let t=this.getSessionForDevice(e);return t?$(t):void 0}async installApp(e,t,n,r,i,a){return await this.installInstallablePath(e,n,{...r,appIdentifierHint:r?.appIdentifierHint??t,packageNameHint:r?.packageNameHint??t},i,a)}async installInstallablePath(e,t,n,r,i){let a=this.getSessionForDevice(e);if(!a)return;let o=this.orgClient(`Uploading an app`);return a.platform===`ios`?await Rn(o,a,t,n,r,i):await gn(o,a,t,n,r,i)}async configurePortReverse(e){let t=this.requireAndroidPortReverseSession(e.leaseId);if(t)return await _n(t,e),sr(e)}async shutdown(){let e=[...this.sessions.values()];await Promise.allSettled(e.map(async e=>await this.terminateSession(e))),this.sessions.clear(),this.appAliases.clear()}async allocate(e,t){if(e.leaseProvider!==this.provider)return;let n=De(e.backend);if(!n)return;let{rejectRefusedLimrunProfileFields:r}=await import(`./session-allocation.js`);r(t);let i=this.sessions.get(e.leaseId);if(i)return{limrunInstanceId:i.instanceId,device:i.device};let a=await this.attachSession(n,e)??await this.createSession(n,e,t);return this.sessions.set(e.leaseId,a),this.options.keepAlive&&this.startKeepAlive(e.leaseId,a),{limrunInstanceId:a.instanceId,device:a.device}}async attachSession(e,t){let{ios:n,android:r}=this.options.instances??{},i=n=>{let r=ke(n);return{lease:t,instanceId:r,ownership:`attached`,device:Oe(e,t,r)}};return e===`android`?r&&await mn({...i(r.apiUrl),...r},this.dependencies):n&&await Ln({...i(n.apiUrl),...n},this.dependencies)}async createSession(e,t,n){let{allocateLimrunAndroidSession:r,allocateLimrunIosSession:i,resolvePreinstalledAppId:a,resolveRequestedLimrunAppAsset:o}=await import(`./session-allocation.js`),s=this.orgClient(`Creating an instance`),c=await o(s,e,n),l=this.sessionAllocationParams(s,t,c),u=e===`ios`?await i(l):await r(l);if(c)try{let e=await a(u,c);this.appAliases.set(t.leaseId,{assetName:c.name,installedAppId:e})}catch(e){throw await this.terminateSession(u),e}return u}sessionAllocationParams(e,t,n){return{limrun:e,lease:t,metadata:this.buildInstanceMetadata(t),region:this.options.region,app:n,dependencies:this.dependencies}}buildInstanceMetadata(e){return{displayName:`agent-device-${e.tenantId}-${e.runId}`,labels:{tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId,provider:e.leaseProvider??`limrun`,source:er}}}async release(e){let t=this.sessions.get(e.leaseId);return t?(await this.terminateSession(t),this.sessions.delete(e.leaseId),this.appAliases.delete(e.leaseId),{limrunInstanceId:t.instanceId}):await this.releaseRecoveredSession(e)}async releaseRecoveredSession(e){let t=De(e.backend),n=this.limrun;if(!t||!n)return;let r=`provider=${x},leaseId=${e.leaseId}`,i=(t===`ios`?await n.iosInstances.list({labelSelector:r}):await n.androidInstances.list({labelSelector:r})).getPaginatedItems().map(e=>e.metadata.id);for(let e of i)t===`ios`?await n.iosInstances.delete(e):await n.androidInstances.delete(e);if(i.length!==0)return{limrunInstanceId:i[0],limrunInstanceCount:i.length}}startKeepAlive(e,t){let n=setInterval(()=>{try{t.client.keepAlive()}catch{}},3e4);n.unref(),this.keepAliveTimers.set(e,n)}async terminateSession(e){let t=e.lease.leaseId;if(clearInterval(this.keepAliveTimers.get(t)),this.keepAliveTimers.delete(t),e.client.disconnect(),e.platform===`android`&&await vn(e),e.ownership===`attached`)return;let n=this.orgClient(`Deleting an instance`);e.platform===`ios`?await n.iosInstances.delete(e.instanceId):await n.androidInstances.delete(e.instanceId)}orgClient(e,t){return nr(this.limrun,e,t)}getSessionForDevice(e){let t=S(e.id);if(!t)return;let n=this.sessions.get(t.leaseId);return n?.platform===t.platform?n:void 0}resolveAppReference(e,t){let n=S(e.id);if(!n)return t;let r=this.appAliases.get(n.leaseId);return r?.assetName===t?r.installedAppId:t}currentAppLogReader(e){let t=this.getSessionForDevice(e);if(!t)return;let n=$(t);return{platform:t.platform,leaseId:t.lease.leaseId,instanceId:t.instanceId,ownership:t.ownership,readLogs:async(e,t)=>n.platform===`ios`?await n.readLogs(e,t):await n.readLogs(t),[Symbol.asyncDispose]:async()=>void 0}}async reconnectAppLogReader(e,t){let{reconnectLimrunAppLogReader:n}=await import(`./app-log-reconnect.js`);return await n({limrun:this.limrun,instances:this.options.instances,descriptor:e,dependencies:this.dependencies,signal:t})}requireAndroidPortReverseSession(e){let t=this.sessions.get(e);if(!t||t.platform===`android`)return t;throw cr(`port reverse`,`Direct Limrun iOS sessions cannot reach local host ports; use a bridge public URL.`)}};async function or(e,n,r){let{createLimrunPlatformRuntimeOwner:i}=await import(`./app-log-runtime2.js`);return i({host:r,runtimeInstance:n,ownsDevice:t=>e.ownsDevice(t),hasLiveSession:t=>e.hasLiveSession(t),getInteractor:(t,n)=>e.getInteractor(t,n),getDeviceSession:t=>e.getDeviceSession(t),resolveAppReference:(t,n)=>e.resolveAppReference(t,n),openCurrent:async t=>e.currentAppLogReader(t),reconnect:async(t,n)=>await e.reconnectAppLogReader(t,n),listApps:async(n,r,i)=>{i.throwIfAborted();let a=e.getDeviceSession(n);if(!a)throw new t(`DEVICE_NOT_FOUND`,`Limrun app inventory session is unavailable`,{deviceId:n.id});return(await a.listApps(r)).map(e=>({id:e.id,name:e.name??e.id}))},getAppState:async(n,r)=>{r.throwIfAborted();let i=e.getDeviceSession(n);if(i?.platform!==`android`)throw new t(`UNSUPPORTED_OPERATION`,`Limrun Android appstate requires an active provider session`);let a=await i.getForegroundApp(r);return r.throwIfAborted(),{package:a?.appId,activity:a?.activity}},deployApp:async(t,n,r,i)=>await e.installApp(t,n.app,n.appPath,{relaunch:n.replaceExisting,appIdentifierHint:n.app,packageNameHint:n.app},r,i),deployMaterializedApp:async(t,n,r,i)=>await e.installInstallablePath(t,n.artifact.installablePath,{appIdentifierHint:n.artifact.bundleId,packageNameHint:n.artifact.packageName},r,i),configurePortReverse:async t=>await e.configurePortReverse(t)})}function sr(e){return{leaseId:e.leaseId,devicePort:e.devicePort,hostPort:e.hostPort,name:e.name}}function cr(e,n){throw new t(`UNSUPPORTED_OPERATION`,n,{command:e})}async function lr(e){let n=await fr(e);if(n)return n;if(!e.apiKey)throw new t(`INVALID_ARGS`,`Limrun verification requires an API key or instance access.`);let r=new Z({...tr({apiKey:e.apiKey,clientVersion:e.clientVersion}),timeout:15e3,maxRetries:0}),i={limit:1,...e.region?{region:e.region}:{}};try{e.platform===`android`?await r.androidInstances.list(i):await r.iosInstances.list(i)}catch(e){let n=ur(e);throw n===401||n===403?new t(`UNAUTHORIZED`,`Limrun rejected connection verification.`,{status:n,hint:`Check LIMRUN_API_KEY and its organization access.`}):new t(`COMMAND_FAILED`,`Limrun connection verification failed.`,{hint:`Check Limrun service access, LIMRUN_REGION, and network connectivity, then retry.`},e)}let a=e.platform===`android`?`Android`:`iOS`,o=e.platform===`android`?`emulator`:`simulator`;return{provider:`limrun`,service:`Limrun`,verificationMessage:`Credentials and ${a} instance access verified.`,device:{status:`deferred`,name:`Provider-selected ${a} ${o}`,platform:e.platform},app:{status:`missing`,message:`Run apps to choose an uploaded asset before allocation.`}}}function ur(e){if(!e||typeof e!=`object`)return;let t=e.status;return typeof t==`number`?t:void 0}function dr(e){let t={logLevel:`none`,maxReconnectAttempts:0},{ios:n,android:r}=e.instances??{};return e.platform===`android`?r&&import(`./instance-client.js`).then(e=>e.n).then(({createInstanceClient:e})=>e({...t,...r})):n&&import(`./ios-client.js`).then(e=>e.n).then(({createInstanceClient:e})=>e({...t,...n}))}async function fr(e){let n=dr(e);if(!n)return;let r=e.platform===`android`,i=r?`Android`:`iOS`;try{(await n).disconnect()}catch(e){throw new t(`COMMAND_FAILED`,`Limrun ${i} instance access failed.`,{hint:r?`Check LIM_ANDROID_INSTANCE_URL, LIM_ANDROID_INSTANCE_TOKEN, and LIM_ANDROID_INSTANCE_ADB_URL, and that the instance is still running.`:`Check LIM_IOS_INSTANCE_URL and LIM_IOS_INSTANCE_TOKEN, and that the instance is still running.`},e)}return{provider:`limrun`,service:`Limrun`,verificationMessage:`Existing ${i} instance access verified. A daemon started with these variables drives it without creating or deleting it.`,device:{status:`verified`,name:`Existing ${i} ${r?`emulator`:`simulator`}`,platform:e.platform},app:{status:`missing`,message:`Run open <bundle-or-package-id> to use an app installed on the instance.`}}}var pr=e({LIMRUN_PROFILE_FIELDS:()=>Te,LIMRUN_PROVIDER:()=>x,createLimrunRuntime:()=>ir,verifyLimrunConnection:()=>lr});export{je as _,$ as a,Fn as c,fn as d,pn as f,Oe as g,ke as h,nr as i,Pn as l,x as m,lr as n,Ln as o,Te as p,ir as r,Dn as s,pr as t,mn as u,S as v};
|
package/dist/src/src2.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";var t=e({AGENT_BROWSER_TIMEOUT_MS:()=>AGENT_BROWSER_TIMEOUT_MS,cleanupManagedAgentBrowserOrphans:()=>u,createAgentBrowserWebProvider:()=>o,doctorManagedAgentBrowser:()=>l,getManagedAgentBrowserStatus:()=>s,hasScopedWebProvider:()=>p,inventoryModule:()=>a,resolveWebProvider:()=>f,runtimeModule:()=>i,setupManagedAgentBrowser:()=>c,webBrowserLifecycleCheck:()=>d,withWebProvider:()=>m});function n(e){return(async(...t)=>await(await e())(...t))}const r=Object.freeze({family:`web`}),i=Object.freeze({...r,loadRuntime:async e=>{let{createWebPlatformRuntime:t}=await import(`./runtime9.js`);return t(e)}}),a=Object.freeze({...r,loadInventory:async()=>{let{createWebInventory:e}=await import(`./inventory6.js`);return e()}}),o=n(async()=>(await import(`./agent-browser-provider.js`)).createAgentBrowserWebProvider),s=n(async()=>(await import(`./agent-browser-tool.js`).then(e=>e.t)).getManagedAgentBrowserStatus),c=n(async()=>(await import(`./agent-browser-tool.js`).then(e=>e.t)).setupManagedAgentBrowser),l=n(async()=>(await import(`./agent-browser-tool.js`).then(e=>e.t)).doctorManagedAgentBrowser),u=n(async()=>(await import(`./agent-browser-lifecycle.js`).then(e=>e.t)).cleanupManagedAgentBrowserOrphans),d=n(async()=>(await import(`./doctor3.js`)).webBrowserLifecycleCheck),f=n(async()=>(await import(`./provider.js`)).resolveWebProvider),p=n(async()=>(await import(`./provider.js`)).hasScopedWebProvider);async function m(e,t){let{withWebProvider:n}=await import(`./provider.js`);return await n(e,t)}export{t as i,f as n,i as r,a as t};
|