agent-device 0.20.4 → 0.20.5
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.4.apk → agent-device-android-ime-helper-0.20.5.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.5.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.4.manifest.json → agent-device-android-ime-helper-0.20.5.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.4.apk → agent-device-android-snapshot-helper-0.20.5.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.5.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.4.manifest.json → agent-device-android-snapshot-helper-0.20.5.manifest.json} +6 -6
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/android.js +1 -1
- package/dist/src/apps.js +2 -2
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +1 -1
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +14 -14
- package/dist/src/context.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/ime-lifecycle.js +1 -1
- package/dist/src/input-actions.js +1 -1
- package/dist/src/interaction-snapshot.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +2 -2
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +14 -14
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/registry.js +18 -18
- package/dist/src/reporting.js +5 -5
- package/dist/src/runtime.js +3 -3
- package/dist/src/screenshot-geometry.js +1 -1
- package/dist/src/screenshot-result.js +4 -4
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selector-vocabulary.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +1 -1
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session.js +9 -8
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/viewport-dimension.js +12 -12
- package/package.json +6 -4
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.4.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.4.apk.sha256 +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{E as e,_ as t}from"./sdk-contracts.js";import{Ht as n,It as r,Pt as i,Vt as a,_n as o,rn as s}from"./viewport-dimension.js";import{F as c,J as l,W as ee,d as te}from"./screenshot-geometry.js";import{J as ne,O as re,S as ie,W as u,Y as ae,at as d,q as f}from"./sdk-batch-runner.js";import{h as oe,n as se,r as ce,t as le}from"./sdk-device.js";import{t as ue}from"./device.js";import{N as p,j as m}from"./sdk-android-adb.js";import{n as de,t as fe}from"./version.js";import{n as pe,t as me}from"./path-resolution.js";import{a as he,n as ge,o as _e,u as ve}from"./host-process.js";import h from"node:path";import ye from"node:crypto";import{REPLAY_VAR_KEY_RE as be,appendScriptSeriesFlags as g,formatPortableActionLine as xe,formatScriptArg as _,formatScriptStringLiteral as Se,formatTargetAnnotationLines as Ce,isClickLikeCommand as we,isTouchTargetCommand as Te,stripRecordedRefGeneration as v}from"@agent-device/ad-script";import y from"node:fs";import{StringDecoder as Ee}from"node:string_decoder";const b=1500;function De(e,t){e&&(e.snapshotDiagnostics??={samples:[]}).samples.push({...t,durationMs:Math.max(0,Math.round(t.durationMs))})}function Oe(e){let t=e?.snapshotDiagnostics?.samples;if(!(!t||t.length===0))return ke(t)}function ke(e){if(e.length===0)return;let t=Me(e);return{stats:t,...t.p95Ms>=b?{warning:Ie(t)}:{}}}function Ae(e){let t=e.flatMap(e=>Ve(e?.stats));if(t.length===0)return;let n=Me(t);return{stats:n,...n.p95Ms>=b?{warning:Ie(n)}:{}}}function je(e){if(!d(e))return;let t=Le(e.stats);if(!t)return;let n=typeof e.warning==`string`?e.warning:void 0;return{stats:t,...n?{warning:n}:{}}}function Me(e){let t=e.map(e=>e.durationMs).sort((e,t)=>e-t);return{count:t.length,p50Ms:Ne(t,50),p95Ms:Ne(t,95),maxMs:t[t.length-1]??0,slowThresholdMs:b,...Pe(e),...Fe(e)}}function Ne(e,t){if(e.length===0)return 0;let n=Math.max(0,Math.ceil(t/100*e.length)-1);return e[Math.min(n,e.length-1)]??0}function Pe(e){let t=e.map(e=>e.platform).filter(e=>!!e);return new Set(t).size===1?{platform:t[0]}:{}}function Fe(e){let t={};for(let n of e)n.backend&&(t[n.backend]=(t[n.backend]??0)+1);return Object.keys(t).length>0?{backends:t}:{}}function Ie(e){return`Warning: ${e.platform?`${e.platform} `:``}snapshots are slow in this run: p95 ${e.p95Ms}ms over ${e.count} captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon.`}function Le(e){if(!d(e))return;let t=Re(e);if(t)return{...t,...Be(e)}}function Re(e){let t={count:e.count,p50Ms:e.p50Ms,p95Ms:e.p95Ms,maxMs:e.maxMs,slowThresholdMs:e.slowThresholdMs};if(!Object.values(t).some(e=>typeof e!=`number`))return t}function ze(e){let t=Object.entries(e).filter(e=>typeof e[1]==`number`);return t.length>0?Object.fromEntries(t):void 0}function Be(e){let t=typeof e.platform==`string`?e.platform:void 0,n=d(e.backends)?ze(e.backends):void 0;return{...t?{platform:t}:{},...n?{backends:n}:{}}}function Ve(e){if(!e||e.count<=0)return[];let t=e.platform;return e.count===1?[{durationMs:e.maxMs,platform:t}]:e.count===2?[{durationMs:e.p50Ms,platform:t},{durationMs:e.maxMs,platform:t}]:[...Array.from({length:e.count-3},()=>({durationMs:e.p50Ms,platform:t})),{durationMs:e.p50Ms,platform:t},{durationMs:e.p95Ms,platform:t},{durationMs:e.maxMs,platform:t}]}const He=`/agent-device`,Ue=`x-agent-device-tenant`;function We(e){return Ge(e,He)}function Ge(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(t.replace(/^\/+/,``),n).toString()}function Ke(e){let t=e?.trim();return t?{authorization:`Bearer ${t}`,"x-agent-device-token":t}:{}}function qe(e){let t=e?.trim();return t?{[Ue]:t}:{}}const Je=`.webm`;function Ye(e){return e===`web`?Je:`.mp4`}function Xe(e,t){return h.extname(e)?e:`${e}${t}`}function Ze(e){return`./recording-${Date.now()}${Ye(e)}`}function Qe(e){return new Promise((t,n)=>{let r=``;e.setEncoding(`utf8`),e.on(`data`,e=>{r+=e}),e.on(`end`,()=>t(r)),e.on(`error`,n)})}async function $e(e,n,r){let i=[],a=0;for await(let o of e){let e=Buffer.isBuffer(o)?o:Buffer.from(o);if(a+=e.length,a>n)throw new t(`INVALID_ARGS`,r);i.push(e)}return Buffer.concat(i)}const x={kind:`none`};function S(e,t){if(t.path===void 0){let n=e??{kind:`default`,force:!1};return t.force?{...n,force:!0}:n}let n=e?.force===!0&&(e.kind==="default"||e.path===t.path);return{kind:`explicit`,path:t.path,force:t.force||n}}function et(e){return e.kind===`repair`?{...e,status:`armed`}:e}function tt(e){return e.kind===`none`?void 0:e.target}function nt(e){return e.kind===`repair`&&(e.status===`complete`||e.status===`close-succeeded`)}function rt(e){return e.kind===`repair`?e.status===`committed`:e.kind===`authoring`&&e.status===`published`}function it(e){return{kind:`authoring`,status:`armed`,target:S(void 0,e)}}function at(e){return e.kind!==`authoring`||e.status!==`armed`?e:{...e,status:`aborted`}}function ot(e,t){return e.kind===`authoring`?{kind:`authoring`,status:`published`,target:{kind:`explicit`,path:t,force:e.target.force}}:e}function st(e,t){let n=e.kind===`repair`?e:void 0,r=n?.sourcePath??t.sourcePath;return{kind:`repair`,status:n?.status??`armed`,target:S(n?.target,t.requested),boundary:n?.boundary??t.boundary,...r===void 0?{}:{sourcePath:r},...n?.closeReceipt===void 0?{}:{closeReceipt:n.closeReceipt}}}function ct(e){return e.kind!==`repair`||e.status!==`armed`?e:{...e,status:`complete`}}function lt(e,t){return e.kind===`repair`?{...e,status:e.status===`complete`?`close-succeeded`:e.status,closeReceipt:t}:e}function ut(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`committed`}}function dt(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`aborted`}}function ft(e){return e.kind===`repair`?e.boundary:void 0}function pt(e){return e.kind===`repair`?e.sourcePath:void 0}function mt(e){return e.kind===`repair`&&e.status!==`committed`}function ht(e){let t=tt(e);return t?.kind===`explicit`?t.path:void 0}function gt(e){return tt(e)?.force===!0}function C(e){return e.replace(/[^a-zA-Z0-9._-]/g,`_`)}function w(e,t){return pe(e,{cwd:t})}function T(e){return e?.scriptPublication??x}function _t(e){let t=T(e);return t.kind===`authoring`&&t.status===`armed`}function vt(e,t){e.recordSession=!0,e.scriptPublication=it({path:t.path===void 0?void 0:w(t.path),force:t.force===!0})}function yt(e){e.recordSession=!1,e.scriptPublication=at(T(e))}function bt(e,t){if(!t.saveScript)return;e.recordSession=!0;let n={path:typeof t.saveScript==`string`?w(t.saveScript):void 0,force:t.force===!0},r=T(e);if(r.kind===`repair`){e.scriptPublication=st(r,{requested:n,boundary:r.boundary,sourcePath:r.sourcePath});return}if(r.kind===`authoring`){e.scriptPublication={...r,target:S(r.target,n)};return}e.scriptPublication=it(n)}function xt(e,t){let n=T(e);n.kind===`authoring`&&(e.scriptPublication={...n,target:S(n.target,{path:t.explicitPath===void 0?void 0:w(t.explicitPath),force:t.liveForce===!0})})}function St(e,t){e.scriptPublication=ot(T(e),t),e.recordSession=!1}function Ct(e,t){let n=T(e);n.kind===`authoring`&&(e.scriptPublication=ot(n,t))}function wt(e,t){return t===!0||gt(T(e))}function Tt(e){return rt(T(e))}function E(e){return e?.scriptPublication??x}function Et(e,t){e.recordSession=!0;let n=E(e);e.scriptPublication=st(n,{requested:{path:typeof t.saveScript==`string`?w(t.saveScript):n.kind===`repair`?void 0:t.healedSiblingPath,force:t.force===!0},boundary:t.firstArm?e.actions.length:0,sourcePath:t.sourcePath})}function Dt(e){e.scriptPublication=et(E(e))}function Ot(e){e.scriptPublication=ct(E(e))}function kt(e,t){e.scriptPublication=lt(E(e),t)}function At(e){e.scriptPublication=dt(E(e))}function jt(e,t){let n=E(e);return n.kind===`repair`&&n.closeReceipt===t}function D(e){return E(e).kind===`repair`}function Mt(e){return mt(E(e))}function O(e){return ft(E(e))}function Nt(e){return pt(E(e))}function k(e){let t=e.result?.text;if(typeof t==`string`)return t;let n=e.positionals??[];return n.length===0?``:n[0]?.startsWith(`@`)?n.length>=3?n.slice(2).join(` `):n.slice(1).join(` `):n.length>=3&&!Number.isNaN(Number(n[0]))&&!Number.isNaN(Number(n[1]))?n.slice(2).join(` `):n.slice(1).join(` `)}const Pt=/^\$\{([A-Z_][A-Z0-9_]*)\}$/;function Ft(e){if(e!==e.trim()||!be.test(e))throw new t(`INVALID_ARGS`,`Invalid --record-as variable "${e}": use uppercase letters, digits, and underscores (for example PASSWORD).`);if(e.startsWith(`AD_`))throw new t(`INVALID_ARGS`,`Invalid --record-as variable "${e}": the AD_* namespace is reserved for built-in replay variables.`);return e}function It(e){return`\${${e}}`}function Lt(e){let t=Pt.exec(e);if(!(!t?.[1]||t[1].startsWith(`AD_`)))return t[1]}const Rt=new Set([`text`,`label`,`value`]),zt=new Set(`action.backend.cost.delayMs.evidence.gesture.hint.kind.maestroFallbackReason.maestroNonHittableCoordinateFallbackAllowed.maestroNonHittableCoordinateFallbackUsed.message.platform.ref.referenceHeight.referenceWidth.refLabel.resolution.selector.selectorChain.settle.targetHittable.targetKind.text.warning.x.y`.split(`.`)),Bt=new Set([`action`,`backend`,`gesture`,`kind`,`platform`,`ref`,`selector`,`targetKind`]),Vt=new Set([`cost`,`evidence`,`resolution`,`settle`]),Ht=new Map([[`cost`,new Set([`nodeCount`,`runnerRoundTrips`,`wallClockMs`])],[`evidence`,new Set([`changedFromBefore`,`digest`,`foregroundApp`,`interactiveNodeCount`,`nodeCount`])],[`resolution`,new Set([`alternatives`,`kind`,`matchCount`,`phase`,`source`,`tiebreak`,`winnerDiagnostic`])],[`resolution.alternatives`,new Set([`diagnosticRef`,`label`,`role`])],[`resolution.winnerDiagnostic`,new Set([`diagnosticRef`,`label`,`role`])],[`settle`,new Set([`captures`,`diff`,`hint`,`quietMs`,`refs`,`refsGeneration`,`settled`,`tail`,`tailTruncated`,`timeoutMs`,`waitedMs`])],[`settle.diff`,new Set([`lines`,`summary`,`truncated`])],[`settle.diff.lines`,new Set([`kind`,`ref`,`text`])],[`settle.diff.summary`,new Set([`additions`,`removals`,`unchanged`])],[`settle.refs`,new Set([`ref`])],[`settle.tail`,new Set([`label`,`ref`,`role`])]]),Ut=new Set([`evidence.digest`,`evidence.foregroundApp`,`resolution.alternatives.diagnosticRef`,`resolution.alternatives.role`,`resolution.kind`,`resolution.phase`,`resolution.source`,`resolution.tiebreak`,`resolution.winnerDiagnostic.diagnosticRef`,`resolution.winnerDiagnostic.role`,`settle.diff.lines.kind`,`settle.diff.lines.ref`,`settle.refs.ref`,`settle.tail.ref`,`settle.tail.role`]);function Wt(e,t,n){if(!e)return e;let r=Zt(e.selectorChain);return{...qt(e,t,n),...typeof e.text==`string`?{text:n}:{},...r?{selectorChain:r.filter(e=>!Kt(e,t))}:{}}}function Gt(e,t,n){return e&&{...e,...e.label===t?{label:n}:{},ancestry:e.ancestry.map(e=>({...e,...e.label===t?{label:n}:{}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===t?{label:n}:{}}}:{}}}function Kt(e,t){return u(e)?.selectors.some(e=>e.terms.some(e=>Rt.has(e.key)&&typeof e.value==`string`&&j(e.value,t,``)!==e.value))??!1}function qt(e,t,n){return Object.fromEntries(Object.entries(e).map(([e,r])=>[zt.has(e)?e:j(e,t,n),Jt(r,e,t,n)]))}function Jt(e,t,n,r){return typeof e==`string`&&Bt.has(t)?e:t===`selectorChain`&&Xt(e)?Yt(e,n):A(e,n,r,Vt.has(t)?t:void 0)}function A(e,t,n,r){if(typeof e==`string`)return r&&Ut.has(r)?e:j(e,t,n);if(Array.isArray(e))return e.map(e=>A(e,t,n,r));if(!e||typeof e!=`object`)return e;let i=r?Ht.get(r):void 0;return Object.fromEntries(Object.entries(e).map(([e,a])=>{let o=i?.has(e)===!0;return[o?e:j(e,t,n),A(a,t,n,o?`${r}.${e}`:void 0)]}))}function Yt(e,t){return e.filter(e=>!Kt(e,t))}function j(e,t,n){if(!t)return e===t?n:e;let r=n?e.split(n):[e];return r.every(e=>!e.includes(t))?e:t.trim()?r.map(e=>e.replaceAll(t,n)).join(n):n}function Xt(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function Zt(e){return Xt(e)?e:void 0}function Qt(e,t){if(t.flags?.noRecord||rn(e,t))return;t.flags&&bt(e,t.flags);let n=$t(t),r={ts:Date.now(),command:n.command,positionals:n.positionals,runtime:n.runtime,flags:on(n.flags),result:n.result,...n.targetEvidence?{targetEvidence:n.targetEvidence}:{}};return e.actions.push(r),m({level:`debug`,phase:`record_action`,data:{command:t.command,session:e.name}}),r}function $t(e){if(e.command!==`fill`||typeof e.flags.recordAs!=`string`)return e;let t=It(Ft(e.flags.recordAs)),n=k({ts:0,command:e.command,positionals:e.positionals,flags:e.flags});return{...e,positionals:en(e.positionals,t),result:Wt(e.result,n,t),targetEvidence:Gt(e.targetEvidence,n,t)}}function en(e,t){let n=e[0];return n?.startsWith(`@`)?e.length>=3?[n,e[1],t]:[n,t]:e.length>=3&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1]))?[e[0],e[1],t]:n===void 0?[t]:[n,t]}const tn=new Set([`snapshot`,`get`,`is`,`find`]);function nn(e){return e.internal?.replayPlanStep===!0?!1:tn.has(e.command)}function rn(e,t){return!t.interactiveObservation||O(e)===void 0?!1:t.flags?.record!==!0}const an=[`platform`,`device`,`udid`,`serial`,`out`,`verbose`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`,`snapshotInteractiveOnly`,`snapshotDepth`,`snapshotScope`,`snapshotRaw`,...o,`relaunch`,`saveScript`,`force`,`noRecord`,`record`,`fps`,`quality`,`hideTouches`,`count`,`pointerCount`,`intervalMs`,`delayMs`,`holdMs`,`jitterPx`,`doubleTap`,`clickButton`,`pauseMs`,`pattern`];function on(e){if(!e)return{};let t={};for(let n of an)e[n]!==void 0&&(t[n]=e[n]);return t}function sn(e){let n=e.flatMap((e,t)=>e.command===`open`?[t]:[]);if(n.length!==1||n[0]!==0)throw new t(`COMMAND_FAILED`,`Cannot publish this session: an open-to-destination script requires exactly one initial recorded open.`,{retriable:!1,hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`});if(e.some(e=>e.command===`close`))throw new t(`COMMAND_FAILED`,`Cannot publish an active-session script containing close.`,{retriable:!1,hint:`Close this session and record the journey again from a fresh open --save-script session.`});let r=-1;for(let[t,n]of e.entries())ie({command:n.command,positionals:n.positionals,flags:n.flags})===`mutates-app`&&(r=t);if(!e.slice(r+1).some(un))throw new t(`COMMAND_FAILED`,`Cannot publish this session without a portable destination guard after the final mutating action.`,{retriable:!0,hint:`Record a selector-targeted wait on a labeled or id-bearing landmark, for example wait 'role="heading" label="Screen X"', so its recorded identity is captured, then retry session save-script.`})}function cn(e){for(let n of e){let e=dn(n),r=e??(n.command===`wait`?n.positionals[0]:void 0);if(r?.startsWith(`@`))throw new t(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${r}": the session-local ref was not converted to a portable selector.`,{retriable:!1,hint:`Close this session and record the journey again using selectors or resolvable refs.`});if(n.command===`find`&&ie(n)===`mutates-app`)throw new t(`COMMAND_FAILED`,`Cannot publish a recorded mutating find step because its target identity is not replay-verifiable.`,{retriable:!1,hint:`Close this session and record the journey again with an explicit selector-targeted click, press, fill, or focus action.`});let i=e;if(!(!i||!u(i)||n.targetEvidence))throw new t(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${i}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again from open --save-script so target-v1 evidence is captured before each interaction.`})}}function ln(e,n){if(e instanceof t){if(e.details?.reason===`script_target_exists`)return new t(e.code,`A file already exists at ${String(e.details.path)}.`,{...e.details,retriable:!0,hint:`Retry session save-script with another path, or pass --force to replace the existing file. The session remains armed.`});let n=e.details?.retriable===!0;return new t(e.code,e.message,{...e.details,retriable:n,hint:e.details?.hint??(n?`Fix the recorded journey or target, then retry session save-script. The session remains armed.`:`Close this session and start a fresh one with open <app> --save-script[=<path>].`)})}let r=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`Failed to publish the active session script${n?` to ${n}`:``}: ${r}`,{retriable:!0,hint:`Check the target path and permissions, then retry session save-script. The session remains armed.`})}function un(e){if(e.command!==`wait`)return!1;let t=re(e.positionals);return t?.kind!==`selector`||u(t.selectorExpression)===null?!1:e.targetEvidence?.verification===`verified`}function dn(e){if(e.command===`get`)return e.positionals[1];if(Te(e.command)||e.command===`fill`){let[t,n]=e.positionals;return t!==void 0&&n!==void 0&&fn(t)&&fn(n)?void 0:t}}function fn(e){return e.trim().length>0&&Number.isFinite(Number(e))}function pn(e){let t=e.scriptPublication??x;return t.kind===`repair`?t.status===`committed`?!0:!nt(t):!1}var mn=class{sessionsDir;constructor(e){this.sessionsDir=e}write(e,t){let n=D(e),r=t?.publication===`active`,i;try{if(!e.recordSession||pn(e))return{written:!1};let a=hn(e,{appendCompleteSentinel:n,activePublication:r});i=this.resolveScriptPath(e);let o=h.dirname(i);return y.existsSync(o)||y.mkdirSync(o,{recursive:!0}),vn({scriptPath:i,script:a.script,force:t?.force}),n&&(e.scriptPublication=ut(e.scriptPublication??x)),{written:!0,path:i,actionCount:a.actionCount}}catch(t){return gn({session:e,error:t,scriptPath:i,repairArmed:n,activePublication:r})}}resolveScriptPath(e){let t=ht(e.scriptPublication??x);if(t)return w(t);let n=C(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,`-`);return h.join(this.sessionsDir,`${n}-${r}.ad`)}};function hn(e,t){let n=yn(e,{strictPortableRefs:t.activePublication});return t.activePublication&&sn(n),{script:On(e,n,t.appendCompleteSentinel),actionCount:n.length}}function gn(e){let{session:n,error:r,scriptPath:i,repairArmed:a,activePublication:o}=e;if(m({level:`warn`,phase:`session_script_write_failed`,data:{session:n.name,path:i,error:r instanceof Error?r.message:String(r)}}),a)return{written:!1,error:_n(r,i)};if(o)return{written:!1,error:ln(r,i)};if(r instanceof t)throw r;return{written:!1}}function _n(e,n){if(e instanceof t)return e;let r=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`Failed to write the healed script${n?` to ${n}`:``}: ${r}`,{hint:`The repair transaction completed but the healed .ad could not be published; check the target path and permissions, then retry close --save-script.`})}function vn(e){let{scriptPath:n,script:r,force:i}=e,a=h.dirname(n),o=h.join(a,`.${h.basename(n)}.${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`);y.writeFileSync(o,r);try{if(i){y.renameSync(o,n);return}y.linkSync(o,n)}catch(e){throw e.code===`EEXIST`?new t(`COMMAND_FAILED`,`A file already exists at ${n}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`,{reason:`script_target_exists`,path:n}):e}finally{y.rmSync(o,{force:!0})}}function yn(e,t={}){let n=O(e),r=n!==void 0,i=e.actions.slice(n??0),a=[];for(let n of i){if(n.command===`snapshot`)continue;let i=xn(n);if(i){a.push(i);continue}(r||t.strictPortableRefs)&&bn(n);let o=Dn(e,n);o&&a.push(o),a.push(n)}return t.strictPortableRefs&&cn(a),a}function bn(e){if(!M(e.command))return;let n=e.command===`get`?e.positionals?.[1]:e.positionals?.[0];if(n?.startsWith(`@`))throw new t(`COMMAND_FAILED`,`Cannot write recorded step "${e.command} ${n}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function xn(e){let t=Sn(e);if(!(!t||!M(e.command)))return we(e.command)?{...e,positionals:[t]}:e.command===`longpress`?wn(e,t):e.command===`fill`?Cn(e,t):Tn(e,t)}function Sn(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];return t.length>0?t.join(` || `):void 0}function M(e){return Te(e)||e===`fill`||e===`get`}function Cn(e,t){let n=k(e);return n.length>0?{...e,positionals:[t,n]}:void 0}function wn(e,t){let n=typeof e.result?.durationMs==`number`?String(e.result.durationMs):En(e.positionals??[]);return{...e,positionals:n?[t,n]:[t]}}function Tn(e,t){let n=e.positionals?.[0];return n===`text`||n===`attrs`?{...e,positionals:[n,t]}:void 0}function En(e){let t=e.at(-1);if(!(e.length<=1||t===void 0||t.trim()===``))return Number.isFinite(Number(t))?t:void 0}function Dn(e,t){if(!M(t.command))return;let n=t.result?.refLabel;if(typeof n!=`string`||n.trim().length===0)return;let r=n.trim();return{ts:t.ts,command:`snapshot`,positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotScope:r},result:{scope:r}}}function On(e,t,n){let r=[],i=e.device.kind?` kind=${e.device.kind}`:``;r.push(`context platform=${oe(e.device)} device=${Se(e.device.name)}${i} theme=unknown`);for(let e of t)e.flags?.noRecord||(r.push(...Ce(e)),r.push(kn(e)));return n&&r.push(`# agent-device:heal-complete`),`${r.join(`
|
|
2
|
-
`)}\n`}function kn(e){return An([e.command],e)||xe(e)}function An(e,t){if(we(t.command))return jn(e,t);if(t.command===`fill`)return Mn(e,t);if(t.command===`get`)return Nn(e,t)}function jn(e,t){let n=t.positionals?.[0];if(n){if(n.startsWith(`@`))return e.push(_(v(n))),N(e,t),g(e,t),e.join(` `);if(t.positionals.length===1)return e.push(_(n)),g(e,t),e.join(` `)}}function Mn(e,t){let n=t.positionals?.[0];if(!n?.startsWith(`@`))return;e.push(_(v(n))),N(e,t);let r=t.positionals.slice(1).join(` `);return t.positionals.length>1&&e.push(_(r)),g(e,t),e.join(` `)}function Nn(e,t){let n=t.positionals?.[0],r=t.positionals?.[1];if(!(!n||!r))return e.push(_(n)),e.push(_(v(r))),r.startsWith(`@`)&&N(e,t),e.join(` `)}function N(e,t){let n=t.result?.refLabel;typeof n==`string`&&n.trim().length>0&&e.push(_(n))}const Pn=[`status`,`get`,`dismiss`,`enter`,`return`];function P(e){return Pn.includes(e)}const Fn=[`id`,`deviceId`,`device_id`,`serial`,`udid`,`device_udid`,`identifier`],In={ios:`iOS`,ipados:`iPadOS`,tvos:`tvOS`,watchos:`watchOS`,visionos:`visionOS`,macos:`macOS`,apple:`Apple`,android:`Android`,linux:`Linux`,web:`Web`};function Ln(e,t){let r=t??{};switch(e.command){case n.devices:return Rn(r.devices);case n.apps:return zn(r.apps,e.flags?.appsFilter);case n.boot:return Bn(`Booted`,r,!0);case n.shutdown:return Bn(`Shut down`,r,!1);case n.install:return Vn(`Installed`,r);case n.reinstall:return Vn(`Reinstalled`,r);case n.screenshot:return Hn(e,r);default:return{}}}function Rn(e){if(!Array.isArray(e))return{};let t=e.flatMap(e=>{let t=Wn(e);return t?[t]:[]}),n=t.slice(0,5),r=Math.max(0,t.length-n.length),i=t.slice(0,3);return{summary:$n(`Found ${t.length} ${L(`device`,t.length)}`,i.map(e=>Zn(e,!0)),Math.max(0,t.length-i.length)),details:{deviceCount:t.length,devices:n,...r>0?{omittedDeviceCount:r}:{}}}}function zn(e,t){if(!Array.isArray(e))return{};let n=e.flatMap(e=>{let t=R(e);return t?[t]:[]}),r=n.slice(0,5),i=Math.max(0,n.length-r.length),a=n.slice(0,3);return{summary:$n(`Found ${n.length} ${L(`app`,n.length)}`,a,Math.max(0,n.length-a.length)),details:{appCount:n.length,apps:r,...i>0?{omittedAppCount:i}:{},...t===`all`||t===`user-installed`?{filter:t}:{}}}}function Bn(e,t,n){let r=Gn(t);if(!r)return{};let i={device:r,...Xn(t),booted:n};return{summary:`${e} ${Zn(i,!1)}`,details:i}}function Vn(e,t){let n=R(t.appName),r=R(t.bundleId),i=F(t,[`packageName`,`package`]),a=R(t.platform),o=R(t.launchTarget),s=F(t,[`bundleId`,`packageName`,`package`,`appId`,`launchTarget`]),c=Qn(n,s);if(!c)return{};let l={};return I(l,`appName`,n),I(l,`bundleId`,r),I(l,`packageName`,i),I(l,`platform`,a),o!==s&&I(l,`launchTarget`,o),{summary:`${e} ${c}`,details:l}}function Hn(e,t){let n=Un(e,t);return n?{details:{requestedFileName:n}}:{}}function Un(e,t){let n=W(e.meta?.clientArtifactPaths?.path)??W(t.path);if(n)return U(n)}function Wn(e){if(!f(e))return;let t=Gn(e);if(t)return{name:t,...Xn(e)}}function Gn(e){let t=F(e,[`name`,`deviceName`,`device`]);return!t||!Kn(e,t)?t:Jn(e)}function Kn(e,t){let n=qn(t);return Fn.some(t=>{let r=R(e[t]);return r!==void 0&&qn(r)===n})}function qn(e){return e.toLowerCase()}function Jn(e){let t=R(e.appleOs),n=R(e.platform),r=R(e.kind),i=Yn(t,n);return i&&(r===`simulator`||r===`emulator`)?`${i} ${r}`:i?`${i} device`:r===`simulator`?`Simulator`:r===`emulator`?`Emulator`:`Unnamed device`}function Yn(e,t){let n=e??t;if(!(!n||!Object.hasOwn(In,n)))return In[n]}function Xn(e){let t=R(e.platform),n=R(e.appleOs),r=R(e.kind),i=R(e.target);return{...t?{platform:t}:{},...n?{appleOs:n}:{},...r?{kind:r}:{},...i?{target:i}:{},...typeof e.booted==`boolean`?{booted:e.booted}:{}}}function Zn(e,t){let n=R(e.name)??R(e.device)??`device`,r=R(e.platform),i=R(e.appleOs),a=[r,i===r?void 0:i,R(e.kind),R(e.target),t&&typeof e.booted==`boolean`?e.booted?`booted`:`stopped`:void 0].filter(e=>!!e);return a.length>0?`${n} (${a.join(`, `)})`:n}function Qn(e,t){return e&&t&&e!==t?`${e} (${t})`:e??t}function F(e,t){for(let n of t){let t=R(e[n]);if(t)return t}}function I(e,t,n){n&&(e[t]=n)}function $n(e,t,n){let r=[...t,...n>0?[`+${n} more`]:[]];return r.length>0?`${e}: ${r.join(`, `)}`:e}function L(e,t){return t===1?e:`${e}s`}function R(e){let t=W(e);if(!t)return;let n=t.trim(),r=Array.from(n);return r.length<=120?n:`${r.slice(0,119).join(``)}…`}function z(e){return R(e)}function B(e){return typeof e==`boolean`?e:void 0}function V(e,t){let n=z(e);return n&&t.includes(n)?n:void 0}function H(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function U(e){let t=W(e);return t?R(t.split(/[\\/]/).at(-1)):void 0}function W(e){if(typeof e==`string`)return e.trim().length>0?e:void 0}function G(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}const er=[`up`,`down`,`left`,`right`],tr=[`top`,`bottom`];function nr(e){return`${e.command===n.reinstall?`Reinstalled`:`Installed`} ${or(e.result??{})??`app`}`}function rr(e){let t=e.result??{};switch(e.command){case n.scroll:return cr(t);case n.screenshot:return dr(t);case n.home:return`Went home`;case n.back:return pr(t);case n.appSwitcher:return`Opened app switcher`;case n.orientation:return mr(t);case n.viewport:return hr(t);case n.clipboard:return gr(t);case n.keyboard:return _r(t);case n.tvRemote:return yr(t);case n.gesture:return br(t);case n.swipe:return xr(t);case n.trace:return Cr(`trace`,e);case n.record:return Cr(`recording`,e);default:return}}function ir(e){let t=e.result??{};switch(e.command){case n.scroll:return H({direction:V(t.direction,er),edge:V(t.edge,tr),passes:G(t.passes),amount:G(t.amount),pixels:G(t.pixels),durationMs:G(t.durationMs),x1:G(t.x1),y1:G(t.y1),x2:G(t.x2),y2:G(t.y2)});case n.screenshot:return H({requestedFileName:fr(t)});case n.back:return H({mode:V(t.mode,l)});case n.orientation:return H({orientation:V(t.orientation,ue)});case n.viewport:return H({width:G(t.width),height:G(t.height)});case n.clipboard:return H({action:V(t.action,[`read`,`write`])});case n.keyboard:return vr(t);case n.tvRemote:return H({button:V(t.button,te),durationMs:G(t.durationMs)});case n.gesture:case n.swipe:return Sr(t);case n.trace:case n.record:return H({action:V(t.action,[`start`,`stop`]),fileName:Tr(e),showTouches:B(t.showTouches)});default:return{}}}function ar(e,t){if(e.command!==n.screenshot)return t;let r=Un(e,t);return r?{...t,requestedFileName:r}:t}function or(e){let t=z(e.appName),n=Er(e,[`bundleId`,`packageName`,`appBundleId`,`launchTarget`]);return t&&n&&t!==n?`${t} (${n})`:t??n??sr(e)}function sr(e){let t=z(e.app);return t&&!t.includes(`/`)&&!t.includes(`\\`)?t:void 0}function cr(e){let t=V(e.direction,er),n=V(e.edge,tr),r=G(e.passes);return n?lr(n,r):t?ur(t,e):`Scrolled`}function lr(e,t){return t===0?`Already at ${e}`:t===void 0?`Scrolled to ${e}`:`Scrolled to ${e} in ${t} ${t===1?`pass`:`passes`}`}function ur(e,t){let n=G(t.pixels);if(n!==void 0)return`Scrolled ${e} by ${n}px`;let r=G(t.amount);return r===void 0?`Scrolled ${e}`:`Scrolled ${e} by ${r}`}function dr(e){let t=fr(e);return t?`Captured screenshot ${t}`:`Captured screenshot`}function fr(e){return U(e.requestedFileName)??U(e.path)}function pr(e){return V(e.mode,l)===`system`?`Went back using system navigation`:`Went back`}function mr(e){let t=V(e.orientation,ue);return t?`Rotated to ${t}`:`Changed orientation`}function hr(e){let t=G(e.width),n=G(e.height);return t!==void 0&&n!==void 0?`Set viewport to ${t}×${n}`:`Changed viewport`}function gr(e){let t=V(e.action,[`read`,`write`]);return t===`read`?`Read clipboard`:t===`write`?`Updated clipboard`:`Used clipboard`}function _r(e){let t=W(e.action);if(!t||!P(t))return`Used keyboard`;if(t===`dismiss`)return B(e.dismissed)===!1?`Keyboard was already hidden`:`Dismissed keyboard`;if(t===`enter`||t===`return`)return`Pressed keyboard return`;let n=B(e.visible);return n===void 0?`Inspected keyboard`:n?`Keyboard is visible`:`Keyboard is hidden`}function vr(e){let t=W(e.action);return H({action:t&&P(t)?t:void 0,platform:V(e.platform,[`ios`,`android`]),visible:B(e.visible),wasVisible:B(e.wasVisible),dismissed:B(e.dismissed),attempts:G(e.attempts)})}function yr(e){let t=V(e.button,te);return t?`Pressed TV remote ${t}`:`Used TV remote`}function br(e){let t=V(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]);return t?`Ran ${t} gesture`:`Ran gesture`}function xr(e){let t=G(e.count);return t!==void 0&&t>1?`Swiped ${t} times`:`Swiped`}function Sr(e){return H({kind:V(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]),durationMs:G(e.durationMs),pointerCount:G(e.pointerCount),x1:G(e.x1),y1:G(e.y1),x2:G(e.x2),y2:G(e.y2),count:G(e.count),pauseMs:G(e.pauseMs),pattern:V(e.pattern,[`one-way`,`ping-pong`]),scale:G(e.scale)})}function Cr(e,t){let n=wr(e,V(t.result?.action,[`start`,`stop`])),r=Tr(t);return r?`${n} ${r}`:n}function wr(e,t){return t===`start`?e===`trace`?`Started trace`:`Started recording`:t===`stop`?e===`trace`?`Stopped trace`:`Stopped recording`:e===`trace`?`Updated trace`:`Updated recording`}function Tr(e){let t=e.result??{};return U(t.requestedFileName)??U(t.outPath)??U(t.path)??U(e.positionals[1])}function Er(e,t){for(let n of t){let t=z(e[n]);if(t)return t}}function Dr(e){switch(e.command){case n.open:return`Opened ${K(e)??`session`}`;case n.close:return`Closed ${z(e.result?.session)??`session`}`;case n.click:case n.press:return`Tapped ${K(e)??`target`}`;case n.longPress:return`Long pressed ${K(e)??`target`}`;case n.fill:return`Filled ${K(e)??`target`}`;case n.type:return`Typed text`;case n.install:case n.reinstall:case a.installSource:return nr(e);default:return rr(e)??`Ran ${e.command}`}}function Or(e){return H({command:e.command,positionals:Lr(e),flags:Jr(e),...kr(e),...Ar(e),...jr(e),...ir(e)})}function kr(e){if(!Mr(e.command))return{};let t=e.result??{};return H({ref:X(t),targetLabel:K(e),selectorChainLength:Gr(t.selectorChain)?.length,x:G(t.x),y:G(t.y),x2:G(t.x2),y2:G(t.y2),durationMs:G(t.durationMs)})}function Ar(e){if(!Nr(e.command))return{};let t=e.result??{};return H({platform:V(t.platform,ce),target:V(t.target,le),appName:z(t.appName),appBundleId:z(t.appBundleId),bundleId:z(t.bundleId),packageName:z(t.packageName),launchTarget:z(t.launchTarget)})}function jr(e){let t=e.result??{};return e.command===n.snapshot?{...Array.isArray(t.nodes)?{nodeCount:t.nodes.length}:{}}:e.command!==n.wait&&e.command!==n.find&&e.command!==n.get&&e.command!==n.is?{}:H({waitedMs:G(t.waitedMs),found:B(t.found)})}function Mr(e){return e===n.click||e===n.press||e===n.longPress||e===n.focus||e===n.fill}function Nr(e){return e===n.open||e===n.install||e===n.reinstall||e===a.installSource}function K(e){let t=e.result??{};return Pr(t)??Fr(t)??Ir(t)??Ur(e.positionals[0])}function Pr(e){let t=X(e);if(t)return t.startsWith(`@`)?t:`@${t}`}function Fr(e){let t=G(e.x),n=G(e.y);if(t!==void 0&&n!==void 0)return`(${t}, ${n})`}function Ir(e){return z(e.appName)??z(e.appBundleId)??z(e.bundleId)??z(e.packageName)}function Lr(e){if(e.positionals.length!==0)return e.command===n.type?[J(`text`)]:e.command===n.fill?Rr(e):e.command===n.find?zr(e):e.command===n.clipboard?Br(e):e.command===n.push?Vr(e,`app`,`payload`):e.command===n.triggerAppEvent?Vr(e,`event`,`payload`):e.positionals.map(q)}function Rr(e){let t=J(`text`),n=e.result??{},r=X(n);if(r)return[`@${r}`,t];if(z(n.selector))return[J(`target`),t];let i=G(n.x),a=G(n.y);return i!==void 0&&a!==void 0?[String(i),String(a),t]:[t]}function zr(e){let t=+!!Wr(e.positionals[0]);if(e.positionals[t]===void 0)return;let n=t+1,r=[...t===1?[String(e.positionals[0])]:[],J(`query`)],i=e.positionals[n];return i?i===`fill`||i===`type`?[...r,i,J(`text`)]:[...r,...e.positionals.slice(n).map(Hr)]:r}function Br(e){let t=e.positionals[0]?.toLowerCase();return t===`read`?[`read`]:t===`write`?[`write`,J(`text`)]:e.positionals.map(q)}function Vr(e,t,n){let[r,i,...a]=e.positionals;return[...r?[J(t)]:[],...i?[J(n)]:[],...a.map(q)]}function Hr(e){return e===`click`||e===`focus`||e===`exists`||e===`get`||e===`text`||e===`attrs`||e===`wait`?e:q(e)}function q(e){return Ur(e)??J(`arg`)}function Ur(e){if(!e)return;let t=e.trim();if(/^@[a-zA-Z0-9:_-]+$/.test(t))return t}function J(e){return`<${e}>`}function Wr(e){return e===`text`||e===`label`||e===`value`||e===`role`||e===`id`}function Gr(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)?e:void 0}const Kr={enums:[{source:`platform`,values:se},{source:`target`,values:le}]},qr={[n.open]:{booleans:[{source:`relaunch`},{source:`testIme`}],enums:[{source:`surface`,values:i}]},[n.click]:Y(),[n.press]:Y(),[n.longPress]:Y(),[n.fill]:Yr(),[n.type]:Yr(),[n.scroll]:{numbers:[{source:`pixels`},{source:`durationMs`}]},[n.gesture]:Xr(),[n.swipe]:Xr(),[n.screenshot]:{booleans:[{source:`overlayRefs`},{source:`screenshotFullscreen`,output:`fullscreen`},{source:`screenshotNoStabilize`,output:`noStabilize`},{source:`screenshotNormalizeStatusBar`,output:`normalizeStatusBar`}],numbers:[{source:`screenshotPixelDensity`,output:`pixelDensity`},{source:`screenshotMaxSize`,output:`maxSize`}]},[n.snapshot]:{booleans:[{source:`snapshotInteractiveOnly`,output:`interactiveOnly`},{source:`snapshotDiff`,output:`diff`},{source:`snapshotRaw`,output:`raw`},{source:`snapshotForceFull`,output:`forceFull`}],numbers:[{source:`snapshotDepth`,output:`depth`}]},[n.back]:{enums:[{source:`backMode`,output:`mode`,values:l}]},[n.record]:{booleans:[{source:`hideTouches`}],numbers:[{source:`fps`},{source:`screenshotMaxSize`,output:`maxSize`}],enums:[{source:`recordingScope`,output:`scope`,values:r}]},[n.apps]:{enums:[{source:`appsFilter`,output:`filter`,values:[`user-installed`,`all`]}]},[n.boot]:{booleans:[{source:`headless`}]},[n.close]:{booleans:[{source:`shutdown`}]}};function Jr(e){let t=e.flags??{},n={},r=Object.hasOwn(qr,e.command)?qr[e.command]:void 0;return Zr(n,t,Kr),Zr(n,t,r),Object.keys(n).length>0?n:void 0}function Y(){return{booleans:[{source:`doubleTap`},{source:`settle`}],numbers:[{source:`count`},{source:`intervalMs`},{source:`holdMs`},{source:`jitterPx`},{source:`settleQuietMs`}],enums:[{source:`clickButton`,values:ee}]}}function Yr(){return{booleans:[{source:`settle`}],numbers:[{source:`delayMs`},{source:`settleQuietMs`}]}}function Xr(){return{numbers:[{source:`pointerCount`},{source:`count`},{source:`pauseMs`}],enums:[{source:`pattern`,values:c}]}}function Zr(e,t,n){n&&(Qr(e,t,n.booleans??[]),$r(e,t,n.numbers??[]),ei(e,t,n.enums??[]))}function Qr(e,t,n){for(let r of n)ti(e,r.output??r.source,t[r.source])}function $r(e,t,n){for(let r of n)ni(e,r.output??r.source,t[r.source])}function ei(e,t,n){for(let r of n)ri(e,r.output??r.source,t[r.source],r.values)}function X(e){let t=z(e.ref);if(!t)return;let n=t.startsWith(`@`)?t.slice(1):t;return/^[a-zA-Z0-9:_-]+$/.test(n)?n:void 0}function ti(e,t,n){typeof n==`boolean`&&(e[t]=n)}function ni(e,t,n){let r=G(n);r!==void 0&&(e[t]=r)}function ri(e,t,n,r){let i=V(n,r);i!==void 0&&(e[t]=i)}const Z=new Map,ii=new Set;function ai(e){return h.join(e,`events.ndjson`)}function oi(e){return e.command!==n.events}function si(t,n,r){let i=e({version:1,ts:r.ts??new Date().toISOString(),session:n,...r});li(t,`${JSON.stringify(i)}\n`)}async function ci(e){await(e?Z.get(e):Promise.all(Z.values()))}function li(e,t){let n=(Z.get(e)??Promise.resolve()).catch(()=>void 0).then(async()=>{await ui(e),await y.promises.appendFile(e,t,`utf8`)}).catch(t=>{m({level:`warn`,phase:`session_event_log_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}).finally(()=>{Z.get(e)===n&&Z.delete(e)});Z.set(e,n)}async function ui(e){let t=h.dirname(e);if(!ii.has(t))try{await y.promises.mkdir(t,{recursive:!0}),ii.add(t)}catch(t){throw m({level:`warn`,phase:`session_event_log_dir_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}}),t}}function di(e,t,n){si(e,t,{kind:`action.recorded`,requestId:p().requestId,command:n.command,summary:Dr(n),details:Or(n)})}function fi(e){let{req:t}=e;return{kind:`request.started`,requestId:t.meta?.requestId??p().requestId,command:t.command,summary:`Started ${t.command}`}}function pi(e){let{req:t,response:n,durationMs:r}=e;if(n.ok){let e=Ln(t,n.data);return{kind:`request.finished`,requestId:t.meta?.requestId??p().requestId,command:t.command,status:`ok`,summary:e.summary??`Finished ${t.command}`,details:{durationMs:r,...e.details}}}return{kind:`request.finished`,requestId:t.meta?.requestId??p().requestId,command:t.command,status:`error`,summary:`Failed ${t.command}: ${n.error.code}`,details:{durationMs:r,code:n.error.code,diagnosticId:n.error.diagnosticId}}}function mi(e,t={}){let n=yi(t.cursor),r=bi(t.limit);if(!y.existsSync(e))return{path:e,cursor:String(n),limit:r,events:[]};let i=hi(e,n,r),a=i.lines.flatMap(e=>{let t=xi(e);return t?[t]:[]});return{path:e,cursor:String(n),limit:r,events:a,...i.nextCursor===void 0?{}:{nextCursor:String(i.nextCursor)}}}function hi(e,t,n){let r=y.openSync(e,`r`);try{let e=new Ee(`utf8`),i=Buffer.allocUnsafe(65536),a=gi(t,n),o=``,s=0;do{s=y.readSync(r,i,0,i.length,null);let t=e.write(i.subarray(0,s));o=_i(`${o}${t}`,a)}while(s>0&&a.nextCursor===void 0);let c=`${o}${e.end()}`;return a.nextCursor===void 0&&c.length>0&&vi(c,a),{lines:a.lines,nextCursor:a.nextCursor}}finally{y.closeSync(r)}}function gi(e,t){return{cursor:e,limit:t,lineIndex:0,lines:[]}}function _i(e,t){let n=0;for(let r=e.indexOf(`
|
|
1
|
+
import{E as e,_ as t,h as n}from"./sdk-contracts.js";import{Ft as r,Ht as i,Lt as a,Sn as o,Ut as s,Vt as c,in as l,vn as u,xn as ee}from"./viewport-dimension.js";import{E as te,G as ne,I as re,Y as d,d as ie}from"./screenshot-geometry.js";import{J as ae,O as oe,S as se,W as f,Y as ce,at as p,q as m}from"./sdk-batch-runner.js";import{h as le,n as ue,r as de,t as fe}from"./sdk-device.js";import{f as pe,p as me}from"./sdk-selectors.js";import{t as he}from"./device.js";import{N as h,j as g}from"./sdk-android-adb.js";import{n as ge,t as _e}from"./version.js";import{n as ve,t as ye}from"./path-resolution.js";import{a as be,n as xe,o as Se,u as Ce}from"./host-process.js";import _ from"node:path";import we from"node:crypto";import v from"node:fs";import{StringDecoder as Te}from"node:string_decoder";const y=1500;function Ee(e,t){e&&(e.snapshotDiagnostics??={samples:[]}).samples.push({...t,durationMs:Math.max(0,Math.round(t.durationMs))})}function De(e){let t=e?.snapshotDiagnostics?.samples;if(!(!t||t.length===0))return Oe(t)}function Oe(e){if(e.length===0)return;let t=je(e);return{stats:t,...t.p95Ms>=y?{warning:Fe(t)}:{}}}function ke(e){let t=e.flatMap(e=>Be(e?.stats));if(t.length===0)return;let n=je(t);return{stats:n,...n.p95Ms>=y?{warning:Fe(n)}:{}}}function Ae(e){if(!p(e))return;let t=Ie(e.stats);if(!t)return;let n=typeof e.warning==`string`?e.warning:void 0;return{stats:t,...n?{warning:n}:{}}}function je(e){let t=e.map(e=>e.durationMs).sort((e,t)=>e-t);return{count:t.length,p50Ms:Me(t,50),p95Ms:Me(t,95),maxMs:t[t.length-1]??0,slowThresholdMs:y,...Ne(e),...Pe(e)}}function Me(e,t){if(e.length===0)return 0;let n=Math.max(0,Math.ceil(t/100*e.length)-1);return e[Math.min(n,e.length-1)]??0}function Ne(e){let t=e.map(e=>e.platform).filter(e=>!!e);return new Set(t).size===1?{platform:t[0]}:{}}function Pe(e){let t={};for(let n of e)n.backend&&(t[n.backend]=(t[n.backend]??0)+1);return Object.keys(t).length>0?{backends:t}:{}}function Fe(e){return`Warning: ${e.platform?`${e.platform} `:``}snapshots are slow in this run: p95 ${e.p95Ms}ms over ${e.count} captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon.`}function Ie(e){if(!p(e))return;let t=Le(e);if(t)return{...t,...ze(e)}}function Le(e){let t={count:e.count,p50Ms:e.p50Ms,p95Ms:e.p95Ms,maxMs:e.maxMs,slowThresholdMs:e.slowThresholdMs};if(!Object.values(t).some(e=>typeof e!=`number`))return t}function Re(e){let t=Object.entries(e).filter(e=>typeof e[1]==`number`);return t.length>0?Object.fromEntries(t):void 0}function ze(e){let t=typeof e.platform==`string`?e.platform:void 0,n=p(e.backends)?Re(e.backends):void 0;return{...t?{platform:t}:{},...n?{backends:n}:{}}}function Be(e){if(!e||e.count<=0)return[];let t=e.platform;return e.count===1?[{durationMs:e.maxMs,platform:t}]:e.count===2?[{durationMs:e.p50Ms,platform:t},{durationMs:e.maxMs,platform:t}]:[...Array.from({length:e.count-3},()=>({durationMs:e.p50Ms,platform:t})),{durationMs:e.p50Ms,platform:t},{durationMs:e.p95Ms,platform:t},{durationMs:e.maxMs,platform:t}]}function b(e){return e.startsWith(`@`)?n(e)?.base??e:e}const x=/^-?\d+(\.\d+)?$/,Ve=/^[^\s"\\]+$/,He=new Map([[`--count`,`count`],[`--interval-ms`,`intervalMs`],[`--hold-ms`,`holdMs`],[`--jitter-px`,`jitterPx`]]),Ue=new Map([[`--count`,`count`],[`--pause-ms`,`pauseMs`]]),We=new Map([[`--pointer-count`,`pointerCount`]]),Ge=new Map([[`--delay-ms`,`delayMs`]]);function S(e){return e===`click`||e===`press`}function Ke(e){return S(e)||e===`longpress`}function qe(e){return e===`type`||e===`fill`}function C(e){return Ye(e,Xe)}function Je(e){return JSON.stringify(e)}function w(e){return Ye(e,Ze)}function Ye(e,t){return t(e)?e:Je(e)}function Xe(e){return Ze(e)&&e.startsWith(`@`)||x.test(e)}function Ze(e){return Ve.test(e)}const Qe=new Set([`fill`,`type`]);function $e(e){if(!Qe.has(e.command)){let t=(e.positionals??[]).map(e=>C(e));return[e.command,...t].join(` `)}let t=et(e).map(e=>C(e)).join(` `);return[e.command,t,`<text>`].filter(e=>e.length>0).join(` `)}function et(e){if(e.command===`type`)return[];let t=e.positionals??[],n=t[0];return n===void 0?[]:n.startsWith(`@`)?[n]:t.length>=3&&x.test(n)&&x.test(t[1]??``)?[n,t[1]]:[n]}function T(e,t){let n=t.flags??{};if(S(t.command)){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.intervalMs==`number`&&e.push(`--interval-ms`,String(n.intervalMs)),typeof n.holdMs==`number`&&e.push(`--hold-ms`,String(n.holdMs)),typeof n.jitterPx==`number`&&e.push(`--jitter-px`,String(n.jitterPx)),n.doubleTap===!0&&e.push(`--double-tap`);let t=n.clickButton;t&&t!==`primary`&&e.push(`--button`,t);return}if(t.command===`swipe`){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.pauseMs==`number`&&e.push(`--pause-ms`,String(n.pauseMs)),(n.pattern===`one-way`||n.pattern===`ping-pong`)&&e.push(`--pattern`,n.pattern);return}if(t.command===`gesture`){typeof n.pointerCount==`number`&&e.push(`--pointer-count`,String(n.pointerCount));return}qe(t.command)&&typeof n.delayMs==`number`&&e.push(`--delay-ms`,String(n.delayMs))}function tt(e,t){t&&((t.platform===`ios`||t.platform===`android`)&&e.push(`--platform`,t.platform),typeof t.metroHost==`string`&&t.metroHost.length>0&&e.push(`--metro-host`,w(t.metroHost)),typeof t.metroPort==`number`&&e.push(`--metro-port`,String(t.metroPort)),typeof t.bundleUrl==`string`&&t.bundleUrl.length>0&&e.push(`--bundle-url`,w(t.bundleUrl)),typeof t.launchUrl==`string`&&t.launchUrl.length>0&&e.push(`--launch-url`,w(t.launchUrl)))}function nt(e,t){let[n,...r]=t.positionals??[];n&&e.push(w(n));for(let t of r)e.push(C(t));typeof t.flags?.fps==`number`&&e.push(`--fps`,String(t.flags.fps)),typeof t.flags?.screenshotMaxSize==`number`&&e.push(`--max-size`,String(t.flags.screenshotMaxSize)),(typeof t.flags?.quality==`number`||typeof t.flags?.quality==`string`)&&e.push(`--quality`,String(t.flags.quality)),t.flags?.hideTouches&&e.push(`--hide-touches`)}function rt(e,t){t.flags?.snapshotInteractiveOnly&&e.push(`-i`),typeof t.flags?.snapshotDepth==`number`&&e.push(`-d`,String(t.flags.snapshotDepth)),t.flags?.snapshotScope&&e.push(`-s`,C(t.flags.snapshotScope)),t.flags?.snapshotRaw&&e.push(`--raw`)}function it(e,t){for(let n of t.positionals??[])e.push(C(n));ee(e,t.flags)}function at(e,t,n={}){let r=t.positionals??[],i=n.includeAllPositionals?r:r.slice(0,1);for(let t of i)e.push(w(t));tt(e,t.flags)}function ot(e,t){for(let n of t.positionals??[])e.push(C(t.command===`wait`?b(n):n));T(e,t)}function E(e,t){let n=[],r={},i=S(e)?He:e===`swipe`?Ue:e===`gesture`?We:qe(e)?Ge:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(S(e)&&o===`--double-tap`){r.doubleTap=!0;continue}let s=t[a+1];if(S(e)&&o===`--button`&&s!==void 0){let e=s;(e===`primary`||e===`secondary`||e===`middle`)&&(r.clickButton=e),a+=1;continue}let c=i?.get(o);if(c&&s!==void 0){let e=ct(s);if(e!==null){r[c]=e,a+=1;continue}}if(e===`swipe`&&o===`--pattern`&&s!==void 0){let e=s;(e===`one-way`||e===`ping-pong`)&&(r.pattern=e),a+=1;continue}n.push(o)}return{positionals:n,flags:r}}function st(e){let t=[],n={};for(let r=0;r<e.length;r+=1){let i=e[r],a=e[r+1];if(i===`--platform`&&a!==void 0){let e=a;(e===`ios`||e===`android`)&&(n.platform=e),r+=1;continue}if(i===`--metro-host`&&a!==void 0){n.metroHost=a,r+=1;continue}if(i===`--metro-port`&&a!==void 0){let e=ct(a);e!==null&&(n.metroPort=e),r+=1;continue}if(i===`--bundle-url`&&a!==void 0){n.bundleUrl=a,r+=1;continue}if(i===`--launch-url`&&a!==void 0){n.launchUrl=a,r+=1;continue}t.push(i)}return{positionals:t,flags:n}}function ct(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function lt(e){let t;for(let n of e){if(n.command===`runtime`&&typeof n.flags.platform==`string`){t=n.flags.platform;continue}if(n.command===`open`)return n.runtime?.platform??t}return t}function ut(e,t){for(let n of t.positionals??[])e.push(C(n));t.flags?.relaunch&&e.push(`--relaunch`),tt(e,t.runtime)}function dt(e){let t=[],n={};for(let r of e){if(r===`--relaunch`){n.relaunch=!0;continue}t.push(r)}let r=st(t);return{positionals:r.positionals,flags:n,runtime:ft(r.flags)?r.flags:void 0}}function ft(e){return!!(e.platform||e.metroHost||e.metroPort!==void 0||e.bundleUrl||e.launchUrl)}const pt=/^[A-Z_][A-Z0-9_]*$/,mt=new Set(ue.filter(e=>e!==`web`)),ht=new Set([`mobile`,`tv`,`desktop`]);function gt(e){let n=[],r=[],i=e.split(/\r?\n/),a=!1,o,s=(e,n,r)=>{throw new t(`INVALID_ARGS`,`target-v1 annotation on line ${e.line} must be immediately followed by its action line (line ${n+1} ${r}).`)};for(let[e,c]of i.entries()){let i=c.trim();if(i.length===0){o&&s(o,e,`is blank`);continue}if(i.startsWith(`#`)){let t=me(i);if(t.kind===`v1`){o&&s(o,e,`is another target-v1 annotation`),o={evidence:t.evidence,line:e+1};continue}o&&s(o,e,`is a comment`);continue}if(vt(i)){if(o&&s(o,e,`is an env directive`),a)throw new t(`INVALID_ARGS`,`env directives must precede all actions (line ${e+1}).`);continue}let l=St(c);if(!l){o&&s(o,e,`did not parse as an action`);continue}let u=te(l.command,l.positionals??[],`line ${e+1}`);if(u)throw new t(`INVALID_ARGS`,u);o&&=(l.targetEvidence=o.evidence,void 0),n.push(l),r.push(e+1),a=!0}if(o)throw new t(`INVALID_ARGS`,`target-v1 annotation on line ${o.line} must be immediately followed by its action line (end of script reached).`);return{actions:n,actionLines:r}}function _t(e){let t=e.split(/\r?\n/),n={};for(let[e,r]of t.entries()){let t=r.trim();if(t.length===0||t.startsWith(`#`))continue;if(vt(t)){xt(n,t,e+1);continue}if(!t.startsWith(`context `))break;let i=t.match(/(?:^|\s)platform=([^\s]+)/);if(i){let e=i[1];e&&mt.has(e)&&D(n,`platform`,e)}let a=t.match(/(?:^|\s)target=([^\s]+)/);if(a){let e=a[1];e&&ht.has(e)&&D(n,`target`,e)}let o=t.match(/(?:^|\s)timeout=(\d+)/);if(o){let e=Number(o[1]);Number.isFinite(e)&&e>=1&&D(n,`timeoutMs`,Math.floor(e))}let s=t.match(/(?:^|\s)retries=(\d+)/);if(s){let e=Number(s[1]);Number.isFinite(e)&&e>=0&&D(n,`retries`,Math.floor(e))}}return n}function vt(e){return e===`env`||e.startsWith(`env `)||e.startsWith(`env `)}function yt(e,n){let r=e.slice(3).replace(/^[\s]+/,``),i=r.indexOf(`=`);if(i<=0)throw new t(`INVALID_ARGS`,`Invalid env directive on line ${n}: expected "env KEY=VALUE".`);let a=r.slice(0,i);if(!pt.test(a))throw new t(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(a.startsWith(`AD_`))throw new t(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: the AD_* namespace is reserved for built-in variables. Rename ${a} to avoid the AD_ prefix.`);return{key:a,value:bt(r.slice(i+1),n)}}function bt(e,n){if(e.length===0)return``;if(e.startsWith(`"`))try{let t=JSON.parse(e);if(typeof t!=`string`)throw Error(`not a string literal`);return t}catch{throw new t(`INVALID_ARGS`,`Invalid quoted env value on line ${n}.`)}return e}function xt(e,n,r){let{key:i,value:a}=yt(n,r),o=e.env??{};if(Object.prototype.hasOwnProperty.call(o,i))throw new t(`INVALID_ARGS`,`Duplicate env directive "${i}" on line ${r}.`);o[i]=a,e.env=o}function D(e,n,r){let i=e[n];if(i!==void 0)throw new t(`INVALID_ARGS`,i===r?`Duplicate replay test metadata "${n}" in context header.`:`Conflicting replay test metadata "${n}" in context header: ${String(i)} vs ${String(r)}.`);e[n]=r}function St(e){let t=e.trim();if(t.length===0||t.startsWith(`#`))return null;let[n,...r]=wt(t);if(n===void 0||n===`context`)return null;let i={ts:Date.now(),command:n,positionals:[],flags:{}};if(n===`snapshot`){i.positionals=[];for(let e=0;e<r.length;e+=1){let t=r[e];if(t===`-i`){i.flags.snapshotInteractiveOnly=!0;continue}if(t!==`-c`){if(t===`--raw`){i.flags.snapshotRaw=!0;continue}if(t===`--force-full`){i.flags.snapshotForceFull=!0;continue}if((t===`-d`||t===`--depth`)&&e+1<r.length){let t=Number(r[e+1]);Number.isFinite(t)&&t>=0&&(i.flags.snapshotDepth=Math.floor(t)),e+=1;continue}if((t===`-s`||t===`--scope`)&&e+1<r.length){i.flags.snapshotScope=r[e+1],e+=1;continue}if(t===`--backend`&&e+1<r.length){e+=1;continue}}}return i}if(n===`open`){let e=dt(r);return i.positionals=e.positionals,Object.assign(i.flags,e.flags),i.runtime=e.runtime,i}if(n===`runtime`){let e=st(r);return i.positionals=e.positionals,Object.assign(i.flags,e.flags),i}if(S(n)){let e=E(n,r);Object.assign(i.flags,e.flags);let t=e.positionals[0];if(t===void 0)return i;if(t.startsWith(`@`))return i.positionals=[b(t)],e.positionals[1]&&(i.result={refLabel:e.positionals[1]}),i;let a=e.positionals[0],o=e.positionals[1];return O(a)&&O(o)&&e.positionals.length>=2?(i.positionals=[a,o],i):(i.positionals=[e.positionals.join(` `)],i)}if(n===`fill`){let e=E(n,r);if(Object.assign(i.flags,e.flags),!Ct(e.positionals))return i.positionals=e.positionals,i;let[t,a,...o]=e.positionals;if(O(t)&&O(a))return i.positionals=[t,a,o.join(` `)],i;let[s,c,...l]=e.positionals;if(s.startsWith(`@`)){let e=b(s);return l.length>0?(i.positionals=[e,l.join(` `)],i.result={refLabel:c},i):(i.positionals=[e,c],i)}return i.positionals=[s,[c,...l].join(` `)],i}if(n===`get`){let e=r[0],t=r[1];return e===void 0||t===void 0?(i.positionals=r,i):t.startsWith(`@`)?(i.positionals=[e,b(t)],r[2]&&(i.result={refLabel:r[2]}),i):(i.positionals=[e,r.slice(1).join(` `)],i)}if(n===`swipe`||n===`type`||n===`gesture`){let e=E(n,r);return Object.assign(i.flags,e.flags),i.positionals=e.positionals,i}if(n===`record`){let e=[];for(let t=0;t<r.length;t+=1){let n=r[t];if(n===`--hide-touches`){i.flags.hideTouches=!0;continue}if(n===`--fps`&&t+1<r.length){let e=Number(r[t+1]);Number.isFinite(e)&&(i.flags.fps=Math.floor(e)),t+=1;continue}if(n===`--quality`&&t+1<r.length){let e=r[t+1],n=c(e);n!==void 0&&(i.flags.quality=n),t+=1;continue}if(n===`--max-size`&&t+1<r.length){let e=Number(r[t+1]);Number.isFinite(e)&&(i.flags.screenshotMaxSize=Math.floor(e)),t+=1;continue}e.push(n)}return i.positionals=e,i}if(n===`screenshot`){let e=[];for(let t=0;t<r.length;t+=1){let n=r[t],a=o({args:r,index:t,flags:i.flags});if(a.handled){t=a.nextIndex;continue}e.push(n)}return i.positionals=e,i}return i.positionals=n===`wait`||n===`longpress`?r.map(e=>b(e)):r,i}function Ct(e){return e.length>=2}function O(e){return e?!Number.isNaN(Number(e)):!1}function wt(e){let t=[],n=0;for(;n<e.length&&(n=Tt(e,n),!(n>=e.length));){let r=e[n]===`"`?Et(e,n):Dt(e,n);t.push(r.value),n=r.nextCursor}return t}function Tt(e,t){let n=t;for(;n<e.length&&/\s/.test(e.charAt(n));)n+=1;return n}function Et(e,n){let r=n+1,i=!1,a=r;for(;a<e.length;a+=1){let t=e.charAt(a);if(t===`"`&&!i)break;if(i){i=!1;continue}i=t===`\\`}if(a>=e.length)throw new t(`INVALID_ARGS`,`Invalid replay script line: ${e}`);let o=e.slice(n,a+1),s;try{s=JSON.parse(o)}catch{throw new t(`INVALID_ARGS`,`Invalid quoted value ${o} in replay script line: ${e}`,{hint:`Quoted replay values are JSON strings: escape backslashes, quotes, tabs, and newlines (\\\\, \\", \\t, \\n).`})}return{value:s,nextCursor:a+1}}function Dt(e,t){let n=t;for(;n<e.length&&!/\s/.test(e.charAt(n));)n+=1;return{value:e.slice(t,n),nextCursor:n}}function Ot(e,t={}){let n=[e.command];return e.command===`snapshot`?rt(n,e):e.command===`open`?ut(n,e):e.command===`runtime`?at(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals}):e.command===`record`?nt(n,e):e.command===`screenshot`?it(n,e):ot(n,e),n.join(` `)}function kt(e){return e.targetEvidence?[pe(e.targetEvidence)]:[]}const At=`/agent-device`,jt=`x-agent-device-tenant`;function Mt(e){return Nt(e,At)}function Nt(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(t.replace(/^\/+/,``),n).toString()}function Pt(e){let t=e?.trim();return t?{authorization:`Bearer ${t}`,"x-agent-device-token":t}:{}}function Ft(e){let t=e?.trim();return t?{[jt]:t}:{}}const It=`.webm`;function Lt(e){return e===`web`?It:`.mp4`}function Rt(e,t){return _.extname(e)?e:`${e}${t}`}function zt(e){return`./recording-${Date.now()}${Lt(e)}`}function Bt(e){return new Promise((t,n)=>{let r=``;e.setEncoding(`utf8`),e.on(`data`,e=>{r+=e}),e.on(`end`,()=>t(r)),e.on(`error`,n)})}async function Vt(e,n,r){let i=[],a=0;for await(let o of e){let e=Buffer.isBuffer(o)?o:Buffer.from(o);if(a+=e.length,a>n)throw new t(`INVALID_ARGS`,r);i.push(e)}return Buffer.concat(i)}const k={kind:`none`};function A(e,t){if(t.path===void 0){let n=e??{kind:`default`,force:!1};return t.force?{...n,force:!0}:n}let n=e?.force===!0&&(e.kind==="default"||e.path===t.path);return{kind:`explicit`,path:t.path,force:t.force||n}}function Ht(e){return e.kind===`repair`?{...e,status:`armed`}:e}function Ut(e){return e.kind===`none`?void 0:e.target}function Wt(e){return e.kind===`repair`&&(e.status===`complete`||e.status===`close-succeeded`)}function Gt(e){return e.kind===`repair`?e.status===`committed`:e.kind===`authoring`&&e.status===`published`}function Kt(e){return{kind:`authoring`,status:`armed`,target:A(void 0,e)}}function qt(e){return e.kind!==`authoring`||e.status!==`armed`?e:{...e,status:`aborted`}}function Jt(e,t){return e.kind===`authoring`?{kind:`authoring`,status:`published`,target:{kind:`explicit`,path:t,force:e.target.force}}:e}function Yt(e,t){let n=e.kind===`repair`?e:void 0,r=n?.sourcePath??t.sourcePath;return{kind:`repair`,status:n?.status??`armed`,target:A(n?.target,t.requested),boundary:n?.boundary??t.boundary,...r===void 0?{}:{sourcePath:r},...n?.closeReceipt===void 0?{}:{closeReceipt:n.closeReceipt}}}function Xt(e){return e.kind!==`repair`||e.status!==`armed`?e:{...e,status:`complete`}}function Zt(e,t){return e.kind===`repair`?{...e,status:e.status===`complete`?`close-succeeded`:e.status,closeReceipt:t}:e}function Qt(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`committed`}}function $t(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`aborted`}}function en(e){return e.kind===`repair`?e.boundary:void 0}function tn(e){return e.kind===`repair`?e.sourcePath:void 0}function nn(e){return e.kind===`repair`&&e.status!==`committed`}function rn(e){let t=Ut(e);return t?.kind===`explicit`?t.path:void 0}function an(e){return Ut(e)?.force===!0}function j(e){return e.replace(/[^a-zA-Z0-9._-]/g,`_`)}function M(e,t){return ve(e,{cwd:t})}function N(e){return e?.scriptPublication??k}function on(e){let t=N(e);return t.kind===`authoring`&&t.status===`armed`}function sn(e,t){e.recordSession=!0,e.scriptPublication=Kt({path:t.path===void 0?void 0:M(t.path),force:t.force===!0})}function cn(e){e.recordSession=!1,e.scriptPublication=qt(N(e))}function ln(e,t){if(!t.saveScript)return;e.recordSession=!0;let n={path:typeof t.saveScript==`string`?M(t.saveScript):void 0,force:t.force===!0},r=N(e);if(r.kind===`repair`){e.scriptPublication=Yt(r,{requested:n,boundary:r.boundary,sourcePath:r.sourcePath});return}if(r.kind===`authoring`){e.scriptPublication={...r,target:A(r.target,n)};return}e.scriptPublication=Kt(n)}function un(e,t){let n=N(e);n.kind===`authoring`&&(e.scriptPublication={...n,target:A(n.target,{path:t.explicitPath===void 0?void 0:M(t.explicitPath),force:t.liveForce===!0})})}function dn(e,t){e.scriptPublication=Jt(N(e),t),e.recordSession=!1}function fn(e,t){let n=N(e);n.kind===`authoring`&&(e.scriptPublication=Jt(n,t))}function pn(e,t){return t===!0||an(N(e))}function mn(e){return Gt(N(e))}function P(e){return e?.scriptPublication??k}function hn(e,t){e.recordSession=!0;let n=P(e);e.scriptPublication=Yt(n,{requested:{path:typeof t.saveScript==`string`?M(t.saveScript):n.kind===`repair`?void 0:t.healedSiblingPath,force:t.force===!0},boundary:t.firstArm?e.actions.length:0,sourcePath:t.sourcePath})}function gn(e){e.scriptPublication=Ht(P(e))}function _n(e){e.scriptPublication=Xt(P(e))}function vn(e,t){e.scriptPublication=Zt(P(e),t)}function yn(e){e.scriptPublication=$t(P(e))}function bn(e,t){let n=P(e);return n.kind===`repair`&&n.closeReceipt===t}function xn(e){return P(e).kind===`repair`}function Sn(e){return nn(P(e))}function Cn(e){return en(P(e))}function wn(e){return tn(P(e))}function Tn(e){let t=e.result?.text;if(typeof t==`string`)return t;let n=e.positionals??[];return n.length===0?``:n[0]?.startsWith(`@`)?n.length>=3?n.slice(2).join(` `):n.slice(1).join(` `):n.length>=3&&!Number.isNaN(Number(n[0]))&&!Number.isNaN(Number(n[1]))?n.slice(2).join(` `):n.slice(1).join(` `)}const En=/^\$\{([A-Z_][A-Z0-9_]*)\}$/;function Dn(e){if(e!==e.trim()||!pt.test(e))throw new t(`INVALID_ARGS`,`Invalid --record-as variable "${e}": use uppercase letters, digits, and underscores (for example PASSWORD).`);if(e.startsWith(`AD_`))throw new t(`INVALID_ARGS`,`Invalid --record-as variable "${e}": the AD_* namespace is reserved for built-in replay variables.`);return e}function On(e){return`\${${e}}`}function kn(e){let t=En.exec(e);if(!(!t?.[1]||t[1].startsWith(`AD_`)))return t[1]}const An=new Set([`text`,`label`,`value`]),jn=new Set(`action.backend.cost.delayMs.evidence.gesture.hint.kind.maestroFallbackReason.maestroNonHittableCoordinateFallbackAllowed.maestroNonHittableCoordinateFallbackUsed.message.platform.ref.referenceHeight.referenceWidth.refLabel.resolution.selector.selectorChain.settle.targetHittable.targetKind.text.warning.x.y`.split(`.`)),Mn=new Set([`action`,`backend`,`gesture`,`kind`,`platform`,`ref`,`selector`,`targetKind`]),Nn=new Set([`cost`,`evidence`,`resolution`,`settle`]),Pn=new Map([[`cost`,new Set([`nodeCount`,`runnerRoundTrips`,`wallClockMs`])],[`evidence`,new Set([`changedFromBefore`,`digest`,`foregroundApp`,`interactiveNodeCount`,`nodeCount`])],[`resolution`,new Set([`alternatives`,`kind`,`matchCount`,`phase`,`source`,`tiebreak`,`winnerDiagnostic`])],[`resolution.alternatives`,new Set([`diagnosticRef`,`label`,`role`])],[`resolution.winnerDiagnostic`,new Set([`diagnosticRef`,`label`,`role`])],[`settle`,new Set([`captures`,`diff`,`hint`,`quietMs`,`refs`,`refsGeneration`,`settled`,`tail`,`tailTruncated`,`timeoutMs`,`waitedMs`])],[`settle.diff`,new Set([`lines`,`summary`,`truncated`])],[`settle.diff.lines`,new Set([`kind`,`ref`,`text`])],[`settle.diff.summary`,new Set([`additions`,`removals`,`unchanged`])],[`settle.refs`,new Set([`ref`])],[`settle.tail`,new Set([`label`,`ref`,`role`])]]),Fn=new Set([`evidence.digest`,`evidence.foregroundApp`,`resolution.alternatives.diagnosticRef`,`resolution.alternatives.role`,`resolution.kind`,`resolution.phase`,`resolution.source`,`resolution.tiebreak`,`resolution.winnerDiagnostic.diagnosticRef`,`resolution.winnerDiagnostic.role`,`settle.diff.lines.kind`,`settle.diff.lines.ref`,`settle.refs.ref`,`settle.tail.ref`,`settle.tail.role`]);function In(e,t,n){if(!e)return e;let r=Un(e.selectorChain);return{...zn(e,t,n),...typeof e.text==`string`?{text:n}:{},...r?{selectorChain:r.filter(e=>!Rn(e,t))}:{}}}function Ln(e,t,n){return e&&{...e,...e.label===t?{label:n}:{},ancestry:e.ancestry.map(e=>({...e,...e.label===t?{label:n}:{}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===t?{label:n}:{}}}:{}}}function Rn(e,t){return f(e)?.selectors.some(e=>e.terms.some(e=>An.has(e.key)&&typeof e.value==`string`&&I(e.value,t,``)!==e.value))??!1}function zn(e,t,n){return Object.fromEntries(Object.entries(e).map(([e,r])=>[jn.has(e)?e:I(e,t,n),Bn(r,e,t,n)]))}function Bn(e,t,n,r){return typeof e==`string`&&Mn.has(t)?e:t===`selectorChain`&&Hn(e)?Vn(e,n):F(e,n,r,Nn.has(t)?t:void 0)}function F(e,t,n,r){if(typeof e==`string`)return r&&Fn.has(r)?e:I(e,t,n);if(Array.isArray(e))return e.map(e=>F(e,t,n,r));if(!e||typeof e!=`object`)return e;let i=r?Pn.get(r):void 0;return Object.fromEntries(Object.entries(e).map(([e,a])=>{let o=i?.has(e)===!0;return[o?e:I(e,t,n),F(a,t,n,o?`${r}.${e}`:void 0)]}))}function Vn(e,t){return e.filter(e=>!Rn(e,t))}function I(e,t,n){if(!t)return e===t?n:e;let r=n?e.split(n):[e];return r.every(e=>!e.includes(t))?e:t.trim()?r.map(e=>e.replaceAll(t,n)).join(n):n}function Hn(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function Un(e){return Hn(e)?e:void 0}function Wn(e,t){if(t.flags?.noRecord||Yn(e,t))return;t.flags&&ln(e,t.flags);let n=Gn(t),r={ts:Date.now(),command:n.command,positionals:n.positionals,runtime:n.runtime,flags:Zn(n.flags),result:n.result,...n.targetEvidence?{targetEvidence:n.targetEvidence}:{}};return e.actions.push(r),g({level:`debug`,phase:`record_action`,data:{command:t.command,session:e.name}}),r}function Gn(e){if(e.command!==`fill`||typeof e.flags.recordAs!=`string`)return e;let t=On(Dn(e.flags.recordAs)),n=Tn({ts:0,command:e.command,positionals:e.positionals,flags:e.flags});return{...e,positionals:Kn(e.positionals,t),result:In(e.result,n,t),targetEvidence:Ln(e.targetEvidence,n,t)}}function Kn(e,t){let n=e[0];return n?.startsWith(`@`)?e.length>=3?[n,e[1],t]:[n,t]:e.length>=3&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1]))?[e[0],e[1],t]:n===void 0?[t]:[n,t]}const qn=new Set([`snapshot`,`get`,`is`,`find`]);function Jn(e){return e.internal?.replayPlanStep===!0?!1:qn.has(e.command)}function Yn(e,t){return!t.interactiveObservation||Cn(e)===void 0?!1:t.flags?.record!==!0}const Xn=[`platform`,`device`,`udid`,`serial`,`out`,`verbose`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`,`snapshotInteractiveOnly`,`snapshotDepth`,`snapshotScope`,`snapshotRaw`,...u,`relaunch`,`saveScript`,`force`,`noRecord`,`record`,`fps`,`quality`,`hideTouches`,`count`,`pointerCount`,`intervalMs`,`delayMs`,`holdMs`,`jitterPx`,`doubleTap`,`clickButton`,`pauseMs`,`pattern`];function Zn(e){if(!e)return{};let t={};for(let n of Xn)e[n]!==void 0&&(t[n]=e[n]);return t}function Qn(e){let n=e.flatMap((e,t)=>e.command===`open`?[t]:[]);if(n.length!==1||n[0]!==0)throw new t(`COMMAND_FAILED`,`Cannot publish this session: an open-to-destination script requires exactly one initial recorded open.`,{retriable:!1,hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`});if(e.some(e=>e.command===`close`))throw new t(`COMMAND_FAILED`,`Cannot publish an active-session script containing close.`,{retriable:!1,hint:`Close this session and record the journey again from a fresh open --save-script session.`});let r=-1;for(let[t,n]of e.entries())se({command:n.command,positionals:n.positionals,flags:n.flags})===`mutates-app`&&(r=t);if(!e.slice(r+1).some(tr))throw new t(`COMMAND_FAILED`,`Cannot publish this session without a portable destination guard after the final mutating action.`,{retriable:!0,hint:`Record a selector-targeted wait on a labeled or id-bearing landmark, for example wait 'role="heading" label="Screen X"', so its recorded identity is captured, then retry session save-script.`})}function $n(e){for(let n of e){let e=nr(n),r=e??(n.command===`wait`?n.positionals[0]:void 0);if(r?.startsWith(`@`))throw new t(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${r}": the session-local ref was not converted to a portable selector.`,{retriable:!1,hint:`Close this session and record the journey again using selectors or resolvable refs.`});if(n.command===`find`&&se(n)===`mutates-app`)throw new t(`COMMAND_FAILED`,`Cannot publish a recorded mutating find step because its target identity is not replay-verifiable.`,{retriable:!1,hint:`Close this session and record the journey again with an explicit selector-targeted click, press, fill, or focus action.`});let i=e;if(!(!i||!f(i)||n.targetEvidence))throw new t(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${i}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again from open --save-script so target-v1 evidence is captured before each interaction.`})}}function er(e,n){if(e instanceof t){if(e.details?.reason===`script_target_exists`)return new t(e.code,`A file already exists at ${String(e.details.path)}.`,{...e.details,retriable:!0,hint:`Retry session save-script with another path, or pass --force to replace the existing file. The session remains armed.`});let n=e.details?.retriable===!0;return new t(e.code,e.message,{...e.details,retriable:n,hint:e.details?.hint??(n?`Fix the recorded journey or target, then retry session save-script. The session remains armed.`:`Close this session and start a fresh one with open <app> --save-script[=<path>].`)})}let r=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`Failed to publish the active session script${n?` to ${n}`:``}: ${r}`,{retriable:!0,hint:`Check the target path and permissions, then retry session save-script. The session remains armed.`})}function tr(e){if(e.command!==`wait`)return!1;let t=oe(e.positionals);return t?.kind!==`selector`||f(t.selectorExpression)===null?!1:e.targetEvidence?.verification===`verified`}function nr(e){if(e.command===`get`)return e.positionals[1];if(Ke(e.command)||e.command===`fill`){let[t,n]=e.positionals;return t!==void 0&&n!==void 0&&rr(t)&&rr(n)?void 0:t}}function rr(e){return e.trim().length>0&&Number.isFinite(Number(e))}function ir(e){let t=e.scriptPublication??k;return t.kind===`repair`?t.status===`committed`?!0:!Wt(t):!1}var ar=class{sessionsDir;constructor(e){this.sessionsDir=e}write(e,t){let n=xn(e),r=t?.publication===`active`,i;try{if(!e.recordSession||ir(e))return{written:!1};let a=or(e,{appendCompleteSentinel:n,activePublication:r});i=this.resolveScriptPath(e);let o=_.dirname(i);return v.existsSync(o)||v.mkdirSync(o,{recursive:!0}),lr({scriptPath:i,script:a.script,force:t?.force}),n&&(e.scriptPublication=Qt(e.scriptPublication??k)),{written:!0,path:i,actionCount:a.actionCount}}catch(t){return sr({session:e,error:t,scriptPath:i,repairArmed:n,activePublication:r})}}resolveScriptPath(e){let t=rn(e.scriptPublication??k);if(t)return M(t);let n=j(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,`-`);return _.join(this.sessionsDir,`${n}-${r}.ad`)}};function or(e,t){let n=ur(e,{strictPortableRefs:t.activePublication});return t.activePublication&&Qn(n),{script:yr(e,n,t.appendCompleteSentinel),actionCount:n.length}}function sr(e){let{session:n,error:r,scriptPath:i,repairArmed:a,activePublication:o}=e;if(g({level:`warn`,phase:`session_script_write_failed`,data:{session:n.name,path:i,error:r instanceof Error?r.message:String(r)}}),a)return{written:!1,error:cr(r,i)};if(o)return{written:!1,error:er(r,i)};if(r instanceof t)throw r;return{written:!1}}function cr(e,n){if(e instanceof t)return e;let r=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`Failed to write the healed script${n?` to ${n}`:``}: ${r}`,{hint:`The repair transaction completed but the healed .ad could not be published; check the target path and permissions, then retry close --save-script.`})}function lr(e){let{scriptPath:n,script:r,force:i}=e,a=_.dirname(n),o=_.join(a,`.${_.basename(n)}.${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`);v.writeFileSync(o,r);try{if(i){v.renameSync(o,n);return}v.linkSync(o,n)}catch(e){throw e.code===`EEXIST`?new t(`COMMAND_FAILED`,`A file already exists at ${n}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`,{reason:`script_target_exists`,path:n}):e}finally{v.rmSync(o,{force:!0})}}function ur(e,t={}){let n=Cn(e),r=n!==void 0,i=e.actions.slice(n??0),a=[];for(let n of i){if(n.command===`snapshot`)continue;let i=fr(n);if(i){a.push(i);continue}(r||t.strictPortableRefs)&&dr(n);let o=vr(e,n);o&&a.push(o),a.push(n)}return t.strictPortableRefs&&$n(a),a}function dr(e){if(!L(e.command))return;let n=e.command===`get`?e.positionals?.[1]:e.positionals?.[0];if(n?.startsWith(`@`))throw new t(`COMMAND_FAILED`,`Cannot write recorded step "${e.command} ${n}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function fr(e){let t=pr(e);if(!(!t||!L(e.command)))return S(e.command)?{...e,positionals:[t]}:e.command===`longpress`?hr(e,t):e.command===`fill`?mr(e,t):gr(e,t)}function pr(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];return t.length>0?t.join(` || `):void 0}function L(e){return Ke(e)||e===`fill`||e===`get`}function mr(e,t){let n=Tn(e);return n.length>0?{...e,positionals:[t,n]}:void 0}function hr(e,t){let n=typeof e.result?.durationMs==`number`?String(e.result.durationMs):_r(e.positionals??[]);return{...e,positionals:n?[t,n]:[t]}}function gr(e,t){let n=e.positionals?.[0];return n===`text`||n===`attrs`?{...e,positionals:[n,t]}:void 0}function _r(e){let t=e.at(-1);if(!(e.length<=1||t===void 0||t.trim()===``))return Number.isFinite(Number(t))?t:void 0}function vr(e,t){if(!L(t.command))return;let n=t.result?.refLabel;if(typeof n!=`string`||n.trim().length===0)return;let r=n.trim();return{ts:t.ts,command:`snapshot`,positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotScope:r},result:{scope:r}}}function yr(e,t,n){let r=[],i=e.device.kind?` kind=${e.device.kind}`:``;r.push(`context platform=${le(e.device)} device=${Je(e.device.name)}${i} theme=unknown`);for(let e of t)e.flags?.noRecord||(r.push(...kt(e)),r.push(br(e)));return n&&r.push(`# agent-device:heal-complete`),`${r.join(`
|
|
2
|
+
`)}\n`}function br(e){return xr([e.command],e)||Ot(e)}function xr(e,t){if(S(t.command))return Sr(e,t);if(t.command===`fill`)return Cr(e,t);if(t.command===`get`)return wr(e,t)}function Sr(e,t){let n=t.positionals?.[0];if(n){if(n.startsWith(`@`))return e.push(C(b(n))),R(e,t),T(e,t),e.join(` `);if(t.positionals.length===1)return e.push(C(n)),T(e,t),e.join(` `)}}function Cr(e,t){let n=t.positionals?.[0];if(!n?.startsWith(`@`))return;e.push(C(b(n))),R(e,t);let r=t.positionals.slice(1).join(` `);return t.positionals.length>1&&e.push(C(r)),T(e,t),e.join(` `)}function wr(e,t){let n=t.positionals?.[0],r=t.positionals?.[1];if(!(!n||!r))return e.push(C(n)),e.push(C(b(r))),r.startsWith(`@`)&&R(e,t),e.join(` `)}function R(e,t){let n=t.result?.refLabel;typeof n==`string`&&n.trim().length>0&&e.push(C(n))}const Tr=[`status`,`get`,`dismiss`,`enter`,`return`];function z(e){return Tr.includes(e)}const Er=[`id`,`deviceId`,`device_id`,`serial`,`udid`,`device_udid`,`identifier`],Dr={ios:`iOS`,ipados:`iPadOS`,tvos:`tvOS`,watchos:`watchOS`,visionos:`visionOS`,macos:`macOS`,apple:`Apple`,android:`Android`,linux:`Linux`,web:`Web`};function Or(e,t){let n=t??{};switch(e.command){case s.devices:return kr(n.devices);case s.apps:return Ar(n.apps,e.flags?.appsFilter);case s.boot:return jr(`Booted`,n,!0);case s.shutdown:return jr(`Shut down`,n,!1);case s.install:return Mr(`Installed`,n);case s.reinstall:return Mr(`Reinstalled`,n);case s.screenshot:return Nr(e,n);default:return{}}}function kr(e){if(!Array.isArray(e))return{};let t=e.flatMap(e=>{let t=Fr(e);return t?[t]:[]}),n=t.slice(0,5),r=Math.max(0,t.length-n.length),i=t.slice(0,3);return{summary:Wr(`Found ${t.length} ${Gr(`device`,t.length)}`,i.map(e=>Hr(e,!0)),Math.max(0,t.length-i.length)),details:{deviceCount:t.length,devices:n,...r>0?{omittedDeviceCount:r}:{}}}}function Ar(e,t){if(!Array.isArray(e))return{};let n=e.flatMap(e=>{let t=H(e);return t?[t]:[]}),r=n.slice(0,5),i=Math.max(0,n.length-r.length),a=n.slice(0,3);return{summary:Wr(`Found ${n.length} ${Gr(`app`,n.length)}`,a,Math.max(0,n.length-a.length)),details:{appCount:n.length,apps:r,...i>0?{omittedAppCount:i}:{},...t===`all`||t===`user-installed`?{filter:t}:{}}}}function jr(e,t,n){let r=Ir(t);if(!r)return{};let i={device:r,...Vr(t),booted:n};return{summary:`${e} ${Hr(i,!1)}`,details:i}}function Mr(e,t){let n=H(t.appName),r=H(t.bundleId),i=B(t,[`packageName`,`package`]),a=H(t.platform),o=H(t.launchTarget),s=B(t,[`bundleId`,`packageName`,`package`,`appId`,`launchTarget`]),c=Ur(n,s);if(!c)return{};let l={};return V(l,`appName`,n),V(l,`bundleId`,r),V(l,`packageName`,i),V(l,`platform`,a),o!==s&&V(l,`launchTarget`,o),{summary:`${e} ${c}`,details:l}}function Nr(e,t){let n=Pr(e,t);return n?{details:{requestedFileName:n}}:{}}function Pr(e,t){let n=J(e.meta?.clientArtifactPaths?.path)??J(t.path);if(n)return q(n)}function Fr(e){if(!m(e))return;let t=Ir(e);if(t)return{name:t,...Vr(e)}}function Ir(e){let t=B(e,[`name`,`deviceName`,`device`]);return!t||!Lr(e,t)?t:zr(e)}function Lr(e,t){let n=Rr(t);return Er.some(t=>{let r=H(e[t]);return r!==void 0&&Rr(r)===n})}function Rr(e){return e.toLowerCase()}function zr(e){let t=H(e.appleOs),n=H(e.platform),r=H(e.kind),i=Br(t,n);return i&&(r===`simulator`||r===`emulator`)?`${i} ${r}`:i?`${i} device`:r===`simulator`?`Simulator`:r===`emulator`?`Emulator`:`Unnamed device`}function Br(e,t){let n=e??t;if(!(!n||!Object.hasOwn(Dr,n)))return Dr[n]}function Vr(e){let t=H(e.platform),n=H(e.appleOs),r=H(e.kind),i=H(e.target);return{...t?{platform:t}:{},...n?{appleOs:n}:{},...r?{kind:r}:{},...i?{target:i}:{},...typeof e.booted==`boolean`?{booted:e.booted}:{}}}function Hr(e,t){let n=H(e.name)??H(e.device)??`device`,r=H(e.platform),i=H(e.appleOs),a=[r,i===r?void 0:i,H(e.kind),H(e.target),t&&typeof e.booted==`boolean`?e.booted?`booted`:`stopped`:void 0].filter(e=>!!e);return a.length>0?`${n} (${a.join(`, `)})`:n}function Ur(e,t){return e&&t&&e!==t?`${e} (${t})`:e??t}function B(e,t){for(let n of t){let t=H(e[n]);if(t)return t}}function V(e,t,n){n&&(e[t]=n)}function Wr(e,t,n){let r=[...t,...n>0?[`+${n} more`]:[]];return r.length>0?`${e}: ${r.join(`, `)}`:e}function Gr(e,t){return t===1?e:`${e}s`}function H(e){let t=J(e);if(!t)return;let n=t.trim(),r=Array.from(n);return r.length<=120?n:`${r.slice(0,119).join(``)}…`}function U(e){return H(e)}function W(e){return typeof e==`boolean`?e:void 0}function G(e,t){let n=U(e);return n&&t.includes(n)?n:void 0}function K(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function q(e){let t=J(e);return t?H(t.split(/[\\/]/).at(-1)):void 0}function J(e){if(typeof e==`string`)return e.trim().length>0?e:void 0}function Y(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}const Kr=[`up`,`down`,`left`,`right`],qr=[`top`,`bottom`];function Jr(e){return`${e.command===s.reinstall?`Reinstalled`:`Installed`} ${Qr(e.result??{})??`app`}`}function Yr(e){let t=e.result??{};switch(e.command){case s.scroll:return ei(t);case s.screenshot:return ri(t);case s.home:return`Went home`;case s.back:return ai(t);case s.appSwitcher:return`Opened app switcher`;case s.orientation:return oi(t);case s.viewport:return si(t);case s.clipboard:return ci(t);case s.keyboard:return li(t);case s.tvRemote:return di(t);case s.gesture:return fi(t);case s.swipe:return pi(t);case s.trace:return hi(`trace`,e);case s.record:return hi(`recording`,e);default:return}}function Xr(e){let t=e.result??{};switch(e.command){case s.scroll:return K({direction:G(t.direction,Kr),edge:G(t.edge,qr),passes:Y(t.passes),amount:Y(t.amount),pixels:Y(t.pixels),durationMs:Y(t.durationMs),x1:Y(t.x1),y1:Y(t.y1),x2:Y(t.x2),y2:Y(t.y2)});case s.screenshot:return K({requestedFileName:ii(t)});case s.back:return K({mode:G(t.mode,d)});case s.orientation:return K({orientation:G(t.orientation,he)});case s.viewport:return K({width:Y(t.width),height:Y(t.height)});case s.clipboard:return K({action:G(t.action,[`read`,`write`])});case s.keyboard:return ui(t);case s.tvRemote:return K({button:G(t.button,ie),durationMs:Y(t.durationMs)});case s.gesture:case s.swipe:return mi(t);case s.trace:case s.record:return K({action:G(t.action,[`start`,`stop`]),fileName:_i(e),showTouches:W(t.showTouches)});default:return{}}}function Zr(e,t){if(e.command!==s.screenshot)return t;let n=Pr(e,t);return n?{...t,requestedFileName:n}:t}function Qr(e){let t=U(e.appName),n=vi(e,[`bundleId`,`packageName`,`appBundleId`,`launchTarget`]);return t&&n&&t!==n?`${t} (${n})`:t??n??$r(e)}function $r(e){let t=U(e.app);return t&&!t.includes(`/`)&&!t.includes(`\\`)?t:void 0}function ei(e){let t=G(e.direction,Kr),n=G(e.edge,qr),r=Y(e.passes);return n?ti(n,r):t?ni(t,e):`Scrolled`}function ti(e,t){return t===0?`Already at ${e}`:t===void 0?`Scrolled to ${e}`:`Scrolled to ${e} in ${t} ${t===1?`pass`:`passes`}`}function ni(e,t){let n=Y(t.pixels);if(n!==void 0)return`Scrolled ${e} by ${n}px`;let r=Y(t.amount);return r===void 0?`Scrolled ${e}`:`Scrolled ${e} by ${r}`}function ri(e){let t=ii(e);return t?`Captured screenshot ${t}`:`Captured screenshot`}function ii(e){return q(e.requestedFileName)??q(e.path)}function ai(e){return G(e.mode,d)===`system`?`Went back using system navigation`:`Went back`}function oi(e){let t=G(e.orientation,he);return t?`Rotated to ${t}`:`Changed orientation`}function si(e){let t=Y(e.width),n=Y(e.height);return t!==void 0&&n!==void 0?`Set viewport to ${t}×${n}`:`Changed viewport`}function ci(e){let t=G(e.action,[`read`,`write`]);return t===`read`?`Read clipboard`:t===`write`?`Updated clipboard`:`Used clipboard`}function li(e){let t=J(e.action);if(!t||!z(t))return`Used keyboard`;if(t===`dismiss`)return W(e.dismissed)===!1?`Keyboard was already hidden`:`Dismissed keyboard`;if(t===`enter`||t===`return`)return`Pressed keyboard return`;let n=W(e.visible);return n===void 0?`Inspected keyboard`:n?`Keyboard is visible`:`Keyboard is hidden`}function ui(e){let t=J(e.action);return K({action:t&&z(t)?t:void 0,platform:G(e.platform,[`ios`,`android`]),visible:W(e.visible),wasVisible:W(e.wasVisible),dismissed:W(e.dismissed),attempts:Y(e.attempts)})}function di(e){let t=G(e.button,ie);return t?`Pressed TV remote ${t}`:`Used TV remote`}function fi(e){let t=G(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]);return t?`Ran ${t} gesture`:`Ran gesture`}function pi(e){let t=Y(e.count);return t!==void 0&&t>1?`Swiped ${t} times`:`Swiped`}function mi(e){return K({kind:G(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]),durationMs:Y(e.durationMs),pointerCount:Y(e.pointerCount),x1:Y(e.x1),y1:Y(e.y1),x2:Y(e.x2),y2:Y(e.y2),count:Y(e.count),pauseMs:Y(e.pauseMs),pattern:G(e.pattern,[`one-way`,`ping-pong`]),scale:Y(e.scale)})}function hi(e,t){let n=gi(e,G(t.result?.action,[`start`,`stop`])),r=_i(t);return r?`${n} ${r}`:n}function gi(e,t){return t===`start`?e===`trace`?`Started trace`:`Started recording`:t===`stop`?e===`trace`?`Stopped trace`:`Stopped recording`:e===`trace`?`Updated trace`:`Updated recording`}function _i(e){let t=e.result??{};return q(t.requestedFileName)??q(t.outPath)??q(t.path)??q(e.positionals[1])}function vi(e,t){for(let n of t){let t=U(e[n]);if(t)return t}}function yi(e){switch(e.command){case s.open:return`Opened ${X(e)??`session`}`;case s.close:return`Closed ${U(e.result?.session)??`session`}`;case s.click:case s.press:return`Tapped ${X(e)??`target`}`;case s.longPress:return`Long pressed ${X(e)??`target`}`;case s.fill:return`Filled ${X(e)??`target`}`;case s.type:return`Typed text`;case s.install:case s.reinstall:case i.installSource:return Jr(e);default:return Yr(e)??`Ran ${e.command}`}}function bi(e){return K({command:e.command,positionals:ki(e),flags:Bi(e),...xi(e),...Si(e),...Ci(e),...Xr(e)})}function xi(e){if(!wi(e.command))return{};let t=e.result??{};return K({ref:Ji(t),targetLabel:X(e),selectorChainLength:Li(t.selectorChain)?.length,x:Y(t.x),y:Y(t.y),x2:Y(t.x2),y2:Y(t.y2),durationMs:Y(t.durationMs)})}function Si(e){if(!Ti(e.command))return{};let t=e.result??{};return K({platform:G(t.platform,de),target:G(t.target,fe),appName:U(t.appName),appBundleId:U(t.appBundleId),bundleId:U(t.bundleId),packageName:U(t.packageName),launchTarget:U(t.launchTarget)})}function Ci(e){let t=e.result??{};return e.command===s.snapshot?{...Array.isArray(t.nodes)?{nodeCount:t.nodes.length}:{}}:e.command!==s.wait&&e.command!==s.find&&e.command!==s.get&&e.command!==s.is?{}:K({waitedMs:Y(t.waitedMs),found:W(t.found)})}function wi(e){return e===s.click||e===s.press||e===s.longPress||e===s.focus||e===s.fill}function Ti(e){return e===s.open||e===s.install||e===s.reinstall||e===i.installSource}function X(e){let t=e.result??{};return Ei(t)??Di(t)??Oi(t)??Fi(e.positionals[0])}function Ei(e){let t=Ji(e);if(t)return t.startsWith(`@`)?t:`@${t}`}function Di(e){let t=Y(e.x),n=Y(e.y);if(t!==void 0&&n!==void 0)return`(${t}, ${n})`}function Oi(e){return U(e.appName)??U(e.appBundleId)??U(e.bundleId)??U(e.packageName)}function ki(e){if(e.positionals.length!==0)return e.command===s.type?[Q(`text`)]:e.command===s.fill?Ai(e):e.command===s.find?ji(e):e.command===s.clipboard?Mi(e):e.command===s.push?Ni(e,`app`,`payload`):e.command===s.triggerAppEvent?Ni(e,`event`,`payload`):e.positionals.map(Z)}function Ai(e){let t=Q(`text`),n=e.result??{},r=Ji(n);if(r)return[`@${r}`,t];if(U(n.selector))return[Q(`target`),t];let i=Y(n.x),a=Y(n.y);return i!==void 0&&a!==void 0?[String(i),String(a),t]:[t]}function ji(e){let t=+!!Ii(e.positionals[0]);if(e.positionals[t]===void 0)return;let n=t+1,r=[...t===1?[String(e.positionals[0])]:[],Q(`query`)],i=e.positionals[n];return i?i===`fill`||i===`type`?[...r,i,Q(`text`)]:[...r,...e.positionals.slice(n).map(Pi)]:r}function Mi(e){let t=e.positionals[0]?.toLowerCase();return t===`read`?[`read`]:t===`write`?[`write`,Q(`text`)]:e.positionals.map(Z)}function Ni(e,t,n){let[r,i,...a]=e.positionals;return[...r?[Q(t)]:[],...i?[Q(n)]:[],...a.map(Z)]}function Pi(e){return e===`click`||e===`focus`||e===`exists`||e===`get`||e===`text`||e===`attrs`||e===`wait`?e:Z(e)}function Z(e){return Fi(e)??Q(`arg`)}function Fi(e){if(!e)return;let t=e.trim();if(/^@[a-zA-Z0-9:_-]+$/.test(t))return t}function Q(e){return`<${e}>`}function Ii(e){return e===`text`||e===`label`||e===`value`||e===`role`||e===`id`}function Li(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)?e:void 0}const Ri={enums:[{source:`platform`,values:ue},{source:`target`,values:fe}]},zi={[s.open]:{booleans:[{source:`relaunch`},{source:`testIme`}],enums:[{source:`surface`,values:r}]},[s.click]:Vi(),[s.press]:Vi(),[s.longPress]:Vi(),[s.fill]:Hi(),[s.type]:Hi(),[s.scroll]:{numbers:[{source:`pixels`},{source:`durationMs`}]},[s.gesture]:Ui(),[s.swipe]:Ui(),[s.screenshot]:{booleans:[{source:`overlayRefs`},{source:`screenshotFullscreen`,output:`fullscreen`},{source:`screenshotNoStabilize`,output:`noStabilize`},{source:`screenshotNormalizeStatusBar`,output:`normalizeStatusBar`}],numbers:[{source:`screenshotPixelDensity`,output:`pixelDensity`},{source:`screenshotMaxSize`,output:`maxSize`}]},[s.snapshot]:{booleans:[{source:`snapshotInteractiveOnly`,output:`interactiveOnly`},{source:`snapshotDiff`,output:`diff`},{source:`snapshotRaw`,output:`raw`},{source:`snapshotForceFull`,output:`forceFull`}],numbers:[{source:`snapshotDepth`,output:`depth`}]},[s.back]:{enums:[{source:`backMode`,output:`mode`,values:d}]},[s.record]:{booleans:[{source:`hideTouches`}],numbers:[{source:`fps`},{source:`screenshotMaxSize`,output:`maxSize`}],enums:[{source:`recordingScope`,output:`scope`,values:a}]},[s.apps]:{enums:[{source:`appsFilter`,output:`filter`,values:[`user-installed`,`all`]}]},[s.boot]:{booleans:[{source:`headless`}]},[s.close]:{booleans:[{source:`shutdown`}]}};function Bi(e){let t=e.flags??{},n={},r=Object.hasOwn(zi,e.command)?zi[e.command]:void 0;return Wi(n,t,Ri),Wi(n,t,r),Object.keys(n).length>0?n:void 0}function Vi(){return{booleans:[{source:`doubleTap`},{source:`settle`}],numbers:[{source:`count`},{source:`intervalMs`},{source:`holdMs`},{source:`jitterPx`},{source:`settleQuietMs`}],enums:[{source:`clickButton`,values:ne}]}}function Hi(){return{booleans:[{source:`settle`}],numbers:[{source:`delayMs`},{source:`settleQuietMs`}]}}function Ui(){return{numbers:[{source:`pointerCount`},{source:`count`},{source:`pauseMs`}],enums:[{source:`pattern`,values:re}]}}function Wi(e,t,n){n&&(Gi(e,t,n.booleans??[]),Ki(e,t,n.numbers??[]),qi(e,t,n.enums??[]))}function Gi(e,t,n){for(let r of n)Yi(e,r.output??r.source,t[r.source])}function Ki(e,t,n){for(let r of n)Xi(e,r.output??r.source,t[r.source])}function qi(e,t,n){for(let r of n)Zi(e,r.output??r.source,t[r.source],r.values)}function Ji(e){let t=U(e.ref);if(!t)return;let n=t.startsWith(`@`)?t.slice(1):t;return/^[a-zA-Z0-9:_-]+$/.test(n)?n:void 0}function Yi(e,t,n){typeof n==`boolean`&&(e[t]=n)}function Xi(e,t,n){let r=Y(n);r!==void 0&&(e[t]=r)}function Zi(e,t,n,r){let i=G(n,r);i!==void 0&&(e[t]=i)}const $=new Map,Qi=new Set;function $i(e){return _.join(e,`events.ndjson`)}function ea(e){return e.command!==s.events}function ta(t,n,r){let i=e({version:1,ts:r.ts??new Date().toISOString(),session:n,...r});ra(t,`${JSON.stringify(i)}\n`)}async function na(e){await(e?$.get(e):Promise.all($.values()))}function ra(e,t){let n=($.get(e)??Promise.resolve()).catch(()=>void 0).then(async()=>{await ia(e),await v.promises.appendFile(e,t,`utf8`)}).catch(t=>{g({level:`warn`,phase:`session_event_log_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}).finally(()=>{$.get(e)===n&&$.delete(e)});$.set(e,n)}async function ia(e){let t=_.dirname(e);if(!Qi.has(t))try{await v.promises.mkdir(t,{recursive:!0}),Qi.add(t)}catch(t){throw g({level:`warn`,phase:`session_event_log_dir_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}}),t}}function aa(e,t,n){ta(e,t,{kind:`action.recorded`,requestId:h().requestId,command:n.command,summary:yi(n),details:bi(n)})}function oa(e){let{req:t}=e;return{kind:`request.started`,requestId:t.meta?.requestId??h().requestId,command:t.command,summary:`Started ${t.command}`}}function sa(e){let{req:t,response:n,durationMs:r}=e;if(n.ok){let e=Or(t,n.data);return{kind:`request.finished`,requestId:t.meta?.requestId??h().requestId,command:t.command,status:`ok`,summary:e.summary??`Finished ${t.command}`,details:{durationMs:r,...e.details}}}return{kind:`request.finished`,requestId:t.meta?.requestId??h().requestId,command:t.command,status:`error`,summary:`Failed ${t.command}: ${n.error.code}`,details:{durationMs:r,code:n.error.code,diagnosticId:n.error.diagnosticId}}}function ca(e,t={}){let n=pa(t.cursor),r=ma(t.limit);if(!v.existsSync(e))return{path:e,cursor:String(n),limit:r,events:[]};let i=la(e,n,r),a=i.lines.flatMap(e=>{let t=ha(e);return t?[t]:[]});return{path:e,cursor:String(n),limit:r,events:a,...i.nextCursor===void 0?{}:{nextCursor:String(i.nextCursor)}}}function la(e,t,n){let r=v.openSync(e,`r`);try{let e=new Te(`utf8`),i=Buffer.allocUnsafe(65536),a=ua(t,n),o=``,s=0;do{s=v.readSync(r,i,0,i.length,null);let t=e.write(i.subarray(0,s));o=da(`${o}${t}`,a)}while(s>0&&a.nextCursor===void 0);let c=`${o}${e.end()}`;return a.nextCursor===void 0&&c.length>0&&fa(c,a),{lines:a.lines,nextCursor:a.nextCursor}}finally{v.closeSync(r)}}function ua(e,t){return{cursor:e,limit:t,lineIndex:0,lines:[]}}function da(e,t){let n=0;for(let r=e.indexOf(`
|
|
3
3
|
`);r!==-1;r=e.indexOf(`
|
|
4
|
-
`,n))if(
|
|
4
|
+
`,n))if(fa(e.slice(n,r),t),n=r+1,t.nextCursor!==void 0)return``;return e.slice(n)}function fa(e,t){let n=e.endsWith(`\r`)?e.slice(0,-1):e;if(n.trim().length!==0){if(t.lineIndex>=t.cursor+t.limit){t.nextCursor=t.cursor+t.limit;return}t.lineIndex>=t.cursor&&t.lines.push(n),t.lineIndex+=1}}function pa(e){if(e===void 0||e.trim()===``)return 0;let n=Number(e);if(Number.isInteger(n)&&n>=0)return n;throw new t(`INVALID_ARGS`,`events cursor must be a non-negative integer string.`)}function ma(e){if(e===void 0||typeof e==`string`&&e.trim()===``)return 100;let n=typeof e==`string`?Number(e):e;if(Number.isInteger(n)&&n>=1&&n<=500)return n;throw new t(`INVALID_ARGS`,`events limit must be between 1 and 500.`)}function ha(e){try{let t=ga(JSON.parse(e));return t?_a(t):void 0}catch{return}}function ga(e){if(m(e)&&e.version===1&&!(typeof e.ts!=`string`||typeof e.session!=`string`)&&va(e.kind))return e}function _a(e){let t=m(e.details)?e.details:void 0;return{version:1,ts:e.ts,session:e.session,kind:e.kind,...typeof e.requestId==`string`?{requestId:e.requestId}:{},...typeof e.command==`string`?{command:e.command}:{},...ya(e.status)?{status:e.status}:{},...typeof e.summary==`string`?{summary:e.summary}:{},...t?{details:t}:{}}}function va(e){return e===`request.started`||e===`request.finished`||e===`action.recorded`}function ya(e){return e===`ok`||e===`error`}const ba=60*6e4;var xa=class{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new ar(e)}get(e){return this.sessions.get(e)}set(e,t){this.sessions.set(e,t)}delete(e){return this.runtimeHints.delete(e),this.sessions.delete(e)}values(){return this.sessions.values()}toArray(){return Array.from(this.sessions.values())}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){this.runtimeHints.set(e,t)}clearRuntimeHints(e){return this.runtimeHints.delete(e)}recordAction(e,t){let n=Wn(e,t);if(n){let t=this.resolveStoredSessionName(e);aa(this.resolveEventLogPath(t),t,n)}}recordEvent(e,t){ta(this.resolveEventLogPath(e),e,t)}readEvents(e,t={}){return ca(this.resolveEventLogPath(e),t)}async flushEvents(e){await na(e?this.resolveEventLogPath(e):void 0)}writeSessionLog(e,t){let n=this.scriptWriter.write(e,t);return n.written&&g({level:`info`,phase:`session_script_written`,data:{session:e.name,path:n.path}}),n}finalizeRepairTeardown(e){this.recordRepairFinalizeCloseIfCommitting(e);let t=this.writeSessionLog(e,{force:pn(e,void 0)});Sn(e)&&(!t.written&&t.error?this.writeRepairTombstone(e,ba,{code:String(t.error.code),message:t.error.message}):this.writeRepairTombstone(e))}recordRepairFinalizeCloseIfCommitting(e){Wt(e.scriptPublication??k)&&this.recordAction(e,{command:`close`,positionals:[],flags:{},result:{session:e.name,...l(`Closed: ${e.name}`)}})}writeRepairTombstone(e,t=ba,n){try{let r=this.resolveSessionDir(e.name);v.mkdirSync(r,{recursive:!0});let i={owner:e.name,reapedAt:Date.now(),expiresAt:Date.now()+t,...wn(e)?{sourcePath:wn(e)}:{},...n?{commitFailure:n}:{}};v.writeFileSync(this.repairTombstonePath(e.name),`${JSON.stringify(i)}\n`)}catch(t){g({level:`warn`,phase:`repair_tombstone_write_failed`,data:{session:e.name,error:t instanceof Error?t.message:String(t)}})}}readRepairTombstone(e){return Sa(this.repairTombstonePath(e))}clearRepairTombstone(e){try{v.rmSync(this.repairTombstonePath(e),{force:!0})}catch{}}repairTombstonePath(e){return _.join(this.resolveSessionDir(e),`repair-tombstone.json`)}defaultTracePath(e){let t=j(e.name),n=new Date().toISOString().replace(/[:.]/g,`-`);return _.join(this.sessionsDir,`${t}-${n}.trace.log`)}resolveSessionDir(e){return _.join(this.sessionsDir,j(e))}resolveDaemonStateDir(){return _.dirname(this.sessionsDir)}ensureSessionDir(e){let t=this.resolveSessionDir(e);return v.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return _.join(this.resolveSessionDir(e),`app.log`)}resolveAppLogPidPath(e){return _.join(this.resolveSessionDir(e),`app-log.pid`)}resolveEventLogPath(e){return $i(this.resolveSessionDir(e))}static expandHome(e,t){return M(e,t)}resolveStoredSessionName(e){for(let[t,n]of this.sessions)if(n===e)return t;return e.name}};function Sa(e){let t;try{t=v.readFileSync(e,`utf8`)}catch{return}let n;try{n=JSON.parse(t)}catch{return}if(!(typeof n?.expiresAt!=`number`||n.expiresAt<=Date.now()))return n}function Ca(e){let t;try{t=v.readdirSync(e,{withFileTypes:!0})}catch{return}for(let n of t){if(!n.isDirectory())continue;let t=Sa(_.join(e,n.name,`repair-tombstone.json`));if(t?.commitFailure)return{sessionName:n.name,tombstone:{...t,commitFailure:t.commitFailure}}}}function wa(e){return _.join(e,`runner.log`)}function Ta(e,t){let n=j(t&&t.length>0?t:`unknown`);return _.join(e,`requests`,`${n}.ndjson`)}function Ea(e,t={}){let n=Da(e,t);return{baseDir:n,infoPath:_.join(n,`daemon.json`),lockPath:_.join(n,`daemon.lock`),logPath:_.join(n,`daemon.log`),sessionsDir:_.join(n,`sessions`)}}function Da(e,t){let n=(e??``).trim();return n?ve(n,{env:t.env}):Oa(t)}function Oa(e={}){let t=_.join(ye(`~`,{env:e.env}),`.agent-device`),n=e.projectRoot??_e();return ka(n)?_.join(t,`dev`,Aa(n)):t}function ka(e){return v.existsSync(_.join(e,`package.json`))&&v.existsSync(_.join(e,`src`,`daemon.ts`))}function Aa(e){let t=ja(e),n=_.basename(t).replaceAll(/[^a-zA-Z0-9._-]+/g,`-`),r=we.createHash(`sha1`).update(t).digest(`hex`).slice(0,12);return`${n||`agent-device`}-${r}`}function ja(e){try{return v.realpathSync.native(e)}catch{return _.resolve(e)}}function Ma(e){let t=(e??``).trim().toLowerCase();return t===`http`?`http`:t===`dual`?`dual`:`socket`}function Na(e){let t=(e??``).trim().toLowerCase();return t===`auto`?`auto`:t===`socket`?`socket`:t===`http`?`http`:`auto`}function Pa(e){return(e??``).trim().toLowerCase()===`tenant`?`tenant`:`none`}function Fa(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}const Ia=/(?:^|[^\w$.])(?:import|export)\s+(?:type\s+)?(?:[^'"`]*?\s+from\s+)?['"]([^'"]+)['"]/gm,La=/import\(\s*['"]([^'"]+)['"]\s*\)/gm,Ra=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`];function za(){let e=process.argv[1];return e?Ba(e):`unknown`}function Ba(e,t=_e()){try{let n=_.resolve(t),r=[_.resolve(e)],i=new Set,a=[];for(;r.length>0;){let e=r.pop();if(!e||i.has(e))continue;i.add(e);let t=v.statSync(e);if(!t.isFile())continue;let o=_.relative(n,e)||e;a.push(`${o}:${t.size}:${Math.trunc(t.mtimeMs)}`);let s=v.readFileSync(e,`utf8`);for(let t of Va(s)){let n=Ua(e,t);n&&r.push(n)}}let o=a.sort().join(`|`),s=we.createHash(`sha1`).update(o).digest(`hex`);return`graph:${a.length}:${s}`}catch{return`unknown`}}function Va(e){let t=new Set;return Ha(e,Ia,t),Ha(e,La,t),[...t]}function Ha(e,t,n){t.lastIndex=0;let r=null;for(;(r=t.exec(e))!==null;){let e=r[1]?.trim();e?.startsWith(`.`)&&n.add(e)}}function Ua(e,t){let n=_.resolve(_.dirname(e),t),r=Wa(n);if(r)return r;for(let e of Ra){let t=Wa(`${n}${e}`);if(t)return t}for(let e of Ra){let t=Wa(_.join(n,`index${e}`));if(t)return t}return null}function Wa(e){try{return v.statSync(e).isFile()?e:null}catch{return null}}const Ga=/^[A-Za-z0-9_@%+=:,./-]+$/;function Ka(e){return`'${e.replaceAll(`'`,`'\\''`)}'`}function qa(e){return Ga.test(e)?e:Ka(e)}const Ja=[/(^|[/\s"'=])dist\/src\/daemon\.js($|[\s"'])/,/(^|[/\s"'=])dist\/src\/internal\/daemon\.js($|[\s"'])/,/(^|[/\s"'=])src\/daemon\.ts($|[\s"'])/];function Ya(e){let t=e.toLowerCase().replaceAll(`\\`,`/`);return t.includes(`agent-device`)?Ja.some(e=>e.test(t)):!1}function Xa(e,t){if(!xe(e))return!1;if(t){let n=Se(e);if(!n||n!==t)return!1}let n=be(e);return n?Ya(n):!1}function Za(e,t){try{return process.kill(e,t),!0}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return!1;throw e}}async function Qa(e,t){Xa(e,t.expectedStartTime)&&Za(e,`SIGTERM`)&&(await Ce(e,t.termTimeoutMs)||Za(e,`SIGKILL`)&&await Ce(e,t.killTimeoutMs))}function $a(e,t){let n=[],r=e+t.toString(),i=r.indexOf(`
|
|
5
5
|
`);for(;i!==-1;){let e=r.slice(0,i).trim();r=r.slice(i+1),e&&n.push(e),i=r.indexOf(`
|
|
6
|
-
`)}return{lines:n,buffer:r}}function
|
|
6
|
+
`)}return{lines:n,buffer:r}}function eo(e){return e.meta?.requestProgress===`replay-test`||e.meta?.requestProgress===`command`}function to(e){return!!e&&typeof e==`object`&&e.type===`progress`&&!!e.event}function no(e){return!!e&&typeof e==`object`&&e.type===`response`&&!!e.response}function ro(e){return`${JSON.stringify({type:`progress`,event:e})}\n`}function io(e){return`${JSON.stringify({type:`response`,response:e})}\n`}function ao(e){return`${JSON.stringify({type:`response`,response:e})}\n`}function oo(e,t={}){return{ok:!0,service:e,version:ge(),rpcProtocolVersion:2,...t.upstream===void 0?{}:{upstream:t.upstream}}}function so(e){return{...typeof e.path==`string`?{path:e.path}:{},...typeof e.width==`number`?{width:e.width}:{},...typeof e.height==`number`?{height:e.height}:{},...typeof e.logicalWidth==`number`?{logicalWidth:e.logicalWidth}:{},...typeof e.logicalHeight==`number`?{logicalHeight:e.logicalHeight}:{},...typeof e.pixelDensity==`number`?{pixelDensity:e.pixelDensity}:{},...e.overlayRefs?{overlayRefs:e.overlayRefs}:{}}}function co(e){if(m(e))return so({path:typeof e.path==`string`?e.path:void 0,width:typeof e.width==`number`?e.width:void 0,height:typeof e.height==`number`?e.height:void 0,logicalWidth:typeof e.logicalWidth==`number`?e.logicalWidth:void 0,logicalHeight:typeof e.logicalHeight==`number`?e.logicalHeight:void 0,pixelDensity:typeof e.pixelDensity==`number`?e.pixelDensity:void 0,overlayRefs:Array.isArray(e.overlayRefs)?e.overlayRefs.filter(po).flatMap(e=>{let t=lo(e);return t?[t]:[]}):void 0})}function lo(e){if(typeof e.ref!=`string`||e.ref.length===0)return;let t=uo(e);if(t)return{ref:e.ref,...fo(e),...t}}function uo(e){let t=ce(e.rect);if(!t)return;let n=ce(e.overlayRect);if(!n)return;let r=ae(e.center);return r?{rect:t,overlayRect:n,center:r}:void 0}function fo(e){return typeof e.label==`string`&&e.label.length>0?{label:e.label}:{}}function po(e){return m(e)}export{dn as $,ki as A,Oe as At,hn as B,xa as C,$e as Ct,sa as D,Ae as Dt,wa as E,ke as Et,kn as F,vn as G,xn as H,On as I,cn as J,Cn as K,Dn as L,z as M,Jn as N,oa as O,Ee as Ot,In as P,mn as Q,Tn as R,Pa as S,lt as St,Ta as T,Ke as Tt,Sn as U,bn as V,_n as W,pn as X,sn as Y,on as Z,za as _,Ft as _t,no as a,an as at,Ma as b,gt as bt,ao as c,Bt as ct,Xa as d,zt as dt,fn as et,Qa as f,Lt as ft,Ba as g,Mt as gt,qa as h,Pt as ht,to as i,k as it,Zr as j,ea as k,De as kt,eo as l,It as lt,Ka as m,jt as mt,co as n,M as nt,ro as o,rn as ot,Za as p,At as pt,gn as q,oo as r,j as rt,io as s,Vt as st,so as t,un as tt,$a as u,Rt as ut,Fa as v,Nt as vt,Ca as w,C as wt,Na as x,_t as xt,Ea as y,pt as yt,yn as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as e}from"./sdk-contracts.js";import{F as t,U as n,W as r}from"./sdk-batch-runner.js";import{TARGET_ANNOTATION_MAX_FIELD_BYTES as i,normalizeIdentifierField as a,normalizeLabelField as o,normalizeRoleField as s,truncateToUtf8Bytes as c}from"@agent-device/ad-script";function l(e,t){return{ok:!1,code:`INVALID_ARGS`,message:e,...t?{hint:t}:{}}}function u(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite)&&e.width>0&&e.height>0)}function d(e,t){return t.x>=e.x&&t.y>=e.y&&t.x+t.width<=e.x+e.width&&t.y+t.height<=e.y+e.height}function f(e){return e.width*e.height}function p(t,n){let r=e(n),i=t.filter(e=>te(e.rect)),a=i.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)});return h(a.map(e=>e.rect).filter(e=>m(e,r.x,r.y)))||h(a.map(e=>e.rect))||h(i.map(e=>e.rect).filter(e=>m(e,r.x,r.y)))||null}function ee(e,t){return g(e.x,e.x+e.width,t.x,t.x+t.width)&&g(e.y,e.y+e.height,t.y,t.y+t.height)}function te(e){return e?Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height):!1}function m(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function h(e){let t=null,n=-1;for(let r of e){let e=r.width*r.height;e>n&&(t=r,n=e)}return t}function g(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function ne(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function _(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=re(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function re(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function ie(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r[r.length-1]?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function v(e){return new Map(e.map(e=>[e.index,e]))}function y(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function ae(e){let t=`${e??``}`.toLowerCase();return t.includes(`scroll`)||t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)||t.includes(`collectionview`)||t===`table`}function oe(e){return ae(e.type)?!0:`${e.role??``} ${e.subrole??``}`.toLowerCase().includes(`scroll`)}function se(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=b(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>pe(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:me(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&ge(e)),e,t)}}function ce(e){if(e.length===0)return new Map;let{hintedContainers:t}=b(e);return fe(t.directionsByContainer)}function b(e){let t=v(e),n=new Set,r=[];for(let i of e){if(x(i,e,t)){ve(i,n,t);continue}r.push(i)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:de(e,r,n,t)}}function x(e,t,n=v(t)){if(!e.rect)return!0;let r=w(e,t,n);return r?ee(e.rect,r):!0}function S(e,t,n=v(t)){if(!e.rect)return!0;if(!x(e,t,n))return!1;let r=p(t,e.rect);return C(e.rect,r)}function C(e,t){return!t||t.width<=0||t.height<=0?!0:m(t,e.x+e.width/2,e.y+e.height/2)}function le(e,t){return e.hittable&&C(e.rect,t)}function w(e,t,n=v(t)){return xe(e,n)||p(t,e.rect??{x:0,y:0,width:0,height:0})}function ue(e,t,n=v(t)){if(!e.rect)return null;let r=w(e,t,n);if(r&&!ee(e.rect,r)){let t=T(e.rect,r);if(t)return t}let i=p(t,e.rect);if(i&&!C(e.rect,i)){let t=T(e.rect,i);if(t)return t}return null}function T(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function de(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=D(e,n,r);if(!t?.rect)continue;let s=E(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return ye(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function fe(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function pe(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function me(e,t,n){let r=new Map;for(let i of e){let e=he(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=_e(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function he(e,t,n){if(!e.rect)return null;let r=w(e,t,n);return r?E(e.rect,r):null}function E(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function ge(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!y(e)}function _e(e){let t=new Set,n=[];for(let r of e){let e=y(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function ve(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function D(e,t,n){return Se(e,n,e=>t.has(e.index))}function ye(e,t,n,r,i){for(let a of e){let e=be(a);if(!e||e.size===0)continue;let o=D(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function be(e){let t=_(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function xe(e,t){return Se(e,t,e=>!!e.rect)?.rect??null}function Se(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(i.add(r.index),n(r)&&oe(r))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function O(e){let t=k(e.label),n=k(e.value),r=k(e.identifier),i=De(r)?r:``;return j(e.type??``)?n||t||i:t||n||i}function Ce(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=A(e.type??``),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`textview`)||n.includes(`textarea`)||n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`edittext`)||r.includes(`text area`)||r.includes(`text field`)}function we(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function Te(e,t){let n=O(e),r=Ce(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&Ee(n)}}function Ee(e){return e?e.length>80||/[\r\n]/.test(e):!1}function k(e){return typeof e==`string`?e.trim():``}function A(e){let t=e.trim().replace(/XCUIElementType/gi,``).replace(/^AX/,``).toLowerCase(),n=Math.max(t.lastIndexOf(`.`),t.lastIndexOf(`/`));return n!==-1&&(t=t.slice(n+1)),t}function j(e){let t=A(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function De(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}function Oe(e,t){let n=t.toLowerCase();return e.find(e=>{let t=(e.label??``).toLowerCase(),r=(e.value??``).toLowerCase(),i=(e.identifier??``).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)})??null}function ke(e,t){let n=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);return n&&M(n)?n:Ae(e,t)??(n&&M(n)?n:void 0)}function M(e){let t=e.trim();return!(!t||/^(true|false)$/i.test(t)||/^\d+$/.test(t))}function Ae(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);if(!t||!M(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function je(e){let t=[],n=[];for(let r of e){let e=r.depth??0;for(;t.length>0&&e<=t[t.length-1];)t.pop();let i=A(r.type??``),a=[r.label,r.value,r.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0),o=a?M(a):!1;if((i===`group`||i===`ioscontentgroup`)&&!o){t.push(e);continue}let s=Math.max(0,e-t.length);n.push({...r,depth:s})}return n}function N(e,t){let n=A(e);return n?t===`android`?n.includes(`edittext`)||n.includes(`autocompletetextview`):n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`textview`)||n.includes(`textarea`)||n===`search`:!0}function Me(e,t){return t.hittable?t:I(e,t,e=>e.hittable===!0)}function P(e){return new Map(e.map(e=>[e.index,e]))}function F(e,t,n,r){let i=t,a=new Set;for(;typeof i.parentIndex==`number`&&!a.has(i.index);){if(a.add(i.index),i=n.get(i.parentIndex)??e[i.parentIndex],!i)return null;let t=r(i);if(t!==null)return t}return null}function I(e,t,n){return F(e,t,P(e),e=>n(e)?e:null)}function L(e){return[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).filter(e=>e.length>0)[0]??``}function Ne(e){return O(e)}function R(e){return e.hittable===!0?!0:e.rect?e.rect.width>0&&e.rect.height>0:!1}function z(e,t){return N(e.type??``,t)&&e.enabled!==!1}function B(e){return[`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`].includes(e)}function V(e){let t=e.toLowerCase();return B(t)?{ok:!0,predicate:t}:l(`is requires predicate: visible|hidden|exists|editable|selected|focused|text`,Pe)}const Pe=`Use "is <predicate> <selector>" or "is <selector> <predicate>". visible|hidden|editable|selected|focused double as selector keys: a bare predicate token after the selector is read as the predicate, so write key=true (e.g. visible=true) inside the selector to use it as a filter instead.`;function H(e){if(B((e[0]??``).toLowerCase()))return e;for(let t=1;t<e.length;t+=1){let n=(e[t]??``).toLowerCase();if(B(n)&&r(e.slice(0,t).join(` `)))return[n,...e.slice(0,t),...e.slice(t+1)]}return e}function Fe(e){let{predicate:t,node:n,nodes:r,expectedText:i,platform:a}=e,o=L(n),s=z(n,a),c=n.selected===!0,l=n.focused===!0,u=t===`text`?R(n):Ie(n,r,a),d=!1;switch(t){case`visible`:d=u;break;case`hidden`:d=!u;break;case`editable`:d=s;break;case`selected`:d=c;break;case`focused`:d=l;break;case`text`:d=o===(i??``);break}let f=t===`text`?`expected="${i??``}" actual="${o}"`:`actual=${JSON.stringify({visible:u,editable:s,selected:c,focused:l})}`;return{pass:d,actualText:o,details:f}}function Ie(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(u(e.rect))return U(e,t);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=Le(e,t,n);return r?u(r.rect)?U(r,t):n!==`android`&&r.hittable===!0:!1}function U(e,t){return x(e,t)}function Le(e,t,n){return F(t,e,P(t),e=>Re(e,n)?e:null)}function Re(e,t){if(t===`android`&&e.visibleToUser===!1)return!1;let n=A(e.type??``);return n.includes(`application`)||n.includes(`window`)||n.includes(`scrollview`)||n.includes(`tableview`)||n.includes(`collectionview`)||n===`table`||n===`list`||n===`listview`?!1:t===`android`?e.hittable===!0&&u(e.rect):e.hittable===!0||u(e.rect)}function W(e){let t=H(e),r=t[0]??``;return{predicate:r,split:n(t.slice(1),{preferTrailingValue:r===`text`})}}const G=`is requires a selector expression`,K=`is text requires expected text value`;function ze(e){let{predicate:t,split:n}=W([...e]),r=V(t);if(!r.ok)return r;if(!n)return l(G);let i=n.rest.join(` `).trim();return r.predicate===`text`&&!i?l(K):r.predicate!==`text`&&n.rest.length>0?l(`is ${r.predicate} does not accept trailing values`):{ok:!0,predicate:r.predicate,selectorExpression:n.selectorExpression,expectedText:i}}function Be(e){return e===`text`||e===`attrs`?{ok:!0,format:e}:l(`get only supports text or attrs`)}function Ve(e){let t=e[0];if(t?.startsWith(`@`)){let n=e.slice(1).join(` `).trim();return{ok:!0,ref:t,...n?{label:n}:{}}}let n=e.join(` `).trim();return n?{ok:!0,selector:n}:l(`get requires @ref or selector expression`)}function He(e){return e?{ok:!0,text:e}:l(`wait requires text`)}function q(e,t,n){return t.terms.every(t=>Ue(e,t,n))}function Ue(e,t,n){switch(t.key){case`id`:return J(e.identifier,String(t.value));case`role`:return J(A(e.type??``),String(t.value));case`label`:return J(e.label,String(t.value));case`value`:return J(e.value,String(t.value));case`text`:return J(L(e),String(t.value));case`appname`:return J(e.appName,String(t.value));case`windowtitle`:return J(e.windowTitle,String(t.value));case`visible`:return R(e)===!!t.value;case`hidden`:return!R(e)==!!t.value;case`editable`:return z(e,n)===!!t.value;case`selected`:return e.selected===!0==!!t.value;case`focused`:return e.focused===!0==!!t.value;case`enabled`:return e.enabled!==!1==!!t.value;case`hittable`:return e.hittable===!0==!!t.value;default:return!1}}function J(e,n){return t(e??``)===t(n)}function We(e,t,n){let r=n.requireRect??!1,i=n.requireUnique??!0,a=[];for(let[o,s]of t.selectors.entries()){let t=Xe(e,s,n.platform,r);if(a.push({selector:s.raw,matches:t.count}),!(t.count===0||!t.firstNode)){if(i&&t.count!==1){if(!n.disambiguateAmbiguous||!t.disambiguated||!t.tiebreak)continue;return{node:t.disambiguated,selector:s,selectorIndex:o,matches:t.count,diagnostics:a,disambiguation:{matchCount:t.count,tiebreak:t.tiebreak,alternatives:t.candidates.filter(e=>e!==t.disambiguated)}}}return{node:t.firstNode,selector:s,selectorIndex:o,matches:t.count,diagnostics:a}}}return null}function Ge(e,t,n){let r=n.requireRect??!1;for(let[i,a]of t.selectors.entries()){let t=e.filter(e=>r&&!e.rect?!1:q(e,a,n.platform));if(t.length>0)return{selector:a,selectorIndex:i,matchedNodes:t}}return null}function Ke(e,t,n){let r=n.requireRect??!1,i=[];for(let[a,o]of t.selectors.entries()){let t=$e(e,o,n.platform,r);if(i.push({selector:o.raw,matches:t}),t>0)return{selectorIndex:a,selector:o,matches:t,diagnostics:i}}return null}const qe=`Snapshot refs expire when the UI changes. Run snapshot -i and retry with a fresh @ref.`;function Je(e){return e.some(e=>e.matches>1)?`Add more terms to disambiguate (e.g. role=button text="Sign in"), use an @ref from snapshot -i, or use find <text> --first/--last.`:`Selector text/label values match exactly (quote multi-word values: text="Sign in"). Run snapshot -i to see current elements and refs, or use find <text> for contains matching.`}function Ye(e,t,n){if(t.length===0)return`Selector did not match: ${e.raw}`;let r=t.map(e=>`${e.selector} -> ${e.matches}`).join(`, `);return n.unique??!0?`Selector did not resolve uniquely (${r})`:`Selector did not match (${r})`}function Xe(e,t,n,r){let i=0,a=null,o=[],s={best:null,bestVisible:!1,tie:!1},c,l=t=>(c??=v(e),S(t,e,c));for(let c of e)r&&!c.rect||q(c,t,n)&&(i+=1,a??=c,o.push(c),Ze(s,c,l));return{count:i,firstNode:a,disambiguated:s.tie?null:s.best,tiebreak:s.tie?null:Qe(o,s.best,l),candidates:o}}function Ze(e,t,n){if(!e.best){e.best=t;return}e.bestVisible||=n(e.best);let r=n(t);if(r!==e.bestVisible){r&&(e.best=t,e.bestVisible=!0,e.tie=!1);return}let i=X(t,e.best);i.result>0?(e.best=t,e.tie=!1):i.result===0&&(e.tie=!0)}function Qe(e,t,n){if(!t)return null;let r=null;for(let i of e)i!==t&&(!r||Y(i,r,n).result>0)&&(r=i);return r?Y(t,r,n).criterion:null}function Y(e,t,n){let r=n(e);return r===n(t)?X(e,t):{result:r?1:-1,criterion:`visible`}}function $e(e,t,n,r){let i=0;for(let a of e)r&&!a.rect||q(a,t,n)&&(i+=1);return i}function X(e,t){let n=e.depth??0,r=t.depth??0;if(n!==r)return{result:n>r?1:-1,criterion:`deepest`};let i=et(e),a=et(t);return i===a?{result:0,criterion:null}:{result:i<a?1:-1,criterion:`smallest-area`}}function et(e){return e.rect?e.rect.width*e.rect.height:1/0}function Z(e){let t=s(A(e.type??``)),n=a(e.identifier),r=o(e.label);return{...n===void 0?{}:{id:c(n,i)},role:c(t,i),...r===void 0?{}:{label:c(r,i)}}}function tt(e,t){return e.id===t.id&&e.role===t.role&&e.label===t.label}function nt(e,t){let n=0;for(let r of e)Z(r).id===t&&(n+=1);return n}function rt(e,t){if(e.id===void 0||nt(t,e.id)<=1)return e;let{role:n,label:r}=e;return{role:n,...r===void 0?{}:{label:r}}}function it(e,t){let n=0;for(let r of e)if(r.parentIndex===t.parentIndex){if(r.index===t.index)return n;n+=1}return 0}function at(e,t){return{documentOrder:e.index,sibling:it(t,e)}}function ot(e,t){return e.documentOrder===t.documentOrder&&e.sibling===t.sibling}const st=`replay_target_guard_mismatch`,ct=`wait_landmark_identity_mismatch`;function lt(e,t,n={}){let r=[],i=A(e.type??``),a=ut(e,n.nodes),o=$(e.label),s=$(e.value),c=$(L(e)),l=n.action===`fill`;a&&r.push(`id=${Q(a)}`),i&&o&&r.push(l?`role=${Q(i)} label=${Q(o)} editable=true`:`role=${Q(i)} label=${Q(o)}`),o&&r.push(l?`label=${Q(o)} editable=true`:`label=${Q(o)}`),s&&r.push(l?`value=${Q(s)} editable=true`:`value=${Q(s)}`),c&&c!==o&&c!==s&&r.push(l?`text=${Q(c)} editable=true`:`text=${Q(c)}`),i&&l&&!r.some(e=>e.includes(`editable=true`))&&r.push(`role=${Q(i)} editable=true`);let u=dt(r);return u.length===0&&i&&u.push(l?`role=${Q(i)} editable=true`:`role=${Q(i)}`),u.length===0&&R(e)&&u.push(`visible=true`),u}function ut(e,t){let n=$(e.identifier);if(!n||!t)return n;let r=Z(e).id;return r===void 0?n:nt(t,r)>1?null:n}function dt(e){return Array.from(new Set(e))}function Q(e){return JSON.stringify(e)}function $(e){return e&&e.trim()||null}export{v as $,Ne as A,O as B,He as C,H as D,Fe as E,N as F,ue as G,j as H,je as I,x as J,ce as K,ke as L,I as M,Me as N,z as O,Oe as P,ae as Q,we as R,ze as S,V as T,k as U,A as V,se as W,w as X,S as Y,oe as Z,q as _,rt as a,h as at,Ve as b,at as c,f as ct,qe as d,y as et,Ke as f,Je as g,We as h,ct as i,m as it,L as j,R as k,it as l,d as lt,Ge as m,$ as n,_ as nt,tt as o,p as ot,Ye as p,le as q,st as r,ne as rt,Z as s,u as st,lt as t,ie as tt,ot as u,K as v,W as w,Be as x,G as y,Te as z};
|
|
1
|
+
import{_ as e,u as t}from"./sdk-contracts.js";import{F as n,U as r,W as i}from"./sdk-batch-runner.js";function a(e,t){return{ok:!1,code:`INVALID_ARGS`,message:e,...t?{hint:t}:{}}}function o(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite)&&e.width>0&&e.height>0)}function s(e,t){return t.x>=e.x&&t.y>=e.y&&t.x+t.width<=e.x+e.width&&t.y+t.height<=e.y+e.height}function c(e){return e.width*e.height}function l(e,n){let r=t(n),i=e.filter(e=>d(e.rect)),a=i.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)});return p(a.map(e=>e.rect).filter(e=>f(e,r.x,r.y)))||p(a.map(e=>e.rect))||p(i.map(e=>e.rect).filter(e=>f(e,r.x,r.y)))||null}function u(e,t){return m(e.x,e.x+e.width,t.x,t.x+t.width)&&m(e.y,e.y+e.height,t.y,t.y+t.height)}function d(e){return e?Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height):!1}function f(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function p(e){let t=null,n=-1;for(let r of e){let e=r.width*r.height;e>n&&(t=r,n=e)}return t}function m(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function ee(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function h(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=te(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function te(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function ne(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r[r.length-1]?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function g(e){return new Map(e.map(e=>[e.index,e]))}function _(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function v(e){let t=`${e??``}`.toLowerCase();return t.includes(`scroll`)||t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)||t.includes(`collectionview`)||t===`table`}function y(e){return v(e.type)?!0:`${e.role??``} ${e.subrole??``}`.toLowerCase().includes(`scroll`)}function re(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=b(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>de(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:fe(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&me(e)),e,t)}}function ie(e){if(e.length===0)return new Map;let{hintedContainers:t}=b(e);return ue(t.directionsByContainer)}function b(e){let t=g(e),n=new Set,r=[];for(let i of e){if(x(i,e,t)){ge(i,n,t);continue}r.push(i)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:le(e,r,n,t)}}function x(e,t,n=g(t)){if(!e.rect)return!0;let r=C(e,t,n);return r?u(e.rect,r):!0}function ae(e,t,n=g(t)){if(!e.rect)return!0;if(!x(e,t,n))return!1;let r=l(t,e.rect);return S(e.rect,r)}function S(e,t){return!t||t.width<=0||t.height<=0?!0:f(t,e.x+e.width/2,e.y+e.height/2)}function oe(e,t){return e.hittable&&S(e.rect,t)}function C(e,t,n=g(t)){return ye(e,n)||l(t,e.rect??{x:0,y:0,width:0,height:0})}function se(e,t,n=g(t)){if(!e.rect)return null;let r=C(e,t,n);if(r&&!u(e.rect,r)){let t=ce(e.rect,r);if(t)return t}let i=l(t,e.rect);if(i&&!S(e.rect,i)){let t=ce(e.rect,i);if(t)return t}return null}function ce(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function le(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=T(e,n,r);if(!t?.rect)continue;let s=w(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return _e(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function ue(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function de(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function fe(e,t,n){let r=new Map;for(let i of e){let e=pe(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=he(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function pe(e,t,n){if(!e.rect)return null;let r=C(e,t,n);return r?w(e.rect,r):null}function w(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function me(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!_(e)}function he(e){let t=new Set,n=[];for(let r of e){let e=_(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function ge(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function T(e,t,n){return E(e,n,e=>t.has(e.index))}function _e(e,t,n,r,i){for(let a of e){let e=ve(a);if(!e||e.size===0)continue;let o=T(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function ve(e){let t=h(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function ye(e,t){return E(e,t,e=>!!e.rect)?.rect??null}function E(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(i.add(r.index),n(r)&&y(r))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function D(e){let t=O(e.label),n=O(e.value),r=O(e.identifier),i=we(r)?r:``;return A(e.type??``)?n||t||i:t||n||i}function be(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=k(e.type??``),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`textview`)||n.includes(`textarea`)||n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`edittext`)||r.includes(`text area`)||r.includes(`text field`)}function xe(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function Se(e,t){let n=D(e),r=be(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&Ce(n)}}function Ce(e){return e?e.length>80||/[\r\n]/.test(e):!1}function O(e){return typeof e==`string`?e.trim():``}function k(e){let t=e.trim().replace(/XCUIElementType/gi,``).replace(/^AX/,``).toLowerCase(),n=Math.max(t.lastIndexOf(`.`),t.lastIndexOf(`/`));return n!==-1&&(t=t.slice(n+1)),t}function A(e){let t=k(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function we(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}function Te(e,t){let n=t.toLowerCase();return e.find(e=>{let t=(e.label??``).toLowerCase(),r=(e.value??``).toLowerCase(),i=(e.identifier??``).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)})??null}function Ee(e,t){let n=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);return n&&j(n)?n:De(e,t)??(n&&j(n)?n:void 0)}function j(e){let t=e.trim();return!(!t||/^(true|false)$/i.test(t)||/^\d+$/.test(t))}function De(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);if(!t||!j(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function Oe(e){let t=[],n=[];for(let r of e){let e=r.depth??0;for(;t.length>0&&e<=t[t.length-1];)t.pop();let i=k(r.type??``),a=[r.label,r.value,r.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0),o=a?j(a):!1;if((i===`group`||i===`ioscontentgroup`)&&!o){t.push(e);continue}let s=Math.max(0,e-t.length);n.push({...r,depth:s})}return n}function M(e,t){let n=k(e);return n?t===`android`?n.includes(`edittext`)||n.includes(`autocompletetextview`):n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`textview`)||n.includes(`textarea`)||n===`search`:!0}function ke(e,t){return t.hittable?t:F(e,t,e=>e.hittable===!0)}function N(e){return new Map(e.map(e=>[e.index,e]))}function P(e,t,n,r){let i=t,a=new Set;for(;typeof i.parentIndex==`number`&&!a.has(i.index);){if(a.add(i.index),i=n.get(i.parentIndex)??e[i.parentIndex],!i)return null;let t=r(i);if(t!==null)return t}return null}function F(e,t,n){return P(e,t,N(e),e=>n(e)?e:null)}function I(e){return[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).filter(e=>e.length>0)[0]??``}function Ae(e){return D(e)}function L(e){return e.hittable===!0?!0:e.rect?e.rect.width>0&&e.rect.height>0:!1}function R(e,t){return M(e.type??``,t)&&e.enabled!==!1}function z(e){return[`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`].includes(e)}function B(e){let t=e.toLowerCase();return z(t)?{ok:!0,predicate:t}:a(`is requires predicate: visible|hidden|exists|editable|selected|focused|text`,je)}const je=`Use "is <predicate> <selector>" or "is <selector> <predicate>". visible|hidden|editable|selected|focused double as selector keys: a bare predicate token after the selector is read as the predicate, so write key=true (e.g. visible=true) inside the selector to use it as a filter instead.`;function Me(e){if(z((e[0]??``).toLowerCase()))return e;for(let t=1;t<e.length;t+=1){let n=(e[t]??``).toLowerCase();if(z(n)&&i(e.slice(0,t).join(` `)))return[n,...e.slice(0,t),...e.slice(t+1)]}return e}function Ne(e){let{predicate:t,node:n,nodes:r,expectedText:i,platform:a}=e,o=I(n),s=R(n,a),c=n.selected===!0,l=n.focused===!0,u=t===`text`?L(n):Pe(n,r,a),d=!1;switch(t){case`visible`:d=u;break;case`hidden`:d=!u;break;case`editable`:d=s;break;case`selected`:d=c;break;case`focused`:d=l;break;case`text`:d=o===(i??``);break}let f=t===`text`?`expected="${i??``}" actual="${o}"`:`actual=${JSON.stringify({visible:u,editable:s,selected:c,focused:l})}`;return{pass:d,actualText:o,details:f}}function Pe(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(o(e.rect))return Fe(e,t);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=Ie(e,t,n);return r?o(r.rect)?Fe(r,t):n!==`android`&&r.hittable===!0:!1}function Fe(e,t){return x(e,t)}function Ie(e,t,n){return P(t,e,N(t),e=>Le(e,n)?e:null)}function Le(e,t){if(t===`android`&&e.visibleToUser===!1)return!1;let n=k(e.type??``);return n.includes(`application`)||n.includes(`window`)||n.includes(`scrollview`)||n.includes(`tableview`)||n.includes(`collectionview`)||n===`table`||n===`list`||n===`listview`?!1:t===`android`?e.hittable===!0&&o(e.rect):e.hittable===!0||o(e.rect)}function Re(e){let t=Me(e),n=t[0]??``;return{predicate:n,split:r(t.slice(1),{preferTrailingValue:n===`text`})}}const ze=`is requires a selector expression`,Be=`is text requires expected text value`;function Ve(e){let{predicate:t,split:n}=Re([...e]),r=B(t);if(!r.ok)return r;if(!n)return a(ze);let i=n.rest.join(` `).trim();return r.predicate===`text`&&!i?a(Be):r.predicate!==`text`&&n.rest.length>0?a(`is ${r.predicate} does not accept trailing values`):{ok:!0,predicate:r.predicate,selectorExpression:n.selectorExpression,expectedText:i}}function He(e){return e===`text`||e===`attrs`?{ok:!0,format:e}:a(`get only supports text or attrs`)}function Ue(e){let t=e[0];if(t?.startsWith(`@`)){let n=e.slice(1).join(` `).trim();return{ok:!0,ref:t,...n?{label:n}:{}}}let n=e.join(` `).trim();return n?{ok:!0,selector:n}:a(`get requires @ref or selector expression`)}function We(e){return e?{ok:!0,text:e}:a(`wait requires text`)}function V(e,t,n){return t.terms.every(t=>Ge(e,t,n))}function Ge(e,t,n){switch(t.key){case`id`:return H(e.identifier,String(t.value));case`role`:return H(k(e.type??``),String(t.value));case`label`:return H(e.label,String(t.value));case`value`:return H(e.value,String(t.value));case`text`:return H(I(e),String(t.value));case`appname`:return H(e.appName,String(t.value));case`windowtitle`:return H(e.windowTitle,String(t.value));case`visible`:return L(e)===!!t.value;case`hidden`:return!L(e)==!!t.value;case`editable`:return R(e,n)===!!t.value;case`selected`:return e.selected===!0==!!t.value;case`focused`:return e.focused===!0==!!t.value;case`enabled`:return e.enabled!==!1==!!t.value;case`hittable`:return e.hittable===!0==!!t.value;default:return!1}}function H(e,t){return n(e??``)===n(t)}function Ke(e,t,n){let r=n.requireRect??!1,i=n.requireUnique??!0,a=[];for(let[o,s]of t.selectors.entries()){let t=Qe(e,s,n.platform,r);if(a.push({selector:s.raw,matches:t.count}),!(t.count===0||!t.firstNode)){if(i&&t.count!==1){if(!n.disambiguateAmbiguous||!t.disambiguated||!t.tiebreak)continue;return{node:t.disambiguated,selector:s,selectorIndex:o,matches:t.count,diagnostics:a,disambiguation:{matchCount:t.count,tiebreak:t.tiebreak,alternatives:t.candidates.filter(e=>e!==t.disambiguated)}}}return{node:t.firstNode,selector:s,selectorIndex:o,matches:t.count,diagnostics:a}}}return null}function qe(e,t,n){let r=n.requireRect??!1;for(let[i,a]of t.selectors.entries()){let t=e.filter(e=>r&&!e.rect?!1:V(e,a,n.platform));if(t.length>0)return{selector:a,selectorIndex:i,matchedNodes:t}}return null}function Je(e,t,n){let r=n.requireRect??!1,i=[];for(let[a,o]of t.selectors.entries()){let t=nt(e,o,n.platform,r);if(i.push({selector:o.raw,matches:t}),t>0)return{selectorIndex:a,selector:o,matches:t,diagnostics:i}}return null}const Ye=`Snapshot refs expire when the UI changes. Run snapshot -i and retry with a fresh @ref.`;function Xe(e){return e.some(e=>e.matches>1)?`Add more terms to disambiguate (e.g. role=button text="Sign in"), use an @ref from snapshot -i, or use find <text> --first/--last.`:`Selector text/label values match exactly (quote multi-word values: text="Sign in"). Run snapshot -i to see current elements and refs, or use find <text> for contains matching.`}function Ze(e,t,n){if(t.length===0)return`Selector did not match: ${e.raw}`;let r=t.map(e=>`${e.selector} -> ${e.matches}`).join(`, `);return n.unique??!0?`Selector did not resolve uniquely (${r})`:`Selector did not match (${r})`}function Qe(e,t,n,r){let i=0,a=null,o=[],s={best:null,bestVisible:!1,tie:!1},c,l=t=>(c??=g(e),ae(t,e,c));for(let c of e)r&&!c.rect||V(c,t,n)&&(i+=1,a??=c,o.push(c),$e(s,c,l));return{count:i,firstNode:a,disambiguated:s.tie?null:s.best,tiebreak:s.tie?null:et(o,s.best,l),candidates:o}}function $e(e,t,n){if(!e.best){e.best=t;return}e.bestVisible||=n(e.best);let r=n(t);if(r!==e.bestVisible){r&&(e.best=t,e.bestVisible=!0,e.tie=!1);return}let i=rt(t,e.best);i.result>0?(e.best=t,e.tie=!1):i.result===0&&(e.tie=!0)}function et(e,t,n){if(!t)return null;let r=null;for(let i of e)i!==t&&(!r||tt(i,r,n).result>0)&&(r=i);return r?tt(t,r,n).criterion:null}function tt(e,t,n){let r=n(e);return r===n(t)?rt(e,t):{result:r?1:-1,criterion:`visible`}}function nt(e,t,n,r){let i=0;for(let a of e)r&&!a.rect||V(a,t,n)&&(i+=1);return i}function rt(e,t){let n=e.depth??0,r=t.depth??0;if(n!==r)return{result:n>r?1:-1,criterion:`deepest`};let i=it(e),a=it(t);return i===a?{result:0,criterion:null}:{result:i<a?1:-1,criterion:`smallest-area`}}function it(e){return e.rect?e.rect.width*e.rect.height:1/0}const at=/^#\s*agent-device:target-v(\d+)(?:\s+(\S.*))?$/,ot=4096;function U(e){return e.normalize(`NFC`)}function st(e){if(e===void 0)return;let t=U(e);return t.length>0?t:void 0}function ct(e){return U(e)}function lt(e){if(e===void 0)return;let t=U(e).trim().replace(/\s+/g,` `);return t.length>0?t:void 0}function W(e){return Buffer.byteLength(e,`utf8`)}function G(e,t){if(W(e)<=t)return e;let n=e.length;for(;n>0&&W(e.slice(0,n))>t;)--n;if(n>0){let t=e.charCodeAt(n-1);t>=55296&&t<=56319&&--n}return e.slice(0,n)}function ut(e){let t={};return e.id!==void 0&&(t.id=e.id),t.role=e.role,e.label!==void 0&&(t.label=e.label),t.ancestry=e.ancestry.map(dt),t.sibling=e.sibling,t.viewportOrder=e.viewportOrder,e.scrollRegion&&(t.scrollRegion=ft(e.scrollRegion)),e.rect&&(t.rect=pt(e.rect)),t.verification=e.verification,t}function dt(e){let t={role:e.role};return e.label!==void 0&&(t.label=e.label),t}function ft(e){let t={role:e.role};return e.id!==void 0&&(t.id=e.id),e.label!==void 0&&(t.label=e.label),t}function pt(e){return{x:e.x,y:e.y,width:e.width,height:e.height}}function mt(e){return JSON.stringify(ut(e))}function ht(e){return`# agent-device:target-v1 ${mt(e)}`}function gt(e){let t=e.trim();if(!t.startsWith(`#`))return{kind:`none`};let n=at.exec(t);return n?Number(n[1])===1?{kind:`v1`,evidence:_t((n[2]??``).trim())}:{kind:`future-version`}:{kind:`none`}}function _t(t){if(W(t)>4096)throw new e(`INVALID_ARGS`,`target-v1 annotation exceeds the ${ot}-byte payload cap.`);let n;try{n=JSON.parse(t)}catch{throw new e(`INVALID_ARGS`,`target-v1 annotation is not valid JSON.`)}if(typeof n!=`object`||!n||Array.isArray(n))throw new e(`INVALID_ARGS`,`target-v1 annotation must be a JSON object.`);let r=n,i=K(r.role,`role`),a=vt(r.id,`id`),o=q(r.label,`label`),s=yt(r.ancestry),c=xt(r.sibling,`sibling`,0),l=xt(r.viewportOrder,`viewportOrder`,0),u=St(r.scrollRegion),d=Ct(r.rect),f=wt(r.verification);return{...a===void 0?{}:{id:a},role:i,...o===void 0?{}:{label:o},ancestry:s,sibling:c,viewportOrder:l,...u?{scrollRegion:u}:{},...d?{rect:d}:{},verification:f}}function K(t,n){if(t===void 0)throw new e(`INVALID_ARGS`,`target-v1 "${n}" is required.`);if(typeof t!=`string`)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a string.`);return J(ct(t),n)}function vt(t,n){if(t===void 0)return;if(typeof t!=`string`)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a string.`);let r=st(t);return r===void 0?void 0:J(r,n)}function q(t,n){if(t===void 0)return;if(typeof t!=`string`)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a string.`);let r=lt(t);return r===void 0?void 0:J(r,n)}function J(t,n){if(W(t)>256)throw new e(`INVALID_ARGS`,`target-v1 "${n}" exceeds the 256-byte field cap.`);return t}function yt(t){if(t===void 0)return[];if(!Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "ancestry" must be an array.`);if(t.length>8)throw new e(`INVALID_ARGS`,`target-v1 "ancestry" exceeds the 8-entry cap.`);return t.map((e,t)=>bt(e,t))}function bt(t,n){if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "ancestry[${n}]" must be an object.`);let r=t,i=K(r.role,`ancestry[${n}].role`),a=q(r.label,`ancestry[${n}].label`);return{role:i,...a===void 0?{}:{label:a}}}function xt(t,n,r){if(t===void 0)return r;if(typeof t!=`number`||!Number.isSafeInteger(t)||t<0)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a non-negative integer.`);return t}function St(t){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "scrollRegion" must be an object.`);let n=t,r=K(n.role,`scrollRegion.role`),i=vt(n.id,`id`),a=q(n.label,`scrollRegion.label`);return{role:r,...i===void 0?{}:{id:i},...a===void 0?{}:{label:a}}}function Ct(t){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "rect" must be an object.`);let n=t;return{x:Y(n.x,`rect.x`),y:Y(n.y,`rect.y`),width:Y(n.width,`rect.width`),height:Y(n.height,`rect.height`)}}function Y(t,n){if(typeof t!=`number`||!Number.isFinite(t))throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a finite number.`);return t}function wt(t){if(t===`verified`||t===`unverifiable`)return t;throw new e(`INVALID_ARGS`,`target-v1 "verification" must be "verified" or "unverifiable".`)}function X(e){let t=ct(k(e.type??``)),n=st(e.identifier),r=lt(e.label);return{...n===void 0?{}:{id:G(n,256)},role:G(t,256),...r===void 0?{}:{label:G(r,256)}}}function Tt(e,t){return e.id===t.id&&e.role===t.role&&e.label===t.label}function Et(e,t){let n=0;for(let r of e)X(r).id===t&&(n+=1);return n}function Dt(e,t){if(e.id===void 0||Et(t,e.id)<=1)return e;let{role:n,label:r}=e;return{role:n,...r===void 0?{}:{label:r}}}function Z(e,t){let n=0;for(let r of e)if(r.parentIndex===t.parentIndex){if(r.index===t.index)return n;n+=1}return 0}function Ot(e,t){return{documentOrder:e.index,sibling:Z(t,e)}}function kt(e,t){return e.documentOrder===t.documentOrder&&e.sibling===t.sibling}const At=`replay_target_guard_mismatch`,jt=`wait_landmark_identity_mismatch`;function Mt(e,t,n={}){let r=[],i=k(e.type??``),a=Nt(e,n.nodes),o=$(e.label),s=$(e.value),c=$(I(e)),l=n.action===`fill`;a&&r.push(`id=${Q(a)}`),i&&o&&r.push(l?`role=${Q(i)} label=${Q(o)} editable=true`:`role=${Q(i)} label=${Q(o)}`),o&&r.push(l?`label=${Q(o)} editable=true`:`label=${Q(o)}`),s&&r.push(l?`value=${Q(s)} editable=true`:`value=${Q(s)}`),c&&c!==o&&c!==s&&r.push(l?`text=${Q(c)} editable=true`:`text=${Q(c)}`),i&&l&&!r.some(e=>e.includes(`editable=true`))&&r.push(`role=${Q(i)} editable=true`);let u=Pt(r);return u.length===0&&i&&u.push(l?`role=${Q(i)} editable=true`:`role=${Q(i)}`),u.length===0&&L(e)&&u.push(`visible=true`),u}function Nt(e,t){let n=$(e.identifier);if(!n||!t)return n;let r=X(e).id;return r===void 0?n:Et(t,r)>1?null:n}function Pt(e){return Array.from(new Set(e))}function Q(e){return JSON.stringify(e)}function $(e){return e&&e.trim()||null}export{x as $,B as A,M as B,Be as C,Ve as D,He as E,Ae as F,D as G,Ee as H,I,O as J,k as K,F as L,Me as M,R as N,We as O,L as P,oe as Q,ke as R,V as S,Ue as T,xe as U,Oe as V,Se as W,se as X,re as Y,ie as Z,Je as _,Dt as a,_ as at,Ke as b,Ot as c,ee as ct,ot as d,l as dt,ae as et,ht as f,o as ft,Ye as g,W as h,jt as i,g as it,Ne as j,Re as k,Z as l,f as lt,mt as m,s as mt,$ as n,y as nt,Tt as o,ne as ot,gt as p,c as pt,A as q,At as r,v as rt,X as s,h as st,Mt as t,C as tt,kt as u,p as ut,Ze as v,ze as w,Xe as x,qe as y,Te as z};
|
|
@@ -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{M as s,Y as c,a as l}from"./viewport-dimension.js";import{M as u,O as d,P as f,W as p}from"./sdk-batch-runner.js";import{N as m}from"./screenshot-result.js";import{c as ee,h as te,o as ne,s as h}from"./sdk-device.js";import{A as re,C as ie,E as ae,H as oe,P as se,S as ce,V as le,b as ue,x as de}from"./sdk-selectors.js";import{S as g}from"./device.js";import{i as fe,n as pe,t as me}from"./runtime.js";import{j as _}from"./sdk-android-adb.js";import{r as he}from"./app-lifecycle.js";import{h as v}from"./ime-lifecycle.js";import{j as ge}from"./runner-disposal.js";import{S as y,c as _e,g as ve,l as b,n as ye,s as x,t as be}from"./context.js";import{C as xe}from"./physical-device-control.js";import{a as S,l as Se}from"./runner-client.js";import{Ht as Ce,Qt as C,Ut as w,Vt as we,Wt as T,an as Te,g as Ee,u as De}from"./internal/daemon.js";import{a as Oe}from"./apps.js";import{i as ke}from"./session-target-evidence.js";function E(e,t){let n=fe(t);if(!n)return e;if(e.ok){let t=Ae(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:Ae(r.hint,n)}}}}function Ae(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function je(e,t,n){let r=e.get(t),i=r?.device??await ve(n??{});return r||await Ee(i),{session:r,device:i}}async function Me(e,t,n){let r=!e&&h(t);try{return await n()}finally{r&&(await Se(t.id),await Ne(t))}}async function Ne(e){let t=xe();await Oe(e,t).catch(n=>{_({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function Pe(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function Fe(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 Ie=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function D(e,t){let n=Le(t);return n.length===0?null:x(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function Le(e){if(!e)return[];let t=[];for(let[n,r]of Ie)e[n]!==void 0&&t.push(r);return t}function Re(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:x(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function ze(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function O(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 k(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:x(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function A(e,t){let n=O(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=k(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:x(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Be(e){let t=O(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...qe(e[2])};let n=Ke(e),r=A(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function Ve(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=k(t);if(!n.ok)return{ok:!1,response:n.response};let r=l(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Ge(e)},refGeneration:n.generation,text:r}:{ok:!1,response:x(`INVALID_ARGS`,`fill requires text after ref`)}}let n=O(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:x(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=He(e);return!r||r.kind!==`selector`?{ok:!1,response:x(`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:x(`INVALID_ARGS`,`fill requires text after selector`)}}function He(e){try{return l(e)}catch{return null}}function Ue(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:j(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 We(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 j(e){return e?.startsWith(`@`)?e.slice(1):e}function Ge(e){return e.length>=3&&e[1]?.trim()||``}function Ke(e){let t=e.at(-1);return e.length>1&&Je(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function qe(e){return e===void 0?{}:{durationMs:Number(e)}}function Je(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function Ye(e,n){let r=await M(e);if(r){if(v(r.foregroundPackage))return`press ${n} opened an Android permission dialog (${r.foregroundPackage}) over ${r.expectedPackage}. ${r.hint}`;throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}}async function M(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await he(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!$e(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:Qe(n)}}function Xe(e){return v(e.foregroundPackage)?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ze(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function Qe(e){return v(e)?`Use "alert get" to inspect it, then "alert accept" or "alert dismiss" to respond.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function $e(e){return e===`com.android.settings`||e===`com.android.systemui`||v(e)||e.includes(`launcher`)}function et(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 tt(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:g(e.node)}}function N(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=it(e),i=r?.kind===`ref`?R(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:rt(s)}}function P(e){let{target:t}=e;return{...t.kind===`ref`?{ref:R(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:g(e.node)}}function F(e){let{node:t,preActionNodes:n,...r}=e;return r}function nt(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 I(e){let{selectorChain:t,...n}=e;return n}function L(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=o.recordSession&&i?ke(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:m(n),...s?{targetEvidence:s}:{}})}function rt(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function it(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 R(e){return e.startsWith(`@`)?e.slice(1):e}const at=[`application`,`window`,`tabbar`,`scrollbar`,`image`],ot=new Set([`tab bar`]);async function z(e,t){if(t.ok||!st(t.error.message)||t.error.details?.captureStalled===!0||t.error.details?.captureTruncated===!0)return t;let n=await ct(e).catch(()=>null);return n?x(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function st(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function ct(e){let t=[...(await C({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(lt),n=B(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=B(t.filter(e=>!dt(e)),4,{includeIdentifiers:!1}),i=B(t.filter(ft),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function B(e,t,n){let r=new Set,i=[];for(let a of e){let e=H(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function lt(e,t){return V(e)-V(t)||ut(e,t)}function V(e){let t=!!H(e,{includeIdentifiers:!1});return(dt(e)?2:0)+ +!t}function ut(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 H(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 dt(e){let t=le(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return at.some(e=>t.includes(e))||ot.has(n)||n.endsWith(`.fill`)}function ft(e){return le(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function U(e,t){return!(!e||!h(e.device)||y(e.device)||t.skipPendingPostGestureStabilization&&e.postGestureStabilization)}function W(e){let{session:t,selectorExpression:n}=e;if(!U(t,{skipPendingPostGestureStabilization:!0}))return null;let r=p(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`||!pt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function pt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function mt(e){let t=e.identifier?.trim();if(t)return{key:`id`,value:t};let n=e.label?.trim();return n?{key:`label`,value:n}:null}function G(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 ht(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 K(e,t={}){return{artifacts:ht(e,t),policy:pe()}}async function gt(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:s}=e,l=re(n),u=c(n.rect);if(!u||h(t)&&l&&!oe(n.type??``))return l;try{let e=await ye(t,`read`,[String(u.x),String(u.y)],void 0,{...s(r,i,a),surface:o}),c=e&&typeof e==`object`?e:void 0,d=typeof c?.text==`string`?c.text:``;return d.trim()?d:(_({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),l)}catch(e){return _({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 q(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=Et(c,e.req.flags?.out),d=bt({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=xt({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await _t({params:e,request:c});c.signal?.throwIfAborted();let m={snapshot:p};return Ot({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function _t(e){let{params:t,request:n}=e,r=await J(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&kt(r)?await vt({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&s(r.snapshotQuality)?await yt({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function vt(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await J(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await J(t,n,r.query,!1)}}async function yt(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await J(t,n,r.query,!1)}catch{return i}}async function J(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await C({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,signal:t.signal})).snapshot}function bt(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)&&!Te(a)&&!wt(a,o))return r}function xt(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&St(t,r)&&Ct(i,n)&&i.presentationKey===Tt(r))return i}function St(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||Te(e)||wt(e,t))}function Ct(e,t){return t-e.createdAt<750}function wt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function Tt(e){return r(i(Dt(e)))}function Et(e,t){return JSON.stringify({presentationKey:Tt(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function Dt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Ot(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||s(i.snapshotQuality)||(T(t,i),n.set(r,t))}function kt(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function At(e){return me({backend:jt(e),...K(`selector commands`,{plural:!0}),sessions:we({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(T(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}}),signal:e.signal??ge(e.req.meta?.requestId)})}async function Y(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:_e()};let r=n?.device??await ve(e.req.flags??{});n||await Ee(r);let i=b(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:At({...e,session:n,device:r})}}function jt(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=q({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i});return{platform:te(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...Mt(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,signal:e.signal,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await gt({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 Nt(e,n,t.signal)})}}function Mt(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 Nt(e,t,n){let r=await Pt(e,t,n);return r===null?await Ft(e,t,n)===!0?!0:await Rt(e,t,n):r}async function Pt(e,t,n){return!ee(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Rt(e,t,n)}async function Ft(e,t,n){let r=It(e);return r?(await S(r.device,{command:`findText`,text:t,appBundleId:r.appBundleId},{...Lt(e,r),signal:n}))?.found===!0:null}function It(e){return!ne(e.device.platform)||y(e.device)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function Lt(e,t){return De({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Rt(e,t,n){return!!se((await zt(e,n)).nodes,t)}async function zt(e,t){let{snapshot:n}=await q({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},signal:t,cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return n}async function Bt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=u(t.positionals??[],t.flags);if(!n.ok)return x(n.code,n.message);let r=n.parsed,i=r.action;if(!f(i))return null;let a=await Y(e,{requireSession:!1,capability:`find`});return a.ok?E(await $(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});L(e.sessionStore,e.sessionName,t,et(n,i));let o=tt(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(Ce(t,[o.ref]),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}),X(e)):a.response}function X(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Vt(e){let{req:t}=e;if(t.command!==`get`)return null;let n=de(t.positionals?.[0]);if(!n.ok)return x(n.code,n.message);let r=n.format,i=en(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=D(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard;if(i.target.kind===`selector`&&!a){let t=await Kt(e,r,i.target.selector);if(t)return t}let o=await Y(e,{requireSession:!0,capability:`get`});if(!o.ok)return o.response;let s=i.target.kind===`ref`?w({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return E(await $(async()=>{let n=await o.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});L(e.sessionStore,e.sessionName,t,N(n,r),{node:n.node,preActionNodes:n.preActionNodes});let c=P(n);return s?{...c,warning:s}:c}),X(e))}async function Ht(e){let{req:t}=e;if(t.command!==`is`)return null;let n=ce(t.positionals??[]);if(!n.ok)return x(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 qt(e,r,a.selectorExpression,i);if(t)return t}let c=await Y(e,{requireSession:!0,capability:`is`});return c.ok?E(await nn(e,await $(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=Wt(n),l=F(n);return L(e.sessionStore,e.sessionName,t,l,s),I(l)}),`is ${r}`),X(e)):c.response}async function Ut(e){let{req:t,sessionName:n,sessionStore:r}=e,i=d(t.positionals??[]);if(!i)return x(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await je(r,n,t.flags);if(i.kind!==`sleep`){let e=b(`wait`,o);if(e)return e}let s=t.internal?.replayLandmarkGuard;if(i.kind===`selector`&&!s&&!a?.recordSession){let t=await Jt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let c=i,l;if(i.kind===`ref`){let e=k(i.rawRef);if(!e.ok)return e.response;c={...i,rawRef:e.ref},l=w({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let u=async()=>{let i=At({...e,session:a,device:o}),u=await $(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:tn(c,a,s)}),o=Wt(e);L(r,n,t,F(e),o,`landmark`);let u=nt(e);return l?{...u,warning:l}:u});return await nn(e,await z({req:t,logPath:e.logPath,session:a,device:o},u),`wait`)};return i.kind===`sleep`?await u():E(await Me(a,o,u),X(e))}function Wt(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Gt(e,t,n){if(!e||e.recordSession)return null;let r=W({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function Kt(e,t,n){let r=e.sessionStore.get(e.sessionName),i=Gt(r,t,n);if(!r||!i)return null;let a=await Z(e,r,i);if(Q(a))return a.response;if(!a)return null;let o=Zt(t,i.raw,a);return o?(L(e.sessionStore,e.sessionName,e.req,N(o,t)),{ok:!0,data:P(o)}):null}async function qt(e,t,n,r){if(t===`hidden`)return null;let i=await Yt(e,n);if(Q(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]}:Qt(t,r,i.selector.raw,i.session,i.result.node);return a?(L(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:I(a)}):null}async function Jt(e){let t=W({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await Z(e,e.session,t);if(Q(r))return r.response;if(!r?.found)return null;let i={kind:`selector`,selector:t.raw,waitedMs:Date.now()-n,selectorChain:[t.raw]};L(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:I(i)};return await z({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Yt(e,t){let n=e.sessionStore.get(e.sessionName),r=W({session:n,selectorExpression:t});if(!n||!r)return null;let i=await Z(e,n,r);return Q(i)?i:i?{session:n,selector:r,result:i}:null}async function Xt(e,t,n){let r=await S(e.device,{command:`querySelector`,selectorKey:t.key,selectorValue:t.value,appBundleId:e.appBundleId},n),i=r.found===!0,a=$t(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function Z(t,n,r){try{return await Xt(n,r,De({req:t.req,logPath:t.logPath,traceLogPath:n.trace?.outPath}))}catch(t){return G(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Q(e){return e!==null&&`kind`in e&&e.kind===`error`}function Zt(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 Qt(e,t,n,r,i){let a=ae({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 $t(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function en(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=k(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=ue(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:x(n.code,n.message)}}function tn(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=ie(e.text);if(!i.ok)throw new t(i.code,i.message);return{kind:`text`,text:i.text,timeoutMs:e.timeoutMs}}async function $(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return x(t.code,t.message,t.details)}}async function nn(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{i=await M(r)}catch{return t}return i?x(t.error.code,`${n} failed because ${Xe(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{Fe as C,E as D,Me as E,Re as S,je as T,Be as _,Xt as a,ze as b,mt as c,W as d,Ye as f,Ve as g,Ue as h,Ut as i,G as l,We as m,Vt as n,q as o,Ze as p,Ht as r,K as s,Bt as t,U as u,A as v,Pe as w,D as x,j 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{M as s,X as c,a as l}from"./viewport-dimension.js";import{M as u,O as d,P as f,W as p}from"./sdk-batch-runner.js";import{N as m}from"./screenshot-result.js";import{c as ee,h as te,o as ne,s as h}from"./sdk-device.js";import{D as re,E as ie,F as ae,K as oe,O as se,T as ce,j as le,q as ue,z as de}from"./sdk-selectors.js";import{i as fe}from"./session-target-evidence.js";import{S as g}from"./device.js";import{i as pe,n as me,t as he}from"./runtime.js";import{j as _}from"./sdk-android-adb.js";import{r as ge}from"./app-lifecycle.js";import{h as v}from"./ime-lifecycle.js";import{j as _e}from"./runner-disposal.js";import{S as y,c as ve,g as ye,l as b,n as be,s as x,t as xe}from"./context.js";import{C as Se}from"./physical-device-control.js";import{a as S,l as Ce}from"./runner-client.js";import{Bt as we,Ht as C,Ut as w,Vt as Te,Zt as T,g as Ee,in as De,u as Oe}from"./internal/daemon.js";import{a as ke}from"./apps.js";function E(e,t){let n=pe(t);if(!n)return e;if(e.ok){let t=Ae(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:Ae(r.hint,n)}}}}function Ae(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function je(e,t,n){let r=e.get(t),i=r?.device??await ye(n??{});return r||await Ee(i),{session:r,device:i}}async function Me(e,t,n){let r=!e&&h(t);try{return await n()}finally{r&&(await Ce(t.id),await Ne(t))}}async function Ne(e){let t=Se();await ke(e,t).catch(n=>{_({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function Pe(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function Fe(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 Ie=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function D(e,t){let n=Le(t);return n.length===0?null:x(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function Le(e){if(!e)return[];let t=[];for(let[n,r]of Ie)e[n]!==void 0&&t.push(r);return t}function Re(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:x(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function ze(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function O(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 k(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:x(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function A(e,t){let n=O(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=k(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:x(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Be(e){let t=O(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...qe(e[2])};let n=Ke(e),r=A(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function Ve(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=k(t);if(!n.ok)return{ok:!1,response:n.response};let r=l(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Ge(e)},refGeneration:n.generation,text:r}:{ok:!1,response:x(`INVALID_ARGS`,`fill requires text after ref`)}}let n=O(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:x(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=He(e);return!r||r.kind!==`selector`?{ok:!1,response:x(`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:x(`INVALID_ARGS`,`fill requires text after selector`)}}function He(e){try{return l(e)}catch{return null}}function Ue(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:j(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 We(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 j(e){return e?.startsWith(`@`)?e.slice(1):e}function Ge(e){return e.length>=3&&e[1]?.trim()||``}function Ke(e){let t=e.at(-1);return e.length>1&&Je(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function qe(e){return e===void 0?{}:{durationMs:Number(e)}}function Je(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function Ye(e,n){let r=await M(e);if(r){if(v(r.foregroundPackage))return`press ${n} opened an Android permission dialog (${r.foregroundPackage}) over ${r.expectedPackage}. ${r.hint}`;throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}}async function M(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await ge(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!$e(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:Qe(n)}}function Xe(e){return v(e.foregroundPackage)?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ze(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function Qe(e){return v(e)?`Use "alert get" to inspect it, then "alert accept" or "alert dismiss" to respond.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function $e(e){return e===`com.android.settings`||e===`com.android.systemui`||v(e)||e.includes(`launcher`)}function et(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 tt(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:g(e.node)}}function N(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=it(e),i=r?.kind===`ref`?R(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:rt(s)}}function P(e){let{target:t}=e;return{...t.kind===`ref`?{ref:R(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:g(e.node)}}function F(e){let{node:t,preActionNodes:n,...r}=e;return r}function nt(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 I(e){let{selectorChain:t,...n}=e;return n}function L(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=o.recordSession&&i?fe(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:m(n),...s?{targetEvidence:s}:{}})}function rt(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function it(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 R(e){return e.startsWith(`@`)?e.slice(1):e}const at=[`application`,`window`,`tabbar`,`scrollbar`,`image`],ot=new Set([`tab bar`]);async function z(e,t){if(t.ok||!st(t.error.message)||t.error.details?.captureStalled===!0||t.error.details?.captureTruncated===!0)return t;let n=await ct(e).catch(()=>null);return n?x(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function st(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function ct(e){let t=[...(await T({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(lt),n=B(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=B(t.filter(e=>!dt(e)),4,{includeIdentifiers:!1}),i=B(t.filter(ft),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function B(e,t,n){let r=new Set,i=[];for(let a of e){let e=H(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function lt(e,t){return V(e)-V(t)||ut(e,t)}function V(e){let t=!!H(e,{includeIdentifiers:!1});return(dt(e)?2:0)+ +!t}function ut(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 H(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 dt(e){let t=oe(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return at.some(e=>t.includes(e))||ot.has(n)||n.endsWith(`.fill`)}function ft(e){return oe(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function U(e,t){return!(!e||!h(e.device)||y(e.device)||t.skipPendingPostGestureStabilization&&e.postGestureStabilization)}function W(e){let{session:t,selectorExpression:n}=e;if(!U(t,{skipPendingPostGestureStabilization:!0}))return null;let r=p(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`||!pt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function pt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function mt(e){let t=e.identifier?.trim();if(t)return{key:`id`,value:t};let n=e.label?.trim();return n?{key:`label`,value:n}:null}function G(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 ht(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 K(e,t={}){return{artifacts:ht(e,t),policy:me()}}async function gt(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:s}=e,l=ae(n),u=c(n.rect);if(!u||h(t)&&l&&!ue(n.type??``))return l;try{let e=await be(t,`read`,[String(u.x),String(u.y)],void 0,{...s(r,i,a),surface:o}),c=e&&typeof e==`object`?e:void 0,d=typeof c?.text==`string`?c.text:``;return d.trim()?d:(_({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),l)}catch(e){return _({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 q(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=Et(c,e.req.flags?.out),d=bt({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=xt({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await _t({params:e,request:c});c.signal?.throwIfAborted();let m={snapshot:p};return Ot({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function _t(e){let{params:t,request:n}=e,r=await J(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&kt(r)?await vt({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&s(r.snapshotQuality)?await yt({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function vt(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await J(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await J(t,n,r.query,!1)}}async function yt(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await J(t,n,r.query,!1)}catch{return i}}async function J(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await T({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,signal:t.signal})).snapshot}function bt(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)&&!De(a)&&!wt(a,o))return r}function xt(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&St(t,r)&&Ct(i,n)&&i.presentationKey===Tt(r))return i}function St(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||De(e)||wt(e,t))}function Ct(e,t){return t-e.createdAt<750}function wt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function Tt(e){return r(i(Dt(e)))}function Et(e,t){return JSON.stringify({presentationKey:Tt(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function Dt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Ot(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||s(i.snapshotQuality)||(w(t,i),n.set(r,t))}function kt(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function At(e){return he({backend:jt(e),...K(`selector commands`,{plural:!0}),sessions:we({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))}}),signal:e.signal??_e(e.req.meta?.requestId)})}async function Y(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 ye(e.req.flags??{});n||await Ee(r);let i=b(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:At({...e,session:n,device:r})}}function jt(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=q({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i});return{platform:te(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...Mt(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,signal:e.signal,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await gt({device:r,node:o,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>xe(i??``,e,t,n))})}),findText:async(t,n)=>({found:await Nt(e,n,t.signal)})}}function Mt(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 Nt(e,t,n){let r=await Pt(e,t,n);return r===null?await Ft(e,t,n)===!0?!0:await Rt(e,t,n):r}async function Pt(e,t,n){return!ee(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Rt(e,t,n)}async function Ft(e,t,n){let r=It(e);return r?(await S(r.device,{command:`findText`,text:t,appBundleId:r.appBundleId},{...Lt(e,r),signal:n}))?.found===!0:null}function It(e){return!ne(e.device.platform)||y(e.device)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function Lt(e,t){return Oe({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Rt(e,t,n){return!!de((await zt(e,n)).nodes,t)}async function zt(e,t){let{snapshot:n}=await q({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},signal:t,cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return n}async function Bt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=u(t.positionals??[],t.flags);if(!n.ok)return x(n.code,n.message);let r=n.parsed,i=r.action;if(!f(i))return null;let a=await Y(e,{requireSession:!1,capability:`find`});return a.ok?E(await $(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});L(e.sessionStore,e.sessionName,t,et(n,i));let o=tt(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(Te(t,[o.ref]),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}),X(e)):a.response}function X(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Vt(e){let{req:t}=e;if(t.command!==`get`)return null;let n=ie(t.positionals?.[0]);if(!n.ok)return x(n.code,n.message);let r=n.format,i=en(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=D(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard;if(i.target.kind===`selector`&&!a){let t=await Kt(e,r,i.target.selector);if(t)return t}let o=await Y(e,{requireSession:!0,capability:`get`});if(!o.ok)return o.response;let s=i.target.kind===`ref`?C({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return E(await $(async()=>{let n=await o.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});L(e.sessionStore,e.sessionName,t,N(n,r),{node:n.node,preActionNodes:n.preActionNodes});let c=P(n);return s?{...c,warning:s}:c}),X(e))}async function Ht(e){let{req:t}=e;if(t.command!==`is`)return null;let n=re(t.positionals??[]);if(!n.ok)return x(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 qt(e,r,a.selectorExpression,i);if(t)return t}let c=await Y(e,{requireSession:!0,capability:`is`});return c.ok?E(await nn(e,await $(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=Wt(n),l=F(n);return L(e.sessionStore,e.sessionName,t,l,s),I(l)}),`is ${r}`),X(e)):c.response}async function Ut(e){let{req:t,sessionName:n,sessionStore:r}=e,i=d(t.positionals??[]);if(!i)return x(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await je(r,n,t.flags);if(i.kind!==`sleep`){let e=b(`wait`,o);if(e)return e}let s=t.internal?.replayLandmarkGuard;if(i.kind===`selector`&&!s&&!a?.recordSession){let t=await Jt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let c=i,l;if(i.kind===`ref`){let e=k(i.rawRef);if(!e.ok)return e.response;c={...i,rawRef:e.ref},l=C({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let u=async()=>{let i=At({...e,session:a,device:o}),u=await $(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:tn(c,a,s)}),o=Wt(e);L(r,n,t,F(e),o,`landmark`);let u=nt(e);return l?{...u,warning:l}:u});return await nn(e,await z({req:t,logPath:e.logPath,session:a,device:o},u),`wait`)};return i.kind===`sleep`?await u():E(await Me(a,o,u),X(e))}function Wt(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Gt(e,t,n){if(!e||e.recordSession)return null;let r=W({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function Kt(e,t,n){let r=e.sessionStore.get(e.sessionName),i=Gt(r,t,n);if(!r||!i)return null;let a=await Z(e,r,i);if(Q(a))return a.response;if(!a)return null;let o=Zt(t,i.raw,a);return o?(L(e.sessionStore,e.sessionName,e.req,N(o,t)),{ok:!0,data:P(o)}):null}async function qt(e,t,n,r){if(t===`hidden`)return null;let i=await Yt(e,n);if(Q(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]}:Qt(t,r,i.selector.raw,i.session,i.result.node);return a?(L(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:I(a)}):null}async function Jt(e){let t=W({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await Z(e,e.session,t);if(Q(r))return r.response;if(!r?.found)return null;let i={kind:`selector`,selector:t.raw,waitedMs:Date.now()-n,selectorChain:[t.raw]};L(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:I(i)};return await z({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Yt(e,t){let n=e.sessionStore.get(e.sessionName),r=W({session:n,selectorExpression:t});if(!n||!r)return null;let i=await Z(e,n,r);return Q(i)?i:i?{session:n,selector:r,result:i}:null}async function Xt(e,t,n){let r=await S(e.device,{command:`querySelector`,selectorKey:t.key,selectorValue:t.value,appBundleId:e.appBundleId},n),i=r.found===!0,a=$t(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function Z(t,n,r){try{return await Xt(n,r,Oe({req:t.req,logPath:t.logPath,traceLogPath:n.trace?.outPath}))}catch(t){return G(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Q(e){return e!==null&&`kind`in e&&e.kind===`error`}function Zt(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 Qt(e,t,n,r,i){let a=le({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 $t(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function en(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=k(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=ce(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:x(n.code,n.message)}}function tn(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=se(e.text);if(!i.ok)throw new t(i.code,i.message);return{kind:`text`,text:i.text,timeoutMs:e.timeoutMs}}async function $(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return x(t.code,t.message,t.details)}}async function nn(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{i=await M(r)}catch{return t}return i?x(t.error.code,`${n} failed because ${Xe(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{Fe as C,E as D,Me as E,Re as S,je as T,Be as _,Xt as a,ze as b,mt as c,W as d,Ye as f,Ve as g,Ue as h,Ut as i,G as l,We as m,Vt as n,q as o,Ze as p,Ht as r,K as s,Bt as t,U as u,A as v,Pe as w,D as x,j as y};
|