agent-device 0.14.1 → 0.14.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,26 @@
1
+ let e;import{__webpack_require__ as t}from"./rslib-runtime.js";import n,{existsSync as r,promises as a}from"node:fs";import i from"node:path";import o from"node:fs/promises";import s,{hostname as l}from"node:os";import{XMLParser as d}from"fast-xml-parser";import{createHash as u}from"node:crypto";import{fileURLToPath as c}from"node:url";import p from"node:net";import{AsyncLocalStorage as f}from"node:async_hooks";import{PNG as h}from"pngjs";import{toAppErrorCode as m,asAppError as w,normalizeError as g,AppError as y}from"./9152.js";import{findNodeByRef as b,normalizeRef as v,centerOfRect as I,attachRefs as A}from"./4057.js";import{parseUiHierarchy as x,ensureAndroidSnapshotHelper as S,parseUiHierarchyTree as N,readNodeAttributes as _,captureAndroidSnapshotWithHelper as k,parseBounds as M,isScrollableNodeLike as D,parseAndroidSnapshotHelperManifest as E,forgetAndroidSnapshotHelperInstall as O,isScrollableType as C,buildUiHierarchySnapshot as R}from"./221.js";import{runCmdBackground as P,runCmdStreaming as T,runCmdSync as L,runCmd as $,resolveExecutableOverridePath as F,whichCmd as U}from"./9818.js";import{resolveIosSimulatorDeviceSetPath as G,resolveIosDeviceDeepLinkBundleId as V,withRetry as B,closeAndroidApp as j,Deadline as q,isEnvTruthy as X,adb_adbArgs as H,ensureAdb as z,openAndroidApp as K,TIMEOUT_PROFILES as Y,classifyBootFailure as W,openAndroidDevice as J,bootFailureHint as Z,listAndroidDevices as Q,getAndroidAppState as ee,retryWithPolicy as et,resolveAndroidSerialAllowlist as en,createAppResolutionCache as er,isDeepLinkTarget as ea,isClipboardShellUnsupported as ei,createDeviceAdbExecutor as eo}from"./6953.js";import{readVersion as es,findProjectRoot as el,successText as ed,withSuccessText as eu}from"./3675.js";import{sleep as ec,resolveTimeoutMs as ep,resolveTimeoutSeconds as ef}from"./4829.js";import{materializeInstallablePath as eh,isTrustedInstallSourceUrl as em}from"./989.js";import{isProcessGroupAlive as ew,isProcessAlive as eg,readProcessStartTime as ey}from"./8656.js";import{withDiagnosticTimer as eb,getDiagnosticsMeta as ev,emitDiagnostic as eI}from"./7599.js";import{splitSelectorFromArgs as eA,trimText as ex,extractNodeText as eS,tryParseSelectorChain as eN,parseSelectorChain as e_,isNodeVisible as ek,isNodeEditable as eM,pruneGroupNodes as eD,buildTextPreview as eE,findNearestHittableAncestor as eO,buildSelectorChainForNode as eC,extractNodeReadText as eR,splitIsSelectorArgs as eP,findNodeByLabel as eT,resolveRefLabel as eL,describeTextSurface as e$,extractReadableText as eF,findSelectorChainMatch as eU,resolveSelectorChain as eG,normalizeType as eV,formatSelectorFailure as eB,isFillableType as ej}from"./940.js";import{findBestMatchesByLocator as eq,parseFindArgs as eX}from"./7556.js";import"./7847.js";var eH={};function ez(e){let t=e.direction,n="up"===t||"down"===t?e.referenceHeight:e.referenceWidth,r=function(e){if(void 0===e)return .6;if(!Number.isFinite(e)||e<=0)throw new y("INVALID_ARGS","scroll amount must be a positive number");return e}(e.amount),a=void 0!==e.pixels?function(e){if(!Number.isFinite(e)||e<=0)throw new y("INVALID_ARGS","scroll pixels must be a positive integer");return Math.max(1,Math.round(e))}(e.pixels):Math.round(n*r),i=Math.max(1,Math.round(.05*n)),o=Math.max(1,Math.min(a,Math.max(1,n-2*i))),s=Math.round(o/2),l=Math.round(e.referenceWidth/2),d=Math.round(e.referenceHeight/2),u=(n,r,a,i)=>({direction:t,x1:n,y1:r,x2:a,y2:i,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:o});switch(t){case"up":return u(l,d-s,l,d+s);case"down":return u(l,d+s,l,d-s);case"left":return u(l-s,d,l+s,d);case"right":return u(l+s,d,l-s,d)}}function eK(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function eY(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 eW(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function eJ(e){return new Map(e.map(e=>[e.index,e]))}function eZ(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||""}function eQ(e){if(0===e.length)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:a}=e0(e),i=0===n.size?e:e.filter(e=>n.has(e.index));return{nodes:i.map(e=>(function(e,t){let n=t.get(e.index);if(!n||0===n.size)return e;let r=!!(!0===e.hiddenContentAbove||n.has("above"))||void 0,a=!!(!0===e.hiddenContentBelow||n.has("below"))||void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:a}})(e,a.directionsByContainer)),hiddenCount:0===n.size?0:e.length-i.length,summaryLines:function(e,t,n){let r=new Map;for(let a of e){let e=function(e,t,n){if(!e.rect)return null;let r=e2(e,t,n);return r?e3(e.rect,r):null}(a,t,n);if(!e)continue;let i=r.get(e)??[];i.push(a),r.set(e,i)}return["above","below"].flatMap(e=>{let t=r.get(e);if(!t||0===t.length)return[];let n=(function(e){let t=new Set,n=[];for(let r of e){let e=eZ(r);!e||t.has(e)||(t.add(e),n.push(e))}return n})(t).slice(0,3).map(e=>`"${e}"`),a=1===t.length?"interactive item":"interactive items",i=n.length>0?`: ${n.join(", ")}`:"";return[`[off-screen ${e}] ${t.length} ${a}${i}`]})}(r.filter(e=>!a.coveredNodeIndexes.has(e.index)&&function(e){if(!0===e.hittable)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")||!!eZ(e)}(e)),e,t)}}function e0(e){let t=eJ(e),n=new Set,r=[];for(let a of e){if(e1(a,e,t)){!function(e,t,n){let r=e,a=new Set;for(;r&&!a.has(r.index);)a.add(r.index),t.add(r.index),r="number"==typeof r.parentIndex?n.get(r.parentIndex):void 0}(a,n,t);continue}r.push(a)}let a=function(e,t,n,r){let a=new Map,i=new Set;for(let e of t){if(!e.rect)continue;let t=e5(e,n,r);if(!t?.rect)continue;let o=e3(e.rect,t.rect);if(!o)continue;let s=a.get(t.index)??new Set;s.add(o),a.set(t.index,s),i.add(e.index)}return function(e,t,n,r){for(let a of e){let e=function(e){let t=function(e,t){if(!(e?.trim().toLowerCase()??"").includes("vertical scroll bar"))return null;let n=function(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}(t);return null===n?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}(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}(a);if(!e||0===e.size)continue;let i=e5(a,t,n);if(!i)continue;let o=r.get(i.index)??new Set;for(let t of e)o.add(t);r.set(i.index,o)}}(e,n,r,a),{directionsByContainer:a,coveredNodeIndexes:i}}(e,r,n,t);return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:a}}function e1(e,t,n=eJ(t)){var r;if(!e.rect)return!0;let a=e2(e,t,n);return!a||(r=e.rect,eW(r.x,r.x+r.width,a.x,a.x+a.width)&&eW(r.y,r.y+r.height,a.y,a.y+a.height))}function e2(e,t,n=eJ(t)){let r=function(e,t){let n="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,r=new Set;for(;n&&!r.has(n.index);){if(r.add(n.index),n.rect&&D(n))return n.rect;n="number"==typeof n.parentIndex?t.get(n.parentIndex):void 0}return null}(e,n);return r||function(e,t){let n=I(t),r=e.filter(e=>{var t;return!!(t=e.rect)&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&Number.isFinite(t.width)&&Number.isFinite(t.height)}),a=r.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}),i=eY(a.map(e=>e.rect).filter(e=>eK(e,n.x,n.y)));if(i)return i;let o=eY(a.map(e=>e.rect));if(o)return o;let s=eY(r.map(e=>e.rect).filter(e=>eK(e,n.x,n.y)));return s||null}(t,e.rect??{x:0,y:0,width:0,height:0})}function e3(e,t){return e.y+e.height<=t.y?"above":e.y>=t.y+t.height?"below":null}function e5(e,t,n){let r="number"==typeof e.parentIndex?n.get(e.parentIndex):void 0,a=new Set;for(;r&&!a.has(r.index);){if(a.add(r.index),t.has(r.index)&&D(r))return r;r="number"==typeof r.parentIndex?n.get(r.parentIndex):void 0}return null}function e4(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function e8(e,t){let n=Math.max(24,Math.round(.2*Math.min(e.size,t.size))),r=Math.max(48,Math.round(.15*Math.min(e.crossSize,t.crossSize)));return Math.abs(e.size-t.size)<=n&&Math.abs(e.crossSize-t.crossSize)<=r}function e6(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}t.r(eH),t.d(eH,{TM:()=>ie,ensureBootedSimulator:()=>nv,installIosApp:()=>ir,installIosInstallablePath:()=>ii,listIosApps:()=>iu,L5:()=>a9,IJ:()=>a7,TJ:()=>il,J7:()=>io,reinstallIosApp:()=>ia,resolveIosApp:()=>a6,kc:()=>aq,Cm:()=>id,ap:()=>is});async function e9(e,t={}){let n=await e7(e,t),r=n.xml;if(!t.interactiveOnly){let a=x(r,800,t);return function(e,t){for(let[n,r]of e){let e=t[n];e&&(r.hiddenContentAbove&&(e.hiddenContentAbove=!0),r.hiddenContentBelow&&(e.hiddenContentBelow=!0))}}(await tn(e,a.nodes),a.nodes),{...a,androidSnapshot:n.metadata}}let a=N(r),i=R(a,800,{...t,interactiveOnly:!1}),o=R(a,800,t),s=await tn(e,i.nodes);tl(s,i,o),0===s.size&&tl(function(e){if(0===e.length)return new Map;let{hintedContainers:t}=e0(e);var n=t.directionsByContainer;let r=new Map;for(let[e,t]of n){let n={};t.has("above")&&(n.hiddenContentAbove=!0),t.has("below")&&(n.hiddenContentBelow=!0),(n.hiddenContentAbove||n.hiddenContentBelow)&&r.set(e,n)}return r}(A(i.nodes)),i,o);let{sourceNodes:l,...d}=o;return{...d,androidSnapshot:n.metadata}}async function e7(e,t){let n=await te(t.helperArtifact);if(n.artifact){var r;let a=(r=e,`${r.platform}:${r.id}`);try{let r=t.helperAdb??eo(e),i=await S({adb:r,artifact:n.artifact,deviceKey:a,installPolicy:t.helperInstallPolicy,timeoutMs:3e4}),o=await k({adb:r,packageName:n.artifact.manifest.packageName,instrumentationRunner:n.artifact.manifest.instrumentationRunner,waitForIdleTimeoutMs:500,timeoutMs:8e3,commandTimeoutMs:13e3});return{xml:o.xml,metadata:{backend:"android-helper",helperVersion:n.artifact.manifest.version,helperApiVersion:o.metadata.helperApiVersion,installReason:i.reason,waitForIdleTimeoutMs:o.metadata.waitForIdleTimeoutMs,timeoutMs:o.metadata.timeoutMs,maxDepth:o.metadata.maxDepth,maxNodes:o.metadata.maxNodes,rootPresent:o.metadata.rootPresent,captureMode:o.metadata.captureMode,windowCount:o.metadata.windowCount,nodeCount:o.metadata.nodeCount,helperTruncated:o.metadata.truncated,elapsedMs:o.metadata.elapsedMs}}}catch(t){return O({deviceKey:a,packageName:n.artifact.manifest.packageName,versionCode:n.artifact.manifest.versionCode}),await tt(e,g(t).message)}}return await tt(e,n.fallbackReason)}async function te(e){if(e)return{artifact:e};let t=es(),n=i.join(el(),"android-snapshot-helper","dist"),r=i.join(n,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await o.access(r)}catch{return{}}try{let e=E(JSON.parse(await o.readFile(r,"utf8"))),t=i.join(n,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await o.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:g(e).message}}}async function tt(e,t){return{xml:await tr(e),metadata:{backend:"uiautomator-dump",...t?{fallbackReason:t}:{}}}}async function tn(e,t){if(!t.some(e=>C(e.type)))return new Map;let n=await ts(e);return n?function(e,t){let n=function(e){let t={className:"root",rect:{x:0,y:0,width:0,height:0},children:[]},n=[{indent:-1,node:t}],r=/^(\s*)([\w.$]+)\{[^}]* (-?\d+),(-?\d+)-(-?\d+),(-?\d+) #/;for(let t of e.split("\n")){let e=r.exec(t);if(!e)continue;let a=e[1].length,i=Number(e[3]),o=Number(e[4]),s=Number(e[5]),l=Number(e[6]),d={className:e[2],rect:{x:i,y:o,width:Math.max(0,s-i),height:Math.max(0,l-o)},children:[]};for(;n.length>1&&a<=n[n.length-1].indent;)n.pop();n[n.length-1].node.children.push(d),n.push({indent:a,node:d})}return t.children.length>0?t:null}(t);if(!n)return new Map;let r=function(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();if(C(e.className)){let n=function(e){let t=e.children[0];if(!t)return null;let n=Math.max(t.rect.height,...t.children.map(e=>e.rect.y+e.rect.height)),r=t.children.filter(e=>e.rect.height>0).map(t=>e6(t.rect,e.rect)).sort((e,t)=>e.start-t.start);return 0===r.length?null:{rect:e.rect,contentExtent:n,contentBlocks:r}}(e);n&&t.push(n)}n.push(...e.children)}return t}(n);if(0===r.length)return new Map;let a=new Map;for(let t of e){if(!t.rect||!C(t.type))continue;let n=function(e,t){let n=null,r=1/0;for(let a of t){let t=Math.abs(a.rect.width-e.width)+Math.abs(a.rect.height-e.height);if(t>32)continue;let i=4*t+(Math.abs(a.rect.x-e.x)+Math.abs(a.rect.y-e.y));i<r&&(n=a,r=i)}return n}(t.rect,r);if(!n)continue;let i=function(e,t){let n=function(e,t){let n=t,r=new Set;for(;!r.has(n.index);){var a,i;r.add(n.index);let o=e.filter(e=>e.parentIndex===n.index&&e.rect);if(1!==o.length)return n;let s=o[0];if(a=s.rect,i=t.rect,a.x!==i.x||a.y!==i.y||a.width!==i.width||a.height!==i.height)return n;n=s}return t}(e,t);return e.filter(e=>e.parentIndex===n.index&&e.rect).map(e=>e.rect).filter(e=>e.height>0).sort((e,t)=>e.y-t.y).map(e=>e6(e,t.rect))}(e,t),o=function(e){let{viewportRect:t,visibleBlocks:n,nativeScrollView:r}=e;if(0===n.length||0===r.contentBlocks.length)return null;let a=function(e){if(0===e.contentBlocks.length)return null;let t=e.contentBlocks[0],n=e.contentBlocks[e.contentBlocks.length-1];if(!t||!n)return null;let r=e4(e.contentBlocks.map(e=>e.size))??e.rect.height,a=Math.max(48,Math.round(.5*r)),i=Math.max(24,Math.round(.25*r)),o=t.start>=a,s=e.contentExtent-(n.start+n.size)>=i;return o||s?{above:o,below:s}:null}(r),i=function(e,t){let n=new Map;for(let r of e)for(let e of t){if(!e8(r,e))continue;let t=r.start-e.start,a=8*Math.round(t/8),i=n.get(a)??[];i.push(t),n.set(a,i)}let r=null;for(let e of n.values())(!r||e.length>r.length)&&(r=e);if(!r||r.length<2)return null;let a=[...r].sort((e,t)=>e-t);return a[Math.floor(a.length/2)]??null}(r.contentBlocks,n)??function(e){let{nativeBlocks:t,visibleBlocks:n,viewportExtent:r,contentExtent:a}=e,i=[],o=[];for(let e of t)for(let t of n){if(!e8(e,t))continue;let n=e.start-t.start;16>=Math.abs(n)&&i.push(n),16>=Math.abs(n+r-a)&&o.push(n)}return o.length>0?e4(o):i.length>0?e4(i):null}({nativeBlocks:r.contentBlocks,visibleBlocks:n,viewportExtent:t.height,contentExtent:r.contentExtent});if(null===i)return a;let o=t.height;return{above:(a?.above??!1)||i>16,below:(a?.below??!1)||i+o<r.contentExtent-16}}({viewportRect:t.rect,visibleBlocks:i,nativeScrollView:n});if(!o)continue;let s={};o.above&&(s.hiddenContentAbove=!0),o.below&&(s.hiddenContentBelow=!0),(s.hiddenContentAbove||s.hiddenContentBelow)&&a.set(t.index,s)}return a}(t,n):new Map}async function tr(e){try{return await B(()=>ta(e),{shouldRetry:to})}catch(e){if(function(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code||"number"!=typeof e.details?.timeoutMs)return!1;let t=e.details?.cmd,n=e.details?.args,r=Array.isArray(n)?n.map(String):"string"==typeof n?n.split(/\s+/):[];return"adb"===t&&r.includes("uiautomator")&&r.includes("dump")}(e)){let t="If the app has looping animations, use screenshot as visual truth, try settings animations off, then retry snapshot. Stock Android UIAutomator may still time out on app-owned infinite animations.";throw new y("COMMAND_FAILED",`Android UI hierarchy dump timed out while waiting for the UI to become idle. ${t}`,{...e.details??{},hint:t},e)}throw e}}async function ta(e){var t,n,r;let a,i,o=await $("adb",H(e,["exec-out","uiautomator","dump","/dev/tty"]),{allowFailure:!0,timeoutMs:8e3}),s=ti(o.stdout,o.stderr);if(s)return s;let l="/sdcard/window_dump.xml",d=await $("adb",H(e,["shell","uiautomator","dump",l]),{allowFailure:!0,timeoutMs:8e3}),u=(t=l,n=d.stdout,r=d.stderr,a=`${n}
2
+ ${r}`,i=/dumped to:\s*(\S+)/i.exec(a),i?.[1]??t),c=await $("adb",H(e,["shell","cat",u])),p=ti(c.stdout,c.stderr);if(!p)throw new y("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:c.stdout,stderr:c.stderr});return p}function ti(e,t){let n=`${e}
3
+ ${t}`,r=n.indexOf("<?xml"),a=r>=0?r:n.indexOf("<hierarchy");if(a<0)return null;let i=n.lastIndexOf("</hierarchy>");if(i<0||i<a)return null;let o=n.slice(a,i+12).trim();return o.length>0?o:null}function to(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,n=("string"==typeof t?t:"").toLowerCase();return!!(n.includes("device offline")||n.includes("device not found")||n.includes("transport error")||n.includes("connection reset")||n.includes("broken pipe")||n.includes("timed out")||n.includes("no such file or directory"))}async function ts(e){try{let t=await $("adb",H(e,["shell","dumpsys","activity","top"]),{allowFailure:!0,timeoutMs:8e3}),n=`${t.stdout}
4
+ ${t.stderr}`.trim();return n.length>0?n:null}catch{return null}}function tl(e,t,n){if(0===e.size)return;let r=new Map;for(let[e,t]of n.sourceNodes.entries()){let a=n.nodes[e];a&&r.set(t,a)}for(let[n,a]of e){let e=t.sourceNodes[n];if(!e)continue;let i=r.get(e);i&&(a.hiddenContentAbove&&(i.hiddenContentAbove=!0),a.hiddenContentBelow&&(i.hiddenContentBelow=!0))}}async function td(e,t,n){await $("adb",H(e,["shell","input","tap",String(t),String(n)]))}async function tu(e,t,n,r,a,i=250){await $("adb",H(e,["shell","input","swipe",String(t),String(n),String(r),String(a),String(i)]))}async function tc(e){await $("adb",H(e,["shell","input","keyevent","4"]))}async function tp(e){await $("adb",H(e,["shell","input","keyevent","3"]))}async function tf(e,t){let n=function(e){switch(e){case"portrait":return"0";case"landscape-left":return"1";case"portrait-upside-down":return"2";case"landscape-right":return"3";default:throw new y("INVALID_ARGS",`Unsupported Android rotation: ${e}`)}}(t);await $("adb",H(e,["shell","settings","put","system","accelerometer_rotation","0"])),await $("adb",H(e,["shell","settings","put","system","user_rotation",n]))}async function th(e){await $("adb",H(e,["shell","input","keyevent","187"]))}async function tm(e,t,n,r=800){await $("adb",H(e,["shell","input","swipe",String(t),String(n),String(t),String(n),String(r)]))}async function tw(e,t,n=0){n>0&&Array.from(t).length>1?await tS(e,t,1,n):await tg(e,t)}async function tg(e,t){let n=tN(t);if(!n||"ok"!==await t_(e,t))try{let n=t.replace(/ /g,"%s");await $("adb",H(e,["shell","input","text",n]))}catch(e){if(n&&function(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,n=("string"==typeof t?t:"").toLowerCase();return!!(n.includes("exception occurred while executing 'text'")||n.includes("nullpointerexception")&&n.includes("inputshellcommand.sendtext"))}(e))throw new y("COMMAND_FAILED","Non-ASCII text input is not supported on this Android shell. Install an ADB keyboard IME or use ASCII input.",{textPreview:t.slice(0,32)},e instanceof Error?e:void 0);throw e}}async function ty(e,t,n){await td(e,t,n)}async function tb(e,t,n,r,a=0){let i=Array.from(r).length,o=tN(r),s=[{strategy:"input_text",clearPadding:12,minClear:8,maxClear:48}];!o&&a<=0&&s.push({strategy:"clipboard_paste",clearPadding:12,minClear:8,maxClear:48}),(!o||a>0)&&s.push({strategy:"chunked_input",clearPadding:24,minClear:16,maxClear:96});let l=null;for(let o of s){var d,u;await ty(e,t,n);let s=(d=i+o.clearPadding,u=o.minClear,Math.max(u,Math.min(o.maxClear,d)));if(await tk(e,s),"input_text"===o.strategy)await tw(e,r,a);else if("clipboard_paste"===o.strategy){if("ok"!==await t_(e,r))continue}else await tS(e,r,1,a>0?a:15);let c=await tv(e,t,n,r);if(l=c.actual,c.ok)return}throw new y("COMMAND_FAILED","Android fill verification failed",{expected:r,actual:l??null})}async function tv(e,t,n,r){let a=null;for(let i of[0,150,350])if(i>0&&await ec(i),function(e,t){if(e===t)return!0;let n=tI(e),r=tI(t);return!!n&&!!r&&(!!(n===r||n.includes(r))||r.includes(n)&&n.length>=Math.max(4,Math.floor(.8*r.length)))}(a=await tM(e,t,n),r))return{ok:!0,actual:a};return{ok:!1,actual:a}}function tI(e){return(e??"").replace(/\s+/g," ").trim()}async function tA(e,t,n){let r=await tx(e),a=ez({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:r.width,referenceHeight:r.height});return await $("adb",H(e,["shell","input","swipe",String(a.x1),String(a.y1),String(a.x2),String(a.y2),"300"])),a}async function tx(e){let t=(await $("adb",H(e,["shell","wm","size"]))).stdout.match(/Physical size:\s*(\d+)x(\d+)/);if(!t)throw new y("COMMAND_FAILED","Unable to read screen size");return{width:Number(t[1]),height:Number(t[2])}}async function tS(e,t,n,r){let a=Math.max(1,Math.floor(n)),i=Array.from(t);for(let t=0;t<i.length;t+=a){let n=i.slice(t,t+a).join("");await tg(e,n),r>0&&t+a<i.length&&await ec(r)}}function tN(e){for(let t of e){let e=t.codePointAt(0);if(void 0!==e&&(e<32||e>126))return!0}return!1}async function t_(e,t){let n=await $("adb",H(e,["shell","cmd","clipboard","set","text",t]),{allowFailure:!0});return 0!==n.exitCode?"failed":ei(n.stdout,n.stderr)?"unsupported":0===(await $("adb",H(e,["shell","input","keyevent","KEYCODE_PASTE"]),{allowFailure:!0})).exitCode||0===(await $("adb",H(e,["shell","input","keyevent","279"]),{allowFailure:!0})).exitCode?"ok":"failed"}async function tk(e,t){let n=Math.max(0,t);await $("adb",H(e,["shell","input","keyevent","KEYCODE_MOVE_END"]),{allowFailure:!0});for(let t=0;t<n;t+=24){let r=Math.min(24,n-t);await $("adb",H(e,["shell","input","keyevent",...Array(r).fill("KEYCODE_DEL")]),{allowFailure:!0})}}async function tM(e,t,n){let r,a=await tr(e),i=/<node\b[^>]*>/g,o=null,s=null,l=null;for(;null!==(r=i.exec(a));){let e=_(r[0]),a=M(e.bounds);if(!a)continue;let i=e.className??"",d=(e.text??"").replace(/&quot;/g,'"').replace(/&apos;/g,"'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&"),u=e.focused??!1;if(!d)continue;let c=Math.max(1,a.width*a.height),p=t>=a.x&&t<=a.x+a.width&&n>=a.y&&n<=a.y+a.height;if(u&&tD(i)){(!o||c<=o.area)&&(o={text:d,area:c});continue}if(p&&tD(i)){(!s||c<=s.area)&&(s={text:d,area:c});continue}p&&(!l||c<=l.area)&&(l={text:d,area:c})}return o?.text??s?.text??l?.text??null}function tD(e){let t=e.toLowerCase();return t.includes("edittext")||t.includes("textfield")}async function tE(e){let t=await $("adb",H(e,["shell","dumpsys","input_method"]),{allowFailure:!0});if(0!==t.exitCode)throw new y("COMMAND_FAILED","Failed to query Android keyboard state",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});return function(e){let t=function(e){let t=new Map;for(let n of e.matchAll(/\b(mInputShown|mIsInputViewShown|isInputViewShown)=([a-zA-Z]+)\b/g)){let e=n[1],r=n[2]?.toLowerCase();e&&("true"===r||"false"===r)&&t.set(e,"true"===r)}if(0===t.size)return null;for(let e of t.values())if(e)return!0;return!1}(e),n=t??!1;if(null===t){let t=e.match(/\bmImeWindowVis=0x([0-9a-fA-F]+)\b/);if(t?.[1]){let e=Number.parseInt(t[1],16);Number.isNaN(e)||(n=(1&e)!=0)}}let r=Array.from(e.matchAll(/\binputType=0x([0-9a-fA-F]+)\b/gi)),a=r.length>0?r[r.length-1]?.[1]:void 0,i=a?`0x${a.toLowerCase()}`:void 0;return{visible:n,inputType:i,type:i?function(e){let t=Number.parseInt(e.replace(/^0x/i,""),16);if(Number.isNaN(t))return"unknown";let n=15&t;if(2===n)return"number";if(3===n)return"phone";if(4===n)return"datetime";if(1!==n)return"unknown";let r=4080&t;return 32===r||208===r?"email":128===r||224===r||144===r?"password":"text"}(i):void 0}}(t.stdout)}async function tO(e){let t=await tE(e),n=t,r=0;for(;n.visible&&r<2;)await $("adb",H(e,["shell","input","keyevent","111"])),r+=1,await ec(120),n=await tE(e);if(t.visible&&n.visible)throw new y("UNSUPPORTED_OPERATION","Android keyboard dismiss is unavailable for the current IME without back navigation.",{attempts:r,inputType:n.inputType,type:n.type});return{attempts:r,wasVisible:t.visible,dismissed:t.visible&&!n.visible,visible:n.visible,inputType:n.inputType,type:n.type}}async function tC(e){let t,n;return(n=(t=(await tP(e,["shell","cmd","clipboard","get","text"],"read")).replace(/\r\n/g,"\n").replace(/\n$/,"")).match(/^clipboard text:\s*(.*)$/i))?n[1]??"":"null"===t.trim().toLowerCase()?"":t}async function tR(e,t){await tP(e,["shell","cmd","clipboard","set","text",t],"write")}async function tP(e,t,n){let r=await $("adb",H(e,t),{allowFailure:!0});if(ei(r.stdout,r.stderr))throw new y("UNSUPPORTED_OPERATION",`Android shell clipboard ${n} is not supported on this device.`);if(0!==r.exitCode)throw new y("COMMAND_FAILED",`Failed to ${n} Android clipboard text`,{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});return r.stdout}let tT=["camera","microphone","photos","contacts","contacts-limited","notifications","calendar","location","location-always","media-library","motion","reminders","siri"];function tL(e){let t=e.trim().toLowerCase();if("grant"===t)return"grant";if("deny"===t)return"deny";if("reset"===t)return"reset";throw new y("INVALID_ARGS",`Invalid permission action: ${e}. Use grant|deny|reset.`)}function t$(e){let t=e?.trim().toLowerCase();if("camera"===t||"microphone"===t||"photos"===t||"contacts"===t||"contacts-limited"===t||"notifications"===t||"calendar"===t||"location"===t||"location-always"===t||"media-library"===t||"motion"===t||"reminders"===t||"siri"===t)return t;throw new y("INVALID_ARGS",`permission setting requires a target: ${tT.join("|")}`)}function tF(e){let t=e.trim().toLowerCase();if("light"===t)return"light";if("dark"===t)return"dark";if("toggle"===t)return"toggle";throw new y("INVALID_ARGS",`Invalid appearance state: ${e}. Use light|dark|toggle.`)}let tU=["window_animation_scale","transition_animation_scale","animator_duration_scale"];async function tG(e,t,n,r,a){switch(t.toLowerCase()){case"wifi":{let t=tB(n);await $("adb",H(e,["shell","svc","wifi",t?"enable":"disable"]));return}case"airplane":{let t=tB(n);await $("adb",H(e,["shell","settings","put","global","airplane_mode_on",t?"1":"0"])),await $("adb",H(e,["shell","am","broadcast","-a","android.intent.action.AIRPLANE_MODE","--ez","state",t?"true":"false"]));return}case"location":{let t=tB(n);await $("adb",H(e,["shell","settings","put","secure","location_mode",t?"3":"0"]));return}case"animations":{let t=tB(n)?"1":"0";for(let n of tU)await $("adb",H(e,["shell","settings","put","global",n,t]));return{scale:t,keys:[...tU]}}case"appearance":{let t=await tj(e,n);await $("adb",H(e,["shell","cmd","uimode","night","dark"===t?"yes":"no"]));return}case"fingerprint":{let t=function(e){let t=e.trim().toLowerCase();if("match"===t)return"match";if("nonmatch"===t)return"nonmatch";throw new y("INVALID_ARGS",`Invalid fingerprint state: ${e}. Use match|nonmatch.`)}(n);await tV(e,t);return}case"permission":{if(!r)throw new y("INVALID_ARGS","permission setting requires an active app in session");let t=tL(n),i=function(e,t){let n=t$(e);if(t?.trim())throw new y("INVALID_ARGS",`Permission mode is only supported for photos. Received: ${t}.`);if("camera"===n)return{kind:"pm",value:"android.permission.CAMERA",type:"camera"};if("microphone"===n)return{kind:"pm",value:"android.permission.RECORD_AUDIO",type:"microphone"};if("photos"===n)return{kind:"pm",value:"android.permission.READ_MEDIA_IMAGES",type:"photos"};if("contacts"===n)return{kind:"pm",value:"android.permission.READ_CONTACTS",type:"contacts"};if("notifications"===n)return{kind:"notifications",appOps:"POST_NOTIFICATION",permission:"android.permission.POST_NOTIFICATIONS"};throw new y("INVALID_ARGS",`Unsupported permission target on Android: ${e}. Use camera|microphone|photos|contacts|notifications.`)}(a?.permissionTarget,a?.permissionMode);if("notifications"===i.kind)return void await tX(e,r,t,i);let o="grant"===t?"grant":"revoke";if("photos"===i.type)return void await tq(e,r,o);await $("adb",H(e,["shell","pm",o,r,i.value]));return}default:throw new y("INVALID_ARGS",`Unsupported setting: ${t}`)}}async function tV(e,t){var n;let r,a,i=(n=e,a=[["shell","cmd","fingerprint","touch",r="match"===t?"1":"9999"],["shell","cmd","fingerprint","finger",r]],"emulator"===n.kind&&a.push(["emu","finger","touch",r]),a),o=[];for(let t of i){let n=await $("adb",H(e,t),{allowFailure:!0});if(0===n.exitCode)return;o.push({args:t,stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})}let s=o.map(e=>({args:e.args.join(" "),exitCode:e.exitCode,stderr:e.stderr.slice(0,400)}));if(o.length>0&&o.every(e=>{var t,n;let r;return t=e.stdout,n=e.stderr,(r=`${t}
5
+ ${n}`.toLowerCase()).includes("unknown command")||r.includes("can't find service: fingerprint")||r.includes("service fingerprint was not found")||r.includes("fingerprint cmd unavailable")||r.includes("emu command is not supported")||r.includes("emulator console is not running")||r.includes("fingerprint")&&r.includes("not found")}))throw new y("UNSUPPORTED_OPERATION","Android fingerprint simulation is not supported on this target/runtime.",{deviceId:e.id,action:t,hint:"Use an Android emulator with biometric support, or a device/runtime that exposes cmd fingerprint.",attempts:s});throw new y("COMMAND_FAILED","Failed to simulate Android fingerprint.",{deviceId:e.id,action:t,attempts:s})}function tB(e){let t=e.toLowerCase();if("on"===t||"true"===t||"1"===t)return!0;if("off"===t||"false"===t||"0"===t)return!1;throw new y("INVALID_ARGS",`Invalid setting state: ${e}`)}async function tj(e,t){let n=tF(t);if("toggle"!==n)return n;let r=await $("adb",H(e,["shell","cmd","uimode","night"]),{allowFailure:!0});if(0!==r.exitCode)throw new y("COMMAND_FAILED","Failed to read current Android appearance",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let a=function(e,t){let n=/night mode:\s*(yes|no|auto)\b/i.exec(`${e}
6
+ ${t}`);if(!n)return null;let r=n[1].toLowerCase();return"yes"===r?"dark":"no"===r?"light":"auto"===r?"auto":null}(r.stdout,r.stderr);if(!a)throw new y("COMMAND_FAILED","Unable to determine current Android appearance for toggle",{stdout:r.stdout,stderr:r.stderr});return"auto"===a?"dark":"dark"===a?"light":"dark"}async function tq(e,t,n){let r=await tH(e),a=[];for(let i of null!==r&&r>=33?["android.permission.READ_MEDIA_IMAGES","android.permission.READ_EXTERNAL_STORAGE"]:["android.permission.READ_EXTERNAL_STORAGE","android.permission.READ_MEDIA_IMAGES"]){let r=await $("adb",H(e,["shell","pm",n,t,i]),{allowFailure:!0});if(0===r.exitCode)return;a.push({permission:i,stderr:r.stderr,exitCode:r.exitCode})}throw new y("COMMAND_FAILED",`Failed to ${n} Android photos permission`,{appPackage:t,sdkInt:r,attempts:a})}async function tX(e,t,n,r){"grant"===n?await $("adb",H(e,["shell","pm","grant",t,r.permission]),{allowFailure:!0}):(await $("adb",H(e,["shell","pm","revoke",t,r.permission]),{allowFailure:!0}),"reset"===n&&(await $("adb",H(e,["shell","pm","clear-permission-flags",t,r.permission,"user-set"]),{allowFailure:!0}),await $("adb",H(e,["shell","pm","clear-permission-flags",t,r.permission,"user-fixed"]),{allowFailure:!0}))),await $("adb",H(e,["shell","appops","set",t,r.appOps,"grant"===n?"allow":"deny"===n?"deny":"default"]))}async function tH(e){let t=await $("adb",H(e,["shell","getprop","ro.build.version.sdk"]),{allowFailure:!0});if(0!==t.exitCode)return null;let n=Number.parseInt(t.stdout.trim(),10);return!Number.isFinite(n)||n<=0?null:n}async function tz(e,t,n){let r="string"==typeof n.action&&n.action.trim()?n.action.trim():`${t}.TEST_PUSH`,a=["shell","am","broadcast","-a",r,"-p",t],i="string"==typeof n.receiver?n.receiver.trim():"";i&&a.push("-n",i);let o=n.extras;if(void 0!==o&&("object"!=typeof o||null===o||Array.isArray(o)))throw new y("INVALID_ARGS","Android push payload extras must be an object");let s=0;for(let[e,t]of Object.entries(o??{}))e&&(function(e,t,n){if("string"==typeof n)return e.push("--es",t,n);if("boolean"==typeof n)return e.push("--ez",t,n?"true":"false");if("number"==typeof n&&Number.isFinite(n))return Number.isInteger(n)?e.push("--ei",t,String(n)):e.push("--ef",t,String(n));throw new y("INVALID_ARGS",`Unsupported Android broadcast extra type for "${t}". Use string, boolean, or number.`)}(a,e,t),s+=1);return await $("adb",H(e,a)),{action:r,extrasCount:s}}let tK=Buffer.from([137,80,78,71,13,10,26,10]);async function tY(e,t){await tW(e);try{await ec(1e3),await tZ(e,t)}finally{await tJ(e).catch(()=>{})}}async function tW(e){let t=t=>$("adb",H(e,["shell",t]),{allowFailure:!0});await t("settings put global sysui_demo_allowed 1");let n=e=>t(`am broadcast -a com.android.systemui.demo -e command ${e}`);await n("clock -e hhmm 0941"),await n("notifications -e visible false")}async function tJ(e){await $("adb",H(e,["shell","am broadcast -a com.android.systemui.demo -e command exit"]),{allowFailure:!0})}async function tZ(e,t){let n=await $("adb",H(e,["exec-out","screencap","-p"]),{binaryStdout:!0});if(!n.stdoutBuffer)throw new y("COMMAND_FAILED","Failed to capture screenshot");let r=n.stdoutBuffer.indexOf(tK);if(r<0)throw new y("COMMAND_FAILED","Screenshot data does not contain a valid PNG header");let i=function(e,t){let n=t+tK.length;for(;n+8<=e.length;){let t=e.readUInt32BE(n),r=n+4,a=e.toString("ascii",r,r+4),i=n+12+t;if(i>e.length)break;if("IEND"===a)return i;n=i}return null}(n.stdoutBuffer,r);if(!i)throw new y("COMMAND_FAILED","Screenshot data does not contain a complete PNG payload");await a.writeFile(t,n.stdoutBuffer.subarray(r,i))}let tQ="<wifi|airplane|location> <on|off>",t0="animations <on|off>",t1="appearance <light|dark|toggle>",t2="faceid <match|nonmatch|enroll|unenroll>",t3="touchid <match|nonmatch|enroll|unenroll>",t5="fingerprint <match|nonmatch>",t4="permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]",t8="permission <grant|reset> <accessibility|screen-recording|input-monitoring>",t6=`macOS supports only settings ${t1} and settings ${t8}. wifi|airplane|location|animations remain unsupported on macOS.`,t9=`settings ${tQ} | settings ${t0} | settings ${t1} | settings ${t2} | settings ${t3} | settings ${t5} | settings ${t4} | settings ${t8}`,t7=`settings requires ${tQ}, ${t0}, ${t1}, ${t2}, ${t3}, ${t5}, ${t4}, or ${t8}`;function ne(e){return`Unsupported macOS setting: ${e}. ${t6}`}let nt=ep(process.env.AGENT_DEVICE_IOS_BOOT_TIMEOUT_MS,Y.ios_boot.totalMs,5e3),nn=ep(process.env.AGENT_DEVICE_IOS_SIMCTL_LIST_TIMEOUT_MS,Y.ios_boot.operationMs,1e3),nr=ep(process.env.AGENT_DEVICE_IOS_APP_LAUNCH_TIMEOUT_MS,3e4,5e3),na=ep(process.env.AGENT_DEVICE_IOS_DEVICECTL_TIMEOUT_MS,2e4,1e3),ni=ep(process.env.AGENT_DEVICE_IOS_SIMULATOR_FOCUS_TIMEOUT_MS,1e4,1e3),no=ep(process.env.AGENT_DEVICE_IOS_SIMULATOR_SCREENSHOT_TIMEOUT_MS,2e4,1e3),ns=ep(process.env.AGENT_DEVICE_IOS_RUNNER_SCREENSHOT_COPY_TIMEOUT_MS,2e4,1e3),nl=X(process.env.AGENT_DEVICE_IOS_SIMULATOR_SCREENSHOT_RUNNER_FALLBACK);async function nd(e,t){let n=["devicectl",...e],r=await $("xcrun",n,{allowFailure:!0,timeoutMs:na});if(0===r.exitCode)return;let a=String(r.stdout??""),i=String(r.stderr??"");throw new y("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:n,exitCode:r.exitCode,stdout:a,stderr:i,deviceId:t.deviceId,hint:nf(a,i)??np})}async function nu(e,t){let n=i.join(s.tmpdir(),`agent-device-ios-apps-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),r=["devicectl","device","info","apps","--device",e.id,"--include-all-apps","--json-output",n],o=await $("xcrun",r,{allowFailure:!0,timeoutMs:na});try{var l,d;if(0!==o.exitCode){let t=String(o.stdout??""),n=String(o.stderr??"");throw new y("COMMAND_FAILED","Failed to list iOS apps",{cmd:"xcrun",args:r,exitCode:o.exitCode,stdout:t,stderr:n,deviceId:e.id,hint:nf(t,n)??np})}let i=await a.readFile(n,"utf8");return l=function(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.bundleIdentifier?e.bundleIdentifier.trim():"";if(!t)continue;let r="string"==typeof e.name&&e.name.trim().length>0?e.name.trim():t,a="string"==typeof e.url&&e.url.trim().length>0?e.url.trim():void 0;n.push({bundleId:t,name:r,url:a})}return n}(JSON.parse(i)),d=t,"user-installed"===d?l.filter(e=>!e.bundleId.startsWith("com.apple.")):l}catch(t){if(t instanceof y)throw t;throw new y("COMMAND_FAILED","Failed to parse iOS apps list",{deviceId:e.id,cause:String(t)})}finally{await a.unlink(n).catch(()=>{})}}async function nc(e){let t=i.join(s.tmpdir(),`agent-device-ios-processes-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=["devicectl","device","info","processes","--device",e.id,"--json-output",t],r=await $("xcrun",n,{allowFailure:!0,timeoutMs:na});try{if(0!==r.exitCode){let t=String(r.stdout??""),a=String(r.stderr??"");throw new y("COMMAND_FAILED","Failed to list iOS processes",{cmd:"xcrun",args:n,exitCode:r.exitCode,stdout:t,stderr:a,deviceId:e.id,hint:nf(t,a)??np})}let i=await a.readFile(t,"utf8");return function(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.executable?e.executable.trim():"",r="number"==typeof e.processIdentifier&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;t&&Number.isFinite(r)&&n.push({executable:t,pid:r})}return n}(JSON.parse(i))}catch(t){if(t instanceof y)throw t;throw new y("COMMAND_FAILED","Failed to parse iOS process list",{deviceId:e.id,cause:String(t)})}finally{await a.unlink(t).catch(()=>{})}}let np="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function nf(e,t){let n=`${e}
7
+ ${t}`.toLowerCase();return n.includes("device is busy")&&n.includes("connecting")?"iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.":n.includes("coredeviceservice")&&n.includes("timed out")?"CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.":null}function nh(e,t={}){let n=G(t.simulatorSetPath);return n?["simctl","--set",n,...e]:["simctl",...e]}function nm(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:nh(t,{simulatorSetPath:e.simulatorSetPath})}function nw(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details??{};if(4!==t.exitCode)return!1;let n=String(t.stderr??"").toLowerCase();return n.includes("fbsopenapplicationserviceerrordomain")&&n.includes("the request to open")}async function ng(e,t){let n=await $("xcrun",nm(e,["get_app_container",e.id,t]),{allowFailure:!0});if(0!==n.exitCode)return{installed:!1};let r=n.stdout.trim();if(!r)return{installed:!1};let a=await $("plutil",["-extract","CFBundleExecutable","raw","-o","-",`${r}/Info.plist`],{allowFailure:!0});if(0!==a.exitCode||!a.stdout.trim())return{installed:!0};let i=a.stdout.trim(),o=`${r}/${i}`,s=await $("otool",["-l",o],{allowFailure:!0});if(0!==s.exitCode)return{installed:!0};let l=s.stdout.toLowerCase();return{installed:!0,simulatorCompatible:l.includes("iossimulator")||l.includes("platform 7")}}function ny(e,t){if("simulator"!==e.kind)throw new y("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function nb(){await $("open",["-a","Simulator"],{allowFailure:!0,timeoutMs:ni})}async function nv(e){let t,n;if("simulator"!==e.kind||"Booted"===await nA(e))return;let r=q.fromTimeoutMs(nt);try{await et(async({deadline:r})=>{if(r?.isExpired())throw new y("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:nt});let a=Math.max(1e3,r?.remainingMs()??nt),i=await $("xcrun",nm(e,["boot",e.id]),{allowFailure:!0,timeoutMs:a});t={stdout:String(i.stdout??""),stderr:String(i.stderr??""),exitCode:i.exitCode};let o=`${t.stdout}
8
+ ${t.stderr}`.toLowerCase(),s=o.includes("already booted")||o.includes("current state: booted");if(0!==t.exitCode&&!s)throw new y("COMMAND_FAILED","simctl boot failed",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let l=await $("xcrun",nm(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:a});if(n={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==n.exitCode)throw new y("COMMAND_FAILED","simctl bootstatus failed",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode});let d=await nA(e);if("Booted"!==d)throw new y("COMMAND_FAILED","Simulator is still booting",{state:d})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let r=W({error:e,stdout:n?.stdout??t?.stdout,stderr:n?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});return"IOS_BOOT_TIMEOUT"!==r&&"CI_RESOURCE_STARVATION_SUSPECTED"!==r}},{deadline:r,phase:"boot",classifyReason:e=>W({error:e,stdout:n?.stdout??t?.stdout,stderr:n?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(i){let a=W({error:i,stdout:n?.stdout??t?.stdout,stderr:n?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});throw new y("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:nt,elapsedMs:r.elapsedMs(),reason:a,hint:Z(a),boot:t,bootstatus:n})}await nb()}async function nI(e){let t=nm(e,["shutdown",e.id]),n=await $("xcrun",t,{allowFailure:!0,timeoutMs:15e3});return{success:0===n.exitCode,exitCode:n.exitCode,stdout:String(n.stdout??""),stderr:String(n.stderr??"")}}async function nA(e){let t="string"==typeof e?e:e.id,n="string"==typeof e?nh(["list","devices","-j"]):nm(e,["list","devices","-j"]),r=await $("xcrun",n,{allowFailure:!0,timeoutMs:nn});if(0!==r.exitCode)return null;try{let e=JSON.parse(String(r.stdout??""));for(let n of Object.values(e.devices??{})){let e=n.find(e=>e.udid===t);if(e)return e.state}return null}catch{return null}}let nx=null;function nS(e){return function e(t){if(!Array.isArray(t))return[];let n=[];for(let r of t)if(!(!r||"object"!=typeof r||Array.isArray(r)))for(let[t,a]of Object.entries(r))":@"!==t&&"#text"!==t&&n.push({name:t,attributes:function(e){if(!e||"object"!=typeof e||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e))"string"==typeof r&&(t[n]=r);return t}(r[":@"]),text:n_(a)??n_(r["#text"]),children:e(a)});return n}((nx??=new d({ignoreAttributes:!1,attributeNamePrefix:"",preserveOrder:!0,trimValues:!0,parseTagValue:!1})).parse(e))}function nN(e,t){for(let n of e){if("dict"===n.name)for(let e=0;e<n.children.length-1;e+=1){let r=n.children[e],a=n.children[e+1];r?.name==="key"&&r.text&&a&&t(r.text,a)}nN(n.children,t)}}function n_(e){if("string"==typeof e){let t=e.trim();return t.length>0?t:null}if(!Array.isArray(e))return null;let t=e.map(e=>{if(!e||"object"!=typeof e||Array.isArray(e))return null;let t=e["#text"];return"string"==typeof t?t.trim():null}).filter(e=>null!==e&&e.length>0).join("").trim();return t.length>0?t:null}async function nk(e,t){try{let n=await $("plutil",["-extract",t,"raw","-o","-",e],{allowFailure:!0});if(0===n.exitCode){let e=String(n.stdout??"").trim();if(e.length>0)return e}}catch{}try{var n,r;let i;return n=await a.readFile(e,"utf8"),r=t,nN(nS(n),(e,t)=>{void 0===i&&e===r&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}async function nM(e,t){if("url"===e.kind&&!em(e.url))throw new y("INVALID_ARGS","iOS install_from_source URL sources are only supported for trusted artifact services such as GitHub Actions and EAS. Use a path source for other hosts.");let n=await eh({source:e,isInstallablePath:(e,t)=>t.isDirectory()&&e.toLowerCase().endsWith(".app")||t.isFile()&&e.toLowerCase().endsWith(".ipa"),installableLabel:"iOS installable (.app or .ipa)",allowArchiveExtraction:"url"!==e.kind||em(e.url),signal:t?.signal}),r=await nE(n.installablePath,t),a=await nD(r.installPath);return{archivePath:n.archivePath??(n.installablePath.toLowerCase().endsWith(".ipa")?n.installablePath:void 0),installablePath:r.installPath,bundleId:a.bundleId,appName:a.appName,cleanup:async()=>{await r.cleanup(),await n.cleanup()}}}async function nD(e){let t=i.join(e,"Info.plist"),[n,r,a]=await Promise.all([nk(t,"CFBundleIdentifier"),nk(t,"CFBundleDisplayName"),nk(t,"CFBundleName")]);return{bundleId:n,appName:r??a}}async function nE(e,t){if(!e.toLowerCase().endsWith(".ipa"))return{installPath:e,cleanup:async()=>{}};let n=await a.mkdtemp(i.join(s.tmpdir(),"agent-device-ios-ipa-")),r=async()=>{await a.rm(n,{recursive:!0,force:!0})};try{await $("unzip",["-q",e,"-d",n]);let o=i.join(n,"Payload"),s=(await a.readdir(o,{withFileTypes:!0}).catch(()=>{throw new y("INVALID_ARGS","Invalid IPA: missing Payload directory")})).filter(e=>e.isDirectory()&&e.name.toLowerCase().endsWith(".app")).map(e=>({installPath:i.join(o,e.name),bundleName:e.name.replace(/\.app$/i,"")}));if(1===s.length)return{installPath:s[0].installPath,cleanup:r};if(0===s.length)throw new y("INVALID_ARGS","Invalid IPA: expected at least one .app under Payload, found 0");await nO(s);let l=t?.appIdentifierHint?.trim();if(l){let e=function(e,t){let n=t.toLowerCase(),r=e.filter(e=>e.bundleName.toLowerCase()===n);if(1===r.length)return r[0];if(r.length>1)throw new y("INVALID_ARGS",`Invalid IPA: multiple app bundles matched "${t}" by name. Use a bundle id hint instead.`);if(t.includes(".")){let t=e.filter(e=>e.bundleId?.toLowerCase()===n);if(1===t.length)return t[0]}}(s,l);if(e)return{installPath:e.installPath,cleanup:r};throw new y("INVALID_ARGS",`Invalid IPA: found ${s.length} .app bundles under Payload and none matched "${l}". Available bundles: ${s.map(nC).join(", ")}`)}throw new y("INVALID_ARGS",`Invalid IPA: found ${s.length} .app bundles under Payload. Pass an app identifier or bundle name matching one of: ${s.map(nC).join(", ")}`)}catch(e){throw await r(),e}}async function nO(e){await Promise.all(e.map(async e=>{if(e.bundleId&&e.appName)return;let t=await nD(e.installPath);e.bundleId=e.bundleId??t.bundleId,e.appName=e.appName??t.appName}))}function nC(e){let t=e.bundleId??e.appName;return t?`${e.bundleName}.app (${t})`:`${e.bundleName}.app`}function nR(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}let nP="agent-device-macos-helper",nT="AGENT_DEVICE_MACOS_HELPER_BIN",nL=i.join(s.homedir(),".agent-device","macos-helper","current"),n$=i.join(nL,"manifest.json"),nF=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function nU(e){let t=e.trim();if(!nF.test(t))throw new y("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function nG(){return function(e){let t=i.dirname(e);for(;;){let e=i.join(t,"macos-helper");if(r(i.join(e,"Package.swift")))return e;let n=i.dirname(t);if(n===t)break;t=n}throw new y("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(c(import.meta.url))}async function nV(e){let t=await a.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=i.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await nV(n):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[n]:[]}))).flat().sort()}async function nB(e){let t=await nV(e),n=u("sha256");for(let r of t)n.update(i.relative(e,r)),n.update("\0"),n.update(await a.readFile(r)),n.update("\0");let r=await $("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return n.update("swift-version"),n.update("\0"),n.update(r.stdout||r.stderr||`exit:${r.exitCode}`),n.update("\0"),n.digest("hex")}async function nj(){try{let e=JSON.parse(await a.readFile(n$,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function nq(){let e=await F(process.env[nT],nT);if(e)return e;let t=nG(),n=await nB(t),r=i.join(nL,nP);try{if(await nj()===n)return await a.access(r),r}catch{}let o=i.join(nG(),".build","release",nP);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await $("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await a.mkdir(nL,{recursive:!0});let s=`${r}.tmp`;return await a.copyFile(o,s),await a.rename(s,r),await a.chmod(r,493),await a.writeFile(n$,`${JSON.stringify({fingerprint:n},null,2)}
9
+ `,"utf8"),r}async function nX(e){let t=process.env[nT]?.trim();if("darwin"!==process.platform&&!t)throw new y("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");let n=await nq(),r=await $(n,e,{allowFailure:!0,timeoutMs:3e4}),a=r.stdout.trim(),i=null;if(a)try{i=JSON.parse(a)}catch{i=null}if(0===r.exitCode&&i?.ok)return i.data;throw new y("COMMAND_FAILED",i&&!i.ok?i.error?.message??`macOS helper exited with code ${r.exitCode}`:a||r.stderr.trim()||`macOS helper exited with code ${r.exitCode}`,{helperPath:n,args:e,stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode,...i&&!i.ok?i.error?.details:{}})}async function nH(){return await nX(["app","frontmost"])}async function nz(e){return await nX(["app","quit","--bundle-id",nU(e)])}async function nK(e,t){return await nX(["permission",e,t])}async function nY(e,t={}){let n=["alert",e];return t.bundleId&&n.push("--bundle-id",nU(t.bundleId)),t.surface&&n.push("--surface",t.surface),await nX(n)}async function nW(e,t={}){let n=["snapshot","--surface",e];return t.bundleId&&n.push("--bundle-id",nU(t.bundleId)),await nX(n)}async function nJ(e,t,n={}){let r=["read","--x",String(e),"--y",String(t)];return n.bundleId&&r.push("--bundle-id",nU(n.bundleId)),n.surface&&r.push("--surface",n.surface),await nX(r)}async function nZ(e,t,n={}){let r=["press","--x",String(e),"--y",String(t)];return n.bundleId&&r.push("--bundle-id",nU(n.bundleId)),n.surface&&r.push("--surface",n.surface),await nX(r)}async function nQ(e,t={}){let n=["screenshot","--out",e];return t.surface&&n.push("--surface",t.surface),t.fullscreen&&n.push("--fullscreen"),await nX(n)}let n0={settings:"com.apple.systempreferences"},n1=/^[a-z0-9-]+(?:\.[a-z0-9-]+)+$/,n2={platform:"macos",deviceId:"host",variant:"all"},n3=er();function n5(e,t){let n=["-b",e];return t&&n.push(t),n}async function n4(e){for(let t of[i.join(e,"Contents","Info.plist"),i.join(e,"Info.plist")]){let[e,n,r]=await Promise.all([nk(t,"CFBundleIdentifier"),nk(t,"CFBundleDisplayName"),nk(t,"CFBundleName")]);if(e||n||r)return{bundleId:e,appName:n??r}}return{}}async function n8(e){let t=e.trim(),n=n0[t.toLowerCase()];if(n)return n;if(n1.test(t))return t;let r=n3.get(n2,t);if(r)return r;let a=(await rr("all")).filter(e=>e.name.toLowerCase()===t.toLowerCase());if(1===a.length)return n3.set(n2,t,a[0].bundleId);if(a.length>1)throw new y("INVALID_ARGS",`Multiple apps matched "${e}"`,{matches:a});throw new y("APP_NOT_INSTALLED",`No app found matching "${e}"`)}async function n6(e,t,n){let r=n?.url?.trim();if(r){if(!ea(r))throw new y("INVALID_ARGS","open <app> <url> requires a valid URL target");let e=n?.appBundleId??await n8(t);await $("open",n5(e,r));return}let a=t.trim();if(ea(a))return void await $("open",[a]);let i=n?.appBundleId??await n8(a);await $("open",n5(i))}async function n9(e,t){let n=await n8(t),r=await nz(n);if(r.running&&!r.terminated&&!r.forceTerminated)throw new y("COMMAND_FAILED",`Failed to close macOS app ${t}`,{bundleId:n,running:r.running,terminated:r.terminated,forceTerminated:r.forceTerminated})}async function n7(){let e=await $("pbpaste",[],{allowFailure:!0});if(0!==e.exitCode)throw new y("COMMAND_FAILED","Failed to read macOS clipboard",{stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode});return e.stdout.replace(/\r\n/g,"\n").replace(/\n$/,"")}async function re(e){let t=await $("pbcopy",[],{allowFailure:!0,stdin:e});if(0!==t.exitCode)throw new y("COMMAND_FAILED","Failed to write macOS clipboard",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode})}async function rt(){let e=await $("osascript",["-e",'tell application "System Events" to tell appearance preferences to get dark mode'],{allowFailure:!0});if(0!==e.exitCode)throw new y("COMMAND_FAILED","Failed to read macOS appearance",{stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode});let t=e.stdout.trim().toLowerCase();if("true"===t)return!0;if("false"===t)return!1;throw new y("COMMAND_FAILED",`Unable to determine current macOS appearance from osascript output: ${e.stdout.trim()}`)}async function rn(e){let t=tF(e),n="toggle"===t?!await rt():"dark"===t,r=`tell application "System Events" to tell appearance preferences to set dark mode to ${n?"true":"false"}`,a=await $("osascript",["-e",r],{allowFailure:!0});if(0!==a.exitCode)throw new y("COMMAND_FAILED","Failed to set macOS appearance",{stdout:a.stdout,stderr:a.stderr,exitCode:a.exitCode})}async function rr(e="all"){let t=["/Applications","/System/Applications",i.join(s.homedir(),"Applications")],n=new Set;for(let e of t){let t=await a.stat(e).catch(()=>null);if(!t?.isDirectory())continue;let r=await $("find",[e,"-maxdepth","4","-type","d","-name","*.app"],{allowFailure:!0});if(0===r.exitCode)for(let e of r.stdout.split("\n")){let t=e.trim();t&&n.add(t)}}return nR((await Promise.all(Array.from(n).map(async e=>{let t=await n4(e).catch(()=>({})),n=t.bundleId;return n?{bundleId:n,name:t.appName??i.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),e)}let ra=new Set,ri=new Map,ro="request_canceled",rs="request canceled";function rl(e,t){if("string"==typeof e&&e.length>0)return e;let n=("string"==typeof t?t:"number"==typeof t&&Number.isFinite(t)?String(t):"generated").trim().replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,32)||"generated",r=Math.random().toString(36).slice(2,10);return`req:${n}:${process.pid}:${Date.now()}:${r}`}function rd(e){if(!e)return;!function(e){if(e.size<=5e4)return;let t=0;for(let n of e.keys()){if(t>=1e4)break;e.delete(n),t++}}(ri);let t=new AbortController;ri.set(e,t),ra.has(e)&&t.abort()}function ru(e){e&&(!function(e){if(e.size<=5e4)return;let t=0;for(let n of e){if(t>=1e4)break;e.delete(n),t++}}(ra),ra.add(e),ri.get(e)?.abort())}function rc(e){e&&(ra.delete(e),ri.delete(e))}function rp(e){return!!e&&ra.has(e)}function rf(e){if(e)return ri.get(e)?.signal}function rh(){return new y("COMMAND_FAILED",rs,{reason:ro})}function rm(e){return e instanceof y&&"COMMAND_FAILED"===e.code&&(e.details?.reason===ro||e.message===rs)}function rw(e){return!(e instanceof y)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function rg(e){let{port:t,endpoints:n,logPath:r,lastError:a}=e,i="Runner did not accept connection";return new y("COMMAND_FAILED",i,{port:t,endpoints:n,logPath:r,lastError:a?String(a):void 0,reason:W({error:a,message:i,context:{platform:"ios",phase:"connect"}}),hint:Z("IOS_RUNNER_CONNECT_TIMEOUT")})}async function ry(e){var t,n;let r,{session:a,port:i,logPath:o}=e,s=await a.testPromise,l="Runner did not accept connection (xcodebuild exited early)",d=W({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new y("COMMAND_FAILED",l,{port:i,logPath:o,xcodebuild:{exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr},reason:d,hint:(t=s.stdout,n=s.stderr,(r=`${l}
10
+ ${t}
11
+ ${n}`.toLowerCase()).includes("device is busy")&&r.includes("connecting")?"Target iOS device is still connecting. Keep it unlocked, wait for device trust/connection to settle, then retry.":Z("IOS_RUNNER_CONNECT_TIMEOUT"))})}function rb(e){if(rp(e))throw rh()}let rv=ep(process.env.AGENT_DEVICE_RUNNER_STARTUP_TIMEOUT_MS,45e3,5e3),rI=ep(process.env.AGENT_DEVICE_RUNNER_COMMAND_TIMEOUT_MS,45e3,1e3),rA=ep(process.env.AGENT_DEVICE_RUNNER_CONNECT_ATTEMPT_INTERVAL_MS,250,50),rx=ep(process.env.AGENT_DEVICE_RUNNER_CONNECT_RETRY_BASE_DELAY_MS,300,10),rS=ep(process.env.AGENT_DEVICE_RUNNER_CONNECT_RETRY_MAX_DELAY_MS,2e3,10),rN=ep(process.env.AGENT_DEVICE_RUNNER_CONNECT_REQUEST_TIMEOUT_MS,2e4,250),r_=ep(process.env.AGENT_DEVICE_IOS_DEVICE_INFO_TIMEOUT_MS,1e4,500),rk=ef(process.env.AGENT_DEVICE_RUNNER_DESTINATION_TIMEOUT_SECONDS,20,5),rM=new Map;async function rD(e,t,n,r,a=rv,i,o){let s,l=q.fromTimeoutMs(a),d=async(n,r=!1)=>{var a,i,o;let l,d=await rO({device:e,timeoutBudgetMs:n,forceRefresh:r,requestTunnelIp:s,setRequestTunnelIp:e=>{s=e}});return{endpoints:(a=e,i=t,o=d.ip,l=[`http://127.0.0.1:${i}/command`],"device"!==a.kind||o&&l.unshift(`http://[${o}]:${i}/command`),l),cached:d.sharedCacheHit}},{endpoints:u}=await d(l.remainingMs()),c=null,p=Math.max(1,Math.ceil(a/rA));try{return await et(async({deadline:s})=>{if(s?.isExpired())throw new y("COMMAND_FAILED","Runner connection deadline exceeded",{port:t,timeoutMs:a});if(i&&null!==i.child.exitCode&&void 0!==i.child.exitCode)throw await ry({session:i,port:t,logPath:r});let l=!1;if("device"===e.kind){let e=await d(s?.remainingMs());u=e.endpoints,l=e.cached}let p=l?u[0]:null,f=await rE(u,{command:n,port:t,timeoutMs:a,signal:o,attemptDeadline:s,onError:(t,n)=>{var r;c=n,"device"===e.kind&&t===p&&(r=e.id,rM.delete(r))}});if(f)return f;if("device"===e.kind&&l){var h;h=e.id,rM.delete(h),u=(await d(s?.remainingMs(),!0)).endpoints;let r=await rE(u,{command:n,port:t,timeoutMs:a,signal:o,attemptDeadline:s,onError:(e,t)=>{c=t}});if(r)return r}if(o?.aborted)throw rh();throw new y("COMMAND_FAILED","Runner endpoint probe failed",{port:t,endpoints:u,lastError:c?String(c):void 0})},{maxAttempts:p,baseDelayMs:rx,maxDelayMs:rS,jitter:.2,shouldRetry:rw},{deadline:l,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||rm(e))throw rh();c||(c=e)}if(o?.aborted)throw rh();if("simulator"===e.kind){let a=l.remainingMs();if(a<=0)throw rg({port:t,endpoints:u,logPath:r,lastError:c});let i=await rP(e,t,n,a,o);return new Response(i.body,{status:i.status})}throw rg({port:t,endpoints:u,logPath:r,lastError:c})}async function rE(e,t){let{command:n,port:r,timeoutMs:a,signal:i,attemptDeadline:o,onError:s}=t;for(let t of e)try{let e=o?.remainingMs()??a;if(e<=0)throw new y("COMMAND_FAILED","Runner connection deadline exceeded",{port:r,timeoutMs:a});return await rC(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)},Math.min(rN,e),i)}catch(e){if(i?.aborted||rm(e))throw rh();s(t,e)}return null}async function rO(e){var t,n,r;let{device:a,timeoutBudgetMs:i,forceRefresh:o,requestTunnelIp:s,setRequestTunnelIp:l}=e;if("device"!==a.kind)return{ip:null,sharedCacheHit:!1};if(!o){let e,n=(t=a.id,(e=rM.get(t))?e.expiresAt<=Date.now()?(rM.delete(t),null):e.ip:null);if(n)return{ip:n,sharedCacheHit:!0};if(void 0!==s)return{ip:s,sharedCacheHit:!1}}let d=await rR(a.id,i);return l(d),d&&(n=a.id,r=d,rM.set(n,{ip:r,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function rC(e,t,n,r){let a=AbortSignal.timeout(n),i=r?AbortSignal.any([r,a]):a;return await fetch(e,{...t,signal:i})}async function rR(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(r_,t)):r_,a=i.join(s.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),i=await $("xcrun",["devicectl","device","info","details","--device",e,"--json-output",a,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==i.exitCode||!n.existsSync(a))return null;let o=JSON.parse(n.readFileSync(a,"utf8"));if(o.info?.outcome&&"success"!==o.info.outcome)return null;let s=(o.result?.connectionProperties?.tunnelIPAddress??o.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{rU(a)}}async function rP(e,t,n,r,a){let i=JSON.stringify(n),o=nm(e,["spawn",e.id,"/usr/bin/curl","-s","-X","POST","-H","Content-Type: application/json","--data",i,`http://127.0.0.1:${t}/command`]),s=await $("xcrun",o,{allowFailure:!0,timeoutMs:r,signal:a}),l=s.stdout;if(0!==s.exitCode){let e=W({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new y("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:Z(e)})}return{status:200,body:l}}async function rT(){return await new Promise((e,t)=>{let n=p.createServer();n.listen(0,"127.0.0.1",()=>{let r=n.address();if("object"==typeof r&&r?.port){let t=r.port;n.close(()=>e(t))}else n.close(()=>t(new y("COMMAND_FAILED","Failed to allocate port")))}),n.on("error",t)})}function rL(e,t,n,r){t&&rF(t,e),n&&rF(n,e),r&&process.stderr.write(e)}let r$=new Map;function rF(e,t){let r=(r$.get(e)??Promise.resolve()).catch(()=>{}).then(()=>n.promises.appendFile(e,t)).catch(()=>{}).finally(()=>{r$.get(e)===r&&r$.delete(e)});r$.set(e,r)}function rU(e){try{n.existsSync(e)&&n.unlinkSync(e)}catch{}}let rG=new f;async function rV(e,t,n){let r=rG.getStore()??[];if(r.some(n=>n.locks===e&&n.key===t))return await n();let a=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>rG.run([...r,{locks:e,key:t}],n));return e.set(t,a),a.finally(()=>{e.get(t)===a&&e.delete(t)})}function rB(e){return e}function rj(e){return"apple"===e||"ios"===e||"macos"===e}function rq(e,t){return!t||("apple"===t?rj(e):e===t)}function rX(e){let{simulatorSetPath:t,platform:n,target:r}=e;if(t&&"macos"!==n&&"desktop"!==r)return t}async function rH(e,t,n={}){let r=e,a=e=>e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim();if(t.platform&&(r=r.filter(e=>rq(e.platform,t.platform))),t.target&&(r=r.filter(e=>(e.target??"mobile")===t.target)),t.udid){let e=r.find(e=>e.id===t.udid&&rj(e.platform));if(!e)throw new y("DEVICE_NOT_FOUND",`No Apple device with UDID ${t.udid}`);return e}if(t.serial){let e=r.find(e=>e.id===t.serial&&"android"===e.platform);if(!e)throw new y("DEVICE_NOT_FOUND",`No Android device with serial ${t.serial}`);return e}if(t.deviceName){let e=a(t.deviceName),n=r.find(t=>a(t.name)===e);if(!n)throw new y("DEVICE_NOT_FOUND",`No device named ${t.deviceName}`);return n}if(1===r.length)return r[0];if(0===r.length){var i;let e=n.simulatorSetPath;if(e&&(!(i=t.platform)||"apple"===i||"ios"===i))throw new y("DEVICE_NOT_FOUND","No devices found in the scoped simulator set",{simulatorSetPath:e,hint:`The simulator set at "${e}" appears to be empty. Create a simulator first:
12
+ xcrun simctl --set "${e}" create "iPhone 16" com.apple.CoreSimulator.SimDeviceType.iPhone-16 com.apple.CoreSimulator.SimRuntime.iOS-18-0`,selector:t});throw new y("DEVICE_NOT_FOUND","No devices found",{selector:t})}let o=r.filter(e=>"device"!==e.kind);o.length>0&&(r=o);let s=r.filter(e=>e.booted);return 1===s.length?s[0]:s[0]??r[0]}let rz=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function rK(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new y("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",xctestrunPath:r});let a=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of a)if(!n.existsSync(e))throw new y("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of a)if(0!==L("codesign",["--verify","--deep","--strict",e],{allowFailure:!0}).exitCode){await $("codesign",["--remove-signature",e],{allowFailure:!0});try{await $("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof y?n:new y("COMMAND_FAILED",String(n));throw new y("COMMAND_FAILED","Failed to repair macOS runner product signature",{reason:"RUNNER_PRODUCT_REPAIR_FAILED",productPath:e,xctestrunPath:r,error:t.message,details:t.details})}}}let rY="XCTestDevices",rW=".agent-device-backup",rJ=".agent-device-xctestdevices-backup-",rZ=i.join(s.homedir(),".agent-device","ios-runner"),rQ=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]),r0=new Map,r1=new Set;function r2(e){return e?.trim()??""}function r3(e=process.env){return r2(e.AGENT_DEVICE_IOS_BUNDLE_ID)||r2(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function r5(e=process.env){let t=r2(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${r3(e)}.uitests`}let r4=function(e=process.env){let t=r3(e),n=r5(e);return Array.from(new Set([r2(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${n}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function r8(e=s.homedir()){return i.join(e,"Library","Developer","XCTestDevices")}async function r6(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=G(e.simulatorSetPath);if(!r)return null;let a=i.resolve(r),o=i.resolve(t.xctestDeviceSetPath??r8()),l=i.resolve(t.backupPath??function(e=r8()){return`${e}${rW}`}(o)),d=i.resolve(t.lockDirPath??function(e=s.homedir()){return i.join(e,".agent-device","xctest-device-set.lock")}()),u=t.ownerStartTime??ey(process.pid),c=await ae({lockDirPath:d,owner:{pid:t.ownerPid??process.pid,startTime:u,acquiredAtMs:t.nowMs??Date.now()}});try{if(r9({xctestDeviceSetPath:o,backupPath:l}),function(e,t){if(i.resolve(e)===i.resolve(t))return!0;try{return n.realpathSync.native(e)===n.realpathSync.native(t)}catch{return!1}}(a,o))return await c(),null;n.mkdirSync(a,{recursive:!0}),n.existsSync(o)&&n.renameSync(o,l),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,a=i.dirname(r),o=i.join(a,`${rY}.agent-device-link-${process.pid}-${Date.now()}`);n.mkdirSync(a,{recursive:!0});try{n.symlinkSync(t,o,"dir"),n.renameSync(o,r)}catch(e){throw n.existsSync(o)&&r7(o),e}}({requestedSetPath:a,xctestDeviceSetPath:o})}catch(e){throw r9({xctestDeviceSetPath:o,backupPath:l}),await c(),new y("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:a,xctestDeviceSetPath:o,backupPath:l,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{r9({xctestDeviceSetPath:o,backupPath:l})}finally{await c()}}}}}function r9(e){let{xctestDeviceSetPath:t,backupPath:r}=e,a=[r,...function(e){let t=i.dirname(e),r=i.basename(e).replace(rW,""),a=r===rY?rJ:`${r}${rJ}`;try{return n.readdirSync(t).filter(e=>e.startsWith(a)).sort().map(e=>i.join(t,e))}catch{return[]}}(r)],o=a.find(e=>n.existsSync(e)),s=n.existsSync(t)&&n.lstatSync(t).isSymbolicLink();if(o){if(s&&r7(t),n.existsSync(t))if(!s)return void eI({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:o}});else o!==r?n.rmSync(o,{recursive:!0,force:!0}):n.rmSync(r,{recursive:!0,force:!0});else n.mkdirSync(i.dirname(t),{recursive:!0}),n.renameSync(o,t);for(let e of a)e!==o&&n.existsSync(e)&&n.rmSync(e,{recursive:!0,force:!0});return}s&&(eI({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),r7(t))}function r7(e){!n.existsSync(e)||n.lstatSync(e).isSymbolicLink()&&n.unlinkSync(e)}async function ae(e){let{lockDirPath:t,owner:r}=e,a=i.join(t,"owner.json"),o=Date.now()+3e4;for(n.mkdirSync(i.dirname(t),{recursive:!0});Date.now()<o;)try{n.mkdirSync(t),function(e,t){let r=`${e}.${process.pid}.${Date.now()}.tmp`;n.writeFileSync(r,JSON.stringify(t),"utf8"),n.renameSync(r,e)}(a,r);let e=!1;return async()=>{e||(e=!0,n.rmSync(t,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,t){let r=null;try{r=n.statSync(e)}catch{return!0}let a=function(e){try{return JSON.parse(n.readFileSync(e,"utf8"))}catch{return null}}(t);if(a){var i;return!(Number.isInteger((i=a).pid)&&!(i.pid<=0)&&eg(i.pid)&&(!i.startTime||ey(i.pid)===i.startTime))&&(n.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-r.mtimeMs<5e3)&&(n.rmSync(e,{recursive:!0,force:!0}),!0)}(t,a))continue;await ec(100)}throw new y("COMMAND_FAILED","Timed out waiting for XCTest device set lock",{lockDirPath:t})}async function at(e,t){var r;let a,o=(r=e,(a=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim())?i.resolve(a):"macos"===r.platform?i.join(rZ,"derived","macos"):"simulator"===r.kind?i.join(rZ,"derived"):i.join(rZ,"derived",r.kind)),s=function(){let e=i.dirname(c(import.meta.url)),t=e;for(let e=0;e<6;e+=1){let e=i.join(t,"package.json");if(n.existsSync(e))return t;t=i.dirname(t)}return e}();return await rV(r0,o,async()=>{X(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)&&(af("clean","forced_clean",{derived:o}),ap(o),an(o));let r=function(e){let t=e.findXctestrun(e.derived);if(!t)return{reason:"missing_xctestrun",xctestrunPath:null};let n=e.resolveExistingXctestrunProductPaths(t);return n?e.xctestrunReferencesProjectRoot(t,e.projectRoot)?{reason:"reuse_ready",xctestrunPath:t,productPaths:n}:{reason:"project_root_mismatch",xctestrunPath:t,productPaths:n}:{reason:"missing_products",xctestrunPath:t,productPaths:[]}}({derived:o,projectRoot:s,findXctestrun:t=>aa(t,e),xctestrunReferencesProjectRoot:ao,resolveExistingXctestrunProductPaths:ah});if("reuse_ready"!==r.reason&&af("rebuild",r.reason,{derived:o,xctestrunPath:r.xctestrunPath}),"reuse_ready"===r.reason)try{return await rK(e,r.productPaths,r.xctestrunPath),af("reuse","reuse_ready",{derived:o,xctestrunPath:r.xctestrunPath}),r.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof y))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&rz.has(t)}(e))throw e;af("rebuild","repair_failed",{derived:o,xctestrunPath:r.xctestrunPath})}r.xctestrunPath&&(ap(o),an(o));let a=i.join(s,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!n.existsSync(a))throw new y("COMMAND_FAILED","iOS runner project not found",{projectPath:a});await al(e,a,o,t);let l=aa(o,e);if(!l)throw new y("COMMAND_FAILED","Failed to locate .xctestrun after build");let d=ah(l);if(!d)throw new y("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:l});return await rK(e,d,l),af("build","built_new",{derived:o,xctestrunPath:l}),l})}function an(e){try{if(!n.existsSync(e))return;if("derived"!==i.basename(e))return void n.rmSync(e,{recursive:!0,force:!0});for(let r of n.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,ar.has(t)&&n.rmSync(i.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let ar=new Set(["Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function aa(e,t){if(!n.existsSync(e))return null;let r=[],a=[e];for(;a.length>0;){let e=a.pop();for(let t of n.readdirSync(e,{withFileTypes:!0})){let o=i.join(e,t.name);if(t.isDirectory()){a.push(o);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=n.statSync(o);r.push({path:o,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,n)=>{if(t){let r=ai(n.path,t)-ai(e.path,t);if(0!==r)return r}return n.mtimeMs-e.mtimeMs||e.path.localeCompare(n.path)}),r[0]?.path??null)}function ai(e,t){var n;let r=0,a=e.toLowerCase();i.basename(a).startsWith("agentdevicerunner.env.")&&(r-=1e3),a.includes(`${i.sep}macos${i.sep}`)&&(r-=5e3);let o="macos"===(n=t).platform?{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]}:"tv"===n.target?"simulator"===n.kind?{preferred:["appletvsimulator"],disallowed:["appletvos","iphoneos","iphonesimulator","macos"]}:{preferred:["appletvos"],disallowed:["appletvsimulator","iphoneos","iphonesimulator","macos"]}:"simulator"===n.kind?{preferred:["iphonesimulator"],disallowed:["iphoneos","appletvos","appletvsimulator","macos"]}:{preferred:["iphoneos"],disallowed:["iphonesimulator","appletvos","appletvsimulator","macos"]};return o.preferred.length>0&&(o.preferred.some(e=>a.includes(e))?r+=2e3:r-=500),o.disallowed.some(e=>a.includes(e))&&(r-=2500),r}function ao(e,t){try{let r=n.readFileSync(e,"utf8"),a=new Set([t]);try{a.add(n.realpathSync(t))}catch{}for(let e of a)if(r.includes(e))return!0;return!1}catch{return!1}}async function as(e,t,r){let a,o=i.dirname(e),s=r.replace(/[^a-zA-Z0-9._-]/g,"_"),l=i.join(o,`AgentDeviceRunner.env.${s}.json`),d=i.join(o,`AgentDeviceRunner.env.${s}.xctestrun`),u=await $("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==u.exitCode||!u.stdout.trim())throw new y("COMMAND_FAILED","Failed to read xctestrun plist",{xctestrunPath:e,stderr:u.stderr});try{let e=JSON.parse(u.stdout);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Root must be an object");a=e}catch(t){throw new y("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}let c=e=>{e.EnvironmentVariables={...e.EnvironmentVariables??{},...t},e.UITestEnvironmentVariables={...e.UITestEnvironmentVariables??{},...t},e.UITargetAppEnvironmentVariables={...e.UITargetAppEnvironmentVariables??{},...t},e.TestingEnvironmentVariables={...e.TestingEnvironmentVariables??{},...t}},p=a.TestConfigurations;if(Array.isArray(p))for(let e of p){if(!e||"object"!=typeof e)continue;let t=e.TestTargets;if(Array.isArray(t))for(let e of t)e&&"object"==typeof e&&c(e)}for(let[e,t]of Object.entries(a))t&&"object"==typeof t&&!Array.isArray(t)&&t.TestBundlePath&&(c(t),a[e]=t);n.writeFileSync(l,JSON.stringify(a,null,2));let f=await $("plutil",["-convert","xml1","-o",d,l],{allowFailure:!0});if(0!==f.exitCode)throw new y("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:d,stderr:f.stderr});return{xctestrunPath:d,jsonPath:l}}async function al(e,t,n,r){let a=function(e=process.env){let t=r3(e),n=r5(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${n}`]}(process.env),i=function(e=process.env,t=!1,n="ios"){if("macos"===n)return["CODE_SIGNING_ALLOWED=NO","CODE_SIGNING_REQUIRED=NO","CODE_SIGN_IDENTITY=","DEVELOPMENT_TEAM="];if(!t)return[];let r=e.AGENT_DEVICE_IOS_TEAM_ID?.trim()||"",a=e.AGENT_DEVICE_IOS_SIGNING_IDENTITY?.trim()||"",i=e.AGENT_DEVICE_IOS_PROVISIONING_PROFILE?.trim()||"",o=["CODE_SIGN_STYLE=Automatic"];return r&&o.push(`DEVELOPMENT_TEAM=${r}`),a&&o.push(`CODE_SIGN_IDENTITY=${a}`),i&&o.push(`PROVISIONING_PROFILE_SPECIFIER=${i}`),o}(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=await r6(e);try{var l;let s;await T("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",ac(e),"1","-destination",(l=e,s=ad(l),"macOS"===s?`platform=macOS,arch=${au()}`:"simulator"===l.kind?`platform=${s} Simulator,id=${l.id}`:`generic/platform=${s}`),"-derivedDataPath",n,"COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO",...a,...o,...i],{detached:!0,onSpawn:e=>{r1.add(e),e.on("close",()=>{r1.delete(e)})},onStdoutChunk:e=>{rL(e,r.logPath,r.traceLogPath,r.verbose)},onStderrChunk:e=>{rL(e,r.logPath,r.traceLogPath,r.verbose)}})}catch(i){let e,t,n=i instanceof y?i:new y("COMMAND_FAILED",String(i)),a=(e=n.details?JSON.stringify(n.details):"",(t=`${n.message}
13
+ ${e}`.toLowerCase()).includes("failed registering bundle identifier")||t.includes("app identifier")&&t.includes("not available")?"Set AGENT_DEVICE_IOS_BUNDLE_ID to a unique reverse-DNS value (for example, com.yourname.agentdevice.runner), then retry.":t.includes("requires a development team")?"Configure signing in Xcode or set AGENT_DEVICE_IOS_TEAM_ID for physical-device runs.":t.includes("no profiles for")||t.includes("provisioning profile")?"Install/select a valid iOS provisioning profile, or set AGENT_DEVICE_IOS_PROVISIONING_PROFILE.":t.includes("code signing")?"Enable Automatic Signing in Xcode or provide AGENT_DEVICE_IOS_TEAM_ID and optional AGENT_DEVICE_IOS_SIGNING_IDENTITY.":void 0);throw new y("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:n.message,details:n.details,logPath:r.logPath,hint:a})}finally{await s?.release()}}function ad(e){var t;if("ios"!==e.platform&&"macos"!==e.platform)throw new y("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);return"macos"===e.platform?"macOS":"macos"===(t=e.target)||"desktop"===t?"macOS":"tv"===t?"tvOS":"iOS"}function au(){return"arm64"===process.arch?"arm64":"x86_64"}function ac(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function ap(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()&&!function(e=process.env){return X(e.AGENT_DEVICE_IOS_ALLOW_OVERRIDE_DERIVED_CLEAN)}(t))throw new y("COMMAND_FAILED","Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically",{derivedPath:e,hint:"Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or set AGENT_DEVICE_IOS_ALLOW_OVERRIDE_DERIVED_CLEAN=1 if you trust this path."})}function af(e,t,n){eI({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...n}})}function ah(e){let t=function(e){let t=function(e){try{let t=L("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())return null;return JSON.parse(t.stdout)}catch{return null}}(e);if(t){var r,a,i=t;let e=new Set,n=t=>{if(t&&"object"==typeof t)for(let n of function(e){let t=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]),n=new Set;for(let[r,a]of Object.entries(e))if(t.has(r)){if("string"==typeof a){n.add(a);continue}if(Array.isArray(a))for(let e of a)"string"==typeof e&&n.add(e)}return Array.from(n)}(t))e.add(n)};n(i);let o=i.TestConfigurations;if(Array.isArray(o))for(let e of o){if(!e||"object"!=typeof e)continue;let t=e.TestTargets;if(Array.isArray(t))for(let e of t)n(e)}for(let e of Object.values(i))e&&"object"==typeof e&&"TestBundlePath"in e&&n(e);return Array.from(e)}if("darwin"===process.platform)return null;try{let t;return r=n.readFileSync(e,"utf8"),a=nS(r),t=new Set,nN(a,(e,n)=>{if(rQ.has(e)){if("string"===n.name&&n.text)return void t.add(n.text);if("array"===n.name)for(let e of n.children)"string"===e.name&&e.text&&t.add(e.text)}}),Array.from(t)}catch{return null}}(e);if(!t||0===t.length)return null;let r=i.dirname(e),a=new Set,o=new Set,s=[];for(let e of t){if(e.startsWith("__TESTROOT__/")){let t=e.slice(13),s=i.join(r,t);if(!n.existsSync(s))return null;a.add(s);let l=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(t);l&&o.add(i.join(r,l));continue}e.startsWith("__TESTHOST__/")&&s.push(e.slice(13))}for(let e of s){let t=Array.from(o).find(t=>n.existsSync(i.join(t,e)));if(!t)return null;a.add(i.join(t,e))}return Array.from(a)}let am=new Map,aw=new Map;async function ag(e,t){return await rV(aw,e.id,async()=>{var n;let r,a,i=am.get(e.id);if(i){if(aN(i.child.pid))return i;await aI(e.id,i)}await ("simulator"!==(n=e).kind?Promise.resolve():ak(n)),await ay(e);let o=await at(e,t),s=await rT(),{xctestrunPath:l,jsonPath:d}=await as(o,{AGENT_DEVICE_RUNNER_PORT:String(s)},`session-${e.id}-${s}`),u=await r6(e);try{let t;({child:r,wait:a}=P("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",ac(e),"1","-destination-timeout",String(rk),"-xctestrun",l,"-destination",(t=ad(e),"macOS"===t?`platform=macOS,arch=${au()}`:"simulator"===e.kind?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(s)},detached:!0}))}catch(e){throw await u?.release(),e}r.stdout?.on("data",e=>{rL(e,t.logPath,t.traceLogPath,t.verbose)}),r.stderr?.on("data",e=>{rL(e,t.logPath,t.traceLogPath,t.verbose)});let c={sessionId:`${e.id}:${s}:${Date.now()}`,device:e,deviceId:e.id,port:s,xctestrunPath:l,jsonPath:d,testPromise:a,child:r,ready:!1,simulatorSetRedirect:u??void 0};return am.set(e.id,c),c})}async function ay(e){if("simulator"===e.kind)for(let t of r4){let n=await $("xcrun",nm(e,["uninstall",e.id,t]),{allowFailure:!0});if(0!==n.exitCode){let e=`${n.stdout}
14
+ ${n.stderr}`.toLowerCase();if(!e.includes("not installed")&&!e.includes("found nothing")&&!e.includes("no such file")&&!e.includes("invalid device")&&!e.includes("could not find"))continue}}}function ab(e){let t=am.get(e);return t?{sessionId:t.sessionId,alive:aN(t.child.pid)}:null}async function av(e){await rV(aw,e.deviceId,async()=>{await aI(e.deviceId,e)})}async function aI(e,t){let n=t??am.get(e);if(n){var r;try{await rD(n.device,n.port,{command:"shutdown"},void 0,15e3)}catch{await a_(n.child.pid,"SIGTERM")}try{await Promise.race([n.testPromise,new Promise(e=>setTimeout(e,1e4))])}catch{}(r=n.child.pid)&&(aN(r)||ew(r))&&await a_(n.child.pid,"SIGKILL"),rU(n.xctestrunPath),rU(n.jsonPath),await n.simulatorSetRedirect?.release(),am.get(e)===n&&am.delete(e)}}async function aA(e){await rV(aw,e,async()=>{await aI(e)})}async function ax(){let e=Array.from(am.values()),t=Array.from(r1);await Promise.allSettled(e.map(async e=>{await a_(e.child.pid,"SIGINT")})),await Promise.allSettled(t.map(async e=>{await a_(e.pid,"SIGINT")})),await Promise.allSettled(e.map(async e=>{await a_(e.child.pid,"SIGTERM")})),await Promise.allSettled(t.map(async e=>{await a_(e.pid,"SIGTERM")})),await Promise.allSettled(e.map(async e=>{await a_(e.child.pid,"SIGKILL")})),await Promise.allSettled(t.map(async e=>{await a_(e.pid,"SIGKILL"),r1.delete(e)})),await Promise.allSettled(e.map(async e=>{await e.simulatorSetRedirect?.release()}))}async function aS(){await ax();let e=Array.from(am.keys());await Promise.allSettled(e.map(async e=>{await aA(e)}));let t=Array.from(r1);await Promise.allSettled(t.map(async e=>{try{await a_(e.pid,"SIGTERM"),await a_(e.pid,"SIGKILL")}finally{r1.delete(e)}}))}function aN(e){return!!e&&eg(e)}async function a_(e,t){if(!e||e<=0)return;try{process.kill(-e,t)}catch{}try{process.kill(e,t)}catch{}let n="SIGINT"===t?"INT":"SIGTERM"===t?"TERM":"KILL";try{await $("pkill",[`-${n}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function ak(e){await $("xcrun",nm(e,["bootstatus",e.id,"-b"]),{timeoutMs:rv})}async function aM(e,t,n,r,a,i){let o=await rD(e,t.port,n,r,a,t,i);return await aD(o,t,r)}async function aD(e,t,n){let r,a=await e.text();try{let e=JSON.parse(a);r=e&&"object"==typeof e?e:{}}catch{throw new y("COMMAND_FAILED","Invalid runner response",{text:a})}if(!r.ok){let e=r.error?.code;throw new y("string"==typeof e&&e.trim().length>0?m(e):"COMMAND_FAILED",("string"==typeof r.error?.message?r.error.message:void 0)??"Runner error",{runner:r,xcodebuild:{exitCode:1,stdout:"",stderr:""},logPath:n})}return(t.ready=!0,r.data&&"object"==typeof r.data&&!Array.isArray(r.data))?r.data:{}}async function aE(e,t,n={}){var r;if("ios"!==e.platform&&"macos"!==e.platform)throw new y("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new y("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`);return(rb(n.requestId),"interactionFrame"===(r=t.command)||"snapshot"===r||"screenshot"===r||"findText"===r||"readText"===r||"alert"===r||"uptime"===r)?B(()=>(rb(n.requestId),aO(e,t,n)),{shouldRetry:e=>{rb(n.requestId);if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=`${e.message??""}`.toLowerCase();return!(t.includes("xcodebuild exited early")||t.includes("device is busy")&&t.includes("connecting"))&&!!(t.includes("runner did not accept connection")||t.includes("fetch failed")||t.includes("econnrefused")||t.includes("socket hang up"))}}):aO(e,t,n)}async function aO(e,t,n={}){let r;rb(n.requestId);let a=rf(n.requestId);try{let i=(r=await ag(e,n)).ready?rI:rv;return await aM(e,r,t,n.logPath,i,a)}catch(o){let i=o instanceof y?o:new y("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===i.code&&"string"==typeof i.message&&i.message.includes("Runner did not accept connection")&&rw(i)&&r?.ready){rb(n.requestId),r?await av(r):await aA(e.id),r=await ag(e,n);let i=await rD(r.device,r.port,t,n.logPath,rv,void 0,a);return await aD(i,r,n.logPath)}throw o}}let aC=["--time","9:41","--dataNetwork","wifi","--wifiMode","active","--wifiBars","3","--batteryState","charged","--batteryLevel","100"],aR={0:"hide",1:"wifi",6:"3g",7:"4g",8:"lte",9:"lte-a",10:"lte+",11:"5g",12:"5g+",13:"5g-uwb",14:"5g-uc"},aP={1:"searching",2:"failed",3:"active"},aT={0:"notSupported",1:"searching",2:"failed",3:"active"};function aL(e,t,n){return $("xcrun",nm(e,t),n)}async function a$(e,t){var n,r;let a;await aU(e),t&&await aG(e,(a=[],(n=t).dataNetwork&&a.push("--dataNetwork",n.dataNetwork),n.wifiMode&&a.push("--wifiMode",n.wifiMode),void 0!==n.wifiBars&&("wifi"===n.dataNetwork||n.wifiMode)&&a.push("--wifiBars",n.wifiBars),n.cellularMode&&a.push("--cellularMode",n.cellularMode),void 0!==n.cellularBars&&(n.cellularMode||(r=n.dataNetwork)&&"hide"!==r&&"wifi"!==r||void 0!==n.operatorName)&&a.push("--cellularBars",n.cellularBars),void 0!==n.operatorName&&a.push("--operatorName",n.operatorName),a))}async function aF(e){let t=await aL(e,["status_bar",e.id,"list"],{allowFailure:!0});if(0!==t.exitCode)throw new y("COMMAND_FAILED","Failed to read simulator status bar overrides",{exitCode:t.exitCode,stdout:t.stdout,stderr:t.stderr});return function(e){let t={};for(let n of e.split("\n").map(e=>e.trim()).filter(e=>e.length>0&&"Current Status Bar Overrides:"!==e&&!/^=+$/.test(e))){let e=/^DataNetworkType:\s+(\d+)$/.exec(n);if(e){let n=Number(e[1]),r=aR[n];if(!r)throw new y("COMMAND_FAILED",`Unsupported simulator data network type: ${n}`);t.dataNetwork=r;continue}let r=/^WiFi Mode:\s+(\d+),\s+WiFi Bars:\s+(\d+)$/.exec(n);if(r){let e=aP[Number(r[1])];e&&(t.wifiMode=e),t.wifiBars=r[2];continue}let a=/^Cell Mode:\s+(\d+),\s+Cell Bars:\s+(\d+)$/.exec(n);if(a){let e=Number(a[1]),n=aT[e];if(!n)throw new y("COMMAND_FAILED",`Unsupported simulator cellular mode: ${e}`);t.cellularMode=n,t.cellularBars=a[2];continue}let i=/^Operator Name:\s*(.*)$/.exec(n);if(i){t.operatorName=i[1]??"";continue}}return 0===Object.keys(t).length?null:t}(t.stdout)}async function aU(e){await aL(e,["status_bar",e.id,"clear"])}async function aG(e,t){0!==t.length&&await aL(e,["status_bar",e.id,"override",...t])}function aV(e,t,n){eI({level:"warn",phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...function(e){if(!(e instanceof y))return{reason:e instanceof Error?e.message:String(e)};let t=e.details??{},n=Array.isArray(t.args)?t.args.filter(e=>"string"==typeof e).join(" "):void 0;return{errorCode:e.code,reason:e.message,timeoutMs:"number"==typeof t.timeoutMs?t.timeoutMs:void 0,exitCode:"number"==typeof t.exitCode?t.exitCode:void 0,stderr:"string"==typeof t.stderr&&t.stderr.trim()?t.stderr:void 0,stdout:"string"==typeof t.stdout&&t.stdout.trim()?t.stdout:void 0,commandArgs:n}}(n)}})}function aB(e,t,n){return $("xcrun",nm(e,t),n)}let aj={ensureBooted:nv,prepareStatusBarForScreenshot:async function e(e){let t=null,n=!1;try{t=await aF(e),n=!0}catch(t){aV(e,"snapshot_failed",t)}try{await aU(e),await aG(e,aC)}catch(t){aV(e,"prepare_failed",t)}return async()=>{await a$(e,n?t:null)}},captureWithRetry:aH,runnerFallbackEnabled:nl,captureWithRunner:az,shouldFallbackToRunner:a0};async function aq(e,t,n,r){if("macos"===e.platform)return void await az(e,t,n,r);if("simulator"===e.kind)return void await aX(e,t,n,r);try{await nd(["device","screenshot","--device",e.id,t],{action:"capture iOS screenshot",deviceId:e.id});return}catch(t){if(!function(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details??{},n="string"==typeof t.stdout?t.stdout:"",r="string"==typeof t.stderr?t.stderr:"",a=`${e.message}
15
+ ${n}
16
+ ${r}`.toLowerCase();return a.includes("unknown option '--device'")||a.includes("unknown subcommand")&&a.includes("screenshot")||a.includes("unrecognized subcommand")&&a.includes("screenshot")}(t))throw t;aJ(e,"devicectl_screenshot",t)}await az(e,t,n,r)}async function aX(e,t,n,r,a=aj){if("simulator"!==e.kind)throw new y("UNSUPPORTED_OPERATION","Simulator screenshot fallback flow supports only iOS simulators");let i="object"==typeof r&&null!==r?r:a;await i.ensureBooted(e);let o=async()=>{};try{o=await i.prepareStatusBarForScreenshot(e)}catch(t){aZ(e,"prepare_failed",t)}try{try{await i.captureWithRetry(e,t);return}catch(t){if(!i.shouldFallbackToRunner(t))throw t;if(!i.runnerFallbackEnabled){var s,l,d;let n,r;throw s=e,l=t,n=aQ(l),eI({level:"warn",phase:"ios_screenshot_fallback_skipped",data:{platform:s.platform,deviceKind:s.kind,deviceId:s.id,from:"simctl_screenshot",to:"runner",reason:"Simulator runner fallback is disabled to avoid XCTest automation instability during screenshot capture.",...n}}),r=(d=t)instanceof y?d:new y("COMMAND_FAILED","Failed to capture iOS screenshot: simulator screenshot retries exhausted",void 0,d),new y(r.code,r.message,{...r.details??{},hint:"Restart the simulator and retry. If simctl screenshots keep timing out and you accept the stability tradeoff, set AGENT_DEVICE_IOS_SIMULATOR_SCREENSHOT_RUNNER_FALLBACK=1 to allow XCTest runner fallback."},r)}aJ(e,"simctl_screenshot",t)}await i.captureWithRunner(e,t,n,"boolean"==typeof r?r:void 0)}finally{await o().catch(t=>aZ(e,"restore_failed",t))}}async function aH(e,t){let n=q.fromTimeoutMs(no);await et(async({deadline:n})=>{await aB(e,["io",e.id,"screenshot",t],{timeoutMs:Math.max(1e3,n?.remainingMs()??no)})},{maxAttempts:5,baseDelayMs:1e3,maxDelayMs:5e3,jitter:.2,shouldRetry:e=>a0(e)},{deadline:n,phase:"ios_simulator_screenshot"})}async function az(e,t,n,r){let i=(await aE(e,{command:"screenshot",appBundleId:n,fullscreen:r})).message;if(!i)throw new y("COMMAND_FAILED","Failed to capture iOS screenshot: runner returned no file path");"macos"===e.platform?await a.copyFile(i,t):"simulator"===e.kind?await aY(e,i,t):await aK(e,i,t)}async function aK(e,t,n){let r=q.fromTimeoutMs(ns),a={exitCode:1,stdout:"",stderr:""};for(let i of r4)if(0===(a=await $("xcrun",["devicectl","device","copy","from","--device",e.id,"--source",t,"--destination",n,"--domain-type","appDataContainer","--domain-identifier",i],{allowFailure:!0,timeoutMs:aW(r,ns,"runner screenshot copy")})).exitCode)return;let i=a.stderr.trim()||a.stdout.trim()||`devicectl exited with code ${a.exitCode}`;throw new y("COMMAND_FAILED",`Failed to capture iOS screenshot: ${i}`)}async function aY(e,t,n){let r=q.fromTimeoutMs(ns),o="Unable to locate runner container for simulator screenshot";for(let s of r4){let l=await aB(e,["get_app_container",e.id,s,"data"],{allowFailure:!0,timeoutMs:aW(r,ns,"runner screenshot container lookup")});if(0!==l.exitCode){let e=l.stderr.trim();e&&(o=e);continue}let d=l.stdout.trim();if(!d){o="simctl get_app_container returned empty output";continue}for(let e of function(e,t){let n=i.resolve(e),r=t.trim();if(!r)return[];let a=[],o=new Set,s=e=>{let t=i.normalize(e);o.has(t)||(o.add(t),a.push(t))},l=r.replace(/^\/+/,""),d=l.replace(/\\/g,"/");if(l&&s(i.join(n,l)),i.isAbsolute(r)&&s(i.normalize(r)),d.startsWith("tmp/"))s(i.join(n,d));else{let e=d.lastIndexOf("/tmp/");if(e>=0){let t=d.slice(e+1);s(i.join(n,t))}}let u=i.basename(r);return u&&s(i.join(n,"tmp",u)),a}(d,t))try{await a.copyFile(e,n);return}catch(e){o=e instanceof Error?e.message:String(e)}}throw new y("COMMAND_FAILED",`Failed to capture iOS screenshot: ${o}`)}function aW(e,t,n){let r=e.remainingMs();if(r>0)return r;throw new y("COMMAND_FAILED",`iOS ${n} timed out after ${t}ms`,{timeoutMs:t,step:n})}function aJ(e,t,n){let r=aQ(n);eI({level:"warn",phase:"ios_screenshot_fallback",data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:t,to:"runner",...r}})}function aZ(e,t,n){eI({level:"warn",phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...aQ(n)}})}function aQ(e){if(!(e instanceof y))return{reason:e instanceof Error?e.message:String(e)};let t=e.details??{},n=Array.isArray(t.args)?t.args.filter(e=>"string"==typeof e).join(" "):void 0;return{errorCode:e.code,reason:e.message,timeoutMs:"number"==typeof t.timeoutMs?t.timeoutMs:void 0,exitCode:"number"==typeof t.exitCode?t.exitCode:void 0,stderr:"string"==typeof t.stderr&&t.stderr.trim()?t.stderr:void 0,stdout:"string"==typeof t.stdout&&t.stdout.trim()?t.stdout:void 0,commandArgs:n}}function a0(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details??{},n="string"==typeof t.stdout?t.stdout:"",r="string"==typeof t.stderr?t.stderr:"",a=Array.isArray(t.args)?t.args.filter(e=>"string"==typeof e).join(" "):"",i=`${e.message}
17
+ ${n}
18
+ ${r}
19
+ ${a}`.toLowerCase();return i.includes("timeout waiting for screen surfaces")||i.includes("nsposixerrordomain")&&i.includes("code=60")&&i.includes("screenshot")||i.includes("timed out")&&i.includes("screenshot")}let a1={settings:"com.apple.Preferences"},a2=er(),a3=null;function a5(e){return{platform:"ios",deviceId:e.id,variant:e.kind}}function a4(e,t,n){return $("xcrun",nm(e,t),n)}function a8(e){return e.includes("not installed")||e.includes("not found")||e.includes("no such file")}async function a6(e,t){if("macos"===e.platform)return await n8(t);let n=t.trim();if(n.includes("."))return n;let r=a1[n.toLowerCase()];if(r)return r;let a=a5(e),i=a2.get(a,n);if(i)return i;let o=("simulator"===e.kind?await ic(e):await nu(e,"all")).filter(e=>e.name.toLowerCase()===n.toLowerCase());if(1===o.length)return a2.set(a,n,o[0].bundleId);if(o.length>1)throw new y("INVALID_ARGS",`Multiple apps matched "${t}"`,{matches:o});throw new y("APP_NOT_INSTALLED",`No app found matching "${t}"`)}async function a9(e,t,n){if("macos"===e.platform)return void await n6(e,t,n);let r=n?.url?.trim();if(r){if(!ea(r))throw new y("INVALID_ARGS","open <app> <url> requires a valid URL target");if("simulator"===e.kind){await nv(e),await a4(e,["openurl",e.id,r]);return}let a=V(n?.appBundleId??await a6(e,t),r);if(!a)throw new y("INVALID_ARGS","Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.");await iI(e,a,{payloadUrl:r});return}let a=t.trim();if(ea(a)){if("simulator"===e.kind){await nv(e),await a4(e,["openurl",e.id,a]);return}let t=V(n?.appBundleId,a);if(!t)throw new y("INVALID_ARGS","Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.");await iI(e,t,{payloadUrl:a});return}let i=n?.appBundleId??await a6(e,t);"simulator"===e.kind?await iv(e,i):await iI(e,i)}async function a7(e){"macos"===e.platform||"simulator"!==e.kind||"Booted"!==await nA(e)&&await nv(e)}async function ie(e,t){if("macos"===e.platform)return void await n9(e,t);let n=await a6(e,t);if("simulator"===e.kind){await nv(e);let t=nm(e,["terminate",e.id,n]),r=await $("xcrun",t,{allowFailure:!0});if(0!==r.exitCode){if(r.stderr.toLowerCase().includes("found nothing to terminate"))return;throw new y("COMMAND_FAILED",`xcrun exited with code ${r.exitCode}`,{cmd:"xcrun",args:t,stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode})}return}await nd(["device","process","terminate","--device",e.id,n],{action:"terminate iOS app",deviceId:e.id})}async function it(e,t){return await a2.invalidateWhile(a5(e),async()=>{let n=await a6(e,t);if("simulator"!==e.kind){let t=["devicectl","device","uninstall","app","--device",e.id,n],r=await $("xcrun",t,{allowFailure:!0,timeoutMs:na});if(0!==r.exitCode){let a=String(r.stdout??""),i=String(r.stderr??"");if(!a8(`${a}
20
+ ${i}`.toLowerCase()))throw new y("COMMAND_FAILED",`Failed to uninstall iOS app ${n}`,{cmd:"xcrun",args:t,exitCode:r.exitCode,stdout:a,stderr:i,deviceId:e.id,hint:nf(a,i)??np})}return{bundleId:n}}await nv(e);let r=await a4(e,["uninstall",e.id,n],{allowFailure:!0});if(0!==r.exitCode&&!a8(`${r.stdout}
21
+ ${r.stderr}`.toLowerCase()))throw new y("COMMAND_FAILED",`simctl uninstall failed for ${n}`,{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});return{bundleId:n}})}async function ir(e,t,n){let r=await nM({kind:"path",path:t},n);try{return await ii(e,r.installablePath),{archivePath:r.archivePath,installablePath:r.installablePath,bundleId:r.bundleId,appName:r.appName,launchTarget:r.bundleId}}finally{await r.cleanup()}}async function ia(e,t,n){return await a2.invalidateWhile(a5(e),async()=>{let{bundleId:r}=await it(e,t);return await ir(e,n,{appIdentifierHint:t}),{bundleId:r}})}async function ii(e,t){await a2.invalidateWhile(a5(e),async()=>{"simulator"!==e.kind?await nd(["device","install","app","--device",e.id,t],{action:"install iOS app",deviceId:e.id}):(await nv(e),await a4(e,["install",e.id,t]))})}async function io(e){if("macos"===e.platform)return await n7();ny(e,"clipboard"),await nv(e);let t=await a4(e,["pbpaste",e.id],{allowFailure:!0});if(0!==t.exitCode)throw new y("COMMAND_FAILED","Failed to read iOS simulator clipboard",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});return t.stdout.replace(/\r\n/g,"\n").replace(/\n$/,"")}async function is(e,t){if("macos"===e.platform)return void await re(t);ny(e,"clipboard"),await nv(e);let n=await a4(e,["pbcopy",e.id],{allowFailure:!0,stdin:t});if(0!==n.exitCode)throw new y("COMMAND_FAILED","Failed to write iOS simulator clipboard",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})}async function il(e,t,n){ny(e,"push"),await nv(e);let r=await a.mkdtemp(i.join(s.tmpdir(),"agent-device-ios-push-")),o=i.join(r,"payload.apns");try{await a.writeFile(o,`${JSON.stringify(n)}
22
+ `,"utf8"),await a4(e,["push",e.id,t,o])}finally{await a.rm(r,{recursive:!0,force:!0})}}async function id(e,t,n,r,a){if("macos"===e.platform){let e=t.toLowerCase();if("appearance"===e)return void await rn(n);if("permission"===e){let e=tL(n);if("deny"===e)throw new y("INVALID_ARGS",ne("permission"));let t=function(e){let t=e?.trim().toLowerCase();if("accessibility"===t||"screen-recording"===t||"input-monitoring"===t)return t;throw new y("INVALID_ARGS","Unsupported macOS permission target. Use accessibility|screen-recording|input-monitoring.")}(a?.permissionTarget);return await nK(e,t)}throw new y("INVALID_ARGS",ne(t))}ny(e,"settings"),await nv(e);let i=t.toLowerCase();switch(i){case"wifi":{let t=ip(n);await a4(e,["status_bar",e.id,"override","--wifiMode",t?"active":"failed"]);return}case"airplane":return void(ip(n)?await a4(e,["status_bar",e.id,"override","--dataNetwork","hide","--wifiMode","failed","--wifiBars","0","--cellularMode","failed","--cellularBars","0","--operatorName",""]):await a4(e,["status_bar",e.id,"clear"]));case"location":{let t=ip(n);if(!r)throw new y("INVALID_ARGS","location setting requires an active app in session");await a4(e,["privacy",e.id,t?"grant":"revoke","location",r]);return}case"faceid":case"touchid":{let t=im[i],r=function(e,t){let n=e.trim().toLowerCase();if("match"===n)return"match";if("nonmatch"===n)return"nonmatch";if("enroll"===n)return"enroll";if("unenroll"===n)return"unenroll";throw new y("INVALID_ARGS",`Invalid ${t} state: ${e}. Use match|nonmatch|enroll|unenroll.`)}(n,i);await ib(e,r,{settingName:i,label:t.label,modalityAliases:t.modalityAliases});return}case"appearance":{let t=await ih(e,n);await a4(e,["ui",e.id,"appearance",t]);return}case"permission":{var o;if(!r)throw new y("INVALID_ARGS","permission setting requires an active app in session");let t="deny"===(o=tL(n))?"revoke":o,i=function(e,t){let n=t$(e);if("photos"!==n&&t?.trim())throw new y("INVALID_ARGS",`Permission mode is only supported for photos. Received: ${t}.`);if("camera"===n)return"camera";if("microphone"===n)return"microphone";if("contacts"===n)return"contacts";if("contacts-limited"===n)return"contacts-limited";if("notifications"===n)return"notifications";if("calendar"===n)return"calendar";if("location"===n)return"location";if("location-always"===n)return"location-always";if("media-library"===n)return"media-library";if("motion"===n)return"motion";if("reminders"===n)return"reminders";if("siri"===n)return"siri";if("photos"===n){let e=t?.trim().toLowerCase();if(!e||"full"===e)return"photos";if("limited"===e)return"photos-add";throw new y("INVALID_ARGS",`Invalid photos mode: ${t}. Use full|limited.`)}throw new y("INVALID_ARGS",`Unsupported permission target: ${e}. Use camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri.`)}(a?.permissionTarget,a?.permissionMode);await iw(e,t,i,r);return}default:throw new y("INVALID_ARGS",`Unsupported setting: ${t}`)}}async function iu(e,t="all"){return"macos"===e.platform?await rr(t):"simulator"===e.kind?nR(await ic(e),t):await nu(e,t)}async function ic(e){let t=(await a4(e,["listapps",e.id],{allowFailure:!0})).stdout.trim();if(!t)return[];let n=null;if(t.startsWith("{"))try{n=JSON.parse(t)}catch{n=null}if(!n&&t.startsWith("{"))try{let e=await $("plutil",["-convert","json","-o","-","-"],{allowFailure:!0,stdin:t});0===e.exitCode&&e.stdout.trim().startsWith("{")&&(n=JSON.parse(e.stdout))}catch{n=null}return n?Object.entries(n).map(([e,t])=>({bundleId:e,name:t.CFBundleDisplayName??t.CFBundleName??e})):[]}function ip(e){let t=e.toLowerCase();if("on"===t||"true"===t||"1"===t)return!0;if("off"===t||"false"===t||"0"===t)return!1;throw new y("INVALID_ARGS",`Invalid setting state: ${e}`)}async function ih(e,t){let n=tF(t);if("toggle"!==n)return n;let r=await a4(e,["ui",e.id,"appearance"],{allowFailure:!0});if(0!==r.exitCode)throw new y("COMMAND_FAILED","Failed to read current iOS appearance",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let a=function(e,t){let n=/\b(light|dark|unsupported|unknown)\b/i.exec(`${e}
23
+ ${t}`);if(!n)return null;let r=n[1].toLowerCase();return"dark"===r?"dark":"light"===r?"light":null}(r.stdout,r.stderr);if(!a)throw new y("COMMAND_FAILED","Unable to determine current iOS appearance for toggle",{stdout:r.stdout,stderr:r.stderr});return"dark"===a?"light":"dark"}let im={faceid:{label:"Face ID",modalityAliases:["face"]},touchid:{label:"Touch ID",modalityAliases:["finger","touch"]}};async function iw(e,t,n,r){let a=await iy(e);if(!a.has(n))throw new y("UNSUPPORTED_OPERATION",`iOS simctl privacy does not support service "${n}" on this runtime.`,{deviceId:e.id,appBundleId:r,hint:`Supported services: ${Array.from(a).sort().join(", ")}`});let i=["privacy",e.id,t,n,r],o="notifications"===n;if(!("reset"===t&&o))try{await a4(e,i);return}catch(t){if(!(o&&ig(t)))throw t;throw new y("UNSUPPORTED_OPERATION","iOS simulator does not support setting notifications permission via simctl privacy on this runtime.",{deviceId:e.id,appBundleId:r,hint:"Use reset notifications for reprompt behavior, or toggle notifications manually in Settings."})}try{await a4(e,i);return}catch(e){if(!ig(e))throw e}try{await a4(e,["privacy",e.id,"reset","all",r])}catch(t){throw new y("COMMAND_FAILED","iOS simulator blocked direct notifications reset. Fallback reset-all also failed.",{deviceId:e.id,appBundleId:r,hint:"Use reinstall to force a fresh notifications prompt, or reset simulator content and settings."},t instanceof Error?t:void 0)}}function ig(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=String(e.details?.stderr??"").toLowerCase();return(t.includes("failed to grant access")||t.includes("failed to revoke access")||t.includes("failed to reset access"))&&t.includes("operation not permitted")}async function iy(t){let n=G(t.simulatorSetPath),r=`${process.env.PATH??""}::${n??""}`;if(a3&&e===r)return a3;let a=await a4(t,["privacy","help"],{allowFailure:!0}),i=function(e){let t=new Set,n=!1;for(let r of e.split("\n")){let e=r.trim();if(!e)continue;if("service"===e){n=!0;continue}if(!n)continue;if(e.startsWith("bundle identifier"))break;let a=/^([a-z-]+)\s+-\s+/.exec(e);a&&t.add(a[1])}return t}(`${a.stdout}
24
+ ${a.stderr}`);if(0===i.size)throw new y("COMMAND_FAILED","Unable to determine supported simctl privacy services",{stdout:a.stdout,stderr:a.stderr,exitCode:a.exitCode,hint:"Run `xcrun simctl privacy help` manually to verify available services for this runtime."});return a3=i,e=r,i}async function ib(e,t,n){let r=function(e,t,n){let r=n.length>0?n:["face"];switch(t){case"match":return r.flatMap(t=>[["biometric",e,"match",t],["biometric","match",e,t]]);case"nonmatch":return r.flatMap(t=>[["biometric",e,"nonmatch",t],["biometric",e,"nomatch",t],["biometric","nonmatch",e,t],["biometric","nomatch",e,t]]);case"enroll":return[["biometric",e,"enroll","yes"],["biometric",e,"enroll","1"],["biometric","enroll",e,"yes"],["biometric","enroll",e,"1"]];case"unenroll":return[["biometric",e,"enroll","no"],["biometric",e,"enroll","0"],["biometric","enroll",e,"no"],["biometric","enroll",e,"0"]]}}(e.id,t,n.modalityAliases),a=[];for(let t of r){let n=nm(e,t),r=await $("xcrun",n,{allowFailure:!0});if(0===r.exitCode)return;a.push({args:n,stderr:r.stderr,stdout:r.stdout,exitCode:r.exitCode})}let i=a.map(e=>({args:e.args.join(" "),exitCode:e.exitCode,stderr:e.stderr.slice(0,400)}));if(a.length>0&&a.every(e=>{var t,n;let r;return t=e.stdout,n=e.stderr,(r=`${t}
25
+ ${n}`.toLowerCase()).includes("unrecognized subcommand")||r.includes("unknown subcommand")||r.includes("not supported")||r.includes("unavailable")||r.includes("biometric")&&r.includes("invalid")}))throw new y("UNSUPPORTED_OPERATION",`${n.label} simulation is not supported on this simulator runtime.`,{deviceId:e.id,action:t,setting:n.settingName,attempts:i});throw new y("COMMAND_FAILED",`Failed to simulate ${n.settingName}.`,{deviceId:e.id,action:t,setting:n.settingName,attempts:i})}async function iv(e,t){await nv(e);let n=0,r=q.fromTimeoutMs(nr);try{await et(async({deadline:n})=>{var r;if(n?.isExpired())throw new y("COMMAND_FAILED","App launch deadline exceeded",{timeoutMs:nr});let a=(r=["launch",e.id,t],nm(e,r)),i=await $("xcrun",a,{allowFailure:!0});if(0!==i.exitCode)throw new y("COMMAND_FAILED",`xcrun exited with code ${i.exitCode}`,{cmd:"xcrun",args:a,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode})},{maxAttempts:10,baseDelayMs:1e3,maxDelayMs:5e3,jitter:.2,shouldRetry:e=>!!nw(e)&&(n+=1)<3},{deadline:r})}catch(n){if(nw(n)){var a;let r=(a=await ng(e,t)).installed?!1===a.simulatorCompatible?"ARCH_MISMATCH":"PERSISTENT_LAUNCH_FAIL":"APP_NOT_INSTALLED";n.details={...n.details,hint:function(e){switch(e){case"ARCH_MISMATCH":return"The app binary was not built for the simulator platform. Rebuild with a simulator destination or use a physical device.";case"APP_NOT_INSTALLED":return"The app bundle is not installed on this simulator. Run install before open.";case"PERSISTENT_LAUNCH_FAIL":return"The simulator repeatedly refused to launch the app. Inspect crash logs in Console.app or ~/Library/Logs/DiagnosticReports/ and consider reinstalling the app.";default:return"The simulator failed to launch the app. Retry with --debug and inspect diagnostics log for details."}}(r)}}throw n}}async function iI(e,t,n){let r=["device","process","launch","--device",e.id,t];n?.payloadUrl&&r.push("--payload-url",n.payloadUrl),await nd(r,{action:"launch iOS app",deviceId:e.id})}async function iA(e,t,n,r,a,i,o){if("tv"===t.target)return iN(await e(t,{command:"swipe",direction:function(e){switch(e){case"up":return"down";case"down":return"up";case"left":return"right";case"right":return"left";default:return e}}(a),appBundleId:n.appBundleId},r),i);let s=o??await ix(e,t,n,r),l=ez({direction:a,amount:i?.amount,pixels:i?.pixels,referenceWidth:s.referenceWidth,referenceHeight:s.referenceHeight});return iN(await e(t,{command:"drag",x:s.originX+l.x1,y:s.originY+l.y1,x2:s.originX+l.x2,y2:s.originY+l.y2,appBundleId:n.appBundleId},r),{amount:l.amount,pixels:l.pixels,preferProvidedPixels:!0})}async function ix(e,t,n,r){let a=await e(t,{command:"interactionFrame",appBundleId:n.appBundleId},r),i=iS(a.x),o=iS(a.y),s=iS(a.referenceWidth),l=iS(a.referenceHeight);if(void 0===i||void 0===o||void 0===s||void 0===l)throw new y("COMMAND_FAILED","interactionFrame did not return a usable frame");return{originX:i,originY:o,referenceWidth:s,referenceHeight:l}}function iS(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function iN(e,t){var n;let{x1:r,y1:a,x2:i,y2:o}={x1:iS((n=e).x),y1:iS(n.y),x2:iS(n.x2),y2:iS(n.y2)},s=iS(e.referenceWidth),l=iS(e.referenceHeight),d=void 0!==r&&void 0!==i?Math.round(Math.abs(i-r)):void 0,u=void 0!==a&&void 0!==o?Math.round(Math.abs(o-a)):void 0,c=t?.preferProvidedPixels&&void 0!==t.pixels?t.pixels:d&&d>0?d:u&&u>0?u:void 0;return{...void 0!==r?{x1:r}:{},...void 0!==a?{y1:a}:{},...void 0!==i?{x2:i}:{},...void 0!==o?{y2:o}:{},...void 0!==s?{referenceWidth:s}:{},...void 0!==l?{referenceHeight:l}:{},...t?.amount!==void 0?{amount:t.amount}:{},...void 0!==c?{pixels:c}:{}}}function i_(){return process.env.WAYLAND_DISPLAY||"wayland"===process.env.XDG_SESSION_TYPE?"wayland":"x11"}let ik=null;async function iM(){if(ik)return ik;let e=i_();if("wayland"===e){if(await U("ydotool"))return ik={tool:"ydotool",display:e};throw new y("TOOL_MISSING","ydotool is required for input synthesis on Wayland (xdotool does not work on Wayland). Install it via your package manager.")}if(await U("xdotool"))return ik={tool:"xdotool",display:e};throw new y("TOOL_MISSING","xdotool is required for input synthesis on X11. Install it via your package manager.")}async function iD(...e){await $("xdotool",e,{allowFailure:!1,timeoutMs:1e4})}async function iE(...e){await $("ydotool",e,{allowFailure:!1,timeoutMs:1e4})}async function iO(e,t){let{tool:n}=await iM();"xdotool"===n?await iD("mousemove","--sync",String(e),String(t)):await iE("mousemove","--absolute","-x",String(e),"-y",String(t))}async function iC(e,t){let{tool:n}=await iM();"xdotool"===n?await iD("key","--clearmodifiers",e):await iE("key",...t)}async function iR(e,t,n,r){await iO(e,t);let{tool:a}=await iM();"xdotool"===a?await iD("click",n):await iE("click",r)}async function iP(e,t){await iR(e,t,"1","0xC0")}async function iT(e,t){await iR(e,t,"3","0xC1")}async function iL(e,t){await iR(e,t,"2","0xC2")}async function i$(e,t){let{tool:n}=await iM();await iO(e,t),"xdotool"===n?await iD("click","--repeat","2","1"):(await iE("click","0xC0"),await iE("click","0xC0"))}async function iF(e,t,n=800){let{tool:r}=await iM();await iO(e,t),"xdotool"===r?(await iD("mousedown","1"),await ec(n),await iD("mouseup","1")):(await iE("click","--down","0xC0"),await ec(n),await iE("click","--up","0xC0"))}async function iU(e,t){await iP(e,t)}async function iG(e,t,n,r,a=300){let{tool:i}=await iM();await iO(e,t),"xdotool"===i?(await iD("mousedown","1"),await iD("mousemove","--sync",String(n),String(r)),await ec(a),await iD("mouseup","1")):(await iE("click","--down","0xC0"),await iE("mousemove","--absolute","-x",String(n),"-y",String(r)),await ec(a),await iE("click","--up","0xC0"))}async function iV(e,t){let{tool:n}=await iM(),r=5;if(t?.pixels!=null?r="xdotool"===n?Math.max(1,Math.round(t.pixels/15)):Math.max(1,Math.round(t.pixels/40)):t?.amount!=null&&(r=Math.max(1,Math.round(5*(t.amount/.6)))),"xdotool"===n)await iD("click","--repeat",String(r),"up"===e?"4":"down"===e?"5":"left"===e?"6":"7");else if("up"===e||"down"===e){let t="up"===e?String(-r):String(r);await iE("mousemove","--wheel","-y",t)}else{let t="left"===e?String(-r):String(r);await iE("mousemove","--wheel","-x",t)}}async function iB(e,t=0){let{tool:n}=await iM();if("xdotool"===n){let n=["type"];t>0&&n.push("--delay",String(t)),n.push("--clearmodifiers","--",e),await iD(...n)}else await iE("type","--",e)}async function ij(e,t,n,r=0){await iP(e,t),await ec(100),await iC("ctrl+a",["29:1","30:1","30:0","29:0"]),await ec(50),await iB(n,r)}function iq(e){let t=null;return{resolve:async function(){if(t)return t;let n="wayland"===i_()?"wayland":"x11";for(let r of"wayland"===n?e.wayland:e.x11)if(await U(r.command))return t={tool:r.tool,display:n};throw new y("TOOL_MISSING","wayland"===n?e.waylandError:e.x11Error)},resetCache:()=>{t=null}}}let iX=iq({wayland:[{tool:"grim",command:"grim"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],x11:[{tool:"scrot",command:"scrot"},{tool:"import",command:"import"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],waylandError:"grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.",x11Error:"scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager."});async function iH(e){let{tool:t}=await iX.resolve();switch(t){case"grim":await $("grim",[e]);break;case"scrot":await $("scrot",[e]);break;case"import":await $("import",["-window","root",e]);break;case"gnome-screenshot":await $("gnome-screenshot",["-f",e])}}async function iz(e){if(e.includes("://")||e.startsWith("/"))return void await $("xdg-open",[e]);if(await U(e)){$(e,[],{allowFailure:!0}).catch(t=>{eI({level:"warn",phase:"linux_app_launch",data:{app:e,error:String(t)}})}),await ec(500);return}await $("xdg-open",[e],{allowFailure:!0})}async function iK(e){await U("wmctrl")?await $("wmctrl",["-c",e],{allowFailure:!0}):await $("pkill",["-x",e],{allowFailure:!0})}async function iY(){await iC("alt+Left",["56:1","105:1","105:0","56:0"])}async function iW(){await iC("super+d",["125:1","32:1","32:0","125:0"])}let iJ=iq({wayland:[{tool:"wl-clipboard",command:"wl-paste"}],x11:[{tool:"xclip",command:"xclip"},{tool:"xsel",command:"xsel"}],waylandError:"wl-paste (wl-clipboard) is required for clipboard access on Wayland. Install via your package manager.",x11Error:"xclip or xsel is required for clipboard access on X11. Install via your package manager."});async function iZ(){let{tool:e}=await iJ.resolve();switch(e){case"wl-clipboard":return(await $("wl-paste",["--no-newline"],{allowFailure:!0,timeoutMs:5e3})).stdout;case"xclip":return(await $("xclip",["-selection","clipboard","-o"],{allowFailure:!0,timeoutMs:5e3})).stdout;case"xsel":return(await $("xsel",["--clipboard","--output"],{allowFailure:!0,timeoutMs:5e3})).stdout}}async function iQ(e){let{tool:t}=await iJ.resolve();switch(t){case"wl-clipboard":await $("wl-copy",["--",e],{allowFailure:!1,timeoutMs:5e3});break;case"xclip":await $("xclip",["-selection","clipboard"],{allowFailure:!1,timeoutMs:5e3,stdin:e});break;case"xsel":await $("xsel",["--clipboard","--input"],{allowFailure:!1,timeoutMs:5e3,stdin:e})}}iJ.resetCache;let i0={"push button":"Button","toggle button":"Button","push button menu":"Button",label:"StaticText",static:"StaticText",caption:"StaticText",text:"TextField",entry:"TextField","password text":"TextField","spin button":"TextField",terminal:"TextArea","document text":"TextArea",paragraph:"TextArea",frame:"Window",window:"Window",dialog:"Dialog",alert:"Alert","file chooser":"Dialog","color chooser":"Dialog","font chooser":"Dialog",panel:"Group",filler:"Group",section:"Group",form:"Group",grouping:"Group","layered pane":"Group","glass pane":"Group","root pane":"Group","option pane":"Group","internal frame":"Group","desktop frame":"Group","block quote":"Group",article:"Group",comment:"Group",landmark:"Group",log:"Group",marquee:"Group",math:"Group",notification:"Group","content deletion":"Group","content insertion":"Group",mark:"Group",suggestion:"Group","scroll pane":"ScrollArea","scroll bar":"ScrollBar","menu bar":"MenuBar",menu:"Menu","popup menu":"Menu","menu item":"MenuItem","check menu item":"MenuItem","radio menu item":"MenuItem","tearoff menu item":"MenuItem","check box":"CheckBox","radio button":"RadioButton",switch:"Switch","combo box":"ComboBox","page tab":"Tab","page tab list":"TabList",table:"Table","tree table":"Table","table cell":"Cell","table row":"Row","table column header":"Cell","table row header":"Cell","column header":"Cell","row header":"Cell",list:"List","list item":"ListItem","list box":"List",tree:"Tree","tree item":"TreeItem","description list":"List","description term":"ListItem","description value":"ListItem","tool bar":"Toolbar","status bar":"StatusBar","info bar":"StatusBar",slider:"Slider","progress bar":"ProgressBar","level bar":"ProgressBar",image:"Image",icon:"Image",animation:"Image",canvas:"Image","drawing area":"Image",video:"Video",audio:"Audio",link:"Link",hyperlink:"Link",separator:"Separator",application:"Application","tool tip":"Tooltip",timer:"Timer",heading:"Heading",footnote:"Footnote","title bar":"TitleBar","date editor":"DateEditor",rating:"Slider"},i1="atspi-dump.py",i2=null;async function i3(e,t={}){let r;if("linux"!==process.platform)throw new y("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await U("python3"))throw new y("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let a=t.maxNodes??1500,o=t.maxDepth??12,s=t.maxApps??24,l=[function(){if(i2)return i2;let e=i.dirname(c(import.meta.url));for(let t=0;t<5;t++){let r=i.join(e,"src","platforms","linux",i1);if(n.existsSync(r))return i2=r,r;if(0===t){let t=i.join(e,i1);if(n.existsSync(t))return i2=t,t}e=i.dirname(e)}throw new y("TOOL_MISSING",`Cannot find ${i1}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(a),"--max-depth",String(o),"--max-apps",String(s)],d=await $("python3",l,{allowFailure:!0,timeoutMs:3e4});if(0!==d.exitCode){let e=d.stderr.trim();if(e.includes("No module named")||e.includes("gi.require_version"))throw new y("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new y("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${d.exitCode}): ${e||d.stdout}`)}try{r=JSON.parse(d.stdout)}catch{throw new y("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${d.stdout.slice(0,200)}`)}if(r.error)throw new y("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,n;return{index:e.index,type:(n=i0[t=e.role.toLowerCase().trim()])||t.split(/[\s_-]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(""),role:e.role,label:e.label??void 0,value:e.value??void 0,rect:e.rect??void 0,enabled:e.enabled??void 0,selected:e.selected??void 0,hittable:e.hittable??void 0,depth:e.depth,parentIndex:e.parentIndex??void 0,pid:e.pid??void 0,appName:e.appName??void 0,windowTitle:e.windowTitle??void 0}}),truncated:r.truncated,surface:e}}async function i5(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&eI({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),n=await i3(t);return{nodes:n.nodes,truncated:n.truncated}}function i4(e){return e?.clickButton??"primary"}function i8(e){return"primary"===e.button?null:"click"!==e.commandLabel?new y("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new y("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new y("UNSUPPORTED_OPERATION","click --button middle is not supported by the macOS runner yet"):"number"==typeof e.count||"number"==typeof e.intervalMs||"number"==typeof e.holdMs||"number"==typeof e.jitterPx||!0===e.doubleTap?new y("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function i6(e){return"primary"===e?{}:{button:e}}let i9=/^[A-Za-z0-9_.:-]{1,64}$/;function i7(e,t,n,r){if(!Number.isFinite(e)||!Number.isInteger(e)||e<n||e>r)throw new y("INVALID_ARGS",`${t} must be an integer between ${n} and ${r}`);return e}let oe=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];async function ot(e,t,n){for(let r=0;r<e;r+=1)await n(r),r<e-1&&t>0&&await ec(t)}function on(e,t){let r,a=t?.subject??"Payload",i=e.trim();if(!i)throw new y("INVALID_ARGS",`${a} cannot be empty`);let o=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!n.statSync(o).isFile())throw new y("INVALID_ARGS",`${a} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof y)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new y("INVALID_ARGS",`${a} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new y("COMMAND_FAILED",`Unable to read ${a} file: ${o}`,{cause:String(t)})}if((r=i.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:i};throw new y("INVALID_ARGS",`${a} file not found: ${o}`)}async function or(e){let t=on(e,{subject:"Push payload"}),n="inline"===t.kind?t.text:await oa(t.path);try{let e=JSON.parse(n);if(!e||"object"!=typeof e||Array.isArray(e))throw new y("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof y)throw t;throw new y("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function oa(e){try{return await a.readFile(e,"utf8")}catch(n){let t=n.code;if("ENOENT"===t)throw new y("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new y("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new y("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new y("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(n)})}}function oi(e){if(void 0===e)throw new y("INVALID_ARGS","rotate requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.");switch(e?.trim().toLowerCase()){case"portrait":return"portrait";case"portrait-upside-down":case"upside-down":return"portrait-upside-down";case"landscape-left":case"left":return"landscape-left";case"landscape-right":case"right":return"landscape-right";default:throw new y("INVALID_ARGS",`Invalid rotation: ${e}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}let oo=ep(process.env.AGENT_DEVICE_IOS_DEVICECTL_LIST_TIMEOUT_MS,8e3,500),os=/^(iphone|ipad|ipod|appletv)/i,ol=/\b(iphone|ipad|ipod)\b/i,od=/^appletv/i,ou=["apple tv","appletv","tvos"],oc=/^==\s*(.+?)\s*==$/,op=/^(?<name>.+?)\s+\[(?<id>[^[\]]+)\]\s*$/;function of(e){return(e??"").trim().toLowerCase()}function oh(e){return of(e.hardwareProperties?.platform)}function om(e){return e.includes("tvos")}function ow(e){let t=of(e);return ou.some(e=>t.includes(e))}function og(e){return[e.name??"",e.deviceProperties?.name??"",e.deviceProperties?.deviceType??""]}function oy(e){return e.hardwareProperties?.productType??e.deviceProperties?.productType??""}async function ob(e={}){let t,n,r=G(e.simulatorSetPath),a=e.target;try{t=await $("xcrun",nh(["list","devices","-j"],{simulatorSetPath:r}))}catch{return null}try{n=JSON.parse(t.stdout)}catch{return null}let i=ov(n,r),o=null,s=null,l=null;for(let e of i)a&&e.target!==a||(e.booted&&(o=o??e),"mobile"===e.target&&(s=s??e),l=l??e);return o??s??l}function ov(e,t){let n=[];for(let[r,a]of Object.entries(e.devices))if(function(e){let t=of(e);return t.includes("ios")||t.includes("tvos")}(r))for(let e of a)e.isAvailable&&n.push({platform:"ios",id:e.udid,name:e.name,kind:"simulator",target:om(of(r))?"tv":"mobile",booted:"Booted"===e.state,...t?{simulatorSetPath:t}:{}});return n}function oI(e,t){let n=new Set(e.map(e=>e.id)),r=[...e];for(let e of t)n.has(e.id)||(n.add(e.id),r.push(e));return r}async function oA(){let e=null;try{e=i.join(s.tmpdir(),`agent-device-devicectl-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`);let t=await $("xcrun",["devicectl","list","devices","--json-output",e],{allowFailure:!0,timeoutMs:oo});if(0!==t.exitCode)return[];let n=await a.readFile(e,"utf8");return function(e){let t=[];for(let n of e.result?.devices??[]){if(!function(e){var t;let n=oh(e);return!!(n.includes("ios")||n.includes("tvos"))||(t=oy(e),!!os.test(t.trim())||og(e).some(ow))}(n))continue;let e=n.hardwareProperties?.udid??n.identifier??"",r=n.name??n.deviceProperties?.name??e;e&&t.push({platform:"ios",id:e,name:r,kind:"device",target:function(e){var t;return om(oh(e))?"tv":(t=oy(e),od.test(t.trim())||og(e).some(ow))?"tv":"mobile"}(n),booted:!0})}return t}(JSON.parse(n))}catch{return[]}finally{e&&await a.rm(e,{force:!0}).catch(()=>{})}}async function ox(){try{let e=await $("xcrun",["xctrace","list","devices"],{allowFailure:!0});if(0!==e.exitCode)return[];return function(e){let t=[],n=null;for(let r of e.split(/\r?\n/)){let e=r.trim();if(!e)continue;let a=oc.exec(e);if(a){n=a[1]?.trim()??null;continue}if("Devices"!==n)continue;let i=op.exec(e),o=i?.groups?.id?.trim()??"",s=i?.groups?.name?.trim()??"";if(!o||!s)continue;let l=function(e){return ow(e)?"tv":ol.test(e.trim())?"mobile":null}(s);l&&t.push({platform:"ios",id:o,name:s,kind:"device",target:l,booted:!0})}return t}(e.stdout)}catch{return[]}}async function oS(e={}){if("darwin"!==process.platform)throw new y("UNSUPPORTED_PLATFORM","Apple tools are only available on macOS");if(!await U("xcrun"))throw new y("TOOL_MISSING","xcrun not found in PATH");let t=G(e.simulatorSetPath),n=await $("xcrun",nh(["list","devices","-j"],{simulatorSetPath:t})),r=[];try{let e=JSON.parse(n.stdout);r=ov(e,t)}catch(e){throw new y("COMMAND_FAILED","Failed to parse simctl devices JSON",void 0,e)}if(r.push({platform:"macos",id:"host-macos-local",name:s.hostname(),kind:"device",target:"desktop",booted:!0}),t)return r;let[a,i]=await Promise.all([oA(),ox()]);return r=oI(r,a),oI(r,i)}async function oN(){return"linux"!==process.platform?[]:[{platform:"linux",id:"local",name:l(),kind:"device",target:"desktop",booted:!0}]}let o_=new f,ok=new f;async function oM(e,t,n){let r,a=!!(t.udid||t.serial||t.deviceName);try{r=await rH(e,t,n)}catch(e){if(a||!(e instanceof y)||"DEVICE_NOT_FOUND"!==e.code)throw e}if(!a&&(!t.platform||"apple"===t.platform||"ios"===t.platform)&&"desktop"!==t.target&&(!r||"device"===r.kind)){let e=await ob({simulatorSetPath:n.simulatorSetPath,target:t.target});if(e)return e}if(r)return r;throw new y("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function oD(e){let t=rB(e.platform),n=rX({simulatorSetPath:G(e.iosSimulatorDeviceSet),platform:t,target:e.target}),r=en(e.androidDeviceAllowlist),a=function(e){let{flags:t,normalizedPlatform:n,iosSimulatorSetPath:r,androidSerialAllowlist:a}=e;return JSON.stringify({platform:n,target:t.target,device:t.device,udid:t.udid,serial:t.serial,iosSimulatorSetPath:r,androidSerialAllowlist:a?Array.from(a).sort():void 0})}({flags:e,normalizedPlatform:t,iosSimulatorSetPath:n,androidSerialAllowlist:r}),i={platform:t,target:e.target,cacheHit:!1};return await eb("resolve_target_device",async()=>{let o=function(e){let t=o_.getStore(),n=t?.get(e);if(n)return{...n}}(a);if(o)return i.cacheHit=!0,o;let s={platform:t,target:e.target,deviceName:e.device,udid:e.udid,serial:e.serial};if(s.target&&!s.platform)throw new y("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await oR({...s,iosSimulatorSetPath:n,androidSerialAllowlist:r?Array.from(r).sort():void 0});if(l)return oP(a,await rH(l,s,{simulatorSetPath:n}));if("linux"===s.platform){let e=await oN();return oP(a,await rH(e,s))}if("android"===s.platform){await z();let e=await Q({serialAllowlist:r});return oP(a,await rH(e,s))}if(s.platform){let e=await oS({simulatorSetPath:n});return oP(a,await oM(e,s,{simulatorSetPath:n}))}let d=[];try{d.push(...await Q({serialAllowlist:r}))}catch{}try{d.push(...await oS({simulatorSetPath:n}))}catch{}try{d.push(...await oN())}catch{}return oP(a,await rH(d,s,{simulatorSetPath:n}))},i)}async function oE(e){return o_.getStore()?await e():await o_.run(new Map,e)}async function oO(e,t){return e?await ok.run(e,t):await t()}async function oC(e,t){return await oO(e,async()=>await oE(t))}async function oR(e){let t=ok.getStore();if(!t)return null;let n=await t(e);return null==n?null:n.map(e=>({...e}))}function oP(e,t){return o_.getStore()?.set(e,{...t}),t}async function oT(e,t,n,r,o){let s={requestId:o?.requestId,appBundleId:o?.appBundleId,verbose:o?.verbose,logPath:o?.logPath,traceLogPath:o?.traceLogPath},l=function(e,t){switch(e.platform){case"android":return{open:(t,n)=>K(e,t,n?.activity),openDevice:()=>J(e),close:t=>j(e,t),tap:(t,n)=>td(e,t,n),doubleTap:async(t,n)=>{await td(e,t,n),await td(e,t,n)},swipe:(t,n,r,a,i)=>tu(e,t,n,r,a,i),longPress:(t,n,r)=>tm(e,t,n,r),focus:(t,n)=>ty(e,t,n),type:(t,n)=>tw(e,t,n),fill:(t,n,r,a)=>tb(e,t,n,r,a),scroll:(t,n)=>tA(e,t,n),screenshot:t=>tY(e,t),back:t=>tc(e),home:()=>tp(e),rotate:t=>tf(e,t),appSwitcher:()=>th(e),readClipboard:()=>tC(e),writeClipboard:t=>tR(e,t),setSetting:(t,n,r,a)=>tG(e,t,n,r,a)};case"linux":return{open:e=>iz(e),openDevice:()=>Promise.resolve(),close:e=>iK(e),tap:(e,t)=>iP(e,t),doubleTap:(e,t)=>i$(e,t),swipe:(e,t,n,r,a)=>iG(e,t,n,r,a),longPress:(e,t,n)=>iF(e,t,n),focus:(e,t)=>iU(e,t),type:(e,t)=>iB(e,t),fill:(e,t,n,r)=>ij(e,t,n,r),scroll:(e,t)=>iV(e,t),screenshot:e=>iH(e),back:()=>iY(),home:()=>iW(),rotate:()=>{throw new y("UNSUPPORTED_OPERATION","rotate not supported on Linux")},appSwitcher:()=>{throw new y("UNSUPPORTED_OPERATION","appSwitcher not yet supported on Linux")},readClipboard:()=>iZ(),writeClipboard:e=>iQ(e),setSetting:()=>{throw new y("UNSUPPORTED_OPERATION","setSetting not supported on Linux")}};case"ios":case"macos":{let n,{overrides:r,runnerOpts:a}={runnerOpts:n={verbose:t.verbose,logPath:t.logPath,traceLogPath:t.traceLogPath,requestId:t.requestId},overrides:{tap:async(r,a)=>await aE(e,{command:"tap",x:r,y:a,appBundleId:t.appBundleId},n),doubleTap:async(r,a)=>await aE(e,{command:"tapSeries",x:r,y:a,count:1,intervalMs:0,doubleTap:!0,appBundleId:t.appBundleId},n),swipe:async(r,a,i,o,s)=>await aE(e,{command:"drag",x:r,y:a,x2:i,y2:o,durationMs:s,appBundleId:t.appBundleId},n),longPress:async(r,a,i)=>await aE(e,{command:"longPress",x:r,y:a,durationMs:i,appBundleId:t.appBundleId},n),focus:async(r,a)=>await aE(e,{command:"tap",x:r,y:a,appBundleId:t.appBundleId},n),type:async(r,a)=>{await aE(e,{command:"type",text:r,delayMs:a,appBundleId:t.appBundleId},n)},fill:async(r,a,i,o)=>{let s=await aE(e,{command:"tap",x:r,y:a,appBundleId:t.appBundleId},n);return await aE(e,{command:"type",text:i,clearFirst:!0,delayMs:o,appBundleId:t.appBundleId},n),s},scroll:async(r,a)=>await iA(aE,e,t,n,r,a)}};return{open:(t,n)=>a9(e,t,{appBundleId:n?.appBundleId,url:n?.url}),openDevice:()=>a7(e),close:t=>ie(e,t),screenshot:async(t,n)=>{"macos"===e.platform&&n?.surface&&"app"!==n.surface?await nQ(t,{surface:n.surface,fullscreen:n.fullscreen}):await aq(e,t,n?.appBundleId,n?.fullscreen)},back:async n=>{await aE(e,{command:"system"===n?"backSystem":"backInApp",appBundleId:t.appBundleId},a)},home:async()=>{await aE(e,{command:"home",appBundleId:t.appBundleId},a)},rotate:async n=>{await aE(e,{command:"rotate",orientation:n,appBundleId:t.appBundleId},a)},appSwitcher:async()=>{await aE(e,{command:"appSwitcher",appBundleId:t.appBundleId},a)},readClipboard:()=>io(e),writeClipboard:t=>is(e,t),setSetting:(t,n,r,a)=>id(e,t,n,r,a),...r}}default:throw new y("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}(e,s);return eI({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await eb("platform_command",async()=>{switch(t){case"open":return oL(e,l,n,o);case"close":{let e=n[0];if(!e)return{closed:"session",...ed("Closed session")};return await l.close(e),{app:e,...ed(`Closed: ${e}`)}}case"press":return o$(e,l,n,o,s);case"swipe":return oF(e,l,n,o,s);case"longpress":{let e=Number(n[0]),t=Number(n[1]),r=n[2]?Number(n[2]):void 0;if(Number.isNaN(e)||Number.isNaN(t))throw new y("INVALID_ARGS","longpress requires x y [durationMs]");return await l.longPress(e,t,r),{x:e,y:t,durationMs:r,...ed(`Long pressed (${e}, ${t})`)}}case"focus":{let[e,t]=n.map(Number);if(Number.isNaN(e)||Number.isNaN(t))throw new y("INVALID_ARGS","focus requires x y");return await l.focus(e,t),{x:e,y:t,...ed(`Focused (${e}, ${t})`)}}case"type":{let e=function(e){let t=e[0]?.trim();if(!t||!t.startsWith("@")||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}(n);if(e)throw new y("INVALID_ARGS",`type does not accept a target ref like "${e}"`,{hint:`Use fill ${e} "text" to target that field, or press ${e} then type "text" to append.`});let t=n.join(" ");if(!t)throw new y("INVALID_ARGS","type requires text");let r=i7(o?.delayMs??0,"delay-ms",0,1e4);return await l.type(t,r),{text:t,delayMs:r,...ed(oY("Typed",t))}}case"fill":{let e=Number(n[0]),t=Number(n[1]),r=n.slice(2).join(" ");if(Number.isNaN(e)||Number.isNaN(t)||!r)throw new y("INVALID_ARGS","fill requires x y text");let a=i7(o?.delayMs??0,"delay-ms",0,1e4);return await l.fill(e,t,r,a),{x:e,y:t,text:r,delayMs:a,...ed(oY("Filled",r))}}case"scroll":return oU(l,n,o);case"pinch":return oG(e,n,o,s);case"trigger-app-event":{let{eventName:t,payload:r}=function(e){let t=e[0]?.trim(),n=e[1]?.trim();if(!t)throw new y("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!i9.test(t))throw new y("INVALID_ARGS",`Invalid trigger-app-event event name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});if(e.length>2)throw new y("INVALID_ARGS","trigger-app-event accepts at most two arguments: <event> [payloadJson]");let r=function(e,t){if(e)try{let n=JSON.parse(e);if(!n||"object"!=typeof n||Array.isArray(n))throw new y("INVALID_ARGS",`trigger-app-event payload for "${t}" must be a JSON object`);let r=JSON.stringify(n);if(Buffer.byteLength(r,"utf8")>8192)throw new y("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return n}catch(t){if(t instanceof y)throw t;throw new y("INVALID_ARGS",`Invalid trigger-app-event payload JSON: ${e}`)}}(n,t);return{eventName:t,payload:r}}(n),a=function(e,t,n){var r;let a,i=(a=("ios"===(r=e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:"macos"===r?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE,a?.trim()||void 0);if(!i)throw new y("UNSUPPORTED_OPERATION",`No app event URL template configured for ${e}.`,{hint:`Set AGENT_DEVICE_${e.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=n?JSON.stringify(n):"",s=i.replaceAll("{event}",encodeURIComponent(t)).replaceAll("{payload}",encodeURIComponent(o)).replaceAll("{platform}",encodeURIComponent(e));if(s.length>4096)throw new y("INVALID_ARGS","trigger-app-event URL exceeds maximum supported length",{hint:"Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.",length:s.length,maxLength:4096});return s}(e.platform,t,r);return await l.open(a,{appBundleId:o?.appBundleId}),{event:t,eventUrl:a,transport:"deep-link",...ed(`Triggered app event: ${t}`)}}case"screenshot":{let e=n[0]??r??`./screenshot-${Date.now()}.png`;return await a.mkdir(i.dirname(e),{recursive:!0}),await l.screenshot(e,{appBundleId:o?.appBundleId,fullscreen:o?.screenshotFullscreen,surface:o?.surface}),{path:e,...ed(`Saved screenshot: ${e}`)}}case"back":return await l.back(o?.backMode),{action:"back",mode:o?.backMode??"in-app",...ed("Back")};case"home":return await l.home(),{action:"home",...ed("Home")};case"rotate":{let e=oi(n[0]);return await l.rotate(e),{action:"rotate",orientation:e,...ed(`Rotated to ${e}`)}}case"app-switcher":return await l.appSwitcher(),{action:"app-switcher",...ed("Opened app switcher")};case"clipboard":return oV(l,n);case"keyboard":return oB(e,l,n,o,s);case"settings":return oj(e,l,n,o);case"push":return oq(e,n,o);case"snapshot":return oX(e,n,o,s);case"read":return oH(e,n,o,s);default:throw new y("INVALID_ARGS",`Unknown command: ${t}`)}},{command:t,platform:e.platform})}async function oL(e,t,n,r){let a=n[0],i=n[1];if(n.length>2)throw new y("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!a)return await t.openDevice(),{app:null,...ed("Opened device")};if(void 0!==i){if("android"===e.platform)throw new y("INVALID_ARGS","open <app> <url> is supported only on Apple platforms");if(ea(a))throw new y("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!ea(i))throw new y("INVALID_ARGS","open <app> <url> requires a valid URL target");return await t.open(a,{activity:r?.activity,appBundleId:r?.appBundleId,url:i}),{app:a,url:i,...ed(`Opened: ${a}`)}}return await t.open(a,{activity:r?.activity,appBundleId:r?.appBundleId}),{app:a,...ed(`Opened: ${a}`)}}async function o$(e,t,n,r,a){let i,[o,s]=n.map(Number);if(Number.isNaN(o)||Number.isNaN(s))throw new y("INVALID_ARGS","press requires x y");if("macos"===e.platform&&r?.surface&&"app"!==r.surface){let e=i4(r);if("primary"!==e)throw new y("UNSUPPORTED_OPERATION",`${e} click is not supported on macOS ${r.surface} sessions.`);return await nZ(o,s,{bundleId:r.appBundleId,surface:r.surface}),{x:o,y:s,...ed(oz({x:o,y:s}))}}let l=i4(r);if("primary"!==l){let t=i8({commandLabel:"click",platform:e.platform,button:l,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(t)throw t;return"linux"===e.platform?"secondary"===l?await iT(o,s):await iL(o,s):await aE(e,{command:"mouseClick",x:o,y:s,button:l,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId}),{x:o,y:s,button:l,...ed(oz({x:o,y:s,button:l}))}}let d=i7(r?.count??1,"count",1,200),u=i7(r?.intervalMs??0,"interval-ms",0,1e4),c=i7(r?.holdMs??0,"hold-ms",0,1e4),p=i7(r?.jitterPx??0,"jitter-px",0,100),f=r?.doubleTap===!0;if(f&&c>0)throw new y("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(f&&p>0)throw new y("INVALID_ARGS","double-tap cannot be combined with jitter-px");if(rj(e.platform)&&d>1&&0===c&&0===p){let t=await aE(e,{command:"tapSeries",x:o,y:s,count:d,intervalMs:u,doubleTap:f,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId});return{x:o,y:s,count:d,intervalMs:u,holdMs:c,jitterPx:p,doubleTap:f,timingMode:"runner-series",...t,...ed(oz({x:o,y:s}))}}return await ot(d,u,async e=>{let[n,r]=function(e,t){if(t<=0)return[0,0];let[n,r]=oe[e%oe.length];return[n*t,r*t]}(e,p),a=o+n,l=s+r;if(f){i??=await t.doubleTap(a,l)??void 0;return}c>0?i??=await t.longPress(a,l,c)??void 0:i??=await t.tap(a,l)??void 0}),eu({x:o,y:s,count:d,intervalMs:u,holdMs:c,jitterPx:p,doubleTap:f,...i},oz({x:o,y:s}))}async function oF(e,t,n,r,a){let i=Number(n[0]),o=Number(n[1]),s=Number(n[2]),l=Number(n[3]);if([i,o,s,l].some(Number.isNaN))throw new y("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let d=i7(n[4]?Number(n[4]):250,"durationMs",16,1e4),u="ios"===e.platform?Math.min(60,Math.max(16,Math.round(d))):d,c=i7(r?.count??1,"count",1,200),p=i7(r?.pauseMs??0,"pause-ms",0,1e4),f=r?.pattern??"one-way";if("one-way"!==f&&"ping-pong"!==f)throw new y("INVALID_ARGS",`Invalid pattern: ${f}`);if(rj(e.platform)&&c>1){let t=await aE(e,{command:"dragSeries",x:i,y:o,x2:s,y2:l,durationMs:u,count:c,pauseMs:p,pattern:f,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId});return{x1:i,y1:o,x2:s,y2:l,durationMs:d,effectiveDurationMs:u,timingMode:"runner-series",count:c,pauseMs:p,pattern:f,...t,...ed(oK(c,f))}}return await ot(c,p,async e=>{"ping-pong"===f&&e%2==1?await t.swipe(s,l,i,o,u):await t.swipe(i,o,s,l,u)}),eu({x1:i,y1:o,x2:s,y2:l,durationMs:d,effectiveDurationMs:u,timingMode:"ios"===e.platform?"safe-normalized":"direct",count:c,pauseMs:p,pattern:f},oK(c,f))}async function oU(e,t,n){let r=t[0],a=t[1]?Number(t[1]):void 0,i=n?.pixels;if(!r)throw new y("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new y("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==i)throw new y("INVALID_ARGS","scroll accepts either a relative amount or --pixels, not both");let o=function(e){switch(e){case"up":case"down":case"left":case"right":return e;default:throw new y("INVALID_ARGS",`Unknown direction: ${e}`)}}(r),s=await e.scroll(o,{amount:a,pixels:i});return eu({direction:o,...void 0!==a?{amount:a}:{},...void 0!==i?{pixels:i}:{},...s},void 0!==i?`Scrolled ${o} by ${i}px`:void 0!==a?`Scrolled ${o} by ${a}`:`Scrolled ${o}`)}async function oG(e,t,n,r){if("android"===e.platform)throw new y("UNSUPPORTED_OPERATION","Android pinch is not supported in current adb backend; requires instrumentation-based backend.");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new y("UNSUPPORTED_OPERATION","pinch is only supported in macOS app sessions. Re-open the target app without --surface desktop|menubar|frontmost-app first.");let a=Number(t[0]),i=t[1]?Number(t[1]):void 0,o=t[2]?Number(t[2]):void 0;if(Number.isNaN(a)||a<=0)throw new y("INVALID_ARGS","pinch requires scale > 0");return await aE(e,{command:"pinch",scale:a,x:i,y:o,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId}),{scale:a,x:i,y:o,...ed(`Pinched to scale ${a}`)}}async function oV(e,t){let n=(t[0]??"").toLowerCase();if("read"!==n&&"write"!==n)throw new y("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===n){if(1!==t.length)throw new y("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:n,text:await e.readClipboard()}}if(t.length<2)throw new y("INVALID_ARGS",'clipboard write requires text (use "" to clear clipboard)');let r=t.slice(1).join(" ");return await e.writeClipboard(r),{action:n,textLength:Array.from(r).length,...ed("Clipboard updated")}}async function oB(e,t,n,r,a){let i=(n[0]??"status").toLowerCase();if("status"!==i&&"get"!==i&&"dismiss"!==i)throw new y("INVALID_ARGS","keyboard requires a subcommand: status, get, or dismiss");if(n.length>1)throw new y("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform){if("dismiss"===i){let t=await tO(e);return{platform:"android",action:"dismiss",attempts:t.attempts,wasVisible:t.wasVisible,dismissed:t.dismissed,visible:t.visible,inputType:t.inputType,type:t.type}}let t=await tE(e);return{platform:"android",action:"status",visible:t.visible,inputType:t.inputType,type:t.type}}if("ios"===e.platform){if("dismiss"!==i)throw new y("UNSUPPORTED_OPERATION","keyboard status/get is currently supported only on Android; use keyboard dismiss on iOS");let t=await aE(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},a);return{platform:"ios",action:"dismiss",wasVisible:t.wasVisible,dismissed:t.dismissed,visible:t.visible,...ed(t.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}throw new y("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function oj(e,t,n,r){var a;let[i,o,s,l,d]=n,u="permission"===i?{permissionTarget:s,permissionMode:l}:void 0;eI({level:"debug",phase:"settings_apply",data:{setting:i,state:o,target:s,mode:l,platform:e.platform}});let c=await t.setSetting(i,o,d??r?.appBundleId,u);return c&&"object"==typeof c?eu({setting:i,state:o,...c},("string"==typeof(a=c).message&&a.message.length>0?a.message:void 0)??`Updated setting: ${i}`):{setting:i,state:o,...ed(`Updated setting: ${i}`)}}async function oq(e,t,n){let r=t[0]?.trim(),a=t[1]?.trim();if(!r||!a)throw new y("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let i=await or(a);if("ios"===e.platform)return await il(e,r,i),{platform:"ios",bundleId:r,...ed(`Pushed notification to ${r}`)};let o=await tz(e,r,i);return{platform:"android",package:r,action:o.action,extrasCount:o.extrasCount,...ed(`Pushed notification to ${r}`)}}async function oX(e,t,n,r){if("linux"===e.platform){let e=await eb("snapshot_capture",async()=>await i5(n?.surface),{backend:"linux-atspi"});return{nodes:e.nodes??[],truncated:e.truncated??!1,backend:"linux-atspi"}}if("android"!==e.platform){let t=await eb("snapshot_capture",async()=>await aE(e,{command:"snapshot",appBundleId:n?.appBundleId,interactiveOnly:n?.snapshotInteractiveOnly,compact:n?.snapshotCompact,depth:n?.snapshotDepth,scope:n?.snapshotScope,raw:n?.snapshotRaw},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId}),{backend:"xctest"}),r=t.nodes??[];if(0===r.length&&"simulator"===e.kind)throw new y("COMMAND_FAILED","XCTest snapshot returned 0 nodes on iOS simulator.");return{nodes:r,truncated:t.truncated??!1,backend:"xctest"}}let a=await eb("snapshot_capture",async()=>await e9(e,{interactiveOnly:n?.snapshotInteractiveOnly,compact:n?.snapshotCompact,depth:n?.snapshotDepth,scope:n?.snapshotScope,raw:n?.snapshotRaw}),{backend:"android"});return{nodes:a.nodes??[],truncated:a.truncated??!1,backend:"android",analysis:a.analysis,androidSnapshot:a.androidSnapshot}}async function oH(e,t,n,r){let[a,i]=t.map(Number);if(Number.isNaN(a)||Number.isNaN(i))throw new y("INVALID_ARGS","read requires x y");if("android"===e.platform)return{action:"read",text:await tM(e,a,i)??""};if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return{action:"read",text:(await nJ(a,i,{bundleId:n.appBundleId,surface:n.surface})).text};let o=await aE(e,{command:"readText",x:a,y:i,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function oz(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function oK(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function oY(e,t){return`${e} ${Array.from(t).length} chars`}let oW=e=>"macos"!==e.platform,oJ=e=>"macos"===e.platform||"simulator"===e.kind,oZ={device:!0},oQ={},o0={alert:{apple:{simulator:!0,device:!0},android:{},linux:oQ,supports:oJ},pinch:{apple:{simulator:!0,device:!0},android:{},linux:oQ,supports:oJ},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ,supports:oW},apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ,supports:oW},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ,supports:e=>"android"===e.platform||"linux"===e.platform||"macos"===e.platform||"simulator"===e.kind},keyboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},close:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},fill:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},diff:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},find:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},get:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},is:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ,supports:oW},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},open:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ},install:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ,supports:oW},"install-from-source":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ,supports:oW},reinstall:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ,supports:oW},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ,supports:oW},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},screenshot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},scroll:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},snapshot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},"trigger-app-event":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oQ},type:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ},wait:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oZ}};function o1(e,t){let n=o0[e];if(!n)return!0;let r=rj(t.platform)?n.apple:"linux"===t.platform?n.linux:n.android;return!!r&&(!n.supports||!!n.supports(t))&&!0===r[t.kind??"unknown"]}function o2(e,t,n,r,a){return{requestId:a??ev().requestId,appBundleId:n,activity:t?.activity,verbose:t?.verbose,logPath:e,traceLogPath:r,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotCompact:t?.snapshotCompact,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,screenshotFullscreen:t?.screenshotFullscreen,screenshotMaxSize:t?.screenshotMaxSize,count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:i4(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}let o3=ep(process.env.AGENT_DEVICE_IOS_DEVICE_READY_TIMEOUT_MS,15e3,1e3),o5=new Map;async function o4(e){var t;let n,r=(n="simulator"===(t=e).kind?t.simulatorSetPath??"":"",JSON.stringify([t.platform,t.kind,t.id,t.target??"",n])),a=o5.get(r);if(void 0!==a){if(a>Date.now())return;o5.delete(r)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:t}=await Promise.resolve(eH);await t(e),o8(r);return}if("device"===e.kind){await o6(e.id),o8(r);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./6953.js");await t(e.id),o8(r)}}function o8(e){o5.set(e,Date.now()+5e3)}async function o6(e){let t=i.join(s.tmpdir(),`agent-device-ready-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=Math.max(1,Math.ceil(o3/1e3));try{let r=await $("xcrun",["devicectl","device","info","details","--device",e,"--json-output",t,"--timeout",String(n)],{allowFailure:!0,timeoutMs:o3+3e3}),a=String(r.stdout??""),i=String(r.stderr??""),o=await o9(t);if(0===r.exitCode){if(!o.parsed)throw new y("COMMAND_FAILED","iOS device readiness probe failed",{kind:"probe_inconclusive",deviceId:e,stdout:a,stderr:i,hint:"CoreDevice returned success but readiness JSON output was missing or invalid. Retry; if it persists restart Xcode and the iOS device."});let t=o?.tunnelState?.toLowerCase();if("connecting"===t)throw new y("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:e,tunnelState:t,hint:"Device tunnel is still connecting. Keep the device unlocked and connected by cable until it is fully available in Xcode Devices, then retry."});return}throw new y("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:e,stdout:a,stderr:i,exitCode:r.exitCode,tunnelState:o?.tunnelState,hint:o7(a,i)})}catch(t){if(t instanceof y&&"COMMAND_FAILED"===t.code){if("not_ready"===("string"==typeof t.details?.kind?t.details.kind:""))throw t;let n=t.details??{},r=String(n.stdout??""),a=String(n.stderr??""),i=Number(n.timeoutMs??o3),o=`CoreDevice did not respond within ${i}ms. Keep the device unlocked and trusted, then retry; if it persists restart Xcode and the iOS device.`;throw new y("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:i,stdout:r,stderr:a,hint:r||a?o7(r,a):o},t)}throw new y("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,hint:"Reconnect the device, keep it unlocked, and retry."},t instanceof Error?t:void 0)}finally{await a.rm(t,{force:!0}).catch(()=>{})}}async function o9(e){try{let t=await a.readFile(e,"utf8"),n=JSON.parse(t),r=function(e){let t=e?.result;if(!t||"object"!=typeof t)return{};let n=t.connectionProperties?.tunnelState,r=t.device?.connectionProperties?.tunnelState,a="string"==typeof n?n:"string"==typeof r?r:void 0;return a?{tunnelState:a}:{}}(n);return{parsed:!0,tunnelState:r.tunnelState}}catch{return{parsed:!1}}}function o7(e,t){let n=nf(e,t);return n||(`${e}
26
+ ${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":np)}function se(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}let st=["app","frontmost-app","desktop","menubar"];function sn(e){let t=e?.trim().toLowerCase();if("app"===t||"frontmost-app"===t||"desktop"===t||"menubar"===t)return t;throw new y("INVALID_ARGS",`Invalid surface: ${e}. Use ${st.join("|")}.`)}let sr=[250,400,600];function sa(e,t,n=e.snapshot){if("android"!==e.device.platform)return;let r=n?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:n?.nodes.length??0,baselineSignatures:r?sl(n?.nodes??[]):void 0,routeComparable:r}}function si(e){if(!e||"android"!==e.device.platform)return;let t=e.androidSnapshotFreshness;if(t)return Date.now()-t.markedAt>2500?void delete e.androidSnapshotFreshness:t}function so(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function ss(e){return"press"===e||"click"===e||"back"===e||"open"===e}function sl(e){return e.map(e=>[e.depth??0,e.type??"",e.role??"",e.label??"",e.value??"",e.identifier??"",!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].join("|"))}function sd(e,t){e.snapshot=t,e.snapshotScopeSource=void 0}function su(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function sc(e){if(0===e.length)return null;let t=su(e[0]);if(null!==t)return{kind:"sleep",durationMs:t};if("text"===e[0]){let t=su(e[e.length-1]);return{kind:"text",text:(null!==t?e.slice(1,-1).join(" "):e.slice(1).join(" ")).trim(),timeoutMs:t}}if(e[0].startsWith("@")){let t=su(e[e.length-1]);return{kind:"ref",rawRef:e[0],timeoutMs:t}}let n=su(e[e.length-1]),r=eA(null!==n?e.slice(0,-1):e.slice());if(r&&0===r.rest.length){let e=eN(r.selectorExpression);if(e)return{kind:"selector",selector:e,selectorExpression:r.selectorExpression,timeoutMs:n}}return{kind:"text",text:(null!==n?e.slice(0,-1).join(" "):e.join(" ")).trim(),timeoutMs:n}}async function sp(e,t,n){let r=e.get(t),a=r?.device??await oD(n??{});return r||await o4(a),{session:r,device:a}}async function sf(e,t,n){let r=!e&&"ios"===t.platform;try{return await n()}finally{r&&await aA(t.id)}}function sh(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}async function sm(e){let{req:t,logPath:n,sessionStore:r,session:a,device:i}=e,o=(t.positionals?.[0]??"get").toLowerCase(),s=a?"frontmost-app"===a.surface?{surface:"frontmost-app"}:{bundleId:a.appBundleId,surface:a.surface}:{};if(!o1("alert",i))return se("UNSUPPORTED_OPERATION","alert is not supported on this device");if("macos"===i.platform){let e=async()=>await nY("wait"===o?"get":o,s);if("wait"===o){let n=su(t.positionals?.[1])??1e4,i=Date.now();for(;Date.now()-i<n;){try{let n=await e();return sh(r,a,t,n),{ok:!0,data:n}}catch{}await ec(300)}return se("COMMAND_FAILED","alert wait timed out")}let n="accept"===o||"dismiss"===o?o:"get";if("accept"===n||"dismiss"===n){let e,i=Date.now();for(;Date.now()-i<2e3;){try{let e=await nY(n,s);return sh(r,a,t,e),{ok:!0,data:e}}catch(n){e=n;let t=String(n?.message??"").toLowerCase();if(!t.includes("alert not found")&&!t.includes("no alert"))break}await ec(300)}throw sw(e)}let i=await nY("get",s);return sh(r,a,t,i),{ok:!0,data:i}}if("wait"===o){let e=su(t.positionals?.[1])??1e4,o=Date.now();for(;Date.now()-o<e;){try{let e=await aE(i,{command:"alert",action:"get",appBundleId:a?.appBundleId},{verbose:t.flags?.verbose,logPath:n,traceLogPath:a?.trace?.outPath,requestId:t.meta?.requestId});return sh(r,a,t,e),{ok:!0,data:e}}catch{}await ec(300)}return se("COMMAND_FAILED","alert wait timed out")}let l="accept"===o||"dismiss"===o?o:"get",d={verbose:t.flags?.verbose,logPath:n,traceLogPath:a?.trace?.outPath,requestId:t.meta?.requestId};if("accept"===l||"dismiss"===l){let e,n=Date.now();for(;Date.now()-n<2e3;){try{let e=await aE(i,{command:"alert",action:l,appBundleId:a?.appBundleId},d);return sh(r,a,t,e),{ok:!0,data:e}}catch(n){e=n;let t=String(n?.message??"").toLowerCase();if(!t.includes("alert not found")&&!t.includes("no alert"))break}await ec(300)}throw sw(e)}let u=await aE(i,{command:"alert",action:l,appBundleId:a?.appBundleId},d);return sh(r,a,t,u),{ok:!0,data:u}}function sw(e){if(!(e instanceof y))return e;let t=String(e.message??"").toLowerCase();return t.includes("alert not found")||t.includes("no alert")?new y(e.code,e.message,{...e.details??{},hint:"If the permission sheet is visible in snapshot or screenshot but alert reports no alert, take a scoped snapshot around the visible button label and use press @ref."}):e}async function sg(e){let t,{req:n,logPath:r,sessionStore:a,session:i,device:o,parsed:s}=e,{setting:l,state:d,permissionTarget:u}=s;if(!o1("settings",o))return se("UNSUPPORTED_OPERATION","settings is not supported on this device");if("macos"===o.platform&&"appearance"!==(t=l.trim().toLowerCase())&&"permission"!==t)return se("INVALID_ARGS",ne(l));let c=i?.appBundleId,p="permission"===l?[l,d,u??"",n.positionals?.[3]??"",c??""]:[l,d,c??""],f=await oT(o,"settings",p,n.flags?.out,{...o2(r,n.flags,c,i?.trace?.outPath)});return sh(a,i,n,f??{setting:l,state:d}),{ok:!0,data:f??{setting:l,state:d}}}function sy(e,t){try{return h.sync.read(e)}catch(e){throw new y("COMMAND_FAILED",`Failed to decode ${t} as PNG`,{label:t,reason:e instanceof Error?e.message:String(e)})}}async function sb(e,t){if(!Number.isInteger(t)||t<1)throw new y("INVALID_ARGS","Screenshot max size must be a positive integer");let n=sy(await a.readFile(e),"screenshot"),r=Math.max(n.width,n.height);if(r<=t)return;let i=t/r,o=Math.max(1,Math.round(n.width*i)),s=Math.max(1,Math.round(n.height*i)),l=function(e,t,n){let r=new h({width:t,height:n});for(let a=0;a<n;a+=1){let i=a*e.height/n,o=(a+1)*e.height/n;for(let n=0;n<t;n+=1){let s=n*e.width/t,l=(n+1)*e.width/t,d=0,u=0,c=0,p=0,f=0;for(let t=Math.floor(i);t<Math.ceil(o);t+=1){let n=Math.min(t+1,o)-Math.max(t,i);for(let r=Math.floor(s);r<Math.ceil(l);r+=1){let a=n*(Math.min(r+1,l)-Math.max(r,s)),i=(t*e.width+r)*4;d+=(e.data[i]??0)*a,u+=(e.data[i+1]??0)*a,c+=(e.data[i+2]??0)*a,p+=(e.data[i+3]??0)*a,f+=a}}let h=(a*r.width+n)*4;r.data[h]=Math.round(d/f),r.data[h+1]=Math.round(u/f),r.data[h+2]=Math.round(c/f),r.data[h+3]=Math.round(p/f)}}return r}(n,o,s);await a.writeFile(e,h.sync.write(l))}async function sv(e,t,n){if("path"===t.kind&&!e.policy.allowLocalInputPaths)throw new y("INVALID_ARGS",`Local ${n.field??"input"} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,n)}catch(e){throw w(e)}}async function sI(e,t,n){if(t?.kind==="path"&&!e.policy.allowLocalOutputPaths)throw new y("INVALID_ARGS","Local output paths are not allowed by command policy");try{return await e.artifacts.reserveOutput(t,{...n,visibility:n.visibility??"client-visible",requestedClientPath:t?.kind==="downloadableArtifact"?t.clientPath??n.requestedClientPath:n.requestedClientPath})}catch(e){throw w(e)}}async function sA(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw w(e)}}let sx=[0,187,255,255];function sS(e,t,n,r){if(t<0||t>=e.width||n<0||n>=e.height)return;let a=(n*e.width+t)*4;e.data[a]=r[0],e.data[a+1]=r[1],e.data[a+2]=r[2],e.data[a+3]=r[3]}function sN(e,t,n){return Math.min(Math.max(e,t),n)}let s_={icon:90,toggle:90,chevron:75,separator:45,visual:35,background:10},sk={leading:20,trailing:20,separator:10,unknown:0,background:-30};function sM(e){return"background"!==e.likelyKind}function sD(e,t){return e.width>=.25*t.width||e.height>=.06*t.height}function sE(e,t){let n,r=0;for(let a of t){let t=sT(e,a.rect);t<=r||(r=t,n=a)}return n}function sO(e){let t=[];for(let n of[...e].sort((e,t)=>e.rect.y-t.rect.y)){let e=t.find(e=>{var t,r;return t=e.rect,sT(t,r=n.rect)>0||Math.abs(sL(t).y-sL(r).y)<=.5*Math.max(t.height,r.height)});if(!e){t.push({rect:n.rect,blocks:[n]});continue}e.blocks.push(n),e.blocks.sort((e,t)=>e.rect.x-t.rect.x),e.rect=function(e){let t=1/0,n=1/0,r=-1/0,a=-1/0;for(let i of e)t=Math.min(t,i.x),n=Math.min(n,i.y),r=Math.max(r,i.x+i.width),a=Math.max(a,i.y+i.height);return{x:t,y:n,width:r-t,height:a-n}}([e.rect,n.rect])}return t}function sC(e,t){let n,r=sL(e);for(let e of t){var a,i;let t=Math.sqrt((a=r,i=sL(e.rect),(a.x-i.x)**2+(a.y-i.y)**2));n&&t>=n.distance||(n={block:e,distance:t})}return n}function sR(e){let t=sP(e);return e.differentPixels>=24&&t.width>=3&&t.height>=3}function sP(e){return{x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1}}function sT(e,t){return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))}function sL(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function s$(e,t,n){return Math.min(Math.max(e,t),n)}async function sF(e){if(await U("tesseract"))try{let[t,n]=await Promise.all([sG(e.baselinePath),sG(e.currentPath)]);if(0!==t.exitCode||0!==n.exitCode)return;let r=sU(t.stdout,e.width,e.height),a=sU(n.stdout,e.width,e.height),i=function(e,t){let n=new Set,r=[];for(let i of e){var a;let e=sz(i.text),o=function(e,t,n,r){let a=null,i=1/0;for(let l=0;l<n.length;l+=1){var o,s;if(r.has(l))continue;let d=n[l];if(sz(d.text)!==t)continue;let u=(o=sq(e.normalizedRect),s=sq(d.normalizedRect),(o.x-s.x)**2+(o.y-s.y)**2);u>=i||(a=l,i=u)}return a}(i,e,t,n);if(null===o)continue;n.add(o);let s=function(e,t){let n={x:t.rect.x-e.rect.x,y:t.rect.y-e.rect.y,width:t.rect.width-e.rect.width,height:t.rect.height-e.rect.height},r=sW(t.rect.width/e.rect.width),a=sW(t.rect.height/e.rect.height),i=Math.abs(r-1)>=.08||Math.abs(a-1)>=.12;return{text:e.text,baselineRect:e.rect,currentRect:t.rect,delta:n,confidence:Math.round(100*Math.min(e.confidence,t.confidence))/100,possibleTextMetricMismatch:i}}(i,t[o]);a=s,(Math.abs(a.delta.x)>=2||Math.abs(a.delta.y)>=2||Math.abs(a.delta.width)>=2||Math.abs(a.delta.height)>=2||a.possibleTextMetricMismatch)&&r.push(s)}return r.sort((e,t)=>sV(t)-sV(e)).slice(0,12)}(r,a),o=function(e){let t=[];for(let n of[...e].sort((e,t)=>e.currentRect.y-t.currentRect.y)){let e=t.find(e=>32>=Math.abs(n.delta.x-sK(e.map(e=>e.delta.x))));e?e.push(n):t.push([n])}return t.filter(e=>e.length>=2).map(sB).filter(e=>e.yRange.max-e.yRange.min<=60).sort((e,t)=>sj(t)-sj(e)).slice(0,4)}(i);if(0===r.length&&0===a.length)return;return{provider:"tesseract",baselineBlocks:r.length,currentBlocks:a.length,baselineBlocksRaw:r,currentBlocksRaw:a,matches:i,...o.length>0?{movementClusters:o}:{}}}catch{return}}function sU(e,t,n){let[r,...a]=e.split(/\r?\n/);if(!r)return[];let i=new Map(r.split(" ").map((e,t)=>[e,t])),o=[];for(let e of a){var s;if(!e.trim())continue;let t=e.split(" "),n=sH(t,i,"level"),r=sX(t,i,"text").trim(),a=sH(t,i,"conf");if(5!==n||(s=r,!/[\p{L}\p{N}]/u.test(s))||a<0)continue;let l=sH(t,i,"left"),d=sH(t,i,"top"),u=sH(t,i,"width"),c=sH(t,i,"height");u<=0||c<=0||o.push({key:[sX(t,i,"page_num"),sX(t,i,"block_num"),sX(t,i,"par_num"),sX(t,i,"line_num")].join(":"),text:r,confidence:a,rect:{x:l,y:d,width:u,height:c}})}let l=new Map;for(let e of o){let t=l.get(e.key);t?t.push(e):l.set(e.key,[e])}return Array.from(l.values()).flatMap(e=>(function(e){let t=[...e].sort((e,t)=>e.rect.x-t.rect.x),n=[],r=[];for(let e of t){let t=r.at(-1);if(!t){r.push(e);continue}if(e.rect.x-(t.rect.x+t.rect.width)>Math.max(48,2.5*Math.max(t.rect.height,e.rect.height))){n.push(r),r=[e];continue}r.push(e)}return r.length>0&&n.push(r),n})(e)).map(e=>(function(e,t,n){if(0===e.length)return null;let r=[...e].sort((e,t)=>e.rect.x-t.rect.x),a=function(e){let t=1/0,n=1/0,r=-1/0,a=-1/0;for(let i of e)t=Math.min(t,i.x),n=Math.min(n,i.y),r=Math.max(r,i.x+i.width),a=Math.max(a,i.y+i.height);return{x:t,y:n,width:r-t,height:a-n}}(r.map(e=>e.rect)),i=Math.round(100*sK(r.map(e=>e.confidence)))/100;return{text:r.map(e=>e.text).join(" "),confidence:i,rect:a,normalizedRect:{x:sY(a.x/t),y:sY(a.y/n),width:sY(a.width/t),height:sY(a.height/n)}}})(e,t,n)).filter(e=>null!==e)}function sG(e){return $("tesseract",[e,"stdout","-l","eng","tsv"],{allowFailure:!0,timeoutMs:1e4})}function sV(e){return Math.abs(e.delta.x)+Math.abs(e.delta.y)+Math.abs(e.delta.width)+Math.abs(e.delta.height)+25*!!e.possibleTextMetricMismatch}function sB(e){let t=e.map(e=>e.delta.x),n=e.map(e=>e.delta.y);return{texts:e.map(e=>e.text),xRange:{min:Math.min(...t),max:Math.max(...t)},yRange:{min:Math.min(...n),max:Math.max(...n)}}}function sj(e){return 2*Math.abs((e.xRange.min+e.xRange.max)/2)+Math.abs((e.yRange.min+e.yRange.max)/2)}function sq(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function sX(e,t,n){let r=t.get(n);return void 0===r?"":e[r]??""}function sH(e,t,n){let r=Number(sX(e,t,n));return Number.isFinite(r)?r:0}function sz(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function sK(e){return e.reduce((e,t)=>e+t,0)/e.length}function sY(e){return Math.round(100*e*100)/100}function sW(e){return Math.round(1e3*e)/1e3}function sJ(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function sZ(e){return .2126*e.r+.7152*e.g+.0722*e.b}function sQ(e){return`#${s0(e.r)}${s0(e.g)}${s0(e.b)}`}function s0(e){return e.toString(16).padStart(2,"0")}function s1(e){return Math.round(100*e*100)/100}let s2=255*Math.sqrt(3);async function s3(e,t,n={}){let r,o,s,l;await s5(e,"Baseline image not found"),await s5(t,"Current screenshot not found");let d=n.outputPath,[u,c]=await Promise.all([a.readFile(e),a.readFile(t)]),p=sy(u,"baseline screenshot"),f=sy(c,"current screenshot");s4(p.width,p.height,"baseline screenshot",n.maxPixels),s4(f.width,f.height,"current screenshot",n.maxPixels);let m=n.threshold??.1;if(p.width!==f.width||p.height!==f.height){let e=p.width*p.height;return await s8(n.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:p.width,height:p.height},actual:{width:f.width,height:f.height}}}}let w=p.width*p.height,g=m*s2,y=new h({width:p.width,height:p.height}),b=new Uint8Array(w),v=0;for(let e=0,t=0;e<p.data.length;e+=4,t+=1){if(Math.sqrt((p.data[e]-f.data[e])**2+(p.data[e+1]-f.data[e+1])**2+(p.data[e+2]-f.data[e+2])**2)>g){v+=1,b[t]=1;let n=s6(f,e);y.data[e]=s9(n,220,.78),y.data[e+1]=s9(n,0,.78),y.data[e+2]=s9(n,0,.78),y.data[e+3]=255;continue}let n=s6(f,e);y.data[e]=n,y.data[e+1]=n,y.data[e+2]=n,y.data[e+3]=255}let I=v>0?(x=(r=function(e){let{diffMask:t,baseline:n,current:r}=e,{width:a,height:i}=n,o=new Uint8Array(t.length),s=new Int32Array(t.length),l=[];for(let e=0;e<t.length;e+=1){if(1!==t[e]||1===o[e])continue;let d=0,u=0;s[0]=e,u+=1,o[e]=1;let c=e%a,p=Math.floor(e/a),f={minX:c,minY:p,maxX:c,maxY:p,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0};for(;d<u;){let e=s[d];d+=1,function(e,t,n,r,a){let i=t%n,o=Math.floor(t/n),s=4*t;e.minX=Math.min(e.minX,i),e.minY=Math.min(e.minY,o),e.maxX=Math.max(e.maxX,i),e.maxY=Math.max(e.maxY,o),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=a.data[s],e.currentGreen+=a.data[s+1],e.currentBlue+=a.data[s+2]}(f,e,a,n,r);let l=e%a,c=Math.floor(e/a);for(let e=-1;e<=1;e+=1){let n=c+e;if(!(n<0)&&!(n>=i))for(let r=-1;r<=1;r+=1){if(0===r&&0===e)continue;let i=l+r;if(i<0||i>=a)continue;let d=n*a+i;1===t[d]&&1!==o[d]&&(o[d]=1,s[u]=d,u+=1)}}}l.push(f)}return l}(A={diffMask:b,baseline:p,current:f,totalPixels:w,differentPixels:v,maxRegions:n.maxRegions})).length<=2e3?function(e){let t=[];for(let a of e.sort((e,t)=>{let n=e.minY-t.minY;return 0!==n?n:e.minX-t.minX})){var n,r;let e=t.find(e=>{var t,n,r;return t=e,n=a,r=12,t.minX-r<=n.maxX&&n.minX-r<=t.maxX&&t.minY-r<=n.maxY&&n.minY-r<=t.maxY});if(!e){t.push({...a});continue}n=e,r=a,n.minX=Math.min(n.minX,r.minX),n.minY=Math.min(n.minY,r.minY),n.maxX=Math.max(n.maxX,r.maxX),n.maxY=Math.max(n.maxY,r.maxY),n.differentPixels+=r.differentPixels,n.baselineRed+=r.baselineRed,n.baselineGreen+=r.baselineGreen,n.baselineBlue+=r.baselineBlue,n.currentRed+=r.currentRed,n.currentGreen+=r.currentGreen,n.currentBlue+=r.currentBlue}return t}(r):r,x.flatMap(e=>{var t,n,r;let a;return(t=e,n=A.baseline.width,r=A.baseline.height,a=t.maxX-t.minX+1,t.maxY-t.minY+1>=Math.max(48,Math.round(.07*r))&&a>=.35*n)?function(e,t,n){var r;let a=function(e,t){let n=[],r=null;for(let a=0;a<e.length;a+=1){if(e[a]<=t){r??=a;continue}null!==r&&(a-r>=6&&n.push([r,a-1]),r=null)}return null!==r&&e.length-r>=6&&n.push([r,e.length-1]),n}((r=function(e,t,n){let r=[];for(let a=e.minY;a<=e.maxY;a+=1){let i=0;for(let r=e.minX;r<=e.maxX;r+=1)1===t[a*n+r]&&(i+=1);r.push(i)}return r}(e,t.diffMask,t.baseline.width)).map((e,t)=>{let n=0,a=0,i=Math.max(0,t-3),o=Math.min(r.length-1,t+3);for(let e=i;e<=o;e+=1)n+=r[e],a+=1;return Math.round(n/a)}),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),i=function(e,t,n){let r=[],a=e.minY;for(let[i,o]of t){let t=e.minY+Math.round((i+o)/2);t-a+1<n||e.maxY-t<n||(r.push([a,t]),a=t+1)}return r.push([a,e.maxY]),r}(e,a,n);if(i.length<=1)return[e];let o=i.map(([n,r])=>(function(e,t,n,r){let a=null;for(let s=t;s<=n;s+=1)for(let t=e.minX;t<=e.maxX;t+=1){var i,o;let e=s*r.baseline.width+t;1===r.diffMask[e]&&function(e,t,n,r,a,i){let o=4*t;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,r),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,r),e.differentPixels+=1,e.baselineRed+=a.data[o],e.baselineGreen+=a.data[o+1],e.baselineBlue+=a.data[o+2],e.currentRed+=i.data[o],e.currentGreen+=i.data[o+1],e.currentBlue+=i.data[o+2]}(a??={minX:i=t,minY:o=s,maxX:i,maxY:o,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0},e,t,s,r.baseline,r.current)}return a})(e,n,r,t)).filter(e=>null!==e);return o.length>1?o:[e]}(e,A,Math.max(24,Math.round(.03*A.baseline.height))):[e]})).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(0!==n)return n;let r=e.minY-t.minY;return 0!==r?r:e.minX-t.minX}).slice(0,Math.max(0,A.maxRegions??8)).map((e,t)=>{var n,r,a,i,o,s,l,d,u,c,p;let f,h,m,w,g,y,b,v,I,x,S,N,_,k,M,D,E;return n=e,r=t+1,a={width:A.baseline.width,height:A.baseline.height,totalPixels:A.totalPixels,differentPixels:A.differentPixels},y={x:n.minX,y:n.minY,width:n.maxX-n.minX+1,height:n.maxY-n.minY+1},b={x:Math.round(n.minX+y.width/2),y:Math.round(n.minY+y.height/2)},v=sJ(n.baselineRed,n.baselineGreen,n.baselineBlue,n.differentPixels),I=sJ(n.currentRed,n.currentGreen,n.currentBlue,n.differentPixels),x=y.width*y.height,S=s1(n.differentPixels/x),N=Math.round(sZ(v)),_=Math.round(sZ(I)),k=(i=y,o=a.width,s=a.height,i.width>=.55*o&&i.height>=.12*s?"large-area":i.width>=2.5*i.height?"horizontal-band":i.height>=2.5*i.width?"vertical-band":"compact"),M=(f=x/a.totalPixels)>=.04?"large":f>=.01?"medium":"small",D=(l=v,d=I,h=sZ(l),Math.abs(m=sZ(d)-h)>=12?m>0?"brighter":"darker":Math.max(Math.abs(d.r-l.r),Math.abs(d.g-l.g),Math.abs(d.b-l.b))>=12?"color-shift":"mixed"),E=(u=b,c=a.width,p=a.height,w=u.x<c/3?"left":u.x>2*c/3?"right":"center",g=u.y<p/3?"top":u.y>2*p/3?"bottom":"middle","center"===w&&"middle"===g?"center":`${g}-${w}`),{index:r,rect:y,normalizedRect:{x:s1(y.x/a.width),y:s1(y.y/a.height),width:s1(y.width/a.width),height:s1(y.height/a.height)},differentPixels:n.differentPixels,shareOfDiffPercentage:s1(n.differentPixels/a.differentPixels),densityPercentage:S,shape:k,size:M,location:E,averageBaselineColorHex:sQ(v),averageCurrentColorHex:sQ(I),baselineLuminance:N,currentLuminance:_,dominantChange:D}}):[];if(v>0&&d){var A,x,S;for(let e of I)e.rect.width<4||e.rect.height<4||function(e,t){let n=sN(t.x,0,e.width-1),r=sN(t.y,0,e.height-1),a=sN(t.x+t.width-1,0,e.width-1),i=sN(t.y+t.height-1,0,e.height-1);for(let t=0;t<2;t+=1){for(let o=n;o<=a;o+=1)sS(e,o,r+t,sx),sS(e,o,i-t,sx);for(let o=r;o<=i;o+=1)sS(e,n+t,o,sx),sS(e,a-t,o,sx)}}(y,e.rect);await a.mkdir(i.dirname(d),{recursive:!0}),await a.writeFile(d,h.sync.write(y))}else await s8(n.outputPath);let N=v>0?await sF({baselinePath:e,currentPath:t,width:p.width,height:p.height}):void 0,_=N&&(N.matches.length>0||(N.movementClusters?.length??0)>0)?{provider:N.provider,baselineBlocks:N.baselineBlocks,currentBlocks:N.currentBlocks,matches:N.matches,...N.movementClusters?{movementClusters:N.movementClusters}:{}}:void 0,k=v>0&&N?(o=function(e){let t=[];for(let n of e.sort((e,t)=>e.minY-t.minY||e.minX-t.minX)){let e=t.find(e=>{var t,r,a;return t=e,r=n,a=10,t.minX-a<=r.maxX&&r.minX-a<=t.maxX&&t.minY-a<=r.maxY&&r.minY-a<=t.maxY});if(!e){t.push({...n});continue}e.minX=Math.min(e.minX,n.minX),e.minY=Math.min(e.minY,n.minY),e.maxX=Math.max(e.maxX,n.maxX),e.maxY=Math.max(e.maxY,n.maxY),e.differentPixels+=n.differentPixels}return t}(function(e,t,n){let r=new Uint8Array(e.length),a=new Int32Array(e.length),i=[];for(let o=0;o<e.length;o+=1){if(1!==e[o]||1===r[o])continue;let s=0,l=0;a[0]=o,l+=1,r[o]=1;let d=o%t,u=Math.floor(o/t),c={minX:d,minY:u,maxX:d,maxY:u,differentPixels:0};for(;s<l;){let i=a[s];s+=1;let o=i%t,d=Math.floor(i/t);c.minX=Math.min(c.minX,o),c.minY=Math.min(c.minY,d),c.maxX=Math.max(c.maxX,o),c.maxY=Math.max(c.maxY,d),c.differentPixels+=1;for(let i=-1;i<=1;i+=1){let s=d+i;if(!(s<0)&&!(s>=n))for(let n=-1;n<=1;n+=1){if(0===n&&0===i)continue;let d=o+n;if(d<0||d>=t)continue;let u=s*t+d;1===e[u]&&1!==r[u]&&(r[u]=1,a[l]=u,l+=1)}}}i.push(c)}return i}(function(e,t,n,r){let a=new Uint8Array(e);if(!r)return a;for(let e of[...r.baselineBlocksRaw,...r.currentBlocksRaw]){var i;!function(e,t,n,r){let a=s$(Math.floor(r.x),0,t-1),i=s$(Math.floor(r.y),0,n-1),o=s$(Math.ceil(r.x+r.width),0,t),s=s$(Math.ceil(r.y+r.height),0,n);for(let n=i;n<s;n+=1)for(let r=a;r<o;r+=1)e[n*t+r]=0}(a,t,n,{x:(i=e.rect).x-8,y:i.y-8,width:i.width+16,height:i.height+16})}return a}((S={diffMask:b,width:p.width,height:p.height,regions:I,ocr:N}).diffMask,S.width,S.height,S.ocr),S.width,S.height)),s=sO(S.ocr?.currentBlocksRaw??[]),l=sO(S.ocr?.baselineBlocksRaw??[]),o.filter(sR).map(e=>{var t,n,r,a,i,o,d,u,c,p,f;let h,m,w,g,y,b,v,I,A,x;return t=e,n=S,r=s,a=l,g=function(e,t){let n,r=0;for(let a of t){let t=function(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),a=Math.min(e.x+e.width,t.x+t.width),i=Math.min(e.y+e.height,t.y+t.height);return a<=n||i<=r?0:(a-n)*(i-r)}(e,a.rect);t<=r||(r=t,n=a)}return n?.index}(w=sP(t),n.regions),y=function(e,t,n){let r=sE(e,t);if(r)return sC(e,r.blocks);let a=sE(e,n);return a?sC(e,a.blocks):void 0}(w,r,a),b=function(e,t,n){if(e.height<=3&&e.width>=.12*n)return"separator";if(!t)return e.width>=.4*n?"background":"unknown";if(e.width>=.4*n)return"background";let r=e.x+e.width/2,a=t.x+t.width/2;return r<a-t.width/2?"leading":r>a+t.width/2?"trailing":e.width>=.35*n?"background":"unknown"}(w,y?.block.rect,n.width),v=(i=w,o=b,d=t.differentPixels,u=n,h=i.width/i.height,m=d/(i.width*i.height),"separator"===o?"separator":"background"===o?"background":"trailing"===o&&h>=1.5&&h<=3.8&&m>=.35?"toggle":"trailing"===o&&i.width<=.06*u.width&&i.height<=.04*u.height?"chevron":"leading"===o&&h>=.55&&h<=1.8?"icon":sD(i,u)?"background":"visual"),I={...g?{regionIndex:g}:{},slot:b,likelyKind:v,rect:w},{...g?{regionIndex:g}:{},slot:b,likelyKind:v,rect:w,...y?{nearestText:y.block.text.trim().replace(/^[^\p{L}\p{N}]+/u,"").replace(/^\p{L}\s+/u,"")}:{},score:(c=I,p=t.differentPixels,f=n,A=sD(c.rect,f)?-35:0,x=20*!!c.regionIndex,s_[c.likelyKind]+sk[c.slot]+x+A+Math.min(20,p/200))}}).filter(e=>e.rect.y>=.08*S.height).filter(sM).sort((e,t)=>t.score-e.score).slice(0,Math.max(0,S.maxDeltas??12)).map((e,t)=>{var n;return n=e,{index:t+1,...n.regionIndex?{regionIndex:n.regionIndex}:{},slot:n.slot,likelyKind:n.likelyKind,rect:n.rect,...n.nearestText?{nearestText:n.nearestText}:{}}})):[],M=w>0?Math.round(v/w*1e4)/100:0;return{...v>0&&d?{diffPath:d}:{},...I.length>0?{regions:I}:{},..._?{ocr:_}:{},...k.length>0?{nonTextDeltas:k}:{},totalPixels:w,differentPixels:v,mismatchPercentage:M,match:0===v}}async function s5(e,t){try{await a.access(e)}catch{throw new y("INVALID_ARGS",`${t}: ${e}`)}}function s4(e,t,n,r){if(null==r||r<=0)return;let a=e*t;if(!(a<=r))throw new y("INVALID_ARGS",`${n} is ${a} pixels, which exceeds the configured maxImagePixels limit of ${r}`)}async function s8(e){if(e)try{await a.unlink(e)}catch(e){var t;if(!("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code))throw e}}function s6(e,t){return s9(Math.round(.299*e.data[t]+.587*e.data[t+1]+.114*e.data[t+2]),255,.72)}function s9(e,t,n){return Math.round(e*(1-n)+t*n)}function s7(e){return e.width*e.height}function le(e){return Math.round(100*e*100)/100}async function lt(e,t){let n=await sA(e,{prefix:"agent-device-diff-current",ext:".png"});try{await lr(e,t,n.path,la(t))}catch(e){throw await n.cleanup(),e}return n}async function ln(e,t,n,r,a){var i,o,s,l;if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await lo(n),r;let d=(i=t,o=n,i.currentOverlayOut?i.currentOverlayOut:i.out?.kind==="path"?{kind:"path",path:li(o??i.out.path)}:i.out?.kind==="downloadableArtifact"?{kind:"downloadableArtifact",...i.out.clientPath?{clientPath:li(i.out.clientPath)}:{},...i.out.fileName?{fileName:li(i.out.fileName)}:{}}:void 0),u=await sI(e,d,{field:"currentOverlayPath",ext:".png"});try{let n=await lr(e,t,u.path,{overlayRefs:!0,...la(t)}),i=await u.publish();return i&&a.push(i),{...r,currentOverlayPath:n.path??u.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...r.regions&&n.overlayRefs?{regions:(s=r.regions,l=n.overlayRefs,s.map(e=>{var t,n;let r,a=(t=e,n=l,r=s7(t.rect),n.map(e=>{var n,a;let i,o,s,l,d=e.overlayRect,u=(n=t.rect,a=d,i=Math.max(n.x,a.x),o=Math.max(n.y,a.y),s=Math.min(n.x+n.width,a.x+a.width),l=Math.min(n.y+n.height,a.y+a.height),s<=i||l<=o?0:(s-i)*(l-o));return u<=0?null:{ref:e.ref,...e.label?{label:e.label}:{},rect:d,overlayCoveragePercentage:le(u/s7(d)),regionCoveragePercentage:le(u/r)}}).filter(e=>null!==e).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return 0!==n?n:t.overlayCoveragePercentage-e.overlayCoveragePercentage}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage})));return a.length>0?{...e,currentOverlayMatches:a}:e}))}:{}}}catch(e){throw await u.cleanup?.(),e}}async function lr(e,t,n,r={}){if(!e.backend.captureScreenshot)throw new y("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,r)??{}}function la(e){return e.surface?{surface:e.surface}:{}}function li(e){let t=i.extname(e),n=t?e.slice(0,-t.length):e;return`${n}.current-overlay${t||".png"}`}async function lo(e){try{await a.unlink(li(e))}catch(e){var t;if(!("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code))throw e}}function ls(e){return"live"===e.kind}let ll={application:"application",navigationbar:"navigation-bar",tabbar:"tab-bar",button:"button",imagebutton:"button",link:"link",cell:"cell",statictext:"text",checkedtextview:"text",textfield:"text-field",edittext:"text-field",textarea:"text-view",switch:"switch",slider:"slider",image:"image",imageview:"image",webview:"webview",framelayout:"group",linearlayout:"group",relativelayout:"group",constraintlayout:"group",viewgroup:"group",view:"group",listview:"list",recyclerview:"list",collectionview:"collection",searchfield:"search",segmentedcontrol:"segmented-control",group:"group",window:"window",checkbox:"checkbox",radio:"radio",menuitem:"menu-item",toolbar:"toolbar",scrollarea:"scroll-area",scrollview:"scroll-area",nestedscrollview:"scroll-area",table:"table"};function ld(e,t={}){let n=[],r=[];for(let a of e){let e=a.depth??0,i=a.label?.trim()||a.value?.trim()||a.identifier?.trim()||"",o=lp(a.type??"Element");if("group"===o&&!i)continue;for(;n.length>0&&e<=n[n.length-1];)n.pop();let s=n.length;n.push(e),r.push({node:a,depth:s,type:o,text:lu(a,s,!1,o,t)})}return r}function lu(e,t,n,r,a={}){var i,o,s,l,d,u,c,p;let f,h=r??lp(e.type??"Element"),m=e$(e,h),w=(i=e,o=h,s=a,l=m,s.summarizeTextSurfaces&&l.shouldSummarize&&function(e,t,n){let r=ex(e.label);if(r&&r!==n)return r;let a=ex(e.identifier);if(a&&!lh(a)&&a!==n)return a;switch(t){case"text":case"text-view":return"Text view";case"text-field":return"Text field";case"search":return"Search field";default:return""}}(i,o,l.text)||lc(i,o)),g=" ".repeat(t),y=e.ref?`@${e.ref}`:"",b=(d=e,u=h,c=a,p=m,f=[],(!1===d.enabled&&f.push("disabled"),c.summarizeTextSurfaces&&(!0===d.selected&&f.push("selected"),lf(u)&&f.push("editable"),function(e,t){if("scroll-area"===t)return!0;let n=(e.type??"").toLowerCase(),r=`${e.role??""} ${e.subrole??""}`.toLowerCase();return n.includes("scroll")||r.includes("scroll")}(d,u)&&f.push("scrollable"),p.shouldSummarize))?(f.push(`preview:"${eE(p.text).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`),f.push("truncated"),[...new Set(f)]):f).map(e=>` [${e}]`).join(""),v=w?` "${w}"`:"";return n?`${g}${y} [${h}]${b}`.trimEnd():`${g}${y} [${h}]${v}${b}`.trimEnd()}function lc(e,t){var n,r;let a,i=e.label?.trim();if(i&&(n=t,r=i,("scroll-area"===n||"list"===n||"collection"===n||"table"===n)&&(a=r.trim().toLowerCase())&&/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(a)))return"";let o=e.value?.trim();if(lf(t)){if(o)return o;if(i)return i}else if(i)return i;if(o)return o;let s=e.identifier?.trim();return!s||lh(s)&&("group"===t||"image"===t||"list"===t||"collection"===t)?"":s}function lp(e){var t;let n=e.replace(/XCUIElementType/gi,"").toLowerCase(),r=e.includes(".")&&(e.startsWith("android.")||e.startsWith("androidx.")||e.startsWith("com."));return(n.includes(".")&&(n=n.replace(/^android\.widget\./,"").replace(/^android\.view\./,"").replace(/^android\.webkit\./,"").replace(/^androidx\./,"").replace(/^com\.google\.android\./,"").replace(/^com\.android\./,""),r&&n.includes(".")&&(n=n.slice(n.lastIndexOf(".")+1))),"textview"===n)?r?"text":"text-view":(t=n,(Object.prototype.hasOwnProperty.call(ll,t)?ll[t]:void 0)||n||"element")}function lf(e){return"text-field"===e||"text-view"===e||"search"===e}function lh(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function lm(e,t){let n=lp(e.type??"Element"),r=lc(e,n),a=!1===e.enabled?"disabled":"enabled",i=!0===e.selected?"selected":"unselected",o=!0===e.hittable?"hittable":"not-hittable";return[String(t??e.depth??0),n,r,a,i,o].join("|")}function lw(e,t){return t.flatten?e.map(e=>({text:lu(e,0,!1),comparable:lm(e,0)})):ld(e).map(e=>({text:e.text,comparable:lm(e.node,e.depth)}))}function lg(e,t){return e.get(t)??0}function ly(e){return"text"===e||"label"===e||"any"===e}function lb(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function lv(e){return e.clock?.now()??Date.now()}async function lI(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}async function lA(e,t){var n,r,a,i,o;let s,l,d,u,c,p;if(!e.backend.captureSnapshot)throw new y("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let f=t.session??"default",h=await e.sessions.get(f),m=await e.backend.captureSnapshot({session:f,requestId:t.requestId,appId:h?.appId,appBundleId:h?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,compact:t.compact,depth:t.depth,scope:t.scope,raw:t.raw}),w=(n=m,r=e,n.snapshot?n.snapshot:{nodes:n.nodes??[],truncated:n.truncated,backend:n.backend,createdAt:lv(r)}),g=lv(e);return{snapshot:w,result:m,session:h,warnings:(s=[...(a={result:m,snapshot:w,options:t,session:h,capturedAt:w.createdAt??g,runtimeNow:g}).result.warnings??[]],l=!0===a.options.interactiveOnly,d=a.result.analysis,"android"===a.snapshot.backend&&l&&0===a.snapshot.nodes.length&&d&&(d.rawNodeCount??0)>=12&&(s.push(`Interactive snapshot is empty after filtering ${d.rawNodeCount} raw Android nodes. Likely causes: depth too low, transient route change, or collector filtering.`),"number"==typeof a.options.depth&&"number"==typeof d.maxDepth&&d.maxDepth>=a.options.depth+2&&s.push(`Interactive output is empty at depth ${a.options.depth}; retry without -d.`)),c=!!(u=a.session?.snapshot)&&[a.capturedAt,a.runtimeNow].some(e=>{let t=e-u.createdAt;return t>=0&&t<=2e3}),!a.result.freshness&&u&&c&&(i=u.nodes.length,o=a.snapshot.nodes.length,!(i<12)&&o<=Math.floor(.2*i))&&s.push("Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once."),p=a.result.freshness,p?.staleAfterRetries&&"android"===a.snapshot.backend&&("stuck-route"===p.reason?s.push(`Recent ${p.action} was followed by a nearly identical snapshot after ${p.retryCount} automatic retr${1===p.retryCount?"y":"ies"}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`):"sharp-drop"===p.reason&&s.push("Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.")),Array.from(new Set(s)))}}function lx(e,t){let n=t.session?.name??e??"default";return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}function lS(e){return["visible","hidden","exists","editable","selected","text"].includes(e)}function lN(e){return!!(e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height)&&e.width>0&&e.height>0)}async function l_(e,t){let n=t??"default",r=await e.sessions.get(n);if(!r)throw new y("SESSION_NOT_FOUND","No active session. Run open first.");if(!r.snapshot)throw new y("INVALID_ARGS","No snapshot in session. Run snapshot first.");return{sessionName:n,session:r,snapshot:r.snapshot}}async function lk(e,t,n={updateSession:!0}){if(!e.backend.captureSnapshot)throw new y("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let r=t.session??"default",a=await e.sessions.get(r),i=await e.backend.captureSnapshot(lb(e,t),{interactiveOnly:!1,compact:!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw}),o=i.snapshot??{nodes:i.nodes??[],truncated:i.truncated,backend:i.backend,createdAt:lv(e)};return n.updateSession&&a&&await e.sessions.set({...a,snapshot:o}),{sessionName:r,session:a,snapshot:o}}async function lM(e,t,n){if(e.backend.readText){let r=await e.backend.readText(lb(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return eF(n)}let lD=async(e,t)=>{if("ref"===t.target.kind){let n=await l_(e,t.session),r=function(e,t,n){let r=v(t);if(!r)throw new y("INVALID_ARGS",n.invalidRefMessage);let a=b(e,r)??(n.fallbackLabel.length>0?eT(e,n.fallbackLabel):null);if(!a)throw new y("COMMAND_FAILED",n.notFoundMessage);return{ref:r,node:a}}(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??"",invalidRefMessage:"get text requires a ref like @e2",notFoundMessage:`Ref ${t.target.ref} not found`}),a=eC(r.node,e.backend.platform,{action:"get"}),i={kind:"ref",ref:`@${r.ref}`};return"attrs"===t.property?{kind:"attrs",target:i,node:r.node,selectorChain:a}:{kind:"text",target:i,text:await lM(e,n,r.node),node:r.node,selectorChain:a}}let n=await lV(e,t,t.session??"default",{selector:t.target.selector,disambiguateAmbiguous:"text"===t.property}),r=eC(n.node,e.backend.platform,{action:"get"});if("attrs"===t.property)return{kind:"attrs",target:{kind:"selector",selector:n.selector},node:n.node,selectorChain:r};let a=await lM(e,n.capture,n.node);return{kind:"text",target:{kind:"selector",selector:n.selector},text:a,node:n.node,selectorChain:r}},lE=async(e,t)=>{let n=await lD(e,{...t,property:"text",target:t.target});if("text"!==n.kind)throw new y("COMMAND_FAILED","getText returned non-text result");return n},lO=async(e,t)=>{let n=await lD(e,{...t,property:"attrs",target:t.target});if("attrs"!==n.kind)throw new y("COMMAND_FAILED","getAttrs returned non-attrs result");return n},lC=async(e,t)=>{if(!lS(t.predicate))throw new y("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text");if("text"===t.predicate&&!t.expectedText)throw new y("INVALID_ARGS","is text requires expected text value");let n=await lk(e,t,{updateSession:!0}),r=e_(t.selector);if("exists"===t.predicate){let a=eU(n.snapshot.nodes,r,{platform:e.backend.platform});if(!a)throw new y("COMMAND_FAILED",eB(r,[],{unique:!1}));return{predicate:t.predicate,pass:!0,selector:a.selector.raw,matches:a.matches,selectorChain:r.selectors.map(e=>e.raw)}}let a=eG(n.snapshot.nodes,r,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:!1});if(!a)throw new y("COMMAND_FAILED",eB(r,[],{unique:!0}));let i=function(e){let{predicate:t,node:n,nodes:r,expectedText:a,platform:i}=e,o=eS(n),s=eM(n,i),l=!0===n.selected,d="text"===t?ek(n):function(e,t){if(!0===e.hittable)return!0;if(lN(e.rect))return e1(e,t);if(e.rect)return!1;let n=function(e,t){let n=new Map(t.map(e=>[e.index,e])),r=e,a=new Set;for(;"number"==typeof r.parentIndex&&!a.has(r.index);){a.add(r.index);let e=n.get(r.parentIndex);if(!e)break;if(function(e){let t=eV(e.type??"");return!(t.includes("application")||t.includes("window")||t.includes("scrollview")||t.includes("tableview")||t.includes("collectionview"))&&"table"!==t&&"list"!==t&&"listview"!==t&&(!0===e.hittable||lN(e.rect))}(e))return e;r=e}return null}(e,t);return!!n&&(!0===n.hittable||!!lN(n.rect)&&e1(n,t))}(n,r),u=!1;switch(t){case"visible":u=d;break;case"hidden":u=!d;break;case"editable":u=s;break;case"selected":u=l;break;case"text":u=o===(a??"")}let c="text"===t?`expected="${a??""}" actual="${o}"`:`actual=${JSON.stringify({visible:d,editable:s,selected:l})}`;return{pass:u,actualText:o,details:c}}({predicate:t.predicate,node:a.node,nodes:n.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!i.pass)throw new y("COMMAND_FAILED",`is ${t.predicate} failed for selector ${a.selector.raw}: ${i.details}`);return{predicate:t.predicate,pass:!0,selector:a.selector.raw,..."text"===t.predicate?{text:i.actualText}:{},selectorChain:r.selectors.map(e=>e.raw)}},lR=async(e,t)=>await lC(e,{...t,predicate:"visible",selector:t.target.selector}),lP=async(e,t)=>await lC(e,{...t,predicate:"hidden",selector:t.target.selector}),lT=async(e,t)=>{if("sleep"===t.target.kind)return await lI(e,t.target.durationMs),{kind:"sleep",waitedMs:t.target.durationMs};if("ref"===t.target.kind){let n=await l_(e,t.session),r=v(t.target.ref);if(!r)throw new y("INVALID_ARGS",`Invalid ref: ${t.target.ref}`);let a=b(n.snapshot.nodes,r),i=a?eL(a,n.snapshot.nodes):void 0;if(!i)throw new y("COMMAND_FAILED",`Ref ${t.target.ref} not found or has no label`);return await lU(e,t,i,t.target.timeoutMs)}if("selector"===t.target.kind)return await lF(e,t,t.target.selector,t.target.timeoutMs);if(!t.target.text)throw new y("INVALID_ARGS","wait requires text");return await lU(e,t,t.target.text,t.target.timeoutMs)},lL=async(e,t)=>{let n=await lT(e,{...t,target:{kind:"text",text:t.text,timeoutMs:t.timeoutMs}});if("text"!==n.kind)throw new y("COMMAND_FAILED","waitForText returned non-text result");return n};async function l$(e,t,n){let r=t.timeoutMs??1e4,a=lv(e);for(;lv(e)-a<r;){if(eq((await lk(e,t,{updateSession:!0,scope:ly(n)?t.query:void 0})).snapshot.nodes,n,t.query,{requireRect:!1}).matches[0])return{kind:"found",found:!0,waitedMs:lv(e)-a};await lI(e,300)}throw new y("COMMAND_FAILED","find wait timed out")}async function lF(e,t,n,r){let a=r??1e4,i=lv(e),o=e_(n);for(;lv(e)-i<a;){let n=eU((await lk(e,t,{updateSession:!0})).snapshot.nodes,o,{platform:e.backend.platform});if(n)return{kind:"selector",selector:n.selector.raw,waitedMs:lv(e)-i};await lI(e,300)}throw new y("COMMAND_FAILED",`wait timed out for selector: ${n}`)}async function lU(e,t,n,r){let a=r??1e4,i=lv(e);for(;lv(e)-i<a;){if(e.backend.findText?(await e.backend.findText(lb(e,t),n)).found:await lG(e,t,n))return{kind:"text",text:n,waitedMs:lv(e)-i};await lI(e,300)}throw new y("COMMAND_FAILED",`wait timed out for text: ${n}`)}async function lG(e,t,n){return!!eT((await lk(e,t,{updateSession:!0})).snapshot.nodes,n)}async function lV(e,t,n,r){let a=await lk(e,{...t,session:n},{updateSession:!0}),i=e_(r.selector),o=eG(a.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:r.disambiguateAmbiguous});if(!o)throw new y("COMMAND_FAILED",eB(i,[],{unique:!0}));return{capture:a,node:o.node,selector:o.selector.raw,ref:`@${o.node.ref}`}}function lB(e){let t=lj(e);if(!t)return null;let n=I(t);return Number.isFinite(n.x)&&Number.isFinite(n.y)?n:null}function lj(e){if(!e)return null;let t=Number(e.x),n=Number(e.y),r=Number(e.width),a=Number(e.height);return Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(r)&&Number.isFinite(a)&&!(r<0)&&!(a<0)?{x:t,y:n,width:r,height:a}:null}function lq(e,t){let n=function(e,t){let n=lj(t.rect);if(!n)return null;let r=t,a=new Set;for(;!a.has(r.ref);){a.add(r.ref);let t=e.filter(e=>{if(e.parentIndex!==r.index||!e.hittable)return!1;let t=lj(e.rect);return!!t&&lX(t,n)});if(1!==t.length)break;r=t[0]}return r===t?null:r}(e,t);if(n?.rect&&lB(n.rect))return n;let r=eO(e,t);return r?.rect&&lB(r.rect)?!function(e,t,n){var r,a,i,o;let s,l,d,u=lj(e.rect),c=lj(t.rect);if(!u||!c)return!1;let p=function(e,t){let n=I(t),r=e.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}).map(e=>lj(e.rect)).filter(e=>null!==e);if(0===r.length)return null;let a=r.filter(e=>eK(e,n.x,n.y));return eY(a.length>0?a:r)}(n,u);return!!p&&(r=c,a=p,s=(i=r,o=a,Math.max(0,Math.min(i.x+i.width,o.x+o.width)-Math.max(i.x,o.x))*Math.max(0,Math.min(i.y+i.height,o.y+o.height)-Math.max(i.y,o.y))),l=r.width*r.height,d=a.width*a.height,!(s<=0)&&!(l<=0)&&!(d<=0)&&!!(s/d>=.9)&&!!(s/l>=.8))&&!lX(u,c)}(t,r,e)?r:t:t}function lX(e,t){return .5>=Math.abs(e.x-t.x)&&.5>=Math.abs(e.y-t.y)&&.5>=Math.abs(e.width-t.width)&&.5>=Math.abs(e.height-t.height)}async function lH(e,t,n){if(await lK(e,t,n.action),"point"===t.target.kind)return{kind:"point",point:{x:t.target.x,y:t.target.y}};if("ref"===t.target.kind){let r=await lW(e,t,t.target),a=r.resolved,i=n.promoteToHittableAncestor?lq(r.snapshot.nodes,a.node):a.node;return function(e,t,n,r){let a=e.rect?e2(e,t):null;if(!(!e.rect||!a||e1(e,t)))throw new y("COMMAND_FAILED",`Ref ${n} is off-screen and not safe to ${r}`,{reason:"offscreen_ref",ref:v(n),rect:e.rect,viewport:a,hint:`Use scroll with the direction from the off-screen summary, take a fresh snapshot, then retry ${r} with the new ref or a selector.`})}(i,r.snapshot.nodes,t.target.ref,n.action),{kind:"ref",point:lZ(i,`Ref ${t.target.ref} not found or has invalid bounds`),target:{kind:"ref",ref:`@${a.ref}`},node:i,selectorChain:eC(i,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:eL(i,r.snapshot.nodes)}}let r=await lz(e,t,n.requireInteractive),a=e_(t.target.selector),i=eG(r.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if(!i||!i.node.rect)throw new y("COMMAND_FAILED",eB(a,i?.diagnostics??[],{unique:!0}));let o=n.promoteToHittableAncestor?lq(r.snapshot.nodes,i.node):i.node;return{kind:"selector",point:lZ(o,`Selector ${i.selector.raw} resolved to invalid bounds`),target:{kind:"selector",selector:i.selector.raw},node:o,selectorChain:eC(o,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:eL(o,r.snapshot.nodes)}}async function lz(e,t,n){if(!e.backend.captureSnapshot)throw new y("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let r=t.session??"default",a=await e.sessions.get(r);if(!a)throw new y("SESSION_NOT_FOUND","No active session. Run open first.");let i=await e.backend.captureSnapshot(lb(e,t),{interactiveOnly:n,compact:n}),o=i.snapshot??{nodes:i.nodes??[],truncated:i.truncated,backend:i.backend,createdAt:lv(e)};return await e.sessions.set({...a,snapshot:o}),{snapshot:o}}async function lK(e,t,n){if("macos"!==e.backend.platform)return;let r=await lY(e,t);if(("desktop"===r||"menubar"===r)&&("menubar"!==r||"click"!==n&&"press"!==n))throw new y("UNSUPPORTED_OPERATION",`${n} is not supported on macOS ${r} sessions yet. Open an app session to act, or use the ${r} surface to inspect.`)}async function lY(e,t){let n=await e.sessions.get(t.session??"default");return n?.metadata?.surface}async function lW(e,t,n){let r=t.session??"default",a=await e.sessions.get(r);if(!a)throw new y("SESSION_NOT_FOUND","No active session. Run open first.");if(!a.snapshot)throw new y("INVALID_ARGS","No snapshot in session. Run snapshot first.");let i=n.fallbackLabel??"",o=lJ(a.snapshot.nodes,n.ref,{fallbackLabel:i,requireRect:!0});if(o)return{snapshot:a.snapshot,resolved:o};let s=await lz(e,t,!0),l=lJ(s.snapshot.nodes,n.ref,{fallbackLabel:i,requireRect:!0});if(!l)throw new y("COMMAND_FAILED",`Ref ${n.ref} not found or has no bounds`);return{...s,resolved:l}}function lJ(e,t,n){let r=v(t);if(!r)throw new y("INVALID_ARGS",`Invalid ref: ${t}`);let a=b(e,r);if(lQ(a,n.requireRect))return{ref:r,node:a};let i=n.fallbackLabel.length>0?eT(e,n.fallbackLabel):null;return lQ(i,n.requireRect)?{ref:r,node:i}:null}function lZ(e,t){if(!e.rect)throw new y("COMMAND_FAILED",t);let n=I(e.rect);if(!Number.isFinite(n.x)||!Number.isFinite(n.y))throw new y("COMMAND_FAILED",t);return n}function lQ(e,t){if(!e)return!1;if(!t)return!0;if(!e.rect)return!1;let{x:n,y:r,width:a,height:i}=e.rect;if(!Number.isFinite(Number(n))||!Number.isFinite(Number(r))||!Number.isFinite(Number(a))||!Number.isFinite(Number(i))||0>Number(a)||0>Number(i))return!1;let o=I(e.rect);return Number.isFinite(o.x)&&Number.isFinite(o.y)}async function l0(e,t){let n=t.target??{kind:"viewport"};return"viewport"===n.kind?(await lK(e,t,"scroll"),{kind:"viewport"}):await lH(e,{...t,target:n},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function l1(e,t){if(t.from){var n;if("x"in(n=t.from)&&"y"in n)return await lK(e,t,"swipe"),{point:l3(t.from,"from")};let r=await lH(e,{...t,target:t.from},{action:"swipe",requireInteractive:!1,promoteToHittableAncestor:!1});return{point:r.point,target:r}}if(!t.direction)throw new y("INVALID_ARGS","swipe requires from+to or a direction");return await lK(e,t,"swipe"),{point:I(function(e){let t=e.filter(t=>e1(t,e)).map(e=>e.rect).filter(l4),n=t.length>0?t:e.map(e=>e.rect).filter(l4);if(0===n.length)throw new y("COMMAND_FAILED","Cannot infer viewport for directional swipe");let r=Math.min(...n.map(e=>e.x)),a=Math.min(...n.map(e=>e.y));return{x:r,y:a,width:Math.max(...n.map(e=>e.x+e.width))-r,height:Math.max(...n.map(e=>e.y+e.height))-a}}((await lz(e,t,!1)).snapshot.nodes)),target:{kind:"viewport"}}}function l2(e,t){switch(e){case"up":case"down":case"left":case"right":return e;default:throw new y("INVALID_ARGS",`${t} must be up, down, left, or right`)}}function l3(e,t){let n=Number(e.x),r=Number(e.y);if(!Number.isFinite(n)||!Number.isFinite(r))throw new y("INVALID_ARGS",`${t} point requires finite x and y`);return{x:n,y:r}}function l5(e,t){if(!Number.isFinite(e)||e<=0)throw new y("INVALID_ARGS",`${t} must be a positive number`);return e}function l4(e){return!!(e&&e.width>0&&e.height>0)}function l8(e){return e&&"object"==typeof e?e:void 0}async function l6(e,t,n){let r=await lH(e,t,{action:n,requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.tap)throw new y("UNSUPPORTED_OPERATION","tap is not supported by this backend");let a=l9(await e.backend.tap(lb(e,t),r.point,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap}));return{...r,...a?{backendResult:a}:{}}}function l9(e){return e&&"object"==typeof e?e:void 0}function l7(e){return!!(e&&"object"==typeof e)}function de(e){return e&&"object"==typeof e?e:void 0}let dt=/^[A-Za-z0-9_.:-]{1,64}$/;function dn(e,t){if(void 0!==e)return dr(e,t)}function dr(e,t){let n=e?.trim();if(!n)throw new y("INVALID_ARGS",`${t} must be a non-empty string`);return n}async function da(e,t){if(!t||"object"!=typeof t)throw new y("INVALID_ARGS","apps.push requires an input");if("json"===t.kind)return di(t.payload,"apps.push JSON payload",8192),{backendInput:{kind:"json",payload:t.payload},inputKind:"json"};let n=await sv(e,t,{usage:"apps.push",field:"input"});return{backendInput:{kind:"file",path:n.path},inputKind:"file",...n.cleanup?{cleanup:n.cleanup}:{}}}function di(e,t,n){if(function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new y("INVALID_ARGS",`${t} must be a JSON object`)}(e,t),Buffer.byteLength(function(e,t){try{let n=JSON.stringify(e);if("string"!=typeof n)throw new y("INVALID_ARGS",`${t} must be JSON-serializable`);return n}catch{throw new y("INVALID_ARGS",`${t} must be JSON-serializable`)}}(e,t),"utf8")>n)throw new y("INVALID_ARGS",`${t} exceeds ${n} bytes`)}function ds(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function dl(e){return e&&"object"==typeof e?e:void 0}async function dd(e,t,n){let r="reinstall"===n?"reinstallApp":"installApp",a=e.backend[r];if(!a)throw new y("UNSUPPORTED_OPERATION",`admin.${n} is not supported by this backend`);let i="app"in t&&void 0!==t.app?dh(t.app,"app"):void 0;if("installFromSource"!==n&&!i)throw new y("INVALID_ARGS",`admin.${n} requires app`);let o=lb(e,t),s=await du(e,o,t.source);try{var l,d,u,c,p;let t,r,f,h,m,w,g,y,b=await a.call(e.backend,o,{...i?{app:i}:{},source:s.source});return l=n,d=i,u=s.source,c=b,t=dw(c),r=dm(c,"appName"),f=dm(c,"appId"),h=dm(c,"bundleId"),m=dm(c,"packageName"),w=dm(c,"launchTarget"),g=dm(c,"installablePath"),y=dm(c,"archivePath"),{kind:"reinstall"===l?"appReinstalled":"installFromSource"===l?"appInstalledFromSource":"appInstalled",...d?{app:d}:{},source:u,...f?{appId:f}:{},...r?{appName:r}:{},...h?{bundleId:h}:{},...m?{packageName:m}:{},...w?{launchTarget:w}:{},...g?{installablePath:g}:{},...y?{archivePath:y}:{},...t?{backendResult:t}:{},...ed(`${"reinstall"===l?"Reinstalled":"Installed"}: ${r??w??d??(p=u,"path"===p.kind?p.path:"uploadedArtifact"===p.kind?p.id:p.url)}`)}}finally{await s.cleanup?.()}}async function du(e,t,n){let r=dp(n),a=await dc(e,r);try{let n=e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,a.source):a.source;return{source:dp(n),...a.cleanup?{cleanup:a.cleanup}:{}}}catch(e){if(a.cleanup)try{await a.cleanup()}catch{}throw e}}async function dc(e,t){if("url"===t.kind)return{source:t};let n=await sv(e,t,{usage:"admin.install",field:"source"});return{source:{kind:"path",path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function dp(e){if(!e||"object"!=typeof e)throw new y("INVALID_ARGS","install source is required");if("path"===e.kind)return{kind:"path",path:dh(e.path,"source.path")};if("uploadedArtifact"===e.kind)return{kind:"uploadedArtifact",id:dh(e.id,"source.id")};if("url"===e.kind){let t=dh(e.url,"source.url");return function(e){let t;try{t=new URL(e)}catch{throw new y("INVALID_ARGS",`Invalid install source URL: ${e}`)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new y("INVALID_ARGS","Install source URL must use http or https")}(t),{kind:"url",url:t}}throw new y("INVALID_ARGS","install source kind must be path, uploadedArtifact, or url")}function df(e,t){if(void 0!==e)return dh(e,t)}function dh(e,t){let n=e?.trim();if(!n)throw new y("INVALID_ARGS",`${t} must be a non-empty string`);return n}function dm(e,t){let n=e[t];return"string"==typeof n&&n.length>0?n:void 0}function dw(e){return e&&"object"==typeof e?e:void 0}function dg(e,t){if("start"===e||"stop"===e)return e;throw new y("INVALID_ARGS",`${t} action must be start or stop`)}function dy(e,t,n,r){return{kind:"start"===e?r.startKind:r.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...ed("start"===e?r.startMessage:r.stopMessage)}}let db=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,dv=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function dI(e){var t,n;let r=!1,a=e;return{value:(t=a=(a=(a=(a=(a=a.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,t)=>(r=!0,`${String(t)}=[REDACTED]`))).replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,t,n,a)=>(r=!0,`${String(t)}[REDACTED]${String(a)}`))).replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,t)=>(r=!0,`${String(t)}[REDACTED]`))).replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;&]+)/gi,(e,t)=>(r=!0,`${String(t)}[REDACTED]`))).replaceAll(dv,()=>(r=!0,"[REDACTED]")),n=()=>{r=!0},a=/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(t)?t.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let t=dA(e);return t?(t.redacted&&n(),t.value):e}):t),redacted:r}}function dA(e){try{let t=new URL(e),n=function(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))db.test(n)&&(e.searchParams.set(n,"[REDACTED]"),t=!0);return t}(t);return(t.username||t.password)&&(t.username="REDACTED",t.password="REDACTED",n=!0),{value:t.toString(),redacted:n}}catch{return}}let dx=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function dS(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[r,a]of Object.entries(e))if(dx.test(r))n[r]="[REDACTED]",t=!0;else{let e=dM(a,2048);n[r]=e.value??"",t||=e.redacted}return{value:n,redacted:t}}function dN(e){return void 0===e?{redacted:!1}:function(e){try{let t=JSON.parse(e),n=dk(t,dI);return dD(JSON.stringify(n.value),2048,n.redacted)}catch{return}}(e)??dM(e,2048)}function d_(e){return dk(e,e=>dM(e,2048))}function dk(e,t){if(void 0===e)return{redacted:!1};if("string"==typeof e)return t(e);if(!e||"object"!=typeof e)return{value:e,redacted:!1};if(Array.isArray(e)){let n=!1;return{value:e.map(e=>{let r=dk(e,t);return n||=r.redacted,r.value}),redacted:n}}let n=!1,r={};for(let[a,i]of Object.entries(e)){if(dx.test(a)){r[a]="[REDACTED]",n=!0;continue}let e=dk(i,t);r[a]=e.value,n||=e.redacted}return{value:r,redacted:n}}function dM(e,t){if(void 0===e)return{redacted:!1};let n=dI(e);return dD(n.value,t,n.redacted)}function dD(e,t,n){if(void 0===e)return{redacted:n};let r=e;return r.length>t&&(r=`${r.slice(0,t)}...[truncated]`,n=!0),{value:r,redacted:n}}async function dE(e,t){let n=lb(e,t),r=t.session?await e.sessions.get(t.session):void 0;return{...n,...t.appId??r?.appId?{appId:t.appId??r?.appId}:{},...t.appBundleId??r?.appBundleId?{appBundleId:t.appBundleId??r?.appBundleId}:{}}}function dO(e,t,n,r){return{...dC(e),...void 0!==e.cursor?{cursor:dP(e.cursor,"cursor")}:{},limit:void 0===e.limit?t:i7(e.limit,r,1,n)}}function dC(e){return{...void 0!==e.since?{since:dP(e.since,"since")}:{},...void 0!==e.until?{until:dP(e.until,"until")}:{}}}function dR(e,t,n=50){if(!Array.isArray(e))throw new y("INVALID_ARGS",`${t} must be an array of strings`);if(e.length>n)throw new y("INVALID_ARGS",`${t} must contain at most ${n} entries`);return e.map((e,n)=>dP(e,`${t}[${n}]`))}function dP(e,t){let n=e.trim();if(!n)throw new y("INVALID_ARGS",`${t} must be a non-empty string`);return n}let dT=async(e,t)=>{let n;if(!e.backend.captureScreenshot)throw new y("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");let r=await sI(e,t.out,{field:"path",ext:".png"});try{await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},r.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,surface:t.surface}),void 0!==t.maxSize&&await sb(r.path,t.maxSize),n=await r.publish()}catch(e){throw await r.cleanup?.(),e}return{path:r.path,...n?{artifacts:[n]}:{},...ed(`Saved screenshot: ${r.path}`)}},dL=async(e,t)=>{let n,r,a;if(!t.baseline)throw new y("INVALID_ARGS","diff screenshot requires a baseline image");let i=function(e){if(null==e||""===e)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new y("INVALID_ARGS","--threshold must be a number between 0 and 1");return t}(t.threshold),o=t.current??{kind:"live"};if(t.overlayRefs&&!ls(o))throw new y("INVALID_ARGS","diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs");let s=await sv(e,t.baseline,{usage:"diff screenshot baseline",field:"baseline"}),l=[];try{let d;d=ls(o)?(r=await lt(e,t)).path:(n=await sv(e,o,{usage:"diff screenshot current",field:"current"})).path,a=t.out?await sI(e,t.out,{field:"diffPath",ext:".png"}):void 0;let u=await s3(s.path,d,{threshold:i,outputPath:a?.path,maxPixels:e.policy.maxImagePixels});ls(o)&&(u=await ln(e,t,a?.path,u,l));let c=u.diffPath?await a?.publish():void 0;return c&&l.push(c),u.diffPath||await a?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await a?.cleanup?.(),e}finally{await s.cleanup?.(),await n?.cleanup?.(),await r?.cleanup?.()}},d$=async(e,t)=>{var n;let r,a,i=await lA(e,t);return await e.sessions.set(lx(t.session,i)),{nodes:i.snapshot.nodes,truncated:i.snapshot.truncated??!1,visibility:function(e){var t;let{nodes:n,backend:r,snapshotRaw:a}=e;if(a||"macos-helper"===(t=r)||"linux-atspi"===t)return{partial:!1,visibleNodeCount:n.length,totalNodeCount:n.length,reasons:[]};let i=eQ(n),o=new Set;return i.hiddenCount>0&&o.add("offscreen-nodes"),i.nodes.some(e=>e.hiddenContentAbove)&&o.add("scroll-hidden-above"),i.nodes.some(e=>e.hiddenContentBelow)&&o.add("scroll-hidden-below"),{partial:o.size>0,visibleNodeCount:i.nodes.length,totalNodeCount:n.length,reasons:[...o]}}({nodes:i.snapshot.nodes,backend:i.snapshot.backend,snapshotRaw:t.raw}),...i.result.androidSnapshot?{androidSnapshot:i.result.androidSnapshot}:{},...i.warnings.length>0?{warnings:i.warnings}:{},...(r=(n=i).result.appName??n.session?.appName,a=n.result.appBundleId??n.session?.appBundleId,{...r||a?{appName:r??a}:{},...a?{appBundleId:a}:{}})}},dF=async(e,t)=>{let n=await lA(e,t),r=!0===t.interactiveOnly,a=n.session?.snapshot,i=lx(t.session,n);if(!a){let t=function(e,t={}){return lw(e,t).length}(n.snapshot.nodes,{flatten:r});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let o=function(e,t,n={}){let r=function(e,t){let n=e.length,r=t.length,a=n+r,i=new Map,o=[];i.set(1,0);for(let s=0;s<=a;s+=1){o.push(new Map(i));for(let a=-s;a<=s;a+=2){let l=a===-s||a!==s&&lg(i,a-1)<lg(i,a+1)?lg(i,a+1):lg(i,a-1)+1,d=l-a;for(;l<n&&d<r&&e[l].comparable===t[d].comparable;)l+=1,d+=1;if(i.set(a,l),l>=n&&d>=r)return function(e,t,n,r,a){let i=[],o=r,s=a;for(let r=e.length-1;r>=0;r-=1){let a=e[r],l=o-s,d=l===-r||l!==r&&lg(a,l-1)<lg(a,l+1)?l+1:l-1,u=lg(a,d),c=u-d;for(;o>u&&s>c;)i.push({kind:"unchanged",text:n[s-1].text}),o-=1,s-=1;if(0===r)break;o===u?(i.push({kind:"added",text:n[c].text}),s=c):(i.push({kind:"removed",text:t[u].text}),o=u)}return i.reverse(),i}(o,e,t,n,r)}}return[]}(lw(e,n),lw(t,n)),a={additions:0,removals:0,unchanged:0};for(let e of r)"added"===e.kind&&(a.additions+=1),"removed"===e.kind&&(a.removals+=1),"unchanged"===e.kind&&(a.unchanged+=1);return{summary:a,lines:r}}(a.nodes,n.snapshot.nodes,{flatten:r});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!1,summary:o.summary,lines:o.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}},dU=async(e,t)=>{let n=t.locator??"any";if(!t.query)throw new y("INVALID_ARGS","find requires a value");if("wait"===t.action)return await l$(e,t,n);let r=await lk(e,t,{updateSession:!0,scope:ly(n)?t.query:void 0}),a=eq(r.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0];if(!a)throw new y("COMMAND_FAILED","find did not match any element");if("exists"===t.action)return{kind:"found",found:!0};let i=`@${a.ref}`;return"get_attrs"===t.action?{kind:"attrs",ref:i,node:a}:{kind:"text",ref:i,text:await lM(e,r,a),node:a}},dG=lD,dV=lE,dB=lO,dj=lC,dq=lR,dX=lP,dH=lT,dz=lL,dK=async(e,t)=>await l6(e,t,"click"),dY=async(e,t)=>await l6(e,t,"press"),dW=async(e,t)=>{var n;if(!t.text)throw new y("INVALID_ARGS","fill requires text");let r=await lH(e,t,{action:"fill",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.fill)throw new y("UNSUPPORTED_OPERATION","fill is not supported by this backend");let a=l9(await e.backend.fill(lb(e,t),r.point,t.text,{delayMs:t.delayMs})),i="node"in r?r.node.type??"":"",o=i&&!ej(i,e.backend.platform)?`fill target ${n=r,n.target?.kind==="ref"?n.target.ref:n.target?.kind==="selector"?n.target.selector:"point"} resolved to "${i}", attempting fill anyway.`:void 0;return{...r,text:t.text,...o?{warning:o}:{},...a?{backendResult:a}:{}}},dJ=async(e,t)=>{let n=t.text;if(!n)throw new y("INVALID_ARGS","type requires text");let r=function(e){let t=e.trim().split(/\s+/,1)[0];if(!t||!t.startsWith("@")||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}(n);if(r)throw new y("INVALID_ARGS",`type does not accept a target ref like "${r}"`,{hint:`Use fill ${r} "text" to target that field, or press ${r} then type "text" to append.`});if(!e.backend.typeText)throw new y("UNSUPPORTED_OPERATION","type is not supported by this backend");let a=i7(t.delayMs??0,"delay-ms",0,1e4),i=l9(await e.backend.typeText(lb(e,t),n,{delayMs:a}));return{kind:"text",text:n,delayMs:a,...i?{backendResult:i}:{},...ed(`Typed ${Array.from(n).length} chars`)}},dZ=async(e,t)=>{let n=await lH(e,t,{action:"focus",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new y("UNSUPPORTED_OPERATION","focus is not supported by this backend");let r=l8(await e.backend.focus(lb(e,t),n.point));return{...n,...r?{backendResult:r}:{},...ed(`Focused (${n.point.x}, ${n.point.y})`)}},dQ=async(e,t)=>{let n=await lH(e,t,{action:"longPress",requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.longPress)throw new y("UNSUPPORTED_OPERATION","longPress is not supported by this backend");let r=void 0===t.durationMs?void 0:i7(t.durationMs,"durationMs",0,12e4),a=l8(await e.backend.longPress(lb(e,t),n.point,{durationMs:r}));return{...n,...void 0!==r?{durationMs:r}:{},...a?{backendResult:a}:{},...ed(`Long pressed (${n.point.x}, ${n.point.y})`)}},d0=async(e,t)=>{if(!e.backend.swipe)throw new y("UNSUPPORTED_OPERATION","swipe is not supported by this backend");let n=await l1(e,t),r=function(e,t){if(t.to)return{point:l3(t.to,"to")};let n=l2(t.direction,"swipe direction"),r=l5(t.distance??200,"swipe distance");switch(n){case"up":return{point:{x:e.x,y:e.y-r},direction:n,distance:r};case"down":return{point:{x:e.x,y:e.y+r},direction:n,distance:r};case"left":return{point:{x:e.x-r,y:e.y},direction:n,distance:r};case"right":return{point:{x:e.x+r,y:e.y},direction:n,distance:r}}}(n.point,t),a=void 0===t.durationMs?void 0:i7(t.durationMs,"durationMs",16,1e4),i=l8(await e.backend.swipe(lb(e,t),n.point,r.point,{durationMs:a}));return{kind:"swipe",from:n.point,to:r.point,...r.direction?{direction:r.direction}:{},...void 0!==r.distance?{distance:r.distance}:{},...void 0!==a?{durationMs:a}:{},...n.target?{fromTarget:n.target}:{},...i?{backendResult:i}:{},...ed("Swiped")}},d1=async(e,t)=>{var n,r;if(!e.backend.scroll)throw new y("UNSUPPORTED_OPERATION","scroll is not supported by this backend");let a=l2(t.direction,"scroll direction"),i=(n=t.amount,r="scroll amount",void 0===n?void 0:l5(n,r)),o=function(e,t){if(void 0!==e){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new y("INVALID_ARGS",`${t} must be a positive integer`);return e}}(t.pixels,"scroll pixels");if(void 0!==i&&void 0!==o)throw new y("INVALID_ARGS","scroll accepts either amount or pixels, not both");let s=await l0(e,t),l="viewport"===s.kind?{kind:"viewport"}:{kind:"point",point:s.point},d=l8(await e.backend.scroll(lb(e,t),l,{direction:a,...void 0!==i?{amount:i}:{},...void 0!==o?{pixels:o}:{}}));return{...s,direction:a,...void 0!==i?{amount:i}:{},...void 0!==o?{pixels:o}:{},...d?{backendResult:d}:{},...ed(void 0!==o?`Scrolled ${a} by ${o}px`:void 0!==i?`Scrolled ${a} by ${i}`:`Scrolled ${a}`)}},d2=async(e,t)=>{if(!e.backend.pinch)throw new y("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await lK(e,t,"pinch");let n=l5(t.scale,"pinch scale"),r=t.center?await lH(e,{...t,target:t.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,a=l8(await e.backend.pinch(lb(e,t),{scale:n,...r?{center:r.point}:{}}));return{kind:"pinch",scale:n,...r?{center:r.point,centerTarget:r}:{},...a?{backendResult:a}:{},...ed(`Pinched to scale ${n}`)}},d3=async(e,t={})=>{if(!e.backend.pressBack)throw new y("UNSUPPORTED_OPERATION","system.back is not supported by this backend");let n=t.mode??"in-app";if("in-app"!==n&&"system"!==n)throw new y("INVALID_ARGS","system.back mode must be in-app or system");let r=de(await e.backend.pressBack(lb(e,t),{mode:n}));return{kind:"systemBack",mode:n,...r?{backendResult:r}:{},...ed("Back")}},d5=async(e,t={})=>{if(!e.backend.pressHome)throw new y("UNSUPPORTED_OPERATION","system.home is not supported by this backend");let n=de(await e.backend.pressHome(lb(e,t)));return{kind:"systemHome",...n?{backendResult:n}:{},...ed("Home")}},d4=async(e,t)=>{if(!e.backend.rotate)throw new y("UNSUPPORTED_OPERATION","system.rotate is not supported by this backend");let n=function(e){switch(e){case"portrait":case"portrait-upside-down":case"landscape-left":case"landscape-right":return e;default:throw new y("INVALID_ARGS","system.rotate orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right")}}(t.orientation),r=de(await e.backend.rotate(lb(e,t),n));return{kind:"systemRotated",orientation:n,...r?{backendResult:r}:{},...ed(`Rotated to ${n}`)}},d8=async(e,t={})=>{if(!e.backend.setKeyboard)throw new y("UNSUPPORTED_OPERATION","system.keyboard is not supported by this backend");let n=t.action??"status";if("status"!==n&&"get"!==n&&"dismiss"!==n)throw new y("INVALID_ARGS","system.keyboard action must be status, get, or dismiss");let r=await e.backend.setKeyboard(lb(e,t),{action:n}),a=de(r);if("dismiss"===n){let e=l7(r)?r.dismissed:void 0;return{kind:"keyboardDismissed",action:n,state:l7(r)?r:{},...a?{backendResult:a}:{},...ed(!1===e?"Keyboard already hidden":"Keyboard dismissed")}}return{kind:"keyboardState",action:n,state:l7(r)?r:{},...a?{backendResult:a}:{}}},d6=async(e,t)=>{if("read"===t.action){if(!e.backend.getClipboard)throw new y("UNSUPPORTED_OPERATION","system.clipboard read is not supported by this backend");let n=await e.backend.getClipboard(lb(e,t));return{kind:"clipboardText",action:"read",text:"string"==typeof n?n:n.text}}if("write"!==t.action)throw new y("INVALID_ARGS","system.clipboard action must be read or write");if(!e.backend.setClipboard)throw new y("UNSUPPORTED_OPERATION","system.clipboard write is not supported by this backend");if("string"!=typeof t.text)throw new y("INVALID_ARGS","system.clipboard write requires text");let n=de(await e.backend.setClipboard(lb(e,t),t.text));return{kind:"clipboardUpdated",action:"write",textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...ed("Clipboard updated")}},d9=async(e,t={})=>{if(!e.backend.openSettings)throw new y("UNSUPPORTED_OPERATION","system.settings is not supported by this backend");let n=function(e,t){if(void 0===e)return;let n=e.trim();if(!n)throw new y("INVALID_ARGS",`${t} must be a non-empty string`);return n}(t.target,"target"),r=de(await e.backend.openSettings(lb(e,t),n));return{kind:"settingsOpened",...n?{target:n}:{},...r?{backendResult:r}:{},...ed(n?`Opened settings: ${n}`:"Opened settings")}},d7=async(e,t={})=>{if(!e.backend.handleAlert)throw new y("UNSUPPORTED_OPERATION","system.alert is not supported by this backend");let n=t.action??"get";if("get"!==n&&"accept"!==n&&"dismiss"!==n&&"wait"!==n)throw new y("INVALID_ARGS","system.alert action must be get, accept, dismiss, or wait");let r=void 0===t.timeoutMs?void 0:i7(t.timeoutMs,"timeoutMs",0,12e4),a=await e.backend.handleAlert(lb(e,t),n,{timeoutMs:r});var i=n,o=a;if("get"===i){if("alertStatus"!==o.kind)throw new y("COMMAND_FAILED","system.alert get returned an invalid backend result");return{kind:"alertStatus",action:i,alert:o.alert}}if("wait"===i){if("alertWait"!==o.kind)throw new y("COMMAND_FAILED","system.alert wait returned an invalid backend result");return{kind:"alertWait",action:i,alert:o.alert,...void 0!==o.waitedMs?{waitedMs:o.waitedMs}:{},...void 0!==o.timedOut?{timedOut:o.timedOut}:{},...ed(o.alert?"Alert visible":"Alert wait timed out")}}if("alertHandled"!==o.kind)throw new y("COMMAND_FAILED",`system.alert ${i} returned an invalid backend result`);return{kind:"alertHandled",action:i,handled:o.handled,...o.alert?{alert:o.alert}:{},...o.button?{button:o.button}:{},...ed(o.handled?`Alert ${i}ed`:"No alert handled")}},ue=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new y("UNSUPPORTED_OPERATION","system.appSwitcher is not supported by this backend");let n=de(await e.backend.openAppSwitcher(lb(e,t)));return{kind:"appSwitcherOpened",...n?{backendResult:n}:{},...ed("Opened app switcher")}},ut=async(e,t)=>{var n;if(!e.backend.openApp)throw new y("UNSUPPORTED_OPERATION","apps.open is not supported by this backend");let r=function(e){var t;let n=dn(e.app,"app"),r=dn(e.appId,"appId"),a=dn(e.bundleId,"bundleId"),i=dn(e.packageName,"packageName"),o=dn(e.url,"url"),s=dn(e.activity,"activity"),l={...n?{app:n}:{},...r?{appId:r}:{},...a?{bundleId:a}:{},...i?{packageName:i}:{},...o?{url:o}:{},...s?{activity:s}:{}};if(!((t=l).app??t.appId??t.bundleId??t.packageName??t.url??t.activity))throw new y("INVALID_ARGS","apps.open requires app, appId, bundleId, packageName, url, or activity");return l}(t),a=dl(await e.backend.openApp(ds(e,t),r,{relaunch:t.relaunch}));return{kind:"appOpened",target:r,relaunch:!0===t.relaunch,...a?{backendResult:a}:{},...ed(`Opened: ${(n=r).app??n.appId??n.bundleId??n.packageName??n.url??n.activity??"app"}`)}},un=async(e,t={})=>{if(!e.backend.closeApp)throw new y("UNSUPPORTED_OPERATION","apps.close is not supported by this backend");let n=dn(t.app,"app"),r=dl(await e.backend.closeApp(ds(e,t),n));return{kind:"appClosed",...n?{app:n}:{},...r?{backendResult:r}:{},...ed(n?`Closed: ${n}`:"Closed app")}},ur=async(e,t={})=>{if(!e.backend.listApps)throw new y("UNSUPPORTED_OPERATION","apps.list is not supported by this backend");return{kind:"appsList",apps:await e.backend.listApps(ds(e,t),t.filter??"all")}},ua=async(e,t)=>{if(!e.backend.getAppState)throw new y("UNSUPPORTED_OPERATION","apps.state is not supported by this backend");let n=dr(t.app,"app"),r=await e.backend.getAppState(ds(e,t),n);return{kind:"appState",app:n,state:r}},ui=async(e,t)=>{if(!e.backend.pushFile)throw new y("UNSUPPORTED_OPERATION","apps.push is not supported by this backend");let n=dr(t.app,"app"),r=await da(e,t.input);try{let a=await e.backend.pushFile(ds(e,t),r.backendInput,n),i=dl(a);return{kind:"appPushed",app:n,inputKind:r.inputKind,...i?{backendResult:i}:{},...ed(`Pushed to ${n}`)}}finally{await r.cleanup?.()}},uo=async(e,t)=>{var n,r;if(!e.backend.triggerAppEvent)throw new y("UNSUPPORTED_OPERATION","apps.triggerEvent is not supported by this backend");let a=function(e){let t=dr(e,"name");if(!dt.test(t))throw new y("INVALID_ARGS",`Invalid apps.triggerEvent name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});return t}(t.name);n=t.payload,r=`apps.triggerEvent payload for "${a}"`,void 0!==n&&di(n,r,8192);let i=dl(await e.backend.triggerAppEvent(ds(e,t),{name:a,...t.payload?{payload:t.payload}:{}}));return{kind:"appEventTriggered",name:a,...t.payload?{payload:t.payload}:{},...i?{backendResult:i}:{},...ed(`Triggered app event: ${a}`)}},us=async(e,t={})=>{if(!e.backend.listDevices)throw new y("UNSUPPORTED_OPERATION","admin.devices is not supported by this backend");return{kind:"adminDevices",devices:await e.backend.listDevices(lb(e,t),t.filter)}},ul=async(e,t={})=>{if(!e.backend.bootDevice)throw new y("UNSUPPORTED_OPERATION","admin.boot is not supported by this backend");let n=function(e){if(!e)return;let t=df(e.id,"target.id"),n=df(e.name,"target.name"),r={...t?{id:t}:{},...n?{name:n}:{},...e.platform?{platform:e.platform}:{},...e.target?{target:e.target}:{},...void 0!==e.headless?{headless:e.headless}:{}};return Object.keys(r).length>0?r:void 0}(t.target),r=dw(await e.backend.bootDevice(lb(e,t),n));return{kind:"deviceBooted",...n?{target:n}:{},...r?{backendResult:r}:{},...ed("Booted device")}},ud=async(e,t)=>{if(!e.backend.ensureSimulator)throw new y("UNSUPPORTED_OPERATION","admin.ensureSimulator is not supported by this backend");let n=dh(t.device,"device");return{kind:"simulatorEnsured",...await e.backend.ensureSimulator(lb(e,t),{device:n,...t.runtime?{runtime:dh(t.runtime,"runtime")}:{},...void 0!==t.boot?{boot:t.boot}:{},...void 0!==t.reuseExisting?{reuseExisting:t.reuseExisting}:{}})}},uu=async(e,t)=>await dd(e,t,"install"),uc=async(e,t)=>await dd(e,t,"reinstall"),up=async(e,t)=>await dd(e,t,"installFromSource"),uf=async(e,t)=>{let n=dg(t.action,"record"),r="start"===n?e.backend.startRecording:e.backend.stopRecording;if(!r)throw new y("UNSUPPORTED_OPERATION",`record ${n} is not supported by this backend`);let a=t.out?await sI(e,t.out,{field:"path",ext:".mp4"}):void 0;try{var i,o,s,l,d;let u,c,p=(i=t,o=a?.path,u=void 0===i.fps?void 0:i7(i.fps,"fps",1,60),c=void 0===i.quality?void 0:i7(i.quality,"quality",5,10),{...o?{outPath:o}:{},...void 0!==u?{fps:u}:{},...void 0!==c?{quality:c}:{},...void 0!==i.hideTouches?{showTouches:!0!==i.hideTouches}:{}}),f=await r.call(e.backend,lb(e,t),p),h=await a?.publish();return s=n,l=f,d=h,{..."string"==typeof l.path?{path:l.path}:{},..."string"==typeof l.telemetryPath?{telemetryPath:l.telemetryPath}:{},..."string"==typeof l.warning?{warning:l.warning}:{},...dy(s,l,d,{startKind:"recordingStarted",stopKind:"recordingStopped",startMessage:"Recording started",stopMessage:"Recording stopped"})}}catch(e){throw await a?.cleanup?.(),e}},uh=async(e,t)=>{let n=dg(t.action,"trace"),r="start"===n?e.backend.startTrace:e.backend.stopTrace;if(!r)throw new y("UNSUPPORTED_OPERATION",`trace ${n} is not supported by this backend`);let a=t.out?await sI(e,t.out,{field:"outPath",ext:".trace"}):void 0;try{var i,o,s;let l={...a?.path?{outPath:a.path}:{}},d=await r.call(e.backend,lb(e,t),l),u=await a?.publish();return i=n,o=d,s=u,{..."string"==typeof o.outPath?{outPath:o.outPath}:{},...dy(i,o,s,{startKind:"traceStarted",stopKind:"traceStopped",startMessage:"Trace started",stopMessage:"Trace stopped"})}}catch(e){throw await a?.cleanup?.(),e}},um=async(e,t={})=>{var n,r;let a;if(!e.backend.readLogs)throw new y("UNSUPPORTED_OPERATION","diagnostics.logs is not supported by this backend");return a=!0===(n=await e.backend.readLogs(await dE(e,t),{...dO(r=t,100,500,"logs limit"),...void 0!==r.levels?{levels:dR(r.levels,"levels")}:{},...void 0!==r.search?{search:dP(r.search,"search")}:{},...void 0!==r.source?{source:dP(r.source,"source")}:{}})).redacted,{kind:"diagnosticsLogs",entries:n.entries.map(e=>{let t=dM(e.message,4096),n=d_(e.metadata);return a||=t.redacted||n.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:t.value??"",...e.source?{source:e.source}:{},...n.value?{metadata:n.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:a,...n.notes?{notes:n.notes}:{}}},uw=async(e,t={})=>{var n,r,a;let i;if(!e.backend.dumpNetwork)throw new y("UNSUPPORTED_OPERATION","diagnostics.network is not supported by this backend");let o={...dO(a=t,25,200,"network limit"),include:function(e){if(void 0===e)return"summary";if("summary"===e||"headers"===e||"body"===e||"all"===e)return e;throw new y("INVALID_ARGS","network include must be summary, headers, body, or all")}(a.include)};return n=await e.backend.dumpNetwork(await dE(e,t),o),r=o.include??"summary",i=!0===n.redacted,{kind:"diagnosticsNetwork",entries:n.entries.map(e=>{var t;let n=e.url?dA(t=e.url)??dM(t,2048):void 0,a="headers"===r||"all"===r?dS(e.requestHeaders):void 0,o="headers"===r||"all"===r?dS(e.responseHeaders):void 0,s="body"===r||"all"===r?dN(e.requestBody):void 0,l="body"===r||"all"===r?dN(e.responseBody):void 0,d=d_(e.metadata);return i||=(n?.redacted??!1)||(a?.redacted??!1)||(o?.redacted??!1)||(s?.redacted??!1)||(l?.redacted??!1)||d.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...n?{url:n.value}:{},...void 0!==e.status?{status:e.status}:{},...void 0!==e.durationMs?{durationMs:e.durationMs}:{},...a?.value?{requestHeaders:a.value}:{},...o?.value?{responseHeaders:o.value}:{},...s?.value!==void 0?{requestBody:s.value}:{},...l?.value!==void 0?{responseBody:l.value}:{},...d.value?{metadata:d.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:i,...n.notes?{notes:n.notes}:{}}},ug=async(e,t={})=>{var n,r;let a;if(!e.backend.measurePerf)throw new y("UNSUPPORTED_OPERATION","diagnostics.perf is not supported by this backend");return a=!0===(n=await e.backend.measurePerf(await dE(e,t),{...dC(r=t),...void 0!==r.sampleMs?{sampleMs:i7(r.sampleMs,"sampleMs",100,6e4)}:{},...void 0!==r.metrics?{metrics:dR(r.metrics,"metrics",20)}:{}})).redacted,{kind:"diagnosticsPerf",metrics:n.metrics.map(e=>{let t=dM(e.message,4096),n=d_(e.metadata);return a||=t.redacted||n.redacted,{name:e.name,...void 0!==e.value?{value:e.value}:{},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...void 0!==t.value?{message:t.value}:{},...n.value?{metadata:n.value}:{}}}),...n.startedAt?{startedAt:n.startedAt}:{},...n.endedAt?{endedAt:n.endedAt}:{},...n.backend?{backend:n.backend}:{},redacted:a,...n.notes?{notes:n.notes}:{}}};function uy(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??function(e=[]){let t=new Map(e.map(e=>[e.name,ub(e)]));return{get:e=>ub(t.get(e)),set:e=>{t.set(e.name,ub(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>ub(e))}}(),policy:e.policy??function(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal};return{...t,capture:{screenshot:e=>dT(t,e),diffScreenshot:e=>dL(t,e),snapshot:e=>d$(t,e),diffSnapshot:e=>dF(t,e)},selectors:{find:e=>dU(t,e),get:e=>dG(t,e),getText:(e,n={})=>dV(t,{...n,target:e}),getAttrs:(e,n={})=>dB(t,{...n,target:e}),is:e=>dj(t,e),isVisible:(e,n={})=>dq(t,{...n,target:e}),isHidden:(e,n={})=>dX(t,{...n,target:e}),wait:e=>dH(t,e),waitForText:(e,n={})=>dz(t,{...n,text:e})},interactions:{click:(e,n={})=>dK(t,{...n,target:e}),press:(e,n={})=>dY(t,{...n,target:e}),fill:(e,n,r={})=>dW(t,{...r,target:e,text:n}),typeText:(e,n={})=>dJ(t,{...n,text:e}),focus:(e,n={})=>dZ(t,{...n,target:e}),longPress:(e,n={})=>dQ(t,{...n,target:e}),swipe:e=>d0(t,e),scroll:e=>d1(t,e),pinch:e=>d2(t,e)},system:{back:e=>d3(t,e),home:e=>d5(t,e),rotate:e=>d4(t,e),keyboard:e=>d8(t,e),clipboard:e=>d6(t,e),settings:e=>d9(t,e),alert:e=>d7(t,e),appSwitcher:e=>ue(t,e)},apps:{open:e=>ut(t,e),close:e=>un(t,e),list:e=>ur(t,e),state:e=>ua(t,e),push:e=>ui(t,e),triggerEvent:e=>uo(t,e)},admin:{devices:e=>us(t,e),boot:e=>ul(t,e),ensureSimulator:e=>ud(t,e),install:e=>uu(t,e),reinstall:e=>uc(t,e),installFromSource:e=>up(t,e)},recording:{record:e=>uf(t,e),trace:e=>uh(t,e)},observability:{logs:e=>um(t,e),network:e=>uw(t,e),perf:e=>ug(t,e)}}}function ub(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:function(e){try{return structuredClone(e)}catch{return{...e}}}(e.metadata)}:{}}}function uv(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}function uI(e,t={}){let n=!0===t.plural?"do":"does";return{resolveInput:async()=>{throw new y("UNSUPPORTED_OPERATION",`${e} ${n} not resolve input artifacts`)},reserveOutput:async()=>{throw new y("UNSUPPORTED_OPERATION",`${e} ${n} not reserve output artifacts`)},createTempFile:async()=>{throw new y("UNSUPPORTED_OPERATION",`${e} ${n} not create temporary files`)}}}async function uA(e){let t=si(e.session);if(t&&"android"===e.device.platform)return await uS(e,t);let n=await ux(e);return so(e.session),{snapshot:uM(n,u_(e)),analysis:n.analysis,androidSnapshot:n.androidSnapshot}}async function ux(e){let{device:t,session:n,flags:r,outPath:a,logPath:i,snapshotScope:o}=e;if("linux"===t.platform){let e=await i5(n?.surface);return uD({nodes:e.nodes,truncated:e.truncated,backend:"linux-atspi"},{snapshotDepth:r?.snapshotDepth,snapshotInteractiveOnly:r?.snapshotInteractiveOnly,snapshotScope:o})}return"macos"===t.platform&&n?.surface&&"app"!==n.surface?uD(await nW(n.surface,{bundleId:"menubar"===n.surface?n.appBundleId:void 0}),{snapshotDepth:r?.snapshotDepth,snapshotInteractiveOnly:r?.snapshotInteractiveOnly,snapshotScope:o}):await oT(t,"snapshot",[],a,{...o2(i,{...r,snapshotScope:o},n?.appBundleId,n?.trace?.outPath)})}async function uS(e,t){let n=await uN(e),r=uk(n,t,e),a=0,i=t.markedAt+1500;for(let o of sr){if(!r)break;let s=i-Date.now();if(s<=0)break;await ec(Math.min(o,s)),n=await uN(e),a+=1,r=uk(n,t,e)}return r||so(e.session),{snapshot:n.snapshot,analysis:n.data.analysis,androidSnapshot:n.data.androidSnapshot,freshness:a>0||r?{action:t.action,retryCount:a,staleAfterRetries:!!r,reason:r??void 0}:void 0}}async function uN(e){let t=await ux(e);return{data:t,snapshot:uM(t,u_(e))}}function u_(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function uk(e,t,n){var r,a;let i=n.flags?.snapshotInteractiveOnly===!0,o=e.data.analysis;if(i&&0===e.snapshot.nodes.length&&o&&o.rawNodeCount>=12)return"empty-interactive";if("ref-refresh"===n.androidFreshnessMode)return null;return(r=t.baselineCount,a=e.snapshot.nodes.length,!(r<12)&&a<=Math.floor(.2*r))?e.snapshot.nodes.some(e=>!0===e.hittable||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())?null:"sharp-drop":t.routeComparable&&ss(t.action)&&function(e,t){if(!e||0===e.length)return!1;let n=Math.max(e.length,t.length);if(n<12)return!1;let r=sl(t),a=Math.min(e.length,r.length),i=0;for(let t=0;t<a;t+=1)e[t]===r[t]&&(i+=1);let o=Math.max(0,r.length-e.length),s=Math.max(0,e.length-r.length),l=Math.max(3,Math.floor(.15*n));return i>=Math.floor(.9*n)&&o<=l&&s<=l}(t.baselineSignatures,e.snapshot.nodes)?"stuck-route":null}function uM(e,t){let n=e?.nodes??[],r=function(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[a,i]of e.entries()){let e=Math.max(0,i.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o="number"==typeof i.parentIndex?t.get(i.parentIndex):void 0,s="number"==typeof o&&o<a?o:r[r.length-1]?.index;n.push({...i,index:a,depth:e,parentIndex:s}),r.push({depth:e,index:a})}return n}(t?.snapshotRaw?n:eD(n));return{nodes:A(t?.snapshotScope&&e?.backend!=="macos-helper"?uE(r,t.snapshotScope):r),truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,comparisonSafe:e?.backend==="android"&&t?.snapshotInteractiveOnly!==!0&&t?.snapshotCompact!==!0&&"number"!=typeof t?.snapshotDepth&&!t?.snapshotScope}}function uD(e,t){var n,r;let a=e.nodes??[];return t.snapshotScope&&(a=uE(a,t.snapshotScope)),t.snapshotInteractiveOnly&&(a=function(e){if(0===e.length)return e;let t=new Map;for(let n of e)t.set(n.index,n);let n=new Set;for(let r of e){if(!function(e){if(e.hittable||e.rect)return!0;let t=`${e.type??""} ${e.role??""} ${e.subrole??""}`.toLowerCase();return t.includes("button")||t.includes("menu")||t.includes("textfield")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")}(r))continue;let e=r;for(;e&&!n.has(e.index);)n.add(e.index),e="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0}return 0===n.size?e:uO(e.filter(e=>n.has(e.index)))}(a)),"number"==typeof t.snapshotDepth&&(n=a,r=t.snapshotDepth,a=uO(n.filter(e=>(e.depth??0)<=r))),{...e,nodes:a}}function uE(e,t){let n=eT(A(e),t);if(!n)return[];let r=e.findIndex(e=>e.index===n.index);if(-1===r)return[];let a=e[r]?.depth??0,i=[];for(let t=r;t<e.length;t+=1){let n=e[t];if(!n)continue;let o=n.depth??0;if(t>r&&o<=a)break;i.push(n)}return uO(i,a)}function uO(e,t=0){let n=new Map;for(let[t,r]of e.entries())n.set(r.index,t);return e.map((e,r)=>({...e,index:r,depth:Math.max(0,(e.depth??0)-t),parentIndex:"number"==typeof e.parentIndex?n.get(e.parentIndex):void 0}))}function uC(e,t){let n;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return se("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let r=v(e.trim());if(!r)return se("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=b(e.nodes,r);if(n=t?eL(t,e.nodes):void 0)break}return n?{ok:!0,scope:n}:se("COMMAND_FAILED",`Ref ${e} not found or has no label`)}async function uR(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,{session:i,device:o}=await sp(a,n,t.flags);if(!o1("snapshot",o))return se("UNSUPPORTED_OPERATION","snapshot is not supported on this device");let s=uC(t.flags?.snapshotScope,i);return s.ok?await sf(i,o,async()=>{let e=uT({req:t,sessionName:n,logPath:r,sessionStore:a,session:i,device:o,snapshotScope:s.scope}),l=await e.capture.snapshot({session:n,interactiveOnly:t.flags?.snapshotInteractiveOnly,compact:t.flags?.snapshotCompact,depth:t.flags?.snapshotDepth,scope:s.scope,raw:t.flags?.snapshotRaw});return uL({req:t,sessionName:n,sessionStore:a,result:{nodes:l.nodes.length,truncated:l.truncated}}),{ok:!0,data:l}}):s}async function uP(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,{session:i,device:o}=await sp(a,n,t.flags);if(!o1("diff",o))return se("UNSUPPORTED_OPERATION","diff is not supported on this device");let s=uC(t.flags?.snapshotScope,i);return s.ok?await sf(i,o,async()=>{let e=uT({req:t,sessionName:n,logPath:r,sessionStore:a,session:i,device:o,snapshotScope:s.scope}),l=await e.capture.diffSnapshot({session:n,interactiveOnly:t.flags?.snapshotInteractiveOnly,compact:t.flags?.snapshotCompact,depth:t.flags?.snapshotDepth,scope:s.scope,raw:t.flags?.snapshotRaw});return uL({req:t,sessionName:n,sessionStore:a,result:{mode:"snapshot",baselineInitialized:l.baselineInitialized,summary:l.summary}}),{ok:!0,data:l}}):s}function uT(e){let{req:t,sessionName:n,logPath:r,sessionStore:a,session:i,device:o,snapshotScope:s}=e;return uy({backend:function(e){let{req:t,logPath:n,session:r,device:a,snapshotScope:i}=e;return{platform:a.platform,captureSnapshot:async(e,o)=>{let s=await uA({device:a,session:r,flags:t.flags,outPath:o?.outPath??t.flags?.out,logPath:n,snapshotScope:i});return{snapshot:s.snapshot,analysis:s.analysis,androidSnapshot:s.androidSnapshot,freshness:s.freshness,appName:r?.appBundleId?r.appName??r.appBundleId:void 0,appBundleId:r?.appBundleId}}}}({req:t,logPath:r,session:i,device:o,snapshotScope:s}),artifacts:uI("snapshot"),sessions:{get:e=>e===n?function(e){if(e)return{name:e.name,appBundleId:e.appBundleId,appName:e.appName,snapshot:e.snapshot,metadata:{surface:e.surface}}}(a.get(n)):void 0,set:e=>{var r;if(!e.snapshot)throw new y("UNKNOWN","snapshot runtime did not produce session state");let i=a.get(n);a.set(n,function(e){var t,n;let{current:r,sessionName:a,device:i,record:o,refScopedSnapshot:s}=e;if(!o.snapshot)throw new y("UNKNOWN","snapshot runtime did not produce session state");let l=(t=r,n=o,s&&n.snapshot?.nodes.length===0&&t?.snapshot!==void 0),d=l?r.snapshot:o.snapshot,u=function(e){let{session:t,sessionName:n,device:r,snapshot:a,appBundleId:i}=e;return t?{...t,snapshot:a}:{name:n,device:r,createdAt:Date.now(),appBundleId:i,snapshot:a,actions:[]}}({session:r,sessionName:a,device:i,snapshot:d,appBundleId:o.appBundleId});return u.snapshotScopeSource=function(e){let{current:t,keepCurrentSnapshot:n,refScopedSnapshot:r}=e;if(r)return n?t?.snapshotScopeSource:t?.snapshotScopeSource??t?.snapshot}({current:r,keepCurrentSnapshot:l,refScopedSnapshot:s}),o.appName&&(u.appName=o.appName),u}({current:i,sessionName:n,device:o,record:e,refScopedSnapshot:(r=t,r.flags?.snapshotScope?.trim().startsWith("@")===!0)}))}},policy:uv()})}function uL(e){let t=e.sessionStore.get(e.sessionName);t&&e.sessionStore.recordAction(t,{command:e.req.command,positionals:e.req.positionals??[],flags:e.req.flags??{},result:e.result})}async function u$(e){let{device:t,node:n,flags:r,appBundleId:a,traceOutPath:i,surface:o,contextFromFlags:s}=e,l=eR(n),d=lB(n.rect);if(!d)return l;try{let e=await oT(t,"read",[String(d.x),String(d.y)],void 0,{...s(r,a,i),surface:o}),u=e&&"object"==typeof e?e:void 0,c="string"==typeof u?.text?u.text:"";if(c.trim())return c;return eI({level:"warn",phase:"interaction_read_fallback",data:{reason:"empty_backend_text",nodeRef:n.ref,surface:o,platform:t.platform}}),l}catch(e){return eI({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}}let uF=[["snapshotDepth","--depth"],["snapshotScope","--scope"],["snapshotRaw","--raw"]];function uU(e,t){let n=function(e){if(!e)return[];let t=[];for(let[n,r]of uF)void 0!==e[n]&&t.push(r);return t}(t);return 0===n.length?null:se("INVALID_ARGS",`${e} @ref does not support ${n.join(", ")}.`)}async function uG(e,t){let n=await uV(e);if(n)throw new y("COMMAND_FAILED",`press ${t} left ${e.appBundleId} and foregrounded ${n.foregroundPackage}. The tap likely escaped the app.`,n)}async function uV(e){var t;if("android"!==e.device.platform||!e.appBundleId)return null;let n=await ee(e.device),r=n.package?.trim();return r&&r!==e.appBundleId&&("com.android.settings"===(t=r)||"com.android.systemui"===t||"com.google.android.permissioncontroller"===t||t.includes("launcher"))?{expectedPackage:e.appBundleId,foregroundPackage:r,activity:n.activity,hint:"com.google.android.permissioncontroller"===r?"Dismiss or allow the permission prompt, then retry the smoke assertion.":"Use screenshot as visual truth, then take a fresh snapshot -i before retrying."}:null}function uB(e){return"COMMAND_FAILED"===e.code&&"string"==typeof e.details?.expectedPackage&&"string"==typeof e.details?.foregroundPackage}function uj(e,t,n,r){let a=e.get(t);a&&e.recordAction(a,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function uq(e){let t=e.target;return t&&"object"==typeof t?"ref"===t.kind&&"string"==typeof t.ref?{kind:"ref",ref:t.ref}:"selector"===t.kind&&"string"==typeof t.selector?{kind:"selector",selector:t.selector}:void 0:void 0}function uX(e){return e.startsWith("@")?e.slice(1):e}async function uH(e){var t;let{req:n}=e;if("find"!==n.command)return null;let r=n.positionals??[];if(0===r.length)return se("INVALID_ARGS","find requires a locator or text");let a=eX(r);if(!a.query)return se("INVALID_ARGS","find requires a value");if(n.flags?.findFirst&&n.flags?.findLast)return se("INVALID_ARGS","find accepts only one of --first or --last");let i=a.action;if("exists"!==(t=i)&&"wait"!==t&&"get_text"!==t&&"get_attrs"!==t)return null;let o=await uJ(e,{requireSession:!1,capability:"find"});return o.ok?await u0(async()=>{let t=await o.runtime.selectors.find({session:e.sessionName,requestId:n.meta?.requestId,locator:a.locator,query:a.query,action:i,timeoutMs:a.timeoutMs});return uj(e.sessionStore,e.sessionName,n,function(e,t){if("exists"===t)return{found:!0};if("wait"===t)return{found:!0,waitedMs:e.waitedMs};let n="string"==typeof e.ref?e.ref:void 0;return"get_attrs"===t?{ref:n,action:"get attrs"}:{ref:n,action:"get text",text:"string"==typeof e.text?e.text:""}}(t,i)),"found"===t.kind?{found:!0,..."number"==typeof t.waitedMs?{waitedMs:t.waitedMs}:{}}:{..."string"==typeof t.ref?{ref:t.ref}:{},..."string"==typeof t.text?{text:t.text}:{},...t.node&&"object"==typeof t.node?{node:t.node}:{}}}):o.response}async function uz(e){let{req:t}=e;if("get"!==t.command)return null;let n=t.positionals?.[0];if("text"!==n&&"attrs"!==n)return se("INVALID_ARGS","get only supports text or attrs");let r=await uJ(e,{requireSession:!0,capability:"get"});if(!r.ok)return r.response;let a=function(e){let t=e.positionals?.[1]??"";if(t.startsWith("@"))return{ok:!0,target:{kind:"ref",ref:t,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(" ").trim():""}};let n=e.positionals?.slice(1).join(" ").trim()??"";return n?{ok:!0,target:{kind:"selector",selector:n}}:{ok:!1,response:se("INVALID_ARGS","get requires @ref or selector expression")}}(t);if(!a.ok)return a.response;if("ref"===a.target.kind){let e=uU("get",t.flags);if(e)return e}return await u0(async()=>{let i,o=await r.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:n,target:a.target});return uj(e.sessionStore,e.sessionName,t,function(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=uq(e),a=r?.kind==="ref"?uX(r.ref):void 0,i=r?.kind==="selector"?r.selector:void 0,o={...a?{ref:a}:{},...i?{selector:i}:{},...n?{selectorChain:n}:{}};if("attrs"===t)return o;let s="string"==typeof e.text?e.text:"";return{...o,text:s,refLabel:function(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}(s)}}(o,n)),i=uq(o),{...i?.kind==="ref"?{ref:uX(i.ref)}:{},...i?.kind==="selector"?{selector:i.selector}:{},..."string"==typeof o.text?{text:o.text}:{},...o.node&&"object"==typeof o.node?{node:o.node}:{}}})}async function uK(e){let{req:t}=e;if("is"!==t.command)return null;let n=(t.positionals?.[0]??"").toLowerCase();if(!lS(n))return se("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text");let{split:r}=eP(t.positionals??[]);if(!r)return se("INVALID_ARGS","is requires a selector expression");let a=r.rest.join(" ").trim();if("text"===n&&!a)return se("INVALID_ARGS","is text requires expected text value");if("text"!==n&&r.rest.length>0)return se("INVALID_ARGS",`is ${n} does not accept trailing values`);let i=await uJ(e,{requireSession:!0,capability:"is"});if(!i.ok)return i.response;let o=await u0(async()=>{let o=await i.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:n,selector:r.selectorExpression,expectedText:a});return uj(e.sessionStore,e.sessionName,t,o),function(e){let{selectorChain:t,...n}=e;return n}(o)});return await u1(e,o,`is ${n}`)}async function uY(e){let{req:t,sessionName:n,sessionStore:r}=e,a=sc(t.positionals??[]);if(!a)return se("INVALID_ARGS","wait requires a duration or text");let{session:i,device:o}=await sp(r,n,t.flags);if("sleep"!==a.kind&&!o1("wait",o))return se("UNSUPPORTED_OPERATION","wait is not supported on this device");let s=async()=>{let s=uW({...e,session:i,device:o}),l=await u0(async()=>{let e=await s.selectors.wait({session:n,requestId:t.meta?.requestId,target:function(e,t){if("sleep"===e.kind)return{kind:"sleep",durationMs:e.durationMs};if("selector"===e.kind)return{kind:"selector",selector:e.selectorExpression,timeoutMs:e.timeoutMs};if("ref"===e.kind){if(!t?.snapshot)throw new y("INVALID_ARGS","Ref wait requires an existing snapshot in session.");return{kind:"ref",ref:e.rawRef,timeoutMs:e.timeoutMs}}if(!e.text)throw new y("INVALID_ARGS","wait requires text");return{kind:"text",text:e.text,timeoutMs:e.timeoutMs}}(a,i)});return uj(r,n,t,e),{waitedMs:e.waitedMs,..."string"==typeof e.text?{text:e.text}:{},..."string"==typeof e.selector?{selector:e.selector}:{}}});return await u1(e,l,"wait")};return"sleep"===a.kind?await s():await sf(i,o,s)}function uW(e){return uy({backend:function(e){let t,{req:n,session:r,device:a,logPath:i,sessionName:o,sessionStore:s}=e,l=0;return{platform:a.platform,captureSnapshot:async(e,d)=>{var u;let c,p={...n.flags,...(u=d,c={},u?.interactiveOnly!==void 0&&(c.snapshotInteractiveOnly=u.interactiveOnly),u?.compact!==void 0&&(c.snapshotCompact=u.compact),u?.scope!==void 0&&(c.snapshotScope=u.scope),u?.depth!==void 0&&(c.snapshotDepth=u.depth),u?.raw!==void 0&&(c.snapshotRaw=u.raw),c)},f=d?.scope??n.flags?.snapshotScope,h=Date.now();if(t&&h-l<750&&!si(r))return t;let m=await uA({device:a,session:r,flags:p,outPath:n.flags?.out,logPath:i??"",snapshotScope:f});return r&&(sd(r,m.snapshot),s.set(o,r)),l=h,t={snapshot:m.snapshot}},readText:async(t,o)=>({text:await u$({device:a,node:o,flags:n.flags,appBundleId:r?.appBundleId,traceOutPath:r?.trace?.outPath,surface:r?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>o2(i??"",e,t,n))})}),findText:async(t,n)=>({found:await uZ(e,n)})}}(e),artifacts:uI("selector commands",{plural:!0}),sessions:{get:t=>t===e.sessionName?function(e){if(e)return{name:e.name,appName:e.appName,appBundleId:e.appBundleId,snapshot:e.snapshot,metadata:{surface:e.surface}}}(e.session):void 0,set:t=>{e.session&&t.snapshot&&(sd(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}},policy:uv()})}async function uJ(e,t){let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:se("SESSION_NOT_FOUND","No active session. Run open first.")};let r=n?.device??await oD(e.req.flags??{});return(n||await o4(r),o1(t.capability,r))?{ok:!0,runtime:uW({...e,session:n,device:r})}:{ok:!1,response:se("UNSUPPORTED_OPERATION",`${t.capability} is not supported on this device`)}}async function uZ(e,t){let{device:n,session:r,req:a,logPath:i}=e;if("macos"===n.platform&&r?.surface&&"app"!==r.surface)return!!eT((await uQ(e)).nodes,t);if(rj(n.platform)){let e=await aE(n,{command:"findText",text:t,appBundleId:r?.appBundleId},{verbose:a.flags?.verbose,logPath:i,traceLogPath:r?.trace?.outPath,requestId:a.meta?.requestId});return e?.found===!0}return!!eT((await uQ(e)).nodes,t)}async function uQ(e){let t=await uA({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!1,snapshotCompact:!1},outPath:e.req.flags?.out,logPath:e.logPath??""});return e.session&&(sd(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session)),t.snapshot}async function u0(e){try{return{ok:!0,data:await e()}}catch(t){let e=w(t);return se(e.code,e.message,e.details)}}async function u1(e,t,n){var r;let a;if(t.ok)return t;let i=e.sessionStore.get(e.sessionName);if(!i)return t;try{a=await uV(i)}catch{return t}return a?se(t.error.code,`${n} failed because ${"com.google.android.permissioncontroller"===(r=a).foregroundPackage?`Android permission dialog is blocking ${r.expectedPackage}`:`${r.foregroundPackage} is foreground instead of ${r.expectedPackage}`}.`,{...t.error.details??{},...a,blockedBy:"android_foreground_surface",originalMessage:t.error.message}):t}let u2=new Set(["snapshot","diff","wait","alert","settings"]);async function u3(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,i=t.command;if(!u2.has(i))return null;if("snapshot"===i)return await uR({req:t,sessionName:n,logPath:r,sessionStore:a});if("diff"===i)return t.positionals?.[0]!=="snapshot"?se("INVALID_ARGS","diff currently supports only: diff snapshot"):await uP({req:t,sessionName:n,logPath:r,sessionStore:a});if("wait"===i)return await uY({req:t,sessionName:n,logPath:r,sessionStore:a});if("alert"===i){let{session:e,device:i}=await sp(a,n,t.flags);return await sf(e,i,async()=>await sm({req:t,logPath:r,sessionStore:a,session:e,device:i}))}if("settings"===i){let e,i,o,s=(e=t.positionals?.[0]?.toLowerCase(),i=t.positionals?.[1]?.toLowerCase(),o=t.positionals?.[2]?.toLowerCase(),e&&i&&("permission"!==e||o)?{ok:!0,parsed:{setting:e,state:i,permissionTarget:o}}:se("INVALID_ARGS",t7));if(!s.ok)return s;let{session:l,device:d}=await sp(a,n,t.flags);return await sf(l,d,async()=>await sg({req:t,logPath:r,sessionStore:a,session:l,device:d,parsed:s.parsed}))}return null}export{closeAndroidApp,ensureAdb,getAndroidAppState,inferAndroidAppName,installAndroidApp,installAndroidInstallablePathAndResolvePackageName,listAndroidApps,openAndroidApp,openAndroidDevice,reinstallAndroidApp,resolveAndroidApp}from"./6953.js";export{np as IOS_DEVICECTL_DEFAULT_HINT,r4 as IOS_RUNNER_CONTAINER_BUNDLE_IDS,nn as IOS_SIMCTL_LIST_TIMEOUT_MS,st as SESSION_SURFACES,t9 as SETTINGS_USAGE_OVERRIDE,ax as abortAllIosRunnerSessions,th as appSwitcherAndroid,uG as assertAndroidPressStayedInApp,tc as backAndroid,eQ as buildMobileSnapshotPresentation,ez as buildScrollGesturePlan,nh as buildSimctlArgs,nm as buildSimctlArgsForDevice,ld as buildSnapshotDisplayLines,uM as buildSnapshotState,i6 as buttonTag,uA as captureSnapshot,ux as captureSnapshotData,rc as clearRequestCanceled,ie as closeIosApp,o2 as context_contextFromFlags,uy as createAgentDevice,rh as createRequestCanceledError,uI as createUnsupportedArtifactAdapter,sy as decodePng,tO as dismissAndroidKeyboard,oT as dispatchCommand,uH as dispatchFindReadOnlyViaRuntime,uz as dispatchGetViaRuntime,uK as dispatchIsViaRuntime,eZ as displayNodeLabel,o4 as ensureDeviceReady,se as errorResponse,tb as fillAndroid,ob as findBootableIosSimulator,ty as focusAndroid,lu as formatSnapshotLine,si as getActiveAndroidSnapshotFreshness,tE as getAndroidKeyboardState,tx as getAndroidScreenSize,i8 as getClickButtonValidationError,rf as getRequestSignal,ab as getRunnerSessionSnapshot,u3 as handleSnapshotCommands,tp as homeAndroid,ir as installIosApp,ii as installIosInstallablePath,uB as isAndroidEscapeError,rj as isApplePlatform,o1 as isCommandSupportedOnDevice,ss as isNavigationSensitiveAction,rp as isRequestCanceled,oS as listAppleDevices,iu as listIosApps,nu as listIosDeviceApps,nc as listIosDeviceProcesses,uv as localCommandPolicy,tm as longPressAndroid,sa as markAndroidSnapshotFreshness,ru as markRequestCanceled,rq as matchesPlatformSelector,rB as normalizePlatformSelector,a9 as openIosApp,a7 as openIosDevice,oi as parseDeviceRotation,sn as parseSessionSurface,sc as parseWaitArgs,nS as parseXmlDocumentSync,nM as prepareIosInstallArtifact,td as pressAndroid,tz as pushAndroidNotification,il as pushIosNotification,tC as readAndroidClipboardText,tM as readAndroidTextAtPoint,nk as readInfoPlistString,io as readIosClipboardText,u$ as readTextForNode,uU as refSnapshotFlagGuardResponse,rd as registerRequestAbort,ia as reinstallIosApp,rX as resolveAppleSimulatorSetPathForSelector,i4 as resolveClickButton,nH as resolveFrontmostMacOsApp,a6 as resolveIosApp,nf as resolveIosDevicectlHint,on as resolvePayloadInput,rl as resolveRequestTrackingId,oD as resolveTargetDevice,tf as rotateAndroid,aE as runIosRunnerCommand,nY as runMacOsAlertAction,tY as screenshotAndroid,aq as screenshotIos,tA as scrollAndroid,tG as setAndroidSetting,id as setIosSetting,sd as setSessionSnapshot,nI as shutdownSimulator,nv as ensureBootedSimulator,e9 as snapshotAndroid,aS as stopAllIosRunnerSessions,aA as stopIosRunnerSession,tu as swipeAndroid,tw as typeAndroid,oO as withDeviceInventoryProvider,rV as withKeyedLock,oC as withTargetDeviceResolutionScope,tR as writeAndroidClipboardText,is as writeIosClipboardText};