agent-device 0.20.2 → 0.20.3

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.
Files changed (35) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.2.apk → agent-device-android-ime-helper-0.20.3.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.3.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.2.manifest.json → agent-device-android-ime-helper-0.20.3.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.2.apk → agent-device-android-snapshot-helper-0.20.3.apk} +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.3.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.2.manifest.json → agent-device-android-snapshot-helper-0.20.3.manifest.json} +6 -6
  7. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +0 -176
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +184 -0
  9. package/dist/src/android-adb.d.ts +3 -26
  10. package/dist/src/android-adb.js +1 -1
  11. package/dist/src/app-helpers.js +1 -0
  12. package/dist/src/apps.js +5 -5
  13. package/dist/src/context.js +1 -1
  14. package/dist/src/device-input-state.d.ts +26 -0
  15. package/dist/src/find.js +1 -1
  16. package/dist/src/index.d.ts +1 -1
  17. package/dist/src/interaction-snapshot.js +1 -1
  18. package/dist/src/interaction.js +1 -1
  19. package/dist/src/internal/bin.js +1 -1
  20. package/dist/src/internal/daemon.js +14 -14
  21. package/dist/src/lease.js +1 -1
  22. package/dist/src/limrun.d.ts +78 -2
  23. package/dist/src/logcat.js +1 -1
  24. package/dist/src/recording-export-quality.js +2 -3
  25. package/dist/src/runtime2.js +1 -1
  26. package/dist/src/sdk-android-adb.d.ts +1 -1
  27. package/dist/src/selector-runtime.js +1 -1
  28. package/dist/src/session-target-evidence.js +1 -1
  29. package/dist/src/session.js +8 -8
  30. package/dist/src/snapshot2.js +1 -1
  31. package/dist/src/tv-remote.d.ts +1 -1
  32. package/package.json +14 -15
  33. package/server.json +2 -2
  34. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.2.apk.sha256 +0 -1
  35. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.2.apk.sha256 +0 -1
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{I as t,N as n,j as r}from"./sdk-android-adb.js";import{E as i,a}from"./sdk-batch-runner.js";import{En as o,G as s,J as c,K as l,Q as u,Tn as d,X as f,Z as p,a as m,dn as h,q as ee,sn as te,un as ne,vn as g,yn as _}from"./recording-export-quality.js";import{L as re}from"./snapshot-diagnostics.js";import{_ as ie,c as v,f as ae,h as y,o as oe,p as se,s as b,v as x}from"./sdk-device.js";import{H as ce,T as le,x as ue}from"./gesture-plan-types.js";import{t as de}from"./timeouts.js";import{d as fe}from"./runtime.js";import{l as S}from"./install-artifact.js";import{a as pe,o as me}from"./boot-diagnostics.js";import{i as he}from"./lease-context.js";import{a as C,i as w,r as ge,t as T}from"./register-builtins.js";import{t as _e}from"./apple-multitouch-support.js";import{n as ve,t as E}from"./launch-console.js";import{AsyncLocalStorage as D}from"node:async_hooks";import ye,{promises as O}from"node:fs";import be from"node:path";let xe=[];const k=new D;async function Se(e,t){return await k.run([...e],t)}function Ce(e,t){for(let n of A()){if(!n.ownsDevice(e))continue;let r=n.getInteractor(e,t);if(r)return r}}function we(e){return A().some(t=>t.ownsDevice(e))}async function Te(e,t,n,r){for(let i of A()){if(!i.ownsDevice(e))continue;if(!i.installApp)throw N(i,e,`install`);let a=await i.installApp?.(e,t,n,r);if(a)return a;throw N(i,e,`install`)}}async function Ee(e,t,n){for(let r of A()){if(!r.ownsDevice(e))continue;if(!r.installInstallablePath)throw N(r,e,`install_from_source`);let i=await r.installInstallablePath?.(e,t,n);if(i)return i;throw N(r,e,`install_from_source`)}}async function De(e){for(let t of A()){if(!M(t,e.provider))continue;let n=await t.configurePortReverse?.(e);if(n)return n}}function A(){return k.getStore()??xe}function Oe(e,t={}){let n=e.map(e=>e.provider);return{providerRuntimeIds:n,providerRuntimeRequiredIds:je([...n,...t.providerRuntimeRequiredIds??[]]),leaseLifecycleProvider:Ne(e),recoverableProviderIds:e.filter(e=>e.recoverExpiredLease!==void 0).map(e=>e.provider),recoverExpiredLease:Ae(e),cloudArtifactProvider:Pe(e),deviceInventoryProvider:Fe(e),appleRunnerProvider:ke(e),providerDeviceRuntimeScope:async t=>await Se(e,t)}}function ke(e){if(e.some(e=>e.getAppleRunnerProvider!==void 0))return t=>{for(let n of e){if(!n.ownsDevice(t.device))continue;let e=n.getAppleRunnerProvider?.(t.device);if(e)return e}}}function Ae(t){if(t.some(e=>e.recoverExpiredLease!==void 0))return async n=>{let r=t.find(e=>M(e,n.leaseProvider));if(!r?.recoverExpiredLease)throw new e(`UNSUPPORTED_OPERATION`,`Provider ${n.leaseProvider??`unknown`} cannot recover an expired lease.`,{provider:n.leaseProvider,leaseId:n.leaseId});await r.recoverExpiredLease(n)}}function je(e){return[...new Set(e)]}function Me(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return{listCloudArtifacts:async e=>{for(let n of t){let t=await n.listCloudArtifacts?.(e);if(t)return t}}}}function Ne(e){if(e.length!==0)return{allocate:async(t,n)=>await j(e,`allocate`,t,n),heartbeat:async(t,n)=>await j(e,`heartbeat`,t,n),release:async(t,n)=>await j(e,`release`,t,n)}}function Pe(e){if(e.length!==0)return{listCloudArtifacts:async t=>await Ie(e,t)}}function Fe(e){if(e.length!==0)return async t=>{for(let n of e){if(!M(n,t.leaseProvider))continue;let e=await n.deviceInventoryProvider(t);if(e)return e}return null}}async function Ie(e,t){for(let n of e){if(!M(n,t.provider))continue;let e=await n.cloudArtifacts?.listCloudArtifacts?.(t);if(e)return e}}async function j(e,t,n,r){for(let i of e){if(!M(i,n.leaseProvider))continue;let e=i.leaseLifecycle[t],a=e?await e(n,r):void 0;if(a)return a}}function M(e,t){return e.provider===t}function N(t,n,r){throw new e(`UNSUPPORTED_OPERATION`,`Provider device runtime ${t.provider} does not support ${r} for this device.`,{provider:t.provider,deviceId:n.id,platform:y(n)})}const P=new D,Le=new D;async function Re(t,n,r){let i=await ze(t,n,r);if(i)return i;let a=await Be(t,n,r);if(r.allowLocalSimulatorFallback!==!1&&He(n,a)){let{findBootableIosSimulator:e}=await import(`./devices2.js`),t=await e({simulatorSetPath:r.simulatorSetPath,target:n.target});if(t)return t}if(a)return a;throw new e(`DEVICE_NOT_FOUND`,`No devices found`,{selector:n})}async function ze(t,n,r){let i=r.appleSimulatorAppTarget?.trim();if(!i||F(n)||r.allowLocalSimulatorFallback===!1)return;let a=t.filter(e=>se(e,n)&&b(e)&&e.kind===`simulator`&&e.booted===!0);if(a.length<2)return;let{findIosSimulatorInstalledApp:o}=await import(`./apps.js`).then(e=>e.t),s=(await Promise.all(a.map(async e=>await o(e,i)?e:void 0))).filter(e=>e!==void 0);if(s.length===1)return s[0];let c=a.map(e=>({id:e.id,name:e.name}));throw s.length===0?new e(`APP_NOT_INSTALLED`,`No booted iOS simulator has ${i} installed`,{appTarget:i,candidates:c,hint:`Install the app on a booted simulator, or pass --udid to select the intended device explicitly.`}):new e(`AMBIGUOUS_MATCH`,`Multiple booted iOS simulators have ${i} installed`,{appTarget:i,candidates:s.map(e=>({id:e.id,name:e.name})),hint:`Pass --udid to select the intended simulator explicitly.`})}async function Be(e,t,n){try{return await x(e,t,n)}catch(e){if(Ve(e,t))return;throw e}}function Ve(t,n){return!F(n)&&t instanceof e&&t.code===`DEVICE_NOT_FOUND`}function He(e,t){return!F(e)&&(!e.platform||e.platform===`apple`||e.platform===`ios`)&&e.target!==`desktop`&&(!t||t.kind===`device`)}function F(e){return!!(e.udid||e.serial||e.deviceName)}async function Ue(e,n={}){let r=We(e),{iosSimulatorSetPath:i,...a}=r,o=Ze(r,n),s={simulatorSetPath:i,allowStoppedAndroidAvdPlaceholders:n.allowStoppedAndroidAvdPlaceholders},c={platform:r.platform,target:e.target,cacheHit:!1};return await t(`resolve_target_device`,async()=>{let e=Xe(o);if(e)return c.cacheHit=!0,e;let t=await I(r);if(t)return L(a)?R(o,await Re(t,a,{simulatorSetPath:i,allowLocalSimulatorFallback:r.leaseProvider===void 0,appleSimulatorAppTarget:n.appleSimulatorAppTarget})):R(o,await x(t,a,s));let l=await C(r);return L(a)?R(o,await Re(l,a,{simulatorSetPath:i,appleSimulatorAppTarget:n.appleSimulatorAppTarget})):R(o,await x(l,a,s))},c)}function We(t){let n=t.platform;if(t.target&&!n)throw new e(`INVALID_ARGS`,`Device target selector requires --platform. Use --platform ios|macos|android|vega|linux|apple with --target mobile|tv|desktop.`);let r=ie({simulatorSetPath:me(t.iosSimulatorDeviceSet),platform:n,target:t.target}),i=pe(t.androidDeviceAllowlist);return{platform:n,target:t.target,deviceName:t.device,udid:t.udid,serial:t.serial,leaseId:t.leaseId,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId,iosSimulatorSetPath:r,androidSerialAllowlist:i?Array.from(i).sort():void 0}}async function Ge(e){return P.getStore()?await e():await P.run(new Map,e)}async function Ke(e,t){return e?await Le.run(e,t):await t()}async function qe(e,t){return await Ke(e,async()=>await Ge(t))}async function Je(e){return await I(e)??await C(e)}async function I(e){let t=Le.getStore();if(!t)return null;let n=await t(e);return n==null?null:n.map(e=>({...e}))}function Ye(e){return oe(e.platform)}function L(e){return Ye(e)}function Xe(e){let t=P.getStore()?.get(e);if(t)return{...t}}function R(e,t){return P.getStore()?.set(e,{...t}),t}function Ze(e,t){let{appleSimulatorAppTarget:n,...r}=t;return JSON.stringify({request:e,options:r})}T();const Qe={device:!0},$e=[`open`,`close`],et=[`record`],tt=[`audio`,`find`,`get`,`is`,`network`,`screenshot`,`snapshot`,`wait`],nt=[`click`,`fill`,`focus`,`press`,`scroll`,`type`],rt=[`viewport`],z=new Set([...$e,...et,...tt,...nt,...rt]),B=it(a(i));function it(e){let t={};for(let[n,r]of Object.entries(e))t[n]=z.has(n)?{...r,web:Qe}:r;for(let t of z)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}function V(e,t){let n=B[e];if(!n)return!0;let r=w(t.platform);if(!r)return!1;let i=n[r.capability.bucket];if(!i)return!1;let a=r.capability.supportsByDefault?.[e];return a&&!a(t)?!1:i[t.kind??`unknown`]===!0}function at(e,t){return w(t.platform)?.capability.unsupportedHintByDefault?.[e]?.(t)}function ot(){return Object.keys(B).sort()}function st(e){let t=B[e];if(!t)return[];let n=[`apple`,`android`,`vega`,`linux`,`web`],r=[];for(let e of n){let n=t[e];n&&Object.values(n).some(e=>e===!0)&&r.push(e)}return r}function ct(e,t){if(t.platform===`web`||t.appleOs===`watchos`)throw U(e,H(e,t));if(lt(e)){ut(e,t);return}if(t.appleOs===`visionos`)throw U(e,H(e,t));if(e.intent===`fling`&&`direction`in e&&t.platform===`linux`)throw U(e,`gesture fling is not supported on Linux`)}function lt(e){return e.intent===`pan`?(`pointerCount`in e?e.pointerCount:1)===2:e.intent===`pinch`||e.intent===`rotate`||e.intent===`transform`}function ut(e,t){if(t.platform===`android`){if(t.target!==`tv`)return;throw U(e,`gesture ${e.intent} is not supported on Android TV`,`Android TV has no touch input — this gesture is supported on Android phones, tablets, and the iOS simulator only.`)}if(t.platform!==`apple`)throw U(e,H(e,t));_e(t,e.intent)}function H(e,t){return`gesture ${e.intent} is not supported on ${t.appleOs??t.platform}`}function U(t,n,r){return new e(`UNSUPPORTED_OPERATION`,n,{gesture:t.intent,...r?{hint:r}:{}})}const W=`No active session. Run open first.`;function G(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}function dt(){return G(`SESSION_NOT_FOUND`,W)}function ft(e,t,n){if(V(e,t))return null;let r=n?.hint?at(e,t):void 0;return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:n?.message??`${e} is not supported on this device`,...r?{hint:r}:{}}}}T();async function K(t,n){if(we(t)){let r=Ce(t,n);if(r)return r;throw new e(`UNSUPPORTED_OPERATION`,`Provider device runtime does not have an active interactor for this device.`,{deviceId:t.id,platform:y(t)})}return await ge(t.platform).createInteractor(t,n)}const pt=/^[A-Za-z0-9_.:-]{1,64}$/,q=8*1024,J=4*1024;function mt(t){let n=t[0]?.trim(),r=t[1]?.trim();if(!n)throw new e(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!pt.test(n))throw new e(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(t.length>2)throw new e(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:gt(r,n)}}function ht(t,n,r){let i=y(t),a=_t(t);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>J)throw new e(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:J});return s}function gt(t,n){if(t)try{let r=JSON.parse(t);if(!r||typeof r!=`object`||Array.isArray(r))throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>q)throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${q} bytes`);return r}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${t}`)}}function _t(e){return((b(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:v(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}const vt=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function yt(e,t){return oe(e.platform)&&t>1}function bt(e,t,n=2e4){if(e.length===0)return[];let r=t>0?t:e.length,i=[],a=[],o=0;for(let t of e){let e=(t.durationMs??0)+(t.pauseMs??0)+250,s=a.length>0&&o+e>n,c=a.length>=r;(s||c)&&(i.push(a),a=[],o=0),a.push(t),o+=e}return a.length>0&&i.push(a),i}function xt(e,t){if(t<=0)return[0,0];let[n,r]=vt[e%vt.length];return[n*t,r*t]}async function St(e,t,n){for(let r=0;r<e;r+=1)await n(r),r<e-1&&t>0&&await de(t)}async function Ct(e,t){let{x:n,y:r}=Y(t,`longpress requires x y [durationMs]`,{hint:`Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i, use the target rect center as x y, then retry longpress x y durationMs.`}),i=t[2]?Number(t[2]):void 0;return await e.longPress(n,r,i),{x:n,y:r,durationMs:i,...g(`Long pressed (${n}, ${r})`)}}async function wt(e,t){let{x:n,y:r}=Y(t,`focus requires x y`);return await e.focus(n,r),{x:n,y:r,...g(`Focused (${n}, ${r})`)}}async function Tt(t,n,r){let i=Xt(n);if(i)throw new e(`INVALID_ARGS`,`type does not accept a target ref like "${i}"`,{hint:`Use fill ${i} "text" to target that field, or press ${i} then type "text" to append.`});let a=n.join(` `);if(!a)throw new e(`INVALID_ARGS`,`type requires text`);let o=c(r?.delayMs??0,`delay-ms`,0,1e4);return await t.type(a,o),{text:a,delayMs:o,...g(Q(`Typed`,a))}}async function Et(t,n,r){if(r?.directElementSelector)return await Dt(t,r.directElementSelector,n,r);let i=Number(n[0]),a=Number(n[1]),o=n.slice(2).join(` `);if(Number.isNaN(i)||Number.isNaN(a)||!o)throw new e(`INVALID_ARGS`,`fill requires x y text`);let s=c(r?.delayMs??0,`delay-ms`,0,1e4);return await t.fill(i,a,o,s),{x:i,y:a,text:o,delayMs:s,...g(Q(`Filled`,o))}}async function Dt(t,n,r,i){if(!t.fillElementSelector)throw new e(`UNSUPPORTED_OPERATION`,`direct element selector fill is not supported`);let a=r.join(` `);if(!a)throw new e(`INVALID_ARGS`,`fill requires text`);let o=c(i.delayMs??0,`delay-ms`,0,1e4),s=await t.fillElementSelector(n,a,o);return{selector:n.raw,text:a,delayMs:o,...s??{},...g(Q(`Filled`,a))}}async function Ot(e,t,n,r){if(r?.directElementSelector&&b(e))return await kt(t,r.directElementSelector);let{x:i,y:a}=Y(n,`press requires x y`);if(v(e)&&r?.surface&&r.surface!==`app`)return await At(i,a,r);let o=h(r);if(o!==`primary`)return await jt(e,i,a,o,r);let s=Pt(r);return Ft(s),yt(e,s.count)?await Lt(e,i,a,s,r):await Bt(t,i,a,s)}async function kt(t,n){if(!t.tapElementSelector)throw new e(`UNSUPPORTED_OPERATION`,`direct element selector tap is not supported`);let r=await t.tapElementSelector(n),i=r?.maestroNonHittableCoordinateFallbackUsed===!0;return{selector:n.raw,...r??{},...g(i?`tapped via non-hittable coordinate fallback`:`Tapped ${n.raw}`)}}function Y(t,n,r){let i=Number(t[0]),a=Number(t[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new e(`INVALID_ARGS`,n,r);return{x:i,y:a}}async function At(t,n,r){let i=h(r);if(i!==`primary`)throw new e(`UNSUPPORTED_OPERATION`,`${i} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:a}=await import(`./helper.js`).then(e=>e.t);return await a(t,n,{bundleId:r.appBundleId,surface:r.surface}),{x:t,y:n,...g(Z({x:t,y:n}))}}async function jt(e,t,n,r,i){if(Mt(e,r,i),e.platform===`linux`)return await Nt(t,n,r);let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.o);return await a(e,{command:`mouseClick`,x:t,y:n,button:r,appBundleId:i?.appBundleId},Vt(i)),{x:t,y:n,button:r,...g(Z({x:t,y:n,button:r}))}}function Mt(e,t,n){let r=ne({commandLabel:`click`,platform:y(e),button:t,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap});if(r)throw r}async function Nt(e,t,n){if(n===`secondary`){let{rightClickLinux:n}=await import(`./input-actions2.js`);await n(e,t)}else{let{middleClickLinux:n}=await import(`./input-actions2.js`);await n(e,t)}return{x:e,y:t,button:n,...g(Z({x:e,y:t,button:n}))}}function Pt(e){return{count:X(e?.count,1,`count`,1,200),intervalMs:X(e?.intervalMs,0,`interval-ms`,0,1e4),holdMs:X(e?.holdMs,0,`hold-ms`,0,1e4),jitterPx:X(e?.jitterPx,0,`jitter-px`,0,100),doubleTap:!!e?.doubleTap}}function X(e,t,n,r,i){return c(e===void 0?t:e,n,r,i)}function Ft({doubleTap:t,holdMs:n,jitterPx:r}){if(t&&n>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with hold-ms`);if(t&&r>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with jitter-px`)}async function It(e,t,n){let{runAppleRunnerCommand:r}=await import(`./runner-client.js`).then(e=>e.o),{MAX_RUNNER_SEQUENCE_STEPS:i,buildRunnerSequenceCommand:a,parseRunnerSequenceResult:o}=await import(`./runner-sequence.js`).then(e=>e.r),s=bt(t,i),c,l,u=0,d=[],f=0;for(let t of s){let i=await r(e,a(t,n?.appBundleId),Vt(n));c??=i,l=i;let s;try{s=o(i)}catch(e){throw zt(e,f)}u+=s.completedSteps,d.push(...s.results),f+=t.length}return{...c??{},completedSteps:u,sequenceResults:d,...l?.gestureEndUptimeMs===void 0?{}:{gestureEndUptimeMs:l.gestureEndUptimeMs}}}async function Lt(e,t,n,r,i){let a=await It(e,Rt(e,t,n,r),i);return{x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,timingMode:`runner-sequence`,...a,...g(Z({x:t,y:n}))}}function Rt(e,t,n,r){let i=r.doubleTap?`doubleTap`:r.holdMs>0?`longPress`:`tap`,a=i===`tap`&&b(e)&&!ae(e);return Array.from({length:r.count},(e,o)=>{let[s,c]=xt(o,r.jitterPx),l=o===r.count-1;return{kind:i,x:t+s,y:n+c,...a?{synthesized:!0}:{},...r.holdMs>0?{durationMs:r.holdMs}:{},...!l&&r.intervalMs>0?{pauseMs:r.intervalMs}:{}}})}function zt(t,n){if(n===0||!(t instanceof e)||!t.details)return t;let r=t.details.failedStepIndex;if(typeof r!=`number`)return t;let i=t.details.completedSteps;return new e(t.code,t.message,{...t.details,failedStepIndex:r+n,chunkStepIndex:r,...typeof i==`number`?{completedSteps:n+i}:{}},t.cause)}async function Bt(e,t,n,r){let i;return await St(r.count,r.intervalMs,async a=>{let[o,s]=xt(a,r.jitterPx),c=t+o,l=n+s;if(r.doubleTap){let t=await e.doubleTap(c,l);i??=t??void 0;return}if(r.holdMs>0){let t=await e.longPress(c,l,r.holdMs);i??=t??void 0}else{let t=await e.tap(c,l);i??=t??void 0}}),_({x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,...i},Z({x:t,y:n}))}function Vt(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir}}async function Ht(t,n,r){let i=n[0],a=n[1]?Number(n[1]):void 0,o=r?.pixels,s=r?.durationMs;if(!i)throw new e(`INVALID_ARGS`,`scroll requires direction`);Ut(a,o,s);let c=Jt(i),u={amount:a,pixels:o,durationMs:s},{interactionResult:d,completedPasses:f}=await Gt(t,r,c,u);return _(Kt(c,u,f,d),l(c.direction,c.edge,f,a,o))}function Ut(e,t,n){Wt(e),u(n),f({amount:e,pixels:t})}function Wt(t){if(t!==void 0&&!Number.isFinite(t))throw new e(`INVALID_ARGS`,`scroll amount must be a number`)}async function Gt(e,t,n,r){if(n.edge){let i=n.edge,a=await ee({edge:i,captureState:async n=>await qt(e,t,i,n),scroll:async()=>await e.scroll(n.direction,r)});return{interactionResult:a.result??{},completedPasses:a.passes}}return{interactionResult:await e.scroll(n.direction,r)??{},completedPasses:1}}function Kt(e,t,n,r){let i=p(r);return{direction:e.direction,...e.edge?{edge:e.edge,passes:n}:{},...t.amount===void 0?{}:{amount:t.amount},...t.pixels===void 0?{}:{pixels:t.pixels},...i===void 0?{}:{durationMs:i},...r}}async function qt(t,n,r,i){if(typeof t.snapshot!=`function`)throw new e(`UNSUPPORTED_OPERATION`,`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let a=t.snapshot;return await s({edge:r,scope:i,captureNodes:async e=>(await a({appBundleId:n?.appBundleId,scope:e})).nodes??[]})}function Jt(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:ce(e)}}async function Yt(e,t,n){let{x:r,y:i}=Y(t,`read requires x y`);if(e.platform===`android`){let{readAndroidTextAtPoint:t}=await import(`./input-actions.js`).then(e=>e.s);return{action:`read`,text:await t(e,r,i)??``}}if(e.platform===`linux`){let{readLinuxTextAtPoint:e}=await import(`./snapshot.js`).then(e=>e.n);return{action:`read`,text:await e(r,i,n?.surface)}}if(v(e)&&n?.surface&&n.surface!==`app`){let{runMacOsReadTextAction:e}=await import(`./helper.js`).then(e=>e.t);return{action:`read`,text:(await e(r,i,{bundleId:n.appBundleId,surface:n.surface})).text}}let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.o),o=await a(e,{command:`readText`,x:r,y:i,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId,iosXctestrunFile:n?.iosXctestrunFile,iosXctestDerivedDataPath:n?.iosXctestDerivedDataPath,iosXctestEnvDir:n?.iosXctestEnvDir});return{action:`read`,text:typeof o.text==`string`?o.text:typeof o.message==`string`?o.message:``}}function Xt(e){return fe(e[0])}function Z(e){return e.button&&e.button!==`primary`?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function Q(e,t){return`${e} ${Array.from(t).length} chars`}function Zt(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Qt(t,n){let r=n?.subject??`Payload`,i=t.trim();if(!i)throw new e(`INVALID_ARGS`,`${r} cannot be empty`);let a=n?.expandPath?n.expandPath(i,n.cwd):i;try{if(!ye.statSync(a).isFile())throw new e(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(t){if(t instanceof e)throw t;let n=t.code;if(n===`EACCES`||n===`EPERM`)throw new e(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(n&&n!==`ENOENT`)throw new e(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(t)})}if(Zt(i))return{kind:`inline`,text:i};throw new e(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function $t(t){let n=Qt(t,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await en(n.path);try{let t=JSON.parse(r);if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`push payload must be a JSON object`);return t}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid push payload JSON: ${t}`)}}async function en(t){try{return await O.readFile(t,`utf8`)}catch(n){let r=n.code;throw r===`ENOENT`?new e(`INVALID_ARGS`,`Push payload file not found: ${t}`):r===`EISDIR`?new e(`INVALID_ARGS`,`Push payload path is not a file: ${t}`):r===`EACCES`||r===`EPERM`?new e(`INVALID_ARGS`,`Push payload file is not readable: ${t}`):new e(`COMMAND_FAILED`,`Unable to read push payload file: ${t}`,{cause:String(n)})}}async function tn(e,n,i,a,o){let s=$(o),c=await K(e,s);return r({level:`debug`,phase:`platform_command_prepare`,data:{command:n,platform:e.platform,kind:e.kind}}),await t(`platform_command`,async()=>await on(e,c,n,i,a,o,s),{command:n,platform:e.platform})}async function nn(t,n,r){let i=await K(t,$(r));if(!i.performGesture)throw new e(`UNSUPPORTED_OPERATION`,`Gesture execution is unavailable`);return await i.performGesture(n)}async function rn(e,t){return await(await K(e,$(t))).gestureViewport?.()}function $(e){return{requestId:e?.requestId,appBundleId:e?.appBundleId,verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir,runnerLeaseContext:e?.runnerLeaseContext}}const an={open:({device:e,interactor:t,positionals:n,context:r})=>sn(e,t,n,r),close:async({device:e,interactor:t,positionals:n})=>{let r=n[0];return r?(await t.close(r),{app:r,...g(`Closed: ${r}`)}):(e.platform===`web`&&await t.close(``),{closed:`session`,...g(`Closed session`)})},press:({device:e,interactor:t,positionals:n,context:r})=>Ot(e,t,n,r),longpress:({interactor:e,positionals:t})=>Ct(e,t),focus:({interactor:e,positionals:t})=>wt(e,t),type:({interactor:e,positionals:t,context:n})=>Tt(e,t,n),fill:({interactor:e,positionals:t,context:n})=>Et(e,t,n),scroll:({interactor:e,positionals:t,context:n})=>Ht(e,t,n),"trigger-app-event":({device:e,interactor:t,positionals:n,context:r})=>cn(e,t,n,r),screenshot:({interactor:e,positionals:t,outPath:n,context:r})=>ln(e,t,n,r),viewport:({interactor:e,positionals:t})=>un(e,t),back:async({interactor:e,context:t})=>(await e.back(t?.backMode),{action:`back`,mode:t?.backMode??`in-app`,...g(`Back`)}),home:async({interactor:e})=>(await e.home(),{action:`home`,...g(`Home`)}),orientation:async({interactor:e,positionals:t})=>{let n=te(t[0]),r=(await e.setOrientation(n))?.orientation??n;return{action:`orientation`,orientation:r,...g(`Rotated to ${r}`)}},"app-switcher":async({interactor:e})=>(await e.appSwitcher(),{action:`app-switcher`,...g(`Opened app switcher`)}),clipboard:({interactor:e,positionals:t})=>dn(e,t),keyboard:({device:e,positionals:t,context:n,runnerCtx:r})=>pn(e,t,n,r),"tv-remote":({device:e,interactor:t,positionals:n,context:r})=>fn(e,t,n,r),settings:({device:e,interactor:t,positionals:n,context:r})=>gn(e,t,n,r),push:({device:e,positionals:t,context:n})=>_n(e,t,n),snapshot:({interactor:e,context:t})=>vn(e,t),read:({device:e,positionals:t,context:n})=>Yt(e,t,n)};async function on(t,n,r,i,a,o,s){let c=Object.hasOwn(an,r)?an[r]:void 0;if(!c)throw new e(`INVALID_ARGS`,`Unknown command: ${r}`);return await c({device:t,interactor:n,positionals:i,outPath:a,context:o,runnerCtx:s})}async function sn(t,n,r,i){let a=r[0],o=r[1],s=i?.launchConsole,c=i?.launchArgs;if(r.length>2)throw new e(`INVALID_ARGS`,`open accepts at most two arguments: <app|url> [url]`);if(!a){if(s)throw new e(`INVALID_ARGS`,`--launch-console requires an app target`);if(c&&c.length>0)throw new e(`INVALID_ARGS`,`--launch-args requires an app target`);return await n.openDevice(),{app:null,...g(`Opened device`)}}if(s&&(!b(t)||t.kind!==`simulator`))throw new e(`UNSUPPORTED_OPERATION`,ve);if(t.platform===`linux`&&c&&c.length>0)throw new e(`UNSUPPORTED_OPERATION`,`--launch-args is not supported on Linux.`);if(o!==void 0){if(S(a))throw new e(`INVALID_ARGS`,`open <app> <url> requires an app target as the first argument`);if(!S(o))throw new e(`INVALID_ARGS`,`open <app> <url> requires a valid URL target`);if(s)throw new e(`INVALID_ARGS`,E);return await n.open(a,{activity:i?.activity,appBundleId:i?.appBundleId,launchArgs:c,url:o}),{app:a,url:o,...g(`Opened: ${a}`)}}if(s&&S(a))throw new e(`INVALID_ARGS`,E);if(i?.clearAppState){if(S(a))throw new e(`INVALID_ARGS`,`Clearing app state requires an app target, not a deep link.`);await n.setSetting(`clear-app-state`,`clear`,a)}return await n.open(a,{activity:i?.activity,appBundleId:i?.appBundleId,launchConsole:s,launchArgs:c,terminateRunningApp:i?.terminateRunningApp}),{app:a,...s?{launchConsole:s}:{},...g(`Opened: ${a}`)}}async function cn(e,t,n,r){let{eventName:i,payload:a}=mt(n),o=ht(e,i,a);return await t.open(o,{appBundleId:r?.appBundleId}),{event:i,eventUrl:o,transport:`deep-link`,...g(`Triggered app event: ${i}`)}}async function ln(e,t,n,r){let i=t[0]??n??`./screenshot-${Date.now()}.png`;await O.mkdir(be.dirname(i),{recursive:!0});let a=o(r);return await e.screenshot(i,{appBundleId:r?.appBundleId,pixelDensity:a.pixelDensity,fullscreen:a.fullscreen,normalizeStatusBar:a.normalizeStatusBar,stabilize:a.stabilize,surface:r?.surface,skipIosSimulatorBootCheck:r?.skipIosSimulatorBootCheck,captureBackend:r?.screenshotCaptureBackend}),{path:i,...g(`Saved screenshot: ${i}`)}}async function un(t,n){if(n.length!==2)throw new e(`INVALID_ARGS`,`viewport requires exactly two arguments: <width> <height>`);let r=m(n[0],`width`),i=m(n[1],`height`);if(!t.setViewport)throw new e(`UNSUPPORTED_OPERATION`,`viewport is not supported by this backend`);return await t.setViewport(r,i),{width:r,height:i,...g(`Viewport set: ${r}x${i}`)}}async function dn(t,n){let r=(n[0]??``).toLowerCase();if(r!==`read`&&r!==`write`)throw new e(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);if(r===`read`){if(n.length!==1)throw new e(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:r,text:await t.readClipboard()}}if(n.length<2)throw new e(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=n.slice(1).join(` `);return await t.writeClipboard(i),{action:r,textLength:Array.from(i).length,...g(`Clipboard updated`)}}async function fn(t,n,r,i){if(t.target!==`tv`)throw new e(`UNSUPPORTED_OPERATION`,`tv-remote is supported only on TV targets`,{hint:`Select an Android TV, tvOS, or Vega OS target with --target tv.`});if(r.length!==1)throw new e(`INVALID_ARGS`,`tv-remote requires exactly one button`);let a=le(r[0]),o=i?.durationMs===void 0?void 0:c(i.durationMs,`durationMs`,0,1e4);return await n.tvRemote(a,o),{action:`tv-remote`,button:a,...o===void 0?{}:{durationMs:o},...g(`Pressed TV remote ${a}`)}}async function pn(t,n,r,i){let a=(n[0]??`status`).toLowerCase();if(!re(a))throw new e(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(n.length>1)throw new e(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);if(t.platform===`android`)return await mn(t,a);if(b(t))return await hn(t,a,r,i);throw new e(`UNSUPPORTED_OPERATION`,`keyboard is supported only on Android and iOS`)}async function mn(e,t){if(t===`enter`||t===`return`){let{pressAndroidEnter:t}=await import(`./input-actions.js`).then(e=>e.s);return await t(e),{platform:`android`,action:`enter`,...g(`Keyboard enter pressed`)}}if(t===`dismiss`){let{dismissAndroidKeyboard:t}=await import(`./device-input-state.js`).then(e=>e.t),n=await t(e);return{platform:`android`,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}let{getAndroidKeyboardState:n}=await import(`./device-input-state.js`).then(e=>e.t),r=await n(e);return{platform:`android`,action:`status`,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}async function hn(t,n,r,i){if(n!==`dismiss`&&n!==`enter`&&n!==`return`)throw new e(`UNSUPPORTED_OPERATION`,`keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS`);if(n===`enter`||n===`return`){let{runAppleRunnerCommand:e}=await import(`./runner-client.js`).then(e=>e.o),n=await e(t,{command:`keyboardReturn`,appBundleId:r?.appBundleId},i);return{platform:`ios`,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...g(`Keyboard enter pressed`)}}let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.o),o=await a(t,{command:`keyboardDismiss`,appBundleId:r?.appBundleId},i);return{platform:`ios`,action:`dismiss`,wasVisible:o.wasVisible,dismissed:o.dismissed,visible:o.visible,...g(o.dismissed?`Keyboard dismissed`:`Keyboard already hidden`)}}async function gn(t,n,i,a){let[o,s,c,l]=i;if(!o||!s&&o!==`clear-app-state`)throw new e(`INVALID_ARGS`,`settings requires setting state`);if(o===`clear-app-state`){let i=(s===`clear`?c:s)??a?.appBundleId;if(!i)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);r({level:`debug`,phase:`settings_apply`,data:{setting:o,state:`clear`,appBundleId:i,platform:t.platform}});let l=await n.setSetting(o,`clear`,i);return l&&typeof l==`object`?_({setting:o,state:`clear`,...l},yn(l)??`Cleared user data for ${i}`):{setting:o,state:`clear`,...g(`Cleared user data for ${i}`)}}if(!s)throw new e(`INVALID_ARGS`,`settings requires setting state`);let u=o===`location`&&s===`set`,d=(o===`permission`||u?i[4]:i[2])??a?.appBundleId,f=o===`permission`?{permissionTarget:c,permissionMode:l}:u?{latitude:ue(c,`latitude`),longitude:ue(l,`longitude`)}:void 0;r({level:`debug`,phase:`settings_apply`,data:u?{setting:o,state:s,latitude:c,longitude:l,platform:t.platform}:o===`permission`?{setting:o,state:s,permissionTarget:c,permissionMode:l,platform:t.platform}:{setting:o,state:s,appBundleId:d,platform:t.platform}});let p=await n.setSetting(o,s,d,f);return p&&typeof p==`object`?_({setting:o,state:s,...p},yn(p)??`Updated setting: ${o}`):{setting:o,state:s,...g(`Updated setting: ${o}`)}}async function _n(t,n,r){let i=n[0]?.trim(),a=n[1]?.trim();if(!i||!a)throw new e(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let o=await $t(a);if(b(t)){let{pushIosNotification:e}=await import(`./apps.js`).then(e=>e.t);return await e(t,i,o),{platform:`ios`,bundleId:i,...g(`Pushed notification to ${i}`)}}let{pushAndroidNotification:s}=await import(`./notifications.js`),c=await s(t,i,o);return{platform:`android`,package:i,action:c.action,extrasCount:c.extrasCount,...g(`Pushed notification to ${i}`)}}async function vn(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,includeRects:t?.snapshotIncludeRects,includeHiddenContentHints:t?.snapshotIncludeHiddenContentHints,surface:t?.surface})}function yn(e){return typeof e.message==`string`&&e.message.length>0?e.message:void 0}function bn(e,t,r,i,a,o){return{requestId:a??n().requestId,appBundleId:r,runnerLeaseContext:he({meta:o}),activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:i,iosXctestrunFile:t?.iosXctestrunFile,iosXctestDerivedDataPath:t?.iosXctestDerivedDataPath,iosXctestEnvDir:t?.iosXctestEnvDir,screenshotCaptureBackend:t?.maestro?.screenshotCaptureBackend,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,snapshotIncludeHiddenContentHints:t?.snapshotIncludeHiddenContentHints,...d(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,durationMs:t?.durationMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:h(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}export{we as C,Ee as S,qe as _,Qt as a,Oe as b,dt as c,ot as d,ct as f,Ue as g,Je as h,rn as i,ft as l,We as m,tn as n,W as o,st as p,nn as r,G as s,bn as t,V as u,Me as v,Te as x,De as y};
1
+ import{_ as e}from"./sdk-contracts.js";import{I as t,N as n,j as r}from"./sdk-android-adb.js";import{E as i,a}from"./sdk-batch-runner.js";import{En as o,G as s,J as c,K as l,Q as u,Tn as d,X as f,Z as p,a as m,dn as h,q as ee,sn as te,un as ne,vn as g,yn as _}from"./recording-export-quality.js";import{L as re}from"./snapshot-diagnostics.js";import{_ as ie,c as v,f as ae,h as y,o as oe,p as se,s as b,v as x}from"./sdk-device.js";import{H as ce,T as le,x as ue}from"./gesture-plan-types.js";import{t as de}from"./timeouts.js";import{d as fe}from"./runtime.js";import{l as S}from"./install-artifact.js";import{a as pe,o as me}from"./boot-diagnostics.js";import{i as he}from"./lease-context.js";import{a as C,i as w,r as ge,t as T}from"./register-builtins.js";import{t as _e}from"./apple-multitouch-support.js";import{n as ve,t as E}from"./launch-console.js";import{AsyncLocalStorage as D}from"node:async_hooks";import ye,{promises as O}from"node:fs";import be from"node:path";let xe=[];const k=new D;async function Se(e,t){return await k.run([...e],t)}function Ce(e,t){for(let n of A()){if(!n.ownsDevice(e))continue;let r=n.getInteractor(e,t);if(r)return r}}function we(e){return A().some(t=>t.ownsDevice(e))}async function Te(e,t,n,r){for(let i of A()){if(!i.ownsDevice(e))continue;if(!i.installApp)throw N(i,e,`install`);let a=await i.installApp?.(e,t,n,r);if(a)return a;throw N(i,e,`install`)}}async function Ee(e,t,n){for(let r of A()){if(!r.ownsDevice(e))continue;if(!r.installInstallablePath)throw N(r,e,`install_from_source`);let i=await r.installInstallablePath?.(e,t,n);if(i)return i;throw N(r,e,`install_from_source`)}}async function De(e){for(let t of A()){if(!M(t,e.provider))continue;let n=await t.configurePortReverse?.(e);if(n)return n}}function A(){return k.getStore()??xe}function Oe(e,t={}){let n=e.map(e=>e.provider);return{providerRuntimeIds:n,providerRuntimeRequiredIds:je([...n,...t.providerRuntimeRequiredIds??[]]),leaseLifecycleProvider:Ne(e),recoverableProviderIds:e.filter(e=>e.recoverExpiredLease!==void 0).map(e=>e.provider),recoverExpiredLease:Ae(e),cloudArtifactProvider:Pe(e),deviceInventoryProvider:Fe(e),appleRunnerProvider:ke(e),providerDeviceRuntimeScope:async t=>await Se(e,t)}}function ke(e){if(e.some(e=>e.getAppleRunnerProvider!==void 0))return t=>{for(let n of e){if(!n.ownsDevice(t.device))continue;let e=n.getAppleRunnerProvider?.(t.device);if(e)return e}}}function Ae(t){if(t.some(e=>e.recoverExpiredLease!==void 0))return async n=>{let r=t.find(e=>M(e,n.leaseProvider));if(!r?.recoverExpiredLease)throw new e(`UNSUPPORTED_OPERATION`,`Provider ${n.leaseProvider??`unknown`} cannot recover an expired lease.`,{provider:n.leaseProvider,leaseId:n.leaseId});await r.recoverExpiredLease(n)}}function je(e){return[...new Set(e)]}function Me(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return{listCloudArtifacts:async e=>{for(let n of t){let t=await n.listCloudArtifacts?.(e);if(t)return t}}}}function Ne(e){if(e.length!==0)return{allocate:async(t,n)=>await j(e,`allocate`,t,n),heartbeat:async(t,n)=>await j(e,`heartbeat`,t,n),release:async(t,n)=>await j(e,`release`,t,n)}}function Pe(e){if(e.length!==0)return{listCloudArtifacts:async t=>await Ie(e,t)}}function Fe(e){if(e.length!==0)return async t=>{for(let n of e){if(!M(n,t.leaseProvider))continue;let e=await n.deviceInventoryProvider(t);if(e)return e}return null}}async function Ie(e,t){for(let n of e){if(!M(n,t.provider))continue;let e=await n.cloudArtifacts?.listCloudArtifacts?.(t);if(e)return e}}async function j(e,t,n,r){for(let i of e){if(!M(i,n.leaseProvider))continue;let e=i.leaseLifecycle[t],a=e?await e(n,r):void 0;if(a)return a}}function M(e,t){return e.provider===t}function N(t,n,r){throw new e(`UNSUPPORTED_OPERATION`,`Provider device runtime ${t.provider} does not support ${r} for this device.`,{provider:t.provider,deviceId:n.id,platform:y(n)})}const P=new D,Le=new D;async function Re(t,n,r){let i=await ze(t,n,r);if(i)return i;let a=await Be(t,n,r);if(r.allowLocalSimulatorFallback!==!1&&He(n,a)){let{findBootableIosSimulator:e}=await import(`./devices2.js`),t=await e({simulatorSetPath:r.simulatorSetPath,target:n.target});if(t)return t}if(a)return a;throw new e(`DEVICE_NOT_FOUND`,`No devices found`,{selector:n})}async function ze(t,n,r){let i=r.appleSimulatorAppTarget?.trim();if(!i||F(n)||r.allowLocalSimulatorFallback===!1)return;let a=t.filter(e=>se(e,n)&&b(e)&&e.kind===`simulator`&&e.booted===!0);if(a.length<2)return;let{findIosSimulatorInstalledApp:o}=await import(`./apps.js`).then(e=>e.t),s=(await Promise.all(a.map(async e=>await o(e,i)?e:void 0))).filter(e=>e!==void 0);if(s.length===1)return s[0];let c=a.map(e=>({id:e.id,name:e.name}));throw s.length===0?new e(`APP_NOT_INSTALLED`,`No booted iOS simulator has ${i} installed`,{appTarget:i,candidates:c,hint:`Install the app on a booted simulator, or pass --udid to select the intended device explicitly.`}):new e(`AMBIGUOUS_MATCH`,`Multiple booted iOS simulators have ${i} installed`,{appTarget:i,candidates:s.map(e=>({id:e.id,name:e.name})),hint:`Pass --udid to select the intended simulator explicitly.`})}async function Be(e,t,n){try{return await x(e,t,n)}catch(e){if(Ve(e,t))return;throw e}}function Ve(t,n){return!F(n)&&t instanceof e&&t.code===`DEVICE_NOT_FOUND`}function He(e,t){return!F(e)&&(!e.platform||e.platform===`apple`||e.platform===`ios`)&&e.target!==`desktop`&&(!t||t.kind===`device`)}function F(e){return!!(e.udid||e.serial||e.deviceName)}async function Ue(e,n={}){let r=We(e),{iosSimulatorSetPath:i,...a}=r,o=Ze(r,n),s={simulatorSetPath:i,allowStoppedAndroidAvdPlaceholders:n.allowStoppedAndroidAvdPlaceholders},c={platform:r.platform,target:e.target,cacheHit:!1};return await t(`resolve_target_device`,async()=>{let e=Xe(o);if(e)return c.cacheHit=!0,e;let t=await I(r);if(t)return L(a)?R(o,await Re(t,a,{simulatorSetPath:i,allowLocalSimulatorFallback:r.leaseProvider===void 0,appleSimulatorAppTarget:n.appleSimulatorAppTarget})):R(o,await x(t,a,s));let l=await C(r);return L(a)?R(o,await Re(l,a,{simulatorSetPath:i,appleSimulatorAppTarget:n.appleSimulatorAppTarget})):R(o,await x(l,a,s))},c)}function We(t){let n=t.platform;if(t.target&&!n)throw new e(`INVALID_ARGS`,`Device target selector requires --platform. Use --platform ios|macos|android|vega|linux|apple with --target mobile|tv|desktop.`);let r=ie({simulatorSetPath:me(t.iosSimulatorDeviceSet),platform:n,target:t.target}),i=pe(t.androidDeviceAllowlist);return{platform:n,target:t.target,deviceName:t.device,udid:t.udid,serial:t.serial,leaseId:t.leaseId,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId,iosSimulatorSetPath:r,androidSerialAllowlist:i?Array.from(i).sort():void 0}}async function Ge(e){return P.getStore()?await e():await P.run(new Map,e)}async function Ke(e,t){return e?await Le.run(e,t):await t()}async function qe(e,t){return await Ke(e,async()=>await Ge(t))}async function Je(e){return await I(e)??await C(e)}async function I(e){let t=Le.getStore();if(!t)return null;let n=await t(e);return n==null?null:n.map(e=>({...e}))}function Ye(e){return oe(e.platform)}function L(e){return Ye(e)}function Xe(e){let t=P.getStore()?.get(e);if(t)return{...t}}function R(e,t){return P.getStore()?.set(e,{...t}),t}function Ze(e,t){let{appleSimulatorAppTarget:n,...r}=t;return JSON.stringify({request:e,options:r})}T();const Qe={device:!0},$e=[`open`,`close`],et=[`record`],tt=[`audio`,`find`,`get`,`is`,`network`,`screenshot`,`snapshot`,`wait`],nt=[`click`,`fill`,`focus`,`press`,`scroll`,`type`],rt=[`viewport`],z=new Set([...$e,...et,...tt,...nt,...rt]),B=it(a(i));function it(e){let t={};for(let[n,r]of Object.entries(e))t[n]=z.has(n)?{...r,web:Qe}:r;for(let t of z)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}function V(e,t){let n=B[e];if(!n)return!0;let r=w(t.platform);if(!r)return!1;let i=n[r.capability.bucket];if(!i)return!1;let a=r.capability.supportsByDefault?.[e];return a&&!a(t)?!1:i[t.kind??`unknown`]===!0}function at(e,t){return w(t.platform)?.capability.unsupportedHintByDefault?.[e]?.(t)}function ot(){return Object.keys(B).sort()}function st(e){let t=B[e];if(!t)return[];let n=[`apple`,`android`,`vega`,`linux`,`web`],r=[];for(let e of n){let n=t[e];n&&Object.values(n).some(e=>e===!0)&&r.push(e)}return r}function ct(e,t){if(t.platform===`web`||t.appleOs===`watchos`)throw U(e,H(e,t));if(lt(e)){ut(e,t);return}if(t.appleOs===`visionos`)throw U(e,H(e,t));if(e.intent===`fling`&&`direction`in e&&t.platform===`linux`)throw U(e,`gesture fling is not supported on Linux`)}function lt(e){return e.intent===`pan`?(`pointerCount`in e?e.pointerCount:1)===2:e.intent===`pinch`||e.intent===`rotate`||e.intent===`transform`}function ut(e,t){if(t.platform===`android`){if(t.target!==`tv`)return;throw U(e,`gesture ${e.intent} is not supported on Android TV`,`Android TV has no touch input — this gesture is supported on Android phones, tablets, and the iOS simulator only.`)}if(t.platform!==`apple`)throw U(e,H(e,t));_e(t,e.intent)}function H(e,t){return`gesture ${e.intent} is not supported on ${t.appleOs??t.platform}`}function U(t,n,r){return new e(`UNSUPPORTED_OPERATION`,n,{gesture:t.intent,...r?{hint:r}:{}})}const W=`No active session. Run open first.`;function G(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}function dt(){return G(`SESSION_NOT_FOUND`,W)}function ft(e,t,n){if(V(e,t))return null;let r=n?.hint?at(e,t):void 0;return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:n?.message??`${e} is not supported on this device`,...r?{hint:r}:{}}}}T();async function K(t,n){if(we(t)){let r=Ce(t,n);if(r)return r;throw new e(`UNSUPPORTED_OPERATION`,`Provider device runtime does not have an active interactor for this device.`,{deviceId:t.id,platform:y(t)})}return await ge(t.platform).createInteractor(t,n)}const pt=/^[A-Za-z0-9_.:-]{1,64}$/,q=8*1024,J=4*1024;function mt(t){let n=t[0]?.trim(),r=t[1]?.trim();if(!n)throw new e(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!pt.test(n))throw new e(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(t.length>2)throw new e(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:gt(r,n)}}function ht(t,n,r){let i=y(t),a=_t(t);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>J)throw new e(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:J});return s}function gt(t,n){if(t)try{let r=JSON.parse(t);if(!r||typeof r!=`object`||Array.isArray(r))throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>q)throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${q} bytes`);return r}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${t}`)}}function _t(e){return((b(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:v(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}const vt=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function yt(e,t){return oe(e.platform)&&t>1}function bt(e,t,n=2e4){if(e.length===0)return[];let r=t>0?t:e.length,i=[],a=[],o=0;for(let t of e){let e=(t.durationMs??0)+(t.pauseMs??0)+250,s=a.length>0&&o+e>n,c=a.length>=r;(s||c)&&(i.push(a),a=[],o=0),a.push(t),o+=e}return a.length>0&&i.push(a),i}function xt(e,t){if(t<=0)return[0,0];let[n,r]=vt[e%vt.length];return[n*t,r*t]}async function St(e,t,n){for(let r=0;r<e;r+=1)await n(r),r<e-1&&t>0&&await de(t)}async function Ct(e,t){let{x:n,y:r}=Y(t,`longpress requires x y [durationMs]`,{hint:`Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i, use the target rect center as x y, then retry longpress x y durationMs.`}),i=t[2]?Number(t[2]):void 0;return await e.longPress(n,r,i),{x:n,y:r,durationMs:i,...g(`Long pressed (${n}, ${r})`)}}async function wt(e,t){let{x:n,y:r}=Y(t,`focus requires x y`);return await e.focus(n,r),{x:n,y:r,...g(`Focused (${n}, ${r})`)}}async function Tt(t,n,r){let i=Xt(n);if(i)throw new e(`INVALID_ARGS`,`type does not accept a target ref like "${i}"`,{hint:`Use fill ${i} "text" to target that field, or press ${i} then type "text" to append.`});let a=n.join(` `);if(!a)throw new e(`INVALID_ARGS`,`type requires text`);let o=c(r?.delayMs??0,`delay-ms`,0,1e4);return await t.type(a,o),{text:a,delayMs:o,...g(Q(`Typed`,a))}}async function Et(t,n,r){if(r?.directElementSelector)return await Dt(t,r.directElementSelector,n,r);let i=Number(n[0]),a=Number(n[1]),o=n.slice(2).join(` `);if(Number.isNaN(i)||Number.isNaN(a)||!o)throw new e(`INVALID_ARGS`,`fill requires x y text`);let s=c(r?.delayMs??0,`delay-ms`,0,1e4);return await t.fill(i,a,o,s),{x:i,y:a,text:o,delayMs:s,...g(Q(`Filled`,o))}}async function Dt(t,n,r,i){if(!t.fillElementSelector)throw new e(`UNSUPPORTED_OPERATION`,`direct element selector fill is not supported`);let a=r.join(` `);if(!a)throw new e(`INVALID_ARGS`,`fill requires text`);let o=c(i.delayMs??0,`delay-ms`,0,1e4),s=await t.fillElementSelector(n,a,o);return{selector:n.raw,text:a,delayMs:o,...s??{},...g(Q(`Filled`,a))}}async function Ot(e,t,n,r){if(r?.directElementSelector&&b(e))return await kt(t,r.directElementSelector);let{x:i,y:a}=Y(n,`press requires x y`);if(v(e)&&r?.surface&&r.surface!==`app`)return await At(i,a,r);let o=h(r);if(o!==`primary`)return await jt(e,i,a,o,r);let s=Pt(r);return Ft(s),yt(e,s.count)?await Lt(e,i,a,s,r):await Bt(t,i,a,s)}async function kt(t,n){if(!t.tapElementSelector)throw new e(`UNSUPPORTED_OPERATION`,`direct element selector tap is not supported`);let r=await t.tapElementSelector(n),i=r?.maestroNonHittableCoordinateFallbackUsed===!0;return{selector:n.raw,...r??{},...g(i?`tapped via non-hittable coordinate fallback`:`Tapped ${n.raw}`)}}function Y(t,n,r){let i=Number(t[0]),a=Number(t[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new e(`INVALID_ARGS`,n,r);return{x:i,y:a}}async function At(t,n,r){let i=h(r);if(i!==`primary`)throw new e(`UNSUPPORTED_OPERATION`,`${i} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:a}=await import(`./helper.js`).then(e=>e.t);return await a(t,n,{bundleId:r.appBundleId,surface:r.surface}),{x:t,y:n,...g(Z({x:t,y:n}))}}async function jt(e,t,n,r,i){if(Mt(e,r,i),e.platform===`linux`)return await Nt(t,n,r);let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.o);return await a(e,{command:`mouseClick`,x:t,y:n,button:r,appBundleId:i?.appBundleId},Vt(i)),{x:t,y:n,button:r,...g(Z({x:t,y:n,button:r}))}}function Mt(e,t,n){let r=ne({commandLabel:`click`,platform:y(e),button:t,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap});if(r)throw r}async function Nt(e,t,n){if(n===`secondary`){let{rightClickLinux:n}=await import(`./input-actions2.js`);await n(e,t)}else{let{middleClickLinux:n}=await import(`./input-actions2.js`);await n(e,t)}return{x:e,y:t,button:n,...g(Z({x:e,y:t,button:n}))}}function Pt(e){return{count:X(e?.count,1,`count`,1,200),intervalMs:X(e?.intervalMs,0,`interval-ms`,0,1e4),holdMs:X(e?.holdMs,0,`hold-ms`,0,1e4),jitterPx:X(e?.jitterPx,0,`jitter-px`,0,100),doubleTap:!!e?.doubleTap}}function X(e,t,n,r,i){return c(e===void 0?t:e,n,r,i)}function Ft({doubleTap:t,holdMs:n,jitterPx:r}){if(t&&n>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with hold-ms`);if(t&&r>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with jitter-px`)}async function It(e,t,n){let{runAppleRunnerCommand:r}=await import(`./runner-client.js`).then(e=>e.o),{MAX_RUNNER_SEQUENCE_STEPS:i,buildRunnerSequenceCommand:a,parseRunnerSequenceResult:o}=await import(`./runner-sequence.js`).then(e=>e.r),s=bt(t,i),c,l,u=0,d=[],f=0;for(let t of s){let i=await r(e,a(t,n?.appBundleId),Vt(n));c??=i,l=i;let s;try{s=o(i)}catch(e){throw zt(e,f)}u+=s.completedSteps,d.push(...s.results),f+=t.length}return{...c??{},completedSteps:u,sequenceResults:d,...l?.gestureEndUptimeMs===void 0?{}:{gestureEndUptimeMs:l.gestureEndUptimeMs}}}async function Lt(e,t,n,r,i){let a=await It(e,Rt(e,t,n,r),i);return{x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,timingMode:`runner-sequence`,...a,...g(Z({x:t,y:n}))}}function Rt(e,t,n,r){let i=r.doubleTap?`doubleTap`:r.holdMs>0?`longPress`:`tap`,a=i===`tap`&&b(e)&&!ae(e);return Array.from({length:r.count},(e,o)=>{let[s,c]=xt(o,r.jitterPx),l=o===r.count-1;return{kind:i,x:t+s,y:n+c,...a?{synthesized:!0}:{},...r.holdMs>0?{durationMs:r.holdMs}:{},...!l&&r.intervalMs>0?{pauseMs:r.intervalMs}:{}}})}function zt(t,n){if(n===0||!(t instanceof e)||!t.details)return t;let r=t.details.failedStepIndex;if(typeof r!=`number`)return t;let i=t.details.completedSteps;return new e(t.code,t.message,{...t.details,failedStepIndex:r+n,chunkStepIndex:r,...typeof i==`number`?{completedSteps:n+i}:{}},t.cause)}async function Bt(e,t,n,r){let i;return await St(r.count,r.intervalMs,async a=>{let[o,s]=xt(a,r.jitterPx),c=t+o,l=n+s;if(r.doubleTap){let t=await e.doubleTap(c,l);i??=t??void 0;return}if(r.holdMs>0){let t=await e.longPress(c,l,r.holdMs);i??=t??void 0}else{let t=await e.tap(c,l);i??=t??void 0}}),_({x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,...i},Z({x:t,y:n}))}function Vt(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir}}async function Ht(t,n,r){let i=n[0],a=n[1]?Number(n[1]):void 0,o=r?.pixels,s=r?.durationMs;if(!i)throw new e(`INVALID_ARGS`,`scroll requires direction`);Ut(a,o,s);let c=Jt(i),u={amount:a,pixels:o,durationMs:s},{interactionResult:d,completedPasses:f}=await Gt(t,r,c,u);return _(Kt(c,u,f,d),l(c.direction,c.edge,f,a,o))}function Ut(e,t,n){Wt(e),u(n),f({amount:e,pixels:t})}function Wt(t){if(t!==void 0&&!Number.isFinite(t))throw new e(`INVALID_ARGS`,`scroll amount must be a number`)}async function Gt(e,t,n,r){if(n.edge){let i=n.edge,a=await ee({edge:i,captureState:async n=>await qt(e,t,i,n),scroll:async()=>await e.scroll(n.direction,r)});return{interactionResult:a.result??{},completedPasses:a.passes}}return{interactionResult:await e.scroll(n.direction,r)??{},completedPasses:1}}function Kt(e,t,n,r){let i=p(r);return{direction:e.direction,...e.edge?{edge:e.edge,passes:n}:{},...t.amount===void 0?{}:{amount:t.amount},...t.pixels===void 0?{}:{pixels:t.pixels},...i===void 0?{}:{durationMs:i},...r}}async function qt(t,n,r,i){if(typeof t.snapshot!=`function`)throw new e(`UNSUPPORTED_OPERATION`,`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let a=t.snapshot;return await s({edge:r,scope:i,captureNodes:async e=>(await a({appBundleId:n?.appBundleId,scope:e})).nodes??[]})}function Jt(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:ce(e)}}async function Yt(e,t,n){let{x:r,y:i}=Y(t,`read requires x y`);if(e.platform===`android`){let{readAndroidTextAtPoint:t}=await import(`./input-actions.js`).then(e=>e.s);return{action:`read`,text:await t(e,r,i)??``}}if(e.platform===`linux`){let{readLinuxTextAtPoint:e}=await import(`./snapshot.js`).then(e=>e.n);return{action:`read`,text:await e(r,i,n?.surface)}}if(v(e)&&n?.surface&&n.surface!==`app`){let{runMacOsReadTextAction:e}=await import(`./helper.js`).then(e=>e.t);return{action:`read`,text:(await e(r,i,{bundleId:n.appBundleId,surface:n.surface})).text}}let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.o),o=await a(e,{command:`readText`,x:r,y:i,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId,iosXctestrunFile:n?.iosXctestrunFile,iosXctestDerivedDataPath:n?.iosXctestDerivedDataPath,iosXctestEnvDir:n?.iosXctestEnvDir});return{action:`read`,text:typeof o.text==`string`?o.text:typeof o.message==`string`?o.message:``}}function Xt(e){return fe(e[0])}function Z(e){return e.button&&e.button!==`primary`?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function Q(e,t){return`${e} ${Array.from(t).length} chars`}function Zt(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Qt(t,n){let r=n?.subject??`Payload`,i=t.trim();if(!i)throw new e(`INVALID_ARGS`,`${r} cannot be empty`);let a=n?.expandPath?n.expandPath(i,n.cwd):i;try{if(!ye.statSync(a).isFile())throw new e(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(t){if(t instanceof e)throw t;let n=t.code;if(n===`EACCES`||n===`EPERM`)throw new e(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(n&&n!==`ENOENT`)throw new e(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(t)})}if(Zt(i))return{kind:`inline`,text:i};throw new e(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function $t(t){let n=Qt(t,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await en(n.path);try{let t=JSON.parse(r);if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`push payload must be a JSON object`);return t}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid push payload JSON: ${t}`)}}async function en(t){try{return await O.readFile(t,`utf8`)}catch(n){let r=n.code;throw r===`ENOENT`?new e(`INVALID_ARGS`,`Push payload file not found: ${t}`):r===`EISDIR`?new e(`INVALID_ARGS`,`Push payload path is not a file: ${t}`):r===`EACCES`||r===`EPERM`?new e(`INVALID_ARGS`,`Push payload file is not readable: ${t}`):new e(`COMMAND_FAILED`,`Unable to read push payload file: ${t}`,{cause:String(n)})}}async function tn(e,n,i,a,o){let s=$(o),c=await K(e,s);return r({level:`debug`,phase:`platform_command_prepare`,data:{command:n,platform:e.platform,kind:e.kind}}),await t(`platform_command`,async()=>await on(e,c,n,i,a,o,s),{command:n,platform:e.platform})}async function nn(t,n,r){let i=await K(t,$(r));if(!i.performGesture)throw new e(`UNSUPPORTED_OPERATION`,`Gesture execution is unavailable`);return await i.performGesture(n)}async function rn(e,t){return await(await K(e,$(t))).gestureViewport?.()}function $(e){return{requestId:e?.requestId,appBundleId:e?.appBundleId,verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir,runnerLeaseContext:e?.runnerLeaseContext}}const an={open:({device:e,interactor:t,positionals:n,context:r})=>sn(e,t,n,r),close:async({device:e,interactor:t,positionals:n})=>{let r=n[0];return r?(await t.close(r),{app:r,...g(`Closed: ${r}`)}):(e.platform===`web`&&await t.close(``),{closed:`session`,...g(`Closed session`)})},press:({device:e,interactor:t,positionals:n,context:r})=>Ot(e,t,n,r),longpress:({interactor:e,positionals:t})=>Ct(e,t),focus:({interactor:e,positionals:t})=>wt(e,t),type:({interactor:e,positionals:t,context:n})=>Tt(e,t,n),fill:({interactor:e,positionals:t,context:n})=>Et(e,t,n),scroll:({interactor:e,positionals:t,context:n})=>Ht(e,t,n),"trigger-app-event":({device:e,interactor:t,positionals:n,context:r})=>cn(e,t,n,r),screenshot:({interactor:e,positionals:t,outPath:n,context:r})=>ln(e,t,n,r),viewport:({interactor:e,positionals:t})=>un(e,t),back:async({interactor:e,context:t})=>(await e.back(t?.backMode),{action:`back`,mode:t?.backMode??`in-app`,...g(`Back`)}),home:async({interactor:e})=>(await e.home(),{action:`home`,...g(`Home`)}),orientation:async({interactor:e,positionals:t})=>{let n=te(t[0]),r=(await e.setOrientation(n))?.orientation??n;return{action:`orientation`,orientation:r,...g(`Rotated to ${r}`)}},"app-switcher":async({interactor:e})=>(await e.appSwitcher(),{action:`app-switcher`,...g(`Opened app switcher`)}),clipboard:({interactor:e,positionals:t})=>dn(e,t),keyboard:({device:e,positionals:t,context:n,runnerCtx:r})=>pn(e,t,n,r),"tv-remote":({device:e,interactor:t,positionals:n,context:r})=>fn(e,t,n,r),settings:({device:e,interactor:t,positionals:n,context:r})=>gn(e,t,n,r),push:({device:e,positionals:t,context:n})=>_n(e,t,n),snapshot:({interactor:e,context:t})=>vn(e,t),read:({device:e,positionals:t,context:n})=>Yt(e,t,n)};async function on(t,n,r,i,a,o,s){let c=Object.hasOwn(an,r)?an[r]:void 0;if(!c)throw new e(`INVALID_ARGS`,`Unknown command: ${r}`);return await c({device:t,interactor:n,positionals:i,outPath:a,context:o,runnerCtx:s})}async function sn(t,n,r,i){let a=r[0],o=r[1],s=i?.launchConsole,c=i?.launchArgs;if(r.length>2)throw new e(`INVALID_ARGS`,`open accepts at most two arguments: <app|url> [url]`);if(!a){if(s)throw new e(`INVALID_ARGS`,`--launch-console requires an app target`);if(c&&c.length>0)throw new e(`INVALID_ARGS`,`--launch-args requires an app target`);return await n.openDevice(),{app:null,...g(`Opened device`)}}if(s&&(!b(t)||t.kind!==`simulator`))throw new e(`UNSUPPORTED_OPERATION`,ve);if(t.platform===`linux`&&c&&c.length>0)throw new e(`UNSUPPORTED_OPERATION`,`--launch-args is not supported on Linux.`);if(o!==void 0){if(S(a))throw new e(`INVALID_ARGS`,`open <app> <url> requires an app target as the first argument`);if(!S(o))throw new e(`INVALID_ARGS`,`open <app> <url> requires a valid URL target`);if(s)throw new e(`INVALID_ARGS`,E);return await n.open(a,{activity:i?.activity,appBundleId:i?.appBundleId,launchArgs:c,terminateRunningApp:i?.terminateRunningApp,url:o}),{app:a,url:o,...g(`Opened: ${a}`)}}if(s&&S(a))throw new e(`INVALID_ARGS`,E);if(i?.clearAppState){if(S(a))throw new e(`INVALID_ARGS`,`Clearing app state requires an app target, not a deep link.`);await n.setSetting(`clear-app-state`,`clear`,a)}return await n.open(a,{activity:i?.activity,appBundleId:i?.appBundleId,launchConsole:s,launchArgs:c,terminateRunningApp:i?.terminateRunningApp}),{app:a,...s?{launchConsole:s}:{},...g(`Opened: ${a}`)}}async function cn(e,t,n,r){let{eventName:i,payload:a}=mt(n),o=ht(e,i,a);return await t.open(o,{appBundleId:r?.appBundleId}),{event:i,eventUrl:o,transport:`deep-link`,...g(`Triggered app event: ${i}`)}}async function ln(e,t,n,r){let i=t[0]??n??`./screenshot-${Date.now()}.png`;await O.mkdir(be.dirname(i),{recursive:!0});let a=o(r);return await e.screenshot(i,{appBundleId:r?.appBundleId,pixelDensity:a.pixelDensity,fullscreen:a.fullscreen,normalizeStatusBar:a.normalizeStatusBar,stabilize:a.stabilize,surface:r?.surface,skipIosSimulatorBootCheck:r?.skipIosSimulatorBootCheck,captureBackend:r?.screenshotCaptureBackend}),{path:i,...g(`Saved screenshot: ${i}`)}}async function un(t,n){if(n.length!==2)throw new e(`INVALID_ARGS`,`viewport requires exactly two arguments: <width> <height>`);let r=m(n[0],`width`),i=m(n[1],`height`);if(!t.setViewport)throw new e(`UNSUPPORTED_OPERATION`,`viewport is not supported by this backend`);return await t.setViewport(r,i),{width:r,height:i,...g(`Viewport set: ${r}x${i}`)}}async function dn(t,n){let r=(n[0]??``).toLowerCase();if(r!==`read`&&r!==`write`)throw new e(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);if(r===`read`){if(n.length!==1)throw new e(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:r,text:await t.readClipboard()}}if(n.length<2)throw new e(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=n.slice(1).join(` `);return await t.writeClipboard(i),{action:r,textLength:Array.from(i).length,...g(`Clipboard updated`)}}async function fn(t,n,r,i){if(t.target!==`tv`)throw new e(`UNSUPPORTED_OPERATION`,`tv-remote is supported only on TV targets`,{hint:`Select an Android TV, tvOS, or Vega OS target with --target tv.`});if(r.length!==1)throw new e(`INVALID_ARGS`,`tv-remote requires exactly one button`);let a=le(r[0]),o=i?.durationMs===void 0?void 0:c(i.durationMs,`durationMs`,0,1e4);return await n.tvRemote(a,o),{action:`tv-remote`,button:a,...o===void 0?{}:{durationMs:o},...g(`Pressed TV remote ${a}`)}}async function pn(t,n,r,i){let a=(n[0]??`status`).toLowerCase();if(!re(a))throw new e(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(n.length>1)throw new e(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);if(t.platform===`android`)return await mn(t,a);if(b(t))return await hn(t,a,r,i);throw new e(`UNSUPPORTED_OPERATION`,`keyboard is supported only on Android and iOS`)}async function mn(e,t){if(t===`enter`||t===`return`){let{pressAndroidEnter:t}=await import(`./input-actions.js`).then(e=>e.s);return await t(e),{platform:`android`,action:`enter`,...g(`Keyboard enter pressed`)}}if(t===`dismiss`){let{dismissAndroidKeyboard:t}=await import(`./device-input-state.js`).then(e=>e.t),n=await t(e);return{platform:`android`,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}let{getAndroidKeyboardState:n}=await import(`./device-input-state.js`).then(e=>e.t),r=await n(e);return{platform:`android`,action:`status`,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}async function hn(t,n,r,i){if(n!==`dismiss`&&n!==`enter`&&n!==`return`)throw new e(`UNSUPPORTED_OPERATION`,`keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS`);if(n===`enter`||n===`return`){let{runAppleRunnerCommand:e}=await import(`./runner-client.js`).then(e=>e.o),n=await e(t,{command:`keyboardReturn`,appBundleId:r?.appBundleId},i);return{platform:`ios`,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...g(`Keyboard enter pressed`)}}let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.o),o=await a(t,{command:`keyboardDismiss`,appBundleId:r?.appBundleId},i);return{platform:`ios`,action:`dismiss`,wasVisible:o.wasVisible,dismissed:o.dismissed,visible:o.visible,...g(o.dismissed?`Keyboard dismissed`:`Keyboard already hidden`)}}async function gn(t,n,i,a){let[o,s,c,l]=i;if(!o||!s&&o!==`clear-app-state`)throw new e(`INVALID_ARGS`,`settings requires setting state`);if(o===`clear-app-state`){let i=(s===`clear`?c:s)??a?.appBundleId;if(!i)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);r({level:`debug`,phase:`settings_apply`,data:{setting:o,state:`clear`,appBundleId:i,platform:t.platform}});let l=await n.setSetting(o,`clear`,i);return l&&typeof l==`object`?_({setting:o,state:`clear`,...l},yn(l)??`Cleared user data for ${i}`):{setting:o,state:`clear`,...g(`Cleared user data for ${i}`)}}if(!s)throw new e(`INVALID_ARGS`,`settings requires setting state`);let u=o===`location`&&s===`set`,d=(o===`permission`||u?i[4]:i[2])??a?.appBundleId,f=o===`permission`?{permissionTarget:c,permissionMode:l}:u?{latitude:ue(c,`latitude`),longitude:ue(l,`longitude`)}:void 0;r({level:`debug`,phase:`settings_apply`,data:u?{setting:o,state:s,latitude:c,longitude:l,platform:t.platform}:o===`permission`?{setting:o,state:s,permissionTarget:c,permissionMode:l,platform:t.platform}:{setting:o,state:s,appBundleId:d,platform:t.platform}});let p=await n.setSetting(o,s,d,f);return p&&typeof p==`object`?_({setting:o,state:s,...p},yn(p)??`Updated setting: ${o}`):{setting:o,state:s,...g(`Updated setting: ${o}`)}}async function _n(t,n,r){let i=n[0]?.trim(),a=n[1]?.trim();if(!i||!a)throw new e(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let o=await $t(a);if(b(t)){let{pushIosNotification:e}=await import(`./apps.js`).then(e=>e.t);return await e(t,i,o),{platform:`ios`,bundleId:i,...g(`Pushed notification to ${i}`)}}let{pushAndroidNotification:s}=await import(`./notifications.js`),c=await s(t,i,o);return{platform:`android`,package:i,action:c.action,extrasCount:c.extrasCount,...g(`Pushed notification to ${i}`)}}async function vn(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,includeRects:t?.snapshotIncludeRects,includeHiddenContentHints:t?.snapshotIncludeHiddenContentHints,surface:t?.surface})}function yn(e){return typeof e.message==`string`&&e.message.length>0?e.message:void 0}function bn(e,t,r,i,a,o){return{requestId:a??n().requestId,appBundleId:r,runnerLeaseContext:he({meta:o}),activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:i,iosXctestrunFile:t?.iosXctestrunFile,iosXctestDerivedDataPath:t?.iosXctestDerivedDataPath,iosXctestEnvDir:t?.iosXctestEnvDir,screenshotCaptureBackend:t?.maestro?.screenshotCaptureBackend,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,snapshotIncludeHiddenContentHints:t?.snapshotIncludeHiddenContentHints,...d(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,durationMs:t?.durationMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:h(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}export{we as C,Ee as S,qe as _,Qt as a,Oe as b,dt as c,ot as d,ct as f,Ue as g,Je as h,rn as i,ft as l,We as m,tn as n,W as o,st as p,nn as r,G as s,bn as t,V as u,Me as v,Te as x,De as y};
@@ -0,0 +1,26 @@
1
+ import { t as AndroidAdbExecutor } from "./sdk-android-adb.js";
2
+ //#region src/contracts/android-input-ownership.d.ts
3
+ type AndroidInputOwner = 'app' | 'ime' | 'unknown';
4
+ //#endregion
5
+ //#region src/platforms/android/device-input-state.d.ts
6
+ type AndroidKeyboardType = 'text' | 'number' | 'email' | 'phone' | 'password' | 'datetime' | 'unknown';
7
+ type AndroidKeyboardState = {
8
+ visible: boolean;
9
+ inputType?: string;
10
+ type?: AndroidKeyboardType;
11
+ inputMethodPackage?: string;
12
+ focusedPackage?: string;
13
+ focusedResourceId?: string;
14
+ inputOwner: AndroidInputOwner;
15
+ };
16
+ type AndroidKeyboardDismissResult = AndroidKeyboardState & {
17
+ attempts: number;
18
+ wasVisible: boolean;
19
+ dismissed: boolean;
20
+ };
21
+ declare function getAndroidKeyboardStatusWithAdb(adb: AndroidAdbExecutor): Promise<AndroidKeyboardState>;
22
+ declare function dismissAndroidKeyboardWithAdb(adb: AndroidAdbExecutor): Promise<AndroidKeyboardDismissResult>;
23
+ declare function readAndroidClipboardWithAdb(adb: AndroidAdbExecutor): Promise<string>;
24
+ declare function writeAndroidClipboardWithAdb(adb: AndroidAdbExecutor, text: string): Promise<void>;
25
+ //#endregion
26
+ export { readAndroidClipboardWithAdb as a, getAndroidKeyboardStatusWithAdb as i, AndroidKeyboardState as n, writeAndroidClipboardWithAdb as o, dismissAndroidKeyboardWithAdb as r, AndroidKeyboardDismissResult as t };
package/dist/src/find.js CHANGED
@@ -1 +1 @@
1
- import{u as e}from"./sdk-contracts.js";import{H as t,U as n,W as r,q as i}from"./sdk-batch-runner.js";import{R as a,_n as o,vn as s,z as c}from"./recording-export-quality.js";import"./snapshot-diagnostics.js";import{M as l,h as u}from"./sdk-selectors.js";import{_ as d}from"./gesture-plan-types.js";import{r as f}from"./android-input-method-overlays.js";import{c as p,n as m,s as h,t as g}from"./context.js";import{Ft as _,Kt as v,h as y}from"./internal/daemon.js";import{a as b,t as x,w as S}from"./selector-runtime.js";async function C(e){let{req:n,sessionName:a,logPath:o,sessionStore:s,invoke:c}=e,l=n.command;if(l!==`find`)return null;let u=t(n.positionals??[],n.flags);if(!u.ok)return h(u.code,u.message);let{locator:f,query:m,action:g,value:_}=u.parsed;if(n.flags?.record&&!r(g))return h(`INVALID_ARGS`,`find ${g} is a mutating action and is always recorded; --record only applies to a read-only find (exists, wait, get text, get attrs).`);let v=await x({req:n,sessionName:a,logPath:o,sessionStore:s});if(v)return v;let y=s.get(a);if(!y)return p();let b=y.device,C=i(f,m),O=T({device:b,session:y,req:n,logPath:o,locator:f,query:m,sessionStore:s,sessionName:a}),k={req:n,sessionName:a,logPath:o,sessionStore:s,invoke:c,session:y,device:b,command:l,locator:f,query:m,publicFlags:W(n.flags)},A=await O();if(d(A.snapshotQuality))return E(A.snapshotQuality);let{nodes:j}=A,M=D({nodes:j,locator:f,query:m,selectorChain:C,flags:n.flags,platform:b.platform});if(!M.ok)return S(M.response,A);let N=M.node,F=P(j,N),I=await w(k,{node:N,resolvedNode:F,ref:`@${F.ref}`,nodes:j,actionFlags:{...n.flags??{},noRecord:!0}},g,_);return I&&S(I,A)}async function w(e,t,n,r){let i={click:()=>L(e,t),fill:()=>R(e,t,r),focus:()=>z(e,t),type:()=>B(e,t,r)}[n];return i?await i():null}function T(e){let{device:t,session:n,req:r,logPath:i,locator:a,query:o}=e,{sessionStore:s,sessionName:c}=e,l=b({device:t,session:n,sessionStore:s,sessionName:c,req:r,logPath:i});return async()=>{let{snapshot:e}=await l.capture({flags:{...r.flags,snapshotInteractiveOnly:!0},recovery:{legacyIosSparse:{query:o,shouldScope:K(a)},sparseVerdictQueryScope:{query:o,shouldScope:K(a)}}});return{nodes:e.nodes,snapshotQuality:e.snapshotQuality,systemSurfaceOnly:e.systemSurfaceOnly}}}function E(e){return h(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}function D(e){let{nodes:t,locator:r,query:i,selectorChain:a,flags:o,platform:s}=e,c=t.filter(e=>!F(e,t[0]));if(a){let e=u(c,a,{platform:s,requireRect:!0,requireUnique:!1});return e?{ok:!0,node:e.node}:{ok:!1,response:h(`COMMAND_FAILED`,`find did not match any element`)}}let l=n(c,r,i,{requireRect:!0});if(l.matches=k(l.matches,t),l.matches.length>1){let e=O(l.matches,o);if(!e)return{ok:!1,response:G(l.matches,r,i)};l.matches=e}let d=l.matches[0]??null;return d?{ok:!0,node:d}:{ok:!1,response:h(`COMMAND_FAILED`,`find did not match any element`)}}function O(e,t){return t?.findFirst?[e[0]]:t?.findLast?[e[e.length-1]]:null}function k(t,n){let r=n[0]?.rect;if(!r)return t;let i=t.filter(t=>{if(!t.rect)return!1;let n=e(t.rect);return n.x>=r.x&&n.x<=r.x+r.width&&n.y>=r.y&&n.y<=r.y+r.height});return A(i.length>0?i:t,n)}function A(e,t){return e.length<2?e:e.map((e,n)=>({node:e,index:n,score:j(e,t)})).sort((e,t)=>t.score===e.score?N(e.node)-N(t.node)||e.index-t.index:t.score-e.score).map(e=>e.node)}function j(e,t){let n=c(t,e);if(n.reason===`covered`)return 0;let r=M(n,t[0]);return r>0?r:e.hittable&&e.rect&&!F(e,t[0])?3:+!!e.rect}function M(e,t){return e.node.rect?e.reason===`semantic-target`||e.reason===`same-rect-descendant`?4:e.reason===`hittable-ancestor`&&!F(e.node,t)?2:0:0}function N(e){return e.rect?e.rect.width*e.rect.height:1/0}function P(e,t){let n=a(e,t);return F(n,e[0])&&t.rect?t:n}function F(e,t){if(!t?.rect||!e.rect)return!1;let n=e.type?.toLowerCase()??``;return!n.includes(`application`)&&!n.includes(`window`)?!1:I(e.rect,t.rect)}function I(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}async function L(t,n){let{req:r,sessionName:i,sessionStore:a,session:c,invoke:l,command:u,locator:d,query:f,publicFlags:p}=t,m=await l({token:r.token,session:i,command:`click`,positionals:[n.ref],flags:n.actionFlags,internal:{findResolvedTarget:!0}});if(!m.ok)return m;let h=n.resolvedNode.rect?e(n.resolvedNode.rect):n.node.rect?e(n.node.rect):null,g={ref:n.ref,locator:d,query:f};h&&(g.x=h.x,g.y=h.y);let _=o(m.data)??`Tapped ${n.ref}${h?` (${h.x}, ${h.y})`:``}`;return Object.assign(g,s(_)),y(a,c,r,u,{ref:n.ref,action:`click`,locator:d,query:f},{flags:p}),{ok:!0,data:g}}async function R(e,t,n){let{req:r,sessionName:i,sessionStore:a,session:o,invoke:s,command:c,publicFlags:l}=e;if(!n)return h(`INVALID_ARGS`,`find fill requires text`);let u=await s({token:r.token,session:i,command:`fill`,positionals:[t.ref,n],flags:t.actionFlags,internal:{findResolvedTarget:!0}});return u.ok&&y(a,o,r,c,{ref:t.ref,action:`fill`},{flags:l}),u}async function z(e,t){let n=await V(e,t);return n.ok&&U(e,t,`focus`),n}async function B(e,t,n){let{req:r,device:i,logPath:a,session:o}=e;if(!n)return h(`INVALID_ARGS`,`find type requires text`);let s=await V(e,t);if(!s.ok)return s;_(o);let c=await m(i,`type`,[n],r.flags?.out,{...g(a,r.flags,o.appBundleId,o.trace?.outPath)});return U(e,t,`type`),{ok:!0,data:c??{ref:t.ref}}}async function V(t,n){let{req:r,device:i,logPath:a,session:o}=t,s=H(n,`be focused`);if(s)return s;let c=n.resolvedNode.rect?e(n.resolvedNode.rect):null;return c?(_(o),{ok:!0,data:await m(i,`focus`,[String(c.x),String(c.y)],r.flags?.out,{...g(a,r.flags,o.appBundleId,o.trace?.outPath)})??{ref:n.ref}}):h(`COMMAND_FAILED`,`matched element has no bounds`)}function H(e,t){let n=[e.resolvedNode,e.node].find(f);return n?h(`COMMAND_FAILED`,`Matched element ${e.ref} is covered by another visible element and cannot ${t} safely`,{ref:`@${n.ref}`,interactionBlocked:n.interactionBlocked,hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`}):null}function U(e,t,n){let{req:r,sessionStore:i,session:a,command:o,publicFlags:s}=e;y(i,a,r,o,{ref:t.ref,action:n},{flags:s})}function W(e){return{...v(e)??{}}}function G(e,t,n){let r=e.slice(0,8).map(e=>{let t=l(e)||e.label||e.identifier||e.type||``;return`@${e.ref}${t?`(${t})`:``}`});return h(`AMBIGUOUS_MATCH`,`find matched ${e.length} elements for ${t} "${n}". Use a more specific locator or selector.`,{locator:t,query:n,matches:e.length,candidates:r})}function K(e){return e!==`role`}export{G as buildAmbiguousMatchError,C as handleFindCommands};
1
+ import{u as e}from"./sdk-contracts.js";import{H as t,U as n,W as r,q as i}from"./sdk-batch-runner.js";import{R as a,_n as o,vn as s,z as c}from"./recording-export-quality.js";import"./snapshot-diagnostics.js";import{M as l,h as u}from"./sdk-selectors.js";import{_ as d}from"./gesture-plan-types.js";import{r as f}from"./android-input-method-overlays.js";import{c as p,n as m,s as h,t as g}from"./context.js";import{Ft as _,h as v,qt as y}from"./internal/daemon.js";import{a as b,t as x,w as S}from"./selector-runtime.js";async function C(e){let{req:n,sessionName:a,logPath:o,sessionStore:s,invoke:c}=e,l=n.command;if(l!==`find`)return null;let u=t(n.positionals??[],n.flags);if(!u.ok)return h(u.code,u.message);let{locator:f,query:m,action:g,value:_}=u.parsed;if(n.flags?.record&&!r(g))return h(`INVALID_ARGS`,`find ${g} is a mutating action and is always recorded; --record only applies to a read-only find (exists, wait, get text, get attrs).`);let v=await x({req:n,sessionName:a,logPath:o,sessionStore:s});if(v)return v;let y=s.get(a);if(!y)return p();let b=y.device,C=i(f,m),O=T({device:b,session:y,req:n,logPath:o,locator:f,query:m,sessionStore:s,sessionName:a}),k={req:n,sessionName:a,logPath:o,sessionStore:s,invoke:c,session:y,device:b,command:l,locator:f,query:m,publicFlags:W(n.flags)},A=await O();if(d(A.snapshotQuality))return E(A.snapshotQuality);let{nodes:j}=A,M=D({nodes:j,locator:f,query:m,selectorChain:C,flags:n.flags,platform:b.platform});if(!M.ok)return S(M.response,A);let N=M.node,F=P(j,N),I=await w(k,{node:N,resolvedNode:F,ref:`@${F.ref}`,nodes:j,actionFlags:{...n.flags??{},noRecord:!0}},g,_);return I&&S(I,A)}async function w(e,t,n,r){let i={click:()=>L(e,t),fill:()=>R(e,t,r),focus:()=>z(e,t),type:()=>B(e,t,r)}[n];return i?await i():null}function T(e){let{device:t,session:n,req:r,logPath:i,locator:a,query:o}=e,{sessionStore:s,sessionName:c}=e,l=b({device:t,session:n,sessionStore:s,sessionName:c,req:r,logPath:i});return async()=>{let{snapshot:e}=await l.capture({flags:{...r.flags,snapshotInteractiveOnly:!0},recovery:{legacyIosSparse:{query:o,shouldScope:K(a)},sparseVerdictQueryScope:{query:o,shouldScope:K(a)}}});return{nodes:e.nodes,snapshotQuality:e.snapshotQuality,systemSurfaceOnly:e.systemSurfaceOnly}}}function E(e){return h(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}function D(e){let{nodes:t,locator:r,query:i,selectorChain:a,flags:o,platform:s}=e,c=t.filter(e=>!F(e,t[0]));if(a){let e=u(c,a,{platform:s,requireRect:!0,requireUnique:!1});return e?{ok:!0,node:e.node}:{ok:!1,response:h(`COMMAND_FAILED`,`find did not match any element`)}}let l=n(c,r,i,{requireRect:!0});if(l.matches=k(l.matches,t),l.matches.length>1){let e=O(l.matches,o);if(!e)return{ok:!1,response:G(l.matches,r,i)};l.matches=e}let d=l.matches[0]??null;return d?{ok:!0,node:d}:{ok:!1,response:h(`COMMAND_FAILED`,`find did not match any element`)}}function O(e,t){return t?.findFirst?[e[0]]:t?.findLast?[e[e.length-1]]:null}function k(t,n){let r=n[0]?.rect;if(!r)return t;let i=t.filter(t=>{if(!t.rect)return!1;let n=e(t.rect);return n.x>=r.x&&n.x<=r.x+r.width&&n.y>=r.y&&n.y<=r.y+r.height});return A(i.length>0?i:t,n)}function A(e,t){return e.length<2?e:e.map((e,n)=>({node:e,index:n,score:j(e,t)})).sort((e,t)=>t.score===e.score?N(e.node)-N(t.node)||e.index-t.index:t.score-e.score).map(e=>e.node)}function j(e,t){let n=c(t,e);if(n.reason===`covered`)return 0;let r=M(n,t[0]);return r>0?r:e.hittable&&e.rect&&!F(e,t[0])?3:+!!e.rect}function M(e,t){return e.node.rect?e.reason===`semantic-target`||e.reason===`same-rect-descendant`?4:e.reason===`hittable-ancestor`&&!F(e.node,t)?2:0:0}function N(e){return e.rect?e.rect.width*e.rect.height:1/0}function P(e,t){let n=a(e,t);return F(n,e[0])&&t.rect?t:n}function F(e,t){if(!t?.rect||!e.rect)return!1;let n=e.type?.toLowerCase()??``;return!n.includes(`application`)&&!n.includes(`window`)?!1:I(e.rect,t.rect)}function I(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}async function L(t,n){let{req:r,sessionName:i,sessionStore:a,session:c,invoke:l,command:u,locator:d,query:f,publicFlags:p}=t,m=await l({token:r.token,session:i,command:`click`,positionals:[n.ref],flags:n.actionFlags,internal:{findResolvedTarget:!0}});if(!m.ok)return m;let h=n.resolvedNode.rect?e(n.resolvedNode.rect):n.node.rect?e(n.node.rect):null,g={ref:n.ref,locator:d,query:f};h&&(g.x=h.x,g.y=h.y);let _=o(m.data)??`Tapped ${n.ref}${h?` (${h.x}, ${h.y})`:``}`;return Object.assign(g,s(_)),v(a,c,r,u,{ref:n.ref,action:`click`,locator:d,query:f},{flags:p}),{ok:!0,data:g}}async function R(e,t,n){let{req:r,sessionName:i,sessionStore:a,session:o,invoke:s,command:c,publicFlags:l}=e;if(!n)return h(`INVALID_ARGS`,`find fill requires text`);let u=await s({token:r.token,session:i,command:`fill`,positionals:[t.ref,n],flags:t.actionFlags,internal:{findResolvedTarget:!0}});return u.ok&&v(a,o,r,c,{ref:t.ref,action:`fill`},{flags:l}),u}async function z(e,t){let n=await V(e,t);return n.ok&&U(e,t,`focus`),n}async function B(e,t,n){let{req:r,device:i,logPath:a,session:o}=e;if(!n)return h(`INVALID_ARGS`,`find type requires text`);let s=await V(e,t);if(!s.ok)return s;_(o);let c=await m(i,`type`,[n],r.flags?.out,{...g(a,r.flags,o.appBundleId,o.trace?.outPath)});return U(e,t,`type`),{ok:!0,data:c??{ref:t.ref}}}async function V(t,n){let{req:r,device:i,logPath:a,session:o}=t,s=H(n,`be focused`);if(s)return s;let c=n.resolvedNode.rect?e(n.resolvedNode.rect):null;return c?(_(o),{ok:!0,data:await m(i,`focus`,[String(c.x),String(c.y)],r.flags?.out,{...g(a,r.flags,o.appBundleId,o.trace?.outPath)})??{ref:n.ref}}):h(`COMMAND_FAILED`,`matched element has no bounds`)}function H(e,t){let n=[e.resolvedNode,e.node].find(f);return n?h(`COMMAND_FAILED`,`Matched element ${e.ref} is covered by another visible element and cannot ${t} safely`,{ref:`@${n.ref}`,interactionBlocked:n.interactionBlocked,hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`}):null}function U(e,t,n){let{req:r,sessionStore:i,session:a,command:o,publicFlags:s}=e;v(i,a,r,o,{ref:t.ref,action:n},{flags:s})}function W(e){return{...y(e)??{}}}function G(e,t,n){let r=e.slice(0,8).map(e=>{let t=l(e)||e.label||e.identifier||e.type||``;return`@${e.ref}${t?`(${t})`:``}`});return h(`AMBIGUOUS_MATCH`,`find matched ${e.length} elements for ${t} "${n}". Use a more specific locator or selector.`,{locator:t,query:n,matches:e.length,candidates:r})}function K(e){return e!==`role`}export{G as buildAmbiguousMatchError,C as handleFindCommands};
@@ -1,5 +1,5 @@
1
1
  import { A as SnapshotNode, B as DeviceTarget, C as normalizeAgentDeviceError, F as SnapshotVisibility, H as PlatformSelector, I as centerOfRect, L as AppleOS, P as SnapshotUnchanged, S as isAgentDeviceError, U as PublicPlatform, _ as SessionIsolationMode, a as DaemonLockPolicy, b as NormalizedError, c as DaemonResponseData, g as ResponseLevel, i as DaemonInstallSource, m as NetworkIncludeMode, o as DaemonRequest, p as LeaseBackend, r as DaemonError, s as DaemonResponse, t as DaemonArtifact, v as SessionRuntimeHints, y as AppError, z as DeviceKind } from "./sdk-contracts.js";
2
- import { c as ScrollInputDirection, d as TransformGestureParams, l as SwipePattern, o as GesturePointerCount, s as ScrollDirection, u as SwipePreset } from "./sdk-android-adb.js";
2
+ import { c as ScrollDirection, d as SwipePreset, f as TransformGestureParams, l as ScrollInputDirection, s as GesturePointerCount, u as SwipePattern } from "./sdk-android-adb.js";
3
3
  import { t as AppsFilter } from "./sdk-app-inventory.js";
4
4
  import { t as BatchRunResult } from "./sdk-batch-runner.js";
5
5
  import { r as FindLocator } from "./sdk-finders.js";
@@ -1 +1 @@
1
- import{j as e}from"./sdk-android-adb.js";import{J as t,X as n,ot as r}from"./snapshot-diagnostics.js";import{_ as i}from"./gesture-plan-types.js";import{a}from"./input-actions.js";import{Ct as o,Gt as s,Jt as c,Kt as l,Rt as u,Wt as d,Yt as f,jt as p,wt as m}from"./internal/daemon.js";import{i as h}from"./session-target-evidence.js";function g(e){let{session:t,sessionStore:n,command:r,positionals:i,actionCommand:a=r,retryPositionals:u,flags:p,result:m,responseData:g,recordedTarget:v,actionStartedAt:y,actionFinishedAt:b,androidFreshnessBaseline:x}=e,S=l(p),[C,w]=_({command:r,positionals:i,flags:S,result:m,responseData:g}),T=t.recordSession&&v?h(v):void 0;return n.recordAction(t,{command:r,positionals:i,flags:S??{},result:C,...T?{targetEvidence:T}:{}}),s({session:t,command:r,positionals:u??i,flags:p,preSnapshot:t.snapshot}),c(a)&&f(t,a,x??t.snapshot),d(t,a,u??i,p),o(t,a,i,C,S??{},y,b),{ok:!0,data:w}}function _(e){if(e.command!==`fill`||typeof e.flags?.recordAs!=`string`)return[e.result,e.responseData];let i=r({ts:0,command:`fill`,positionals:e.positionals,flags:e.flags,result:e.result}),a=n(e.flags.recordAs);return[t(e.result,i,a),t(e.responseData,i,a)]}async function v(e){let{session:t,flags:n,sessionStore:r,contextFromFlags:i,captureSnapshotForSession:o}=e;if(!t.recording)return;if(t.recording.touchReferenceFrame)return t.recording.touchReferenceFrame;if(t.device.platform===`android`){let e=await a(t.device),n={referenceWidth:e.width,referenceHeight:e.height};return t.recording&&(t.recording.touchReferenceFrame=n),n}let s=m(t.snapshot);if(s)return t.recording&&(t.recording.touchReferenceFrame=s),s;if(!t.recording)return;let c=m(await o(t,n,r,i,{interactiveOnly:!0}));return c&&t.recording&&(t.recording.touchReferenceFrame=c),c}async function y(t){try{return await v(t)}catch(n){e({level:`warn`,phase:`touch_reference_frame_resolve_failed`,data:{platform:t.session.device.platform,error:n instanceof Error?n.message:String(n)}});return}}function b(e){return m({nodes:e,createdAt:0})}async function x(e,t,n,r,a){let o={...t??{},snapshotInteractiveOnly:a.interactiveOnly},s=r(o,e.appBundleId,e.trace?.outPath),{snapshot:c}=await u({device:e.device,session:e,flags:o,outPath:o.out,logPath:s.logPath??``,includeRects:a.includeRects,androidFreshnessMode:a.androidFreshnessMode});return i(c.snapshotQuality)||(p(e,c),n.set(e.name,e)),c}export{g as i,b as n,y as r,x as t};
1
+ import{j as e}from"./sdk-android-adb.js";import{J as t,X as n,ot as r}from"./snapshot-diagnostics.js";import{_ as i}from"./gesture-plan-types.js";import{a}from"./input-actions.js";import{Ct as o,Gt as s,Kt as c,Xt as l,Yt as u,jt as d,qt as f,wt as p,zt as m}from"./internal/daemon.js";import{i as h}from"./session-target-evidence.js";function g(e){let{session:t,sessionStore:n,command:r,positionals:i,actionCommand:a=r,retryPositionals:d,flags:p,result:m,responseData:g,recordedTarget:v,actionStartedAt:y,actionFinishedAt:b,androidFreshnessBaseline:x}=e,S=f(p),[C,w]=_({command:r,positionals:i,flags:S,result:m,responseData:g}),T=t.recordSession&&v?h(v):void 0;return n.recordAction(t,{command:r,positionals:i,flags:S??{},result:C,...T?{targetEvidence:T}:{}}),c({session:t,command:r,positionals:d??i,flags:p,preSnapshot:t.snapshot}),u(a)&&l(t,a,x??t.snapshot),s(t,a,d??i,p),o(t,a,i,C,S??{},y,b),{ok:!0,data:w}}function _(e){if(e.command!==`fill`||typeof e.flags?.recordAs!=`string`)return[e.result,e.responseData];let i=r({ts:0,command:`fill`,positionals:e.positionals,flags:e.flags,result:e.result}),a=n(e.flags.recordAs);return[t(e.result,i,a),t(e.responseData,i,a)]}async function v(e){let{session:t,flags:n,sessionStore:r,contextFromFlags:i,captureSnapshotForSession:o}=e;if(!t.recording)return;if(t.recording.touchReferenceFrame)return t.recording.touchReferenceFrame;if(t.device.platform===`android`){let e=await a(t.device),n={referenceWidth:e.width,referenceHeight:e.height};return t.recording&&(t.recording.touchReferenceFrame=n),n}let s=p(t.snapshot);if(s)return t.recording&&(t.recording.touchReferenceFrame=s),s;if(!t.recording)return;let c=p(await o(t,n,r,i,{interactiveOnly:!0}));return c&&t.recording&&(t.recording.touchReferenceFrame=c),c}async function y(t){try{return await v(t)}catch(n){e({level:`warn`,phase:`touch_reference_frame_resolve_failed`,data:{platform:t.session.device.platform,error:n instanceof Error?n.message:String(n)}});return}}function b(e){return p({nodes:e,createdAt:0})}async function x(e,t,n,r,a){let o={...t??{},snapshotInteractiveOnly:a.interactiveOnly},s=r(o,e.appBundleId,e.trace?.outPath),{snapshot:c}=await m({device:e.device,session:e,flags:o,outPath:o.out,logPath:s.logPath??``,includeRects:a.includeRects,androidFreshnessMode:a.androidFreshnessMode});return i(c.snapshotQuality)||(d(e,c),n.set(e.name,e)),c}export{g as i,b as n,y as r,x as t};
@@ -1 +1 @@
1
- import{S as e,_ as t,v as n}from"./sdk-contracts.js";import{j as r}from"./sdk-android-adb.js";import{D as i,O as a,P as o,k as s}from"./sdk-batch-runner.js";import{On as c,c as l,d as u,dn as d,f,g as p,jt as m,ln as ee,p as h,un as te,vn as g}from"./recording-export-quality.js";import{Z as _}from"./snapshot-diagnostics.js";import{c as v,h as y,o as ne}from"./sdk-device.js";import{F as re,N as ie}from"./gesture-plan-types.js";import{t as ae}from"./timeouts.js";import{t as oe}from"./runtime.js";import"./gesture-plan.js";import{C as se,c as b,f as x,i as ce,l as S,n as C,o as le,r as ue,s as w}from"./context.js";import{At as T,Dt as de,Et as E,Ft as D,It as fe,Lt as pe,Ot as me,Pt as he,jt as ge,kt as _e,m as ve,qt as ye}from"./internal/daemon.js";import{_ as O,c as be,d as xe,f as Se,g as k,h as Ce,l as we,m as Te,n as Ee,o as De,p as Oe,r as ke,s as Ae,u as je,v as Me,y as A}from"./selector-runtime.js";import{i as j,n as M,r as Ne,t as N}from"./interaction-snapshot.js";const Pe=new Set(s());function Fe(e){return Le({fields:Ie(e.command),input:e.input??{},data:e.data,controlledFields:Pe})}function Ie(e){let t=o(e);if(!t)throw Error(`Missing response data transform descriptor for ${e}`);return t.fields}function Le(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 Re=new Set([`currentUptimeMs`,`gestureEndUptimeMs`,`gestureStartUptimeMs`,`sequenceResults`]);function ze(e){if(e)return Object.fromEntries(Object.entries(e).filter(([e])=>!Re.has(e)))}const Be={source:`direct-ios`,kind:`not-observed`};function P(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`){let e={targetKind:t.targetKind,...t.maestroFallbackUsed?{}:{resolution:Be},...r??{}};return{result:I({data:t.data,fallbackX:t.point.x,fallbackY:t.point.y,referenceFrame:n,extra:e}),responseData:I({data:t.publicData,fallbackX:t.point.x,fallbackY:t.point.y,referenceFrame:n,extra:e})}}let{result:i}=t,a=Se(i),o={targetKind:i.kind,...a,...Ue(i.settle,e.settleRefsGeneration),...r??{}},s=I({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:{...o,...He(i)}}),c=I({data:t.publicData,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:o}),l=We(`warning`in i?i.warning:void 0,e.staleRefsWarning);return l&&(s.warning=l,c.warning=l),{result:s,responseData:c,...Ve(i)}}function Ve(e){let t=F(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=F(e);return t?{selectorChain:t.selectorChain,refLabel:t.refLabel}:{}}function F(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 I(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??{},...g(o)})}function Ge(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function Ke(e,t,n){let r=L(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 L(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=L(e,`ref`);return t===void 0?L(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}`}function R(e,t){return!v(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:w(`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.`)}function z(e){let n=e.sessionStore.get(e.sessionName);if(!n)throw new t(`SESSION_NOT_FOUND`,le);return oe({backend:Ze({...e,session:n}),...De(`interaction commands`,{plural:!0}),sessions:me({sessionName:e.sessionName,getSession:()=>n,recordOptions:{includeSnapshot:!0,omitRefFrameSnapshot:e.req.internal?.findResolvedTarget===!0},setRecord:t=>{t.snapshot&&(ge(n,t.snapshot),e.sessionStore.set(e.sessionName,n))}})})}function Ze(e){let{req:t,session:n}=e,r=Qe(n);return{platform:y(n.device),captureSnapshot:async(r,i)=>({snapshot:await e.captureSnapshotForSession(n,t.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:i?.interactiveOnly===!0,includeRects:i?.includeRects===!0})}),resolveGestureViewport:async()=>e.pairedGestureViewport??await ce(n.device,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath)),tap:async(r,i)=>(D(n),B(await C(n.device,`press`,[String(i.x),String(i.y)],t.flags?.out,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath)))),tapTarget:r?.clickRef?async(e,t)=>(D(n),await r.clickRef?.(t.ref),{ref:k(t.ref)}):void 0,fill:async(r,i,a)=>(D(n),B(await C(n.device,`fill`,[String(i.x),String(i.y),a],t.flags?.out,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath)))),fillTarget:r?.fillRef?async(e,t,i,a)=>(D(n),await r.fillRef?.(t.ref,i,a),{ref:k(t.ref),text:i,delayMs:a?.delayMs??0}):void 0,longPress:async(r,i,a)=>(D(n),B(await C(n.device,`longpress`,[String(i.x),String(i.y),...a?.durationMs===void 0?[]:[String(a.durationMs)]],t.flags?.out,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath)))),performGesture:async(r,i)=>(D(n),B(await ue(n.device,i,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath)))),typeText:async(r,i)=>(D(n),B(await C(n.device,`type`,[i],t.flags?.out,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath))))}}function Qe(e){if(e.device.platform!==`web`)return;let t=ve();return t.clickRef||t.fillRef?t:void 0}function B(e){return e&&typeof e==`object`?e:void 0}function V(e){let t=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref,n=he({session:e.session,refBody:t,mintedGeneration:e.mintedGeneration});if(n.admitted)return null;let r=pe(e.session);return w(`COMMAND_FAILED`,et(n.reason,e.ref),{reason:n.reason,ref:e.ref,currentGeneration:fe(e.session),scope:r===`all`?`all`:Array.from(r),...e.mintedGeneration===void 0?{}:{mintedGeneration:e.mintedGeneration},hint:e.staleRefsWarning??$e})}const $e=`Capture a fresh interactive snapshot (snapshot -i) or use a stable selector, then retry.`;function et(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 tt(e){let n=e.flags?.recordAs;if(n!==void 0){if(_(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.`)}}async function nt(e){switch(e.req.command){case`press`:return await H(e,`press`);case`click`:return await H(e,`click`);case`longpress`:return await H(e,`longpress`);case`fill`:return await mt(e);default:return null}}async function H(e,t){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return b();let o=t===`click`?`click`:t,s=t===`longpress`?`longpress`:`press`,c=R(a,o);if(c)return c;let l=S(s,a.device);if(l)return l;let u=A(t,n.flags);if(u)return u;let f=d(n.flags),p=ee(f);if(t!==`longpress`&&f!==`primary`){let e=te({commandLabel:o,platform:y(a.device),button:f,count:n.flags?.count,intervalMs:n.flags?.intervalMs,holdMs:n.flags?.holdMs,jitterPx:n.flags?.jitterPx,doubleTap:n.flags?.doubleTap});if(e)return w(e.code,e.message,e.details)}let m=t===`longpress`?Te(n.positionals??[]):Ce(n.positionals??[],o);if(!m.ok)return m.response;let h=m.target.kind===`ref`&&n.internal?.findResolvedTarget!==!0?T({session:a,ref:m.target.ref,mintedGeneration:m.refGeneration}):void 0,g;if(m.target.kind===`ref`){let r=e.refSnapshotFlagGuardResponse(t===`longpress`?`longpress`:`press`,n.flags);if(r)return r;let i=n.internal?.findResolvedTarget?null:V({session:a,ref:m.target.ref,mintedGeneration:m.refGeneration,staleRefsWarning:h});if(i)return i;g=await J(e,a)}let _=n.internal?.replayTargetGuard,v=_?null:st({session:a,commandLabel:o,target:m.target,flags:n.flags});if(v){let t=await lt(e,a,v);if(t)return t}let ne=t===`longpress`?m.durationMs:void 0;return await q(e,{androidFreshnessBaseline:g,refContext:m.target.kind===`ref`&&n.internal?.findResolvedTarget!==!0?{ref:m.target.ref,mintedGeneration:m.refGeneration,staleRefsWarning:h}:void 0,run:async e=>await rt({runtime:e,command:t,target:m.target,sessionName:r,requestId:n.meta?.requestId,clickButton:f,flags:n.flags,durationMs:ne,expectedResolvedTarget:_}),afterRun:async e=>{a.lease?.leaseProvider||await we(a,xe(m.target,e))},buildPayloads:async r=>{let i=ot(r);return await it({params:e,session:a,result:r,staleRefsWarning:h,publicData:K({session:a,command:t===`longpress`?void 0:t,flags:n.flags,data:r.backendResult}),extra:t===`longpress`?{...i===void 0?{}:{durationMs:i},gesture:`longpress`}:p})}})}async function rt(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o,expectedResolvedTarget:s}=e,c=O(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 it(e){let{params:t,session:n,result:r,publicData:i,extra:a}=e,o=r.kind===`point`?await Ne({session:n,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession}):M(n.snapshot?.nodes??[]);return P({source:{kind:`runtime`,result:r,publicData:i},referenceFrame:o,extra:a,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:U(n,r)})}function U(e,t){if(t.settle?.diff)return _e(e,at(t.settle)),e.snapshotGeneration}function at(e){let t=[];for(let n of e.diff?.lines??[])n.ref&&t.push(n.ref);for(let n of e.refs??[])t.push(n.ref);for(let n of e.tail??[])t.push(n.ref);return t}function ot(e){return`durationMs`in e?e.durationMs:void 0}function st(e){let{session:t,commandLabel:n,target:r,flags:o}=e;return n!==`click`||r.kind!==`selector`||t.recordSession||ct(o)||a(n)&&o?.verify===!0||i(n)&&o?.settle===!0?null:W(t,r.selector,o)}function W(e,t,n){let r=be({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},...n?.maestro?.expectedTapPoint?{expectedPoint:n.maestro.expectedTapPoint}:{}}:null}function ct(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 lt(e,t,n){return await G({params:e,session:t,selector:n,command:`press`,positionals:[],extra:{selector:n.raw},fallbackPhase:`ios_direct_selector_tap_fallback`})}async function G(t){let{params:n,session:i,selector:a,command:o,positionals:s,extra:c,fallbackPhase:l}=t,u=Date.now();D(i);try{let e=await C(i.device,o,s,n.req.flags?.out,{...n.contextFromFlags(n.req.flags,i.appBundleId,i.trace?.outPath),directElementSelector:a,surface:i.surface})??{},t=Date.now(),r=ft(e),l=K({session:i,command:ut(n.req.command,o),flags:n.req.flags,data:e}),d=dt(a,e),{result:f,responseData:p}=P({source:{kind:`runner-payload`,targetKind:`selector`,data:e,publicData:l,point:r,maestroFallbackUsed:d.maestroNonHittableCoordinateFallbackUsed===!0},referenceFrame:pt(e),extra:{...c,...d}});return j({session:i,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??[],retryPositionals:Y(r),flags:n.req.flags,result:f,responseData:p,actionStartedAt:u,actionFinishedAt:t})}catch(t){return Ae(t,{delegateSemanticFailures:a.allowNonHittableCoordinateFallback!==!0})?(r({level:`debug`,phase:l,data:{selector:a.raw,error:t instanceof Error?t.message:String(t)}}),null):{ok:!1,error:e(t)}}}function K(e){let t=ne(e.session.device.platform)?ze(e.data):e.data;return e.command?Fe({command:e.command,input:e.flags,data:t}):t}function ut(e,t){return e===`click`||e===`press`||e===`fill`?e:t}function dt(e,t){if(!e.allowNonHittableCoordinateFallback)return{};let n=t.maestroNonHittableCoordinateFallbackUsed===!0;return{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:n,...n?{maestroFallbackReason:`non-hittable-coordinate`}:{}}}function ft(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 pt(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}async function mt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i){let e=R(i,`fill`);if(e)return e;let t=S(`fill`,i.device);if(t)return t}if(!i)return b();tt({session:i,flags:t.flags,replayPlanStep:t.internal?.replayPlanStep===!0});let a=A(`fill`,t.flags);if(a)return a;let o=Oe(t.positionals??[]);if(!o.ok)return o.response;let s=await ht(e,i,o.target,o.refGeneration);if(s.response)return s.response;let{staleRefsWarning:c}=s,l=t.internal?.replayTargetGuard;return(l?null:await gt(e,i,o.target,o.text))||await q(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,verify:t.flags?.verify,settle:O(t.flags),expectedResolvedTarget:l}),buildPayloads:e=>_t({session:i,result:e,text:o.text,flags:t.flags,staleRefsWarning:c})})}async function ht(e,t,n,r){if(n.kind!==`ref`)return{};let i=e.req.internal?.findResolvedTarget===!0?void 0:T({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:V({session:t,ref:n.ref,mintedGeneration:r,staleRefsWarning:i});return o?{response:o,staleRefsWarning:i}:(await J(e,t),{staleRefsWarning:i})}async function gt(e,t,n,r){let i=vt({session:t,target:n,flags:e.req.flags});return i?await yt(e,t,i,r):null}function _t(e){let{session:t,result:n}=e,r=n.kind===`point`?void 0:M(t.snapshot?.nodes??[]);return P({source:{kind:`runtime`,result:n,publicData:K({session:t,command:`fill`,flags:e.flags,data:n.backendResult})},referenceFrame:r,extra:{text:e.text},staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:U(t,n)})}function vt(e){let{session:t,target:n,flags:r}=e;return n.kind!==`selector`||t.recordSession||a(`fill`)&&r?.verify===!0||i(`fill`)&&r?.settle===!0?null:W(t,n.selector,r)}async function yt(e,t,n,r){return await G({params:e,session:t,selector:n,command:`fill`,positionals:[r],extra:{selector:n.raw,text:r},fallbackPhase:`ios_direct_selector_fill_fallback`})}async function q(e,t){let r=e.sessionStore.get(e.sessionName);if(!r)return b();let i=z(e),a=Date.now();try{let n=await bt(r,e.req.command,{refContext:t.refContext},async()=>{let e=await t.run(i);return await t.afterRun?.(e),e});if(n.aborted)return n.response;let{readiness:o,runtimeResult:s}=n,c=Date.now(),{result:l,responseData:u,recordedTarget:d}=await t.buildPayloads(s);if(o.status===`recovered`){let e=typeof u.warning==`string`?`${u.warning} ${o.warning}`:o.warning;l.warning=e,u.warning=e}return j({session:r,sessionStore:e.sessionStore,command:e.req.command,positionals:e.req.positionals??[],retryPositionals:St(e.req.command,s),flags:e.req.flags,result:l,responseData:u,recordedTarget:d,actionStartedAt:a,actionFinishedAt:c,androidFreshnessBaseline:t.androidFreshnessBaseline})}catch(e){let t=n(e);if(je(t))throw t;return xt(e)}}async function bt(e,t,n,r){if(e.lease?.leaseProvider)return{aborted:!1,readiness:{status:`clear`},runtimeResult:await r()};let i=await E({session:e,command:t,phase:`before-command`});if(n.refContext&&i.status===`recovered`){let t=V({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 E({session:e,command:t,phase:`after-command`}),{aborted:!1,readiness:i,runtimeResult:a}}async function J(e,t){if(!ye(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){r({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function xt(t){return{ok:!1,error:e(t)}}function St(e,t){if(!(t.kind===`ref`&&!t.node)&&(e===`click`||e===`press`))return t.point?Y(t.point):void 0}function Y(e){return[String(e.x),String(e.y)]}async function Ct(e){return await Z(e,`gesture`,async t=>{let n=p(e.req.input),r=f(n);r.gesture.intent===`pan`&&e.req.internal?.gestureExecutionProfile&&(r.gesture.executionProfile=e.req.internal.gestureExecutionProfile),x(r.gesture,t.device);let i=await X(e).interactions.gesture({session:e.sessionName,requestId:e.req.meta?.requestId,gesture:r.gesture});return{positionals:u(n),flags:jt(n,e.req.flags),responseData:Q(i,{executionProfile:Tt(r.gesture)}),...n.kind===`pinch`?{recordingResultExtra:{scale:n.scale}}:{}}})}async function wt(e){return await Z(e,`swipe`,async t=>{let n=Et(e.req.input);x(h(n).gesture,t.device);let r=n.count??1,i=n.pauseMs??0,a=n.pattern??`one-way`,o=await kt(X(e),e,n,r,i,a);return{positionals:Ot(n),flags:e.req.flags,responseData:Q(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 X(e){return z({...e,pairedGestureViewport:e.req.internal?.gestureViewport})}async function Z(t,n,r){let i=t.sessionStore.get(t.sessionName);if(!i)return b();let a=Date.now();try{let e=se(i.device),o=e?{status:`clear`}:await E({session:i,command:n,phase:`before-command`}),s=await r(i);e||await E({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}`),j({session:i,sessionStore:t.sessionStore,command:n,actionCommand:n,positionals:s.positionals,flags:s.flags,result:{...c,...s.recordingResultExtra??{}},responseData:c,actionStartedAt:a,actionFinishedAt:Date.now()})}catch(t){return{ok:!1,error:e(t)}}}function Tt(e){if(e.intent===`fling`)return`endpoint-hold`;if(e.intent===`pan`)return e.executionProfile??`timed-pan`}function Q(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.backendResult??{},...t,...n?{timing:{executionProfile:n,gestureDurationMs:e.durationMs}}:{},message:e.message}}function Et(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`swipe requires structured object input`);l(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:m(n,`count`,{min:1,max:200}),pauseMs:m(n,`pauseMs`,{min:0,max:ie}),pattern:r};return Dt(i),i}function Dt(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 ${re}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 Ot(e){return[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y)]}async function kt(e,t,n,r,i,a){let o;for(let s=0;s<r;s+=1){let c=h(At(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 ae(i)}if(!o)throw Error(`Swipe orchestration did not execute a gesture.`);return o}function At(e,t,n){return t===`ping-pong`&&n%2==1?{...e,from:e.to,to:e.from}:e}function jt(e,t){return e.kind!==`pan`||e.pointerCount===void 0?t:{...t,pointerCount:e.pointerCount}}async function Mt(e){let t=await nt({...e,captureSnapshotForSession:N,refSnapshotFlagGuardResponse:Me});if(t)return t;switch(e.req.command){case c.gesture:return await Ct({...e,captureSnapshotForSession:N});case c.swipe:return await wt({...e,captureSnapshotForSession:N});case c.type:return await Nt({...e,captureSnapshotForSession:N});case`get`:return await Ee(e);case`is`:return await ke(e);default:return null}}async function Nt(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);return r?S(c.type,r.device)||await Pt(r)||await Ft(e,r):b()}async function Pt(e){return e.device.platform===`android`&&e.recording&&(await de({session:e})).status===`failed`?w(`COMMAND_FAILED`,`Android system dialog blocked the recording session`):null}async function Ft(t,n){let{req:r,sessionName:i,sessionStore:a}=t,o=(r.positionals??[]).join(` `),s=z(t),c=Date.now();try{let e=await E({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 E({session:n,command:r.command,phase:`after-command`});let l=Date.now(),u={...t.backendResult??{},text:t.text,delayMs:t.delayMs,...g(t.message??`Typed ${Array.from(t.text).length} chars`)};return e.status===`recovered`&&(u.warning=e.warning),j({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{Mt as handleInteractionCommands};
1
+ import{S as e,_ as t,v as n}from"./sdk-contracts.js";import{j as r}from"./sdk-android-adb.js";import{D as i,O as a,P as o,k as s}from"./sdk-batch-runner.js";import{On as c,c as l,d as u,dn as d,f,g as p,jt as m,ln as ee,p as h,un as te,vn as g}from"./recording-export-quality.js";import{Z as _}from"./snapshot-diagnostics.js";import{c as v,h as y,o as ne}from"./sdk-device.js";import{F as re,N as ie}from"./gesture-plan-types.js";import{t as ae}from"./timeouts.js";import{t as oe}from"./runtime.js";import"./gesture-plan.js";import{C as se,c as b,f as x,i as ce,l as S,n as C,o as le,r as ue,s as w}from"./context.js";import{At as T,Dt as de,Et as E,Ft as D,Jt as fe,Lt as pe,Ot as me,Pt as he,Rt as ge,jt as _e,kt as ve,m as ye}from"./internal/daemon.js";import{_ as O,c as be,d as xe,f as Se,g as k,h as Ce,l as we,m as Te,n as Ee,o as De,p as Oe,r as ke,s as Ae,u as je,v as Me,y as A}from"./selector-runtime.js";import{i as j,n as M,r as Ne,t as N}from"./interaction-snapshot.js";const Pe=new Set(s());function Fe(e){return Le({fields:Ie(e.command),input:e.input??{},data:e.data,controlledFields:Pe})}function Ie(e){let t=o(e);if(!t)throw Error(`Missing response data transform descriptor for ${e}`);return t.fields}function Le(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 Re=new Set([`currentUptimeMs`,`gestureEndUptimeMs`,`gestureStartUptimeMs`,`sequenceResults`]);function ze(e){if(e)return Object.fromEntries(Object.entries(e).filter(([e])=>!Re.has(e)))}const Be={source:`direct-ios`,kind:`not-observed`};function P(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`){let e={targetKind:t.targetKind,...t.maestroFallbackUsed?{}:{resolution:Be},...r??{}};return{result:I({data:t.data,fallbackX:t.point.x,fallbackY:t.point.y,referenceFrame:n,extra:e}),responseData:I({data:t.publicData,fallbackX:t.point.x,fallbackY:t.point.y,referenceFrame:n,extra:e})}}let{result:i}=t,a=Se(i),o={targetKind:i.kind,...a,...Ue(i.settle,e.settleRefsGeneration),...r??{}},s=I({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:{...o,...He(i)}}),c=I({data:t.publicData,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:o}),l=We(`warning`in i?i.warning:void 0,e.staleRefsWarning);return l&&(s.warning=l,c.warning=l),{result:s,responseData:c,...Ve(i)}}function Ve(e){let t=F(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=F(e);return t?{selectorChain:t.selectorChain,refLabel:t.refLabel}:{}}function F(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 I(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??{},...g(o)})}function Ge(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function Ke(e,t,n){let r=L(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 L(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=L(e,`ref`);return t===void 0?L(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}`}function R(e,t){return!v(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:w(`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.`)}function z(e){let n=e.sessionStore.get(e.sessionName);if(!n)throw new t(`SESSION_NOT_FOUND`,le);return oe({backend:Ze({...e,session:n}),...De(`interaction commands`,{plural:!0}),sessions:me({sessionName:e.sessionName,getSession:()=>n,recordOptions:{includeSnapshot:!0,omitRefFrameSnapshot:e.req.internal?.findResolvedTarget===!0},setRecord:t=>{t.snapshot&&(_e(n,t.snapshot),e.sessionStore.set(e.sessionName,n))}})})}function Ze(e){let{req:t,session:n}=e,r=Qe(n);return{platform:y(n.device),captureSnapshot:async(r,i)=>({snapshot:await e.captureSnapshotForSession(n,t.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:i?.interactiveOnly===!0,includeRects:i?.includeRects===!0})}),resolveGestureViewport:async()=>e.pairedGestureViewport??await ce(n.device,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath)),tap:async(r,i)=>(D(n),B(await C(n.device,`press`,[String(i.x),String(i.y)],t.flags?.out,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath)))),tapTarget:r?.clickRef?async(e,t)=>(D(n),await r.clickRef?.(t.ref),{ref:k(t.ref)}):void 0,fill:async(r,i,a)=>(D(n),B(await C(n.device,`fill`,[String(i.x),String(i.y),a],t.flags?.out,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath)))),fillTarget:r?.fillRef?async(e,t,i,a)=>(D(n),await r.fillRef?.(t.ref,i,a),{ref:k(t.ref),text:i,delayMs:a?.delayMs??0}):void 0,longPress:async(r,i,a)=>(D(n),B(await C(n.device,`longpress`,[String(i.x),String(i.y),...a?.durationMs===void 0?[]:[String(a.durationMs)]],t.flags?.out,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath)))),performGesture:async(r,i)=>(D(n),B(await ue(n.device,i,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath)))),typeText:async(r,i)=>(D(n),B(await C(n.device,`type`,[i],t.flags?.out,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath))))}}function Qe(e){if(e.device.platform!==`web`)return;let t=ye();return t.clickRef||t.fillRef?t:void 0}function B(e){return e&&typeof e==`object`?e:void 0}function V(e){let t=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref,n=he({session:e.session,refBody:t,mintedGeneration:e.mintedGeneration});if(n.admitted)return null;let r=ge(e.session);return w(`COMMAND_FAILED`,et(n.reason,e.ref),{reason:n.reason,ref:e.ref,currentGeneration:pe(e.session),scope:r===`all`?`all`:Array.from(r),...e.mintedGeneration===void 0?{}:{mintedGeneration:e.mintedGeneration},hint:e.staleRefsWarning??$e})}const $e=`Capture a fresh interactive snapshot (snapshot -i) or use a stable selector, then retry.`;function et(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 tt(e){let n=e.flags?.recordAs;if(n!==void 0){if(_(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.`)}}async function nt(e){switch(e.req.command){case`press`:return await H(e,`press`);case`click`:return await H(e,`click`);case`longpress`:return await H(e,`longpress`);case`fill`:return await mt(e);default:return null}}async function H(e,t){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return b();let o=t===`click`?`click`:t,s=t===`longpress`?`longpress`:`press`,c=R(a,o);if(c)return c;let l=S(s,a.device);if(l)return l;let u=A(t,n.flags);if(u)return u;let f=d(n.flags),p=ee(f);if(t!==`longpress`&&f!==`primary`){let e=te({commandLabel:o,platform:y(a.device),button:f,count:n.flags?.count,intervalMs:n.flags?.intervalMs,holdMs:n.flags?.holdMs,jitterPx:n.flags?.jitterPx,doubleTap:n.flags?.doubleTap});if(e)return w(e.code,e.message,e.details)}let m=t===`longpress`?Te(n.positionals??[]):Ce(n.positionals??[],o);if(!m.ok)return m.response;let h=m.target.kind===`ref`&&n.internal?.findResolvedTarget!==!0?T({session:a,ref:m.target.ref,mintedGeneration:m.refGeneration}):void 0,g;if(m.target.kind===`ref`){let r=e.refSnapshotFlagGuardResponse(t===`longpress`?`longpress`:`press`,n.flags);if(r)return r;let i=n.internal?.findResolvedTarget?null:V({session:a,ref:m.target.ref,mintedGeneration:m.refGeneration,staleRefsWarning:h});if(i)return i;g=await J(e,a)}let _=n.internal?.replayTargetGuard,v=_?null:st({session:a,commandLabel:o,target:m.target,flags:n.flags});if(v){let t=await lt(e,a,v);if(t)return t}let ne=t===`longpress`?m.durationMs:void 0;return await q(e,{androidFreshnessBaseline:g,refContext:m.target.kind===`ref`&&n.internal?.findResolvedTarget!==!0?{ref:m.target.ref,mintedGeneration:m.refGeneration,staleRefsWarning:h}:void 0,run:async e=>await rt({runtime:e,command:t,target:m.target,sessionName:r,requestId:n.meta?.requestId,clickButton:f,flags:n.flags,durationMs:ne,expectedResolvedTarget:_}),afterRun:async e=>{a.lease?.leaseProvider||await we(a,xe(m.target,e))},buildPayloads:async r=>{let i=ot(r);return await it({params:e,session:a,result:r,staleRefsWarning:h,publicData:K({session:a,command:t===`longpress`?void 0:t,flags:n.flags,data:r.backendResult}),extra:t===`longpress`?{...i===void 0?{}:{durationMs:i},gesture:`longpress`}:p})}})}async function rt(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o,expectedResolvedTarget:s}=e,c=O(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 it(e){let{params:t,session:n,result:r,publicData:i,extra:a}=e,o=r.kind===`point`?await Ne({session:n,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession}):M(n.snapshot?.nodes??[]);return P({source:{kind:`runtime`,result:r,publicData:i},referenceFrame:o,extra:a,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:U(n,r)})}function U(e,t){if(t.settle?.diff)return ve(e,at(t.settle)),e.snapshotGeneration}function at(e){let t=[];for(let n of e.diff?.lines??[])n.ref&&t.push(n.ref);for(let n of e.refs??[])t.push(n.ref);for(let n of e.tail??[])t.push(n.ref);return t}function ot(e){return`durationMs`in e?e.durationMs:void 0}function st(e){let{session:t,commandLabel:n,target:r,flags:o}=e;return n!==`click`||r.kind!==`selector`||t.recordSession||ct(o)||a(n)&&o?.verify===!0||i(n)&&o?.settle===!0?null:W(t,r.selector,o)}function W(e,t,n){let r=be({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},...n?.maestro?.expectedTapPoint?{expectedPoint:n.maestro.expectedTapPoint}:{}}:null}function ct(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 lt(e,t,n){return await G({params:e,session:t,selector:n,command:`press`,positionals:[],extra:{selector:n.raw},fallbackPhase:`ios_direct_selector_tap_fallback`})}async function G(t){let{params:n,session:i,selector:a,command:o,positionals:s,extra:c,fallbackPhase:l}=t,u=Date.now();D(i);try{let e=await C(i.device,o,s,n.req.flags?.out,{...n.contextFromFlags(n.req.flags,i.appBundleId,i.trace?.outPath),directElementSelector:a,surface:i.surface})??{},t=Date.now(),r=ft(e),l=K({session:i,command:ut(n.req.command,o),flags:n.req.flags,data:e}),d=dt(a,e),{result:f,responseData:p}=P({source:{kind:`runner-payload`,targetKind:`selector`,data:e,publicData:l,point:r,maestroFallbackUsed:d.maestroNonHittableCoordinateFallbackUsed===!0},referenceFrame:pt(e),extra:{...c,...d}});return j({session:i,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??[],retryPositionals:Y(r),flags:n.req.flags,result:f,responseData:p,actionStartedAt:u,actionFinishedAt:t})}catch(t){return Ae(t,{delegateSemanticFailures:a.allowNonHittableCoordinateFallback!==!0})?(r({level:`debug`,phase:l,data:{selector:a.raw,error:t instanceof Error?t.message:String(t)}}),null):{ok:!1,error:e(t)}}}function K(e){let t=ne(e.session.device.platform)?ze(e.data):e.data;return e.command?Fe({command:e.command,input:e.flags,data:t}):t}function ut(e,t){return e===`click`||e===`press`||e===`fill`?e:t}function dt(e,t){if(!e.allowNonHittableCoordinateFallback)return{};let n=t.maestroNonHittableCoordinateFallbackUsed===!0;return{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:n,...n?{maestroFallbackReason:`non-hittable-coordinate`}:{}}}function ft(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 pt(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}async function mt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i){let e=R(i,`fill`);if(e)return e;let t=S(`fill`,i.device);if(t)return t}if(!i)return b();tt({session:i,flags:t.flags,replayPlanStep:t.internal?.replayPlanStep===!0});let a=A(`fill`,t.flags);if(a)return a;let o=Oe(t.positionals??[]);if(!o.ok)return o.response;let s=await ht(e,i,o.target,o.refGeneration);if(s.response)return s.response;let{staleRefsWarning:c}=s,l=t.internal?.replayTargetGuard;return(l?null:await gt(e,i,o.target,o.text))||await q(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,verify:t.flags?.verify,settle:O(t.flags),expectedResolvedTarget:l}),buildPayloads:e=>_t({session:i,result:e,text:o.text,flags:t.flags,staleRefsWarning:c})})}async function ht(e,t,n,r){if(n.kind!==`ref`)return{};let i=e.req.internal?.findResolvedTarget===!0?void 0:T({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:V({session:t,ref:n.ref,mintedGeneration:r,staleRefsWarning:i});return o?{response:o,staleRefsWarning:i}:(await J(e,t),{staleRefsWarning:i})}async function gt(e,t,n,r){let i=vt({session:t,target:n,flags:e.req.flags});return i?await yt(e,t,i,r):null}function _t(e){let{session:t,result:n}=e,r=n.kind===`point`?void 0:M(t.snapshot?.nodes??[]);return P({source:{kind:`runtime`,result:n,publicData:K({session:t,command:`fill`,flags:e.flags,data:n.backendResult})},referenceFrame:r,extra:{text:e.text},staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:U(t,n)})}function vt(e){let{session:t,target:n,flags:r}=e;return n.kind!==`selector`||t.recordSession||a(`fill`)&&r?.verify===!0||i(`fill`)&&r?.settle===!0?null:W(t,n.selector,r)}async function yt(e,t,n,r){return await G({params:e,session:t,selector:n,command:`fill`,positionals:[r],extra:{selector:n.raw,text:r},fallbackPhase:`ios_direct_selector_fill_fallback`})}async function q(e,t){let r=e.sessionStore.get(e.sessionName);if(!r)return b();let i=z(e),a=Date.now();try{let n=await bt(r,e.req.command,{refContext:t.refContext},async()=>{let e=await t.run(i);return await t.afterRun?.(e),e});if(n.aborted)return n.response;let{readiness:o,runtimeResult:s}=n,c=Date.now(),{result:l,responseData:u,recordedTarget:d}=await t.buildPayloads(s);if(o.status===`recovered`){let e=typeof u.warning==`string`?`${u.warning} ${o.warning}`:o.warning;l.warning=e,u.warning=e}return j({session:r,sessionStore:e.sessionStore,command:e.req.command,positionals:e.req.positionals??[],retryPositionals:St(e.req.command,s),flags:e.req.flags,result:l,responseData:u,recordedTarget:d,actionStartedAt:a,actionFinishedAt:c,androidFreshnessBaseline:t.androidFreshnessBaseline})}catch(e){let t=n(e);if(je(t))throw t;return xt(e)}}async function bt(e,t,n,r){if(e.lease?.leaseProvider)return{aborted:!1,readiness:{status:`clear`},runtimeResult:await r()};let i=await E({session:e,command:t,phase:`before-command`});if(n.refContext&&i.status===`recovered`){let t=V({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 E({session:e,command:t,phase:`after-command`}),{aborted:!1,readiness:i,runtimeResult:a}}async function J(e,t){if(!fe(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){r({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function xt(t){return{ok:!1,error:e(t)}}function St(e,t){if(!(t.kind===`ref`&&!t.node)&&(e===`click`||e===`press`))return t.point?Y(t.point):void 0}function Y(e){return[String(e.x),String(e.y)]}async function Ct(e){return await Z(e,`gesture`,async t=>{let n=p(e.req.input),r=f(n);r.gesture.intent===`pan`&&e.req.internal?.gestureExecutionProfile&&(r.gesture.executionProfile=e.req.internal.gestureExecutionProfile),x(r.gesture,t.device);let i=await X(e).interactions.gesture({session:e.sessionName,requestId:e.req.meta?.requestId,gesture:r.gesture});return{positionals:u(n),flags:jt(n,e.req.flags),responseData:Q(i,{executionProfile:Tt(r.gesture)}),...n.kind===`pinch`?{recordingResultExtra:{scale:n.scale}}:{}}})}async function wt(e){return await Z(e,`swipe`,async t=>{let n=Et(e.req.input);x(h(n).gesture,t.device);let r=n.count??1,i=n.pauseMs??0,a=n.pattern??`one-way`,o=await kt(X(e),e,n,r,i,a);return{positionals:Ot(n),flags:e.req.flags,responseData:Q(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 X(e){return z({...e,pairedGestureViewport:e.req.internal?.gestureViewport})}async function Z(t,n,r){let i=t.sessionStore.get(t.sessionName);if(!i)return b();let a=Date.now();try{let e=se(i.device),o=e?{status:`clear`}:await E({session:i,command:n,phase:`before-command`}),s=await r(i);e||await E({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}`),j({session:i,sessionStore:t.sessionStore,command:n,actionCommand:n,positionals:s.positionals,flags:s.flags,result:{...c,...s.recordingResultExtra??{}},responseData:c,actionStartedAt:a,actionFinishedAt:Date.now()})}catch(t){return{ok:!1,error:e(t)}}}function Tt(e){if(e.intent===`fling`)return`endpoint-hold`;if(e.intent===`pan`)return e.executionProfile??`timed-pan`}function Q(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.backendResult??{},...t,...n?{timing:{executionProfile:n,gestureDurationMs:e.durationMs}}:{},message:e.message}}function Et(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`swipe requires structured object input`);l(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:m(n,`count`,{min:1,max:200}),pauseMs:m(n,`pauseMs`,{min:0,max:ie}),pattern:r};return Dt(i),i}function Dt(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 ${re}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 Ot(e){return[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y)]}async function kt(e,t,n,r,i,a){let o;for(let s=0;s<r;s+=1){let c=h(At(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 ae(i)}if(!o)throw Error(`Swipe orchestration did not execute a gesture.`);return o}function At(e,t,n){return t===`ping-pong`&&n%2==1?{...e,from:e.to,to:e.from}:e}function jt(e,t){return e.kind!==`pan`||e.pointerCount===void 0?t:{...t,pointerCount:e.pointerCount}}async function Mt(e){let t=await nt({...e,captureSnapshotForSession:N,refSnapshotFlagGuardResponse:Me});if(t)return t;switch(e.req.command){case c.gesture:return await Ct({...e,captureSnapshotForSession:N});case c.swipe:return await wt({...e,captureSnapshotForSession:N});case c.type:return await Nt({...e,captureSnapshotForSession:N});case`get`:return await Ee(e);case`is`:return await ke(e);default:return null}}async function Nt(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);return r?S(c.type,r.device)||await Pt(r)||await Ft(e,r):b()}async function Pt(e){return e.device.platform===`android`&&e.recording&&(await de({session:e})).status===`failed`?w(`COMMAND_FAILED`,`Android system dialog blocked the recording session`):null}async function Ft(t,n){let{req:r,sessionName:i,sessionStore:a}=t,o=(r.positionals??[]).join(` `),s=z(t),c=Date.now();try{let e=await E({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 E({session:n,command:r.command,phase:`after-command`});let l=Date.now(),u={...t.backendResult??{},text:t.text,delayMs:t.delayMs,...g(t.message??`Typed ${Array.from(t.text).length} chars`)};return e.status===`recovered`&&(u.warning=e.warning),j({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{Mt as handleInteractionCommands};
@@ -1,2 +1,2 @@
1
- const e=process.argv.slice(2);t(e)||(e[0]===`mcp`&&!e.includes(`--help`)&&!e.includes(`-h`)?import(`../server.js`).then(({runAgentDeviceMcpServer:e})=>e()).catch(m):p(e));function t(e){return n(e)||r(e)||i(e)}function n(e){return e.length!==1||!f(e[0])?!1:(process.stdout.write(`0.20.2
1
+ const e=process.argv.slice(2);t(e)||(e[0]===`mcp`&&!e.includes(`--help`)&&!e.includes(`-h`)?import(`../server.js`).then(({runAgentDeviceMcpServer:e})=>e()).catch(m):p(e));function t(e){return n(e)||r(e)||i(e)}function n(e){return e.length!==1||!f(e[0])?!1:(process.stdout.write(`0.20.3
2
2
  `),!0)}function r(e){return e.length===0?(import(`../cli-help.js`).then(({buildUsageText:e})=>{process.stdout.write(`${e()}\n`),process.exit(1)}).catch(m),!0):!1}function i(e){let t=a(e);return t===void 0?!1:(import(`../cli-help.js`).then(({buildCommandUsageText:n,buildUsageText:r})=>{if(t===null){process.stdout.write(`${r()}\n`);return}let i=n(l(t));if(i){process.stdout.write(i);return}p(e)}).catch(m),!0)}function a(e){switch(e.length){case 1:return o(e[0]);case 2:return s(e[0],e[1]);default:return}}function o(e){return e===`help`||d(e)?null:void 0}function s(e,t){return u(e)?t:c(e,t)}function c(e,t){return d(t)?e:void 0}function l(e){return e===`long-press`?`longpress`:e===`metrics`?`perf`:e}function u(e){return e===`help`}function d(e){return e===`--help`||e===`-h`}function f(e){return e===`--version`||e===`-V`}function p(e){import(`../cli.js`).then(({runCli:t})=>t(e)).catch(m)}function m(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}export{};