agent-device 0.20.6 → 0.20.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.6.apk → agent-device-android-ime-helper-0.20.8.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.8.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.6.manifest.json → agent-device-android-ime-helper-0.20.8.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.6.apk → agent-device-android-snapshot-helper-0.20.8.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.8.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.6.manifest.json → agent-device-android-snapshot-helper-0.20.8.manifest.json} +6 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +20 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +67 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +339 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSelectorMatchPolicy.swift +78 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +31 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +34 -8
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +4 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +36 -28
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +7 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +4 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +4 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +2 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +100 -12
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +4 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +57 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +1 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +18 -3
- 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.js +1 -1
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-lifecycle.js +7 -7
- package/dist/src/app-lifecycle2.js +2 -0
- package/dist/src/app-log-files.js +1 -0
- package/dist/src/app-log-reconnect.js +1 -0
- package/dist/src/app-log-runtime.js +4 -0
- package/dist/src/app-resolution.js +2 -1
- package/dist/src/apps.js +5 -5
- package/dist/src/audio-probe.js +1 -1
- package/dist/src/auth-session.js +1 -0
- package/dist/src/auth.js +2 -0
- package/dist/src/boot-diagnostics.js +2 -2
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-grammar.js +1 -0
- package/dist/src/cli-help.js +199 -259
- package/dist/src/cli-output.js +1 -0
- package/dist/src/cli-runner.js +1 -2
- package/dist/src/cli.js +6 -16
- package/dist/src/client-metro.js +1 -1
- package/dist/src/cloud-artifacts.d.ts +2 -137
- package/dist/src/command-schema.js +3 -3
- package/dist/src/connection-runtime.js +1 -0
- package/dist/src/connection.js +5 -0
- package/dist/src/daemon-shutdown-report.js +1 -0
- package/dist/src/daemon.js +2 -0
- package/dist/src/debug-symbols.js +1 -1
- package/dist/src/device-claim-inspection.js +1 -0
- package/dist/src/device-input-state.js +2 -2
- package/dist/src/device-ready.js +1 -0
- package/dist/src/device.js +1 -1
- package/dist/src/device2.js +2 -0
- package/dist/src/dispatch.js +1 -0
- 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/handler-utils.js +1 -0
- package/dist/src/harmonyos.js +1 -0
- package/dist/src/hdc.js +1 -0
- package/dist/src/host-process.js +3 -2
- package/dist/src/ime-lifecycle.js +7 -7
- package/dist/src/index.d.ts +52 -21
- package/dist/src/input-actions.js +4 -4
- package/dist/src/input-actions2.js +1 -1
- package/dist/src/input-actions3.js +1 -0
- package/dist/src/install-artifact.js +1 -5
- package/dist/src/install-artifact2.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-runtime.js +1 -1
- package/dist/src/interaction-snapshot.js +1 -1
- package/dist/src/interaction-touch-reference-frame.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +2 -2
- package/dist/src/interactor2.js +1 -1
- package/dist/src/internal/bin.js +2 -2
- package/dist/src/internal/daemon.js +7 -36
- package/dist/src/inventory.js +5 -0
- package/dist/src/inventory2.js +1 -0
- package/dist/src/inventory3.js +2 -0
- package/dist/src/inventory4.js +1 -0
- package/dist/src/inventory5.js +1 -0
- package/dist/src/inventory6.js +1 -0
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -0
- package/dist/src/limrun.d.ts +10 -125
- package/dist/src/limrun.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/logcat.js +1 -1
- package/dist/src/manifest.js +1 -1
- package/dist/src/notifications.js +1 -1
- package/dist/src/output-path.js +1 -0
- package/dist/src/owner-identity.js +1 -0
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-runtime-app-log-android-transport.js +1 -0
- package/dist/src/platform-runtime-app-log-process.js +1 -0
- package/dist/src/platform-runtime-host.js +1 -0
- package/dist/src/platform-runtime-network-web-transport.js +1 -0
- package/dist/src/platform-runtime-operation-host.js +5 -0
- package/dist/src/platform-runtime-screen-recording-android-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-apple-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -0
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -0
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-output-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-web-host.js +1 -0
- package/dist/src/platform-runtime-toolchain-host.js +1 -0
- package/dist/src/platform-runtime.js +1 -0
- package/dist/src/prepare-kind.js +15 -0
- package/dist/src/process-entry.js +1 -0
- package/dist/src/process-lock.js +1 -1
- package/dist/src/provider-webdriver.js +1 -0
- package/dist/src/proxy.js +2 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -0
- package/dist/src/record-trace.js +1 -1
- package/dist/src/recording-telemetry.js +1 -0
- package/dist/src/registry.js +24 -24
- package/dist/src/replay.js +3 -0
- package/dist/src/reporting.js +3 -3
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-lease.js +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime2.js +4 -0
- package/dist/src/runtime3.js +3 -0
- package/dist/src/runtime4.js +1 -0
- package/dist/src/runtime5.js +1 -0
- package/dist/src/runtime6.js +1 -0
- package/dist/src/runtime7.js +1 -0
- package/dist/src/screenshot-result.js +4 -4
- package/dist/src/screenshot.js +1 -0
- package/dist/src/sdk-android-adb.js +4 -4
- package/dist/src/sdk-batch-runner.js +3 -3
- package/dist/src/sdk-contracts.d.ts +31 -5
- package/dist/src/sdk-contracts.js +1 -1
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +285 -5
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selector-vocabulary.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +3 -3
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session.js +10 -9
- package/dist/src/shared.js +2 -0
- package/dist/src/shell-quote.js +1 -0
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -0
- package/dist/src/snapshot-session.js +1 -0
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/src.js +1 -1
- package/dist/src/src2.js +2 -0
- package/dist/src/src3.js +1 -0
- package/dist/src/text-surface.js +1 -1
- package/dist/src/timing-safe-equal.js +1 -0
- package/dist/src/tool-provider.js +2 -2
- package/dist/src/update-check.js +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/video.js +23 -0
- package/dist/src/web.js +1 -1
- package/package.json +34 -20
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.6.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.6.apk.sha256 +0 -1
- package/dist/src/app-log-request-scope.js +0 -1
- package/dist/src/context.js +0 -1
- package/dist/src/devices.js +0 -1
- package/dist/src/devices2.js +0 -1
- package/dist/src/devices3.js +0 -1
- package/dist/src/devices4.js +0 -1
- package/dist/src/provider-limrun-runtime.js +0 -1
- package/dist/src/register-builtins.js +0 -1
- package/dist/src/runner-client.js +0 -1
- package/dist/src/runner-provider.js +0 -1
- package/dist/src/screenshot-geometry.js +0 -1
- package/dist/src/viewport-dimension.js +0 -15
- package/skills/agent-device/SKILL.md +0 -45
- package/skills/dogfood/SKILL.md +0 -27
|
@@ -1,5 +1 @@
|
|
|
1
|
-
import{o as e}from"./png-worker-contract.js";import{_ as t,v as n}from"./sdk-contracts.js";import{b as r,
|
|
2
|
-
`).map(e=>e.trim()).filter(e=>e.length>0);if(t.length!==0)return t.at(-1)===`OK`&&t.pop(),t.join(`
|
|
3
|
-
`).trim()||void 0}async function A(e,t=C){return s(`adb`,E(e,[`shell`,`getprop`,`sys.boot_completed`]),{allowFailure:!0,timeoutMs:t})}async function j(e,t){let n=t.replace(/_/g,` `).trim();if(!D(e))return n||e;let r=await P(e);return r?r.replace(/_/g,` `):n||e}async function M(e,t,r){try{return await r(`adb`,E(e,t),{allowFailure:!0,timeoutMs:1e4})}catch(e){if(N(n(e)))return;throw e}}function N(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.timeoutMs==`number`}async function P(e,t=s){for(let n of[`ro.boot.qemu.avd_name`,`persist.sys.avd_name`]){let r=await M(e,[`shell`,`getprop`,n],t);if(!r)continue;let i=r.stdout.trim();if(r.exitCode===0&&i.length>0)return i}let n=await M(e,[`emu`,`avd`,`name`],t);if(!n)return;let r=k(n.stdout);if(n.exitCode===0&&r)return r}function F(e){let t=e.toLowerCase();return t.includes(`tv`)||t.includes(`leanback`)?`tv`:null}function I(e){return/feature:android\.(software\.leanback(_only)?|hardware\.type\.television)\b/i.test(e)}async function ne(e,t){let n=T(await s(`adb`,E(e,[`shell`,`cmd`,`package`,`has-feature`,t]),{allowFailure:!0,timeoutMs:C})).toLowerCase();return n.includes(`true`)?!0:n.includes(`false`)?!1:null}async function L(e){return(await w(te,2,async t=>await ne(e,t))).some(e=>e===!0)}async function R(e){return F(T(await s(`adb`,E(e,[`shell`,`getprop`,`ro.build.characteristics`]),{allowFailure:!0,timeoutMs:C})))===`tv`||await L(e)||I(T(await s(`adb`,E(e,[`shell`,`pm`,`list`,`features`]),{allowFailure:!0,timeoutMs:C})))?`tv`:`mobile`}async function z(e={}){if(await u(),!await c(`adb`))throw new t(`TOOL_MISSING`,`adb not found in PATH`);let n=e.serialAllowlist??m(void 0),r=await w((await V()).filter(e=>!n||n.has(e.serial)),3,async({serial:e,rawModel:t})=>{let[n,r,i]=await Promise.all([j(e,t),X(e),R(e)]);return{platform:`android`,id:e,name:n,kind:D(e)?`emulator`:`device`,target:i,booted:r}});return[...r,...await G(r)]}function B(e){return e.split(`
|
|
4
|
-
`).map(e=>e.trim()).filter(e=>e.length>0&&!e.startsWith(`List of devices`)).map(e=>e.split(/\s+/)).flatMap(e=>{let t=e[0];return t===void 0||e[1]!==`device`?[]:[{serial:t,rawModel:(e.find(e=>e.startsWith(`model:`))??``).replace(`model:`,``)}]})}async function V(){try{return B((await s(`adb`,[`devices`,`-l`],{timeoutMs:C})).stdout)}catch(e){throw a(e)}}function H(e){return e.split(`
|
|
5
|
-
`).map(e=>e.trim()).filter(e=>e.length>0)}function U(e,t){let n=e.find(e=>e===t);if(n)return n;let r=O(t);return e.find(e=>O(e)===r)}async function W(){return H(i(await s(`emulator`,[`-list-avds`],{allowFailure:!0,timeoutMs:C}),`Failed to list Android emulator AVDs`,{hint:`Verify Android emulator tooling is installed and available in PATH.`}).stdout)}async function G(e){let t=await W().catch(()=>[]),n=new Set(e.filter(e=>e.kind===`emulator`).map(e=>O(e.name)));return t.filter(e=>!n.has(O(e))).map(e=>({platform:`android`,id:e,name:e,kind:`emulator`,target:K(e),booted:!1}))}function K(e){return/\b(tv|television)\b/i.test(O(e))?`tv`:`mobile`}function q(e,t,n){let r=O(t);return e.find(e=>e.platform!==`android`||e.kind!==`emulator`||n&&e.id!==n?!1:O(e.name)===r)}async function J(e){let n=Date.now(),r=Math.min(1e3,Math.max(50,Math.floor(e.timeoutMs/20)));for(;Date.now()-n<e.timeoutMs;){try{let t=await Y(e.avdName,e.serial);if(t)return{platform:`android`,id:t,name:e.avdName,kind:`emulator`,target:`mobile`,booted:!1}}catch{}await l(r)}throw new t(`COMMAND_FAILED`,`Android emulator did not appear in time`,{avdName:e.avdName,serial:e.serial,timeoutMs:e.timeoutMs,hint:`Check emulator logs and verify the AVD can start from command line.`})}async function Y(e,t){let n=O(e),r=(await V()).filter(e=>t&&e.serial!==t?!1:D(e.serial));for(let e of r)if(O(e.rawModel)===n||O(await j(e.serial,e.rawModel))===n)return e.serial}async function X(e){try{return(await A(e)).stdout.trim()===`1`}catch{return!1}}async function re(e){await u();let n=e.avdName.trim();if(!n)throw new t(`INVALID_ARGS`,`Android emulator boot requires a non-empty AVD name.`);let i=e.timeoutMs??12e4;if(!await c(`adb`))throw new t(`TOOL_MISSING`,`adb not found in PATH`);if(!await c(`emulator`))throw new t(`TOOL_MISSING`,`emulator not found in PATH`);let a=await W(),o=U(a,n);if(!o)throw new t(`DEVICE_NOT_FOUND`,`No Android emulator AVD named ${e.avdName}`,{requestedAvdName:n,availableAvds:a,hint:"Run `emulator -list-avds` and pass an existing AVD name to --device."});let s=Date.now(),l=q(await z(),o,e.serial),d=l&&D(l.id)?l:void 0;if(!d){let t=[`-avd`,o];e.headless&&t.push(`-no-window`,`-no-audio`),r(`emulator`,t)}let f=d??await J({avdName:o,serial:e.serial,timeoutMs:i}),p=Date.now()-s,m=Math.max(1e3,i-p);await Z(f.id,m);let h=(await z()).find(e=>e.id===f.id);return h?{...h,name:o,booted:!0}:{...f,name:o,booted:!0}}async function Z(e,r=6e4){let i=r,a=ee.fromTimeoutMs(i),o=Math.min(1e3,Math.max(50,Math.floor(i/20))),s=Math.max(1,Math.ceil(i/o)),c,l=!1;try{await h(async({deadline:n})=>{if(n?.isExpired())throw l=!0,new t(`COMMAND_FAILED`,`Android boot deadline exceeded`,{serial:e,timeoutMs:r,elapsedMs:a.elapsedMs(),message:`timeout`});let o=Math.max(1e3,n?.remainingMs()??i),s=await A(e,Math.min(o,C));if(c=s,s.stdout.trim()!==`1`)throw new t(`COMMAND_FAILED`,`Android device is still booting`,{serial:e,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode})},{maxAttempts:s,baseDelayMs:o,maxDelayMs:o,jitter:0,shouldRetry:e=>{let t=g({error:e,stdout:c?.stdout,stderr:c?.stderr,context:{platform:`android`,phase:`boot`}});return t!==`ADB_TRANSPORT_UNAVAILABLE`&&t!==`ANDROID_BOOT_TIMEOUT`}},{deadline:a,phase:`boot`,classifyReason:e=>g({error:e,stdout:c?.stdout,stderr:c?.stderr,context:{platform:`android`,phase:`boot`}})})}catch(r){let o=n(r),s=c?.stdout,u=c?.stderr,d=c?.exitCode,f=g({error:r,stdout:s,stderr:u,context:{platform:`android`,phase:`boot`}});f===`BOOT_COMMAND_FAILED`&&o.message===`Android device is still booting`&&(f=`ANDROID_BOOT_TIMEOUT`);let p={serial:e,timeoutMs:i,elapsedMs:a.elapsedMs(),reason:f,hint:_(f),stdout:s,stderr:u,exitCode:d};throw l||f===`ANDROID_BOOT_TIMEOUT`?new t(`COMMAND_FAILED`,`Android device did not finish booting in time`,p):o.code===`TOOL_MISSING`?new t(`TOOL_MISSING`,o.message,{...p,...o.details??{}}):f===`ADB_TRANSPORT_UNAVAILABLE`?new t(`COMMAND_FAILED`,o.message,{...p,...o.details??{}}):new t(o.code,o.message,{...p,...o.details??{}},o.cause)}}async function ie(e,t,n){return await o(e)(t,n)}function Q(e){return{platform:`android`,id:e,name:e,kind:e.startsWith(`emulator-`)?`emulator`:`device`,booted:!0}}function ae(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`no shell command implementation`)||n.includes(`unknown command`)}var oe=e({prepareAndroidInstallArtifact:()=>$});async function $(e,t){let n=e.kind===`url`&&f(e.url),r=await p({source:e,isInstallablePath:(e,t)=>t.isFile()&&se(e),installableLabel:`Android installable (.apk or .aab)`,allowArchiveExtraction:e.kind!==`url`||n,signal:t?.signal});try{let e=t?.resolveIdentity===!1?{}:await ce(r.installablePath);return{archivePath:r.archivePath,installablePath:r.installablePath,packageName:e.packageName,cleanup:r.cleanup}}catch(e){throw await r.cleanup(),e}}function se(e){let t=v.extname(e).toLowerCase();return t===`.apk`||t===`.aab`}async function ce(e){let t=v.extname(e).toLowerCase();return t!==`.apk`&&t!==`.aab`?{}:{packageName:await d(e)}}export{ie as a,y as c,ae as i,$ as n,S as o,Q as r,Z as s,oe as t};
|
|
1
|
+
import{o as e}from"./png-worker-contract.js";import{_ as t,v as n}from"./sdk-contracts.js";import{b as r,o as i,v as a,w as o}from"./sdk-android-adb.js";import{t as s}from"./timeouts.js";import{n as c,t as l}from"./manifest.js";import{n as u,r as d}from"./install-source2.js";import{i as f,n as p,o as m,t as h}from"./boot-diagnostics.js";import g from"node:path";function _(e={}){let t=e.ttlMs??3e4,n=e.nowMs??Date.now,r=new Map,i=e=>{let t=y(e);for(let e of r.keys())e.startsWith(t)&&r.delete(e)};return{get(e,t){let i=v(e,t),a=r.get(i);if(a){if(a.expiresAtMs<=n()){r.delete(i);return}return a.value}},set(e,i,a){return r.set(v(e,i),{value:a,expiresAtMs:n()+t}),a},clear(e){i(e)},async invalidateWhile(e,t){i(e);try{return await t()}finally{i(e)}}}}function v(e,t){return[e.platform,e.deviceId,e.variant??``,t.trim().toLowerCase()].join(`\0`)}function y(e){return[e.platform,e.deviceId,``].join(`\0`)}var b=e({ensureAndroidEmulatorBooted:()=>S,waitForAndroidBoot:()=>A});const x=1e4;async function S(e,n){await c();let i=e.avdName.trim();if(!i)throw new t(`INVALID_ARGS`,`Android emulator boot requires a non-empty AVD name.`);let a=e.timeoutMs??12e4;if(!await o(`adb`))throw new t(`TOOL_MISSING`,`adb not found in PATH`);if(!await o(`emulator`))throw new t(`TOOL_MISSING`,`emulator not found in PATH`);let s=await C(n,e.serial),l=w(s,i,e.serial);if(!l)throw new t(`DEVICE_NOT_FOUND`,`No Android emulator AVD named ${e.avdName}`,{requestedAvdName:i,availableAvds:s.map(e=>e.name),hint:"Run `emulator -list-avds` and pass an existing AVD name to --device."});let u=l.name,d=Date.now(),f=T(l)?l:void 0;if(!f){let t=[`-avd`,u];e.headless&&t.push(`-no-window`,`-no-audio`),r(`emulator`,t)}let p=f??await O({dependencies:n,avdName:u,serial:e.serial,timeoutMs:a}),m=Date.now()-d;return await A(p.id,Math.max(1e3,a-m)),{...(await C(n,e.serial)).find(e=>e.id===p.id)??p,name:u,booted:!0}}async function C(e,t){return await e.discoverLocal({platform:`android`,kind:`emulator`,...t?{serial:t}:{},...e.androidSerialAllowlist?{androidSerialAllowlist:[...e.androidSerialAllowlist]}:{}})}function w(e,t,n){let r=D(t);return e.find(e=>e.platform===`android`&&e.kind===`emulator`&&D(e.name)===r&&(!n||!T(e)||e.id===n))}function T(e){return E(e.id)}function E(e){return e.startsWith(`emulator-`)}function D(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}async function O(e){let n=Date.now(),r=Math.min(1e3,Math.max(50,Math.floor(e.timeoutMs/20)));for(;Date.now()-n<e.timeoutMs;){try{let t=w(await C(e.dependencies,e.serial),e.avdName,e.serial);if(t&&T(t))return t}catch{}await s(r)}throw new t(`COMMAND_FAILED`,`Android emulator did not appear in time`,{avdName:e.avdName,serial:e.serial,timeoutMs:e.timeoutMs,hint:`Check emulator logs and verify the AVD can start from command line.`})}async function k(e,t=x){return await a(`adb`,[`-s`,e,`shell`,`getprop`,`sys.boot_completed`],{allowFailure:!0,timeoutMs:t})}async function A(e,n=6e4){let r=f.fromTimeoutMs(n),i=Math.min(1e3,Math.max(50,Math.floor(n/20))),a=Math.max(1,Math.ceil(n/i)),o,s=!1;try{await m(async({deadline:i})=>{if(i?.isExpired())throw s=!0,new t(`COMMAND_FAILED`,`Android boot deadline exceeded`,{serial:e,timeoutMs:n,elapsedMs:r.elapsedMs(),message:`timeout`});let a=Math.max(1e3,i?.remainingMs()??n),c=await k(e,Math.min(a,x));if(o=c,c.stdout.trim()!==`1`)throw new t(`COMMAND_FAILED`,`Android device is still booting`,{serial:e,stdout:c.stdout,stderr:c.stderr,exitCode:c.exitCode})},{maxAttempts:a,baseDelayMs:i,maxDelayMs:i,jitter:0,shouldRetry:e=>{let t=p({error:e,stdout:o?.stdout,stderr:o?.stderr,context:{platform:`android`,phase:`boot`}});return t!==`ADB_TRANSPORT_UNAVAILABLE`&&t!==`ANDROID_BOOT_TIMEOUT`}},{deadline:r,phase:`boot`,classifyReason:e=>p({error:e,stdout:o?.stdout,stderr:o?.stderr,context:{platform:`android`,phase:`boot`}})})}catch(t){j({error:t,serial:e,timeoutMs:n,deadline:r,lastBootResult:o,timedOut:s})}}function j(e){let t=n(e.error),r=M(e,t);throw P(t,r,e.timedOut,N(e,r))}function M(e,t){let n=p({error:e.error,stdout:e.lastBootResult?.stdout,stderr:e.lastBootResult?.stderr,context:{platform:`android`,phase:`boot`}});return n===`BOOT_COMMAND_FAILED`&&t.message===`Android device is still booting`?`ANDROID_BOOT_TIMEOUT`:n}function N(e,t){return{serial:e.serial,timeoutMs:e.timeoutMs,elapsedMs:e.deadline.elapsedMs(),reason:t,hint:h(t),stdout:e.lastBootResult?.stdout,stderr:e.lastBootResult?.stderr,exitCode:e.lastBootResult?.exitCode,...n(e.error).details??{}}}function P(e,n,r,i){return r||n===`ANDROID_BOOT_TIMEOUT`?new t(`COMMAND_FAILED`,`Android device did not finish booting in time`,i):e.code===`TOOL_MISSING`?new t(`TOOL_MISSING`,e.message,i):n===`ADB_TRANSPORT_UNAVAILABLE`?new t(`COMMAND_FAILED`,e.message,i):new t(e.code,e.message,i,e.cause)}async function F(e,t,n){return await i(e)(t,n)}function I(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`no shell command implementation`)||n.includes(`unknown command`)}var L=e({prepareAndroidInstallArtifact:()=>R});async function R(e,t){let n=e.kind===`url`&&u(e.url),r=await d({source:e,isInstallablePath:(e,t)=>t.isFile()&&z(e),installableLabel:`Android installable (.apk or .aab)`,allowArchiveExtraction:e.kind!==`url`||n,signal:t?.signal});try{let e=t?.resolveIdentity===!1?{}:await B(r.installablePath);return{archivePath:r.archivePath,installablePath:r.installablePath,packageName:e.packageName,cleanup:r.cleanup}}catch(e){throw await r.cleanup(),e}}function z(e){let t=g.extname(e).toLowerCase();return t===`.apk`||t===`.aab`}async function B(e){let t=g.extname(e).toLowerCase();return t!==`.apk`&&t!==`.aab`?{}:{packageName:await l(e)}}export{b as a,F as i,R as n,A as o,I as r,_ as s,L as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./png-worker-contract.js";import{_ as t}from"./sdk-contracts.js";import{
|
|
1
|
+
import{o as e}from"./png-worker-contract.js";import{_ as t}from"./sdk-contracts.js";import{c as n,l as r,n as i,o as a,r as o,s,u as c}from"./install-source2.js";import{t as l}from"./plist.js";import u from"node:path";import{promises as d}from"node:fs";import f from"node:os";var p=e({prepareIosInstallArtifact:()=>m,readIosBundleInfo:()=>g});async function m(e,t){return await r(async()=>await h(e,t))}async function h(e,n){if(e.kind===`url`&&!i(e.url))throw new t(`INVALID_ARGS`,`iOS install_from_source URL sources are only supported for trusted artifact services such as GitHub Actions and EAS. Use a path source for other hosts.`);let r=await o({source:e,isInstallablePath:(e,t)=>t.isDirectory()&&e.toLowerCase().endsWith(`.app`)||t.isFile()&&e.toLowerCase().endsWith(`.ipa`),installableLabel:`iOS installable (.app or .ipa)`,allowArchiveExtraction:e.kind!==`url`||i(e.url),signal:n?.signal}),a;try{a=await _(r.installablePath,n);let e=a,t=await g(e.installPath);return{archivePath:r.archivePath??(r.installablePath.toLowerCase().endsWith(`.ipa`)?r.installablePath:void 0),installablePath:e.installPath,bundleId:t.bundleId,appName:t.appName,cleanup:async()=>{await e.cleanup(),await r.cleanup()}}}catch(e){try{await a?.cleanup()}finally{await r.cleanup()}throw e}}async function g(e){let t=u.join(e,`Info.plist`),[n,r,i]=await Promise.all([l(t,`CFBundleIdentifier`),l(t,`CFBundleDisplayName`),l(t,`CFBundleName`)]);return{bundleId:n,appName:r??i}}async function _(e,r){if(!e.toLowerCase().endsWith(`.ipa`))return{installPath:e,cleanup:async()=>{}};let i=await d.mkdtemp(u.join(f.tmpdir(),`agent-device-ios-ipa-`)),o=async()=>{await d.rm(i,{recursive:!0,force:!0})};try{let l=u.join(i,`extracted`),f=s()+1;await c({archivePath:e,outputRoot:l,type:`zip`,budget:a(),depth:f}),n(f);let p=u.join(l,`Payload`),m=(await d.readdir(p,{withFileTypes:!0}).catch(()=>{throw new t(`INVALID_ARGS`,`Invalid IPA: missing Payload directory`)})).filter(e=>e.isDirectory()&&e.name.toLowerCase().endsWith(`.app`)).map(e=>({installPath:u.join(p,e.name),bundleName:e.name.replace(/\.app$/i,``)})),h=m[0];if(h!==void 0&&m.length===1)return{installPath:h.installPath,cleanup:o};if(m.length===0)throw new t(`INVALID_ARGS`,`Invalid IPA: expected at least one .app under Payload, found 0`);await v(m);let g=r?.appIdentifierHint?.trim();if(g){let e=y(m,g);if(e)return{installPath:e.installPath,cleanup:o};throw new t(`INVALID_ARGS`,`Invalid IPA: found ${m.length} .app bundles under Payload and none matched "${g}". Available bundles: ${m.map(b).join(`, `)}`)}throw new t(`INVALID_ARGS`,`Invalid IPA: found ${m.length} .app bundles under Payload. Pass an app identifier or bundle name matching one of: ${m.map(b).join(`, `)}`)}catch(e){throw await o(),e}}async function v(e){await Promise.all(e.map(async e=>{if(e.bundleId&&e.appName)return;let t=await g(e.installPath);e.bundleId=e.bundleId??t.bundleId,e.appName=e.appName??t.appName}))}function y(e,n){let r=n.toLowerCase(),i=e.filter(e=>e.bundleName.toLowerCase()===r);if(i.length===1)return i[0];if(i.length>1)throw new t(`INVALID_ARGS`,`Invalid IPA: multiple app bundles matched "${n}" by name. Use a bundle id hint instead.`);if(n.includes(`.`)){let t=e.filter(e=>e.bundleId?.toLowerCase()===r);if(t.length===1)return t[0]}}function b(e){let t=e.bundleId??e.appName;return t?`${e.bundleName}.app (${t})`:`${e.bundleName}.app`}export{m as n,p as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{v as t}from"./sdk-android-adb.js";import{t as n}from"./path-resolution.js";import r from"node:path";import{createWriteStream as i,promises as a}from"node:fs";import o from"node:os";import{pipeline as s}from"node:stream/promises";import{Readable as c}from"node:stream";import l from"node:net";import u from"node:dns/promises";const d=[`.zip`,`.tar`,`.tar.gz`,`.tgz`],f=Object.freeze([...d]);async function p(e){let t=[];try{let n=await h(e.source,{signal:e.signal,downloadTimeoutMs:e.downloadTimeoutMs});t.push(n.cleanup);let r=await E(n.localPath,{archivePath:void 0,isInstallablePath:e.isInstallablePath,installableLabel:e.installableLabel,allowArchiveExtraction:e.allowArchiveExtraction!==!1,registerCleanup:e=>{t.push(e)}});return{archivePath:r.archivePath,installablePath:r.installablePath,cleanup:async()=>{await j(t)}}}catch(e){throw await j(t),e}}function m(e){return n(e)}async function h(e,t){if(e.kind===`path`)return{localPath:m(e.path),cleanup:async()=>{}};let n=await a.mkdtemp(r.join(o.tmpdir(),`agent-device-source-`));try{return{localPath:await g(n,e.url,e.headers,t),cleanup:async()=>{await a.rm(n,{recursive:!0,force:!0})}}}catch(e){throw await a.rm(n,{recursive:!0,force:!0}),e}}async function g(t,n,a,o){let l;try{l=new URL(n)}catch{throw new e(`INVALID_ARGS`,`Invalid source URL: ${n}`)}await _(l);let u=o?.signal;if(u?.aborted)throw new e(`COMMAND_FAILED`,`request canceled`,{reason:`request_canceled`});let d=o?.downloadTimeoutMs??12e4,f=AbortSignal.timeout(d),p=u?AbortSignal.any([u,f]):f;try{let n=await fetch(l,{headers:a,redirect:`follow`,signal:p});if(!n.ok)throw new e(`COMMAND_FAILED`,`Failed to download app source: ${n.status} ${n.statusText}`,{status:n.status,statusText:n.statusText,url:l.toString()});let o=x(n,l),u=r.join(t,o),d=n.body;if(!d)throw new e(`COMMAND_FAILED`,`Download response body was empty`,{url:l.toString()});return await s(c.fromWeb(d),i(u)),u}catch(t){throw u?.aborted?new e(`COMMAND_FAILED`,`request canceled`,{reason:`request_canceled`},t):f.aborted?new e(`COMMAND_FAILED`,`App source download timed out after ${d}ms`,{timeoutMs:d,url:l.toString()},t):t}}async function _(t){if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new e(`INVALID_ARGS`,`Unsupported source URL protocol: ${t.protocol}`);if(S(t.hostname.toLowerCase()))throw new e(`INVALID_ARGS`,`Source URL host is not allowed: ${t.hostname}`,{hint:`Use a public artifact URL.`});if((await u.lookup(t.hostname,{all:!0,verbatim:!0}).catch(()=>[])).some(e=>C(e.address)))throw new e(`INVALID_ARGS`,`Source URL host resolved to a private or loopback address: ${t.hostname}`,{hint:`Use a public artifact URL.`})}function v(e){let t=e instanceof URL?e:new URL(e),n=t.hostname.toLowerCase();if(!n)return!1;let r=t.pathname;return y(n,r)||b(n,r)}function y(e,t){return e===`api.github.com`?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(t):e===`github.com`?/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(t):!1}function b(e,t){return e!==`expo.dev`&&!e.endsWith(`.expo.dev`)?!1:/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(t)}function x(e,t){let n=(e.headers.get(`content-disposition`)?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i))?.[1]?.trim();return n?r.basename(n):r.basename(t.pathname)||`downloaded-artifact.bin`}function S(e){return!e||e===`localhost`||e.endsWith(`.localhost`)?!0:C(e)}function C(e){let t=l.isIP(e);return t===4?w(e):t===6?T(e):!1}function w(e){let t=e.split(`.`).map(e=>Number.parseInt(e,10));if(t.length!==4||t.some(e=>Number.isNaN(e)||e<0||e>255))return!1;let n=t[0],r=t[1];return n===void 0||r===void 0?!1:n===10||n===127||n===169&&r===254||n===172&&r>=16&&r<=31||n===192&&r===168}function T(e){let t=e.toLowerCase();return!!(t===`::1`||t.startsWith(`fc`)||t.startsWith(`fd`)||t.startsWith(`fe80:`))}async function E(t,n){let r=await a.stat(t).catch(()=>null);if(!r)throw new e(`INVALID_ARGS`,`App source not found: ${t}`);if(n.isInstallablePath(t,r))return{archivePath:n.archivePath,installablePath:t};if(r.isFile()&&A(t)){if(!n.allowArchiveExtraction)throw new e(`INVALID_ARGS`,`URL sources must point directly to a ${n.installableLabel}; archive extraction is not allowed`,{path:t});let r=await O(t);return n.registerCleanup(r.cleanup),await E(r.outputPath,{...n,archivePath:n.archivePath??t})}if(r.isDirectory()){let r=await D(t,n.isInstallablePath),i=r[0];if(i!==void 0&&r.length===1)return{archivePath:n.archivePath,installablePath:i};if(r.length>1)throw new e(`INVALID_ARGS`,`Found multiple ${n.installableLabel} candidates under ${t}`,{matches:r});let a=await D(t,(e,t)=>t.isFile()&&A(e)),o=a[0];if(o!==void 0&&a.length===1){if(!n.allowArchiveExtraction)throw new e(`INVALID_ARGS`,`URL sources must point directly to a ${n.installableLabel}; nested archives are not allowed`,{path:o});let t=await O(o);return n.registerCleanup(t.cleanup),await E(t.outputPath,{...n,archivePath:n.archivePath??o})}if(a.length>1)throw new e(`INVALID_ARGS`,`Found multiple nested archives under ${t}; expected one ${n.installableLabel} source`,{matches:a})}throw new e(`INVALID_ARGS`,`Expected ${n.installableLabel} source, but got ${t}`)}async function D(e,t){let n=[],i=[{path:e,depth:0}];for(;i.length>0;){let e=i.shift();if(!e)continue;let o=await a.readdir(e.path,{withFileTypes:!0});o.sort((e,t)=>e.name.localeCompare(t.name));for(let a of o){let o=r.join(e.path,a.name);if(t(o,a)){n.push(o);continue}a.isDirectory()&&e.depth<5&&i.push({path:o,depth:e.depth+1})}}return n}async function O(e){let n=await a.mkdtemp(r.join(o.tmpdir(),`agent-device-archive-`));try{return e.toLowerCase().endsWith(`.zip`)?await k(e,n):e.toLowerCase().endsWith(`.tar.gz`)||e.toLowerCase().endsWith(`.tgz`)?await t(`tar`,[`-xzf`,e,`-C`,n]):await t(`tar`,[`-xf`,e,`-C`,n]),{outputPath:n,cleanup:async()=>{await a.rm(n,{recursive:!0,force:!0})}}}catch(e){throw await a.rm(n,{recursive:!0,force:!0}),e}}async function k(e,n){await t(`unzip`,[`-q`,e,`-d`,n])}function A(e){let t=e.toLowerCase();return d.some(e=>t.endsWith(e))}async function j(e){for(let t of[...e].reverse())await t()}export{_ as i,v as n,p as r,f as t};
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";import{t}from"./path-resolution.js";import n from"node:path";import{AsyncLocalStorage as r}from"node:async_hooks";import{createReadStream as i,createWriteStream as a,promises as o}from"node:fs";import s from"node:os";import{pipeline as c}from"node:stream/promises";import{Transform as l}from"node:stream";import u from"node:net";import{createGunzip as d}from"node:zlib";import*as f from"tar-stream";import*as ee from"yauzl";import p from"node:dns/promises";import te from"ipaddr.js";import{Agent as ne,ProxyAgent as re,request as ie}from"undici";const m=2*1024*1024*1024;var h=class{maxBytes;maxEntries;maxDepth;#e=0;#t=0;constructor(e={}){this.maxBytes=S(e.maxBytes??4294967296,`maxBytes`),this.maxEntries=S(e.maxEntries??1e5,`maxEntries`),this.maxDepth=S(e.maxDepth??3,`maxDepth`)}get bytes(){return this.#e}get entries(){return this.#t}preflightArchive(e){let t=S(e.depth,`depth`),n=S(e.entryCount,`entryCount`),r=S(e.declaredBytes,`declaredBytes`);if(t<1||t>this.maxDepth)throw x(`ARCHIVE_NESTING_LIMIT`,`Archive nesting depth exceeds the limit`);if(n>this.maxEntries-this.#t)throw x(`ARCHIVE_ENTRY_LIMIT`,`Archive contains too many entries`);if(r>this.maxBytes-this.#e)throw x(`ARCHIVE_EXPANDED_BYTES_LIMIT`,`Archive expands beyond the byte limit`);return new g(e=>this.#n(e),()=>this.#r(),e.entryCount,e.declaredBytes)}#n(e){let t=S(e,`bytes`);if(t>this.maxBytes-this.#e)throw x(`ARCHIVE_EXPANDED_BYTES_LIMIT`,`Archive expands beyond the byte limit`);this.#e+=t}#r(){if(this.#t>=this.maxEntries)throw x(`ARCHIVE_ENTRY_LIMIT`,`Archive contains too many entries`);this.#t+=1}},g=class{#e;#t;#n;#r;#i=0;#a=0;constructor(e,t,n,r){this.#e=e,this.#t=t,this.#n=n,this.#r=r}chargeBytes(e){let t=S(e,`bytes`);if(t>this.#r-this.#a)throw x(`ARCHIVE_MANIFEST_MISMATCH`,`Archive contents changed after inspection`);this.#e(t),this.#a+=t}commitEntry(){if(this.#i>=this.#n)throw x(`ARCHIVE_MANIFEST_MISMATCH`,`Archive contents changed after inspection`);this.#t(),this.#i+=1}finish(){if(this.#i!==this.#n||this.#a!==this.#r)throw x(`ARCHIVE_MANIFEST_MISMATCH`,`Archive contents changed after inspection`)}};function _(e,t,n){return e.preflightArchive({depth:t,entryCount:n.length,declaredBytes:n.reduce((e,t)=>e+t.size,0)})}function v(e,t){return e.name===t.name&&e.kind===t.kind&&e.size===t.size&&e.mode===t.mode}function y(e){if(!e||e.includes(`\0`)||e.includes(`\\`)||n.posix.isAbsolute(e)||/^[a-zA-Z]:/.test(e)||e.startsWith(`//`))throw x(`ARCHIVE_UNSAFE_PATH`,`Archive contains an unsafe entry path`);let t=n.posix.normalize(e).replace(/^(\.\/)+/,``).replace(/\/$/,``);if(!t||t===`.`||t===`..`||t.startsWith(`../`))throw x(`ARCHIVE_UNSAFE_PATH`,`Archive contains an unsafe entry path`);return t}function b(e,t){let r=y(t),i=n.resolve(e),a=n.resolve(i,...r.split(`/`));if(!a.startsWith(`${i}${n.sep}`))throw x(`ARCHIVE_UNSAFE_PATH`,`Archive entry escapes the extraction root`);return a}function x(t,n,r){return new e(`INVALID_ARGS`,n,{reason:t},r)}function S(e,t){if(!Number.isSafeInteger(e)||e<0)throw RangeError(`${t} must be a non-negative safe integer`);return e}async function ae(e){let t=e.budget??new h,n=e.depth??1,r=await oe(e,t,n);await e.validateManifest?.(r);let i=_(t,n,r),a=f.extract(),o=C(e.archivePath,e.gzip,a);try{for await(let t of a){let n=w(t.header);if(!n){await T(t);continue}let a=r.shift();if(!a||!v(a,n))throw x(`ARCHIVE_MANIFEST_MISMATCH`,`Archive contents changed after inspection`);await le(t,a,e.outputRoot,i),i.commitEntry()}await o}catch(e){throw a.destroy(),await o.catch(()=>{}),e}if(r.length!==0)throw x(`ARCHIVE_MANIFEST_MISMATCH`,`Archive contents changed after inspection`);i.finish()}async function oe(e,t,n){let r=[],i=0,a=f.extract(),o=C(e.archivePath,e.gzip,a);try{for await(let e of a){let a=w(e.header);if(!a){await T(e);continue}i+=a.size,t.preflightArchive({depth:n,entryCount:r.length+1,declaredBytes:i}),r.push(a),await T(e)}await o}catch(e){throw a.destroy(),await o.catch(()=>{}),e}return r}function C(e,t,n){return t?c(i(e),d(),n):c(i(e),n)}function se(e){if(e===`directory`)return`directory`;if(e===`file`||e===`contiguous-file`||e==null)return`file`;throw e===`link`||e===`symlink`?x(`ARCHIVE_UNSAFE_ENTRY`,`Uploaded app bundle archive cannot contain symlinks or hard links`):x(`ARCHIVE_UNSAFE_ENTRY`,`Archive contains a link or special entry`)}function ce(e,t){return(e??(t===`directory`?493:420))&511}function w(e){if(E(e.name,e.type))return;let t=y(e.name),n=se(e.type),r=n===`directory`?0:e.size??0;if(!Number.isSafeInteger(r)||r<0)throw x(`ARCHIVE_INVALID_ENTRY`,`Archive entry has an invalid size`);return{name:t,kind:n,size:r,mode:ce(e.mode,n)}}async function le(e,t,r,i){let s=b(r,t.name);if(t.kind===`directory`){await o.mkdir(s,{recursive:!0,mode:t.mode}),await T(e);return}await o.mkdir(n.dirname(s),{recursive:!0}),await c(e,async function*(e){for await(let t of e)i.chargeBytes(Buffer.byteLength(t)),yield t},a(s,{flags:`wx`,mode:t.mode}))}async function T(e){for await(let t of e);}function E(e,t){return t===`directory`&&(e===`.`||e===`./`||e===``)}async function ue(e){let t=e.budget??new h,r=e.depth??1,i=[],s=0;await D(e.archivePath,e=>{t.preflightArchive({depth:r,entryCount:i.length+1,declaredBytes:s});let n=k(e);s+=n.size,t.preflightArchive({depth:r,entryCount:i.length+1,declaredBytes:s}),i.push(n)}),await e.validateManifest?.(i);let l=_(t,r,i),u=await D(e.archivePath,(e,t)=>{t>=i.length&&A()});u.length!==i.length&&A();let d=await O(e.archivePath);try{for(let t=0;t<u.length;t+=1){let r=u[t],s=i[t];(!r||!s||!v(k(r),s))&&A();let f=b(e.outputRoot,s.name);s.kind===`directory`?await o.mkdir(f,{recursive:!0,mode:s.mode}):(await o.mkdir(n.dirname(f),{recursive:!0}),await c(await de(d,r),async function*(e){for await(let t of e)l.chargeBytes(Buffer.byteLength(t)),yield t},a(f,{flags:`wx`,mode:s.mode}))),l.commitEntry()}l.finish()}finally{d.close()}}async function D(e,t){let n=await O(e);return await new Promise((e,r)=>{let i=[],a=()=>{n.off(`entry`,o),n.off(`end`,s),n.off(`error`,c)},o=e=>{try{t?.(e,i.length),i.push(e),n.readEntry()}catch(e){a(),r(e)}},s=()=>{a(),e(i)},c=e=>{a(),r(e)};n.on(`entry`,o),n.once(`end`,s),n.once(`error`,c),n.readEntry()}).finally(()=>n.close())}function O(e){return new Promise((t,n)=>{ee.open(e,{lazyEntries:!0,autoClose:!1,validateEntrySizes:!0,strictFileNames:!0},(e,r)=>e?n(e):t(r))})}function de(e,t){return new Promise((n,r)=>{e.openReadStream(t,(e,t)=>e?r(e):n(t))})}function k(e){fe(e);let t=y(e.fileName),n=e.externalFileAttributes>>>16&65535,r=pe(e.fileName,n),i=r?493:420;return{name:t,kind:r?`directory`:`file`,size:r?0:e.uncompressedSize,mode:n&511||i}}function fe(e){if(e.isEncrypted())throw x(`ARCHIVE_UNSAFE_ENTRY`,`Encrypted archive entries are not supported`);let t=e.externalFileAttributes>>>16&61440;if(t!==0&&t!==16384&&t!==32768)throw x(`ARCHIVE_UNSAFE_ENTRY`,`Archive contains a link or special entry`)}function pe(e,t){return e.endsWith(`/`)||(t&61440)==16384}function A(){throw x(`ARCHIVE_MANIFEST_MISMATCH`,`Archive contents changed after inspection`)}async function j(e){let t=n.resolve(e.archivePath),r=n.resolve(e.outputRoot);if(t===r||t.startsWith(`${r}${n.sep}`))throw RangeError(`archivePath must be outside outputRoot`);await o.mkdir(r,{recursive:!1});try{e.type===`zip`?await ue({...e,archivePath:t,outputRoot:r}):await ae({...e,archivePath:t,outputRoot:r,gzip:e.type===`tgz`})}catch(e){throw await o.rm(r,{recursive:!0,force:!0}),e}}function M(e){let t=e.toLowerCase();if(t.endsWith(`.tar.gz`)||t.endsWith(`.tgz`))return`tgz`;if(t.endsWith(`.tar`))return`tar`;if(t.endsWith(`.zip`)||t.endsWith(`.ipa`))return`zip`}async function N(t,n){let r=await o.stat(t).catch(()=>null);if(!r)throw new e(`INVALID_ARGS`,`App source not found: ${t}`);if(n.isInstallablePath(t,r))return{archivePath:n.archivePath,installablePath:t};if(r.isFile()&&L(t))return I(t,n,!1),await P(t,n);if(r.isDirectory()){let r=await F(t,n.isInstallablePath);if(r.length===1)return{archivePath:n.archivePath,installablePath:r[0]};if(r.length>1)throw new e(`INVALID_ARGS`,`Found multiple ${n.installableLabel} candidates under ${t}: ${r.join(`, `)}`,{matches:r});let i=await F(t,(e,t)=>!!(t.isFile()&&L(e)));if(i.length===1)return I(i[0],n,!0),await P(i[0],n);if(i.length>1)throw new e(`INVALID_ARGS`,`Found multiple nested archives under ${t}; expected one ${n.installableLabel} source`,{matches:i})}throw new e(`INVALID_ARGS`,`Expected ${n.installableLabel} source, but got ${t}`)}async function P(e,t){let n=await me(e,t.budget,t.archiveDepth+1);return t.onArchiveAccepted?.(t.archiveDepth+1),t.registerCleanup(n.cleanup),await N(n.outputPath,{...t,archivePath:t.archivePath??e,archiveDepth:t.archiveDepth+1})}async function me(t,r,i){let a=M(t);if(!a)throw new e(`INVALID_ARGS`,`Unsupported archive: ${t}`);let c=await o.mkdtemp(n.join(s.tmpdir(),`agent-device-archive-`)),l=n.join(c,`extracted`);try{return await j({archivePath:t,outputRoot:l,type:a,budget:r,depth:i}),{outputPath:l,cleanup:async()=>await o.rm(c,{recursive:!0,force:!0})}}catch(e){throw await o.rm(c,{recursive:!0,force:!0}),e}}async function F(e,t){let r=[],i=[{path:e,depth:0}];for(;i.length>0;){let e=i.shift();if(!e)continue;let a=await o.readdir(e.path,{withFileTypes:!0});a.sort((e,t)=>e.name.localeCompare(t.name));for(let o of a){if(o.name===`__MACOSX`||o.name.startsWith(`._`))continue;let a=n.join(e.path,o.name);t(a,o)?r.push(a):o.isDirectory()&&e.depth<5&&i.push({path:a,depth:e.depth+1})}}return[...new Set(r)]}function I(t,n,r){if(!n.allowArchiveExtraction)throw new e(`INVALID_ARGS`,r?`URL sources must point directly to a ${n.installableLabel}; nested archives are not allowed`:`URL sources must point directly to a ${n.installableLabel}; archive extraction is not allowed`,{path:t})}function L(e){return M(e)!==void 0}const R=new r;async function z(e){return await R.run({budget:new h,depth:0},e)}function B(){return R.getStore()?.budget}function he(){return R.getStore()?.depth??0}function V(e){let t=R.getStore();t&&(t.depth=Math.max(t.depth,e))}async function H(t,n){if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new e(`INVALID_ARGS`,`Unsupported source URL protocol: ${t.protocol}`);if(t.username||t.password)throw new e(`INVALID_ARGS`,`Source URL credentials are not allowed`);_e(n);let r=G(t.hostname);ve(r)&&q(t.hostname);let i=u.isIP(r);if(i)return{address:r,family:i};let a;try{a=await ge(r,n)}catch(t){throw t instanceof e&&t.details?.reason===`request_canceled`?t:new e(`INVALID_ARGS`,`Source URL host could not be resolved: ${r}`,{hint:`Use a public artifact URL.`},t)}if(a.length===0)throw new e(`INVALID_ARGS`,`Source URL host could not be resolved: ${r}`,{hint:`Use a public artifact URL.`});a.some(e=>W(e.address))&&q(r);let o=a[0];return{address:o.address,family:o.family}}async function ge(e,t){let n=p.lookup(e,{all:!0,verbatim:!0});return t?await new Promise((e,r)=>{let i=()=>r(U(t.reason));t.addEventListener(`abort`,i,{once:!0}),n.then(e,r).finally(()=>t.removeEventListener(`abort`,i))}):await n}function _e(e){if(e?.aborted)throw U(e.reason)}function U(t){return new e(`COMMAND_FAILED`,`request canceled`,{reason:`request_canceled`},t)}function ve(e){let t;try{t=G(e)}catch{return!0}return!t||t===`localhost`||t.endsWith(`.localhost`)?!0:u.isIP(t)!==0&&W(t)}function W(e){try{return te.process(K(e)).range()!==`unicast`}catch{return!0}}function G(t){let n=K(t).toLowerCase().replace(/\.$/,``);if(!n||n.includes(`%`))throw new e(`INVALID_ARGS`,`Source URL host is not allowed`,{hint:`Use a public artifact URL.`});return n}function K(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}function q(t){throw new e(`INVALID_ARGS`,`Source URL host is not allowed because it resolves to a non-public address: ${t}`,{hint:`Use a public artifact URL.`})}function J(e){if(!Number.isSafeInteger(e.maxBytes)||e.maxBytes<0)throw RangeError(`maxBytes must be a non-negative safe integer`);let t=0,n=new l({transform(n,r,i){let a=t+n.byteLength;if(!Number.isSafeInteger(a)||a>e.maxBytes){i(e.createLimitError());return}t=a,i(null,n)}});return Object.defineProperty(n,"bytesSeen",{enumerable:!0,get:()=>t}),n}async function ye(e){let t=be(e.url),n=t?Ce(t,e.url):Se(e.approvedAddress,e.family),r=t?we(e.url,e.approvedAddress,e.family):e.url;try{let i=await ie(r,{dispatcher:n,headers:t?{...e.headers,host:e.url.host}:e.headers,maxRedirections:0,method:`GET`,signal:e.signal});return{statusCode:i.statusCode,headers:i.headers,body:i.body,close:async()=>await X(n)}}catch(e){throw await X(n),e}}function be(e,t=process.env){if(xe(e,t.no_proxy??t.NO_PROXY))return;let n=t.http_proxy??t.HTTP_PROXY;return e.protocol===`http:`?n||void 0:(t.https_proxy??t.HTTPS_PROXY)||n||void 0}function xe(e,t){if(!t)return!1;let n=Y(e.hostname).toLowerCase(),r=e.port||(e.protocol===`https:`?`443`:`80`);return t.split(/[\s,]+/).filter(Boolean).some(e=>{if(e===`*`)return!0;let t=Te(e);if(t.port&&t.port!==r)return!1;let i=t.hostname.replace(/^\*?\./,``).toLowerCase();return n===i||n.endsWith(`.${i}`)})}function Se(e,t){return new ne({connect:{lookup:(n,r,i)=>i(null,e,t)}})}function Ce(e,t){let n=u.isIP(Y(t.hostname))!==0;return new re({uri:e,proxyTunnel:!0,requestTls:t.protocol===`https:`&&!n?{servername:Y(t.hostname)}:void 0})}function we(e,t,n){let r=new URL(e);return r.hostname=n===6?`[${Y(t)}]`:t,r}function Te(e){if(e.startsWith(`[`)){let t=e.indexOf(`]`);return t<0?{hostname:e}:{hostname:e.slice(1,t),port:e[t+1]===`:`?e.slice(t+2):void 0}}let t=e.lastIndexOf(`:`);return t>-1&&e.indexOf(`:`)===t?{hostname:e.slice(0,t),port:e.slice(t+1)}:{hostname:e}}function Y(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}async function X(e){await e.close()}const Ee=new Set([301,302,303,307,308]),De=new Set([`accept-encoding`,`connection`,`content-length`,`host`,`keep-alive`,`proxy-connection`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`]);async function Oe(e){let t=Le(e.url),n=Pe(e.headers);for(let r=0;;r+=1){let i=await ke(t,n,e.signal);try{let a=Ae(i,t,r);if(a){a.origin!==t.origin&&(n=Fe(n)),t=a;continue}return je(i),await Me(e.tempDir,t,i)}finally{await i.close()}}}async function ke(t,n,r){let i=await H(t,r);try{return await ye({url:t,approvedAddress:i.address,family:i.family,headers:{...n,"accept-encoding":`identity`},signal:r})}catch(t){throw t instanceof e?t:new e(`COMMAND_FAILED`,`App source network request failed`,void 0,t)}}function Ae(t,n,r){if(!Ee.has(t.statusCode))return;t.body.resume?.();let i=Z(t.headers,`location`);if(!i||r>=5)throw new e(`COMMAND_FAILED`,`App source redirect limit was exceeded`,{status:t.statusCode});let a=new URL(i,n);if(n.protocol===`https:`&&a.protocol!==`https:`)throw new e(`COMMAND_FAILED`,`App source redirect downgraded HTTPS`);return a}function je(t){if(!(t.statusCode>=200&&t.statusCode<300))throw new e(`COMMAND_FAILED`,`Failed to download app source: ${t.statusCode}`,{status:t.statusCode})}async function Me(t,r,i){let s=Z(i.headers,`content-encoding`);if(s&&s.toLowerCase()!==`identity`)throw new e(`COMMAND_FAILED`,`App source response used unsupported content encoding`);Ne(Z(i.headers,`content-length`));let l=n.join(t,Ie(i,r)),u=J({maxBytes:m,createLimitError:()=>new e(`COMMAND_FAILED`,`App source exceeds maximum size of ${m} bytes`,{reason:`ARTIFACT_BYTE_LIMIT`})});try{return await c(i.body,u,a(l,{flags:`wx`})),l}catch(e){throw await o.rm(l,{force:!0}).catch(()=>{}),e}}function Ne(t){if(t===null)return;if(!/^\d+$/.test(t))throw new e(`COMMAND_FAILED`,`App source response had invalid content-length`);let n=Number(t);if(!Number.isSafeInteger(n)||n>2147483648)throw new e(`COMMAND_FAILED`,`App source response exceeded the byte limit`,{reason:`ARTIFACT_BYTE_LIMIT`})}function Pe(e){let t=new Set(Object.entries(e??{}).filter(([e])=>e.toLowerCase()===`connection`).flatMap(([,e])=>e.split(`,`).map(e=>e.trim().toLowerCase())));return Object.fromEntries(Object.entries(e??{}).filter(([e])=>{let n=e.toLowerCase();return!De.has(n)&&!t.has(n)}))}function Fe(e){return Object.fromEntries(Object.entries(e).filter(([e])=>[`accept`,`user-agent`].includes(e.toLowerCase())))}function Ie(e,t){let r=(Z(e.headers,`content-disposition`)?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i))?.[1]?.trim()||n.basename(t.pathname)||`downloaded-artifact.bin`;return n.basename(r)}function Z(e,t){let n=e[t];return Array.isArray(n)?n[0]??null:n??null}function Le(t){try{let n=new URL(t);if(n.username||n.password)throw new e(`INVALID_ARGS`,`Source URL credentials are not allowed`);return n}catch{throw new e(`INVALID_ARGS`,`Invalid source URL`)}}const Re=Object.freeze([`.zip`,`.tar`,`.tar.gz`,`.tgz`]);async function Q(e){let t=[];try{let n=await Be(e.source,{signal:e.signal,downloadTimeoutMs:e.downloadTimeoutMs});t.push(n.cleanup);let r=await N(n.localPath,{archivePath:void 0,isInstallablePath:e.isInstallablePath,installableLabel:e.installableLabel,allowArchiveExtraction:e.allowArchiveExtraction!==!1,registerCleanup:e=>{t.push(e)},budget:B()??new h,archiveDepth:0,onArchiveAccepted:V});return{archivePath:r.archivePath,installablePath:r.installablePath,cleanup:async()=>{await $(t)}}}catch(e){throw await $(t),e}}function ze(e){return t(e)}async function Be(e,t){if(e.kind===`path`)return{localPath:ze(e.path),cleanup:async()=>{}};let r=await o.mkdtemp(n.join(s.tmpdir(),`agent-device-source-`));try{return{localPath:await Ve(r,e.url,e.headers,t),cleanup:async()=>{await o.rm(r,{recursive:!0,force:!0})}}}catch(e){throw await o.rm(r,{recursive:!0,force:!0}),e}}async function Ve(t,n,r,i){let a=i?.signal;if(a?.aborted)throw new e(`COMMAND_FAILED`,`request canceled`,{reason:`request_canceled`});let o=i?.downloadTimeoutMs??12e4,s=AbortSignal.timeout(o),c=a?AbortSignal.any([a,s]):s;try{return await Oe({tempDir:t,url:n,headers:r,signal:c})}catch(e){throw He(e,a,s,o)}}function He(t,n,r,i){return n?.aborted?new e(`COMMAND_FAILED`,`request canceled`,{reason:`request_canceled`},t):r.aborted?new e(`COMMAND_FAILED`,`App source download timed out after ${i}ms`,{timeoutMs:i},t):t}async function Ue(e){await H(e)}function We(e){let t=e instanceof URL?e:new URL(e),n=t.hostname.toLowerCase();if(!n)return!1;let r=t.pathname;return Ge(n,r)||Ke(n,r)}function Ge(e,t){return e===`api.github.com`?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(t):e===`github.com`?/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(t):!1}function Ke(e,t){return e!==`expo.dev`&&!e.endsWith(`.expo.dev`)?!1:/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(t)}async function $(e){for(let t of[...e].reverse())await t()}export{J as a,V as c,m as d,Ue as i,z as l,We as n,B as o,Q as r,he as s,Re as t,j as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";import{c as t}from"./version.js";import{_ as n}from"./sdk-device.js";import{t as r}from"./runtime.js";import{N as i}from"./runner-disposal.js";import{a,n as o,r as s,t as c}from"./dispatch.js";import{Zt as l,gn as u,qt as d,tn as f}from"./internal/daemon.js";import{a as p,f as m,u as h,y as g}from"./selector-runtime.js";import{a as _,l as v}from"./snapshot-session.js";async function y(e){let{session:n,node:r,rootViewport:i,requestOptions:a}=e,o=h(r);if(!o)return null;let s;try{s=await p(n,o,a)}catch{return null}if(!s.found||!s.node?.rect)return null;let c={rect:s.node.rect,hittable:s.node.hittable===!0};return t(c,i)?c.rect:null}function b(t){let n=t.sessionStore.get(t.sessionName);if(!n)throw new e(`SESSION_NOT_FOUND`,a);return r({backend:x({...t,session:n}),...v(`interaction commands`,{plural:!0}),sessions:d({sessionName:t.sessionName,getSession:()=>n,recordOptions:{includeSnapshot:!0,omitRefFrameSnapshot:t.req.internal?.findResolvedTarget!==void 0},setRecord:e=>{e.snapshot&&(l(n,e.snapshot),t.sessionStore.set(t.sessionName,n))}}),signal:i(t.req.meta?.requestId)})}function x(e){let{req:t,session:r}=e,i=S(r);return{platform:n(r.device),captureSnapshot:async(n,i)=>({snapshot:await e.captureSnapshotForSession(r,t.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:i?.interactiveOnly===!0,includeRects:i?.includeRects===!0,signal:n.signal})}),resolveGestureViewport:async()=>e.pairedGestureViewport??await s(r.device,e.contextFromFlags(t.flags,r.appBundleId,r.trace?.outPath)),confirmOffscreenTargetVisible:m(r,{skipPendingPostGestureStabilization:!1})?async(n,i,a)=>await y({session:r,node:i,rootViewport:a,requestOptions:_({req:t,logPath:e.logPath,traceLogPath:r.trace?.outPath})}):void 0,tap:async(n,i)=>(f(r),C(await c(r.device,`press`,[String(i.x),String(i.y)],t.flags?.out,e.contextFromFlags(t.flags,r.appBundleId,r.trace?.outPath)))),tapTarget:i?.clickRef?async(e,t)=>(f(r),await i.clickRef?.(t.ref),{ref:g(t.ref)}):void 0,fill:async(n,i,a,o)=>(f(r),C(await c(r.device,`fill`,[String(i.x),String(i.y),a],t.flags?.out,{...e.contextFromFlags(t.flags,r.appBundleId,r.trace?.outPath),allowNonHittableCoordinateFallback:o?.allowNonHittableCoordinateFallback}))),fillTarget:i?.fillRef?async(e,t,n,a)=>(f(r),await i.fillRef?.(t.ref,n,a),{ref:g(t.ref),text:n,delayMs:a?.delayMs??0}):void 0,longPress:async(n,i,a)=>(f(r),C(await c(r.device,`longpress`,[String(i.x),String(i.y),...a?.durationMs===void 0?[]:[String(a.durationMs)]],t.flags?.out,e.contextFromFlags(t.flags,r.appBundleId,r.trace?.outPath)))),performGesture:async(n,i)=>(f(r),C(await o(r.device,i,e.contextFromFlags(t.flags,r.appBundleId,r.trace?.outPath)))),typeText:async(n,i)=>(f(r),C(await c(r.device,`type`,[i],t.flags?.out,e.contextFromFlags(t.flags,r.appBundleId,r.trace?.outPath))))}}function S(e){if(e.device.platform!==`web`)return;let t=u();return t.clickRef||t.fillRef?t:void 0}function C(e){return e&&typeof e==`object`?e:void 0}export{b as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{z as e}from"./prepare-kind.js";import{Zt as t,an as n}from"./internal/daemon.js";async function r(r,i,a,o,s){let c={...i??{},snapshotInteractiveOnly:s.interactiveOnly,...s.preferredBackend?{snapshotPreferredBackend:s.preferredBackend}:{}},l=o(c,r.appBundleId,r.trace?.outPath),{snapshot:u}=await n({device:r.device,session:r,flags:c,outPath:c.out,logPath:l.logPath??``,includeRects:s.includeRects,androidFreshnessMode:s.androidFreshnessMode,signal:s.signal});return e(u.snapshotQuality)||(t(r,u),a.set(r.name,r)),u}export{r as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{I as e,
|
|
1
|
+
import{I as e,M as t,P as n,X as r}from"./screenshot-result.js";import{i}from"./session-target-evidence.js";import{j as a}from"./sdk-android-adb.js";import{a as o}from"./input-actions.js";import{Ht as s,Ut as c,dn as l,un as u}from"./internal/daemon.js";function d(e){let{session:t,sessionStore:n,command:a,positionals:o,actionCommand:c=a,retryPositionals:d,flags:m,result:h,responseData:g,recordedTarget:_,recordedTargets:v,scheduleInteractionOutcomeRetry:y=!0,actionStartedAt:b,actionFinishedAt:x,androidFreshnessBaseline:S}=e,C=l(m),[w,T]=p({command:a,positionals:o,flags:C,result:h,responseData:g}),E=r(t)&&_?i(_):void 0,D=r(t)&&v?f(v):void 0;return n.recordAction(t,{command:a,positionals:o,flags:C??{},result:w,...E?{targetEvidence:E}:{},...D?{targetEvidences:D}:{}}),u({session:t,command:a,action:c,positionals:d??o,flags:m,scheduleOutcomeRetry:y,androidFreshnessBaseline:S}),s(t,c,o,w,C??{},b,x),{ok:!0,data:T}}function f(e){let t=i(e.source),n=i(e.destination);return t&&n?{source:t,destination:n}:void 0}function p(r){if(r.command!==`fill`||typeof r.flags?.recordAs!=`string`)return[r.result,r.responseData];let i=e({ts:0,command:`fill`,positionals:r.positionals,flags:r.flags,result:r.result}),a=n(r.flags.recordAs);return[t(r.result,i,a),t(r.responseData,i,a)]}async function m(e){let{session:t,flags:n,sessionStore:r,contextFromFlags:i,captureSnapshotForSession:a}=e,s=t.screenRecording?.handle;if(!s)return;let l=s.inspect().touchReferenceFrame;if(l)return l;if(t.device.platform===`android`){let e=await o(t.device),n={referenceWidth:e.width,referenceHeight:e.height};return s.setTouchReferenceFrame(n),n}let u=c(t.snapshot);if(u)return s.setTouchReferenceFrame(u),u;let d=c(await a(t,n,r,i,{interactiveOnly:!0}));return d&&s.setTouchReferenceFrame(d),d}async function h(e){try{return await m(e)}catch(t){a({level:`warn`,phase:`touch_reference_frame_resolve_failed`,data:{platform:e.session.device.platform,error:t instanceof Error?t.message:String(t)}});return}}function g(e){return c({nodes:e,createdAt:0})}export{h as n,d as r,g as t};
|
package/dist/src/interaction.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{S as e,_ as t,h as n,s as r,v as i}from"./sdk-contracts.js";import{$ as a,H as o,R as s,U as c,W as l,Z as u,ct as d,lt as f,q as p,st as ee}from"./screenshot-geometry.js";import{C as m,_ as h,dt as g,g as _,v}from"./sdk-batch-runner.js";import{c as y,h as te,o as b}from"./sdk-device.js";import{I as ne,Kt as x,fn as re,nt as S}from"./viewport-dimension.js";import{L as ie}from"./screenshot-result.js";import{i as ae}from"./runtime.js";import{j as C}from"./sdk-android-adb.js";import{t as oe}from"./timeouts.js";import{N as se}from"./runner-disposal.js";import{S as ce,c as w,f as T,l as E,n as le,s as D}from"./context.js";import{Gt as ue,It as O,Jt as de,Kt as fe,Lt as pe,Vt as k,Yt as me,rn as he,zt as A}from"./internal/daemon.js";import{D as j,E as ge,S as _e,T as M,_ as ve,b as ye,c as be,g as xe,h as Se,l as Ce,n as we,r as Te,v as Ee,x as De,y as Oe}from"./selector-runtime.js";import{t as N}from"./interaction-runtime.js";import{t as P}from"./interaction-snapshot.js";import{n as ke,r as F,t as I}from"./interaction-touch-reference-frame.js";const Ae=new Set(v());function je(e){return Ne({fields:Me(e.command),input:e.input??{},data:e.data,controlledFields:Ae})}function Me(e){let t=m(e);if(!t)throw Error(`Missing response data transform descriptor for ${e}`);return t.fields}function Ne(e){let t=Object.fromEntries(Object.entries(e.data??{}).filter(([t])=>!e.controlledFields.has(t)));for(let[n,r]of Object.entries(e.fields)){let i=e.input[n]===void 0?r.defaultValue:e.input[n];if(i===void 0||r.omitDefault===!0&&i===r.defaultValue){delete t[n];continue}t[n]=i}return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}const Pe=new Set([`currentUptimeMs`,`gestureEndUptimeMs`,`gestureStartUptimeMs`,`sequenceResults`]);function Fe(e){if(e)return Object.fromEntries(Object.entries(e).filter(([e])=>!Pe.has(e)))}function Ie(e){let n=e.flags?.recordAs;if(n!==void 0){if(ie(n),e.flags?.noRecord)throw new t(`INVALID_ARGS`,`fill --record-as cannot be combined with --no-record because no script step would be published.`);if(!e.session.recordSession&&!e.replayPlanStep)throw new t(`INVALID_ARGS`,`fill --record-as requires an armed script recording. Start a fresh session with open --save-script, then retry the fill.`)}}function L(e){try{return R(e),null}catch(e){if(e instanceof t)return D(e.code,e.message,e.details);throw e}}function R(e){let n=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref,r=ue({session:e.session,refBody:n,mintedGeneration:e.mintedGeneration});if(r.admitted)return;let i=me(e.session);throw new t(`COMMAND_FAILED`,Re(r.reason,e.ref),{reason:r.reason,ref:e.ref,currentGeneration:de(e.session),scope:i===`all`?`all`:Array.from(i),...e.mintedGeneration===void 0?{}:{mintedGeneration:e.mintedGeneration},hint:e.staleRefsWarning??Le})}const Le=`Capture a fresh interactive snapshot (snapshot -i) or use a stable selector, then retry.`;function Re(e,t){switch(e){case`ref_frame_expired`:return`Ref ${t} belongs to an expired ref frame — a device action since the snapshot invalidated it`;case`ref_generation_mismatch`:return`Ref ${t} was minted from a superseded snapshot generation`;case`plain_ref_requires_complete_frame`:return`Ref ${t} needs a complete snapshot — the current frame only authorizes its emitted refs`;case`ref_not_issued`:return`Ref ${t} was not issued by the current ref frame`}}function z(e,t){return!y(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:D(`UNSUPPORTED_OPERATION`,`${t} is not supported on macOS ${e.surface} sessions yet. Open an app session to act, or use the ${e.surface} surface to inspect.`)}const ze={source:`direct-ios`,kind:`not-observed`};function B(e,t){if(!Be(e))return t;let{resolution:n,...r}=t;return r}function Be(e){return e.maestroCoordinateFallbackDispatched===!0}function V(e){return H({source:{kind:`corroborated-tap`,targetKind:e.targetKind,data:{warning:e.warning},publicData:{warning:e.warning},point:e.point,resolution:e.resolution},referenceFrame:e.referenceFrame,extra:e.extra})}function H(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`||t.kind===`corroborated-tap`){let e={targetKind:t.targetKind,...B(t,{resolution:t.kind===`runner-payload`?ze:t.resolution}),...r??{}};return{result:W({data:t.data,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e}),responseData:W({data:t.publicData,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e})}}let{result:i}=t,a={targetKind:i.kind,...B(t,Oe(i)),...Ue(i.settle,e.settleRefsGeneration),...r??{}},o=W({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:{...a,...He(i)}}),s=W({data:t.publicData,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:a}),c=We(`warning`in i?i.warning:void 0,e.staleRefsWarning);return c&&(o.warning=c,s.warning=c),{result:o,responseData:s,...Ve(i)}}function Ve(e){let t=U(e)?.node??(`node`in e?e.node:void 0),n=`preActionNodes`in e?e.preActionNodes:void 0;return t&&n?{recordedTarget:{node:t,preActionNodes:n}}:{}}function He(e){let t=U(e);return t?{selectorChain:t.selectorChain,refLabel:t.refLabel}:{}}function U(e){return`recordingTarget`in e?e.recordingTarget:void 0}function Ue(e,t){return!e?.diff||t===void 0?{}:{settle:{...e,refsGeneration:t}}}function We(e,t){return t?e?`${e} ${t}`:t:e}function W(e){let{data:t,fallbackX:n,fallbackY:r,referenceFrame:i,extra:a}=e,o=Ke(a,n,r)??(typeof t?.message==`string`?t.message:void 0);return Ge({...t??{},...n===void 0||r===void 0?{}:{x:n,y:r},...i??{},...a??{},...re(o)})}function Ge(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function Ke(e,t,n){let r=G(e,`text`);if(r!==void 0)return`Filled ${Array.from(r).length} chars`;let i=qe(t,n),a=Je(e);if(a)return Xe(a,e??{},i);if(i)return Ye(e,i)}function G(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function qe(e,t){return e===void 0||t===void 0?``:` (${e}, ${t})`}function Je(e){let t=G(e,`ref`);return t===void 0?G(e,`selector`):`@${t}`}function Ye(e,t){return e?.gesture===`longpress`?`Long pressed${t}`:`Tapped${t}`}function Xe(e,t,n){let r=typeof t.button==`string`?t.button:void 0;return t.gesture===`longpress`?`Long pressed ${e}${n}`:r&&r!==`primary`?`Clicked ${r} ${e}${n}`:`Tapped ${e}${n}`}async function K(e){if(!Ze(e))return;let t=$e(e.session.snapshot);if(!t)return;let n=await et(e,t.snapshot.snapshotQuality?.backend,t.presentation);if(!(!n||!tt(t.snapshot,n,e.command)))return nt(t.snapshot,n,e.command)}function Ze(e){return Qe(e.command)&&i(e.error).code===`XCTEST_RECORDED_FAILURE`&&xe(e.session,{skipPendingPostGestureStabilization:!1})}function Qe(e){return e===`click`||e===`press`}function $e(e){if(!q(e))return;let t=Date.now()-e.createdAt;if(t<0||t>5e3){C({level:`debug`,phase:`ios_tap_failure_corroboration_stale_baseline`,data:{ageMs:t}});return}let n=rt(e.presentationKey);if(n){if(n.raw){C({level:`debug`,phase:`ios_tap_failure_corroboration_raw_baseline`,data:{presentationKey:e.presentationKey}});return}return{snapshot:e,presentation:n}}}async function et(e,t,n){try{return await e.captureSnapshotForSession(e.session,ct(e.flags,n),e.sessionStore,e.contextFromFlags,{interactiveOnly:n?.interactiveOnly??!0,...t===`private-ax`?{preferredBackend:`private-ax`}:{},signal:se(e.requestId)})}catch(t){C({level:`debug`,phase:`ios_tap_failure_corroboration_capture_failed`,data:{command:e.command,error:t instanceof Error?t.message:String(t)}});return}}function tt(e,t,n){let r=e.snapshotQuality?.backend,i=t.snapshotQuality?.backend;return!r||r!==i?(C({level:`debug`,phase:`ios_tap_failure_corroboration_backend_mismatch`,data:{command:n,baselineBackend:r,afterBackend:i}}),!1):e.presentationKey===t.presentationKey?!0:(C({level:`debug`,phase:`ios_tap_failure_corroboration_scope_mismatch`,data:{command:n,baselinePresentationKey:e.presentationKey,afterPresentationKey:t.presentationKey}}),!1)}function nt(e,t,n){if(!q(t))return;let r=S(e.nodes),i=S(t.nodes);if(r.digest!==i.digest)return C({level:`warn`,phase:`ios_tap_failure_corroborated`,data:{command:n,beforeNodeCount:r.nodeCount,afterNodeCount:i.nodeCount}}),{warning:`XCTest reported the tap as failed, but a same-scope post-action accessibility capture changed; treating the tap as landed. Observe the current screen before issuing another tap.`}}function q(e){return!!(e&&e.nodes.length>0&&!ne(e.snapshotQuality))}function rt(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}return it(t)}function it(e){let t=at(e);if(!(!t||typeof t.interactiveOnly!=`boolean`||typeof t.raw!=`boolean`)&&!(!ot(t.depth)||!st(t.scope)))return{interactiveOnly:t.interactiveOnly,...typeof t.depth==`number`?{depth:t.depth}:{},...typeof t.scope==`string`?{scope:t.scope}:{},raw:t.raw}}function at(e){return typeof e==`object`&&e?e:void 0}function ot(e){return e==null||typeof e==`number`}function st(e){return e==null||typeof e==`string`}function ct(e,t){if(!(!e&&!t))return{...e??{},out:void 0,...t?{snapshotDepth:t.depth,snapshotScope:t.scope,snapshotRaw:t.raw}:{}}}function lt(e){return e.kind===`selector`?{selector:e.selector}:e.kind===`ref`?{ref:e.ref.startsWith(`@`)?e.ref.slice(1):e.ref}:{}}async function ut(e){switch(e.req.command){case`press`:return await J(e,`press`);case`click`:return await J(e,`click`);case`longpress`:return await J(e,`longpress`);case`fill`:return await Ct(e);default:return null}}async function J(e,t){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return w();let o=t===`click`?`click`:t,s=t===`longpress`?`longpress`:`press`,c=z(a,o);if(c)return c;let l=E(s,a.device);if(l)return l;let u=j(t,n.flags);if(u)return u;let p=f(n.flags),m=ee(p);if(t!==`longpress`&&p!==`primary`){let e=d({commandLabel:o,platform:te(a.device),button:p,count:n.flags?.count,intervalMs:n.flags?.intervalMs,holdMs:n.flags?.holdMs,jitterPx:n.flags?.jitterPx,doubleTap:n.flags?.doubleTap});if(e)return D(e.code,e.message,e.details)}let h=t===`longpress`?De(n.positionals??[]):_e(n.positionals??[],o);if(!h.ok)return h.response;let g=h.target.kind===`ref`&&n.internal?.findResolvedTarget!==!0?k({session:a,ref:h.target.ref,mintedGeneration:h.refGeneration}):void 0,_;if(h.target.kind===`ref`){let r=e.refSnapshotFlagGuardResponse(t===`longpress`?`longpress`:`press`,n.flags);if(r)return r;let i=n.internal?.findResolvedTarget?null:L({session:a,ref:h.target.ref,mintedGeneration:h.refGeneration,staleRefsWarning:g});if(i)return i;_=await Q(e,a)}let v=n.internal?.replayTargetGuard,y=v?null:mt({session:a,commandLabel:o,target:h.target,flags:n.flags});if(y){let t=await _t(e,a,y);if(t)return t}let b=t===`longpress`?h.durationMs:void 0;return await Z(e,{androidFreshnessBaseline:_,refContext:h.target.kind===`ref`&&n.internal?.findResolvedTarget!==!0?{ref:h.target.ref,mintedGeneration:h.refGeneration,staleRefsWarning:g}:void 0,iosTapCorroboration:{target:h.target,extra:t===`longpress`?{...b===void 0?{}:{durationMs:b},gesture:`longpress`}:m},run:async e=>await dt({runtime:e,command:t,target:h.target,sessionName:r,requestId:n.meta?.requestId,clickButton:p,flags:n.flags,durationMs:b,expectedResolvedTarget:v}),afterRun:async e=>{if(!a.lease?.leaseProvider)return await be(a,Ee(h.target,e))},buildPayloads:async r=>{let i=pt(r);return await ft({params:e,session:a,result:r,staleRefsWarning:g,publicData:Y({session:a,command:t===`longpress`?void 0:t,flags:n.flags,data:r.backendResult}),extra:t===`longpress`?{...i===void 0?{}:{durationMs:i},gesture:`longpress`}:m})}})}async function dt(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o,expectedResolvedTarget:s}=e,c=M(o);if(n===`longpress`)return await t.interactions.longPress(r,{session:i,requestId:a,durationMs:e.durationMs,settle:c,expectedResolvedTarget:s});let l={session:i,requestId:a,button:e.clickButton,count:o?.count,intervalMs:o?.intervalMs,holdMs:o?.holdMs,jitterPx:o?.jitterPx,doubleTap:o?.doubleTap,verify:o?.verify,settle:c,expectedResolvedTarget:s};return n===`click`?await t.interactions.click(r,l):await t.interactions.press(r,l)}async function ft(e){let{params:t,session:n,result:r,publicData:i,extra:a}=e,o=r.kind===`point`?await ke({session:n,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession}):I(n.snapshot?.nodes??[]);return H({source:{kind:`runtime`,result:r,publicData:i},referenceFrame:o,extra:a,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:A(n,r.settle)})}function pt(e){return`durationMs`in e?e.durationMs:void 0}function mt(e){let{session:t,commandLabel:n,target:r,flags:i}=e;return n!==`click`||r.kind!==`selector`||t.recordSession||gt(i)||h(n)&&i?.verify===!0||_(n)&&i?.settle===!0?null:ht(t,r.selector,i)}function ht(e,t,n){let r=ve({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},...n?.maestro?.expectedTapPoint?{expectedPoint:n.maestro.expectedTapPoint}:{}}:null}function gt(e){return e?.count!==void 0||e?.intervalMs!==void 0||e?.holdMs!==void 0||e?.jitterPx!==void 0||e?.doubleTap!==void 0||e?.clickButton!==void 0&&e.clickButton!==`primary`}async function _t(e,t,n){return await vt({params:e,session:t,selector:n,command:`press`,positionals:[],extra:{selector:n.raw},fallbackPhase:`ios_direct_selector_tap_fallback`})}async function vt(t){let{params:n,session:r,selector:i,command:a,positionals:o,extra:s,fallbackPhase:c}=t,l=Date.now();fe(r);try{let e=await le(r.device,a,o,n.req.flags?.out,{...n.contextFromFlags(n.req.flags,r.appBundleId,r.trace?.outPath),directElementSelector:i,surface:r.surface})??{},t=Date.now(),c=xt(e),u=Y({session:r,command:bt(n.req.command,a),flags:n.req.flags,data:e}),d=X(i.allowNonHittableCoordinateFallback===!0,e),{result:f,responseData:p}=H({source:{kind:`runner-payload`,targetKind:`selector`,data:e,publicData:u,point:c,maestroCoordinateFallbackDispatched:d.used},referenceFrame:St(e),extra:{...s,...d.extra}});return F({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??[],retryPositionals:Mt(c),flags:n.req.flags,result:f,responseData:p,actionStartedAt:l,actionFinishedAt:t})}catch(t){return await yt({error:t,handlerParams:n,session:r,extra:s,positionals:o,actionStartedAt:l})||(Se(t,{delegateSemanticFailures:i.allowNonHittableCoordinateFallback!==!0})?(C({level:`debug`,phase:c,data:{selector:i.raw,error:t instanceof Error?t.message:String(t)}}),null):{ok:!1,error:e(t)})}}async function yt(e){let{error:t,handlerParams:n,session:r,extra:i,positionals:a,actionStartedAt:o}=e,s=await K({error:t,command:n.req.command,requestId:n.req.meta?.requestId,flags:n.req.flags,session:r,sessionStore:n.sessionStore,contextFromFlags:n.contextFromFlags,captureSnapshotForSession:n.captureSnapshotForSession});if(!s)return;let{result:c,responseData:l}=V({targetKind:`selector`,warning:s.warning,resolution:{source:`direct-ios`,kind:`not-observed`},extra:i});return F({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??a,flags:n.req.flags,result:c,responseData:l,scheduleInteractionOutcomeRetry:!1,actionStartedAt:o,actionFinishedAt:Date.now()})}function Y(e){let t=b(e.session.device.platform)?Fe(e.data):e.data;return e.command?je({command:e.command,input:e.flags,data:t}):t}function bt(e,t){return e===`click`||e===`press`||e===`fill`?e:t}function X(e,t){if(!e)return{used:!1,extra:{}};let n=t?.maestroNonHittableCoordinateFallbackUsed===!0;return{used:n,extra:{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:n,...n?{maestroFallbackReason:`non-hittable-coordinate`}:{}}}}function xt(e){let t=typeof e.x==`number`?e.x:void 0,n=typeof e.y==`number`?e.y:void 0;return t!==void 0&&n!==void 0?{x:t,y:n}:{x:0,y:0}}function St(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}async function Ct(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i){let e=z(i,`fill`);if(e)return e;let t=E(`fill`,i.device);if(t)return t}if(!i)return w();Ie({session:i,flags:t.flags,replayPlanStep:t.internal?.replayPlanStep===!0});let a=j(`fill`,t.flags);if(a)return a;let o=ye(t.positionals??[]);if(!o.ok)return o.response;let s=await wt(e,i,o.target,o.refGeneration);if(s.response)return s.response;let{staleRefsWarning:c}=s,l=t.internal?.replayTargetGuard;return await Z(e,{refContext:o.target.kind===`ref`&&t.internal?.findResolvedTarget!==!0?{ref:o.target.ref,mintedGeneration:o.refGeneration,staleRefsWarning:c}:void 0,run:async e=>await e.interactions.fill(o.target,o.text,{session:n,requestId:t.meta?.requestId,delayMs:t.flags?.delayMs,allowNonHittableCoordinateFallback:t.flags?.maestro?.allowNonHittableCoordinateFallback,verify:t.flags?.verify,settle:M(t.flags),expectedResolvedTarget:l}),buildPayloads:e=>Tt({session:i,result:e,text:o.text,flags:t.flags,staleRefsWarning:c})})}async function wt(e,t,n,r){if(n.kind!==`ref`)return{};let i=e.req.internal?.findResolvedTarget===!0?void 0:k({session:t,ref:n.ref,mintedGeneration:r}),a=e.refSnapshotFlagGuardResponse(`fill`,e.req.flags);if(a)return{response:a,staleRefsWarning:i};let o=e.req.internal?.findResolvedTarget?null:L({session:t,ref:n.ref,mintedGeneration:r,staleRefsWarning:i});return o?{response:o,staleRefsWarning:i}:(await Q(e,t),{staleRefsWarning:i})}function Tt(e){let{session:t,result:n}=e,r=X(e.flags?.maestro?.allowNonHittableCoordinateFallback===!0,n.backendResult),i=n.kind===`point`?void 0:I(t.snapshot?.nodes??[]);return H({source:{kind:`runtime`,result:n,publicData:Y({session:t,command:`fill`,flags:e.flags,data:n.backendResult}),maestroCoordinateFallbackDispatched:r.used},referenceFrame:i,extra:{text:e.text,...r.extra},staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:A(t,n.settle)})}async function Z(e,t){let n=e.sessionStore.get(e.sessionName);if(!n)return w();let r=N(e),a=Date.now();try{let i,o=await kt(n,e.req.command,{refContext:t.refContext},async()=>{let e=await t.run(r);return i=await t.afterRun?.(e),e});if(o.aborted)return o.response;let{readiness:s,runtimeResult:c}=o,l=Date.now(),{result:u,responseData:d,recordedTarget:f}=await t.buildPayloads(c),p=[...s.status===`recovered`?[s.warning]:[],...i?[i]:[]];if(p.length>0){let e=[...typeof d.warning==`string`?[d.warning]:[],...p].join(` `);u.warning=e,d.warning=e}return F({session:n,sessionStore:e.sessionStore,command:e.req.command,positionals:e.req.positionals??[],retryPositionals:jt(e.req.command,c),flags:e.req.flags,result:u,responseData:d,recordedTarget:f,actionStartedAt:a,actionFinishedAt:l,androidFreshnessBaseline:t.androidFreshnessBaseline})}catch(r){let o=i(r);if(Ce(o))throw o;return await Et({error:r,handlerParams:e,session:n,target:t.iosTapCorroboration?.target,extra:t.iosTapCorroboration?.extra,actionStartedAt:a,androidFreshnessBaseline:t.androidFreshnessBaseline})||At(r)}}async function Et(e){if(!e.target)return;let t=ae(e.error);if(!t&&e.session.recordSession)return;let n=await K({error:e.error,command:e.handlerParams.req.command,requestId:e.handlerParams.req.meta?.requestId,flags:e.handlerParams.req.flags,session:e.session,sessionStore:e.handlerParams.sessionStore,contextFromFlags:e.handlerParams.contextFromFlags,captureSnapshotForSession:e.handlerParams.captureSnapshotForSession});if(!n)return;let r=Dt({target:e.target,resolvedTarget:t,warning:n.warning,referenceFrame:I(e.session.snapshot?.nodes??[]),extra:e.extra});return F({session:e.session,sessionStore:e.handlerParams.sessionStore,command:e.handlerParams.req.command,positionals:e.handlerParams.req.positionals??[],flags:e.handlerParams.req.flags,result:r.result,responseData:r.responseData,recordedTarget:r.recordedTarget,scheduleInteractionOutcomeRetry:!1,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),androidFreshnessBaseline:e.androidFreshnessBaseline})}function Dt(e){return e.resolvedTarget?H({source:{kind:`runtime`,result:{...e.resolvedTarget,warning:e.warning}},referenceFrame:e.referenceFrame,extra:e.extra}):V({targetKind:e.target.kind,point:Ot(e.target),warning:e.warning,referenceFrame:e.referenceFrame,extra:{...lt(e.target),...e.extra??{}}})}function Ot(e){return e.kind===`point`?{x:e.x,y:e.y}:void 0}async function kt(e,t,n,r){if(e.lease?.leaseProvider)return{aborted:!1,readiness:{status:`clear`},runtimeResult:await r()};let i=await O({session:e,command:t,phase:`before-command`});if(n.refContext&&i.status===`recovered`){let t=L({session:e,ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration,staleRefsWarning:n.refContext.staleRefsWarning});if(t)return{aborted:!0,response:t}}let a=await r();return await O({session:e,command:t,phase:`after-command`}),{aborted:!1,readiness:i,runtimeResult:a}}async function Q(e,t){if(!he(t))return;let n=t.snapshot?.comparisonSafe===!0?t.snapshot:void 0;try{await e.captureSnapshotForSession(t,e.req.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:!0,androidFreshnessMode:`ref-refresh`})}catch(t){C({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function At(t){return{ok:!1,error:e(t)}}function jt(e,t){if(!(t.kind===`ref`&&!t.node)&&(e===`click`||e===`press`))return t.point?Mt(t.point):void 0}function Mt(e){return[String(e.x),String(e.y)]}function $(e,t={}){let n=typeof t.executionProfile==`string`?t.executionProfile:void 0;return{kind:e.kind,durationMs:e.durationMs,pointerCount:e.pointerCount,from:e.from,to:e.to,...e.kind===`drag`?{targets:e.targets}:{},...e.backendResult??{},...t,...n?{timing:{executionProfile:n,gestureDurationMs:e.durationMs}}:{},message:e.message}}async function Nt(e){return await zt(e,`gesture`,async t=>Pt(e,t))}async function Pt(e,t){let n=p(e.req.input),r=Vt(n,t);return r.intent===`pan`&&e.req.internal?.gestureExecutionProfile&&(r.executionProfile=e.req.internal.gestureExecutionProfile),T(r,t.device),It(n,r,await Ft(Rt(e),{session:e.sessionName,requestId:e.req.meta?.requestId},r,e.req.internal),e.req.flags)}async function Ft(e,t,n,r){if(n.intent!==`drag`)return await e.interactions.gesture({...t,gesture:n});let i=r?.replayTargetGuards??(r?.replayTargetGuard?{source:r.replayTargetGuard}:void 0);return await e.interactions.gesture({...t,gesture:n,...i?{expectedResolvedTargets:i}:{}})}function It(e,t,n,r){let i=n.kind===`drag`?n.recording:void 0,a=i?.sourceTarget,o=i?.destinationTarget;return{positionals:Ut(e,i),flags:Xt(e,r),responseData:$(n,{executionProfile:Bt(t)}),...e.kind===`pinch`?{recordingResultExtra:{scale:e.scale}}:a?{recordingResultExtra:{selectorChain:a.selectorChain}}:{},...a&&o?{recordedTargets:{source:{node:a.node,preActionNodes:a.preActionNodes},destination:{node:o.node,preActionNodes:o.preActionNodes}}}:{}}}async function Lt(e){return await zt(e,`swipe`,async t=>{let n=Wt(e.req.input);T(l(n).gesture,t.device);let r=n.count??1,i=n.pauseMs??0,a=n.pattern??`one-way`,o=await Jt(Rt(e),e,n,r,i,a);return{positionals:qt(n),flags:e.req.flags,responseData:$(o,{from:n.from,to:n.to,x1:n.from.x,y1:n.from.y,x2:n.to.x,y2:n.to.y,effectiveDurationMs:o.durationMs,timingMode:`direct`,executionProfile:`endpoint-hold`,count:r,pauseMs:i,pattern:a})}})}function Rt(e){return N({...e,pairedGestureViewport:e.req.internal?.gestureViewport})}async function zt(t,n,r){let i=t.sessionStore.get(t.sessionName);if(!i)return w();let a=Date.now();try{let e=ce(i.device),o=e?{status:`clear`}:await O({session:i,command:n,phase:`before-command`}),s=await r(i);e||await O({session:i,command:n,phase:`after-command`});let c={...s.responseData};return o.status===`recovered`&&(c.warning=`${typeof c.warning==`string`?`${c.warning} `:``}${o.warning}`),F({session:i,sessionStore:t.sessionStore,command:n,actionCommand:n,positionals:s.positionals,flags:s.flags,result:{...c,...s.recordingResultExtra??{}},responseData:c,recordedTargets:s.recordedTargets,actionStartedAt:a,actionFinishedAt:Date.now()})}catch(t){return{ok:!1,error:e(t)}}}function Bt(e){if(e.intent===`fling`)return`endpoint-hold`;if(e.intent===`pan`)return e.executionProfile??`timed-pan`;if(e.intent===`drag`)return`timed-pan`}function Vt(e,t){let n=c(e);return n.intent===`drag`?{...n,source:Ht(n.source,t),destination:Ht(n.destination,t)}:n}function Ht(e,i){if(!e.startsWith(`@`))return e;let a=n(e);if(!a)throw new t(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:r});return R({session:i,ref:a.base,mintedGeneration:a.generation}),a.base}function Ut(e,t){return e.kind!==`drag`||!t?o(e):o({...e,source:t.sourceSelector??e.source,destination:t.destinationSelector??e.destination})}function Wt(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`swipe requires structured object input`);s(e);let n=e,r=n.pattern;if(r!==void 0&&r!==`one-way`&&r!==`ping-pong`)throw new t(`INVALID_ARGS`,`swipe pattern must be one-way or ping-pong`);let i={from:Kt(n.from,`swipe from`),to:Kt(n.to,`swipe to`),count:g(n,`count`,{min:1,max:200}),pauseMs:g(n,`pauseMs`,{min:0,max:u}),pattern:r};return Gt(i),i}function Gt(e){let n=e.count??1,r=e.pauseMs??0,i=n*100+Math.max(0,n-1)*r;if(!(i<=6e4))throw new t(`INVALID_ARGS`,`Swipe series must fit within ${a}ms.`,{count:n,pauseMs:r,gestureDurationMs:100,scheduledDurationMs:i,hint:`Reduce --count or --pause-ms.`})}function Kt(e,n){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`${n} must be a point`);let r=e;if(typeof r.x!=`number`||!Number.isFinite(r.x))throw new t(`INVALID_ARGS`,`${n} x must be finite`);if(typeof r.y!=`number`||!Number.isFinite(r.y))throw new t(`INVALID_ARGS`,`${n} y must be finite`);return{x:r.x,y:r.y}}function qt(e){return[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y)]}async function Jt(e,t,n,r,i,a){let o;for(let s=0;s<r;s+=1){let c=l(Yt(n,a,s));o=await e.interactions.gesture({session:t.sessionName,requestId:t.req.meta?.requestId,gesture:c.gesture}),i>0&&s+1<r&&await oe(i)}if(!o)throw Error(`Swipe orchestration did not execute a gesture.`);return o}function Yt(e,t,n){return t===`ping-pong`&&n%2==1?{...e,from:e.to,to:e.from}:e}function Xt(e,t){return e.kind!==`pan`||e.pointerCount===void 0?t:{...t,pointerCount:e.pointerCount}}async function Zt(e){let t=await ut({...e,captureSnapshotForSession:P,refSnapshotFlagGuardResponse:ge});if(t)return t;switch(e.req.command){case x.gesture:return await Nt({...e,captureSnapshotForSession:P});case x.swipe:return await Lt({...e,captureSnapshotForSession:P});case x.type:return await Qt({...e,captureSnapshotForSession:P});case`get`:return await we(e);case`is`:return await Te(e);default:return null}}async function Qt(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);return r?E(x.type,r.device)||await $t(r)||await en(e,r):w()}async function $t(e){return e.device.platform===`android`&&e.recording&&(await pe({session:e})).status===`failed`?D(`COMMAND_FAILED`,`Android system dialog blocked the recording session`):null}async function en(t,n){let{req:r,sessionName:i,sessionStore:a}=t,o=(r.positionals??[]).join(` `),s=N(t),c=Date.now();try{let e=await O({session:n,command:r.command,phase:`before-command`}),t=await s.interactions.typeText(o,{session:i,requestId:r.meta?.requestId,delayMs:r.flags?.delayMs});await O({session:n,command:r.command,phase:`after-command`});let l=Date.now(),u={...t.backendResult??{},text:t.text,delayMs:t.delayMs,...re(t.message??`Typed ${Array.from(t.text).length} chars`)};return e.status===`recovered`&&(u.warning=e.warning),F({session:n,sessionStore:a,command:r.command,positionals:r.positionals??[],flags:r.flags,result:u,responseData:u,actionStartedAt:c,actionFinishedAt:l})}catch(t){return{ok:!1,error:e(t)}}}export{Zt as handleInteractionCommands};
|
|
1
|
+
import{S as e,_ as t,h as n,s as r,v as i}from"./sdk-contracts.js";import{G as a,K as o,V as s,X as c,dt as l,et as u,ft as d,nt as f,q as p,ut as ee}from"./version.js";import{C as m,Ht as h,_ as g,g as _,v}from"./sdk-batch-runner.js";import{_ as te,l as y,s as b}from"./sdk-device.js";import{Xt as x,at as S,gn as C,kt as ne,z as re}from"./prepare-kind.js";import{F as ie,X as w}from"./screenshot-result.js";import{i as ae}from"./runtime.js";import{j as T}from"./sdk-android-adb.js";import{t as oe}from"./timeouts.js";import{N as se}from"./runner-disposal.js";import{E as ce,c as E,d as D,o as O,s as k,t as le}from"./dispatch.js";import{Gt as A,Jt as j,Kt as ue,Xt as M,Yt as de,en as fe,in as pe,pn as me,rn as he,tn as ge}from"./internal/daemon.js";import{S as N,_ as _e,b as P,c as ve,d as ye,f as be,g as xe,h as Se,l as Ce,m as we,n as Te,p as Ee,r as De,v as Oe,x as ke}from"./selector-runtime.js";import{t as F}from"./interaction-runtime.js";import{t as I}from"./interaction-snapshot.js";import{n as Ae,r as L,t as R}from"./interaction-touch-reference-frame.js";const je=new Set(v());function Me(e){return Pe({fields:Ne(e.command),input:e.input??{},data:e.data,controlledFields:je})}function Ne(e){let t=m(e);if(!t)throw Error(`Missing response data transform descriptor for ${e}`);return t.fields}function Pe(e){let t=Object.fromEntries(Object.entries(e.data??{}).filter(([t])=>!e.controlledFields.has(t)));for(let[n,r]of Object.entries(e.fields)){let i=e.input[n]===void 0?r.defaultValue:e.input[n];if(i===void 0||r.omitDefault===!0&&i===r.defaultValue){delete t[n];continue}t[n]=i}return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}const Fe=new Set([`currentUptimeMs`,`gestureEndUptimeMs`,`gestureStartUptimeMs`,`sequenceResults`]);function Ie(e){if(e)return Object.fromEntries(Object.entries(e).filter(([e])=>!Fe.has(e)))}function Le(e){let n=e.flags?.recordAs;if(n!==void 0){if(ie(n),e.flags?.noRecord)throw new t(`INVALID_ARGS`,`fill --record-as cannot be combined with --no-record because no script step would be published.`);if(!w(e.session)&&!e.replayPlanStep)throw new t(`INVALID_ARGS`,`fill --record-as requires an armed script recording. Start a fresh session with open --save-script, then retry the fill.`)}}function z(e){try{return B(e),null}catch(e){if(e instanceof t)return O(e.code,e.message,e.details);throw e}}function B(e){let n=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref,r=fe({session:e.session,refBody:n,mintedGeneration:e.mintedGeneration});if(r.admitted)return;let i=pe(e.session);throw new t(`COMMAND_FAILED`,ze(r.reason,e.ref),{reason:r.reason,ref:e.ref,currentGeneration:he(e.session),scope:i===`all`?`all`:Array.from(i),...e.mintedGeneration===void 0?{}:{mintedGeneration:e.mintedGeneration},hint:e.staleRefsWarning??Re})}const Re=`Capture a fresh interactive snapshot (snapshot -i) or use a stable selector, then retry.`;function ze(e,t){switch(e){case`ref_frame_expired`:return`Ref ${t} belongs to an expired ref frame — a device action since the snapshot invalidated it`;case`ref_generation_mismatch`:return`Ref ${t} was minted from a superseded snapshot generation`;case`plain_ref_requires_complete_frame`:return`Ref ${t} needs a complete snapshot — the current frame only authorizes its emitted refs`;case`ref_not_issued`:return`Ref ${t} was not issued by the current ref frame`}}function V(e,t){return!y(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:O(`UNSUPPORTED_OPERATION`,`${t} is not supported on macOS ${e.surface} sessions yet. Open an app session to act, or use the ${e.surface} surface to inspect.`)}const Be={source:`direct-ios`,kind:`not-observed`};function H(e,t){if(!Ve(e))return t;let{resolution:n,...r}=t;return r}function Ve(e){return e.maestroCoordinateFallbackDispatched===!0}function U(e){return W({source:{kind:`corroborated-tap`,targetKind:e.targetKind,data:{warning:e.warning},publicData:{warning:e.warning},point:e.point,resolution:e.resolution},referenceFrame:e.referenceFrame,extra:e.extra})}function W(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`||t.kind===`corroborated-tap`){let e={targetKind:t.targetKind,...H(t,{resolution:t.kind===`runner-payload`?Be:t.resolution}),...r??{}};return{result:K({data:t.data,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e}),responseData:K({data:t.publicData,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e})}}let{result:i}=t,a={targetKind:i.kind,...H(t,Se(i)),...We(i.settle,e.settleRefsGeneration),...r??{}},o=K({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:{...a,...Ue(i)}}),s=K({data:t.publicData,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:a}),c=Ge(`warning`in i?i.warning:void 0,e.staleRefsWarning);return c&&(o.warning=c,s.warning=c),{result:o,responseData:s,...He(i)}}function He(e){let t=G(e)?.node??(`node`in e?e.node:void 0),n=`preActionNodes`in e?e.preActionNodes:void 0;return t&&n?{recordedTarget:{node:t,preActionNodes:n}}:{}}function Ue(e){let t=G(e);return t?{selectorChain:t.selectorChain,refLabel:t.refLabel}:{}}function G(e){return`recordingTarget`in e?e.recordingTarget:void 0}function We(e,t){return!e?.diff||t===void 0?{}:{settle:{...e,refsGeneration:t}}}function Ge(e,t){return t?e?`${e} ${t}`:t:e}function K(e){let{data:t,fallbackX:n,fallbackY:r,referenceFrame:i,extra:a}=e,o=qe(a,n,r)??(typeof t?.message==`string`?t.message:void 0);return Ke({...t??{},...n===void 0||r===void 0?{}:{x:n,y:r},...i??{},...a??{},...C(o)})}function Ke(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function qe(e,t,n){let r=q(e,`text`);if(r!==void 0)return`Filled ${Array.from(r).length} chars`;let i=Je(t,n),a=Ye(e);if(a)return Ze(a,e??{},i);if(i)return Xe(e,i)}function q(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Je(e,t){return e===void 0||t===void 0?``:` (${e}, ${t})`}function Ye(e){let t=q(e,`ref`);return t===void 0?q(e,`selector`):`@${t}`}function Xe(e,t){return e?.gesture===`longpress`?`Long pressed${t}`:`Tapped${t}`}function Ze(e,t,n){let r=typeof t.button==`string`?t.button:void 0;return t.gesture===`longpress`?`Long pressed ${e}${n}`:r&&r!==`primary`?`Clicked ${r} ${e}${n}`:`Tapped ${e}${n}`}async function J(e){if(!Qe(e))return;let t=et(e.session.snapshot);if(!t)return;let n=await tt(e,t.snapshot.snapshotQuality?.backend,t.presentation);if(!(!n||!nt(t.snapshot,n,e.command)))return rt(t.snapshot,n,e.command)}function Qe(e){return $e(e.command)&&i(e.error).code===`XCTEST_RECORDED_FAILURE`&&be(e.session,{skipPendingPostGestureStabilization:!1})}function $e(e){return e===`click`||e===`press`}function et(e){if(!Y(e))return;let t=Date.now()-e.createdAt;if(t<0||t>15e3){T({level:`debug`,phase:`ios_tap_failure_corroboration_stale_baseline`,data:{ageMs:t}});return}let n=it(e.presentationKey);if(n){if(n.raw){T({level:`debug`,phase:`ios_tap_failure_corroboration_raw_baseline`,data:{presentationKey:e.presentationKey}});return}return{snapshot:e,presentation:n}}}async function tt(e,t,n){try{return await e.captureSnapshotForSession(e.session,lt(e.flags,n),e.sessionStore,e.contextFromFlags,{interactiveOnly:n?.interactiveOnly??!0,...t===`private-ax`?{preferredBackend:`private-ax`}:{},signal:se(e.requestId)})}catch(t){T({level:`debug`,phase:`ios_tap_failure_corroboration_capture_failed`,data:{command:e.command,error:t instanceof Error?t.message:String(t)}});return}}function nt(e,t,n){let r=e.snapshotQuality?.backend,i=t.snapshotQuality?.backend;return!r||r!==i?(T({level:`debug`,phase:`ios_tap_failure_corroboration_backend_mismatch`,data:{command:n,baselineBackend:r,afterBackend:i}}),!1):e.presentationKey===t.presentationKey?!0:(T({level:`debug`,phase:`ios_tap_failure_corroboration_scope_mismatch`,data:{command:n,baselinePresentationKey:e.presentationKey,afterPresentationKey:t.presentationKey}}),!1)}function rt(e,t,n){if(!Y(t))return;let r=S(e.nodes),i=S(t.nodes);if(r.digest!==i.digest)return T({level:`warn`,phase:`ios_tap_failure_corroborated`,data:{command:n,beforeNodeCount:r.nodeCount,afterNodeCount:i.nodeCount}}),{warning:`XCTest reported the tap as failed, but a same-scope post-action accessibility capture changed; treating the tap as landed. Observe the current screen before issuing another tap.`}}function Y(e){return!!(e&&e.nodes.length>0&&!re(e.snapshotQuality))}function it(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}return at(t)}function at(e){let t=ot(e);if(!(!t||typeof t.interactiveOnly!=`boolean`||typeof t.raw!=`boolean`)&&!(!st(t.depth)||!ct(t.scope)))return{interactiveOnly:t.interactiveOnly,...typeof t.depth==`number`?{depth:t.depth}:{},...typeof t.scope==`string`?{scope:t.scope}:{},raw:t.raw}}function ot(e){return typeof e==`object`&&e?e:void 0}function st(e){return e==null||typeof e==`number`}function ct(e){return e==null||typeof e==`string`}function lt(e,t){if(!(!e&&!t))return{...e??{},out:void 0,...t?{snapshotDepth:t.depth,snapshotScope:t.scope,snapshotRaw:t.raw}:{}}}function ut(e){return e.kind===`selector`?{selector:e.selector}:e.kind===`ref`?{ref:e.ref.startsWith(`@`)?e.ref.slice(1):e.ref}:{}}function dt(e,n){if(n.code!==`AMBIGUOUS_MATCH`)return n;let r=ne(n.details);return r.length===0||e.snapshotGeneration===void 0?n:(de(e,r),new t(n.code,n.message,{...n.details,refsGeneration:e.snapshotGeneration},n.cause))}async function ft(e){switch(e.req.command){case`press`:return await X(e,`press`);case`click`:return await X(e,`click`);case`longpress`:return await X(e,`longpress`);case`fill`:return await Et(e);default:return null}}async function X(e,t){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return k();let o=t===`click`?`click`:t,s=t===`longpress`?`longpress`:`press`,c=V(a,o);if(c)return c;let u=E(s,a.device);if(u)return u;let f=N(t,n.flags);if(f)return f;let p=d(n.flags),m=ee(p);if(t!==`longpress`&&p!==`primary`){let e=l({commandLabel:o,platform:te(a.device),button:p,count:n.flags?.count,intervalMs:n.flags?.intervalMs,holdMs:n.flags?.holdMs,jitterPx:n.flags?.jitterPx,doubleTap:n.flags?.doubleTap});if(e)return O(e.code,e.message,e.details)}let h=t===`longpress`?_e(n.positionals??[]):Oe(n.positionals??[],o);if(!h.ok)return h.response;let g=h.target.kind===`ref`&&n.internal?.findResolvedTarget===void 0?M({session:a,ref:h.target.ref,mintedGeneration:h.refGeneration}):void 0,_;if(h.target.kind===`ref`){let r=e.refSnapshotFlagGuardResponse(t===`longpress`?`longpress`:`press`,n.flags);if(r)return r;let i=n.internal?.findResolvedTarget?null:z({session:a,ref:h.target.ref,mintedGeneration:h.refGeneration,staleRefsWarning:g});if(i)return i;_=await Q(e,a)}let v=n.internal?.replayTargetGuard,y=v?null:gt({session:a,commandLabel:o,target:h.target,flags:n.flags});if(y){let t=await yt(e,a,y);if(t)return t}let b=t===`longpress`?h.durationMs:void 0;return await kt(e,{androidFreshnessBaseline:_,refContext:h.target.kind===`ref`&&n.internal?.findResolvedTarget===void 0?{ref:h.target.ref,mintedGeneration:h.refGeneration,staleRefsWarning:g}:void 0,iosTapCorroboration:{target:h.target,extra:t===`longpress`?{...b===void 0?{}:{durationMs:b},gesture:`longpress`}:m},run:async e=>await pt({runtime:e,command:t,target:h.target,sessionName:r,requestId:n.meta?.requestId,clickButton:p,flags:n.flags,durationMs:b,expectedResolvedTarget:v,preresolvedTarget:n.internal?.findResolvedTarget}),afterRun:async e=>{if(!a.lease?.leaseProvider)return await ve(a,we(h.target,e))},buildPayloads:async r=>{let i=ht(r);return await mt({params:e,session:a,result:r,staleRefsWarning:g,publicData:Z({session:a,command:t===`longpress`?void 0:t,flags:n.flags,data:r.backendResult}),extra:t===`longpress`?{...i===void 0?{}:{durationMs:i},gesture:`longpress`}:m})}})}async function pt(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o,expectedResolvedTarget:s}=e,c=P(o);if(n===`longpress`)return await t.interactions.longPress(r,{session:i,requestId:a,durationMs:e.durationMs,settle:c,expectedResolvedTarget:s});let l={session:i,requestId:a,button:e.clickButton,count:o?.count,intervalMs:o?.intervalMs,holdMs:o?.holdMs,jitterPx:o?.jitterPx,doubleTap:o?.doubleTap,verify:o?.verify,settle:c,expectedResolvedTarget:s,preresolvedTarget:e.preresolvedTarget};return n===`click`?await t.interactions.click(r,l):await t.interactions.press(r,l)}async function mt(e){let{params:t,session:n,result:r,publicData:i,extra:a}=e,o=r.kind===`point`?await Ae({session:n,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession}):R(n.snapshot?.nodes??[]);return W({source:{kind:`runtime`,result:r,publicData:i},referenceFrame:o,extra:a,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:j(n,r.settle)})}function ht(e){return`durationMs`in e?e.durationMs:void 0}function gt(e){let{session:t,commandLabel:n,target:r,flags:i}=e;return n!==`click`||r.kind!==`selector`||w(t)||vt(i)||g(n)&&i?.verify===!0||_(n)&&i?.settle===!0?null:_t(t,r.selector,i)}function _t(e,t,n){let r=Ee({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},...n?.maestro?.expectedTapPoint?{expectedPoint:n.maestro.expectedTapPoint}:{}}:null}function vt(e){return e?.count!==void 0||e?.intervalMs!==void 0||e?.holdMs!==void 0||e?.jitterPx!==void 0||e?.doubleTap!==void 0||e?.clickButton!==void 0&&e.clickButton!==`primary`}async function yt(e,t,n){return await bt({params:e,session:t,selector:n,command:`press`,positionals:[],extra:{selector:n.raw},fallbackPhase:`ios_direct_selector_tap_fallback`})}async function bt(t){let{params:n,session:r,selector:i,command:a,positionals:o,extra:s,fallbackPhase:c}=t,l=Date.now();ge(r);try{let e=await le(r.device,a,o,n.req.flags?.out,{...n.contextFromFlags(n.req.flags,r.appBundleId,r.trace?.outPath),directElementSelector:i,surface:r.surface})??{},t=Date.now(),c=wt(e),u=Z({session:r,command:St(n.req.command,a),flags:n.req.flags,data:e}),d=Ct(i.allowNonHittableCoordinateFallback===!0,e),{result:f,responseData:p}=W({source:{kind:`runner-payload`,targetKind:`selector`,data:e,publicData:u,point:c,maestroCoordinateFallbackDispatched:d.used},referenceFrame:Tt(e),extra:{...s,...d.extra}});return L({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??[],retryPositionals:It(c),flags:n.req.flags,result:f,responseData:p,actionStartedAt:l,actionFinishedAt:t})}catch(t){return await xt({error:t,handlerParams:n,session:r,extra:s,positionals:o,actionStartedAt:l})||(ye(t,{delegateSemanticFailures:i.allowNonHittableCoordinateFallback!==!0})?(T({level:`debug`,phase:c,data:{selector:i.raw,error:t instanceof Error?t.message:String(t)}}),null):{ok:!1,error:e(t)})}}async function xt(e){let{error:t,handlerParams:n,session:r,extra:i,positionals:a,actionStartedAt:o}=e,s=await J({error:t,command:n.req.command,requestId:n.req.meta?.requestId,flags:n.req.flags,session:r,sessionStore:n.sessionStore,contextFromFlags:n.contextFromFlags,captureSnapshotForSession:n.captureSnapshotForSession});if(!s)return;let{result:c,responseData:l}=U({targetKind:`selector`,warning:s.warning,resolution:{source:`direct-ios`,kind:`not-observed`},extra:i});return L({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??a,flags:n.req.flags,result:c,responseData:l,scheduleInteractionOutcomeRetry:!1,actionStartedAt:o,actionFinishedAt:Date.now()})}function Z(e){let t=b(e.session.device.platform)?Ie(e.data):e.data;return e.command?Me({command:e.command,input:e.flags,data:t}):t}function St(e,t){return e===`click`||e===`press`||e===`fill`?e:t}function Ct(e,t){if(!e)return{used:!1,extra:{}};let n=t?.maestroNonHittableCoordinateFallbackUsed===!0;return{used:n,extra:{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:n,...n?{maestroFallbackReason:`non-hittable-coordinate`}:{}}}}function wt(e){let t=typeof e.x==`number`?e.x:void 0,n=typeof e.y==`number`?e.y:void 0;return t!==void 0&&n!==void 0?{x:t,y:n}:{x:0,y:0}}function Tt(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}async function Et(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i){let e=V(i,`fill`);if(e)return e;let t=E(`fill`,i.device);if(t)return t}if(!i)return k();Le({session:i,flags:t.flags,replayPlanStep:t.internal?.replayPlanStep===!0});let a=N(`fill`,t.flags);if(a)return a;let o=xe(t.positionals??[]);if(!o.ok)return o.response;let s=await Dt(e,i,o.target,o.refGeneration);if(s.response)return s.response;let{staleRefsWarning:c}=s,l=t.internal?.replayTargetGuard;return await kt(e,{refContext:o.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0?{ref:o.target.ref,mintedGeneration:o.refGeneration,staleRefsWarning:c}:void 0,run:async e=>await e.interactions.fill(o.target,o.text,{session:n,requestId:t.meta?.requestId,delayMs:t.flags?.delayMs,allowNonHittableCoordinateFallback:t.flags?.maestro?.allowNonHittableCoordinateFallback,verify:t.flags?.verify,settle:P(t.flags),expectedResolvedTarget:l,preresolvedTarget:t.internal?.findResolvedTarget}),buildPayloads:e=>Ot({session:i,result:e,text:o.text,flags:t.flags,staleRefsWarning:c})})}async function Dt(e,t,n,r){if(n.kind!==`ref`)return{};let i=e.req.internal?.findResolvedTarget===void 0?M({session:t,ref:n.ref,mintedGeneration:r}):void 0,a=e.refSnapshotFlagGuardResponse(`fill`,e.req.flags);if(a)return{response:a,staleRefsWarning:i};let o=e.req.internal?.findResolvedTarget?null:z({session:t,ref:n.ref,mintedGeneration:r,staleRefsWarning:i});return o?{response:o,staleRefsWarning:i}:(await Q(e,t),{staleRefsWarning:i})}function Ot(e){let{session:t,result:n}=e,r=Ct(e.flags?.maestro?.allowNonHittableCoordinateFallback===!0,n.backendResult),i=n.kind===`point`?void 0:R(t.snapshot?.nodes??[]);return W({source:{kind:`runtime`,result:n,publicData:Z({session:t,command:`fill`,flags:e.flags,data:n.backendResult}),maestroCoordinateFallbackDispatched:r.used},referenceFrame:i,extra:{text:e.text,...r.extra},staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:j(t,n.settle)})}async function kt(e,t){let n=e.sessionStore.get(e.sessionName);if(!n)return k();let r=F(e),a=Date.now();try{let i,o=await Nt(n,e.req.command,{refContext:t.refContext},async()=>{let e=await t.run(r);return i=await t.afterRun?.(e),e});if(o.aborted)return o.response;let{readiness:s,runtimeResult:c}=o,l=Date.now(),{result:u,responseData:d,recordedTarget:f}=await t.buildPayloads(c),p=[...s.status===`recovered`?[s.warning]:[],...i?[i]:[]];if(p.length>0){let e=[...typeof d.warning==`string`?[d.warning]:[],...p].join(` `);u.warning=e,d.warning=e}return L({session:n,sessionStore:e.sessionStore,command:e.req.command,positionals:e.req.positionals??[],retryPositionals:Ft(e.req.command,c),flags:e.req.flags,result:u,responseData:d,recordedTarget:f,actionStartedAt:a,actionFinishedAt:l,androidFreshnessBaseline:t.androidFreshnessBaseline})}catch(r){let o=dt(n,i(r));if(Ce(o))throw o;return o.code===`AMBIGUOUS_MATCH`?Pt(o):await At({error:o,handlerParams:e,session:n,target:t.iosTapCorroboration?.target,extra:t.iosTapCorroboration?.extra,actionStartedAt:a,androidFreshnessBaseline:t.androidFreshnessBaseline})||Pt(o)}}async function At(e){if(!e.target)return;let t=ae(e.error);if(!t&&w(e.session))return;let n=await J({error:e.error,command:e.handlerParams.req.command,requestId:e.handlerParams.req.meta?.requestId,flags:e.handlerParams.req.flags,session:e.session,sessionStore:e.handlerParams.sessionStore,contextFromFlags:e.handlerParams.contextFromFlags,captureSnapshotForSession:e.handlerParams.captureSnapshotForSession});if(!n)return;let r=jt({target:e.target,resolvedTarget:t,warning:n.warning,referenceFrame:R(e.session.snapshot?.nodes??[]),extra:e.extra});return L({session:e.session,sessionStore:e.handlerParams.sessionStore,command:e.handlerParams.req.command,positionals:e.handlerParams.req.positionals??[],flags:e.handlerParams.req.flags,result:r.result,responseData:r.responseData,recordedTarget:r.recordedTarget,scheduleInteractionOutcomeRetry:!1,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),androidFreshnessBaseline:e.androidFreshnessBaseline})}function jt(e){return e.resolvedTarget?W({source:{kind:`runtime`,result:{...e.resolvedTarget,warning:e.warning}},referenceFrame:e.referenceFrame,extra:e.extra}):U({targetKind:e.target.kind,point:Mt(e.target),warning:e.warning,referenceFrame:e.referenceFrame,extra:{...ut(e.target),...e.extra??{}}})}function Mt(e){return e.kind===`point`?{x:e.x,y:e.y}:void 0}async function Nt(e,t,n,r){if(e.lease?.leaseProvider)return{aborted:!1,readiness:{status:`clear`},runtimeResult:await r()};let i=await A({session:e,command:t,phase:`before-command`});if(n.refContext&&i.status===`recovered`){let t=z({session:e,ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration,staleRefsWarning:n.refContext.staleRefsWarning});if(t)return{aborted:!0,response:t}}let a=await r();return await A({session:e,command:t,phase:`after-command`}),{aborted:!1,readiness:i,runtimeResult:a}}async function Q(e,t){if(!me(t))return;let n=t.snapshot?.comparisonSafe===!0?t.snapshot:void 0;try{await e.captureSnapshotForSession(t,e.req.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:!0,androidFreshnessMode:`ref-refresh`})}catch(t){T({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function Pt(t){return{ok:!1,error:e(t)}}function Ft(e,t){if(!(t.kind===`ref`&&!t.node)&&(e===`click`||e===`press`))return t.point?It(t.point):void 0}function It(e){return[String(e.x),String(e.y)]}function Lt(e,t={}){let n=typeof t.executionProfile==`string`?t.executionProfile:void 0;return{kind:e.kind,durationMs:e.durationMs,pointerCount:e.pointerCount,from:e.from,to:e.to,...e.kind===`drag`?{targets:e.targets}:{},...e.backendResult??{},...t,...n?{timing:{executionProfile:n,gestureDurationMs:e.durationMs}}:{},message:e.message}}async function Rt(e){return await Wt(e,`gesture`,async t=>zt(e,t))}async function zt(e,t){let n=c(e.req.input),r=Kt(n,t);return r.intent===`pan`&&e.req.internal?.gestureExecutionProfile&&(r.executionProfile=e.req.internal.gestureExecutionProfile),D(r,t.device),Vt(n,r,await Bt(Ut(e),{session:e.sessionName,requestId:e.req.meta?.requestId},r,e.req.internal),e.req.flags)}async function Bt(e,t,n,r){if(n.intent!==`drag`)return await e.interactions.gesture({...t,gesture:n});let i=r?.replayTargetGuards??(r?.replayTargetGuard?{source:r.replayTargetGuard}:void 0);return await e.interactions.gesture({...t,gesture:n,...i?{expectedResolvedTargets:i}:{}})}function Vt(e,t,n,r){let i=n.kind===`drag`?n.recording:void 0,a=i?.sourceTarget,o=i?.destinationTarget;return{positionals:Jt(e,i),flags:en(e,r),responseData:Lt(n,{executionProfile:Gt(t)}),...e.kind===`pinch`?{recordingResultExtra:{scale:e.scale}}:a?{recordingResultExtra:{selectorChain:a.selectorChain}}:{},...a&&o?{recordedTargets:{source:{node:a.node,preActionNodes:a.preActionNodes},destination:{node:o.node,preActionNodes:o.preActionNodes}}}:{}}}async function Ht(e){return await Wt(e,`swipe`,async t=>{let n=Yt(e.req.input);D(p(n).gesture,t.device);let r=n.count??1,i=n.pauseMs??0,a=n.pattern??`one-way`,o=await Qt(Ut(e),e,n,r,i,a);return{positionals:Zt(n),flags:e.req.flags,responseData:Lt(o,{from:n.from,to:n.to,x1:n.from.x,y1:n.from.y,x2:n.to.x,y2:n.to.y,effectiveDurationMs:o.durationMs,timingMode:`direct`,executionProfile:`endpoint-hold`,count:r,pauseMs:i,pattern:a})}})}function Ut(e){return F({...e,pairedGestureViewport:e.req.internal?.gestureViewport})}async function Wt(t,n,r){let i=t.sessionStore.get(t.sessionName);if(!i)return k();let a=Date.now();try{let e=ce(i.device),o=e?{status:`clear`}:await A({session:i,command:n,phase:`before-command`}),s=await r(i);e||await A({session:i,command:n,phase:`after-command`});let c={...s.responseData};return o.status===`recovered`&&(c.warning=`${typeof c.warning==`string`?`${c.warning} `:``}${o.warning}`),L({session:i,sessionStore:t.sessionStore,command:n,actionCommand:n,positionals:s.positionals,flags:s.flags,result:{...c,...s.recordingResultExtra??{}},responseData:c,recordedTargets:s.recordedTargets,actionStartedAt:a,actionFinishedAt:Date.now()})}catch(t){return{ok:!1,error:e(t)}}}function Gt(e){if(e.intent===`fling`)return`endpoint-hold`;if(e.intent===`pan`)return e.executionProfile??`timed-pan`;if(e.intent===`drag`)return`timed-pan`}function Kt(e,t){let n=o(e);return n.intent===`drag`?{...n,source:qt(n.source,t),destination:qt(n.destination,t)}:n}function qt(e,i){if(!e.startsWith(`@`))return e;let a=n(e);if(!a)throw new t(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:r});return B({session:i,ref:a.base,mintedGeneration:a.generation}),a.base}function Jt(e,t){return e.kind!==`drag`||!t?a(e):a({...e,source:t.sourceSelector??e.source,destination:t.destinationSelector??e.destination})}function Yt(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`swipe requires structured object input`);s(e);let n=e,r=n.pattern;if(r!==void 0&&r!==`one-way`&&r!==`ping-pong`)throw new t(`INVALID_ARGS`,`swipe pattern must be one-way or ping-pong`);let i={from:$(n.from,`swipe from`),to:$(n.to,`swipe to`),count:h(n,`count`,{min:1,max:200}),pauseMs:h(n,`pauseMs`,{min:0,max:u}),pattern:r};return Xt(i),i}function Xt(e){let n=e.count??1,r=e.pauseMs??0,i=n*100+Math.max(0,n-1)*r;if(!(i<=6e4))throw new t(`INVALID_ARGS`,`Swipe series must fit within ${f}ms.`,{count:n,pauseMs:r,gestureDurationMs:100,scheduledDurationMs:i,hint:`Reduce --count or --pause-ms.`})}function $(e,n){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`${n} must be a point`);let r=e;if(typeof r.x!=`number`||!Number.isFinite(r.x))throw new t(`INVALID_ARGS`,`${n} x must be finite`);if(typeof r.y!=`number`||!Number.isFinite(r.y))throw new t(`INVALID_ARGS`,`${n} y must be finite`);return{x:r.x,y:r.y}}function Zt(e){return[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y)]}async function Qt(e,t,n,r,i,a){let o;for(let s=0;s<r;s+=1){let c=p($t(n,a,s));o=await e.interactions.gesture({session:t.sessionName,requestId:t.req.meta?.requestId,gesture:c.gesture}),i>0&&s+1<r&&await oe(i)}if(!o)throw Error(`Swipe orchestration did not execute a gesture.`);return o}function $t(e,t,n){return t===`ping-pong`&&n%2==1?{...e,from:e.to,to:e.from}:e}function en(e,t){return e.kind!==`pan`||e.pointerCount===void 0?t:{...t,pointerCount:e.pointerCount}}async function tn(e){let t=await ft({...e,captureSnapshotForSession:I,refSnapshotFlagGuardResponse:ke});if(t)return t;switch(e.req.command){case x.gesture:return await Rt({...e,captureSnapshotForSession:I});case x.swipe:return await Ht({...e,captureSnapshotForSession:I});case x.type:return await nn({...e,captureSnapshotForSession:I});case`get`:return await Te(e);case`is`:return await De(e);default:return null}}async function nn(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);return r?E(x.type,r.device)||await rn(r)||await an(e,r):k()}async function rn(e){return e.device.platform===`android`&&e.screenRecording&&(await ue({session:e})).status===`failed`?O(`COMMAND_FAILED`,`Android system dialog blocked the recording session`):null}async function an(t,n){let{req:r,sessionName:i,sessionStore:a}=t,o=(r.positionals??[]).join(` `),s=F(t),c=Date.now();try{let e=await A({session:n,command:r.command,phase:`before-command`}),t=await s.interactions.typeText(o,{session:i,requestId:r.meta?.requestId,delayMs:r.flags?.delayMs});await A({session:n,command:r.command,phase:`after-command`});let l=Date.now(),u={...t.backendResult??{},text:t.text,delayMs:t.delayMs,...C(t.message??`Typed ${Array.from(t.text).length} chars`)};return e.status===`recovered`&&(u.warning=e.warning),L({session:n,sessionStore:a,command:r.command,positionals:r.positionals??[],flags:r.flags,result:u,responseData:u,actionStartedAt:c,actionFinishedAt:l})}catch(t){return{ok:!1,error:e(t)}}}export{tn as handleInteractionCommands};
|
package/dist/src/interactor.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{
|
|
2
|
-
`?void 0:`append`,appBundleId:t.appBundleId},n)),fillElementSelector:async(r,i,a)=>await _(e,{command:`type`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,text:i,delayMs:a,textEntryMode:`replace`,appBundleId:t.appBundleId},n),fill:async(r,i,a,o,s)=>await _(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 K(_,e,t,n,r,i),performGesture:async r=>await H(e,t,n,r),gestureViewport:async()=>B(await _(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}function R(e){let t=e.textEntryRoute;return z(t)?{textEntryRoute:t}:{}}function z(e){return typeof e==`string`&&
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";import{B as t,E as n,F as r,M as i,at as a,k as o,rt as s}from"./version.js";import{Y as c}from"./sdk-batch-runner.js";import{c as l,l as u,m as d}from"./sdk-device.js";import{V as f}from"./prepare-kind.js";import{t as p}from"./device.js";import{I as m}from"./sdk-android-adb.js";import{t as h}from"./method-scope.js";import{o as g}from"./helper.js";import{ct as _,ut as v}from"./internal/daemon.js";import{a as y,c as b,i as x,l as S,n as C,o as w,r as T,s as E}from"./apps.js";import{n as D,t as O}from"./runner-sequence.js";function k(e,t,n,r={includeDuration:!0}){let i=j(e.referenceWidth),o=j(e.referenceHeight);if(i===void 0||o===void 0)return M(e,{amount:n?.amount});let s=a({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:o});return M(e,{amount:n?.amount,pixels:s.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function A(e,t={includeDuration:!0}){return{...e?.amount===void 0?{}:{amount:e.amount},...e?.pixels===void 0?{}:{pixels:e.pixels},...t?.includeDuration&&e?.durationMs!==void 0?{durationMs:e.durationMs}:{}}}function j(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function M(e,t){let{x1:n,y1:r,x2:i,y2:a}=P(e),o=j(e.referenceWidth),s=j(e.referenceHeight),c=N(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 N(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 P(e){let t=j(e.x),n=j(e.y),r=j(e.x2),i=j(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 F(e,t,n,r,i,a){return k(await e(t,{command:`desktopScroll`,direction:i,...A(a,{includeDuration:!0}),appBundleId:n.appBundleId},r),i,a,{includeDuration:!0})}function I(e,t,n){return{command:`remotePress`,remoteButton:e,...n===void 0?{}:{durationMs:n},...t===void 0?{}:{appBundleId:t}}}function L(e){return e===`system`?`backSystem`:`backInApp`}function ee(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 _(e,W(e,t,r,i),n),tapElementSelector:async r=>await _(e,{command:`tap`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,...r.expectedPoint?{x:r.expectedPoint.x,y:r.expectedPoint.y}:{},...G(e)?{synthesized:!0}:{},appBundleId:t.appBundleId},n),doubleTap:async(r,i)=>{let a=await _(e,O([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return D(a),a},longPress:async(r,i,a)=>await _(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await _(e,W(e,t,r,i),n),type:async(r,i)=>R(await _(e,{command:`type`,text:r,delayMs:i,textEntryMode:r===`
|
|
2
|
+
`?void 0:`append`,appBundleId:t.appBundleId},n)),fillElementSelector:async(r,i,a)=>await _(e,{command:`type`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,text:i,delayMs:a,textEntryMode:`replace`,appBundleId:t.appBundleId},n),fill:async(r,i,a,o,s)=>await _(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 K(_,e,t,n,r,i),performGesture:async r=>await H(e,t,n,r),gestureViewport:async()=>B(await _(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}function R(e){let t=e.textEntryRoute;return z(t)?{textEntryRoute:t}:{}}function z(e){return typeof e==`string`&&r.includes(e)}function B(t){let n=V(t.x),r=V(t.y),i=V(t.x2),a=V(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 V(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}async function H(e,n,r,i){if(i.topology===`two`&&c(e,i.intent),i.topology===`single`&&u(e)){let{start:a,end:o}=t(i);return await _(e,{command:`drag`,x:a.x,y:a.y,x2:o.x,y2:o.y,durationMs:i.durationMs,appBundleId:n.appBundleId},r)}if(i.topology===`single`&&d(e)){let{start:a,end:o}=t(i);return await _(e,{command:`swipe`,direction:U(a,o),appBundleId:n.appBundleId},r)}return await _(e,{command:`gesture`,gesturePlan:i,appBundleId:n.appBundleId},r)}function U(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 W(e,t,n,r){return{command:`tap`,x:n,y:r,...G(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}function G(e){return l(e)&&!d(e)}async function K(e,t,n,r,a,c){return i(c?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${o}`}),d(t)?M(await e(t,I(a,n.appBundleId,c?.durationMs),r),{amount:c?.amount,durationMs:c?.durationMs}):(s(c??{}),u(t)?await F(e,t,n,r,a,c):k(await e(t,{command:`scroll`,direction:a,...A(c),appBundleId:n.appBundleId},r),a,c))}function q(t,r,i){if(t.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}=ee(t,r),s={open:(e,n)=>w(t,e,{appBundleId:n?.appBundleId,launchConsole:n?.launchConsole,launchArgs:n?.launchArgs,terminateRunningApp:n?.terminateRunningApp,url:n?.url,runnerOptions:o}),openDevice:()=>E(t),close:e=>y(t,e,o),screenshot:(e,n)=>Q(t,e,n,o),snapshot:async n=>{let r=te(await m(`snapshot_capture`,async()=>await _(t,{command:`snapshot`,appBundleId:n?.appBundleId,interactiveOnly:n?.interactiveOnly,preferredBackend:n?.preferredBackend,customActions:n?.customActions,depth:n?.depth,scope:n?.scope,raw:n?.raw},J(o,n?.signal)),{backend:`xctest`})),i=r.nodes??[];if(i.length===0&&t.kind===`simulator`)throw new e(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`);return{nodes:i,truncated:r.truncated??!1,backend:`xctest`,...r.quality?{quality:r.quality}:{},...!r.quality&&r.message?{warnings:[r.message]}:{}}},back:async e=>{if(d(t)){await _(t,I(`menu`,r.appBundleId),o);return}await _(t,{command:L(e),appBundleId:r.appBundleId},o)},home:async()=>{if(d(t)){await _(t,I(`home`,r.appBundleId),o);return}await _(t,{command:`home`,appBundleId:r.appBundleId},o)},setOrientation:async n=>{let i=Y(await _(t,{command:`rotate`,orientation:n,appBundleId:r.appBundleId},o));if(i!==n)throw new e(`COMMAND_FAILED`,`iOS runner observed ${i} after requesting ${n}`,{requestedOrientation:n,observedOrientation:i});return{orientation:i}},appSwitcher:async()=>{await _(t,{command:`appSwitcher`,appBundleId:r.appBundleId},o)},tvRemote:async(e,i)=>{await _(t,I(n(e),r.appBundleId,i),o)},readClipboard:()=>T(t),writeClipboard:e=>x(t,e),setSetting:(e,n,r,i)=>C(t,e,n,r,i),...a};return i?X(t,r,s,i):s}function J(e,t){return t?{...e,signal:e.signal?AbortSignal.any([e.signal,t]):t}:e}function Y(t){let n=t.orientation;if(typeof n==`string`&&p.includes(n))return n;throw new e(`COMMAND_FAILED`,`iOS runner returned an invalid orientation result`,{orientation:n})}function X(e,t,n,r){return h({...n,open:async()=>Z(`open`),openDevice:async()=>Z(`openDevice`),close:async()=>Z(`close`),screenshot:async()=>Z(`screenshot`),readClipboard:async()=>Z(`readClipboard`),writeClipboard:async()=>Z(`writeClipboard`),setSetting:async()=>Z(`setSetting`)},n=>v(r,{deviceId:e.id,requestId:t.requestId},n))}function Z(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 Q(e,t,n={},r){if($(e,n.surface)){await g(t,{surface:n.surface,fullscreen:n.fullscreen});return}if(n.captureBackend===`runner`){await b(e,t,n.appBundleId,n.fullscreen,r);return}await S(e,t,{appBundleId:n.appBundleId,pixelDensity:n.pixelDensity,fullscreen:n.fullscreen,runnerOptions:r,normalizeStatusBar:n.normalizeStatusBar,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck})}function $(e,t){return u(e)&&t!==void 0&&t!==`app`}function te(e){return{nodes:Array.isArray(e.nodes)?e.nodes:void 0,truncated:typeof e.truncated==`boolean`?e.truncated:void 0,quality:f(e.snapshotQuality),message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}export{q as createAppleInteractor};
|
package/dist/src/interactor2.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";import{D as t}from"./version.js";import{s as n}from"./sdk-batch-runner.js";import{h as r}from"./sdk-android-adb.js";import{t as i}from"./unsupported-interactor.js";import{t as a}from"./tool-provider3.js";const o={allowFailure:!0,timeoutMs:3e4};async function s(e,t){r(await a().launchApp(e.id,t,o),`Failed to launch Vega app ${t}`,{appName:t,deviceId:e.id})}async function c(e){r(await a().checkConnected(e.id,o),`Vega device is not connected`,{deviceId:e.id})}async function l(e,t){r(await a().terminateApp(e.id,t,o),`Failed to terminate Vega app ${t}`,{appName:t,deviceId:e.id})}async function u(e,n,i){let o=t(n);r(await a().pressRemote(e.id,o,i,{allowFailure:!0,timeoutMs:1e4+(i??0)}),`Failed to press Vega TV remote ${n}`,{button:n,deviceId:e.id})}const d=[{matches:(e,t)=>n(e)||!!t?.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{...i(`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/internal/bin.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=new Map([{alias:`long-press`,command:`longpress`},{alias:`metrics`,command:`perf`},{alias:`tap`,command:`press`},{alias:`launch`,command:`open`},{alias:`relaunch`,command:`open`,impliedFlags:[`relaunch`]}].map(e=>[e.alias,e]));function t(t){return e.get(t.toLowerCase())?.command??t}function n(t){return e.get(t.toLowerCase())}const r=process.argv.slice(2);i(r)||(r[0]===`mcp`&&!r.includes(`--help`)&&!r.includes(`-h`)?import(`../server.js`).then(({runAgentDeviceMcpServer:e})=>e()).catch(g):h(r));function i(e){return a(e)||o(e)||s(e)}function a(e){return e.length!==1||!m(e[0])?!1:(process.stdout.write(`0.20.
|
|
2
|
-
`),!0)}function o(e){return e.length===0?(import(`../cli-help.js`).then(async({buildUsageText:e})=>{process.stdout.write(`${e()}\n`);let{exitAfterFlush:t}=await import(`../process-exit.js`);await t(1)}).catch(g),!0):!1}function s(e){let n=c(e);return n===void 0?!1:(import(`../cli-help.js`).then(({buildCommandUsageText:r,buildUsageText:i})=>{if(n===null){process.stdout.write(`${i()}\n`);return}let a=r(t(n));if(a){process.stdout.write(a);return}h(e)}).catch(g),!0)}function c(e){switch(e.length){case 1:return l(e[0]);case 2:return u(e[0],e[1]);default:return}}function l(e){return e===`help`||p(e)?null:void 0}function u(e,t){return f(e)?t:d(e,t)}function d(e,t){return p(t)?e:void 0}function f(e){return e===`help`}function p(e){return e===`--help`||e===`-h`}function m(e){return e===`--version`||e===`-V`}function h(e){import(`../
|
|
1
|
+
const e=new Map([{alias:`long-press`,command:`longpress`},{alias:`metrics`,command:`perf`},{alias:`tap`,command:`press`},{alias:`launch`,command:`open`},{alias:`relaunch`,command:`open`,impliedFlags:[`relaunch`]}].map(e=>[e.alias,e]));function t(t){return e.get(t.toLowerCase())?.command??t}function n(t){return e.get(t.toLowerCase())}const r=process.argv.slice(2);i(r)||(r[0]===`mcp`&&!r.includes(`--help`)&&!r.includes(`-h`)?import(`../server.js`).then(({runAgentDeviceMcpServer:e})=>e()).catch(g):h(r));function i(e){return a(e)||o(e)||s(e)}function a(e){return e.length!==1||!m(e[0])?!1:(process.stdout.write(`0.20.8
|
|
2
|
+
`),!0)}function o(e){return e.length===0?(import(`../cli-help.js`).then(async({buildUsageText:e})=>{process.stdout.write(`${e()}\n`);let{exitAfterFlush:t}=await import(`../process-exit.js`);await t(1)}).catch(g),!0):!1}function s(e){let n=c(e);return n===void 0?!1:(import(`../cli-help.js`).then(({buildCommandUsageText:r,buildUsageText:i})=>{if(n===null){process.stdout.write(`${i()}\n`);return}let a=r(t(n));if(a){process.stdout.write(a);return}h(e)}).catch(g),!0)}function c(e){switch(e.length){case 1:return l(e[0]);case 2:return u(e[0],e[1]);default:return}}function l(e){return e===`help`||p(e)?null:void 0}function u(e,t){return f(e)?t:d(e,t)}function d(e,t){return p(t)?e:void 0}function f(e){return e===`help`}function p(e){return e===`--help`||e===`-h`}function m(e){return e===`--version`||e===`-V`}function h(e){import(`../process-entry.js`).then(({runCliProcess:t})=>t(e)).catch(g)}function g(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),import(`../process-exit.js`).then(({exitAfterFlush:e})=>e(1)).catch(()=>process.exit(1))}export{t as n,n as t};
|