agent-device 0.14.6 → 0.14.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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,{hostname as o}from"node:os";import s from"node:path";import l from"node:net";import{AsyncLocalStorage as d}from"node:async_hooks";import{fileURLToPath as u}from"node:url";import{XMLParser as c}from"fast-xml-parser";import p from"node:fs/promises";import{createHash as f}from"node:crypto";import{PNG as h}from"pngjs";import{toAppErrorCode as m,asAppError as w,normalizeError as g,AppError as y}from"./9152.js";import{runAndroidAdb as b,resolveIosSimulatorDeviceSetPath as v,dismissAndroidKeyboard as I,resolveIosDeviceDeepLinkBundleId as A,withRetry as x,Deadline as S,classifyBootFailure as N,openAndroidApp as _,isEnvTruthy as k,ensureAdb as M,closeAndroidApp as E,TIMEOUT_PROFILES as D,bootFailureHint as O,openAndroidDevice as C,writeAndroidClipboardText as R,getAndroidKeyboardState as P,listAndroidDevices as T,getAndroidAppState as L,retryWithPolicy as $,resolveAndroidSerialAllowlist as F,createAppResolutionCache as U,isDeepLinkTarget as G,isClipboardShellUnsupported as V,readAndroidClipboardText as B}from"./8809.js";import{runCmdBackground as j,runCmdStreaming as q,runCmdSync as X,runCmd as H,resolveExecutableOverridePath as K,whichCmd as z}from"./9818.js";import{sleep as Y,resolveTimeoutMs as W,resolveTimeoutSeconds as J}from"./4829.js";import{isProcessGroupAlive as Z,isProcessAlive as Q,readProcessStartTime as ee}from"./8656.js";import{withDiagnosticTimer as et,getDiagnosticsMeta as en,emitDiagnostic as er}from"./7599.js";import{findNodeByRef as ea,normalizeRef as ei,centerOfRect as eo,attachRefs as es}from"./4057.js";import{parseUiHierarchy as el,ensureAndroidSnapshotHelper as ed,parseUiHierarchyTree as eu,captureAndroidSnapshotWithHelper as ec,isScrollableNodeLike as ep,androidUiNodes as ef,parseAndroidSnapshotHelperManifest as eh,forgetAndroidSnapshotHelperInstall as em,isScrollableType as ew,buildUiHierarchySnapshot as eg}from"./221.js";import{readVersion as ey,findProjectRoot as eb}from"./9671.js";import{resolveAndroidAdbProvider as ev,resolveAndroidAdbExecutor as eI}from"./9639.js";import{materializeInstallablePath as eA,isTrustedInstallSourceUrl as ex}from"./989.js";import{SETTINGS_INVALID_ARGS_MESSAGE as eS,getUnsupportedMacOsSettingMessage as eN,isMacOsSettingSupported as e_}from"./7462.js";import{withSuccessText as ek,successText as eM}from"./180.js";import{splitSelectorFromArgs as eE,trimText as eD,extractNodeText as eO,tryParseSelectorChain as eC,parseSelectorChain as eR,isNodeVisible as eP,isNodeEditable as eT,pruneGroupNodes as eL,buildTextPreview as e$,findNearestHittableAncestor as eF,buildSelectorChainForNode as eU,extractNodeReadText as eG,splitIsSelectorArgs as eV,findNodeByLabel as eB,resolveRefLabel as ej,describeTextSurface as eq,extractReadableText as eX,findSelectorChainMatch as eH,resolveSelectorChain as eK,normalizeType as ez,formatSelectorFailure as eY,isFillableType as eW}from"./940.js";import{findBestMatchesByLocator as eJ,parseFindArgs as eZ}from"./7556.js";import"./7847.js";var eQ={};t.r(eQ),t.d(eQ,{TM:()=>a8,ensureBootedSimulator:()=>rz,installIosApp:()=>a9,installIosInstallablePath:()=>ie,listIosApps:()=>io,L5:()=>a5,IJ:()=>a4,TJ:()=>ia,J7:()=>it,reinstallIosApp:()=>a7,resolveIosApp:()=>a3,kc:()=>aG,Cm:()=>ii,ap:()=>ir});let e0=new Set,e1=new Map,e2="request_canceled",e3="request canceled";function e5(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 e4(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++}}(e1);let t=new AbortController;e1.set(e,t),e0.has(e)&&t.abort()}function e8(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++}}(e0),e0.add(e),e1.get(e)?.abort())}function e6(e){e&&(e0.delete(e),e1.delete(e))}function e9(e){return!!e&&e0.has(e)}function e7(e){if(e)return e1.get(e)?.signal}function te(){return new y("COMMAND_FAILED",e3,{reason:e2})}function tt(e){return e instanceof y&&"COMMAND_FAILED"===e.code&&(e.details?.reason===e2||e.message===e3)}function tn(e,t={}){let n=v(t.simulatorSetPath);return n?["simctl","--set",n,...e]:["simctl",...e]}function tr(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:tn(t,{simulatorSetPath:e.simulatorSetPath})}function ta(e){return!(e instanceof y)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function ti(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:N({error:a,message:i,context:{platform:"ios",phase:"connect"}}),hint:O("IOS_RUNNER_CONNECT_TIMEOUT")})}async function to(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=N({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}
2
+ ${t}
3
+ ${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.":O("IOS_RUNNER_CONNECT_TIMEOUT"))})}function ts(e){if(e9(e))throw te()}let tl=W(process.env.AGENT_DEVICE_RUNNER_STARTUP_TIMEOUT_MS,45e3,5e3),td=W(process.env.AGENT_DEVICE_RUNNER_COMMAND_TIMEOUT_MS,45e3,1e3),tu=W(process.env.AGENT_DEVICE_RUNNER_CONNECT_ATTEMPT_INTERVAL_MS,250,50),tc=W(process.env.AGENT_DEVICE_RUNNER_CONNECT_RETRY_BASE_DELAY_MS,300,10),tp=W(process.env.AGENT_DEVICE_RUNNER_CONNECT_RETRY_MAX_DELAY_MS,2e3,10),tf=W(process.env.AGENT_DEVICE_RUNNER_CONNECT_REQUEST_TIMEOUT_MS,2e4,250),th=W(process.env.AGENT_DEVICE_IOS_DEVICE_INFO_TIMEOUT_MS,1e4,500),tm=J(process.env.AGENT_DEVICE_RUNNER_DESTINATION_TIMEOUT_SECONDS,20,5),tw=new Map;async function tg(e,t,n,r,a=tl,i,o){let s,l=S.fromTimeoutMs(a),d=async(n,r=!1)=>{var a,i,o;let l,d=await tb({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/tu));try{return await $(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 to({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 ty(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,tw.delete(r))}});if(f)return f;if("device"===e.kind&&l){var h;h=e.id,tw.delete(h),u=(await d(s?.remainingMs(),!0)).endpoints;let r=await ty(u,{command:n,port:t,timeoutMs:a,signal:o,attemptDeadline:s,onError:(e,t)=>{c=t}});if(r)return r}if(o?.aborted)throw te();throw new y("COMMAND_FAILED","Runner endpoint probe failed",{port:t,endpoints:u,lastError:c?String(c):void 0})},{maxAttempts:p,baseDelayMs:tc,maxDelayMs:tp,jitter:.2,shouldRetry:ta},{deadline:l,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||tt(e))throw te();c||(c=e)}if(o?.aborted)throw te();if("simulator"===e.kind){let a=l.remainingMs();if(a<=0)throw ti({port:t,endpoints:u,logPath:r,lastError:c});let i=await tA(e,t,n,a,o);return new Response(i.body,{status:i.status})}throw ti({port:t,endpoints:u,logPath:r,lastError:c})}async function ty(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 tv(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)},Math.min(tf,e),i)}catch(e){if(i?.aborted||tt(e))throw te();s(t,e)}return null}async function tb(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=tw.get(t))?e.expiresAt<=Date.now()?(tw.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 tI(a.id,i);return l(d),d&&(n=a.id,r=d,tw.set(n,{ip:r,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function tv(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 tI(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(th,t)):th,a=s.join(i.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),i=await H("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{tk(a)}}async function tA(e,t,n,r,a){let i=JSON.stringify(n),o=tr(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 H("xcrun",o,{allowFailure:!0,timeoutMs:r,signal:a}),l=s.stdout;if(0!==s.exitCode){let e=N({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:O(e)})}return{status:200,body:l}}async function tx(){return await new Promise((e,t)=>{let n=l.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 tS(e,t,n,r){t&&t_(t,e),n&&t_(n,e),r&&process.stderr.write(e)}let tN=new Map;function t_(e,t){let r=(tN.get(e)??Promise.resolve()).catch(()=>{}).then(()=>n.promises.appendFile(e,t)).catch(()=>{}).finally(()=>{tN.get(e)===r&&tN.delete(e)});tN.set(e,r)}function tk(e){try{n.existsSync(e)&&n.unlinkSync(e)}catch{}}let tM=new d;async function tE(e,t,n){let r=tM.getStore()??[];if(r.some(n=>n.locks===e&&n.key===t))return await n();let a=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>tM.run([...r,{locks:e,key:t}],n));return e.set(t,a),a.finally(()=>{e.get(t)===a&&e.delete(t)})}function tD(e){return e}function tO(e){return"apple"===e||"ios"===e||"macos"===e}function tC(e,t){return!t||("apple"===t?tO(e):e===t)}function tR(e){let{simulatorSetPath:t,platform:n,target:r}=e;if(t&&"macos"!==n&&"desktop"!==r)return t}async function tP(e,t,n={}){let r=e,a=e=>e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim();if(t.platform&&(r=r.filter(e=>tC(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&&tO(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:
4
+ 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 tT=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function tL(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!==X("codesign",["--verify","--deep","--strict",e],{allowFailure:!0}).exitCode){await H("codesign",["--remove-signature",e],{allowFailure:!0});try{await H("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 t$=null;function tF(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:tG(a)??tG(r["#text"]),children:e(a)});return n}((t$??=new c({ignoreAttributes:!1,attributeNamePrefix:"",preserveOrder:!0,trimValues:!0,parseTagValue:!1})).parse(e))}function tU(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)}tU(n.children,t)}}function tG(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}let tV="XCTestDevices",tB=".agent-device-backup",tj=".agent-device-xctestdevices-backup-",tq=s.join(i.homedir(),".agent-device","ios-runner"),tX=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]),tH=new Map,tK=new Set;function tz(e){return e?.trim()??""}function tY(e=process.env){return tz(e.AGENT_DEVICE_IOS_BUNDLE_ID)||tz(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function tW(e=process.env){let t=tz(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${tY(e)}.uitests`}let tJ=function(e=process.env){let t=tY(e),n=tW(e);return Array.from(new Set([tz(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${n}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function tZ(e=i.homedir()){return s.join(e,"Library","Developer","XCTestDevices")}async function tQ(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=v(e.simulatorSetPath);if(!r)return null;let a=s.resolve(r),o=s.resolve(t.xctestDeviceSetPath??tZ()),l=s.resolve(t.backupPath??function(e=tZ()){return`${e}${tB}`}(o)),d=s.resolve(t.lockDirPath??function(e=i.homedir()){return s.join(e,".agent-device","xctest-device-set.lock")}()),u=t.ownerStartTime??ee(process.pid),c=await t2({lockDirPath:d,owner:{pid:t.ownerPid??process.pid,startTime:u,acquiredAtMs:t.nowMs??Date.now()}});try{if(t0({xctestDeviceSetPath:o,backupPath:l}),function(e,t){if(s.resolve(e)===s.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=s.dirname(r),i=s.join(a,`${tV}.agent-device-link-${process.pid}-${Date.now()}`);n.mkdirSync(a,{recursive:!0});try{n.symlinkSync(t,i,"dir"),n.renameSync(i,r)}catch(e){throw n.existsSync(i)&&t1(i),e}}({requestedSetPath:a,xctestDeviceSetPath:o})}catch(e){throw t0({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{t0({xctestDeviceSetPath:o,backupPath:l})}finally{await c()}}}}}function t0(e){let{xctestDeviceSetPath:t,backupPath:r}=e,a=[r,...function(e){let t=s.dirname(e),r=s.basename(e).replace(tB,""),a=r===tV?tj:`${r}${tj}`;try{return n.readdirSync(t).filter(e=>e.startsWith(a)).sort().map(e=>s.join(t,e))}catch{return[]}}(r)],i=a.find(e=>n.existsSync(e)),o=n.existsSync(t)&&n.lstatSync(t).isSymbolicLink();if(i){if(o&&t1(t),n.existsSync(t))if(!o)return void er({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:i}});else i!==r?n.rmSync(i,{recursive:!0,force:!0}):n.rmSync(r,{recursive:!0,force:!0});else n.mkdirSync(s.dirname(t),{recursive:!0}),n.renameSync(i,t);for(let e of a)e!==i&&n.existsSync(e)&&n.rmSync(e,{recursive:!0,force:!0});return}o&&(er({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),t1(t))}function t1(e){!n.existsSync(e)||n.lstatSync(e).isSymbolicLink()&&n.unlinkSync(e)}async function t2(e){let{lockDirPath:t,owner:r}=e,a=s.join(t,"owner.json"),i=Date.now()+3e4;for(n.mkdirSync(s.dirname(t),{recursive:!0});Date.now()<i;)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)&&Q(i.pid)&&(!i.startTime||ee(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 Y(100)}throw new y("COMMAND_FAILED","Timed out waiting for XCTest device set lock",{lockDirPath:t})}async function t3(e,t){var r;let a,i=(r=e,(a=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim())?s.resolve(a):"macos"===r.platform?s.join(tq,"derived","macos"):"simulator"===r.kind?s.join(tq,"derived"):s.join(tq,"derived",r.kind)),o=function(){let e=s.dirname(u(import.meta.url)),t=e;for(let e=0;e<6;e+=1){let e=s.join(t,"package.json");if(n.existsSync(e))return t;t=s.dirname(t)}return e}();return await tE(tH,i,async()=>{k(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)&&(ni("clean","forced_clean",{derived:i}),na(i),t5(i));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:i,projectRoot:o,findXctestrun:t=>t8(t,e),xctestrunReferencesProjectRoot:t9,resolveExistingXctestrunProductPaths:no});if("reuse_ready"!==r.reason&&ni("rebuild",r.reason,{derived:i,xctestrunPath:r.xctestrunPath}),"reuse_ready"===r.reason)try{return await tL(e,r.productPaths,r.xctestrunPath),ni("reuse","reuse_ready",{derived:i,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&&tT.has(t)}(e))throw e;ni("rebuild","repair_failed",{derived:i,xctestrunPath:r.xctestrunPath})}r.xctestrunPath&&(na(i),t5(i));let a=s.join(o,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!n.existsSync(a))throw new y("COMMAND_FAILED","iOS runner project not found",{projectPath:a});await ne(e,a,i,t);let l=t8(i,e);if(!l)throw new y("COMMAND_FAILED","Failed to locate .xctestrun after build");let d=no(l);if(!d)throw new y("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:l});return await tL(e,d,l),ni("build","built_new",{derived:i,xctestrunPath:l}),l})}function t5(e){try{if(!n.existsSync(e))return;if("derived"!==s.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,t4.has(t)&&n.rmSync(s.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let t4=new Set(["Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function t8(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 i=s.join(e,t.name);if(t.isDirectory()){a.push(i);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=n.statSync(i);r.push({path:i,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,n)=>{if(t){let r=t6(n.path,t)-t6(e.path,t);if(0!==r)return r}return n.mtimeMs-e.mtimeMs||e.path.localeCompare(n.path)}),r[0]?.path??null)}function t6(e,t){var n;let r=0,a=e.toLowerCase();s.basename(a).startsWith("agentdevicerunner.env.")&&(r-=1e3),a.includes(`${s.sep}macos${s.sep}`)&&(r-=5e3);let i="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 i.preferred.length>0&&(i.preferred.some(e=>a.includes(e))?r+=2e3:r-=500),i.disallowed.some(e=>a.includes(e))&&(r-=2500),r}function t9(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 t7(e,t,r){let a,i=s.dirname(e),o=r.replace(/[^a-zA-Z0-9._-]/g,"_"),l=s.join(i,`AgentDeviceRunner.env.${o}.json`),d=s.join(i,`AgentDeviceRunner.env.${o}.xctestrun`),u=await H("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 H("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 ne(e,t,n,r){let a=function(e=process.env){let t=tY(e),n=tW(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 tQ(e);try{var l;let s;await q("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",nr(e),"1","-destination",(l=e,s=nt(l),"macOS"===s?`platform=macOS,arch=${nn()}`:"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=>{tK.add(e),e.on("close",()=>{tK.delete(e)})},onStdoutChunk:e=>{tS(e,r.logPath,r.traceLogPath,r.verbose)},onStderrChunk:e=>{tS(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}
5
+ ${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 nt(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 nn(){return"arm64"===process.arch?"arm64":"x86_64"}function nr(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function na(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()&&!function(e=process.env){return k(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 ni(e,t,n){er({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...n}})}function no(e){let t=function(e){let t=function(e){try{let t=X("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=tF(r),t=new Set,tU(a,(e,n)=>{if(tX.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=s.dirname(e),a=new Set,i=new Set,o=[];for(let e of t){if(e.startsWith("__TESTROOT__/")){let t=e.slice(13),o=s.join(r,t);if(!n.existsSync(o))return null;a.add(o);let l=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(t);l&&i.add(s.join(r,l));continue}e.startsWith("__TESTHOST__/")&&o.push(e.slice(13))}for(let e of o){let t=Array.from(i).find(t=>n.existsSync(s.join(t,e)));if(!t)return null;a.add(s.join(t,e))}return Array.from(a)}let ns=new Map,nl=new Map;async function nd(e,t){return await tE(nl,e.id,async()=>{var n;let r,a,i=ns.get(e.id);if(i){if(ng(i.child.pid))return i;await nf(e.id,i)}await ("simulator"!==(n=e).kind?Promise.resolve():nb(n)),await nu(e);let o=await t3(e,t),s=await tx(),{xctestrunPath:l,jsonPath:d}=await t7(o,{AGENT_DEVICE_RUNNER_PORT:String(s)},`session-${e.id}-${s}`),u=await tQ(e);try{let t;({child:r,wait:a}=j("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",nr(e),"1","-destination-timeout",String(tm),"-xctestrun",l,"-destination",(t=nt(e),"macOS"===t?`platform=macOS,arch=${nn()}`:"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=>{tS(e,t.logPath,t.traceLogPath,t.verbose)}),r.stderr?.on("data",e=>{tS(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 ns.set(e.id,c),c})}async function nu(e){if("simulator"===e.kind)for(let t of tJ){let n=await H("xcrun",tr(e,["uninstall",e.id,t]),{allowFailure:!0});if(0!==n.exitCode){let e=`${n.stdout}
6
+ ${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 nc(e){let t=ns.get(e);return t?{sessionId:t.sessionId,alive:ng(t.child.pid)}:null}async function np(e){await tE(nl,e.deviceId,async()=>{await nf(e.deviceId,e)})}async function nf(e,t){let n=t??ns.get(e);if(n){var r;try{await tg(n.device,n.port,{command:"shutdown"},void 0,15e3)}catch{await ny(n.child.pid,"SIGTERM")}try{await Promise.race([n.testPromise,new Promise(e=>setTimeout(e,1e4))])}catch{}(r=n.child.pid)&&(ng(r)||Z(r))&&await ny(n.child.pid,"SIGKILL"),tk(n.xctestrunPath),tk(n.jsonPath),await n.simulatorSetRedirect?.release(),ns.get(e)===n&&ns.delete(e)}}async function nh(e){await tE(nl,e,async()=>{await nf(e)})}async function nm(){let e=Array.from(ns.values()),t=Array.from(tK);await Promise.allSettled(e.map(async e=>{await ny(e.child.pid,"SIGINT")})),await Promise.allSettled(t.map(async e=>{await ny(e.pid,"SIGINT")})),await Promise.allSettled(e.map(async e=>{await ny(e.child.pid,"SIGTERM")})),await Promise.allSettled(t.map(async e=>{await ny(e.pid,"SIGTERM")})),await Promise.allSettled(e.map(async e=>{await ny(e.child.pid,"SIGKILL")})),await Promise.allSettled(t.map(async e=>{await ny(e.pid,"SIGKILL"),tK.delete(e)})),await Promise.allSettled(e.map(async e=>{await e.simulatorSetRedirect?.release()}))}async function nw(){await nm();let e=Array.from(ns.keys());await Promise.allSettled(e.map(async e=>{await nh(e)}));let t=Array.from(tK);await Promise.allSettled(t.map(async e=>{try{await ny(e.pid,"SIGTERM"),await ny(e.pid,"SIGKILL")}finally{tK.delete(e)}}))}function ng(e){return!!e&&Q(e)}async function ny(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 H("pkill",[`-${n}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function nb(e){await H("xcrun",tr(e,["bootstatus",e.id,"-b"]),{timeoutMs:tl})}async function nv(e,t,n,r,a,i){let o=await tg(e,t.port,n,r,a,t,i);return await nI(o,t,r)}async function nI(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 nA(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(ts(n.requestId),"interactionFrame"===(r=t.command)||"snapshot"===r||"screenshot"===r||"findText"===r||"readText"===r||"alert"===r||"uptime"===r)?x(()=>(ts(n.requestId),nx(e,t,n)),{shouldRetry:e=>{ts(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"))}}):nx(e,t,n)}async function nx(e,t,n={}){let r;ts(n.requestId);let a=e7(n.requestId);try{let i=(r=await nd(e,n)).ready?td:tl;return await nv(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")&&ta(i)&&r?.ready){ts(n.requestId),r?await np(r):await nh(e.id),r=await nd(e,n);let i=await tg(r.device,r.port,t,n.logPath,tl,void 0,a);return await nI(i,r,n.logPath)}throw o}}function nS(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 nN(e){var t;return!!e&&(!!e.password||!!(t=e.text)&&Array.from(t).every(nk))}function n_(e){if(!e)return null;let t=nN(e);return{...e,text:t?null:e.text,...t?{textRedacted:!0}:{}}}function nk(e){return"•"===e||"*"===e||"●"===e}function nM(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function nE(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 nD(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function nO(e){return new Map(e.map(e=>[e.index,e]))}function nC(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||""}function nR(e){if(0===e.length)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:a}=nP(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=nL(e,t,n);return r?n$(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=nC(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")||!!nC(e)}(e)),e,t)}}function nP(e){let t=nO(e),n=new Set,r=[];for(let a of e){if(nT(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=nF(e,n,r);if(!t?.rect)continue;let o=n$(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=nF(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 nT(e,t,n=nO(t)){var r;if(!e.rect)return!0;let a=nL(e,t,n);return!a||(r=e.rect,nD(r.x,r.x+r.width,a.x,a.x+a.width)&&nD(r.y,r.y+r.height,a.y,a.y+a.height))}function nL(e,t,n=nO(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&&ep(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=eo(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=nE(a.map(e=>e.rect).filter(e=>nM(e,n.x,n.y)));if(i)return i;let o=nE(a.map(e=>e.rect));if(o)return o;let s=nE(r.map(e=>e.rect).filter(e=>nM(e,n.x,n.y)));return s||null}(t,e.rect??{x:0,y:0,width:0,height:0})}function n$(e,t){return e.y+e.height<=t.y?"above":e.y>=t.y+t.height?"below":null}function nF(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)&&ep(r))return r;r="number"==typeof r.parentIndex?n.get(r.parentIndex):void 0}return null}function nU(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function nG(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 nV(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}async function nB(e,t={}){let n=eI(e,t.helperAdb),r=await nj(e,t,n),a=r.xml;if(!t.interactiveOnly){let i=el(a,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 nH(e,i.nodes,n),i.nodes),{...i,androidSnapshot:r.metadata}}let i=eu(a),o=eg(i,800,{...t,interactiveOnly:!1}),s=eg(i,800,t),l=await nH(e,o.nodes,n);nZ(l,o,s),0===l.size&&nZ(function(e){if(0===e.length)return new Map;let{hintedContainers:t}=nP(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}(es(o.nodes)),o,s);let{sourceNodes:d,...u}=s;return{...u,androidSnapshot:r.metadata}}async function nj(e,t,n){let r=await nq(t.helperArtifact);if(r.artifact){var a;let i=(a=e,`${a.platform}:${a.id}`);try{let a=ev(e,t.helperAdb),o=await ed({adb:n,adbProvider:a,artifact:r.artifact,deviceKey:i,installPolicy:t.helperInstallPolicy,timeoutMs:3e4}),s=await ec({adb:n,packageName:r.artifact.manifest.packageName,instrumentationRunner:r.artifact.manifest.instrumentationRunner,waitForIdleTimeoutMs:500,timeoutMs:8e3,commandTimeoutMs:13e3});return{xml:s.xml,metadata:{backend:"android-helper",helperVersion:r.artifact.manifest.version,helperApiVersion:s.metadata.helperApiVersion,installReason:o.reason,waitForIdleTimeoutMs:s.metadata.waitForIdleTimeoutMs,timeoutMs:s.metadata.timeoutMs,maxDepth:s.metadata.maxDepth,maxNodes:s.metadata.maxNodes,rootPresent:s.metadata.rootPresent,captureMode:s.metadata.captureMode,windowCount:s.metadata.windowCount,nodeCount:s.metadata.nodeCount,helperTruncated:s.metadata.truncated,elapsedMs:s.metadata.elapsedMs}}}catch(t){return em({deviceKey:i,packageName:r.artifact.manifest.packageName,versionCode:r.artifact.manifest.versionCode}),await nX(e,g(t).message,n)}}return await nX(e,r.fallbackReason,n)}async function nq(e){if(e)return{artifact:e};let t=ey(),n=s.join(eb(),"android-snapshot-helper","dist"),r=s.join(n,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await p.access(r)}catch{return{}}try{let e=eh(JSON.parse(await p.readFile(r,"utf8"))),t=s.join(n,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await p.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:g(e).message}}}async function nX(e,t,n){return{xml:await nK(e,n),metadata:{backend:"uiautomator-dump",...t?{fallbackReason:t}:{}}}}async function nH(e,t,n){if(!t.some(e=>ew(e.type)))return new Map;let r=await nJ(e,n);return r?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(ew(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=>nV(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||!ew(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=>nV(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=nU(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(!nG(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(!nG(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?nU(o):i.length>0?nU(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,r):new Map}async function nK(e,t=eI(e)){try{return await x(()=>nz(t),{shouldRetry:nW})}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 nz(e){var t,n,r;let a,i,o=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),s=nY(o.stdout,o.stderr);if(s)return s;let l="/sdcard/window_dump.xml",d=await e(["shell","uiautomator","dump",l],{allowFailure:!0,timeoutMs:8e3}),u=(t=l,n=d.stdout,r=d.stderr,a=`${n}
7
+ ${r}`,i=/dumped to:\s*(\S+)/i.exec(a),i?.[1]??t),c=await e(["shell","cat",u]),p=nY(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 nY(e,t){let n=`${e}
8
+ ${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 nW(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 nJ(e,t=eI(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),n=`${e.stdout}
9
+ ${e.stderr}`.trim();return n.length>0?n:null}catch{return null}}function nZ(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 nQ(e,t,n,r){let a=null;for(let i of[0,150,350]){i>0&&await Y(i);let o=await n1(e,t,n,r);if(a=o,o.ok)return o}return a??{ok:!1,actual:null,reason:"text_mismatch",targetInput:null,actualInput:null}}async function n0(e,t,n){var r,a,i;return r=await nK(e),a=t,i=n,n2(r,a,i).actualInput?.text??null}async function n1(e,t,n,r){var a,i,o;let s,l;return a=await nK(e),!function(e){let{targetInput:t,actualInput:n}=e;return!!t&&!!n&&n!==t&&n.inputMethodOwned&&!t.inputMethodOwned}(s=n2(a,t,n))?function(e,t){let n=e.actualInput;if(!n||!nN(n))return null;let r=n.text??null,a=Array.from(r??"").length,i=Array.from(t).length,o=null!==r&&a>0&&i>0&&a===i;return{ok:o,actual:r,reason:o?void 0:"masked_unverified",masked:!0,targetInput:e.targetInput,actualInput:n}}(s,r)??(i=s,o=r,{ok:function(e,t){if(e===t)return!0;let n=n3(e),r=n3(t);return!!n&&!!r&&(!!(n===r||n.includes(r))||r.includes(n)&&n.length>=Math.max(4,Math.floor(.8*r.length)))}(l=i.actualInput?.text??null,o),actual:l,reason:"text_mismatch",targetInput:i.targetInput,actualInput:i.actualInput}):{ok:!1,actual:s.actualInput?.text??null,reason:"ime_capture",targetInput:s.targetInput,actualInput:s.actualInput}}function n2(e,t,n){var r;let a,i={focusedEdit:null,editAtPoint:null,anyAtPoint:null};for(let r of ef(e)){let e=function(e){if(!e.rect)return null;let t=e.text??"",n=Math.max(1,e.rect.width*e.rect.height);return{text:t||null,className:e.className,resourceId:e.resourceId,packageName:e.packageName,rect:e.rect,focused:e.focused??!1,password:!0===e.password,inputMethodOwned:function(e,t){let n=(e??"").toLowerCase(),r=(t??"").toLowerCase();return!!n.includes("inputmethod")||"com.google.android.inputmethod.latin"===n||r.startsWith("com.google.android.inputmethod.latin:id/")}(e.packageName,e.resourceId),area:n,editText:function(e){let t=e.toLowerCase();return t.includes("edittext")||t.includes("textfield")}(e.className??"")}}(r);e&&function(e,t,n,r){var a,i,o;let s=(a=t.rect,i=n,o=r,i>=a.x&&i<=a.x+a.width&&o>=a.y&&o<=a.y+a.height);if(s&&t.editText&&(e.editAtPoint=n5(e.editAtPoint,t)),t.focused&&t.editText){e.focusedEdit=n5(e.focusedEdit,t);return}s&&t.text&&(e.anyAtPoint=n5(e.anyAtPoint,t))}(i,e,t,n)}return{targetInput:a=(r=i).editAtPoint??r.anyAtPoint,actualInput:(r.focusedEdit?.text?r.focusedEdit:null)??a}}function n3(e){return(e??"").replace(/\s+/g," ").trim()}function n5(e,t){return e&&e.area<t.area?e:t}async function n4(e,t,n){await b(e,["shell","input","tap",String(t),String(n)])}async function n8(e,t,n,r,a,i=250){await b(e,["shell","input","swipe",String(t),String(n),String(r),String(a),String(i)])}async function n6(e){await b(e,["shell","input","keyevent","4"])}async function n9(e){await b(e,["shell","input","keyevent","3"])}async function n7(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 b(e,["shell","settings","put","system","accelerometer_rotation","0"]),await b(e,["shell","settings","put","system","user_rotation",n])}async function re(e){await b(e,["shell","input","keyevent","187"])}async function rt(e,t,n,r=800){await b(e,["shell","input","swipe",String(t),String(n),String(t),String(n),String(r)])}async function rn(e,t,n=0){n>0&&Array.from(t).length>1?await rd(e,t,1,n):await rr(e,t)}async function rr(e,t){let n=ru(t);if(!n||"ok"!==await rc(e,t))try{let n=t.replace(/ /g,"%s");await b(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 ra(e,t,n){await n4(e,t,n)}async function ri(e,t,n,r,a=0){let i=Array.from(r).length,o=ru(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 ra(e,t,n);let s=(d=i+o.clearPadding,u=o.minClear,Math.max(u,Math.min(o.maxClear,d)));if(await rp(e,s),"input_text"===o.strategy)await rn(e,r,a);else if("clipboard_paste"===o.strategy){if("ok"!==await rc(e,r))continue}else await rd(e,r,1,a>0?a:15);let c=await nQ(e,t,n,r);if(l=c,c.ok)return;"ime_capture"===c.reason&&ro(r,c)}ro(r,l)}function ro(e,t){let n;throw new y("COMMAND_FAILED",t?.reason==="ime_capture"?"Android fill input was captured by the active keyboard instead of the app field":t?.reason==="masked_unverified"?"Android fill verification could not confirm masked text value":"Android fill verification failed",(n=function(e,t){var n;if(!t)return{expected:e,actual:null,failureReason:"text_mismatch",targetInput:null,actualInput:null};let r=!0===(n=t).masked||nN(n.targetInput)||nN(n.actualInput),a={failureReason:t.reason??"text_mismatch",targetInput:n_(t.targetInput),actualInput:n_(t.actualInput)};return r?{...a,expectedLength:Array.from(e).length,actual:null,masked:!0,actualLength:Array.from(t.actual??"").length}:{...a,expected:e,actual:t.actual}}(e,t),t?.reason==="ime_capture"&&(n.hint="The focused input belongs to the Android keyboard/IME, not the app field. Disable handwriting/stylus input or switch to a standard IME, then retry fill."),n))}async function rs(e,t,n){let r=await rl(e),a=nS({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:r.width,referenceHeight:r.height});return await b(e,["shell","input","swipe",String(a.x1),String(a.y1),String(a.x2),String(a.y2),"300"]),a}async function rl(e){let t=(await b(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 rd(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 rr(e,n),r>0&&t+a<i.length&&await Y(r)}}function ru(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 rc(e,t){let n=await b(e,["shell","cmd","clipboard","set","text",t],{allowFailure:!0});return 0!==n.exitCode?"failed":V(n.stdout,n.stderr)?"unsupported":0===(await b(e,["shell","input","keyevent","KEYCODE_PASTE"],{allowFailure:!0})).exitCode||0===(await b(e,["shell","input","keyevent","279"],{allowFailure:!0})).exitCode?"ok":"failed"}async function rp(e,t){let n=Math.max(0,t);await b(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 b(e,["shell","input","keyevent",...Array(r).fill("KEYCODE_DEL")],{allowFailure:!0})}}let rf=["camera","microphone","photos","contacts","contacts-limited","notifications","calendar","location","location-always","media-library","motion","reminders","siri"];function rh(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 rm(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: ${rf.join("|")}`)}function rw(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 rg=["window_animation_scale","transition_animation_scale","animator_duration_scale"];async function ry(e,t,n,r,a){switch(t.toLowerCase()){case"wifi":{let t=rv(n);await b(e,["shell","svc","wifi",t?"enable":"disable"]);return}case"airplane":{let t=rv(n);await b(e,["shell","settings","put","global","airplane_mode_on",t?"1":"0"]),await b(e,["shell","am","broadcast","-a","android.intent.action.AIRPLANE_MODE","--ez","state",t?"true":"false"]);return}case"location":{let t=rv(n);await b(e,["shell","settings","put","secure","location_mode",t?"3":"0"]);return}case"animations":{let t=rv(n)?"1":"0";for(let n of rg)await b(e,["shell","settings","put","global",n,t]);return{scale:t,keys:[...rg]}}case"appearance":{let t=await rI(e,n);await b(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 rb(e,t);return}case"permission":{if(!r)throw new y("INVALID_ARGS","permission setting requires an active app in session");let t=rh(n),i=function(e,t){let n=rm(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 rx(e,r,t,i);let o="grant"===t?"grant":"revoke";if("photos"===i.type)return void await rA(e,r,o);await b(e,["shell","pm",o,r,i.value]);return}default:throw new y("INVALID_ARGS",`Unsupported setting: ${t}`)}}async function rb(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 b(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}
10
+ ${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 rv(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 rI(e,t){let n=rw(t);if("toggle"!==n)return n;let r=await b(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}
11
+ ${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 rA(e,t,n){let r=await rS(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 b(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 rx(e,t,n,r){"grant"===n?await b(e,["shell","pm","grant",t,r.permission],{allowFailure:!0}):(await b(e,["shell","pm","revoke",t,r.permission],{allowFailure:!0}),"reset"===n&&(await b(e,["shell","pm","clear-permission-flags",t,r.permission,"user-set"],{allowFailure:!0}),await b(e,["shell","pm","clear-permission-flags",t,r.permission,"user-fixed"],{allowFailure:!0}))),await b(e,["shell","appops","set",t,r.appOps,"grant"===n?"allow":"deny"===n?"deny":"default"])}async function rS(e){let t=await b(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 rN(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 b(e,a),{action:r,extrasCount:s}}let r_=Buffer.from([137,80,78,71,13,10,26,10]);async function rk(e,t){await rM(e);try{await Y(1e3),await rD(e,t)}finally{await rE(e).catch(()=>{})}}async function rM(e){let t=t=>b(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 rE(e){await b(e,["shell","am broadcast -a com.android.systemui.demo -e command exit"],{allowFailure:!0})}async function rD(e,t){let n=await b(e,["exec-out","screencap","-p"],{binaryStdout:!0});if(!n.stdoutBuffer)throw new y("COMMAND_FAILED","Failed to capture screenshot");let r=n.stdoutBuffer.indexOf(r_);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+r_.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 rO=W(process.env.AGENT_DEVICE_IOS_BOOT_TIMEOUT_MS,D.ios_boot.totalMs,5e3),rC=W(process.env.AGENT_DEVICE_IOS_SIMCTL_LIST_TIMEOUT_MS,D.ios_boot.operationMs,1e3),rR=W(process.env.AGENT_DEVICE_IOS_APP_LAUNCH_TIMEOUT_MS,3e4,5e3),rP=W(process.env.AGENT_DEVICE_IOS_DEVICECTL_TIMEOUT_MS,2e4,1e3),rT=W(process.env.AGENT_DEVICE_IOS_SIMULATOR_FOCUS_TIMEOUT_MS,1e4,1e3),rL=W(process.env.AGENT_DEVICE_IOS_SIMULATOR_SCREENSHOT_TIMEOUT_MS,2e4,1e3),r$=W(process.env.AGENT_DEVICE_IOS_RUNNER_SCREENSHOT_COPY_TIMEOUT_MS,2e4,1e3),rF=k(process.env.AGENT_DEVICE_IOS_SIMULATOR_SCREENSHOT_RUNNER_FALLBACK);async function rU(e,t){let n=["devicectl",...e],r=await H("xcrun",n,{allowFailure:!0,timeoutMs:rP});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:rj(a,i)??rB})}async function rG(e,t){let n=s.join(i.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 H("xcrun",r,{allowFailure:!0,timeoutMs:rP});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:rj(t,n)??rB})}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 rV(e){let t=s.join(i.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 H("xcrun",n,{allowFailure:!0,timeoutMs:rP});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:rj(t,a)??rB})}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 rB="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function rj(e,t){let n=`${e}
12
+ ${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 rq(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 rX(e,t){let n=await H("xcrun",tr(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 H("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 H("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 rH(e,t){if("simulator"!==e.kind)throw new y("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function rK(){await H("open",["-a","Simulator"],{allowFailure:!0,timeoutMs:rT})}async function rz(e){let t,n;if("simulator"!==e.kind||"Booted"===await rW(e))return;let r=S.fromTimeoutMs(rO);try{await $(async({deadline:r})=>{if(r?.isExpired())throw new y("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:rO});let a=Math.max(1e3,r?.remainingMs()??rO),i=await H("xcrun",tr(e,["boot",e.id]),{allowFailure:!0,timeoutMs:a});t={stdout:String(i.stdout??""),stderr:String(i.stderr??""),exitCode:i.exitCode};let o=`${t.stdout}
13
+ ${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 H("xcrun",tr(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 rW(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=N({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=>N({error:e,stdout:n?.stdout??t?.stdout,stderr:n?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(i){let a=N({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:rO,elapsedMs:r.elapsedMs(),reason:a,hint:O(a),boot:t,bootstatus:n})}await rK()}async function rY(e){let t=tr(e,["shutdown",e.id]),n=await H("xcrun",t,{allowFailure:!0,timeoutMs:15e3});return{success:0===n.exitCode,exitCode:n.exitCode,stdout:String(n.stdout??""),stderr:String(n.stderr??"")}}async function rW(e){let t="string"==typeof e?e:e.id,n="string"==typeof e?tn(["list","devices","-j"]):tr(e,["list","devices","-j"]),r=await H("xcrun",n,{allowFailure:!0,timeoutMs:rC});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}}async function rJ(e,t){try{let n=await H("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,tU(tF(n),(e,t)=>{void 0===i&&e===r&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}async function rZ(e,t){if("url"===e.kind&&!ex(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 eA({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||ex(e.url),signal:t?.signal}),r=await r0(n.installablePath,t),a=await rQ(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 rQ(e){let t=s.join(e,"Info.plist"),[n,r,a]=await Promise.all([rJ(t,"CFBundleIdentifier"),rJ(t,"CFBundleDisplayName"),rJ(t,"CFBundleName")]);return{bundleId:n,appName:r??a}}async function r0(e,t){if(!e.toLowerCase().endsWith(".ipa"))return{installPath:e,cleanup:async()=>{}};let n=await a.mkdtemp(s.join(i.tmpdir(),"agent-device-ios-ipa-")),r=async()=>{await a.rm(n,{recursive:!0,force:!0})};try{await H("unzip",["-q",e,"-d",n]);let i=s.join(n,"Payload"),o=(await a.readdir(i,{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:s.join(i,e.name),bundleName:e.name.replace(/\.app$/i,"")}));if(1===o.length)return{installPath:o[0].installPath,cleanup:r};if(0===o.length)throw new y("INVALID_ARGS","Invalid IPA: expected at least one .app under Payload, found 0");await r1(o);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]}}(o,l);if(e)return{installPath:e.installPath,cleanup:r};throw new y("INVALID_ARGS",`Invalid IPA: found ${o.length} .app bundles under Payload and none matched "${l}". Available bundles: ${o.map(r2).join(", ")}`)}throw new y("INVALID_ARGS",`Invalid IPA: found ${o.length} .app bundles under Payload. Pass an app identifier or bundle name matching one of: ${o.map(r2).join(", ")}`)}catch(e){throw await r(),e}}async function r1(e){await Promise.all(e.map(async e=>{if(e.bundleId&&e.appName)return;let t=await rQ(e.installPath);e.bundleId=e.bundleId??t.bundleId,e.appName=e.appName??t.appName}))}function r2(e){let t=e.bundleId??e.appName;return t?`${e.bundleName}.app (${t})`:`${e.bundleName}.app`}function r3(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}let r5="agent-device-macos-helper",r4="AGENT_DEVICE_MACOS_HELPER_BIN",r8=s.join(i.homedir(),".agent-device","macos-helper","current"),r6=s.join(r8,"manifest.json"),r9=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function r7(e){let t=e.trim();if(!r9.test(t))throw new y("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function ae(){return function(e){let t=s.dirname(e);for(;;){let e=s.join(t,"macos-helper");if(r(s.join(e,"Package.swift")))return e;let n=s.dirname(t);if(n===t)break;t=n}throw new y("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(u(import.meta.url))}async function at(e){let t=await a.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=s.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await at(n):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[n]:[]}))).flat().sort()}async function an(e){let t=await at(e),n=f("sha256");for(let r of t)n.update(s.relative(e,r)),n.update("\0"),n.update(await a.readFile(r)),n.update("\0");let r=await H("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 ar(){try{let e=JSON.parse(await a.readFile(r6,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function aa(){let e=await K(process.env[r4],r4);if(e)return e;let t=ae(),n=await an(t),r=s.join(r8,r5);try{if(await ar()===n)return await a.access(r),r}catch{}let i=s.join(ae(),".build","release",r5);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await H("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await a.mkdir(r8,{recursive:!0});let o=`${r}.tmp`;return await a.copyFile(i,o),await a.rename(o,r),await a.chmod(r,493),await a.writeFile(r6,`${JSON.stringify({fingerprint:n},null,2)}
14
+ `,"utf8"),r}async function ai(e){let t=process.env[r4]?.trim();if("darwin"!==process.platform&&!t)throw new y("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");let n=await aa(),r=await H(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 ao(){return await ai(["app","frontmost"])}async function as(e){return await ai(["app","quit","--bundle-id",r7(e)])}async function al(e,t){return await ai(["permission",e,t])}async function ad(e,t={}){let n=["alert",e];return t.bundleId&&n.push("--bundle-id",r7(t.bundleId)),t.surface&&n.push("--surface",t.surface),await ai(n)}async function au(e,t={}){let n=["snapshot","--surface",e];return t.bundleId&&n.push("--bundle-id",r7(t.bundleId)),await ai(n)}async function ac(e,t,n={}){let r=["read","--x",String(e),"--y",String(t)];return n.bundleId&&r.push("--bundle-id",r7(n.bundleId)),n.surface&&r.push("--surface",n.surface),await ai(r)}async function ap(e,t,n={}){let r=["press","--x",String(e),"--y",String(t)];return n.bundleId&&r.push("--bundle-id",r7(n.bundleId)),n.surface&&r.push("--surface",n.surface),await ai(r)}async function af(e,t={}){let n=["screenshot","--out",e];return t.surface&&n.push("--surface",t.surface),t.fullscreen&&n.push("--fullscreen"),await ai(n)}let ah={settings:"com.apple.systempreferences"},am=/^[a-z0-9-]+(?:\.[a-z0-9-]+)+$/,aw={platform:"macos",deviceId:"host",variant:"all"},ag=U();function ay(e,t){let n=["-b",e];return t&&n.push(t),n}async function ab(e){for(let t of[s.join(e,"Contents","Info.plist"),s.join(e,"Info.plist")]){let[e,n,r]=await Promise.all([rJ(t,"CFBundleIdentifier"),rJ(t,"CFBundleDisplayName"),rJ(t,"CFBundleName")]);if(e||n||r)return{bundleId:e,appName:n??r}}return{}}async function av(e){let t=e.trim(),n=ah[t.toLowerCase()];if(n)return n;if(am.test(t))return t;let r=ag.get(aw,t);if(r)return r;let a=(await ak("all")).filter(e=>e.name.toLowerCase()===t.toLowerCase());if(1===a.length)return ag.set(aw,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 aI(e,t,n){let r=n?.url?.trim();if(r){if(!G(r))throw new y("INVALID_ARGS","open <app> <url> requires a valid URL target");let e=n?.appBundleId??await av(t);await H("open",ay(e,r));return}let a=t.trim();if(G(a))return void await H("open",[a]);let i=n?.appBundleId??await av(a);await H("open",ay(i))}async function aA(e,t){let n=await av(t),r=await as(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 ax(){let e=await H("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 aS(e){let t=await H("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 aN(){let e=await H("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 a_(e){let t=rw(e),n="toggle"===t?!await aN():"dark"===t,r=`tell application "System Events" to tell appearance preferences to set dark mode to ${n?"true":"false"}`,a=await H("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 ak(e="all"){let t=["/Applications","/System/Applications",s.join(i.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 H("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 r3((await Promise.all(Array.from(n).map(async e=>{let t=await ab(e).catch(()=>({})),n=t.bundleId;return n?{bundleId:n,name:t.appName??s.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),e)}let aM=["--time","9:41","--dataNetwork","wifi","--wifiMode","active","--wifiBars","3","--batteryState","charged","--batteryLevel","100"],aE={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"},aD={1:"searching",2:"failed",3:"active"},aO={0:"notSupported",1:"searching",2:"failed",3:"active"};function aC(e,t,n){return H("xcrun",tr(e,t),n)}async function aR(e,t){var n,r;let a;await aT(e),t&&await aL(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 aP(e){let t=await aC(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=aE[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=aD[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=aO[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 aT(e){await aC(e,["status_bar",e.id,"clear"])}async function aL(e,t){0!==t.length&&await aC(e,["status_bar",e.id,"override",...t])}function a$(e,t,n){er({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 aF(e,t,n){return H("xcrun",tr(e,t),n)}let aU={ensureBooted:rz,prepareStatusBarForScreenshot:async function e(e){let t=null,n=!1;try{t=await aP(e),n=!0}catch(t){a$(e,"snapshot_failed",t)}try{await aT(e),await aL(e,aM)}catch(t){a$(e,"prepare_failed",t)}return async()=>{await aR(e,n?t:null)}},captureWithRetry:aB,runnerFallbackEnabled:rF,captureWithRunner:aj,shouldFallbackToRunner:aW};async function aG(e,t,n,r){if("macos"===e.platform)return void await aj(e,t,n,r);if("simulator"===e.kind)return void await aV(e,t,n,r);try{await rU(["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;aK(e,"devicectl_screenshot",t)}await aj(e,t,n,r)}async function aV(e,t,n,r,a=aU){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=aY(l),er({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)}aK(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 aB(e,t){let n=S.fromTimeoutMs(rL);await $(async({deadline:n})=>{await aF(e,["io",e.id,"screenshot",t],{timeoutMs:Math.max(1e3,n?.remainingMs()??rL)})},{maxAttempts:5,baseDelayMs:1e3,maxDelayMs:5e3,jitter:.2,shouldRetry:e=>aW(e)},{deadline:n,phase:"ios_simulator_screenshot"})}async function aj(e,t,n,r){let i=(await nA(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 aX(e,i,t):await aq(e,i,t)}async function aq(e,t,n){let r=S.fromTimeoutMs(r$),a={exitCode:1,stdout:"",stderr:""};for(let i of tJ)if(0===(a=await H("xcrun",["devicectl","device","copy","from","--device",e.id,"--source",t,"--destination",n,"--domain-type","appDataContainer","--domain-identifier",i],{allowFailure:!0,timeoutMs:aH(r,r$,"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 aX(e,t,n){let r=S.fromTimeoutMs(r$),i="Unable to locate runner container for simulator screenshot";for(let o of tJ){let l=await aF(e,["get_app_container",e.id,o,"data"],{allowFailure:!0,timeoutMs:aH(r,r$,"runner screenshot container lookup")});if(0!==l.exitCode){let e=l.stderr.trim();e&&(i=e);continue}let d=l.stdout.trim();if(!d){i="simctl get_app_container returned empty output";continue}for(let e of function(e,t){let n=s.resolve(e),r=t.trim();if(!r)return[];let a=[],i=new Set,o=e=>{let t=s.normalize(e);i.has(t)||(i.add(t),a.push(t))},l=r.replace(/^\/+/,""),d=l.replace(/\\/g,"/");if(l&&o(s.join(n,l)),s.isAbsolute(r)&&o(s.normalize(r)),d.startsWith("tmp/"))o(s.join(n,d));else{let e=d.lastIndexOf("/tmp/");if(e>=0){let t=d.slice(e+1);o(s.join(n,t))}}let u=s.basename(r);return u&&o(s.join(n,"tmp",u)),a}(d,t))try{await a.copyFile(e,n);return}catch(e){i=e instanceof Error?e.message:String(e)}}throw new y("COMMAND_FAILED",`Failed to capture iOS screenshot: ${i}`)}function aH(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 aK(e,t,n){let r=aY(n);er({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){er({level:"warn",phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...aY(n)}})}function aY(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 aW(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 aJ={settings:"com.apple.Preferences"},aZ=U(),aQ=null;function a0(e){return{platform:"ios",deviceId:e.id,variant:e.kind}}function a1(e,t,n){return H("xcrun",tr(e,t),n)}function a2(e){return e.includes("not installed")||e.includes("not found")||e.includes("no such file")}async function a3(e,t){if("macos"===e.platform)return await av(t);let n=t.trim();if(n.includes("."))return n;let r=aJ[n.toLowerCase()];if(r)return r;let a=a0(e),i=aZ.get(a,n);if(i)return i;let o=("simulator"===e.kind?await is(e):await rG(e,"all")).filter(e=>e.name.toLowerCase()===n.toLowerCase());if(1===o.length)return aZ.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 a5(e,t,n){if("macos"===e.platform)return void await aI(e,t,n);let r=n?.url?.trim();if(r){if(!G(r))throw new y("INVALID_ARGS","open <app> <url> requires a valid URL target");if("simulator"===e.kind){await rz(e),await a1(e,["openurl",e.id,r]);return}let a=A(n?.appBundleId??await a3(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 ig(e,a,{payloadUrl:r});return}let a=t.trim();if(G(a)){if("simulator"===e.kind){await rz(e),await a1(e,["openurl",e.id,a]);return}let t=A(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 ig(e,t,{payloadUrl:a});return}let i=n?.appBundleId??await a3(e,t);"simulator"===e.kind?await iw(e,i):await ig(e,i)}async function a4(e){"macos"===e.platform||"simulator"!==e.kind||"Booted"!==await rW(e)&&await rz(e)}async function a8(e,t){if("macos"===e.platform)return void await aA(e,t);let n=await a3(e,t);if("simulator"===e.kind){await rz(e);let t=tr(e,["terminate",e.id,n]),r=await H("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 rU(["device","process","terminate","--device",e.id,n],{action:"terminate iOS app",deviceId:e.id})}async function a6(e,t){return await aZ.invalidateWhile(a0(e),async()=>{let n=await a3(e,t);if("simulator"!==e.kind){let t=["devicectl","device","uninstall","app","--device",e.id,n],r=await H("xcrun",t,{allowFailure:!0,timeoutMs:rP});if(0!==r.exitCode){let a=String(r.stdout??""),i=String(r.stderr??"");if(!a2(`${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:rj(a,i)??rB})}return{bundleId:n}}await rz(e);let r=await a1(e,["uninstall",e.id,n],{allowFailure:!0});if(0!==r.exitCode&&!a2(`${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 a9(e,t,n){let r=await rZ({kind:"path",path:t},n);try{return await ie(e,r.installablePath),{archivePath:r.archivePath,installablePath:r.installablePath,bundleId:r.bundleId,appName:r.appName,launchTarget:r.bundleId}}finally{await r.cleanup()}}async function a7(e,t,n){return await aZ.invalidateWhile(a0(e),async()=>{let{bundleId:r}=await a6(e,t);return await a9(e,n,{appIdentifierHint:t}),{bundleId:r}})}async function ie(e,t){await aZ.invalidateWhile(a0(e),async()=>{"simulator"!==e.kind?await rU(["device","install","app","--device",e.id,t],{action:"install iOS app",deviceId:e.id}):(await rz(e),await a1(e,["install",e.id,t]))})}async function it(e){if("macos"===e.platform)return await ax();rH(e,"clipboard"),await rz(e);let t=await a1(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 ir(e,t){if("macos"===e.platform)return void await aS(t);rH(e,"clipboard"),await rz(e);let n=await a1(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 ia(e,t,n){rH(e,"push"),await rz(e);let r=await a.mkdtemp(s.join(i.tmpdir(),"agent-device-ios-push-")),o=s.join(r,"payload.apns");try{await a.writeFile(o,`${JSON.stringify(n)}
22
+ `,"utf8"),await a1(e,["push",e.id,t,o])}finally{await a.rm(r,{recursive:!0,force:!0})}}async function ii(e,t,n,r,a){if("macos"===e.platform){let e=t.toLowerCase();if("appearance"===e)return void await a_(n);if("permission"===e){let e=rh(n);if("deny"===e)throw new y("INVALID_ARGS",eN("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 al(e,t)}throw new y("INVALID_ARGS",eN(t))}rH(e,"settings"),await rz(e);let i=t.toLowerCase();switch(i){case"wifi":{let t=il(n);await a1(e,["status_bar",e.id,"override","--wifiMode",t?"active":"failed"]);return}case"airplane":return void(il(n)?await a1(e,["status_bar",e.id,"override","--dataNetwork","hide","--wifiMode","failed","--wifiBars","0","--cellularMode","failed","--cellularBars","0","--operatorName",""]):await a1(e,["status_bar",e.id,"clear"]));case"location":{let t=il(n);if(!r)throw new y("INVALID_ARGS","location setting requires an active app in session");await a1(e,["privacy",e.id,t?"grant":"revoke","location",r]);return}case"faceid":case"touchid":{let t=iu[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 im(e,r,{settingName:i,label:t.label,modalityAliases:t.modalityAliases});return}case"appearance":{let t=await id(e,n);await a1(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=rh(n))?"revoke":o,i=function(e,t){let n=rm(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 ic(e,t,i,r);return}default:throw new y("INVALID_ARGS",`Unsupported setting: ${t}`)}}async function io(e,t="all"){return"macos"===e.platform?await ak(t):"simulator"===e.kind?r3(await is(e),t):await rG(e,t)}async function is(e){let t=(await a1(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 H("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 il(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 id(e,t){let n=rw(t);if("toggle"!==n)return n;let r=await a1(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 iu={faceid:{label:"Face ID",modalityAliases:["face"]},touchid:{label:"Touch ID",modalityAliases:["finger","touch"]}};async function ic(e,t,n,r){let a=await ih(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 a1(e,i);return}catch(t){if(!(o&&ip(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 a1(e,i);return}catch(e){if(!ip(e))throw e}try{await a1(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 ip(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 ih(t){let n=v(t.simulatorSetPath),r=`${process.env.PATH??""}::${n??""}`;if(aQ&&e===r)return aQ;let a=await a1(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 aQ=i,e=r,i}async function im(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=tr(e,t),r=await H("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 iw(e,t){await rz(e);let n=0,r=S.fromTimeoutMs(rR);try{await $(async({deadline:n})=>{var r;if(n?.isExpired())throw new y("COMMAND_FAILED","App launch deadline exceeded",{timeoutMs:rR});let a=(r=["launch",e.id,t],tr(e,r)),i=await H("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=>!!rq(e)&&(n+=1)<3},{deadline:r})}catch(n){if(rq(n)){var a;let r=(a=await rX(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 ig(e,t,n){let r=["device","process","launch","--device",e.id,t];n?.payloadUrl&&r.push("--payload-url",n.payloadUrl),await rU(r,{action:"launch iOS app",deviceId:e.id})}async function iy(e,t,n,r,a,i,o){if("tv"===t.target)return iI(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 ib(e,t,n,r),l=nS({direction:a,amount:i?.amount,pixels:i?.pixels,referenceWidth:s.referenceWidth,referenceHeight:s.referenceHeight});return iI(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 ib(e,t,n,r){let a=await e(t,{command:"interactionFrame",appBundleId:n.appBundleId},r),i=iv(a.x),o=iv(a.y),s=iv(a.referenceWidth),l=iv(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 iv(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function iI(e,t){var n;let{x1:r,y1:a,x2:i,y2:o}={x1:iv((n=e).x),y1:iv(n.y),x2:iv(n.x2),y2:iv(n.y2)},s=iv(e.referenceWidth),l=iv(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 iA(){return process.env.WAYLAND_DISPLAY||"wayland"===process.env.XDG_SESSION_TYPE?"wayland":"x11"}let ix=null;async function iS(){if(ix)return ix;let e=iA();if("wayland"===e){if(await z("ydotool"))return ix={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 z("xdotool"))return ix={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 iN(...e){await H("xdotool",e,{allowFailure:!1,timeoutMs:1e4})}async function i_(...e){await H("ydotool",e,{allowFailure:!1,timeoutMs:1e4})}async function ik(e,t){let{tool:n}=await iS();"xdotool"===n?await iN("mousemove","--sync",String(e),String(t)):await i_("mousemove","--absolute","-x",String(e),"-y",String(t))}async function iM(e,t){let{tool:n}=await iS();"xdotool"===n?await iN("key","--clearmodifiers",e):await i_("key",...t)}async function iE(e,t,n,r){await ik(e,t);let{tool:a}=await iS();"xdotool"===a?await iN("click",n):await i_("click",r)}async function iD(e,t){await iE(e,t,"1","0xC0")}async function iO(e,t){await iE(e,t,"3","0xC1")}async function iC(e,t){await iE(e,t,"2","0xC2")}async function iR(e,t){let{tool:n}=await iS();await ik(e,t),"xdotool"===n?await iN("click","--repeat","2","1"):(await i_("click","0xC0"),await i_("click","0xC0"))}async function iP(e,t,n=800){let{tool:r}=await iS();await ik(e,t),"xdotool"===r?(await iN("mousedown","1"),await Y(n),await iN("mouseup","1")):(await i_("click","--down","0xC0"),await Y(n),await i_("click","--up","0xC0"))}async function iT(e,t){await iD(e,t)}async function iL(e,t,n,r,a=300){let{tool:i}=await iS();await ik(e,t),"xdotool"===i?(await iN("mousedown","1"),await iN("mousemove","--sync",String(n),String(r)),await Y(a),await iN("mouseup","1")):(await i_("click","--down","0xC0"),await i_("mousemove","--absolute","-x",String(n),"-y",String(r)),await Y(a),await i_("click","--up","0xC0"))}async function i$(e,t){let{tool:n}=await iS(),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 iN("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 i_("mousemove","--wheel","-y",t)}else{let t="left"===e?String(-r):String(r);await i_("mousemove","--wheel","-x",t)}}async function iF(e,t=0){let{tool:n}=await iS();if("xdotool"===n){let n=["type"];t>0&&n.push("--delay",String(t)),n.push("--clearmodifiers","--",e),await iN(...n)}else await i_("type","--",e)}async function iU(e,t,n,r=0){await iD(e,t),await Y(100),await iM("ctrl+a",["29:1","30:1","30:0","29:0"]),await Y(50),await iF(n,r)}function iG(e){let t=null;return{resolve:async function(){if(t)return t;let n="wayland"===iA()?"wayland":"x11";for(let r of"wayland"===n?e.wayland:e.x11)if(await z(r.command))return t={tool:r.tool,display:n};throw new y("TOOL_MISSING","wayland"===n?e.waylandError:e.x11Error)},resetCache:()=>{t=null}}}let iV=iG({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 iB(e){let{tool:t}=await iV.resolve();switch(t){case"grim":await H("grim",[e]);break;case"scrot":await H("scrot",[e]);break;case"import":await H("import",["-window","root",e]);break;case"gnome-screenshot":await H("gnome-screenshot",["-f",e])}}async function ij(e){if(e.includes("://")||e.startsWith("/"))return void await H("xdg-open",[e]);if(await z(e)){H(e,[],{allowFailure:!0}).catch(t=>{er({level:"warn",phase:"linux_app_launch",data:{app:e,error:String(t)}})}),await Y(500);return}await H("xdg-open",[e],{allowFailure:!0})}async function iq(e){await z("wmctrl")?await H("wmctrl",["-c",e],{allowFailure:!0}):await H("pkill",["-x",e],{allowFailure:!0})}async function iX(){await iM("alt+Left",["56:1","105:1","105:0","56:0"])}async function iH(){await iM("super+d",["125:1","32:1","32:0","125:0"])}let iK=iG({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 iK.resolve();switch(e){case"wl-clipboard":return(await H("wl-paste",["--no-newline"],{allowFailure:!0,timeoutMs:5e3})).stdout;case"xclip":return(await H("xclip",["-selection","clipboard","-o"],{allowFailure:!0,timeoutMs:5e3})).stdout;case"xsel":return(await H("xsel",["--clipboard","--output"],{allowFailure:!0,timeoutMs:5e3})).stdout}}async function iY(e){let{tool:t}=await iK.resolve();switch(t){case"wl-clipboard":await H("wl-copy",["--",e],{allowFailure:!1,timeoutMs:5e3});break;case"xclip":await H("xclip",["-selection","clipboard"],{allowFailure:!1,timeoutMs:5e3,stdin:e});break;case"xsel":await H("xsel",["--clipboard","--input"],{allowFailure:!1,timeoutMs:5e3,stdin:e})}}iK.resetCache;let iW={"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"},iJ="atspi-dump.py",iZ=null;async function iQ(e,t={}){let r;if("linux"!==process.platform)throw new y("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await z("python3"))throw new y("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let a=t.maxNodes??1500,i=t.maxDepth??12,o=t.maxApps??24,l=[function(){if(iZ)return iZ;let e=s.dirname(u(import.meta.url));for(let t=0;t<5;t++){let r=s.join(e,"src","platforms","linux",iJ);if(n.existsSync(r))return iZ=r,r;if(0===t){let t=s.join(e,iJ);if(n.existsSync(t))return iZ=t,t}e=s.dirname(e)}throw new y("TOOL_MISSING",`Cannot find ${iJ}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(a),"--max-depth",String(i),"--max-apps",String(o)],d=await H("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=iW[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 i0(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&er({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),n=await iQ(t);return{nodes:n.nodes,truncated:n.truncated}}function i1(e){return e?.clickButton??"primary"}function i2(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 i3(e){return"primary"===e?{}:{button:e}}let i5=/^[A-Za-z0-9_.:-]{1,64}$/;function i4(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 i8=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];async function i6(e,t,n){for(let r=0;r<e;r+=1)await n(r),r<e-1&&t>0&&await Y(t)}function i9(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 i7(e){let t=i9(e,{subject:"Push payload"}),n="inline"===t.kind?t.text:await oe(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 oe(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 ot(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 on=W(process.env.AGENT_DEVICE_IOS_DEVICECTL_LIST_TIMEOUT_MS,8e3,500),or=/^(iphone|ipad|ipod|appletv)/i,oa=/\b(iphone|ipad|ipod)\b/i,oi=/^appletv/i,oo=["apple tv","appletv","tvos"],os=/^==\s*(.+?)\s*==$/,ol=/^(?<name>.+?)\s+\[(?<id>[^[\]]+)\]\s*$/;function od(e){return(e??"").trim().toLowerCase()}function ou(e){return od(e.hardwareProperties?.platform)}function oc(e){return e.includes("tvos")}function op(e){let t=od(e);return oo.some(e=>t.includes(e))}function of(e){return[e.name??"",e.deviceProperties?.name??"",e.deviceProperties?.deviceType??""]}function oh(e){return e.hardwareProperties?.productType??e.deviceProperties?.productType??""}async function om(e={}){let t,n,r=v(e.simulatorSetPath),a=e.target;try{t=await H("xcrun",tn(["list","devices","-j"],{simulatorSetPath:r}))}catch{return null}try{n=JSON.parse(t.stdout)}catch{return null}let i=ow(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 ow(e,t){let n=[];for(let[r,a]of Object.entries(e.devices))if(function(e){let t=od(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:oc(od(r))?"tv":"mobile",booted:"Booted"===e.state,...t?{simulatorSetPath:t}:{}});return n}function og(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 oy(){let e=null;try{e=s.join(i.tmpdir(),`agent-device-devicectl-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`);let t=await H("xcrun",["devicectl","list","devices","--json-output",e],{allowFailure:!0,timeoutMs:on});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=ou(e);return!!(n.includes("ios")||n.includes("tvos"))||(t=oh(e),!!or.test(t.trim())||of(e).some(op))}(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 oc(ou(e))?"tv":(t=oh(e),oi.test(t.trim())||of(e).some(op))?"tv":"mobile"}(n),booted:!0})}return t}(JSON.parse(n))}catch{return[]}finally{e&&await a.rm(e,{force:!0}).catch(()=>{})}}async function ob(){try{let e=await H("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=os.exec(e);if(a){n=a[1]?.trim()??null;continue}if("Devices"!==n)continue;let i=ol.exec(e),o=i?.groups?.id?.trim()??"",s=i?.groups?.name?.trim()??"";if(!o||!s)continue;let l=function(e){return op(e)?"tv":oa.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 ov(e={}){if("darwin"!==process.platform)throw new y("UNSUPPORTED_PLATFORM","Apple tools are only available on macOS");if(!await z("xcrun"))throw new y("TOOL_MISSING","xcrun not found in PATH");let t=v(e.simulatorSetPath),n=await H("xcrun",tn(["list","devices","-j"],{simulatorSetPath:t})),r=[];try{let e=JSON.parse(n.stdout);r=ow(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:i.hostname(),kind:"device",target:"desktop",booted:!0}),t)return r;let[a,o]=await Promise.all([oy(),ob()]);return r=og(r,a),og(r,o)}async function oI(){return"linux"!==process.platform?[]:[{platform:"linux",id:"local",name:o(),kind:"device",target:"desktop",booted:!0}]}let oA=new d,ox=new d;async function oS(e,t,n){let r,a=!!(t.udid||t.serial||t.deviceName);try{r=await tP(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 om({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 oN(e){let t=tD(e.platform),n=tR({simulatorSetPath:v(e.iosSimulatorDeviceSet),platform:t,target:e.target}),r=F(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 et("resolve_target_device",async()=>{let o=function(e){let t=oA.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 oE({...s,iosSimulatorSetPath:n,androidSerialAllowlist:r?Array.from(r).sort():void 0});if(l)return oD(a,await tP(l,s,{simulatorSetPath:n}));if("linux"===s.platform){let e=await oI();return oD(a,await tP(e,s))}if("android"===s.platform){await M();let e=await T({serialAllowlist:r});return oD(a,await tP(e,s))}if(s.platform){let e=await ov({simulatorSetPath:n});return oD(a,await oS(e,s,{simulatorSetPath:n}))}let d=[];try{d.push(...await T({serialAllowlist:r}))}catch{}try{d.push(...await ov({simulatorSetPath:n}))}catch{}try{d.push(...await oI())}catch{}return oD(a,await tP(d,s,{simulatorSetPath:n}))},i)}async function o_(e){return oA.getStore()?await e():await oA.run(new Map,e)}async function ok(e,t){return e?await ox.run(e,t):await t()}async function oM(e,t){return await ok(e,async()=>await o_(t))}async function oE(e){let t=ox.getStore();if(!t)return null;let n=await t(e);return null==n?null:n.map(e=>({...e}))}function oD(e,t){return oA.getStore()?.set(e,{...t}),t}async function oO(e,t,n,r,i){let o={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},l=function(e,t){switch(e.platform){case"android":return{open:(t,n)=>_(e,t,n?.activity),openDevice:()=>C(e),close:t=>E(e,t),tap:(t,n)=>n4(e,t,n),doubleTap:async(t,n)=>{await n4(e,t,n),await n4(e,t,n)},swipe:(t,n,r,a,i)=>n8(e,t,n,r,a,i),longPress:(t,n,r)=>rt(e,t,n,r),focus:(t,n)=>ra(e,t,n),type:(t,n)=>rn(e,t,n),fill:(t,n,r,a)=>ri(e,t,n,r,a),scroll:(t,n)=>rs(e,t,n),screenshot:t=>rk(e,t),back:t=>n6(e),home:()=>n9(e),rotate:t=>n7(e,t),appSwitcher:()=>re(e),readClipboard:()=>B(e),writeClipboard:t=>R(e,t),setSetting:(t,n,r,a)=>ry(e,t,n,r,a)};case"linux":return{open:e=>ij(e),openDevice:()=>Promise.resolve(),close:e=>iq(e),tap:(e,t)=>iD(e,t),doubleTap:(e,t)=>iR(e,t),swipe:(e,t,n,r,a)=>iL(e,t,n,r,a),longPress:(e,t,n)=>iP(e,t,n),focus:(e,t)=>iT(e,t),type:(e,t)=>iF(e,t),fill:(e,t,n,r)=>iU(e,t,n,r),scroll:(e,t)=>i$(e,t),screenshot:e=>iB(e),back:()=>iX(),home:()=>iH(),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=>iY(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 nA(e,{command:"tap",x:r,y:a,appBundleId:t.appBundleId},n),doubleTap:async(r,a)=>await nA(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 nA(e,{command:"drag",x:r,y:a,x2:i,y2:o,durationMs:s,appBundleId:t.appBundleId},n),longPress:async(r,a,i)=>await nA(e,{command:"longPress",x:r,y:a,durationMs:i,appBundleId:t.appBundleId},n),focus:async(r,a)=>await nA(e,{command:"tap",x:r,y:a,appBundleId:t.appBundleId},n),type:async(r,a)=>{await nA(e,{command:"type",text:r,delayMs:a,appBundleId:t.appBundleId},n)},fill:async(r,a,i,o)=>{let s=await nA(e,{command:"tap",x:r,y:a,appBundleId:t.appBundleId},n);return await nA(e,{command:"type",text:i,clearFirst:!0,delayMs:o,appBundleId:t.appBundleId},n),s},scroll:async(r,a)=>await iy(nA,e,t,n,r,a)}};return{open:(t,n)=>a5(e,t,{appBundleId:n?.appBundleId,url:n?.url}),openDevice:()=>a4(e),close:t=>a8(e,t),screenshot:async(t,n)=>{"macos"===e.platform&&n?.surface&&"app"!==n.surface?await af(t,{surface:n.surface,fullscreen:n.fullscreen}):await aG(e,t,n?.appBundleId,n?.fullscreen)},back:async n=>{await nA(e,{command:"system"===n?"backSystem":"backInApp",appBundleId:t.appBundleId},a)},home:async()=>{await nA(e,{command:"home",appBundleId:t.appBundleId},a)},rotate:async n=>{await nA(e,{command:"rotate",orientation:n,appBundleId:t.appBundleId},a)},appSwitcher:async()=>{await nA(e,{command:"appSwitcher",appBundleId:t.appBundleId},a)},readClipboard:()=>it(e),writeClipboard:t=>ir(e,t),setSetting:(t,n,r,a)=>ii(e,t,n,r,a),...r}}default:throw new y("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}(e,o);return er({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await et("platform_command",async()=>{switch(t){case"open":return oC(e,l,n,i);case"close":{let e=n[0];if(!e)return{closed:"session",...eM("Closed session")};return await l.close(e),{app:e,...eM(`Closed: ${e}`)}}case"press":return oR(e,l,n,i,o);case"swipe":return oP(e,l,n,i,o);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,...eM(`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,...eM(`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=i4(i?.delayMs??0,"delay-ms",0,1e4);return await l.type(t,r),{text:t,delayMs:r,...eM(oX("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=i4(i?.delayMs??0,"delay-ms",0,1e4);return await l.fill(e,t,r,a),{x:e,y:t,text:r,delayMs:a,...eM(oX("Filled",r))}}case"scroll":return oT(l,n,i);case"pinch":return oL(e,n,i,o);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(!i5.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:i?.appBundleId}),{event:t,eventUrl:a,transport:"deep-link",...eM(`Triggered app event: ${t}`)}}case"screenshot":{let e=n[0]??r??`./screenshot-${Date.now()}.png`;return await a.mkdir(s.dirname(e),{recursive:!0}),await l.screenshot(e,{appBundleId:i?.appBundleId,fullscreen:i?.screenshotFullscreen,surface:i?.surface}),{path:e,...eM(`Saved screenshot: ${e}`)}}case"back":return await l.back(i?.backMode),{action:"back",mode:i?.backMode??"in-app",...eM("Back")};case"home":return await l.home(),{action:"home",...eM("Home")};case"rotate":{let e=ot(n[0]);return await l.rotate(e),{action:"rotate",orientation:e,...eM(`Rotated to ${e}`)}}case"app-switcher":return await l.appSwitcher(),{action:"app-switcher",...eM("Opened app switcher")};case"clipboard":return o$(l,n);case"keyboard":return oF(e,l,n,i,o);case"settings":return oU(e,l,n,i);case"push":return oG(e,n,i);case"snapshot":return oV(e,n,i,o);case"read":return oB(e,n,i,o);default:throw new y("INVALID_ARGS",`Unknown command: ${t}`)}},{command:t,platform:e.platform})}async function oC(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,...eM("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(G(a))throw new y("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!G(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,...eM(`Opened: ${a}`)}}return await t.open(a,{activity:r?.activity,appBundleId:r?.appBundleId}),{app:a,...eM(`Opened: ${a}`)}}async function oR(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=i1(r);if("primary"!==e)throw new y("UNSUPPORTED_OPERATION",`${e} click is not supported on macOS ${r.surface} sessions.`);return await ap(o,s,{bundleId:r.appBundleId,surface:r.surface}),{x:o,y:s,...eM(oj({x:o,y:s}))}}let l=i1(r);if("primary"!==l){let t=i2({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 iO(o,s):await iC(o,s):await nA(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,...eM(oj({x:o,y:s,button:l}))}}let d=i4(r?.count??1,"count",1,200),u=i4(r?.intervalMs??0,"interval-ms",0,1e4),c=i4(r?.holdMs??0,"hold-ms",0,1e4),p=i4(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(tO(e.platform)&&d>1&&0===c&&0===p){let t=await nA(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,...eM(oj({x:o,y:s}))}}return await i6(d,u,async e=>{let[n,r]=function(e,t){if(t<=0)return[0,0];let[n,r]=i8[e%i8.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}),ek({x:o,y:s,count:d,intervalMs:u,holdMs:c,jitterPx:p,doubleTap:f,...i},oj({x:o,y:s}))}async function oP(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=i4(n[4]?Number(n[4]):250,"durationMs",16,1e4),u="ios"===e.platform?Math.min(60,Math.max(16,Math.round(d))):d,c=i4(r?.count??1,"count",1,200),p=i4(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(tO(e.platform)&&c>1){let t=await nA(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,...eM(oq(c,f))}}return await i6(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)}),ek({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},oq(c,f))}async function oT(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 ek({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 oL(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 nA(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,...eM(`Pinched to scale ${a}`)}}async function o$(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,...eM("Clipboard updated")}}async function oF(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 I(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 P(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 nA(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},a);return{platform:"ios",action:"dismiss",wasVisible:t.wasVisible,dismissed:t.dismissed,visible:t.visible,...eM(t.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}throw new y("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function oU(e,t,n,r){var a;let[i,o,s,l,d]=n,u="permission"===i?{permissionTarget:s,permissionMode:l}:void 0;er({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?ek({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,...eM(`Updated setting: ${i}`)}}async function oG(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 i7(a);if("ios"===e.platform)return await ia(e,r,i),{platform:"ios",bundleId:r,...eM(`Pushed notification to ${r}`)};let o=await rN(e,r,i);return{platform:"android",package:r,action:o.action,extrasCount:o.extrasCount,...eM(`Pushed notification to ${r}`)}}async function oV(e,t,n,r){if("linux"===e.platform){let e=await et("snapshot_capture",async()=>await i0(n?.surface),{backend:"linux-atspi"});return{nodes:e.nodes??[],truncated:e.truncated??!1,backend:"linux-atspi"}}if("android"!==e.platform){let t=await et("snapshot_capture",async()=>await nA(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 et("snapshot_capture",async()=>await nB(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 oB(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 n0(e,a,i)??""};if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return{action:"read",text:(await ac(a,i,{bundleId:n.appBundleId,surface:n.surface})).text};let o=await nA(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 oj(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function oq(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function oX(e,t){return`${e} ${Array.from(t).length} chars`}let oH=e=>"macos"!==e.platform,oK=e=>"macos"===e.platform||"simulator"===e.kind,oz={device:!0},oY={},oW={alert:{apple:{simulator:!0,device:!0},android:{},linux:oY,supports:oK},pinch:{apple:{simulator:!0,device:!0},android:{},linux:oY,supports:oK},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oY,supports:oH},apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oY},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:oY,supports:oH},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:oY,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:oH},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oY},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oY},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:oY},install:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oY,supports:oH},"install-from-source":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oY,supports:oH},reinstall:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oY,supports:oH},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:oY,supports:oH},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oY},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oY,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:oY,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:oY},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 oJ(e,t){let n=oW[e];if(!n)return!0;let r=tO(t.platform)?n.apple:"linux"===t.platform?n.linux:n.android;return!!r&&(!n.supports||!!n.supports(t))&&!0===r[t.kind??"unknown"]}function oZ(e,t,n,r,a){return{requestId:a??en().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:i1(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}let oQ=W(process.env.AGENT_DEVICE_IOS_DEVICE_READY_TIMEOUT_MS,15e3,1e3),o0=new Map;async function o1(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=o0.get(r);if(void 0!==a){if(a>Date.now())return;o0.delete(r)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:t}=await Promise.resolve(eQ);await t(e),o2(r);return}if("device"===e.kind){await o3(e.id),o2(r);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./8809.js");await t(e.id),o2(r)}}function o2(e){o0.set(e,Date.now()+5e3)}async function o3(e){let t=s.join(i.tmpdir(),`agent-device-ready-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=Math.max(1,Math.ceil(oQ/1e3));try{let r=await H("xcrun",["devicectl","device","info","details","--device",e,"--json-output",t,"--timeout",String(n)],{allowFailure:!0,timeoutMs:oQ+3e3}),a=String(r.stdout??""),i=String(r.stderr??""),o=await o5(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:o4(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??oQ),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?o4(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 o5(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 o4(e,t){let n=rj(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.":rB)}function o8(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}let o6=[250,400,600];function o9(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?sn(n?.nodes??[]):void 0,routeComparable:r}}function o7(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 se(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function st(e){return"press"===e||"click"===e||"back"===e||"open"===e}function sn(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 sr(e,t){e.snapshot=t,e.snapshotScopeSource=void 0}function sa(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function si(e){if(0===e.length)return null;let t=sa(e[0]);if(null!==t)return{kind:"sleep",durationMs:t};if("text"===e[0]){let t=sa(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=sa(e[e.length-1]);return{kind:"ref",rawRef:e[0],timeoutMs:t}}let n=sa(e[e.length-1]),r=eE(null!==n?e.slice(0,-1):e.slice());if(r&&0===r.rest.length){let e=eC(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 so(e,t,n){let r=e.get(t),a=r?.device??await oN(n??{});return r||await o1(a),{session:r,device:a}}async function ss(e,t,n){let r=!e&&"ios"===t.platform;try{return await n()}finally{r&&await nh(t.id)}}function sl(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}async function sd(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(!oJ("alert",i))return o8("UNSUPPORTED_OPERATION","alert is not supported on this device");if("macos"===i.platform){let e=async()=>await ad("wait"===o?"get":o,s);if("wait"===o){let n=sa(t.positionals?.[1])??1e4,i=Date.now();for(;Date.now()-i<n;){try{let n=await e();return sl(r,a,t,n),{ok:!0,data:n}}catch{}await Y(300)}return o8("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 ad(n,s);return sl(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 Y(300)}throw su(e)}let i=await ad("get",s);return sl(r,a,t,i),{ok:!0,data:i}}if("wait"===o){let e=sa(t.positionals?.[1])??1e4,o=Date.now();for(;Date.now()-o<e;){try{let e=await nA(i,{command:"alert",action:"get",appBundleId:a?.appBundleId},{verbose:t.flags?.verbose,logPath:n,traceLogPath:a?.trace?.outPath,requestId:t.meta?.requestId});return sl(r,a,t,e),{ok:!0,data:e}}catch{}await Y(300)}return o8("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 nA(i,{command:"alert",action:l,appBundleId:a?.appBundleId},d);return sl(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 Y(300)}throw su(e)}let u=await nA(i,{command:"alert",action:l,appBundleId:a?.appBundleId},d);return sl(r,a,t,u),{ok:!0,data:u}}function su(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 sc(e){let{req:t,logPath:n,sessionStore:r,session:a,device:i,parsed:o}=e,{setting:s,state:l,permissionTarget:d}=o;if(!oJ("settings",i))return o8("UNSUPPORTED_OPERATION","settings is not supported on this device");if("macos"===i.platform&&!e_(s))return o8("INVALID_ARGS",eN(s));let u=a?.appBundleId,c="permission"===s?[s,l,d??"",t.positionals?.[3]??"",u??""]:[s,l,u??""],p=await oO(i,"settings",c,t.flags?.out,{...oZ(n,t.flags,u,a?.trace?.outPath)});return sl(r,a,t,p??{setting:s,state:l}),{ok:!0,data:p??{setting:s,state:l}}}function sp(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 sf(e,t){if(!Number.isInteger(t)||t<1)throw new y("INVALID_ARGS","Screenshot max size must be a positive integer");let n=sp(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 sh(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 sm(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 sw(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw w(e)}}let sg=[0,187,255,255];function sy(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 sb(e,t,n){return Math.min(Math.max(e,t),n)}let sv={icon:90,toggle:90,chevron:75,separator:45,visual:35,background:10},sI={leading:20,trailing:20,separator:10,unknown:0,background:-30};function sA(e){return"background"!==e.likelyKind}function sx(e,t){return e.width>=.25*t.width||e.height>=.06*t.height}function sS(e,t){let n,r=0;for(let a of t){let t=sE(e,a.rect);t<=r||(r=t,n=a)}return n}function sN(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,sE(t,r=n.rect)>0||Math.abs(sD(t).y-sD(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 s_(e,t){let n,r=sD(e);for(let e of t){var a,i;let t=Math.sqrt((a=r,i=sD(e.rect),(a.x-i.x)**2+(a.y-i.y)**2));n&&t>=n.distance||(n={block:e,distance:t})}return n}function sk(e){let t=sM(e);return e.differentPixels>=24&&t.width>=3&&t.height>=3}function sM(e){return{x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1}}function sE(e,t){return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))}function sD(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function sO(e,t,n){return Math.min(Math.max(e,t),n)}async function sC(e){if(await z("tesseract"))try{let[t,n]=await Promise.all([sP(e.baselinePath),sP(e.currentPath)]);if(0!==t.exitCode||0!==n.exitCode)return;let r=sR(t.stdout,e.width,e.height),a=sR(n.stdout,e.width,e.height),i=function(e,t){let n=new Set,r=[];for(let i of e){var a;let e=sV(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(sV(d.text)!==t)continue;let u=(o=sF(e.normalizedRect),s=sF(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=sq(t.rect.width/e.rect.width),a=sq(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)=>sT(t)-sT(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-sB(e.map(e=>e.delta.x))));e?e.push(n):t.push([n])}return t.filter(e=>e.length>=2).map(sL).filter(e=>e.yRange.max-e.yRange.min<=60).sort((e,t)=>s$(t)-s$(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 sR(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=sG(t,i,"level"),r=sU(t,i,"text").trim(),a=sG(t,i,"conf");if(5!==n||(s=r,!/[\p{L}\p{N}]/u.test(s))||a<0)continue;let l=sG(t,i,"left"),d=sG(t,i,"top"),u=sG(t,i,"width"),c=sG(t,i,"height");u<=0||c<=0||o.push({key:[sU(t,i,"page_num"),sU(t,i,"block_num"),sU(t,i,"par_num"),sU(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*sB(r.map(e=>e.confidence)))/100;return{text:r.map(e=>e.text).join(" "),confidence:i,rect:a,normalizedRect:{x:sj(a.x/t),y:sj(a.y/n),width:sj(a.width/t),height:sj(a.height/n)}}})(e,t,n)).filter(e=>null!==e)}function sP(e){return H("tesseract",[e,"stdout","-l","eng","tsv"],{allowFailure:!0,timeoutMs:1e4})}function sT(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 sL(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 s$(e){return 2*Math.abs((e.xRange.min+e.xRange.max)/2)+Math.abs((e.yRange.min+e.yRange.max)/2)}function sF(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function sU(e,t,n){let r=t.get(n);return void 0===r?"":e[r]??""}function sG(e,t,n){let r=Number(sU(e,t,n));return Number.isFinite(r)?r:0}function sV(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function sB(e){return e.reduce((e,t)=>e+t,0)/e.length}function sj(e){return Math.round(100*e*100)/100}function sq(e){return Math.round(1e3*e)/1e3}function sX(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function sH(e){return .2126*e.r+.7152*e.g+.0722*e.b}function sK(e){return`#${sz(e.r)}${sz(e.g)}${sz(e.b)}`}function sz(e){return e.toString(16).padStart(2,"0")}function sY(e){return Math.round(100*e*100)/100}let sW=255*Math.sqrt(3);async function sJ(e,t,n={}){let r,i,o,l;await sZ(e,"Baseline image not found"),await sZ(t,"Current screenshot not found");let d=n.outputPath,[u,c]=await Promise.all([a.readFile(e),a.readFile(t)]),p=sp(u,"baseline screenshot"),f=sp(c,"current screenshot");sQ(p.width,p.height,"baseline screenshot",n.maxPixels),sQ(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 s0(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*sW,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=s1(f,e);y.data[e]=s2(n,220,.78),y.data[e+1]=s2(n,0,.78),y.data[e+2]=s2(n,0,.78),y.data[e+3]=255;continue}let n=s1(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,E,D;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=sX(n.baselineRed,n.baselineGreen,n.baselineBlue,n.differentPixels),I=sX(n.currentRed,n.currentGreen,n.currentBlue,n.differentPixels),x=y.width*y.height,S=sY(n.differentPixels/x),N=Math.round(sH(v)),_=Math.round(sH(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",E=(l=v,d=I,h=sH(l),Math.abs(m=sH(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"),D=(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:sY(y.x/a.width),y:sY(y.y/a.height),width:sY(y.width/a.width),height:sY(y.height/a.height)},differentPixels:n.differentPixels,shareOfDiffPercentage:sY(n.differentPixels/a.differentPixels),densityPercentage:S,shape:k,size:M,location:D,averageBaselineColorHex:sK(v),averageCurrentColorHex:sK(I),baselineLuminance:N,currentLuminance:_,dominantChange:E}}):[];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=sb(t.x,0,e.width-1),r=sb(t.y,0,e.height-1),a=sb(t.x+t.width-1,0,e.width-1),i=sb(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)sy(e,o,r+t,sg),sy(e,o,i-t,sg);for(let o=r;o<=i;o+=1)sy(e,n+t,o,sg),sy(e,a-t,o,sg)}}(y,e.rect);await a.mkdir(s.dirname(d),{recursive:!0}),await a.writeFile(d,h.sync.write(y))}else await s0(n.outputPath);let N=v>0?await sC({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?(i=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=sO(Math.floor(r.x),0,t-1),i=sO(Math.floor(r.y),0,n-1),o=sO(Math.ceil(r.x+r.width),0,t),s=sO(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)),o=sN(S.ocr?.currentBlocksRaw??[]),l=sN(S.ocr?.baselineBlocksRaw??[]),i.filter(sk).map(e=>{var t,n,r,a,i,s,d,u,c,p,f;let h,m,w,g,y,b,v,I,A,x;return t=e,n=S,r=o,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=sM(t),n.regions),y=function(e,t,n){let r=sS(e,t);if(r)return s_(e,r.blocks);let a=sS(e,n);return a?s_(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,s=b,d=t.differentPixels,u=n,h=i.width/i.height,m=d/(i.width*i.height),"separator"===s?"separator":"background"===s?"background":"trailing"===s&&h>=1.5&&h<=3.8&&m>=.35?"toggle":"trailing"===s&&i.width<=.06*u.width&&i.height<=.04*u.height?"chevron":"leading"===s&&h>=.55&&h<=1.8?"icon":sx(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=sx(c.rect,f)?-35:0,x=20*!!c.regionIndex,sv[c.likelyKind]+sI[c.slot]+x+A+Math.min(20,p/200))}}).filter(e=>e.rect.y>=.08*S.height).filter(sA).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 sZ(e,t){try{await a.access(e)}catch{throw new y("INVALID_ARGS",`${t}: ${e}`)}}function sQ(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 s0(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 s1(e,t){return s2(Math.round(.299*e.data[t]+.587*e.data[t+1]+.114*e.data[t+2]),255,.72)}function s2(e,t,n){return Math.round(e*(1-n)+t*n)}function s3(e){return e.width*e.height}function s5(e){return Math.round(100*e*100)/100}async function s4(e,t){let n=await sw(e,{prefix:"agent-device-diff-current",ext:".png"});try{await s6(e,t,n.path,s9(t))}catch(e){throw await n.cleanup(),e}return n}async function s8(e,t,n,r,a){var i,o,s,l;if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await le(n),r;let d=(i=t,o=n,i.currentOverlayOut?i.currentOverlayOut:i.out?.kind==="path"?{kind:"path",path:s7(o??i.out.path)}:i.out?.kind==="downloadableArtifact"?{kind:"downloadableArtifact",...i.out.clientPath?{clientPath:s7(i.out.clientPath)}:{},...i.out.fileName?{fileName:s7(i.out.fileName)}:{}}:void 0),u=await sm(e,d,{field:"currentOverlayPath",ext:".png"});try{let n=await s6(e,t,u.path,{overlayRefs:!0,...s9(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=s3(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:s5(u/s3(d)),regionCoveragePercentage:s5(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 s6(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 s9(e){return e.surface?{surface:e.surface}:{}}function s7(e){let t=s.extname(e),n=t?e.slice(0,-t.length):e;return`${n}.current-overlay${t||".png"}`}async function le(e){try{await a.unlink(s7(e))}catch(e){var t;if(!("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code))throw e}}function lt(e){return"live"===e.kind}let ln={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 lr(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=lo(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:la(a,s,!1,o,t)})}return r}function la(e,t,n,r,a={}){var i,o,s,l,d,u,c,p;let f,h=r??lo(e.type??"Element"),m=eq(e,h),w=(i=e,o=h,s=a,l=m,s.summarizeTextSurfaces&&l.shouldSummarize&&function(e,t,n){let r=eD(e.label);if(r&&r!==n)return r;let a=eD(e.identifier);if(a&&!ll(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)||li(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"),ls(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:"${e$(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 li(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(ls(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||ll(s)&&("group"===t||"image"===t||"list"===t||"collection"===t)?"":s}function lo(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(ln,t)?ln[t]:void 0)||n||"element")}function ls(e){return"text-field"===e||"text-view"===e||"search"===e}function ll(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function ld(e,t){let n=lo(e.type??"Element"),r=li(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 lu(e,t){return t.flatten?e.map(e=>({text:la(e,0,!1),comparable:ld(e,0)})):lr(e).map(e=>({text:e.text,comparable:ld(e.node,e.depth)}))}function lc(e,t){return e.get(t)??0}function lp(e){return"text"===e||"label"===e||"any"===e}function lf(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function lh(e){return e.clock?.now()??Date.now()}async function lm(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}async function lw(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:lh(r)}),g=lh(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 lg(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 ly(e){return["visible","hidden","exists","editable","selected","text"].includes(e)}function lb(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 lv(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 lI(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(lf(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:lh(e)};return n.updateSession&&a&&await e.sessions.set({...a,snapshot:o}),{sessionName:r,session:a,snapshot:o}}async function lA(e,t,n){if(e.backend.readText){let r=await e.backend.readText(lf(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return eX(n)}let lx=async(e,t)=>{if("ref"===t.target.kind){let n=await lv(e,t.session),r=function(e,t,n){let r=ei(t);if(!r)throw new y("INVALID_ARGS",n.invalidRefMessage);let a=ea(e,r)??(n.fallbackLabel.length>0?eB(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=eU(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 lA(e,n,r.node),node:r.node,selectorChain:a}}let n=await lT(e,t,t.session??"default",{selector:t.target.selector,disambiguateAmbiguous:"text"===t.property}),r=eU(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 lA(e,n.capture,n.node);return{kind:"text",target:{kind:"selector",selector:n.selector},text:a,node:n.node,selectorChain:r}},lS=async(e,t)=>{let n=await lx(e,{...t,property:"text",target:t.target});if("text"!==n.kind)throw new y("COMMAND_FAILED","getText returned non-text result");return n},lN=async(e,t)=>{let n=await lx(e,{...t,property:"attrs",target:t.target});if("attrs"!==n.kind)throw new y("COMMAND_FAILED","getAttrs returned non-attrs result");return n},l_=async(e,t)=>{if(!ly(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 lI(e,t,{updateSession:!0}),r=eR(t.selector);if("exists"===t.predicate){let a=eH(n.snapshot.nodes,r,{platform:e.backend.platform});if(!a)throw new y("COMMAND_FAILED",eY(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=eK(n.snapshot.nodes,r,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:!1});if(!a)throw new y("COMMAND_FAILED",eY(r,[],{unique:!0}));let i=function(e){let{predicate:t,node:n,nodes:r,expectedText:a,platform:i}=e,o=eO(n),s=eT(n,i),l=!0===n.selected,d="text"===t?eP(n):function(e,t){if(!0===e.hittable)return!0;if(lb(e.rect))return nT(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=ez(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||lb(e.rect))}(e))return e;r=e}return null}(e,t);return!!n&&(!0===n.hittable||!!lb(n.rect)&&nT(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)}},lk=async(e,t)=>await l_(e,{...t,predicate:"visible",selector:t.target.selector}),lM=async(e,t)=>await l_(e,{...t,predicate:"hidden",selector:t.target.selector}),lE=async(e,t)=>{if("sleep"===t.target.kind)return await lm(e,t.target.durationMs),{kind:"sleep",waitedMs:t.target.durationMs};if("ref"===t.target.kind){let n=await lv(e,t.session),r=ei(t.target.ref);if(!r)throw new y("INVALID_ARGS",`Invalid ref: ${t.target.ref}`);let a=ea(n.snapshot.nodes,r),i=a?ej(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 lR(e,t,i,t.target.timeoutMs)}if("selector"===t.target.kind)return await lC(e,t,t.target.selector,t.target.timeoutMs);if(!t.target.text)throw new y("INVALID_ARGS","wait requires text");return await lR(e,t,t.target.text,t.target.timeoutMs)},lD=async(e,t)=>{let n=await lE(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 lO(e,t,n){let r=t.timeoutMs??1e4,a=lh(e);for(;lh(e)-a<r;){if(eJ((await lI(e,t,{updateSession:!0,scope:lp(n)?t.query:void 0})).snapshot.nodes,n,t.query,{requireRect:!1}).matches[0])return{kind:"found",found:!0,waitedMs:lh(e)-a};await lm(e,300)}throw new y("COMMAND_FAILED","find wait timed out")}async function lC(e,t,n,r){let a=r??1e4,i=lh(e),o=eR(n);for(;lh(e)-i<a;){let n=eH((await lI(e,t,{updateSession:!0})).snapshot.nodes,o,{platform:e.backend.platform});if(n)return{kind:"selector",selector:n.selector.raw,waitedMs:lh(e)-i};await lm(e,300)}throw new y("COMMAND_FAILED",`wait timed out for selector: ${n}`)}async function lR(e,t,n,r){let a=r??1e4,i=lh(e);for(;lh(e)-i<a;){if(e.backend.findText?(await e.backend.findText(lf(e,t),n)).found:await lP(e,t,n))return{kind:"text",text:n,waitedMs:lh(e)-i};await lm(e,300)}throw new y("COMMAND_FAILED",`wait timed out for text: ${n}`)}async function lP(e,t,n){return!!eB((await lI(e,t,{updateSession:!0})).snapshot.nodes,n)}async function lT(e,t,n,r){let a=await lI(e,{...t,session:n},{updateSession:!0}),i=eR(r.selector),o=eK(a.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:r.disambiguateAmbiguous});if(!o)throw new y("COMMAND_FAILED",eY(i,[],{unique:!0}));return{capture:a,node:o.node,selector:o.selector.raw,ref:`@${o.node.ref}`}}function lL(e){let t=l$(e);if(!t)return null;let n=eo(t);return Number.isFinite(n.x)&&Number.isFinite(n.y)?n:null}function l$(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 lF(e,t){let n=function(e,t){let n=l$(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=l$(e.rect);return!!t&&lU(t,n)});if(1!==t.length)break;r=t[0]}return r===t?null:r}(e,t);if(n?.rect&&lL(n.rect))return n;let r=eF(e,t);return r?.rect&&lL(r.rect)?!function(e,t,n){var r,a,i,o;let s,l,d,u=l$(e.rect),c=l$(t.rect);if(!u||!c)return!1;let p=function(e,t){let n=eo(t),r=e.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}).map(e=>l$(e.rect)).filter(e=>null!==e);if(0===r.length)return null;let a=r.filter(e=>nM(e,n.x,n.y));return nE(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))&&!lU(u,c)}(t,r,e)?r:t:t}function lU(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 lG(e,t,n){if(await lB(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 lq(e,t,t.target),a=r.resolved,i=n.promoteToHittableAncestor?lF(r.snapshot.nodes,a.node):a.node;return function(e,t,n,r){let a=e.rect?nL(e,t):null;if(!(!e.rect||!a||nT(e,t)))throw new y("COMMAND_FAILED",`Ref ${n} is off-screen and not safe to ${r}`,{reason:"offscreen_ref",ref:ei(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:lH(i,`Ref ${t.target.ref} not found or has invalid bounds`),target:{kind:"ref",ref:`@${a.ref}`},node:i,selectorChain:eU(i,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:ej(i,r.snapshot.nodes)}}let r=await lV(e,t,n.requireInteractive),a=eR(t.target.selector),i=eK(r.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if(!i||!i.node.rect)throw new y("COMMAND_FAILED",eY(a,i?.diagnostics??[],{unique:!0}));let o=n.promoteToHittableAncestor?lF(r.snapshot.nodes,i.node):i.node;return{kind:"selector",point:lH(o,`Selector ${i.selector.raw} resolved to invalid bounds`),target:{kind:"selector",selector:i.selector.raw},node:o,selectorChain:eU(o,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:ej(o,r.snapshot.nodes)}}async function lV(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(lf(e,t),{interactiveOnly:n,compact:n}),o=i.snapshot??{nodes:i.nodes??[],truncated:i.truncated,backend:i.backend,createdAt:lh(e)};return await e.sessions.set({...a,snapshot:o}),{snapshot:o}}async function lB(e,t,n){if("macos"!==e.backend.platform)return;let r=await lj(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 lj(e,t){let n=await e.sessions.get(t.session??"default");return n?.metadata?.surface}async function lq(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=lX(a.snapshot.nodes,n.ref,{fallbackLabel:i,requireRect:!0});if(o)return{snapshot:a.snapshot,resolved:o};let s=await lV(e,t,!0),l=lX(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 lX(e,t,n){let r=ei(t);if(!r)throw new y("INVALID_ARGS",`Invalid ref: ${t}`);let a=ea(e,r);if(lK(a,n.requireRect))return{ref:r,node:a};let i=n.fallbackLabel.length>0?eB(e,n.fallbackLabel):null;return lK(i,n.requireRect)?{ref:r,node:i}:null}function lH(e,t){if(!e.rect)throw new y("COMMAND_FAILED",t);let n=eo(e.rect);if(!Number.isFinite(n.x)||!Number.isFinite(n.y))throw new y("COMMAND_FAILED",t);return n}function lK(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=eo(e.rect);return Number.isFinite(o.x)&&Number.isFinite(o.y)}async function lz(e,t){let n=t.target??{kind:"viewport"};return"viewport"===n.kind?(await lB(e,t,"scroll"),{kind:"viewport"}):await lG(e,{...t,target:n},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function lY(e,t){if(t.from){var n;if("x"in(n=t.from)&&"y"in n)return await lB(e,t,"swipe"),{point:lJ(t.from,"from")};let r=await lG(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 lB(e,t,"swipe"),{point:eo(function(e){let t=e.filter(t=>nT(t,e)).map(e=>e.rect).filter(lQ),n=t.length>0?t:e.map(e=>e.rect).filter(lQ);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 lV(e,t,!1)).snapshot.nodes)),target:{kind:"viewport"}}}function lW(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 lJ(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 lZ(e,t){if(!Number.isFinite(e)||e<=0)throw new y("INVALID_ARGS",`${t} must be a positive number`);return e}function lQ(e){return!!(e&&e.width>0&&e.height>0)}function l0(e){return e&&"object"==typeof e?e:void 0}async function l1(e,t,n){let r=await lG(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=l2(await e.backend.tap(lf(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 l2(e){return e&&"object"==typeof e?e:void 0}function l3(e){return!!(e&&"object"==typeof e)}function l5(e){return e&&"object"==typeof e?e:void 0}let l4=/^[A-Za-z0-9_.:-]{1,64}$/;function l8(e,t){if(void 0!==e)return l6(e,t)}function l6(e,t){let n=e?.trim();if(!n)throw new y("INVALID_ARGS",`${t} must be a non-empty string`);return n}async function l9(e,t){if(!t||"object"!=typeof t)throw new y("INVALID_ARGS","apps.push requires an input");if("json"===t.kind)return l7(t.payload,"apps.push JSON payload",8192),{backendInput:{kind:"json",payload:t.payload},inputKind:"json"};let n=await sh(e,t,{usage:"apps.push",field:"input"});return{backendInput:{kind:"file",path:n.path},inputKind:"file",...n.cleanup?{cleanup:n.cleanup}:{}}}function l7(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 de(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function dt(e){return e&&"object"==typeof e?e:void 0}async function dn(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?dl(t.app,"app"):void 0;if("installFromSource"!==n&&!i)throw new y("INVALID_ARGS",`admin.${n} requires app`);let o=lf(e,t),s=await dr(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=du(c),r=dd(c,"appName"),f=dd(c,"appId"),h=dd(c,"bundleId"),m=dd(c,"packageName"),w=dd(c,"launchTarget"),g=dd(c,"installablePath"),y=dd(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}:{},...eM(`${"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 dr(e,t,n){let r=di(n),a=await da(e,r);try{let n=e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,a.source):a.source;return{source:di(n),...a.cleanup?{cleanup:a.cleanup}:{}}}catch(e){if(a.cleanup)try{await a.cleanup()}catch{}throw e}}async function da(e,t){if("url"===t.kind)return{source:t};let n=await sh(e,t,{usage:"admin.install",field:"source"});return{source:{kind:"path",path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function di(e){if(!e||"object"!=typeof e)throw new y("INVALID_ARGS","install source is required");if("path"===e.kind)return{kind:"path",path:dl(e.path,"source.path")};if("uploadedArtifact"===e.kind)return{kind:"uploadedArtifact",id:dl(e.id,"source.id")};if("url"===e.kind){let t=dl(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 ds(e,t){if(void 0!==e)return dl(e,t)}function dl(e,t){let n=e?.trim();if(!n)throw new y("INVALID_ARGS",`${t} must be a non-empty string`);return n}function dd(e,t){let n=e[t];return"string"==typeof n&&n.length>0?n:void 0}function du(e){return e&&"object"==typeof e?e:void 0}function dc(e,t){if("start"===e||"stop"===e)return e;throw new y("INVALID_ARGS",`${t} action must be start or stop`)}function dp(e,t,n,r){return{kind:"start"===e?r.startKind:r.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...eM("start"===e?r.startMessage:r.stopMessage)}}let df=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,dh=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function dm(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(dh,()=>(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=dw(e);return t?(t.redacted&&n(),t.value):e}):t),redacted:r}}function dw(e){try{let t=new URL(e),n=function(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))df.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 dg=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function dy(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[r,a]of Object.entries(e))if(dg.test(r))n[r]="[REDACTED]",t=!0;else{let e=dA(a,2048);n[r]=e.value??"",t||=e.redacted}return{value:n,redacted:t}}function db(e){return void 0===e?{redacted:!1}:function(e){try{let t=JSON.parse(e),n=dI(t,dm);return dx(JSON.stringify(n.value),2048,n.redacted)}catch{return}}(e)??dA(e,2048)}function dv(e){return dI(e,e=>dA(e,2048))}function dI(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=dI(e,t);return n||=r.redacted,r.value}),redacted:n}}let n=!1,r={};for(let[a,i]of Object.entries(e)){if(dg.test(a)){r[a]="[REDACTED]",n=!0;continue}let e=dI(i,t);r[a]=e.value,n||=e.redacted}return{value:r,redacted:n}}function dA(e,t){if(void 0===e)return{redacted:!1};let n=dm(e);return dx(n.value,t,n.redacted)}function dx(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 dS(e,t){let n=lf(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 dN(e,t,n,r){return{...d_(e),...void 0!==e.cursor?{cursor:dM(e.cursor,"cursor")}:{},limit:void 0===e.limit?t:i4(e.limit,r,1,n)}}function d_(e){return{...void 0!==e.since?{since:dM(e.since,"since")}:{},...void 0!==e.until?{until:dM(e.until,"until")}:{}}}function dk(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)=>dM(e,`${t}[${n}]`))}function dM(e,t){let n=e.trim();if(!n)throw new y("INVALID_ARGS",`${t} must be a non-empty string`);return n}let dE=async(e,t)=>{let n;if(!e.backend.captureScreenshot)throw new y("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");let r=await sm(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 sf(r.path,t.maxSize),n=await r.publish()}catch(e){throw await r.cleanup?.(),e}return{path:r.path,...n?{artifacts:[n]}:{},...eM(`Saved screenshot: ${r.path}`)}},dD=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&&!lt(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 sh(e,t.baseline,{usage:"diff screenshot baseline",field:"baseline"}),l=[];try{let d;d=lt(o)?(r=await s4(e,t)).path:(n=await sh(e,o,{usage:"diff screenshot current",field:"current"})).path,a=t.out?await sm(e,t.out,{field:"diffPath",ext:".png"}):void 0;let u=await sJ(s.path,d,{threshold:i,outputPath:a?.path,maxPixels:e.policy.maxImagePixels});lt(o)&&(u=await s8(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?.()}},dO=async(e,t)=>{var n;let r,a,i=await lw(e,t);return await e.sessions.set(lg(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=nR(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}:{}})}},dC=async(e,t)=>{let n=await lw(e,t),r=!0===t.interactiveOnly,a=n.session?.snapshot,i=lg(t.session,n);if(!a){let t=function(e,t={}){return lu(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&&lc(i,a-1)<lc(i,a+1)?lc(i,a+1):lc(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&&lc(a,l-1)<lc(a,l+1)?l+1:l-1,u=lc(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[]}(lu(e,n),lu(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}:{}}},dR=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 lO(e,t,n);let r=await lI(e,t,{updateSession:!0,scope:lp(n)?t.query:void 0}),a=eJ(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 lA(e,r,a),node:a}},dP=lx,dT=lS,dL=lN,d$=l_,dF=lk,dU=lM,dG=lE,dV=lD,dB=async(e,t)=>await l1(e,t,"click"),dj=async(e,t)=>await l1(e,t,"press"),dq=async(e,t)=>{var n;if(!t.text)throw new y("INVALID_ARGS","fill requires text");let r=await lG(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=l2(await e.backend.fill(lf(e,t),r.point,t.text,{delayMs:t.delayMs})),i="node"in r?r.node.type??"":"",o=i&&!eW(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}:{}}},dX=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=i4(t.delayMs??0,"delay-ms",0,1e4),i=l2(await e.backend.typeText(lf(e,t),n,{delayMs:a}));return{kind:"text",text:n,delayMs:a,...i?{backendResult:i}:{},...eM(`Typed ${Array.from(n).length} chars`)}},dH=async(e,t)=>{let n=await lG(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=l0(await e.backend.focus(lf(e,t),n.point));return{...n,...r?{backendResult:r}:{},...eM(`Focused (${n.point.x}, ${n.point.y})`)}},dK=async(e,t)=>{let n=await lG(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:i4(t.durationMs,"durationMs",0,12e4),a=l0(await e.backend.longPress(lf(e,t),n.point,{durationMs:r}));return{...n,...void 0!==r?{durationMs:r}:{},...a?{backendResult:a}:{},...eM(`Long pressed (${n.point.x}, ${n.point.y})`)}},dz=async(e,t)=>{if(!e.backend.swipe)throw new y("UNSUPPORTED_OPERATION","swipe is not supported by this backend");let n=await lY(e,t),r=function(e,t){if(t.to)return{point:lJ(t.to,"to")};let n=lW(t.direction,"swipe direction"),r=lZ(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:i4(t.durationMs,"durationMs",16,1e4),i=l0(await e.backend.swipe(lf(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}:{},...eM("Swiped")}},dY=async(e,t)=>{var n,r;if(!e.backend.scroll)throw new y("UNSUPPORTED_OPERATION","scroll is not supported by this backend");let a=lW(t.direction,"scroll direction"),i=(n=t.amount,r="scroll amount",void 0===n?void 0:lZ(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 lz(e,t),l="viewport"===s.kind?{kind:"viewport"}:{kind:"point",point:s.point},d=l0(await e.backend.scroll(lf(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}:{},...eM(void 0!==o?`Scrolled ${a} by ${o}px`:void 0!==i?`Scrolled ${a} by ${i}`:`Scrolled ${a}`)}},dW=async(e,t)=>{if(!e.backend.pinch)throw new y("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await lB(e,t,"pinch");let n=lZ(t.scale,"pinch scale"),r=t.center?await lG(e,{...t,target:t.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,a=l0(await e.backend.pinch(lf(e,t),{scale:n,...r?{center:r.point}:{}}));return{kind:"pinch",scale:n,...r?{center:r.point,centerTarget:r}:{},...a?{backendResult:a}:{},...eM(`Pinched to scale ${n}`)}},dJ=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=l5(await e.backend.pressBack(lf(e,t),{mode:n}));return{kind:"systemBack",mode:n,...r?{backendResult:r}:{},...eM("Back")}},dZ=async(e,t={})=>{if(!e.backend.pressHome)throw new y("UNSUPPORTED_OPERATION","system.home is not supported by this backend");let n=l5(await e.backend.pressHome(lf(e,t)));return{kind:"systemHome",...n?{backendResult:n}:{},...eM("Home")}},dQ=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=l5(await e.backend.rotate(lf(e,t),n));return{kind:"systemRotated",orientation:n,...r?{backendResult:r}:{},...eM(`Rotated to ${n}`)}},d0=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(lf(e,t),{action:n}),a=l5(r);if("dismiss"===n){let e=l3(r)?r.dismissed:void 0;return{kind:"keyboardDismissed",action:n,state:l3(r)?r:{},...a?{backendResult:a}:{},...eM(!1===e?"Keyboard already hidden":"Keyboard dismissed")}}return{kind:"keyboardState",action:n,state:l3(r)?r:{},...a?{backendResult:a}:{}}},d1=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(lf(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=l5(await e.backend.setClipboard(lf(e,t),t.text));return{kind:"clipboardUpdated",action:"write",textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...eM("Clipboard updated")}},d2=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=l5(await e.backend.openSettings(lf(e,t),n));return{kind:"settingsOpened",...n?{target:n}:{},...r?{backendResult:r}:{},...eM(n?`Opened settings: ${n}`:"Opened settings")}},d3=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:i4(t.timeoutMs,"timeoutMs",0,12e4),a=await e.backend.handleAlert(lf(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}:{},...eM(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}:{},...eM(o.handled?`Alert ${i}ed`:"No alert handled")}},d5=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new y("UNSUPPORTED_OPERATION","system.appSwitcher is not supported by this backend");let n=l5(await e.backend.openAppSwitcher(lf(e,t)));return{kind:"appSwitcherOpened",...n?{backendResult:n}:{},...eM("Opened app switcher")}},d4=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=l8(e.app,"app"),r=l8(e.appId,"appId"),a=l8(e.bundleId,"bundleId"),i=l8(e.packageName,"packageName"),o=l8(e.url,"url"),s=l8(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=dt(await e.backend.openApp(de(e,t),r,{relaunch:t.relaunch}));return{kind:"appOpened",target:r,relaunch:!0===t.relaunch,...a?{backendResult:a}:{},...eM(`Opened: ${(n=r).app??n.appId??n.bundleId??n.packageName??n.url??n.activity??"app"}`)}},d8=async(e,t={})=>{if(!e.backend.closeApp)throw new y("UNSUPPORTED_OPERATION","apps.close is not supported by this backend");let n=l8(t.app,"app"),r=dt(await e.backend.closeApp(de(e,t),n));return{kind:"appClosed",...n?{app:n}:{},...r?{backendResult:r}:{},...eM(n?`Closed: ${n}`:"Closed app")}},d6=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(de(e,t),t.filter??"all")}},d9=async(e,t)=>{if(!e.backend.getAppState)throw new y("UNSUPPORTED_OPERATION","apps.state is not supported by this backend");let n=l6(t.app,"app"),r=await e.backend.getAppState(de(e,t),n);return{kind:"appState",app:n,state:r}},d7=async(e,t)=>{if(!e.backend.pushFile)throw new y("UNSUPPORTED_OPERATION","apps.push is not supported by this backend");let n=l6(t.app,"app"),r=await l9(e,t.input);try{let a=await e.backend.pushFile(de(e,t),r.backendInput,n),i=dt(a);return{kind:"appPushed",app:n,inputKind:r.inputKind,...i?{backendResult:i}:{},...eM(`Pushed to ${n}`)}}finally{await r.cleanup?.()}},ue=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=l6(e,"name");if(!l4.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&&l7(n,r,8192);let i=dt(await e.backend.triggerAppEvent(de(e,t),{name:a,...t.payload?{payload:t.payload}:{}}));return{kind:"appEventTriggered",name:a,...t.payload?{payload:t.payload}:{},...i?{backendResult:i}:{},...eM(`Triggered app event: ${a}`)}},ut=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(lf(e,t),t.filter)}},un=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=ds(e.id,"target.id"),n=ds(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=du(await e.backend.bootDevice(lf(e,t),n));return{kind:"deviceBooted",...n?{target:n}:{},...r?{backendResult:r}:{},...eM("Booted device")}},ur=async(e,t)=>{if(!e.backend.ensureSimulator)throw new y("UNSUPPORTED_OPERATION","admin.ensureSimulator is not supported by this backend");let n=dl(t.device,"device");return{kind:"simulatorEnsured",...await e.backend.ensureSimulator(lf(e,t),{device:n,...t.runtime?{runtime:dl(t.runtime,"runtime")}:{},...void 0!==t.boot?{boot:t.boot}:{},...void 0!==t.reuseExisting?{reuseExisting:t.reuseExisting}:{}})}},ua=async(e,t)=>await dn(e,t,"install"),ui=async(e,t)=>await dn(e,t,"reinstall"),uo=async(e,t)=>await dn(e,t,"installFromSource"),us=async(e,t)=>{let n=dc(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 sm(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:i4(i.fps,"fps",1,60),c=void 0===i.quality?void 0:i4(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,lf(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}:{},...dp(s,l,d,{startKind:"recordingStarted",stopKind:"recordingStopped",startMessage:"Recording started",stopMessage:"Recording stopped"})}}catch(e){throw await a?.cleanup?.(),e}},ul=async(e,t)=>{let n=dc(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 sm(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,lf(e,t),l),u=await a?.publish();return i=n,o=d,s=u,{..."string"==typeof o.outPath?{outPath:o.outPath}:{},...dp(i,o,s,{startKind:"traceStarted",stopKind:"traceStopped",startMessage:"Trace started",stopMessage:"Trace stopped"})}}catch(e){throw await a?.cleanup?.(),e}},ud=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 dS(e,t),{...dN(r=t,100,500,"logs limit"),...void 0!==r.levels?{levels:dk(r.levels,"levels")}:{},...void 0!==r.search?{search:dM(r.search,"search")}:{},...void 0!==r.source?{source:dM(r.source,"source")}:{}})).redacted,{kind:"diagnosticsLogs",entries:n.entries.map(e=>{let t=dA(e.message,4096),n=dv(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}:{}}},uu=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={...dN(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 dS(e,t),o),r=o.include??"summary",i=!0===n.redacted,{kind:"diagnosticsNetwork",entries:n.entries.map(e=>{var t;let n=e.url?dw(t=e.url)??dA(t,2048):void 0,a="headers"===r||"all"===r?dy(e.requestHeaders):void 0,o="headers"===r||"all"===r?dy(e.responseHeaders):void 0,s="body"===r||"all"===r?db(e.requestBody):void 0,l="body"===r||"all"===r?db(e.responseBody):void 0,d=dv(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}:{}}},uc=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 dS(e,t),{...d_(r=t),...void 0!==r.sampleMs?{sampleMs:i4(r.sampleMs,"sampleMs",100,6e4)}:{},...void 0!==r.metrics?{metrics:dk(r.metrics,"metrics",20)}:{}})).redacted,{kind:"diagnosticsPerf",metrics:n.metrics.map(e=>{let t=dA(e.message,4096),n=dv(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 up(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??function(e=[]){let t=new Map(e.map(e=>[e.name,uf(e)]));return{get:e=>uf(t.get(e)),set:e=>{t.set(e.name,uf(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>uf(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=>dE(t,e),diffScreenshot:e=>dD(t,e),snapshot:e=>dO(t,e),diffSnapshot:e=>dC(t,e)},selectors:{find:e=>dR(t,e),get:e=>dP(t,e),getText:(e,n={})=>dT(t,{...n,target:e}),getAttrs:(e,n={})=>dL(t,{...n,target:e}),is:e=>d$(t,e),isVisible:(e,n={})=>dF(t,{...n,target:e}),isHidden:(e,n={})=>dU(t,{...n,target:e}),wait:e=>dG(t,e),waitForText:(e,n={})=>dV(t,{...n,text:e})},interactions:{click:(e,n={})=>dB(t,{...n,target:e}),press:(e,n={})=>dj(t,{...n,target:e}),fill:(e,n,r={})=>dq(t,{...r,target:e,text:n}),typeText:(e,n={})=>dX(t,{...n,text:e}),focus:(e,n={})=>dH(t,{...n,target:e}),longPress:(e,n={})=>dK(t,{...n,target:e}),swipe:e=>dz(t,e),scroll:e=>dY(t,e),pinch:e=>dW(t,e)},system:{back:e=>dJ(t,e),home:e=>dZ(t,e),rotate:e=>dQ(t,e),keyboard:e=>d0(t,e),clipboard:e=>d1(t,e),settings:e=>d2(t,e),alert:e=>d3(t,e),appSwitcher:e=>d5(t,e)},apps:{open:e=>d4(t,e),close:e=>d8(t,e),list:e=>d6(t,e),state:e=>d9(t,e),push:e=>d7(t,e),triggerEvent:e=>ue(t,e)},admin:{devices:e=>ut(t,e),boot:e=>un(t,e),ensureSimulator:e=>ur(t,e),install:e=>ua(t,e),reinstall:e=>ui(t,e),installFromSource:e=>uo(t,e)},recording:{record:e=>us(t,e),trace:e=>ul(t,e)},observability:{logs:e=>ud(t,e),network:e=>uu(t,e),perf:e=>uc(t,e)}}}function uf(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 uh(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}function um(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 uw(e){let t=o7(e.session);if(t&&"android"===e.device.platform)return await uy(e,t);let n=await ug(e);return se(e.session),{snapshot:uA(n,uv(e)),analysis:n.analysis,androidSnapshot:n.androidSnapshot}}async function ug(e){let{device:t,session:n,flags:r,outPath:a,logPath:i,snapshotScope:o}=e;if("linux"===t.platform){let e=await i0(n?.surface);return ux({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?ux(await au(n.surface,{bundleId:"menubar"===n.surface?n.appBundleId:void 0}),{snapshotDepth:r?.snapshotDepth,snapshotInteractiveOnly:r?.snapshotInteractiveOnly,snapshotScope:o}):await oO(t,"snapshot",[],a,{...oZ(i,{...r,snapshotScope:o},n?.appBundleId,n?.trace?.outPath)})}async function uy(e,t){let n=await ub(e),r=uI(n,t,e),a=0,i=t.markedAt+1500;for(let o of o6){if(!r)break;let s=i-Date.now();if(s<=0)break;await Y(Math.min(o,s)),n=await ub(e),a+=1,r=uI(n,t,e)}return r||se(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 ub(e){let t=await ug(e);return{data:t,snapshot:uA(t,uv(e))}}function uv(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function uI(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&&st(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=sn(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 uA(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:eL(n));return{nodes:es(t?.snapshotScope&&e?.backend!=="macos-helper"?uS(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 ux(e,t){var n,r;let a=e.nodes??[];return t.snapshotScope&&(a=uS(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:uN(e.filter(e=>n.has(e.index)))}(a)),"number"==typeof t.snapshotDepth&&(n=a,r=t.snapshotDepth,a=uN(n.filter(e=>(e.depth??0)<=r))),{...e,nodes:a}}function uS(e,t){let n=eB(es(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 uN(i,a)}function uN(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 u_(e,t){let n;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return o8("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let r=ei(e.trim());if(!r)return o8("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=ea(e.nodes,r);if(n=t?ej(t,e.nodes):void 0)break}return n?{ok:!0,scope:n}:o8("COMMAND_FAILED",`Ref ${e} not found or has no label`)}async function uk(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,{session:i,device:o}=await so(a,n,t.flags);if(!oJ("snapshot",o))return o8("UNSUPPORTED_OPERATION","snapshot is not supported on this device");let s=u_(t.flags?.snapshotScope,i);return s.ok?await ss(i,o,async()=>{let e=uE({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 uD({req:t,sessionName:n,sessionStore:a,result:{nodes:l.nodes.length,truncated:l.truncated}}),{ok:!0,data:l}}):s}async function uM(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,{session:i,device:o}=await so(a,n,t.flags);if(!oJ("diff",o))return o8("UNSUPPORTED_OPERATION","diff is not supported on this device");let s=u_(t.flags?.snapshotScope,i);return s.ok?await ss(i,o,async()=>{let e=uE({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 uD({req:t,sessionName:n,sessionStore:a,result:{mode:"snapshot",baselineInitialized:l.baselineInitialized,summary:l.summary}}),{ok:!0,data:l}}):s}function uE(e){let{req:t,sessionName:n,logPath:r,sessionStore:a,session:i,device:o,snapshotScope:s}=e;return up({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 uw({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:um("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:uh()})}function uD(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 uO(e){let{device:t,node:n,flags:r,appBundleId:a,traceOutPath:i,surface:o,contextFromFlags:s}=e,l=eG(n),d=lL(n.rect);if(!d)return l;try{let e=await oO(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 er({level:"warn",phase:"interaction_read_fallback",data:{reason:"empty_backend_text",nodeRef:n.ref,surface:o,platform:t.platform}}),l}catch(e){return er({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 uC=[["snapshotDepth","--depth"],["snapshotScope","--scope"],["snapshotRaw","--raw"]];function uR(e,t){let n=function(e){if(!e)return[];let t=[];for(let[n,r]of uC)void 0!==e[n]&&t.push(r);return t}(t);return 0===n.length?null:o8("INVALID_ARGS",`${e} @ref does not support ${n.join(", ")}.`)}async function uP(e,t){let n=await uT(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 uT(e){var t;if("android"!==e.device.platform||!e.appBundleId)return null;let n=await L(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 uL(e){return"COMMAND_FAILED"===e.code&&"string"==typeof e.details?.expectedPackage&&"string"==typeof e.details?.foregroundPackage}function u$(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 uF(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 uU(e){return e.startsWith("@")?e.slice(1):e}async function uG(e){var t;let{req:n}=e;if("find"!==n.command)return null;let r=n.positionals??[];if(0===r.length)return o8("INVALID_ARGS","find requires a locator or text");let a=eZ(r);if(!a.query)return o8("INVALID_ARGS","find requires a value");if(n.flags?.findFirst&&n.flags?.findLast)return o8("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 uX(e,{requireSession:!1,capability:"find"});return o.ok?await uz(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 u$(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 uV(e){let{req:t}=e;if("get"!==t.command)return null;let n=t.positionals?.[0];if("text"!==n&&"attrs"!==n)return o8("INVALID_ARGS","get only supports text or attrs");let r=await uX(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:o8("INVALID_ARGS","get requires @ref or selector expression")}}(t);if(!a.ok)return a.response;if("ref"===a.target.kind){let e=uR("get",t.flags);if(e)return e}return await uz(async()=>{let i,o=await r.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:n,target:a.target});return u$(e.sessionStore,e.sessionName,t,function(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=uF(e),a=r?.kind==="ref"?uU(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=uF(o),{...i?.kind==="ref"?{ref:uU(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 uB(e){let{req:t}=e;if("is"!==t.command)return null;let n=(t.positionals?.[0]??"").toLowerCase();if(!ly(n))return o8("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text");let{split:r}=eV(t.positionals??[]);if(!r)return o8("INVALID_ARGS","is requires a selector expression");let a=r.rest.join(" ").trim();if("text"===n&&!a)return o8("INVALID_ARGS","is text requires expected text value");if("text"!==n&&r.rest.length>0)return o8("INVALID_ARGS",`is ${n} does not accept trailing values`);let i=await uX(e,{requireSession:!0,capability:"is"});if(!i.ok)return i.response;let o=await uz(async()=>{let o=await i.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:n,selector:r.selectorExpression,expectedText:a});return u$(e.sessionStore,e.sessionName,t,o),function(e){let{selectorChain:t,...n}=e;return n}(o)});return await uY(e,o,`is ${n}`)}async function uj(e){let{req:t,sessionName:n,sessionStore:r}=e,a=si(t.positionals??[]);if(!a)return o8("INVALID_ARGS","wait requires a duration or text");let{session:i,device:o}=await so(r,n,t.flags);if("sleep"!==a.kind&&!oJ("wait",o))return o8("UNSUPPORTED_OPERATION","wait is not supported on this device");let s=async()=>{let s=uq({...e,session:i,device:o}),l=await uz(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 u$(r,n,t,e),{waitedMs:e.waitedMs,..."string"==typeof e.text?{text:e.text}:{},..."string"==typeof e.selector?{selector:e.selector}:{}}});return await uY(e,l,"wait")};return"sleep"===a.kind?await s():await ss(i,o,s)}function uq(e){return up({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&&!o7(r))return t;let m=await uw({device:a,session:r,flags:p,outPath:n.flags?.out,logPath:i??"",snapshotScope:f});return r&&(sr(r,m.snapshot),s.set(o,r)),l=h,t={snapshot:m.snapshot}},readText:async(t,o)=>({text:await uO({device:a,node:o,flags:n.flags,appBundleId:r?.appBundleId,traceOutPath:r?.trace?.outPath,surface:r?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>oZ(i??"",e,t,n))})}),findText:async(t,n)=>({found:await uH(e,n)})}}(e),artifacts:um("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&&(sr(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}},policy:uh()})}async function uX(e,t){let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:o8("SESSION_NOT_FOUND","No active session. Run open first.")};let r=n?.device??await oN(e.req.flags??{});return(n||await o1(r),oJ(t.capability,r))?{ok:!0,runtime:uq({...e,session:n,device:r})}:{ok:!1,response:o8("UNSUPPORTED_OPERATION",`${t.capability} is not supported on this device`)}}async function uH(e,t){let{device:n,session:r,req:a,logPath:i}=e;if("macos"===n.platform&&r?.surface&&"app"!==r.surface)return!!eB((await uK(e)).nodes,t);if(tO(n.platform)){let e=await nA(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!!eB((await uK(e)).nodes,t)}async function uK(e){let t=await uw({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&&(sr(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session)),t.snapshot}async function uz(e){try{return{ok:!0,data:await e()}}catch(t){let e=w(t);return o8(e.code,e.message,e.details)}}async function uY(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 uT(i)}catch{return t}return a?o8(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 uW=new Set(["snapshot","diff","wait","alert","settings"]);async function uJ(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,i=t.command;if(!uW.has(i))return null;if("snapshot"===i)return await uk({req:t,sessionName:n,logPath:r,sessionStore:a});if("diff"===i)return t.positionals?.[0]!=="snapshot"?o8("INVALID_ARGS","diff currently supports only: diff snapshot"):await uM({req:t,sessionName:n,logPath:r,sessionStore:a});if("wait"===i)return await uj({req:t,sessionName:n,logPath:r,sessionStore:a});if("alert"===i){let{session:e,device:i}=await so(a,n,t.flags);return await ss(e,i,async()=>await sd({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}}:o8("INVALID_ARGS",eS));if(!s.ok)return s;let{session:l,device:d}=await so(a,n,t.flags);return await ss(l,d,async()=>await sc({req:t,logPath:r,sessionStore:a,session:l,device:d,parsed:s.parsed}))}return null}export{closeAndroidApp,dismissAndroidKeyboard,ensureAdb,getAndroidAppState,getAndroidKeyboardState,inferAndroidAppName,installAndroidApp,installAndroidInstallablePathAndResolvePackageName,listAndroidApps,openAndroidApp,openAndroidDevice,readAndroidClipboardText,reinstallAndroidApp,resolveAndroidApp,writeAndroidClipboardText}from"./8809.js";export{rB as IOS_DEVICECTL_DEFAULT_HINT,tJ as IOS_RUNNER_CONTAINER_BUNDLE_IDS,rC as IOS_SIMCTL_LIST_TIMEOUT_MS,nm as abortAllIosRunnerSessions,re as appSwitcherAndroid,uP as assertAndroidPressStayedInApp,n6 as backAndroid,nR as buildMobileSnapshotPresentation,nS as buildScrollGesturePlan,tn as buildSimctlArgs,tr as buildSimctlArgsForDevice,lr as buildSnapshotDisplayLines,uA as buildSnapshotState,i3 as buttonTag,uw as captureSnapshot,ug as captureSnapshotData,e6 as clearRequestCanceled,a8 as closeIosApp,oZ as context_contextFromFlags,up as createAgentDevice,te as createRequestCanceledError,um as createUnsupportedArtifactAdapter,sp as decodePng,oO as dispatchCommand,uG as dispatchFindReadOnlyViaRuntime,uV as dispatchGetViaRuntime,uB as dispatchIsViaRuntime,nC as displayNodeLabel,o1 as ensureDeviceReady,o8 as errorResponse,ri as fillAndroid,om as findBootableIosSimulator,ra as focusAndroid,la as formatSnapshotLine,o7 as getActiveAndroidSnapshotFreshness,rl as getAndroidScreenSize,i2 as getClickButtonValidationError,e7 as getRequestSignal,nc as getRunnerSessionSnapshot,uJ as handleSnapshotCommands,n9 as homeAndroid,a9 as installIosApp,ie as installIosInstallablePath,uL as isAndroidEscapeError,tO as isApplePlatform,oJ as isCommandSupportedOnDevice,st as isNavigationSensitiveAction,e9 as isRequestCanceled,ov as listAppleDevices,io as listIosApps,rG as listIosDeviceApps,rV as listIosDeviceProcesses,uh as localCommandPolicy,rt as longPressAndroid,o9 as markAndroidSnapshotFreshness,e8 as markRequestCanceled,tC as matchesPlatformSelector,tD as normalizePlatformSelector,a5 as openIosApp,a4 as openIosDevice,ot as parseDeviceRotation,si as parseWaitArgs,tF as parseXmlDocumentSync,rZ as prepareIosInstallArtifact,n4 as pressAndroid,rN as pushAndroidNotification,ia as pushIosNotification,n0 as readAndroidTextAtPoint,rJ as readInfoPlistString,it as readIosClipboardText,uO as readTextForNode,uR as refSnapshotFlagGuardResponse,e4 as registerRequestAbort,a7 as reinstallIosApp,tR as resolveAppleSimulatorSetPathForSelector,i1 as resolveClickButton,ao as resolveFrontmostMacOsApp,a3 as resolveIosApp,rj as resolveIosDevicectlHint,i9 as resolvePayloadInput,e5 as resolveRequestTrackingId,oN as resolveTargetDevice,n7 as rotateAndroid,nA as runIosRunnerCommand,ad as runMacOsAlertAction,rk as screenshotAndroid,aG as screenshotIos,rs as scrollAndroid,ry as setAndroidSetting,ii as setIosSetting,sr as setSessionSnapshot,rY as shutdownSimulator,rz as ensureBootedSimulator,nB as snapshotAndroid,nw as stopAllIosRunnerSessions,nh as stopIosRunnerSession,n8 as swipeAndroid,rn as typeAndroid,tE as withKeyedLock,oM as withTargetDeviceResolutionScope,ir as writeIosClipboardText};