agent-device 0.21.0 → 0.21.1
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.0.apk → agent-device-android-ime-helper-0.21.1.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.1.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.0.manifest.json → agent-device-android-ime-helper-0.21.1.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.0.apk → agent-device-android-snapshot-helper-0.21.1.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.0.manifest.json → agent-device-android-snapshot-helper-0.21.1.manifest.json} +6 -6
- package/apple/snapshot-bridge/README.md +58 -1
- package/apple/snapshot-bridge/SnapshotBridge.m +6 -0
- package/apple/snapshot-bridge/SnapshotBridgeCapture.h +25 -0
- package/apple/snapshot-bridge/SnapshotBridgeCapture.m +138 -0
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.h +1 -0
- package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +32 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +12 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +20 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSelectorMatchPolicy.swift +15 -15
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSystemSurfaceHostPolicy.swift +72 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +63 -14
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +668 -82
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +14 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+BlockingSystemModalResolution.swift +39 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1065 -223
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +290 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +10 -10
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +249 -61
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +101 -42
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +13 -13
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +51 -43
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +71 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +144 -7
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +13 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +216 -17
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +206 -22
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +289 -42
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +92 -22
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +617 -122
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +79 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +71 -71
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +83 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +67 -67
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +4 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +17 -17
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +30 -30
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +31 -31
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +28 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +101 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +19 -19
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +55 -17
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +26 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +125 -75
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +9 -9
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +9 -9
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +4 -4
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +1 -1
- package/dist/src/adb-failure.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/ai-sdk.d.ts +1 -1
- package/dist/src/ai-sdk.js +1 -1
- package/dist/src/alert-runtime.js +1 -1
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/app-catalog.js +1 -1
- package/dist/src/app-deployment-resolution.js +1 -1
- package/dist/src/app-inventory-contract.js +1 -1
- package/dist/src/app-inventory.js +1 -1
- package/dist/src/app-launch.js +2 -2
- package/dist/src/app-lifecycle.js +3 -3
- package/dist/src/app-lifecycle2.js +1 -1
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-runtime2.js +3 -3
- package/dist/src/app-resolution.js +1 -1
- package/dist/src/apple-runner-platform.js +1 -0
- package/dist/src/application-lifecycle-interaction.js +1 -1
- package/dist/src/archive.js +1 -1
- package/dist/src/artifact-download.js +1 -1
- package/dist/src/auth-session.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/backend-snapshot-options.js +1 -1
- package/dist/src/boot-diagnostics.js +1 -1
- package/dist/src/capture.js +1 -1
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +25 -21
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +4 -4
- package/dist/src/click-button.js +1 -1
- package/dist/src/client-metro-companion.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +27 -13
- package/dist/src/code-signature-cache.js +1 -1
- package/dist/src/code-signature.js +1 -1
- package/dist/src/command-schema.js +3 -3
- package/dist/src/command-tools.js +2 -2
- package/dist/src/command.js +1 -1
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +3 -3
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon.js +1 -1
- package/dist/src/debug-symbols-facade.js +1 -1
- package/dist/src/device-claim-rule.js +1 -1
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/device-rotation.js +1 -1
- package/dist/src/device-selection-resolver.js +1 -1
- package/dist/src/device-session.js +1 -1
- package/dist/src/device2.js +1 -1
- package/dist/src/diagnostics.js +1 -1
- package/dist/src/dispatch-resolve.js +1 -1
- package/dist/src/doctor2.js +1 -1
- package/dist/src/error.js +1 -1
- package/dist/src/exec.js +1 -1
- package/dist/src/file.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/generic-settle.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-contract.js +1 -1
- package/dist/src/human-control.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-artifact-facade.js +1 -1
- package/dist/src/install-source-network-transport.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-positionals.js +1 -1
- package/dist/src/interaction-ref-policy.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor.js +5 -5
- package/dist/src/interactor2.js +1 -1
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +2 -2
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/internal/run-script-http-child.js +1 -1
- package/dist/src/inventory.js +2 -2
- package/dist/src/inventory2.js +1 -1
- package/dist/src/inventory3.js +1 -1
- package/dist/src/inventory5.js +1 -1
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/ios-system-surface.js +1 -0
- package/dist/src/lease-scope.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 +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/location-coordinates.js +1 -1
- package/dist/src/managed-device-scope.js +1 -1
- package/dist/src/mechanics.js +16 -16
- package/dist/src/multitouch-support.js +1 -1
- package/dist/src/observation.js +1 -1
- package/dist/src/open-target-resolution.js +1 -0
- package/dist/src/owner-identity.js +3 -3
- package/dist/src/parameterized-recorded-fill.js +1 -1
- package/dist/src/perf-facade.js +2 -2
- package/dist/src/perf-process-identity.js +1 -0
- package/dist/src/perf-runtime-operation-builder.js +1 -1
- package/dist/src/perf-runtime-plan.js +1 -1
- package/dist/src/perf.js +1 -1
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-runtime-android-adb-host.js +1 -1
- package/dist/src/platform-runtime-app-log-process.js +1 -1
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -1
- package/dist/src/platform-runtime-open-target.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +2 -2
- 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-simulator-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-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/png-worker-contract.js +1 -1
- package/dist/src/prepare-kind.js +1 -1
- package/dist/src/provider-device-runtime.js +1 -1
- package/dist/src/provider-session-ownership.js +1 -1
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/proxy.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/rect-center.js +1 -1
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/registry.js +37 -36
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/replay.js +2 -2
- package/dist/src/reporting.js +9 -8
- package/dist/src/request-admission.js +1 -1
- package/dist/src/request-cancel.js +1 -1
- package/dist/src/request-runtime-binding.js +1 -1
- package/dist/src/retry.js +1 -1
- package/dist/src/runner-cache-metadata.js +2 -2
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-operations-facade.js +1 -1
- package/dist/src/runner.js +1 -1
- package/dist/src/runtime-transport-hints.js +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime2.js +4 -4
- package/dist/src/runtime3.js +1 -1
- package/dist/src/runtime4.js +5 -4
- package/dist/src/runtime5.js +1 -1
- package/dist/src/runtime6.js +1 -1
- package/dist/src/runtime7.js +1 -1
- package/dist/src/runtime8.js +1 -1
- package/dist/src/runtime9.js +1 -1
- package/dist/src/screen-recording-live-handle.js +1 -1
- package/dist/src/screen-recording-options.js +1 -1
- package/dist/src/screen-recording-resource-recovery.js +1 -1
- package/dist/src/screenshot-density.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -1
- package/dist/src/screenshot.js +1 -1
- package/dist/src/screenshot3.js +3 -3
- package/dist/src/script.js +1 -1
- package/dist/src/scroll-command.js +1 -1
- package/dist/src/scroll-gesture.js +1 -1
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +2 -2
- package/dist/src/sdk-contracts.d.ts +44 -1
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-finders.d.ts +1 -1
- package/dist/src/sdk-io.js +1 -1
- package/dist/src/sdk-remote-config.d.ts +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +69 -13
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/server.js +3 -3
- package/dist/src/session-allocation.js +1 -1
- package/dist/src/session-observation.js +1 -0
- package/dist/src/session-routing.js +1 -1
- package/dist/src/session-runtime-admission.js +1 -1
- package/dist/src/session-snapshot.js +1 -1
- package/dist/src/session-store.js +3 -3
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session2.js +5 -5
- package/dist/src/settings.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-quality-backend-capabilities.js +1 -1
- package/dist/src/snapshot-quality-verdict.js +1 -1
- 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/snapshot2.js +1 -1
- package/dist/src/snapshot3.js +1 -1
- package/dist/src/snapshot4.js +1 -1
- package/dist/src/src.js +1 -1
- package/dist/src/src7.js +2 -2
- package/dist/src/src8.js +2 -2
- package/dist/src/string-enum.js +1 -1
- package/dist/src/takeover.js +1 -1
- package/dist/src/tool-provider.js +2 -2
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/tool-provider3.js +1 -1
- package/dist/src/toolchain-probe.js +1 -1
- package/dist/src/touch-reference-frame.js +1 -0
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/transport.js +1 -1
- package/dist/src/tv-remote.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/update-check.js +1 -1
- package/dist/src/verified-file.js +1 -1
- package/dist/src/video.js +1 -1
- package/dist/src/web.js +1 -1
- package/dist/src/web2.js +1 -1
- package/dist/src/webdriver-source.js +1 -1
- package/dist/src/window-state.js +1 -0
- package/package.json +3 -2
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.0.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.0.apk.sha256 +0 -1
- package/dist/src/back-mode.js +0 -1
- package/dist/src/format.js +0 -2
- package/dist/src/platform-runtime-apple-resources.js +0 -1
- package/dist/src/runner-selector-query.js +0 -1
package/dist/src/interactor.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{C as e}from"./sdk-contracts.js";import{h as t,l as n,u as r}from"./sdk-device.js";import{r as i}from"./snapshot-scope.js";import{c as a,u as o}from"./scroll-gesture.js";import{a as s,n as c}from"./alert-contract.js";import{a as l,c as u,n as d,s as f}from"./location-coordinates.js";import{n as ee,s as te,t as ne}from"./scroll-command.js";import"./device.js";import{t as re}from"./device-rotation.js";import{c as ie,r as p}from"./diagnostics.js";import{_ as ae}from"./owner-identity.js";import{a as m}from"./exec.js";import{t as oe}from"./timeouts.js";import{a as se}from"./tv-remote.js";import"./diagnostics2.js";import"./command.js";import{i as ce,n as le}from"./retry.js";import"./process.js";import{a as ue}from"./gesture-plan.js";import{n as de}from"./scoped-provider.js";import{n as fe,r as pe}from"./ios-snapshot-planning.js";import{r as me}from"./device-isolation.js";import{i as he,r as ge}from"./snapshot-quality-verdict.js";import{r as h}from"./ios-snapshot-acquisition.js";import{a as _e,t as ve}from"./ios-system-surface.js";import{i as ye,n as be}from"./screenshot-density.js";import{n as xe}from"./interactor-types.js";import{a as g,o as Se,t as Ce}from"./runner-presentation.js";import{C as we,g as Te,r as Ee}from"./host-file.js";import{a as De,c as Oe,d as ke,l as Ae,u as je}from"./config2.js";import{o as Me}from"./tool-provider.js";import{n as Ne,r as _,t as Pe}from"./physical-device-control.js";import{n as Fe}from"./simctl.js";import{n as v,r as Ie}from"./apps-simctl.js";import{n as y,r as b,s as Le}from"./runner.js";import{t as Re}from"./runner-cache-metadata.js";import{m as x,p as ze}from"./runner-client.js";import{n as Be,r as Ve,t as S}from"./app-launch.js";import{r as C,t as w}from"./simulator.js";import{a as He,d as Ue,f as We,g as Ge,h as T,m as Ke,p as qe}from"./app-resolution.js";import{a as Je,i as Ye,o as Xe}from"./helper.js";import{n as Ze}from"./multitouch-support.js";import{t as Qe}from"./surface-snapshot.js";import E from"node:path";async function $e(e){return r(e)?await Ue():(C(e,`clipboard`),await w(e),m(await v(e,[`pbpaste`,e.id],{allowFailure:!0}),`Failed to read iOS simulator clipboard`).stdout.replaceAll(`\r
|
|
2
2
|
`,`
|
|
3
|
-
`).replace(/\n$/,``))}async function
|
|
4
|
-
`).map(e=>e.trim()).filter(e=>e.length>0&&e!==`Current Status Bar Overrides:`&&!/^=+$/.test(e));for(let t of r){let r=/^DataNetworkType:\s+(\d+)$/.exec(t);if(r){let t=Number(r[1]),i
|
|
5
|
-
`)){let e=r.trim();if(!e)continue;if(e===`service`){n=!0;continue}if(!n)continue;if(e.startsWith(`bundle identifier`))break;let i=/^([a-z-]+)\s+-\s+/.exec(e)?.[1];i!==void 0&&t.add(i)}return t}function yt(t,n){let r=u(t);if(r!==`photos`&&n?.trim())throw new e(`INVALID_ARGS`,`Permission mode is only supported for photos. Received: ${n}.`);if(r===`camera`)return`camera`;if(r===`microphone`)return`microphone`;if(r===`contacts`)return`contacts`;if(r===`contacts-limited`)return`contacts-limited`;if(r===`notifications`)return`notifications`;if(r===`calendar`)return`calendar`;if(r===`location`)return`location`;if(r===`location-always`)return`location-always`;if(r===`media-library`)return`media-library`;if(r===`motion`)return`motion`;if(r===`reminders`)return`reminders`;if(r===`siri`)return`siri`;if(r===`photos`){let t=n?.trim().toLowerCase();if(!t||t===`full`)return`photos`;if(t===`limited`)return`photos-add`;throw new e(`INVALID_ARGS`,`Invalid photos mode: ${n}. Use full|limited.`)}throw new e(`INVALID_ARGS`,`Unsupported permission target: ${t}. Use camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri.`)}function bt(t,n){let r=t.trim().toLowerCase();if(r===`match`)return`match`;if(r===`nonmatch`)return`nonmatch`;if(r===`enroll`)return`enroll`;if(r===`unenroll`)return`unenroll`;throw new e(`INVALID_ARGS`,`Invalid ${n} state: ${t}. Use match|nonmatch|enroll|unenroll.`)}async function xt(t,n,r){let i=St(t.id,n,r.modalityAliases),a=[];for(let e of i){let n=je(t,e),r=await ke(n,{allowFailure:!0});if(r.exitCode===0)return;a.push({args:n,stderr:r.stderr,stdout:r.stdout,exitCode:r.exitCode})}let o=Ve(a);throw a.length>0&&a.every(e=>Ct(e.stdout,e.stderr))?new e(`UNSUPPORTED_OPERATION`,`${r.label} simulation is not supported on this simulator runtime.`,{deviceId:t.id,action:n,setting:r.settingName,attempts:o}):new e(`COMMAND_FAILED`,`Failed to simulate ${r.settingName}.`,{deviceId:t.id,action:n,setting:r.settingName,attempts:o})}function St(e,t,n){let r=n.length>0?n:[`face`];switch(t){case`match`:return r.flatMap(t=>[[`biometric`,e,`match`,t],[`biometric`,`match`,e,t]]);case`nonmatch`:return r.flatMap(t=>[[`biometric`,e,`nonmatch`,t],[`biometric`,e,`nomatch`,t],[`biometric`,`nonmatch`,e,t],[`biometric`,`nomatch`,e,t]]);case`enroll`:return[[`biometric`,e,`enroll`,`yes`],[`biometric`,e,`enroll`,`1`],[`biometric`,`enroll`,e,`yes`],[`biometric`,`enroll`,e,`1`]];case`unenroll`:return[[`biometric`,e,`enroll`,`no`],[`biometric`,e,`enroll`,`0`],[`biometric`,`enroll`,e,`no`],[`biometric`,`enroll`,e,`0`]]}}function Ct(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`unrecognized subcommand`)||n.includes(`unknown subcommand`)||n.includes(`not supported`)||n.includes(`unavailable`)||n.includes(`biometric`)&&n.includes(`invalid`)}function B(e,t,n){return b(e,t,n)}const wt={ensureBooted:E,prepareStatusBarForScreenshot:nt,captureWithRetry:Dt,normalizeDensity:It,captureWithRunner:U,shouldFallbackToRunner:Pt},V=new Map,H=new Map;async function Tt(e,t,n={}){if(r(e)){await U(e,t,n.appBundleId,n.fullscreen,n.runnerOptions);return}if(e.kind===`simulator`){await Et(e,t,n);return}await y(e).captureScreenshot(e,t,{appBundleId:n.appBundleId,fullscreen:n.fullscreen,runnerOptions:n.runnerOptions,runRunnerCommand:w})}async function Et(t,n,r={}){if(t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`Simulator screenshot fallback flow supports only iOS simulators`);let i={...wt,...r.deps??{}};r.skipIosSimulatorBootCheck||await i.ensureBooted(t);let a=async()=>{};if(r.normalizeStatusBar===!0)try{a=await i.prepareStatusBarForScreenshot(t)}catch(e){Mt(t,`prepare_failed`,e)}try{try{await i.captureWithRetry(t,n),await i.normalizeDensity(t,n,r.pixelDensity);return}catch(e){let a=e;if(r.skipIosSimulatorBootCheck&&Ft(e)){await i.ensureBooted(t);try{await i.captureWithRetry(t,n),await i.normalizeDensity(t,n,r.pixelDensity);return}catch(e){a=e}}if(!i.shouldFallbackToRunner(a))throw a;jt(t,`simctl_screenshot`,a)}await i.captureWithRunner(t,n,r.appBundleId,r.fullscreen,r.runnerOptions),await i.normalizeDensity(t,n,r.pixelDensity)}finally{await a().catch(e=>Mt(t,`restore_failed`,e))}}async function Dt(e,t){let n=h.fromTimeoutMs(Ee);await ce(async({deadline:n})=>{await B(e,[`io`,e.id,`screenshot`,t],{timeoutMs:Math.max(1e3,n?.remainingMs()??2e4)})},{maxAttempts:5,baseDelayMs:Te,maxDelayMs:De,jitter:.2,shouldRetry:e=>Pt(e)},{deadline:n,phase:`ios_simulator_screenshot`})}async function U(t,n,i,a,o){if(t.kind===`device`&&!r(t)){await y(t).captureScreenshot(t,n,{appBundleId:i,fullscreen:a,runnerOptions:o,preferRunner:!0,runRunnerCommand:w});return}let s=(await w(t,{command:`screenshot`,appBundleId:i,fullscreen:a,inlineScreenshot:!1},o)).message;if(!s)throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: runner returned no file path`);if(r(t)){await Ce(s,n);return}if(t.kind===`simulator`){await Ot(t,s,n);return}throw new e(`COMMAND_FAILED`,`Unsupported Apple screenshot target`)}async function Ot(t,n,r){let i=h.fromTimeoutMs(we),a=`Unable to locate runner container for simulator screenshot`,o=H.get(t.id);if(o){let e=await kt(o,n,r);if(e.copied)return;a=e.error,H.delete(t.id)}for(let e of Ne){let o=await B(t,[`get_app_container`,t.id,e,`data`],{allowFailure:!0,timeoutMs:At(i,we,`runner screenshot container lookup`)});if(o.exitCode!==0){let e=o.stderr.trim();e&&(a=e);continue}let s=o.stdout.trim();if(!s){a=`simctl get_app_container returned empty output`;continue}let c=await kt(s,n,r);if(c.copied){H.set(t.id,s);return}a=c.error}throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: ${a}`)}async function kt(e,t,n){let r=`Runner screenshot was not found in the simulator container`;for(let i of Nt(e,t))try{return await Ce(i,n),{copied:!0}}catch(e){r=e instanceof Error?e.message:String(e)}return{copied:!1,error:r}}function At(t,n,r){let i=t.remainingMs();if(i>0)return i;throw new e(`COMMAND_FAILED`,`iOS ${r} timed out after ${n}ms`,{timeoutMs:n,step:r})}function jt(e,t,n){let r=v(n);f({level:`warn`,phase:`ios_screenshot_fallback`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:t,to:`runner`,...r}})}function Mt(e,t,n){f({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...v(n)}})}function Nt(e,t){let n=O.resolve(e),r=t.trim();if(!r)return[];let i=[],a=new Set,o=e=>{let t=O.normalize(e);a.has(t)||(a.add(t),i.push(t))},s=r.replace(/^\/+/,``),c=s.replaceAll(`\\`,`/`);if(s&&o(O.join(n,s)),O.isAbsolute(r)&&o(O.normalize(r)),c.startsWith(`tmp/`))o(O.join(n,c));else{let e=c.lastIndexOf(`/tmp/`);if(e>=0){let t=c.slice(e+1);o(O.join(n,t))}}let l=O.basename(r);return l&&o(O.join(n,`tmp`,l)),i}function Pt(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Ae(t);return n.includes(`timeout waiting for screen surfaces`)||n.includes(`nsposixerrordomain`)&&n.includes(`code=60`)&&n.includes(`screenshot`)||n.includes(`timed out`)&&n.includes(`screenshot`)}function Ft(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Ae(t);return n.includes(`not booted`)||n.includes(`current state: shutdown`)||n.includes(`current state is shutdown`)||n.includes(`current state=shutdown`)||n.includes(`state: shutdown`)||n.includes(`state=shutdown`)}async function It(e,t,n){let r=await Lt(e),i=_e(await ge(t),r,n);i&&await pe(t,i.width,i.height)}async function Lt(t){let n=V.get(t.id);if(n!==void 0)return n;let r=await B(t,[`getenv`,t.id,`SIMULATOR_MAINSCREEN_SCALE`],{timeoutMs:Oe}),i=Number(r.stdout.trim());if(!Number.isFinite(i)||i<=0)throw new e(`COMMAND_FAILED`,`Failed to read iOS simulator screenshot scale from SIMULATOR_MAINSCREEN_SCALE`);return V.set(t.id,i),i}function Rt(e){let t=e?.amount!==void 0||e?.pixels!==void 0;return{...e,...t?{}:{amount:re},durationMs:e?.durationMs??400,releaseBehavior:e?.releaseBehavior??`controlled`}}function zt(e,t,n,r={includeDuration:!0}){let i=W(e.referenceWidth),o=W(e.referenceHeight);if(i===void 0||o===void 0)return G(e,{amount:n?.amount});let s=a({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:o});return G(e,{amount:n?.amount,pixels:s.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function Bt(e,t={}){return{...e?.amount===void 0?{}:{amount:e.amount},...e?.pixels===void 0?{}:{pixels:e.pixels},...t.includeDuration!==!1&&e?.durationMs!==void 0?{durationMs:e.durationMs}:{},...t.includeReleaseBehavior!==!1&&e?.releaseBehavior!==void 0?{scrollReleaseBehavior:e.releaseBehavior}:{}}}function W(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function G(e,t){let{x1:n,y1:r,x2:i,y2:a}=Ht(e),o=W(e.referenceWidth),s=W(e.referenceHeight),c=Vt(t,n!==void 0&&i!==void 0?Math.round(Math.abs(i-n)):void 0,r!==void 0&&a!==void 0?Math.round(Math.abs(a-r)):void 0);return{...n===void 0?{}:{x1:n},...r===void 0?{}:{y1:r},...i===void 0?{}:{x2:i},...a===void 0?{}:{y2:a},...o===void 0?{}:{referenceWidth:o},...s===void 0?{}:{referenceHeight:s},...t?.amount===void 0?{}:{amount:t.amount},...c===void 0?{}:{pixels:c},...t?.durationMs===void 0?{}:{durationMs:t.durationMs}}}function Vt(e,t,n){if(e?.preferProvidedPixels&&e.pixels!==void 0)return e.pixels;if(t!==void 0&&t>0)return t;if(n!==void 0&&n>0)return n}function Ht(e){let t=W(e.x),n=W(e.y),r=W(e.x2),i=W(e.y2);return{...t===void 0?{}:{x1:t},...n===void 0?{}:{y1:n},...r===void 0?{}:{x2:r},...i===void 0?{}:{y2:i}}}async function Ut(e,t,n,r,i,a){return zt(await e(t,{command:`desktopScroll`,direction:i,...Bt(a,{includeDuration:!0,includeReleaseBehavior:!1}),appBundleId:n.appBundleId},r),i,a,{includeDuration:!0})}function K(e,t,n){return{command:`remotePress`,remoteButton:e,...n===void 0?{}:{durationMs:n},...t===void 0?{}:{appBundleId:t}}}function Wt(e){return e===`system`?`backSystem`:`backInApp`}function Gt(e,t){let n={signal:t.signal,verbose:t.verbose,logPath:t.logPath,traceLogPath:t.traceLogPath,requestId:t.requestId,iosXctestrunFile:t.iosXctestrunFile,iosXctestDerivedDataPath:t.iosXctestDerivedDataPath,iosXctestEnvDir:t.iosXctestEnvDir,runnerLeaseContext:t.runnerLeaseContext};return{runnerOpts:n,overrides:{tap:async(r,i)=>await w(e,J(e,t,r,i),n),pressPoint:async(r,i)=>await Kt(e,t,n,r,i),tapElementSelector:async r=>await w(e,{command:`tap`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,...r.expectedPoint?{x:r.expectedPoint.x,y:r.expectedPoint.y}:{},...tn(e)?{synthesized:!0}:{},appBundleId:t.appBundleId},n),doubleTap:async(r,i)=>{let a=await w(e,S([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return C(a),a},longPress:async(r,i,a)=>await w(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await w(e,J(e,t,r,i),n),type:async(r,i)=>Xt(await w(e,{command:`type`,text:r,delayMs:i,textEntryMode:r===`
|
|
6
|
-
`?void 0:`append`,appBundleId:t.appBundleId},n)),fill:async(r,i,a,o,s)=>await w(e,{command:`type`,x:r,y:i,text:a,delayMs:o,textEntryMode:`replace`,...s?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},appBundleId:t.appBundleId},n),scroll:async(r,i)=>await nn(w,e,t,n,r,i),performGesture:async r=>await $t(e,t,n,r),gestureViewport:async()=>Qt(await w(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}async function Kt(e,t,n,i,a){return r(e)&&a.surface&&a.surface!==`app`?await qt(t,i,a):a.button===`primary`?a.count===1?await Yt(e,t,n,i,a):await Pe(e,i,a,t.appBundleId,async t=>await w(e,t,n)):await Jt(e,t,n,i,a.button)}async function qt(t,n,r){if(r.button!==`primary`)throw new e(`UNSUPPORTED_OPERATION`,`${r.button} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await import(`./helper.js`).then(e=>e.t);return await i(n.x,n.y,{bundleId:t.appBundleId,surface:r.surface}),{}}async function Jt(e,t,n,r,i){return await w(e,{command:`mouseClick`,x:r.x,y:r.y,button:i,appBundleId:t.appBundleId},n)}async function Yt(e,t,n,r,i){if(i.doubleTap){let i=await w(e,S([{kind:`doubleTap`,x:r.x,y:r.y}],t.appBundleId),n);return C(i),i}return i.holdMs>0?await w(e,{command:`longPress`,x:r.x,y:r.y,durationMs:i.holdMs,appBundleId:t.appBundleId},n):await w(e,J(e,t,r.x,r.y),n)}function Xt(e){let t=e.textEntryRoute;return Zt(t)?{textEntryRoute:t}:{}}function Zt(e){return typeof e==`string`&&ve.includes(e)}function Qt(t){let n=q(t.x),r=q(t.y),i=q(t.x2),a=q(t.y2);if(n===void 0||r===void 0||i===void 0||a===void 0||i<=0||a<=0)throw new e(`COMMAND_FAILED`,`Apple runner returned an invalid gesture viewport`);return{x:n,y:r,width:i,height:a}}function q(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}async function $t(e,n,i,a){if(a.topology===`two`&&qe(e,a.intent),a.topology===`single`&&r(e)){let{start:t,end:r}=g(a);return await w(e,{command:`drag`,x:t.x,y:t.y,x2:r.x,y2:r.y,durationMs:a.durationMs,appBundleId:n.appBundleId},i)}if(a.topology===`single`&&t(e)){let{start:t,end:r}=g(a);return await w(e,{command:`swipe`,direction:en(t,r),appBundleId:n.appBundleId},i)}return await w(e,{command:`gesture`,gesturePlan:a,appBundleId:n.appBundleId},i)}function en(e,t){let n=t.x-e.x,r=t.y-e.y;return Math.abs(n)>=Math.abs(r)?n>=0?`right`:`left`:r>=0?`down`:`up`}function J(e,t,n,r){return{command:`tap`,x:n,y:r,...tn(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}function tn(e){return n(e)&&!t(e)}async function nn(e,n,i,a,s,c){if(te(c?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${ne}`}),t(n))return G(await e(n,K(s,i.appBundleId,c?.durationMs),a),{amount:c?.amount,durationMs:c?.durationMs});if(o(c??{}),r(n))return await Ut(e,n,i,a,s,c);let l=Rt(c);return zt(await e(n,{command:`scroll`,direction:s,...Bt(l),appBundleId:i.appBundleId},a),s,l)}function Y(e,t,n){if(r(e)){let e=n?.surface===`frontmost-app`?{surface:n.surface}:{bundleId:n?.appBundleId,surface:n?.surface};return async t=>await Ge(t,e)}return async(r,i)=>await w(e,{command:`alert`,action:r,appBundleId:n?.appBundleId,timeoutMs:i},t)}async function rn(e,t,n){return await Y(e,t,n)(`get`,s)}async function an(t,n,r){let i=Y(t,n,r),a=r?.timeoutMs??1e4,o=Date.now(),s=!0;for(;Date.now()-o<a;){try{let e=s?a:sn(o,a);return s=!1,await i(`get`,e)}catch(e){if(!X(e))throw e}await m(300)}throw new e(`COMMAND_FAILED`,`alert wait timed out`)}async function on(e,t,r,i){let a=Y(e,t,i),o=n(e)?s:c,l=Date.now(),u,d=!0;for(;Date.now()-l<c;){try{let e=d?o:sn(l,c);return d=!1,await a(r,e)}catch(e){if(u=e,!X(e))break}await m(300)}throw cn(u)}function sn(e,t){return Math.max(1,t-(Date.now()-e))}function cn(t){return!(t instanceof e)||!X(t)?t:new e(t.code,t.message,{...t.details??{},hint:`If the permission sheet is visible in snapshot or screenshot but alert reports no alert, take a scoped snapshot around the visible button label and use press @ref.`})}function X(t){if(!(t instanceof e))return!1;let n=t.details??{};return n.runnerErrorCode===`ALERT_NOT_FOUND`||n.reason===`alert-not-found`}function ln(e){return{nodes:Array.isArray(e.nodes)?e.nodes:void 0,truncated:typeof e.truncated==`boolean`?e.truncated:void 0,quality:me(e.snapshotQuality),qualityPayload:dn(e.qualityPayload),runnerFatal:e.runnerFatal===!0,message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}function un(e,t,n){let r=n.nodes??[];if(n.runnerFatal===!0||r.length===0&&n.qualityPayload===void 0)return r;let i=de({raw:t?.raw,interactiveOnly:t?.interactiveOnly,depth:t?.depth,scope:t?.scope,customActions:t?.customActions}),a=fn(r,n.qualityPayload?.nodes),o={stage:`presented`,presentation:{producer:`apple-runner`,intent:`full`,payload:{nodes:r,truncated:n.truncated??!1,...n.quality?.effectiveDepth===void 0?{}:{effectiveDepth:n.quality.effectiveDepth}},...n.qualityPayload?{qualityPayload:n.qualityPayload}:{}},validation:{presentationKey:ue(i),viewport:a,hittability:{kind:`available`},lineage:{targetId:e},residue:[]}};try{return be(o,i).nodes}catch(e){Z(e)}}function dn(e){if(e!==void 0)return(!mn(e)||!Array.isArray(e.nodes)||typeof e.truncated!=`boolean`)&&Z(new _(`invalid-quality-payload`,`iOS runner returned an invalid quality payload`)),e.scope!==void 0&&e.scope!==null&&Z(new _(`invalid-quality-payload`,`iOS runner quality payload must be unscoped`,{field:`scope`})),{nodes:e.nodes,truncated:e.truncated,scope:null}}function fn(e,t){return he(pn(t),{fallbackToLargestRoot:!0})??he(pn(e),{fallbackToLargestRoot:!0})??{kind:`missing`,reason:`not-provided`}}function pn(e){return e?.filter(e=>e.parentIndex===void 0)??[]}function mn(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Z(t){throw t instanceof _?new e(`COMMAND_FAILED`,t.message,ye(t),t):t}function hn(n,r,i){if(n.appleOs===`watchos`)throw new e(`UNSUPPORTED_PLATFORM`,`watchOS is not supported: XCUITest cannot drive watchOS UI, so this device has no runner backend.`);let{overrides:a,runnerOpts:o}=Gt(n,r),s={open:(e,t)=>Fe(n,e,{appBundleId:t?.appBundleId,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,terminateRunningApp:t?.terminateRunningApp,url:t?.url,runnerOptions:o}),openDevice:()=>Ie(n),close:e=>Le(n,e,o),screenshot:(e,t)=>wn(n,e,t,o),snapshot:async e=>await gn(n,e,o),readTextAtPoint:async(e,t)=>En(n,t?.surface)?await Dn(e,t):await On(n,e,t,o),findText:async(e,t)=>({found:(await w(n,{command:`findText`,text:e,appBundleId:t?.appBundleId},t?.signal?{...o,signal:t.signal}:o))?.found===!0}),findSelector:async(e,t)=>({found:(await Je(n,e,t?.appBundleId,t?.signal?{...o,signal:t.signal}:o)).found===!0}),back:async e=>{if(t(n)){await w(n,K(`menu`,r.appBundleId),o);return}await w(n,{command:Wt(e),appBundleId:r.appBundleId},o)},home:async()=>{if(t(n)){await w(n,K(`home`,r.appBundleId),o);return}await w(n,{command:`home`,appBundleId:r.appBundleId},o)},setOrientation:async t=>{let i=Sn(await w(n,{command:`rotate`,orientation:t,appBundleId:r.appBundleId},o));if(i!==t)throw new e(`COMMAND_FAILED`,`iOS runner observed ${i} after requesting ${t}`,{requestedOrientation:t,observedOrientation:i});return{orientation:i}},appSwitcher:async()=>{await w(n,{command:`appSwitcher`,appBundleId:r.appBundleId},o)},tvRemote:async(e,t)=>{await w(n,K(se(e),r.appBundleId,t),o)},keyboardDismiss:async()=>{let e=await w(n,{command:`keyboardDismiss`,appBundleId:r.appBundleId},o);return{kind:`mechanism`,wasVisible:Q(e,`wasVisible`),dismissed:Q(e,`dismissed`),visible:Q(e,`visible`),mechanism:xn(e,`keyboardDismissMechanism`)}},keyboardEnter:async()=>{let e=await w(n,{command:`keyboardReturn`,appBundleId:r.appBundleId},o);return{kind:`visibility-echo`,visible:Q(e,`visible`),wasVisible:Q(e,`wasVisible`)}},readClipboard:()=>Xe(n),writeClipboard:e=>Ze(n,e),setSetting:(e,t,r,i)=>lt(n,e,t,r,i),readAlert:e=>rn(n,o,e),awaitAlert:e=>an(n,o,e),acceptAlert:e=>on(n,o,`accept`,e),dismissAlert:e=>on(n,o,`dismiss`,e),...a};return i?Cn(n,r,s,i):s}async function gn(e,t,n){return r(e)&&t?.surface&&t.surface!==`app`?await Ye(t,t.signal):await _n(e,t,n)}async function _n(t,n,r){let i=ln(await ae(`snapshot_capture`,async()=>await w(t,{command:`snapshot`,appBundleId:n?.appBundleId,interactiveOnly:n?.interactiveOnly,preferredBackend:n?.preferredBackend,customActions:n?.customActions,depth:n?.depth,scope:n?.scope,raw:n?.raw},bn(r,n?.signal)),{backend:`xctest`})),a=i.nodes??[],o=yn(n,i.quality);if(a.length===0&&t.kind===`simulator`&&!o)throw new e(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`);return{nodes:vn(t,n,i),truncated:i.truncated??!1,backend:`xctest`,producer:`apple-runner`,...i.quality?{quality:i.quality}:{},...!i.quality&&i.message?{warnings:[i.message]}:{}}}function vn(e,t,n){return r(e)?n.nodes??[]:un(e.id,t,n)}function yn(e,t){return i(e?.scope)!==null&&t!==void 0&&t.state!==`sparse`}function bn(e,t){return t?{...e,signal:e.signal?AbortSignal.any([e.signal,t]):t}:e}function Q(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function xn(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Sn(t){let n=t.orientation;if(typeof n==`string`&&ie.includes(n))return n;throw new e(`COMMAND_FAILED`,`iOS runner returned an invalid orientation result`,{orientation:n})}function Cn(e,t,n,r){let i={...n,open:async()=>$(`open`),openDevice:async()=>$(`openDevice`),close:async()=>$(`close`),screenshot:async()=>$(`screenshot`),readClipboard:async()=>$(`readClipboard`),writeClipboard:async()=>$(`writeClipboard`),setSetting:async()=>$(`setSetting`)};return le(i,n=>Me(r,{deviceId:e.id,requestId:t.requestId},n))}function $(t){throw new e(`UNSUPPORTED_OPERATION`,`${t} uses local Apple tooling (simctl/devicectl), which an injected runner transport cannot reach; the provider session must supply its own ${t} implementation.`)}async function wn(e,t,n={},r){if(Tn(e,n.surface)){await Ke(t,{surface:n.surface,fullscreen:n.fullscreen});return}if(n.captureBackend===`runner`){await U(e,t,n.appBundleId,n.fullscreen,r);return}await Tt(e,t,{appBundleId:n.appBundleId,pixelDensity:n.pixelDensity,fullscreen:n.fullscreen,runnerOptions:r,normalizeStatusBar:n.normalizeStatusBar,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck})}function Tn(e,t){return r(e)&&t!==void 0&&t!==`app`}function En(e,t){return r(e)&&t!==void 0&&t!==`app`}async function Dn(e,t){let{runMacOsReadTextAction:n}=await import(`./helper.js`).then(e=>e.t);return(await n(e.x,e.y,{bundleId:t?.appBundleId,surface:t?.surface})).text}async function On(e,t,n,r){let i=await w(e,{command:`readText`,x:t.x,y:t.y,appBundleId:n?.appBundleId},n?.signal?{...r,signal:n.signal}:r);return typeof i.text==`string`?i.text:typeof i.message==`string`?i.message:void 0}export{hn as createAppleInteractor};
|
|
3
|
+
`).replace(/\n$/,``))}async function et(e,t){if(r(e)){await qe(t);return}C(e,`clipboard`),await w(e),m(await v(e,[`pbcopy`,e.id],{allowFailure:!0,stdin:t}),`Failed to write iOS simulator clipboard`)}const tt=[`--time`,`9:41`,`--dataNetwork`,`wifi`,`--wifiMode`,`active`,`--wifiBars`,`3`,`--batteryState`,`charged`,`--batteryLevel`,`100`],nt={0:`hide`,1:`wifi`,6:`3g`,7:`4g`,8:`lte`,9:`lte-a`,10:`lte+`,11:`5g`,12:`5g+`,13:`5g-uwb`,14:`5g-uc`},rt={1:`searching`,2:`failed`,3:`active`},it={0:`notSupported`,1:`searching`,2:`failed`,3:`active`};function D(e,t,n){return Fe(e,t,n)}const O=new Set;async function at(e){let t=null,n=!1;if(ct(e))n=!0;else try{t=await lt(e),n=!0}catch(t){j(e,`snapshot_failed`,t)}try{(!n||t)&&await ut(e),await dt(e,tt)}catch(t){j(e,`prepare_failed`,t)}return async()=>{await ot(e,n?t:null)}}async function ot(e,t){if(await ut(e),!t){st(e);return}await dt(e,pt(t)),k(e)}function k(e){O.delete(A(e))}function st(e){O.add(A(e))}function ct(e){return O.has(A(e))}function A(e){return`${e.platform}:${e.kind}:${e.id}`}async function lt(e){return ft(m(await D(e,[`status_bar`,e.id,`list`],{allowFailure:!0}),`Failed to read simulator status bar overrides`).stdout)}async function ut(e){await D(e,[`status_bar`,e.id,`clear`])}async function dt(e,t){t.length!==0&&await D(e,[`status_bar`,e.id,`override`,...t])}function ft(t){let n={},r=t.split(`
|
|
4
|
+
`).map(e=>e.trim()).filter(e=>e.length>0&&e!==`Current Status Bar Overrides:`&&!/^=+$/.test(e));for(let t of r){let r=/^DataNetworkType:\s+(\d+)$/.exec(t);if(r){let t=Number(r[1]),i=nt[t];if(!i)throw new e(`COMMAND_FAILED`,`Unsupported simulator data network type: ${t}`);n.dataNetwork=i;continue}let i=/^WiFi Mode:\s+(\d+),\s+WiFi Bars:\s+(\d+)$/.exec(t);if(i){let e=rt[Number(i[1])];e&&(n.wifiMode=e),n.wifiBars=i[2];continue}let a=/^Cell Mode:\s+(\d+),\s+Cell Bars:\s+(\d+)$/.exec(t);if(a){let t=Number(a[1]),r=it[t];if(!r)throw new e(`COMMAND_FAILED`,`Unsupported simulator cellular mode: ${t}`);n.cellularMode=r,n.cellularBars=a[2];continue}let o=/^Operator Name:\s*(.*)$/.exec(t);if(o){n.operatorName=o[1]??``;continue}}return Object.keys(n).length===0?null:n}function pt(e){let t=[];return e.dataNetwork&&t.push(`--dataNetwork`,e.dataNetwork),e.wifiMode&&t.push(`--wifiMode`,e.wifiMode),e.wifiBars!==void 0&&(e.dataNetwork===`wifi`||e.wifiMode)&&t.push(`--wifiBars`,e.wifiBars),e.cellularMode&&t.push(`--cellularMode`,e.cellularMode),e.cellularBars!==void 0&&(e.cellularMode||mt(e.dataNetwork)||e.operatorName!==void 0)&&t.push(`--cellularBars`,e.cellularBars),e.operatorName!==void 0&&t.push(`--operatorName`,e.operatorName),t}function mt(e){return!!(e&&e!==`hide`&&e!==`wifi`)}function j(e,t,n){p({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,..._(n)}})}let M=null,N;async function ht(t,n,i,a,o){if(r(t)){let t=n.toLowerCase();if(t===`appearance`){await We(i);return}if(t===`permission`){let t=f(i);if(t===`deny`)throw new e(`INVALID_ARGS`,l(`permission`));let n=_t(o?.permissionTarget);return await Je(t,n)}throw new e(`INVALID_ARGS`,l(n))}C(t,`settings`),await w(t);let s=n.toLowerCase();switch(s){case`clear-app-state`:{if(i.toLowerCase()!==`clear`)throw new e(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!a)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);let n=await gt(t,a);return{bundleId:n.bundleId,containerPath:n.containerPath,cleared:!0}}case`reset-keychain`:if(i.toLowerCase()!==`clear`)throw new e(`INVALID_ARGS`,`settings reset-keychain only supports clear.`);return await v(t,[`keychain`,t.id,`reset`]),{scope:`simulator`,cleared:!0,message:`Reset the whole iOS simulator keychain. This clears keychain-backed credentials for every installed app, not just the app under test.`};case`wifi`:{let e=T(i)?`active`:`failed`;await v(t,[`status_bar`,t.id,`override`,`--wifiMode`,e]),k(t);return}case`airplane`:T(i)?(await v(t,[`status_bar`,t.id,`override`,`--dataNetwork`,`hide`,`--wifiMode`,`failed`,`--wifiBars`,`0`,`--cellularMode`,`failed`,`--cellularBars`,`0`,`--operatorName`,``]),k(t)):(await v(t,[`status_bar`,t.id,`clear`]),st(t));return;case`location`:{if(i.toLowerCase()===`set`){let{latitude:e,longitude:n}=d(o);return await v(t,[`location`,t.id,`set`,`${e},${n}`]),{latitude:e,longitude:n}}let n=T(i);if(!a)throw new e(`INVALID_ARGS`,`location setting requires an active app in session`);let r=n?`grant`:`revoke`;await v(t,[`privacy`,t.id,r,`location`,a]);return}case`faceid`:case`touchid`:{let e=s,n=bt[e];await Dt(t,Et(i,e),{settingName:e,label:n.label,modalityAliases:n.modalityAliases});return}case`appearance`:{let e=await vt(t,i);await v(t,[`ui`,t.id,`appearance`,e]);return}case`permission`:if(!a)throw new e(`INVALID_ARGS`,`permission setting requires an active app in session`);await St(t,xt(f(i)),Tt(o?.permissionTarget,o?.permissionMode),a);return;default:throw new e(`INVALID_ARGS`,`Unsupported setting: ${n}`)}}async function gt(t,r){if(!n(t)||t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`Clearing app state is currently supported only on iOS simulators.`);let i=await He(t,r);await w(t),await S(t,i);let a=m(await v(t,[`get_app_container`,t.id,i,`data`],{allowFailure:!0}),`simctl get_app_container failed for ${i}`).stdout.trim();if(!a)throw new e(`COMMAND_FAILED`,`simctl get_app_container returned an empty data container path for ${i}`);let o=await Te(a);return await Promise.all(o.map(e=>we(E.join(a,e)))),{bundleId:i,containerPath:a}}function _t(t){let n=t?.trim().toLowerCase();if(n===`accessibility`||n===`screen-recording`||n===`input-monitoring`)return n;throw new e(`INVALID_ARGS`,`Unsupported macOS permission target. Use accessibility|screen-recording|input-monitoring.`)}async function vt(t,n){let r=Ke(n);if(r!==`toggle`)return r;let i=m(await v(t,[`ui`,t.id,`appearance`],{allowFailure:!0}),`Failed to read current iOS appearance`),a=yt(i.stdout,i.stderr);if(!a)throw new e(`COMMAND_FAILED`,`Unable to determine current iOS appearance for toggle`,{stdout:i.stdout,stderr:i.stderr});return a===`dark`?`light`:`dark`}function yt(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}const bt={faceid:{label:`Face ID`,modalityAliases:[`face`]},touchid:{label:`Touch ID`,modalityAliases:[`finger`,`touch`]}};function xt(e){return e===`deny`?`revoke`:e}async function St(t,n,r,i){let a=await Ct(t);if(!a.has(r))throw new e(`UNSUPPORTED_OPERATION`,`iOS simctl privacy does not support service "${r}" on this runtime.`,{deviceId:t.id,appBundleId:i,hint:`Supported services: ${Array.from(a).sort().join(`, `)}`});let o=[`privacy`,t.id,n,r,i],s=r===`notifications`;if(!(n===`reset`&&s))try{await v(t,o);return}catch(n){throw s&&P(n)?new e(`UNSUPPORTED_OPERATION`,`iOS simulator does not support setting notifications permission via simctl privacy on this runtime.`,{deviceId:t.id,appBundleId:i,hint:`Use reset notifications for reprompt behavior, or toggle notifications manually in Settings.`}):n}try{await v(t,o);return}catch(e){if(!P(e))throw e}try{await v(t,[`privacy`,t.id,`reset`,`all`,i])}catch(n){throw new e(`COMMAND_FAILED`,`iOS simulator blocked direct notifications reset. Fallback reset-all also failed.`,{deviceId:t.id,appBundleId:i,hint:`Use reinstall to force a fresh notifications prompt, or reset simulator content and settings.`},n instanceof Error?n:void 0)}}function P(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=String(t.details?.stderr??``).toLowerCase();return(n.includes(`failed to grant access`)||n.includes(`failed to revoke access`)||n.includes(`failed to reset access`))&&n.includes(`operation not permitted`)}async function Ct(t){let n=me(t.simulatorSetPath),r=`${ae(`PATH`)??``}::${n??``}`;if(M&&N===r)return M;let i=await v(t,[`privacy`,`help`],{allowFailure:!0}),a=wt(`${i.stdout}\n${i.stderr}`);if(a.size===0)throw new e(`COMMAND_FAILED`,`Unable to determine supported simctl privacy services`,{stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,hint:"Run `xcrun simctl privacy help` manually to verify available services for this runtime."});return M=a,N=r,a}function wt(e){let t=new Set,n=!1;for(let r of e.split(`
|
|
5
|
+
`)){let e=r.trim();if(!e)continue;if(e===`service`){n=!0;continue}if(!n)continue;if(e.startsWith(`bundle identifier`))break;let i=/^([a-z-]+)\s+-\s+/.exec(e)?.[1];i!==void 0&&t.add(i)}return t}function Tt(t,n){let r=u(t);if(r!==`photos`&&n?.trim())throw new e(`INVALID_ARGS`,`Permission mode is only supported for photos. Received: ${n}.`);if(r===`camera`)return`camera`;if(r===`microphone`)return`microphone`;if(r===`contacts`)return`contacts`;if(r===`contacts-limited`)return`contacts-limited`;if(r===`notifications`)return`notifications`;if(r===`calendar`)return`calendar`;if(r===`location`)return`location`;if(r===`location-always`)return`location-always`;if(r===`media-library`)return`media-library`;if(r===`motion`)return`motion`;if(r===`reminders`)return`reminders`;if(r===`siri`)return`siri`;if(r===`photos`){let t=n?.trim().toLowerCase();if(!t||t===`full`)return`photos`;if(t===`limited`)return`photos-add`;throw new e(`INVALID_ARGS`,`Invalid photos mode: ${n}. Use full|limited.`)}throw new e(`INVALID_ARGS`,`Unsupported permission target: ${t}. Use camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri.`)}function Et(t,n){let r=t.trim().toLowerCase();if(r===`match`)return`match`;if(r===`nonmatch`)return`nonmatch`;if(r===`enroll`)return`enroll`;if(r===`unenroll`)return`unenroll`;throw new e(`INVALID_ARGS`,`Invalid ${n} state: ${t}. Use match|nonmatch|enroll|unenroll.`)}async function Dt(t,n,r){let i=Ot(t.id,n,r.modalityAliases),a=[];for(let e of i){let n=Ie(t,e),r=await Me(n,{allowFailure:!0});if(r.exitCode===0)return;a.push({args:n,stderr:r.stderr,stdout:r.stdout,exitCode:r.exitCode})}let o=Ge(a);throw a.length>0&&a.every(e=>kt(e.stdout,e.stderr))?new e(`UNSUPPORTED_OPERATION`,`${r.label} simulation is not supported on this simulator runtime.`,{deviceId:t.id,action:n,setting:r.settingName,attempts:o}):new e(`COMMAND_FAILED`,`Failed to simulate ${r.settingName}.`,{deviceId:t.id,action:n,setting:r.settingName,attempts:o})}function Ot(e,t,n){let r=n.length>0?n:[`face`];switch(t){case`match`:return r.flatMap(t=>[[`biometric`,e,`match`,t],[`biometric`,`match`,e,t]]);case`nonmatch`:return r.flatMap(t=>[[`biometric`,e,`nonmatch`,t],[`biometric`,e,`nomatch`,t],[`biometric`,`nonmatch`,e,t],[`biometric`,`nomatch`,e,t]]);case`enroll`:return[[`biometric`,e,`enroll`,`yes`],[`biometric`,e,`enroll`,`1`],[`biometric`,`enroll`,e,`yes`],[`biometric`,`enroll`,e,`1`]];case`unenroll`:return[[`biometric`,e,`enroll`,`no`],[`biometric`,e,`enroll`,`0`],[`biometric`,`enroll`,e,`no`],[`biometric`,`enroll`,e,`0`]]}}function kt(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`unrecognized subcommand`)||n.includes(`unknown subcommand`)||n.includes(`not supported`)||n.includes(`unavailable`)||n.includes(`biometric`)&&n.includes(`invalid`)}function F(e,t,n){return Fe(e,t,n)}const At={ensureBooted:w,prepareStatusBarForScreenshot:at,captureWithRetry:Nt,normalizeDensity:zt,captureWithRunner:R,shouldFallbackToRunner:V},I=new Map,L=new Map;async function jt(e,t,n={}){if(r(e)){await R(e,t,n.appBundleId,n.fullscreen,n.runnerOptions);return}if(e.kind===`simulator`){await Mt(e,t,n);return}await Pe(e).captureScreenshot(e,t,{appBundleId:n.appBundleId,fullscreen:n.fullscreen,runnerOptions:n.runnerOptions,runRunnerCommand:x})}async function Mt(t,n,r={}){if(t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`Simulator screenshot fallback flow supports only iOS simulators`);let i={...At,...r.deps??{}};r.skipIosSimulatorBootCheck||await i.ensureBooted(t);let a=async()=>{};if(r.normalizeStatusBar===!0)try{a=await i.prepareStatusBarForScreenshot(t)}catch(e){B(t,`prepare_failed`,e)}try{try{await i.captureWithRetry(t,n),await i.normalizeDensity(t,n,r.pixelDensity);return}catch(e){let a=e;if(r.skipIosSimulatorBootCheck&&Rt(e)){await i.ensureBooted(t);try{await i.captureWithRetry(t,n),await i.normalizeDensity(t,n,r.pixelDensity);return}catch(e){a=e}}if(!i.shouldFallbackToRunner(a))throw a;It(t,`simctl_screenshot`,a)}await i.captureWithRunner(t,n,r.appBundleId,r.fullscreen,r.runnerOptions),await i.normalizeDensity(t,n,r.pixelDensity)}finally{await a().catch(e=>B(t,`restore_failed`,e))}}async function Nt(e,t){let n=le.fromTimeoutMs(ke);await ce(async({deadline:n})=>{await F(e,[`io`,e.id,`screenshot`,t],{timeoutMs:Math.max(1e3,n?.remainingMs()??2e4)})},{maxAttempts:5,baseDelayMs:Oe,maxDelayMs:Ae,jitter:.2,shouldRetry:e=>V(e)},{deadline:n,phase:`ios_simulator_screenshot`})}async function R(t,n,i,a,o){if(t.kind===`device`&&!r(t)){await Pe(t).captureScreenshot(t,n,{appBundleId:i,fullscreen:a,runnerOptions:o,preferRunner:!0,runRunnerCommand:x});return}let s=(await x(t,{command:`screenshot`,appBundleId:i,fullscreen:a,inlineScreenshot:!1},o)).message;if(!s)throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: runner returned no file path`);if(r(t)){await Ee(s,n);return}if(t.kind===`simulator`){await Pt(t,s,n);return}throw new e(`COMMAND_FAILED`,`Unsupported Apple screenshot target`)}async function Pt(t,n,r){let i=le.fromTimeoutMs(De),a=`Unable to locate runner container for simulator screenshot`,o=L.get(t.id);if(o){let e=await z(o,n,r);if(e.copied)return;a=e.error,L.delete(t.id)}for(let e of Re){let o=await F(t,[`get_app_container`,t.id,e,`data`],{allowFailure:!0,timeoutMs:Ft(i,De,`runner screenshot container lookup`)});if(o.exitCode!==0){let e=o.stderr.trim();e&&(a=e);continue}let s=o.stdout.trim();if(!s){a=`simctl get_app_container returned empty output`;continue}let c=await z(s,n,r);if(c.copied){L.set(t.id,s);return}a=c.error}throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: ${a}`)}async function z(e,t,n){let r=`Runner screenshot was not found in the simulator container`;for(let i of Lt(e,t))try{return await Ee(i,n),{copied:!0}}catch(e){r=e instanceof Error?e.message:String(e)}return{copied:!1,error:r}}function Ft(t,n,r){let i=t.remainingMs();if(i>0)return i;throw new e(`COMMAND_FAILED`,`iOS ${r} timed out after ${n}ms`,{timeoutMs:n,step:r})}function It(e,t,n){let r=_(n);p({level:`warn`,phase:`ios_screenshot_fallback`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:t,to:`runner`,...r}})}function B(e,t,n){p({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,..._(n)}})}function Lt(e,t){let n=E.resolve(e),r=t.trim();if(!r)return[];let i=[],a=new Set,o=e=>{let t=E.normalize(e);a.has(t)||(a.add(t),i.push(t))},s=r.replace(/^\/+/,``),c=s.replaceAll(`\\`,`/`);if(s&&o(E.join(n,s)),E.isAbsolute(r)&&o(E.normalize(r)),c.startsWith(`tmp/`))o(E.join(n,c));else{let e=c.lastIndexOf(`/tmp/`);if(e>=0){let t=c.slice(e+1);o(E.join(n,t))}}let l=E.basename(r);return l&&o(E.join(n,`tmp`,l)),i}function V(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Ne(t);return n.includes(`timeout waiting for screen surfaces`)||n.includes(`nsposixerrordomain`)&&n.includes(`code=60`)&&n.includes(`screenshot`)||n.includes(`timed out`)&&n.includes(`screenshot`)}function Rt(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Ne(t);return n.includes(`not booted`)||n.includes(`current state: shutdown`)||n.includes(`current state is shutdown`)||n.includes(`current state=shutdown`)||n.includes(`state: shutdown`)||n.includes(`state=shutdown`)}async function zt(e,t,n){let r=await Bt(e),i=be(await ye(t),r,n);i&&await he(t,i.width,i.height)}async function Bt(t){let n=I.get(t.id);if(n!==void 0)return n;let r=await F(t,[`getenv`,t.id,`SIMULATOR_MAINSCREEN_SCALE`],{timeoutMs:je}),i=Number(r.stdout.trim());if(!Number.isFinite(i)||i<=0)throw new e(`COMMAND_FAILED`,`Failed to read iOS simulator screenshot scale from SIMULATOR_MAINSCREEN_SCALE`);return I.set(t.id,i),i}function Vt(e){let t=e?.amount!==void 0||e?.pixels!==void 0;return{...e,...t?{}:{amount:ne},durationMs:e?.durationMs??400,releaseBehavior:e?.releaseBehavior??`controlled`}}function H(e,t,n,r={includeDuration:!0}){let i=W(e.referenceWidth),a=W(e.referenceHeight);if(i===void 0||a===void 0)return G(e,{amount:n?.amount});let s=o({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:a});return G(e,{amount:n?.amount,pixels:s.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function U(e,t={}){return{...e?.amount===void 0?{}:{amount:e.amount},...e?.pixels===void 0?{}:{pixels:e.pixels},...t.includeDuration!==!1&&e?.durationMs!==void 0?{durationMs:e.durationMs}:{},...t.includeReleaseBehavior!==!1&&e?.releaseBehavior!==void 0?{scrollReleaseBehavior:e.releaseBehavior}:{}}}function W(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function G(e,t){let{x1:n,y1:r,x2:i,y2:a}=Ut(e),o=W(e.referenceWidth),s=W(e.referenceHeight),c=Ht(t,n!==void 0&&i!==void 0?Math.round(Math.abs(i-n)):void 0,r!==void 0&&a!==void 0?Math.round(Math.abs(a-r)):void 0);return{...n===void 0?{}:{x1:n},...r===void 0?{}:{y1:r},...i===void 0?{}:{x2:i},...a===void 0?{}:{y2:a},...o===void 0?{}:{referenceWidth:o},...s===void 0?{}:{referenceHeight:s},...t?.amount===void 0?{}:{amount:t.amount},...c===void 0?{}:{pixels:c},...t?.durationMs===void 0?{}:{durationMs:t.durationMs}}}function Ht(e,t,n){if(e?.preferProvidedPixels&&e.pixels!==void 0)return e.pixels;if(t!==void 0&&t>0)return t;if(n!==void 0&&n>0)return n}function Ut(e){let t=W(e.x),n=W(e.y),r=W(e.x2),i=W(e.y2);return{...t===void 0?{}:{x1:t},...n===void 0?{}:{y1:n},...r===void 0?{}:{x2:r},...i===void 0?{}:{y2:i}}}async function Wt(e,t,n,r,i,a){return H(await e(t,{command:`desktopScroll`,direction:i,...U(a,{includeDuration:!0,includeReleaseBehavior:!1}),appBundleId:n.appBundleId},r),i,a,{includeDuration:!0})}function K(e,t,n){return{command:`remotePress`,remoteButton:e,...n===void 0?{}:{durationMs:n},...t===void 0?{}:{appBundleId:t}}}function Gt(e){return e===`system`?`backSystem`:`backInApp`}function Kt(e,t){let n={signal:t.signal,verbose:t.verbose,logPath:t.logPath,traceLogPath:t.traceLogPath,requestId:t.requestId,iosXctestrunFile:t.iosXctestrunFile,iosXctestDerivedDataPath:t.iosXctestDerivedDataPath,iosXctestEnvDir:t.iosXctestEnvDir,runnerLeaseContext:t.runnerLeaseContext};return{runnerOpts:n,overrides:{tap:async(r,i)=>await x(e,J(e,t,r,i),n),pressPoint:async(r,i)=>await qt(e,t,n,r,i),tapElementSelector:async r=>await x(e,{command:`tap`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,...r.expectedPoint?{x:r.expectedPoint.x,y:r.expectedPoint.y}:{},...nn(e)?{synthesized:!0}:{},appBundleId:t.appBundleId},n),doubleTap:async(r,i)=>{let a=await x(e,y([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return b(a),a},longPress:async(r,i,a)=>await x(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await x(e,J(e,t,r,i),n),type:async(r,i)=>Zt(await x(e,{command:`type`,text:r,delayMs:i,textEntryMode:r===`
|
|
6
|
+
`?void 0:`append`,appBundleId:t.appBundleId},n)),fill:async(r,i,a,o,s)=>await x(e,{command:`type`,x:r,y:i,text:a,delayMs:o,textEntryMode:`replace`,...s?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},appBundleId:t.appBundleId},n),scroll:async(r,i)=>await rn(x,e,t,n,r,i),performGesture:async r=>await en(e,t,n,r),gestureViewport:async()=>$t(await x(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}async function qt(e,t,n,i,a){return r(e)&&a.surface&&a.surface!==`app`?await Jt(t,i,a):a.button===`primary`?a.count===1?await Xt(e,t,n,i,a):await ze(e,i,a,t.appBundleId,async t=>await x(e,t,n)):await Yt(e,t,n,i,a.button)}async function Jt(t,n,r){if(r.button!==`primary`)throw new e(`UNSUPPORTED_OPERATION`,`${r.button} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await import(`./helper.js`).then(e=>e.t);return await i(n.x,n.y,{bundleId:t.appBundleId,surface:r.surface}),{}}async function Yt(e,t,n,r,i){return await x(e,{command:`mouseClick`,x:r.x,y:r.y,button:i,appBundleId:t.appBundleId},n)}async function Xt(e,t,n,r,i){if(i.doubleTap){let i=await x(e,y([{kind:`doubleTap`,x:r.x,y:r.y}],t.appBundleId),n);return b(i),i}return i.holdMs>0?await x(e,{command:`longPress`,x:r.x,y:r.y,durationMs:i.holdMs,appBundleId:t.appBundleId},n):await x(e,J(e,t,r.x,r.y),n)}function Zt(e){let t=e.textEntryRoute;return Qt(t)?{textEntryRoute:t}:{}}function Qt(e){return typeof e==`string`&&xe.includes(e)}function $t(t){let n=q(t.x),r=q(t.y),i=q(t.x2),a=q(t.y2);if(n===void 0||r===void 0||i===void 0||a===void 0||i<=0||a<=0)throw new e(`COMMAND_FAILED`,`Apple runner returned an invalid gesture viewport`);return{x:n,y:r,width:i,height:a}}function q(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}async function en(e,n,i,a){if(a.topology===`two`&&Ze(e,a.intent),a.topology===`single`&&r(e)){let{start:t,end:r}=ue(a);return await x(e,{command:`drag`,x:t.x,y:t.y,x2:r.x,y2:r.y,durationMs:a.durationMs,appBundleId:n.appBundleId},i)}if(a.topology===`single`&&t(e)){let{start:t,end:r}=ue(a);return await x(e,{command:`swipe`,direction:tn(t,r),appBundleId:n.appBundleId},i)}return await x(e,{command:`gesture`,gesturePlan:a,appBundleId:n.appBundleId},i)}function tn(e,t){let n=t.x-e.x,r=t.y-e.y;return Math.abs(n)>=Math.abs(r)?n>=0?`right`:`left`:r>=0?`down`:`up`}function J(e,t,n,r){return{command:`tap`,x:n,y:r,...nn(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}function nn(e){return n(e)&&!t(e)}async function rn(e,n,i,o,s,c){if(te(c?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${ee}`}),t(n))return G(await e(n,K(s,i.appBundleId,c?.durationMs),o),{amount:c?.amount,durationMs:c?.durationMs});if(a(c??{}),r(n))return await Wt(e,n,i,o,s,c);let l=Vt(c);return H(await e(n,{command:`scroll`,direction:s,...U(l),appBundleId:i.appBundleId},o),s,l)}function Y(e,t,n){if(r(e)){let e=n?.surface===`frontmost-app`?{surface:n.surface}:{bundleId:n?.appBundleId,surface:n?.surface};return async t=>await Ye(t,e)}return async(r,i)=>await x(e,{command:`alert`,action:r,appBundleId:n?.appBundleId,timeoutMs:i},t)}async function an(e,t,n){return await Y(e,t,n)(`get`,s)}async function on(t,n,r){let i=Y(t,n,r),a=r?.timeoutMs??1e4,o=Date.now(),s=!0;for(;Date.now()-o<a;){try{let e=s?a:cn(o,a);return s=!1,await i(`get`,e)}catch(e){if(!X(e))throw e}await oe(300)}throw new e(`COMMAND_FAILED`,`alert wait timed out`)}async function sn(e,t,r,i){let a=Y(e,t,i),o=n(e)?s:c,l=Date.now(),u,d=!0;for(;Date.now()-l<c;){try{let e=d?o:cn(l,c);return d=!1,await a(r,e)}catch(e){if(u=e,!X(e))break}await oe(300)}throw ln(u)}function cn(e,t){return Math.max(1,t-(Date.now()-e))}function ln(t){return!(t instanceof e)||!X(t)?t:new e(t.code,t.message,{...t.details??{},hint:`If the permission sheet is visible in snapshot or screenshot but alert reports no alert, take a scoped snapshot around the visible button label and use press @ref.`})}function X(t){if(!(t instanceof e))return!1;let n=t.details??{};return n.runnerErrorCode===`ALERT_NOT_FOUND`||n.reason===`alert-not-found`}function un(e){let t=dn(e.systemSurface);return{nodes:Array.isArray(e.nodes)?e.nodes:void 0,truncated:typeof e.truncated==`boolean`?e.truncated:void 0,quality:ge(e.snapshotQuality),qualityPayload:pn(e.qualityPayload),runnerFatal:e.runnerFatal===!0,...t?{systemSurface:t}:{},message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}function dn(e){if(!gn(e))return;let t=e.bundleId,n=e.kind;if(!(typeof t!=`string`||!_e(t))&&typeof n==`string`)return{bundleId:t,kind:n}}function fn(e,t,n){let r=n.nodes??[];if(n.runnerFatal===!0||r.length===0&&n.qualityPayload===void 0)return r;let i=pe({raw:t?.raw,interactiveOnly:t?.interactiveOnly,depth:t?.depth,scope:t?.scope,customActions:t?.customActions}),a=mn(r,n.qualityPayload?.nodes),o={stage:`presented`,presentation:{producer:`apple-runner`,intent:`full`,payload:{nodes:r,truncated:n.truncated??!1,...n.quality?.effectiveDepth===void 0?{}:{effectiveDepth:n.quality.effectiveDepth}},...n.qualityPayload?{qualityPayload:n.qualityPayload}:{}},validation:{presentationKey:fe(i),viewport:a,hittability:{kind:`available`},lineage:{targetId:e},residue:[]}};try{return Ce(o,i).nodes}catch(e){Z(e)}}function pn(e){if(e!==void 0)return(!gn(e)||!Array.isArray(e.nodes)||typeof e.truncated!=`boolean`)&&Z(new g(`invalid-quality-payload`,`iOS runner returned an invalid quality payload`)),e.scope!==void 0&&e.scope!==null&&Z(new g(`invalid-quality-payload`,`iOS runner quality payload must be unscoped`,{field:`scope`})),{nodes:e.nodes,truncated:e.truncated,scope:null}}function mn(e,t){return h(hn(t),{fallbackToLargestRoot:!0})??h(hn(e),{fallbackToLargestRoot:!0})??{kind:`missing`,reason:`not-provided`}}function hn(e){return e?.filter(e=>e.parentIndex===void 0)??[]}function gn(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Z(t){throw t instanceof g?new e(`COMMAND_FAILED`,t.message,Se(t),t):t}function _n(n,r,i){if(n.appleOs===`watchos`)throw new e(`UNSUPPORTED_PLATFORM`,`watchOS is not supported: XCUITest cannot drive watchOS UI, so this device has no runner backend.`);let{overrides:a,runnerOpts:o}=Kt(n,r),s={open:(e,t)=>Be(n,e,{appBundleId:t?.appBundleId,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,terminateRunningApp:t?.terminateRunningApp,url:t?.url,runnerOptions:o}),openDevice:()=>Ve(n),close:e=>S(n,e,o),screenshot:(e,t)=>Dn(n,e,t,o),snapshot:async e=>await vn(n,e,o),readTextAtPoint:async(e,t)=>kn(n,t?.surface)?await An(e,t):await jn(n,e,t,o),findText:async(e,t)=>({found:(await x(n,{command:`findText`,text:e,appBundleId:t?.appBundleId},t?.signal?{...o,signal:t.signal}:o))?.found===!0}),back:async e=>{if(t(n)){await x(n,K(`menu`,r.appBundleId),o);return}await x(n,{command:Gt(e),appBundleId:r.appBundleId},o)},home:async()=>{if(t(n)){await x(n,K(`home`,r.appBundleId),o);return}await x(n,{command:`home`,appBundleId:r.appBundleId},o)},setOrientation:async t=>{let i=Tn(await x(n,{command:`rotate`,orientation:t,appBundleId:r.appBundleId},o));if(i!==t)throw new e(`COMMAND_FAILED`,`iOS runner observed ${i} after requesting ${t}`,{requestedOrientation:t,observedOrientation:i});return{orientation:i}},appSwitcher:async()=>{await x(n,{command:`appSwitcher`,appBundleId:r.appBundleId},o)},tvRemote:async(e,t)=>{await x(n,K(se(e),r.appBundleId,t),o)},keyboardDismiss:async()=>{let e=await x(n,{command:`keyboardDismiss`,appBundleId:r.appBundleId},o);return{kind:`mechanism`,wasVisible:Q(e,`wasVisible`),dismissed:Q(e,`dismissed`),visible:Q(e,`visible`),mechanism:wn(e,`keyboardDismissMechanism`)}},keyboardEnter:async()=>{let e=await x(n,{command:`keyboardReturn`,appBundleId:r.appBundleId},o);return{kind:`visibility-echo`,visible:Q(e,`visible`),wasVisible:Q(e,`wasVisible`)}},readClipboard:()=>$e(n),writeClipboard:e=>et(n,e),setSetting:(e,t,r,i)=>ht(n,e,t,r,i),readAlert:e=>an(n,o,e),awaitAlert:e=>on(n,o,e),acceptAlert:e=>sn(n,o,`accept`,e),dismissAlert:e=>sn(n,o,`dismiss`,e),...a};return i?En(n,r,s,i):s}async function vn(e,t,n){return r(e)&&t?.surface&&t.surface!==`app`?await Qe(t,t.signal):await yn(e,t,n)}async function yn(t,n,r){let i=un(await ie(`snapshot_capture`,async()=>await x(t,{command:`snapshot`,appBundleId:n?.appBundleId,interactiveOnly:n?.interactiveOnly,preferredBackend:n?.preferredBackend,customActions:n?.customActions,depth:n?.depth,scope:n?.scope,raw:n?.raw},Cn(r,n?.signal)),{backend:`xctest`})),a=i.nodes??[],o=Sn(n,i.quality);if(a.length===0&&t.kind===`simulator`&&!o)throw new e(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`);let s=bn(i);return{nodes:xn(t,n,i),truncated:i.truncated??!1,backend:`xctest`,producer:`apple-runner`,...i.quality?{quality:i.quality}:{},...i.systemSurface?{systemSurface:i.systemSurface}:{},...s.length>0?{warnings:s}:{}}}function bn(e){let t=[];return!e.quality&&e.message&&t.push(e.message),e.systemSurface&&t.push(ve),t}function xn(e,t,n){return r(e)?n.nodes??[]:fn(e.id,t,n)}function Sn(e,t){return i(e?.scope)!==null&&t!==void 0&&t.state!==`sparse`}function Cn(e,t){return t?{...e,signal:e.signal?AbortSignal.any([e.signal,t]):t}:e}function Q(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function wn(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Tn(t){let n=t.orientation;if(typeof n==`string`&&re.includes(n))return n;throw new e(`COMMAND_FAILED`,`iOS runner returned an invalid orientation result`,{orientation:n})}function En(e,t,n,r){let i={...n,open:async()=>$(`open`),openDevice:async()=>$(`openDevice`),close:async()=>$(`close`),screenshot:async()=>$(`screenshot`),readClipboard:async()=>$(`readClipboard`),writeClipboard:async()=>$(`writeClipboard`),setSetting:async()=>$(`setSetting`)};return de(i,n=>Le(r,{deviceId:e.id,requestId:t.requestId},n))}function $(t){throw new e(`UNSUPPORTED_OPERATION`,`${t} uses local Apple tooling (simctl/devicectl), which an injected runner transport cannot reach; the provider session must supply its own ${t} implementation.`)}async function Dn(e,t,n={},r){if(On(e,n.surface)){await Xe(t,{surface:n.surface,fullscreen:n.fullscreen});return}if(n.captureBackend===`runner`){await R(e,t,n.appBundleId,n.fullscreen,r);return}await jt(e,t,{appBundleId:n.appBundleId,pixelDensity:n.pixelDensity,fullscreen:n.fullscreen,runnerOptions:r,normalizeStatusBar:n.normalizeStatusBar,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck})}function On(e,t){return r(e)&&t!==void 0&&t!==`app`}function kn(e,t){return r(e)&&t!==void 0&&t!==`app`}async function An(e,t){let{runMacOsReadTextAction:n}=await import(`./helper.js`).then(e=>e.t);return(await n(e.x,e.y,{bundleId:t?.appBundleId,surface:t?.surface})).text}async function jn(e,t,n,r){let i=await x(e,{command:`readText`,x:t.x,y:t.y,appBundleId:n?.appBundleId},n?.signal?{...r,signal:n.signal}:r);return typeof i.text==`string`?i.text:typeof i.message==`string`?i.message:void 0}export{_n as createAppleInteractor};
|
package/dist/src/interactor2.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{C as e}from"./sdk-contracts.js";import{r as t}from"./sdk-batch-runner.js";import{a as n}from"./exec.js";import{o as r}from"./tv-remote.js";import"./command.js";import{t as i}from"./tool-provider3.js";function a(t){let n=async n=>{throw new e(`UNSUPPORTED_OPERATION`,`${n} is not supported on ${t}`)};return{open:()=>n(`open`),openDevice:()=>n(`openDevice`),close:()=>n(`close`),tap:()=>n(`tap`),doubleTap:()=>n(`doubleTap`),longPress:()=>n(`longPress`),focus:()=>n(`focus`),type:()=>n(`type`),fill:()=>n(`fill`),scroll:()=>n(`scroll`),screenshot:()=>n(`screenshot`),snapshot:()=>n(`snapshot`),back:()=>n(`back`),home:()=>n(`home`),setOrientation:()=>n(`setOrientation`),appSwitcher:()=>n(`appSwitcher`),tvRemote:()=>n(`tvRemote`),readClipboard:()=>n(`readClipboard`),writeClipboard:()=>n(`writeClipboard`),setSetting:()=>n(`setSetting`),readAlert:()=>n(`readAlert`),awaitAlert:()=>n(`awaitAlert`),acceptAlert:()=>n(`acceptAlert`),dismissAlert:()=>n(`dismissAlert`)}}const o={allowFailure:!0,timeoutMs:3e4};async function s(e,t){n(await i().launchApp(e.id,t,o),`Failed to launch Vega app ${t}`,{appName:t,deviceId:e.id})}async function c(e){n(await i().checkConnected(e.id,o),`Vega device is not connected`,{deviceId:e.id})}async function l(e,t){n(await i().terminateApp(e.id,t,o),`Failed to terminate Vega app ${t}`,{appName:t,deviceId:e.id})}async function u(e,t,a){let o=r(t);n(await i().pressRemote(e.id,o,a,{allowFailure:!0,timeoutMs:1e4+(a??0)}),`Failed to press Vega TV remote ${t}`,{button:t,deviceId:e.id})}const d=[{matches:(e,n)=>t(e)||!!n?.url,message:`Vega open does not support URLs or deep links.`,hint:`Use open <component-id> with an installed Vega app component ID.`},{matches:(e,t)=>!!t?.activity,message:`Vega open does not support Android activity selection.`,hint:`Remove --activity and use the Vega component ID as the open target.`},{matches:(e,t)=>!!t?.launchConsole,message:`Vega open does not support launch-console output.`,hint:`Remove --launch-console and open the Vega component ID directly.`},{matches:(e,t)=>!!t?.terminateRunningApp,message:`Vega open does not support terminating the running app before launch.`,hint:`Close the Vega component explicitly before opening it again.`},{matches:(e,t)=>!!t?.launchArgs?.length,message:`Vega open does not support launch arguments.`,hint:`Remove --launch-arg values and open the Vega component ID directly.`}];function f(e,t){return{...a(`Vega OS`),open:async(t,n)=>{p(t,n),await s(e,t)},openDevice:()=>c(e),close:t=>l(e,t),back:()=>u(e,`back`),home:()=>u(e,`home`),tvRemote:(t,n)=>u(e,t,n)}}function p(t,n){let r=d.find(({matches:e})=>e(t,n));if(r)throw new e(`UNSUPPORTED_OPERATION`,r.message,{hint:r.hint})}export{f as createVegaInteractor};
|
package/dist/src/interactors.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{C as e}from"./sdk-contracts.js";import{v as t}from"./sdk-device.js";import{n,r}from"./provider-device-runtime.js";import{n as i,t as a}from"./register-builtins.js";a();async function o(i,a){if(r(i)){let r=n(i,a);if(r)return r;throw new e(`UNSUPPORTED_OPERATION`,`Provider device runtime does not have an active interactor for this device.`,{deviceId:i.id,platform:t(i)})}return await s(i,a)}async function s(e,t){return await i(e.platform).createInteractor(e,t)}export{o as getInteractor,s as getLocalInteractor};
|
package/dist/src/internal/bin.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
async function e(e,n,r){try{await t(e,n,r)}catch(e){r.stderr(`${e instanceof Error?e.message:String(e)}\n`),await(await n.processExit()).exitAfterFlush(1)}}async function t(e,t,l){if(e.length===0)return await n(t,l);if(o(e))return await r(t,l);let u=c(e);if(u!==void 0)return await i(u,e,t,l);if(s(e))return await(await t.mcp()).runAgentDeviceMcpServer();await a(e,t)}async function n(e,t){t.stdout(`${(await e.help()).buildUsageText()}\n`),await(await e.processExit()).exitAfterFlush(1)}async function r(e,t){t.stdout(`${t.bundledVersion??(await e.version()).readVersion()}\n`)}async function i(e,t,n,r){let i=await n.help(),o=e===null?`${i.buildUsageText()}\n`:i.resolveHelpTargetUsageText(e);if(o===null)return await a(t,n);r.stdout(o)}async function a(e,t){await(await t.cli()).runCliProcess(e)}function o(e){return e.length===1&&(e[0]===`--version`||e[0]===`-V`)}function s(e){return e[0]===`mcp`&&!e.some(l)}function c(e){let[t,n]=e;if(e.length===1)return t===`help`||l(t)?null:void 0;if(e.length===2)return t===`help`?n:l(n)?t:void 0}function l(e){return e===`--help`||e===`-h`}e(process.argv.slice(2),{help:()=>import(`../cli-help.js`).then(e=>e.n),cli:()=>import(`../process-entry.js`),mcp:()=>import(`../server.js`),version:()=>import(`../version.js`).then(e=>e.t),processExit:()=>import(`../process-exit.js`)},{bundledVersion:`0.21.
|
|
1
|
+
async function e(e,n,r){try{await t(e,n,r)}catch(e){r.stderr(`${e instanceof Error?e.message:String(e)}\n`),await(await n.processExit()).exitAfterFlush(1)}}async function t(e,t,l){if(e.length===0)return await n(t,l);if(o(e))return await r(t,l);let u=c(e);if(u!==void 0)return await i(u,e,t,l);if(s(e))return await(await t.mcp()).runAgentDeviceMcpServer();await a(e,t)}async function n(e,t){t.stdout(`${(await e.help()).buildUsageText()}\n`),await(await e.processExit()).exitAfterFlush(1)}async function r(e,t){t.stdout(`${t.bundledVersion??(await e.version()).readVersion()}\n`)}async function i(e,t,n,r){let i=await n.help(),o=e===null?`${i.buildUsageText()}\n`:i.resolveHelpTargetUsageText(e);if(o===null)return await a(t,n);r.stdout(o)}async function a(e,t){await(await t.cli()).runCliProcess(e)}function o(e){return e.length===1&&(e[0]===`--version`||e[0]===`-V`)}function s(e){return e[0]===`mcp`&&!e.some(l)}function c(e){let[t,n]=e;if(e.length===1)return t===`help`||l(t)?null:void 0;if(e.length===2)return t===`help`?n:l(n)?t:void 0}function l(e){return e===`--help`||e===`-h`}e(process.argv.slice(2),{help:()=>import(`../cli-help.js`).then(e=>e.n),cli:()=>import(`../process-entry.js`),mcp:()=>import(`../server.js`),version:()=>import(`../version.js`).then(e=>e.t),processExit:()=>import(`../process-exit.js`)},{bundledVersion:`0.21.1`,stdout:e=>{process.stdout.write(e)},stderr:e=>{process.stderr.write(e)}}).catch(()=>process.exit(1));export{};
|