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.
- 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
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.3.apk.sha256 +1 -0
- 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
- 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
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.3.apk.sha256 +1 -0
- 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
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +0 -176
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +184 -0
- package/dist/src/android-adb.d.ts +3 -26
- package/dist/src/android-adb.js +1 -1
- package/dist/src/app-helpers.js +1 -0
- package/dist/src/apps.js +5 -5
- package/dist/src/context.js +1 -1
- package/dist/src/device-input-state.d.ts +26 -0
- package/dist/src/find.js +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/interaction-snapshot.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +14 -14
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun.d.ts +78 -2
- package/dist/src/logcat.js +1 -1
- package/dist/src/recording-export-quality.js +2 -3
- package/dist/src/runtime2.js +1 -1
- package/dist/src/sdk-android-adb.d.ts +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session.js +8 -8
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/tv-remote.d.ts +1 -1
- package/package.json +14 -15
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.2.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.2.apk.sha256 +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{S as e,_ as t,h as n,l as r,m as i,s as a,v as o}from"./sdk-contracts.js";import{j as s}from"./sdk-android-adb.js";import{H as c,R as l,W as u,et as d}from"./sdk-batch-runner.js";import{o as f}from"./recording-export-quality.js";import{q as p}from"./snapshot-diagnostics.js";import{c as m,h as ee,o as te,s as h}from"./sdk-device.js";import{C as ne,E as re,F as ie,S as ae,b as oe,it as se,j as ce,rt as le,x as ue}from"./sdk-selectors.js";import{_ as de,o as fe}from"./gesture-plan-types.js";import{u as pe}from"./android-input-method-overlays.js";import{i as me,n as he,t as ge}from"./runtime.js";import{r as _e}from"./app-lifecycle.js";import{C as g,c as ve,g as _,l as v,n as ye,s as y,t as be}from"./context.js";import{C as xe}from"./physical-device-control.js";import{a as b,l as Se}from"./runner-client.js";import{At as x,Ot as Ce,Rt as S,g as C,jt as w,kt as we,qt as T,u as E}from"./internal/daemon.js";import{a as Te}from"./apps.js";import{i as Ee}from"./session-target-evidence.js";function D(e,t){let n=me(t);if(!n)return e;if(e.ok){let t=O(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:O(r.hint,n)}}}}function O(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function k(e,t,n){let r=e.get(t),i=r?.device??await _(n??{});return r||await C(i),{session:r,device:i}}async function A(e,t,n){let r=!e&&h(t);try{return await n()}finally{r&&(await Se(t.id),await De(t))}}async function De(e){let t=xe();await Te(e,t).catch(n=>{s({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function Oe(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function ke(e){let{session:t,sessionName:n,device:r,snapshot:i,appBundleId:a}=e;return t?{...t,snapshot:i,lastComparisonSafeSnapshot:i?.comparisonSafe===!0?i:t.lastComparisonSafeSnapshot}:{name:n,device:r,createdAt:Date.now(),appBundleId:a,snapshot:i,...i?.comparisonSafe===!0?{lastComparisonSafeSnapshot:i}:{},actions:[]}}const Ae=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function j(e,t){let n=je(t);return n.length===0?null:y(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function je(e){if(!e)return[];let t=[];for(let[n,r]of Ae)e[n]!==void 0&&t.push(r);return t}function Me(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:y(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function Ne(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function M(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function N(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:y(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function P(e,t){let n=M(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=N(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:y(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Pe(e){let t=M(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...He(e[2])};let n=Ve(e),r=P(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function Fe(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=N(t);if(!n.ok)return{ok:!1,response:n.response};let r=f(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Be(e)},refGeneration:n.generation,text:r}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after ref`)}}let n=M(e);if(n){let t=e.slice(2).join(` `);return t?{ok:!0,target:{kind:`point`,x:n.x,y:n.y},text:t}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=Ie(e);return!r||r.kind!==`selector`?{ok:!1,response:y(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)}:r.text.trim()?{ok:!0,target:{kind:`selector`,selector:r.target.selector},text:r.text}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after selector`)}}function Ie(e){try{return f(e)}catch{return null}}function Le(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:ze(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function Re(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function ze(e){return e?.startsWith(`@`)?e.slice(1):e}function Be(e){return e.length>=3&&e[1]?.trim()||``}function Ve(e){let t=e.at(-1);return e.length>1&&Ue(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function He(e){return e===void 0?{}:{durationMs:Number(e)}}function Ue(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function We(e,n){let r=await F(e);if(r)throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}async function F(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await _e(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!Je(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:qe(n)}}function Ge(e){return e.foregroundPackage===`com.google.android.permissioncontroller`?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ke(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function qe(e){return e===`com.google.android.permissioncontroller`?`Dismiss or allow the permission prompt, then retry the smoke assertion.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Je(e){return e===`com.android.settings`||e===`com.android.systemui`||e===`com.google.android.permissioncontroller`||e.includes(`launcher`)}function Ye(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function Xe(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:fe(e.node)}}function I(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=$e(e),i=r?.kind===`ref`?V(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:Qe(s)}}function L(e){let{target:t}=e;return{...t.kind===`ref`?{ref:V(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:fe(e.node)}}function R(e){let{node:t,preActionNodes:n,...r}=e;return r}function Ze(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function z(e){let{selectorChain:t,...n}=e;return n}function B(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=o.recordSession&&i?Ee(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:p(n),...s?{targetEvidence:s}:{}})}function Qe(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function $e(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function V(e){return e.startsWith(`@`)?e.slice(1):e}const et=[`application`,`window`,`tabbar`,`scrollbar`,`image`],tt=new Set([`tab bar`]);async function H(e,t){if(t.ok||!nt(t.error.message)||t.error.details?.captureStalled===!0)return t;let n=await rt(e).catch(()=>null);return n?y(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function nt(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function rt(e){let t=[...(await S({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(it),n=U(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=U(t.filter(e=>!st(e)),4,{includeIdentifiers:!1}),i=U(t.filter(ct),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function U(e,t,n){let r=new Set,i=[];for(let a of e){let e=ot(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function it(e,t){return W(e)-W(t)||at(e,t)}function W(e){let t=!!ot(e,{includeIdentifiers:!1});return(st(e)?2:0)+ +!t}function at(e,t){return e.rect&&t.rect?e.rect.y-t.rect.y||e.rect.x-t.rect.x:e.rect?-1:t.rect?1:(e.depth??0)-(t.depth??0)||e.index-t.index}function ot(e,t){let n=(t.includeIdentifiers?[e.label,e.value,e.identifier]:[e.label,e.value]).map(e=>typeof e==`string`?e.trim():``).find(e=>e.length>0);return n?n.replace(/\s+/g,` `).slice(0,80):``}function st(e){let t=le(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return et.some(e=>t.includes(e))||tt.has(n)||n.endsWith(`.fill`)}function ct(e){return le(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function G(e){let{session:t,selectorExpression:n}=e;if(!t||!h(t.device)||g(t.device)||t.postGestureStabilization)return null;let r=d(n);if(!r||r.selectors.length!==1)return null;let i=r.selectors[0];if(!i||i.terms.length!==1)return null;let a=i.terms[0];return!a||typeof a.value!=`string`||!lt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function lt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function ut(e,t={}){let n=o(e);if(n.code===`ELEMENT_NOT_FOUND`)return t.delegateSemanticFailures===!0||t.allowElementNotFound===!0;if(n.code===`AMBIGUOUS_MATCH`)return t.delegateSemanticFailures===!0;if(n.code===`ELEMENT_OFFSCREEN`)return t.delegateSemanticFailures!==!1;if(n.code!==`COMMAND_FAILED`)return!1;let r=n.message.toLowerCase();return r.includes(`fetch failed`)||r.includes(`timed out`)||r.includes(`timeout`)||r.includes(`runner did not accept connection`)||r.includes(`invalid runner response`)}function dt(e,n={}){let r=n.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not create temporary files`)}}}function ft(e,t={}){return{artifacts:dt(e,t),policy:he()}}async function pt(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:c}=e,l=ce(n),u=pe(n.rect);if(!u||h(t)&&l&&!se(n.type??``))return l;try{let e=await ye(t,`read`,[String(u.x),String(u.y)],void 0,{...c(r,i,a),surface:o}),d=e&&typeof e==`object`?e:void 0,f=typeof d?.text==`string`?d.text:``;return f.trim()?f:(s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),l)}catch(e){return s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`backend_read_failed`,nodeRef:n.ref,surface:o,platform:t.platform,error:e instanceof Error?e.message:String(e)}}),l}}function K(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Ct(c,e.req.flags?.out),d=_t({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=vt({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await mt({params:e,request:c}),m={snapshot:p};return Tt({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function mt(e){let{params:t,request:n}=e,r=await q(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&Et(r)?await ht({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&de(r.snapshotQuality)?await gt({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function ht(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await q(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await q(t,n,r.query,!1)}}async function gt(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await q(t,n,r.query,!1)}catch{return i}}async function q(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await S({device:e.device,session:e.session,flags:{...t.flags,snapshotInteractiveOnly:r},outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects})).snapshot}function _t(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!T(a)&&!xt(a,o))return r}function vt(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&yt(t,r)&&bt(i,n)&&i.presentationKey===St(r))return i}function yt(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||T(e)||xt(e,t))}function bt(e,t){return t-e.createdAt<750}function xt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function St(e){return r(i(wt(e)))}function Ct(e,t){return JSON.stringify({presentationKey:St(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function wt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Tt(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||de(i.snapshotQuality)||(w(t,i),n.set(r,t))}function Et(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function Dt(e){return ge({backend:Ot(e),...ft(`selector commands`,{plural:!0}),sessions:Ce({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(w(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}})})}async function J(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:ve()};let r=n?.device??await _(e.req.flags??{});n||await C(r);let i=v(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:Dt({...e,session:n,device:r})}}function Ot(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=K({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i});return{platform:ee(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...kt(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,c=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await s.capture({flags:i,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await pt({device:r,node:o,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>be(i??``,e,t,n))})}),findText:async(t,n)=>({found:await At(e,n)})}}function kt(e){let{interactiveOnly:t,scope:n,depth:r,raw:i,includeHiddenContentHints:a}=e??{},o={};return t!==void 0&&(o.snapshotInteractiveOnly=t),n!==void 0&&(o.snapshotScope=n),r!==void 0&&(o.snapshotDepth=r),i!==void 0&&(o.snapshotRaw=i),a!==void 0&&(o.snapshotIncludeHiddenContentHints=a),o}async function At(e,t){let n=await jt(e,t);if(n!==null)return n;let r=await Mt(e,t);return r===null?await Ft(e,t):r}async function jt(e,t){return!m(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Ft(e,t)}async function Mt(e,t){let n=Nt(e);return n?(await b(n.device,{command:`findText`,text:t,appBundleId:n.appBundleId},Pt(e,n)))?.found===!0:null}function Nt(e){return!te(e.device.platform)||g(e.device)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function Pt(e,t){return E({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Ft(e,t){return!!ie((await It(e)).nodes,t)}async function It(e){let{snapshot:t}=await K({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath,consumedSnapshot:e.consumedSnapshot}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1,snapshotIncludeHiddenContentHints:!1},cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return t}async function Lt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=c(t.positionals??[],t.flags);if(!n.ok)return y(n.code,n.message);let r=n.parsed,i=r.action;if(!u(i))return null;let a=await J(e,{requireSession:!1,capability:`find`});return a.ok?D(await Q(async()=>{let n=await a.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:r.locator,query:r.query,action:i,timeoutMs:r.timeoutMs});B(e.sessionStore,e.sessionName,t,Ye(n,i));let o=Xe(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(we(t,[o.ref]),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}),Y(e)):a.response}function Y(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Rt(e){let{req:t}=e;if(t.command!==`get`)return null;let n=ue(t.positionals?.[0]);if(!n.ok)return y(n.code,n.message);let r=n.format,i=Zt(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=j(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard;if(i.target.kind===`selector`&&!a){let t=await Ut(e,r,i.target.selector);if(t)return t}let o=await J(e,{requireSession:!0,capability:`get`});if(!o.ok)return o.response;let s=i.target.kind===`ref`?x({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return D(await Q(async()=>{let n=await o.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});B(e.sessionStore,e.sessionName,t,I(n,r),{node:n.node,preActionNodes:n.preActionNodes});let c=L(n);return s?{...c,warning:s}:c}),Y(e))}async function zt(e){let{req:t}=e;if(t.command!==`is`)return null;let n=ae(t.positionals??[]);if(!n.ok)return y(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,expectedText:i}=n,a={selectorExpression:n.selectorExpression},o=t.internal?.replayTargetGuard,s=e.sessionStore.get(e.sessionName)?.recordSession===!0;if(!o&&!s){let t=await Wt(e,r,a.selectorExpression,i);if(t)return t}let c=await J(e,{requireSession:!0,capability:`is`});return c.ok?D(await $(e,await Q(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:a.selectorExpression,expectedText:i,expectedResolvedTarget:o}),s=Vt(n),l=R(n);return B(e.sessionStore,e.sessionName,t,l,s),z(l)}),`is ${r}`),Y(e)):c.response}async function Bt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=l(t.positionals??[]);if(!i)return y(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await k(r,n,t.flags);if(i.kind!==`sleep`){let e=v(`wait`,o);if(e)return e}let s=t.internal?.replayLandmarkGuard;if(i.kind===`selector`&&!s&&!a?.recordSession){let t=await Gt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let c=i,u;if(i.kind===`ref`){let e=N(i.rawRef);if(!e.ok)return e.response;c={...i,rawRef:e.ref},u=x({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let d=async()=>{let i=Dt({...e,session:a,device:o}),l=await Q(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:Qt(c,a,s)}),o=Vt(e);B(r,n,t,R(e),o,`landmark`);let l=Ze(e);return u?{...l,warning:u}:l});return await $(e,await H({req:t,logPath:e.logPath,session:a,device:o},l),`wait`)};return i.kind===`sleep`?await d():D(await A(a,o,d),Y(e))}function Vt(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Ht(e,t,n){if(!e||e.recordSession)return null;let r=G({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function Ut(e,t,n){let r=e.sessionStore.get(e.sessionName),i=Ht(r,t,n);if(!r||!i)return null;let a=await X(e,r,i);if(Z(a))return a.response;if(!a)return null;let o=Jt(t,i.raw,a);return o?(B(e.sessionStore,e.sessionName,e.req,I(o,t)),{ok:!0,data:L(o)}):null}async function Wt(e,t,n,r){if(t===`hidden`)return null;let i=await Kt(e,n);if(Z(i))return i.response;if(!i?.result.found||!i.result.node)return null;let a=t===`exists`?{predicate:t,pass:!0,selector:i.selector.raw,matches:1,selectorChain:[i.selector.raw]}:Yt(t,r,i.selector.raw,i.session,i.result.node);return a?(B(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:z(a)}):null}async function Gt(e){let t=G({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await X(e,e.session,t);if(Z(r))return r.response;if(!r?.found)return null;let i={kind:`selector`,selector:t.raw,waitedMs:Date.now()-n,selectorChain:[t.raw]};B(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:z(i)};return await H({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Kt(e,t){let n=e.sessionStore.get(e.sessionName),r=G({session:n,selectorExpression:t});if(!n||!r)return null;let i=await X(e,n,r);return Z(i)?i:i?{session:n,selector:r,result:i}:null}async function qt(e,t,n){let r=await b(t.device,{command:`querySelector`,selectorKey:n.key,selectorValue:n.value,appBundleId:t.appBundleId},E({req:e.req,logPath:e.logPath,traceLogPath:t.trace?.outPath})),i=r.found===!0,a=Xt(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function X(t,n,r){try{return await qt(t,n,r)}catch(t){return ut(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Z(e){return e!==null&&`kind`in e&&e.kind===`error`}function Jt(e,t,n){if(!n.found||!n.node)return null;let r={target:{kind:`selector`,selector:t},node:n.node,selectorChain:[t]};return e===`attrs`?{kind:`attrs`,...r}:typeof n.text==`string`?{kind:`text`,...r,text:n.text}:null}function Yt(e,t,n,r,i){let a=re({predicate:e,node:i,nodes:[i],expectedText:t,platform:r.device.platform});return{predicate:e,pass:a.pass,selector:n,...e===`text`?{text:a.actualText}:{},selectorChain:[n]}}function Xt(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function Zt(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=N(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=oe(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:y(n.code,n.message)}}function Qt(e,n,r){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...r?{recordedLandmark:r}:{}};if(e.kind===`ref`){if(!n?.snapshot)throw new t(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:e.rawRef,timeoutMs:e.timeoutMs}}if(e.kind===`stable`)return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};let i=ne(e.text);if(!i.ok)throw new t(i.code,i.message);return{kind:`text`,text:i.text,timeoutMs:e.timeoutMs}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return y(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{i=await F(r)}catch{return t}return i?y(t.error.code,`${n} failed because ${Ge(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{A as C,k as S,Ne as _,K as a,ke as b,G as c,Re as d,Le as f,ze as g,P as h,Bt as i,We as l,Pe as m,Rt as n,ft as o,Fe as p,zt as r,ut as s,Lt as t,Ke as u,j as v,D as w,Oe as x,Me as y};
|
|
1
|
+
import{S as e,_ as t,h as n,l as r,m as i,s as a,v as o}from"./sdk-contracts.js";import{j as s}from"./sdk-android-adb.js";import{H as c,R as l,W as u,et as d}from"./sdk-batch-runner.js";import{o as f}from"./recording-export-quality.js";import{q as p}from"./snapshot-diagnostics.js";import{c as m,h as ee,o as te,s as h}from"./sdk-device.js";import{C as ne,E as re,F as ie,S as ae,b as oe,it as se,j as ce,rt as le,x as ue}from"./sdk-selectors.js";import{_ as de,o as fe}from"./gesture-plan-types.js";import{u as pe}from"./android-input-method-overlays.js";import{i as me,n as he,t as ge}from"./runtime.js";import{r as _e}from"./app-lifecycle.js";import{C as g,c as ve,g as _,l as v,n as ye,s as y,t as be}from"./context.js";import{C as xe}from"./physical-device-control.js";import{a as b,l as Se}from"./runner-client.js";import{At as x,Jt as S,Ot as Ce,g as C,jt as w,kt as we,u as T,zt as E}from"./internal/daemon.js";import{a as Te}from"./apps.js";import{i as Ee}from"./session-target-evidence.js";function D(e,t){let n=me(t);if(!n)return e;if(e.ok){let t=O(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:O(r.hint,n)}}}}function O(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function k(e,t,n){let r=e.get(t),i=r?.device??await _(n??{});return r||await C(i),{session:r,device:i}}async function A(e,t,n){let r=!e&&h(t);try{return await n()}finally{r&&(await Se(t.id),await De(t))}}async function De(e){let t=xe();await Te(e,t).catch(n=>{s({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function Oe(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function ke(e){let{session:t,sessionName:n,device:r,snapshot:i,appBundleId:a}=e;return t?{...t,snapshot:i,lastComparisonSafeSnapshot:i?.comparisonSafe===!0?i:t.lastComparisonSafeSnapshot}:{name:n,device:r,createdAt:Date.now(),appBundleId:a,snapshot:i,...i?.comparisonSafe===!0?{lastComparisonSafeSnapshot:i}:{},actions:[]}}const Ae=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function j(e,t){let n=je(t);return n.length===0?null:y(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function je(e){if(!e)return[];let t=[];for(let[n,r]of Ae)e[n]!==void 0&&t.push(r);return t}function Me(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:y(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function Ne(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function M(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function N(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:y(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function P(e,t){let n=M(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=N(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:y(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Pe(e){let t=M(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...He(e[2])};let n=Ve(e),r=P(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function Fe(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=N(t);if(!n.ok)return{ok:!1,response:n.response};let r=f(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Be(e)},refGeneration:n.generation,text:r}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after ref`)}}let n=M(e);if(n){let t=e.slice(2).join(` `);return t?{ok:!0,target:{kind:`point`,x:n.x,y:n.y},text:t}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=Ie(e);return!r||r.kind!==`selector`?{ok:!1,response:y(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)}:r.text.trim()?{ok:!0,target:{kind:`selector`,selector:r.target.selector},text:r.text}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after selector`)}}function Ie(e){try{return f(e)}catch{return null}}function Le(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:ze(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function Re(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function ze(e){return e?.startsWith(`@`)?e.slice(1):e}function Be(e){return e.length>=3&&e[1]?.trim()||``}function Ve(e){let t=e.at(-1);return e.length>1&&Ue(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function He(e){return e===void 0?{}:{durationMs:Number(e)}}function Ue(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function We(e,n){let r=await F(e);if(r)throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}async function F(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await _e(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!Je(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:qe(n)}}function Ge(e){return e.foregroundPackage===`com.google.android.permissioncontroller`?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ke(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function qe(e){return e===`com.google.android.permissioncontroller`?`Dismiss or allow the permission prompt, then retry the smoke assertion.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Je(e){return e===`com.android.settings`||e===`com.android.systemui`||e===`com.google.android.permissioncontroller`||e.includes(`launcher`)}function Ye(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function Xe(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:fe(e.node)}}function I(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=$e(e),i=r?.kind===`ref`?V(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:Qe(s)}}function L(e){let{target:t}=e;return{...t.kind===`ref`?{ref:V(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:fe(e.node)}}function R(e){let{node:t,preActionNodes:n,...r}=e;return r}function Ze(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function z(e){let{selectorChain:t,...n}=e;return n}function B(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=o.recordSession&&i?Ee(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:p(n),...s?{targetEvidence:s}:{}})}function Qe(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function $e(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function V(e){return e.startsWith(`@`)?e.slice(1):e}const et=[`application`,`window`,`tabbar`,`scrollbar`,`image`],tt=new Set([`tab bar`]);async function H(e,t){if(t.ok||!nt(t.error.message)||t.error.details?.captureStalled===!0)return t;let n=await rt(e).catch(()=>null);return n?y(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function nt(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function rt(e){let t=[...(await E({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(it),n=U(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=U(t.filter(e=>!st(e)),4,{includeIdentifiers:!1}),i=U(t.filter(ct),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function U(e,t,n){let r=new Set,i=[];for(let a of e){let e=ot(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function it(e,t){return W(e)-W(t)||at(e,t)}function W(e){let t=!!ot(e,{includeIdentifiers:!1});return(st(e)?2:0)+ +!t}function at(e,t){return e.rect&&t.rect?e.rect.y-t.rect.y||e.rect.x-t.rect.x:e.rect?-1:t.rect?1:(e.depth??0)-(t.depth??0)||e.index-t.index}function ot(e,t){let n=(t.includeIdentifiers?[e.label,e.value,e.identifier]:[e.label,e.value]).map(e=>typeof e==`string`?e.trim():``).find(e=>e.length>0);return n?n.replace(/\s+/g,` `).slice(0,80):``}function st(e){let t=le(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return et.some(e=>t.includes(e))||tt.has(n)||n.endsWith(`.fill`)}function ct(e){return le(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function G(e){let{session:t,selectorExpression:n}=e;if(!t||!h(t.device)||g(t.device)||t.postGestureStabilization)return null;let r=d(n);if(!r||r.selectors.length!==1)return null;let i=r.selectors[0];if(!i||i.terms.length!==1)return null;let a=i.terms[0];return!a||typeof a.value!=`string`||!lt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function lt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function ut(e,t={}){let n=o(e);if(n.code===`ELEMENT_NOT_FOUND`)return t.delegateSemanticFailures===!0||t.allowElementNotFound===!0;if(n.code===`AMBIGUOUS_MATCH`)return t.delegateSemanticFailures===!0;if(n.code===`ELEMENT_OFFSCREEN`)return t.delegateSemanticFailures!==!1;if(n.code!==`COMMAND_FAILED`)return!1;let r=n.message.toLowerCase();return r.includes(`fetch failed`)||r.includes(`timed out`)||r.includes(`timeout`)||r.includes(`runner did not accept connection`)||r.includes(`invalid runner response`)}function dt(e,n={}){let r=n.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not create temporary files`)}}}function ft(e,t={}){return{artifacts:dt(e,t),policy:he()}}async function pt(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:c}=e,l=ce(n),u=pe(n.rect);if(!u||h(t)&&l&&!se(n.type??``))return l;try{let e=await ye(t,`read`,[String(u.x),String(u.y)],void 0,{...c(r,i,a),surface:o}),d=e&&typeof e==`object`?e:void 0,f=typeof d?.text==`string`?d.text:``;return f.trim()?f:(s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),l)}catch(e){return s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`backend_read_failed`,nodeRef:n.ref,surface:o,platform:t.platform,error:e instanceof Error?e.message:String(e)}}),l}}function K(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Ct(c,e.req.flags?.out),d=_t({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=vt({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await mt({params:e,request:c}),m={snapshot:p};return Tt({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function mt(e){let{params:t,request:n}=e,r=await q(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&Et(r)?await ht({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&de(r.snapshotQuality)?await gt({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function ht(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await q(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await q(t,n,r.query,!1)}}async function gt(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await q(t,n,r.query,!1)}catch{return i}}async function q(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await E({device:e.device,session:e.session,flags:{...t.flags,snapshotInteractiveOnly:r},outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects})).snapshot}function _t(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!S(a)&&!xt(a,o))return r}function vt(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&yt(t,r)&&bt(i,n)&&i.presentationKey===St(r))return i}function yt(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||S(e)||xt(e,t))}function bt(e,t){return t-e.createdAt<750}function xt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function St(e){return r(i(wt(e)))}function Ct(e,t){return JSON.stringify({presentationKey:St(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function wt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Tt(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||de(i.snapshotQuality)||(w(t,i),n.set(r,t))}function Et(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function Dt(e){return ge({backend:Ot(e),...ft(`selector commands`,{plural:!0}),sessions:Ce({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(w(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}})})}async function J(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:ve()};let r=n?.device??await _(e.req.flags??{});n||await C(r);let i=v(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:Dt({...e,session:n,device:r})}}function Ot(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=K({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i});return{platform:ee(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...kt(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,c=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await s.capture({flags:i,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await pt({device:r,node:o,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>be(i??``,e,t,n))})}),findText:async(t,n)=>({found:await At(e,n)})}}function kt(e){let{interactiveOnly:t,scope:n,depth:r,raw:i,includeHiddenContentHints:a}=e??{},o={};return t!==void 0&&(o.snapshotInteractiveOnly=t),n!==void 0&&(o.snapshotScope=n),r!==void 0&&(o.snapshotDepth=r),i!==void 0&&(o.snapshotRaw=i),a!==void 0&&(o.snapshotIncludeHiddenContentHints=a),o}async function At(e,t){let n=await jt(e,t);return n===null?await Mt(e,t)===!0?!0:await Ft(e,t):n}async function jt(e,t){return!m(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Ft(e,t)}async function Mt(e,t){let n=Nt(e);return n?(await b(n.device,{command:`findText`,text:t,appBundleId:n.appBundleId},Pt(e,n)))?.found===!0:null}function Nt(e){return!te(e.device.platform)||g(e.device)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function Pt(e,t){return T({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Ft(e,t){return!!ie((await It(e)).nodes,t)}async function It(e){let{snapshot:t}=await K({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath,consumedSnapshot:e.consumedSnapshot}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1,snapshotIncludeHiddenContentHints:!1},cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return t}async function Lt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=c(t.positionals??[],t.flags);if(!n.ok)return y(n.code,n.message);let r=n.parsed,i=r.action;if(!u(i))return null;let a=await J(e,{requireSession:!1,capability:`find`});return a.ok?D(await Q(async()=>{let n=await a.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:r.locator,query:r.query,action:i,timeoutMs:r.timeoutMs});B(e.sessionStore,e.sessionName,t,Ye(n,i));let o=Xe(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(we(t,[o.ref]),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}),Y(e)):a.response}function Y(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Rt(e){let{req:t}=e;if(t.command!==`get`)return null;let n=ue(t.positionals?.[0]);if(!n.ok)return y(n.code,n.message);let r=n.format,i=Zt(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=j(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard;if(i.target.kind===`selector`&&!a){let t=await Ut(e,r,i.target.selector);if(t)return t}let o=await J(e,{requireSession:!0,capability:`get`});if(!o.ok)return o.response;let s=i.target.kind===`ref`?x({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return D(await Q(async()=>{let n=await o.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});B(e.sessionStore,e.sessionName,t,I(n,r),{node:n.node,preActionNodes:n.preActionNodes});let c=L(n);return s?{...c,warning:s}:c}),Y(e))}async function zt(e){let{req:t}=e;if(t.command!==`is`)return null;let n=ae(t.positionals??[]);if(!n.ok)return y(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,expectedText:i}=n,a={selectorExpression:n.selectorExpression},o=t.internal?.replayTargetGuard,s=e.sessionStore.get(e.sessionName)?.recordSession===!0;if(!o&&!s){let t=await Wt(e,r,a.selectorExpression,i);if(t)return t}let c=await J(e,{requireSession:!0,capability:`is`});return c.ok?D(await $(e,await Q(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:a.selectorExpression,expectedText:i,expectedResolvedTarget:o}),s=Vt(n),l=R(n);return B(e.sessionStore,e.sessionName,t,l,s),z(l)}),`is ${r}`),Y(e)):c.response}async function Bt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=l(t.positionals??[]);if(!i)return y(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await k(r,n,t.flags);if(i.kind!==`sleep`){let e=v(`wait`,o);if(e)return e}let s=t.internal?.replayLandmarkGuard;if(i.kind===`selector`&&!s&&!a?.recordSession){let t=await Gt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let c=i,u;if(i.kind===`ref`){let e=N(i.rawRef);if(!e.ok)return e.response;c={...i,rawRef:e.ref},u=x({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let d=async()=>{let i=Dt({...e,session:a,device:o}),l=await Q(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:Qt(c,a,s)}),o=Vt(e);B(r,n,t,R(e),o,`landmark`);let l=Ze(e);return u?{...l,warning:u}:l});return await $(e,await H({req:t,logPath:e.logPath,session:a,device:o},l),`wait`)};return i.kind===`sleep`?await d():D(await A(a,o,d),Y(e))}function Vt(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Ht(e,t,n){if(!e||e.recordSession)return null;let r=G({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function Ut(e,t,n){let r=e.sessionStore.get(e.sessionName),i=Ht(r,t,n);if(!r||!i)return null;let a=await X(e,r,i);if(Z(a))return a.response;if(!a)return null;let o=Jt(t,i.raw,a);return o?(B(e.sessionStore,e.sessionName,e.req,I(o,t)),{ok:!0,data:L(o)}):null}async function Wt(e,t,n,r){if(t===`hidden`)return null;let i=await Kt(e,n);if(Z(i))return i.response;if(!i?.result.found||!i.result.node)return null;let a=t===`exists`?{predicate:t,pass:!0,selector:i.selector.raw,matches:1,selectorChain:[i.selector.raw]}:Yt(t,r,i.selector.raw,i.session,i.result.node);return a?(B(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:z(a)}):null}async function Gt(e){let t=G({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await X(e,e.session,t);if(Z(r))return r.response;if(!r?.found)return null;let i={kind:`selector`,selector:t.raw,waitedMs:Date.now()-n,selectorChain:[t.raw]};B(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:z(i)};return await H({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Kt(e,t){let n=e.sessionStore.get(e.sessionName),r=G({session:n,selectorExpression:t});if(!n||!r)return null;let i=await X(e,n,r);return Z(i)?i:i?{session:n,selector:r,result:i}:null}async function qt(e,t,n){let r=await b(t.device,{command:`querySelector`,selectorKey:n.key,selectorValue:n.value,appBundleId:t.appBundleId},T({req:e.req,logPath:e.logPath,traceLogPath:t.trace?.outPath})),i=r.found===!0,a=Xt(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function X(t,n,r){try{return await qt(t,n,r)}catch(t){return ut(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Z(e){return e!==null&&`kind`in e&&e.kind===`error`}function Jt(e,t,n){if(!n.found||!n.node)return null;let r={target:{kind:`selector`,selector:t},node:n.node,selectorChain:[t]};return e===`attrs`?{kind:`attrs`,...r}:typeof n.text==`string`?{kind:`text`,...r,text:n.text}:null}function Yt(e,t,n,r,i){let a=re({predicate:e,node:i,nodes:[i],expectedText:t,platform:r.device.platform});return{predicate:e,pass:a.pass,selector:n,...e===`text`?{text:a.actualText}:{},selectorChain:[n]}}function Xt(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function Zt(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=N(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=oe(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:y(n.code,n.message)}}function Qt(e,n,r){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...r?{recordedLandmark:r}:{}};if(e.kind===`ref`){if(!n?.snapshot)throw new t(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:e.rawRef,timeoutMs:e.timeoutMs}}if(e.kind===`stable`)return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};let i=ne(e.text);if(!i.ok)throw new t(i.code,i.message);return{kind:`text`,text:i.text,timeoutMs:e.timeoutMs}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return y(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{i=await F(r)}catch{return t}return i?y(t.error.code,`${n} failed because ${Ge(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{A as C,k as S,Ne as _,K as a,ke as b,G as c,Re as d,Le as f,ze as g,P as h,Bt as i,We as l,Pe as m,Rt as n,ft as o,Fe as p,zt as r,ut as s,Lt as t,Ke as u,j as v,D as w,Oe as x,Me as y};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,dt as t,gt as n,l as r,pt as i,s as a,vt as o,yt as s}from"./sdk-selectors.js";import{a as c,i as l,o as u,u as d}from"./android-input-method-overlays.js";import{
|
|
1
|
+
import{a as e,dt as t,gt as n,l as r,pt as i,s as a,vt as o,yt as s}from"./sdk-selectors.js";import{a as c,i as l,o as u,u as d}from"./android-input-method-overlays.js";import{Ut as f}from"./internal/daemon.js";function p(e,t={}){let n=t.mode??`action`,{node:r,preActionNodes:i}=e;if(typeof r.index!=`number`)return;let a=c(i),o=S(_(r),i);if(n===`landmark`&&o.id===void 0&&o.label===void 0)return;let s=l(r,a,8),u=s.chain,d=v(i,r),f=y(r,a),p=x(r),b=+(u.length>0),w=e=>{let t=u.slice(0,e),n=C({nodes:i,byIndex:a,node:r,identity:o,ancestry:t,sibling:d,scrollRegion:f});return{candidate:{...o,ancestry:t,sibling:d,viewportOrder:n.viewportOrder,...f?{scrollRegion:f}:{},...p?{rect:p}:{},verification:`verified`},domain:n}};for(let e=u.length;e>=b;--e){let{candidate:t,domain:i}=w(e);if(h(t))return t.verification=m({node:r,domain:i,mode:n,brokenWalk:s.broken}),t;if(e===b)return g(t)}}function m(e){return e.brokenWalk?`unverifiable`:e.mode===`landmark`?`verified`:T({node:e.node,domain:e.domain})}function h(e){return s(o({...e,verification:`unverifiable`}))<=t}function g(e){return e.verification=`unverifiable`,s(o(e))>4096&&delete e.rect,e}const _=a;function v(e,t){return r(e,t)}function y(e,t){let n=f(e,t);if(!n)return;let r=_(n);return{role:r.role,...r.id===void 0?r.label===void 0?{}:{label:r.label}:{id:r.id}}}function b(e,t){return!e&&!t?!0:!e||!t?!1:n(e,t)}function x(e){let t=e.rect;if(t)return{x:t.x,y:t.y,width:t.width,height:t.height}}function S(t,n){return e(t,n)}function C(e){let{nodes:t,byIndex:n,node:r,identity:i,ancestry:a,sibling:o,scrollRegion:s}=e,c=u(t,n,i,a),l=c.filter(e=>v(t,e)===o),d=c.length>0?c.filter(e=>b(y(e,n),s)):void 0,f=d?w(d):[];return{identitySet:c,siblingMatches:l,regionMembers:d,orderedRegion:f,viewportOrder:Math.max(f.findIndex(e=>e.index===r.index),0)}}function w(e){return e.map((e,t)=>({node:e,documentOrder:t,center:d(e.rect)})).sort((e,t)=>!e.center&&!t.center?e.documentOrder-t.documentOrder:e.center?t.center?e.center.y===t.center.y?e.center.x===t.center.x?e.documentOrder-t.documentOrder:e.center.x-t.center.x:e.center.y-t.center.y:-1:1).map(e=>e.node)}function T(e){let{node:t,domain:n}=e,r=t.ref,a=n.identitySet.map(e=>e.ref);return i({winnerRef:r,matchedRefs:a,identitySetRefs:a,siblingMatchRefs:n.siblingMatches.map(e=>e.ref),regionMemberRefs:n.regionMembers?.map(e=>e.ref),viewportCandidateRef:n.orderedRegion[n.viewportOrder]?.ref}).outcome}export{w as a,p as i,y as n,b as o,v as r,_ as t};
|