agent-device 0.16.12 → 0.16.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/android-multitouch-helper/README.md +2 -2
  2. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.13.apk +0 -0
  3. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.13.apk.sha256 +1 -0
  4. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.16.12.manifest.json → agent-device-android-multitouch-helper-0.16.13.manifest.json} +4 -4
  5. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.16.12.apk → agent-device-android-snapshot-helper-0.16.13.apk} +0 -0
  6. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.13.apk.sha256 +1 -0
  7. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.16.12.manifest.json → agent-device-android-snapshot-helper-0.16.13.manifest.json} +6 -6
  8. package/dist/src/1352.js +1 -1
  9. package/dist/src/2415.js +28 -28
  10. package/dist/src/9471.js +1 -1
  11. package/dist/src/9533.js +1 -1
  12. package/dist/src/9542.js +2 -2
  13. package/dist/src/android-adb.d.ts +7 -0
  14. package/dist/src/android-snapshot-helper.d.ts +7 -0
  15. package/dist/src/android.js +5 -5
  16. package/dist/src/args.js +2 -2
  17. package/dist/src/find.js +1 -1
  18. package/dist/src/selector-runtime.js +1 -1
  19. package/dist/src/session.js +11 -9
  20. package/dist/src/snapshot.js +2 -2
  21. package/package.json +1 -1
  22. package/server.json +2 -2
  23. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.12.apk +0 -0
  24. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.12.apk.sha256 +0 -1
  25. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.12.apk.sha256 +0 -1
package/dist/src/2415.js CHANGED
@@ -1,31 +1,31 @@
1
- import{__webpack_require__ as e}from"./rslib-runtime.js";import t,{createHash as r}from"node:crypto";import n from"node:path";import i,{existsSync as a,promises as o}from"node:fs";import s from"node:http";import{fileURLToPath as l,pathToFileURL as d}from"node:url";import"node:https";import c from"node:os";import{once as u}from"node:events";import{Transform as p}from"node:stream";import{pipeline as f}from"node:stream/promises";import{AsyncLocalStorage as m}from"node:async_hooks";import h from"node:fs/promises";import w from"node:net";import{resolveUserPath as g}from"./3267.js";import{appendScreenshotScriptFlags as v,screenshotOptionsFromFlags as y,screenshotFlagsFromOptions as S,SCREENSHOT_ACTION_FLAG_KEYS as _}from"./5310.js";import{withDiagnosticsScope as I,getDiagnosticsMeta as b,flushDiagnosticsToSessionFile as A,withDiagnosticTimer as x,emitDiagnostic as N}from"./7599.js";import{readProcessStartTime as M,readProcessCommand as E,resolveRuntimeTransportHints as D,isProcessGroupAlive as k,isAgentDeviceDaemonProcess as P,isProcessAlive as C}from"./8656.js";import{toAppErrorCode as R,asAppError as O,normalizeError as T,AppError as L}from"./9152.js";import{runCmdBackground as $,runCmdStreaming as F,runCmd as U,resolveExecutableOverridePath as G,whichCmd as q}from"./9818.js";import{consumeTextLines as j,serializeDaemonResponseEnvelope as V,normalizeTenantId as B,shouldStreamRequestProgress as H,resolveDaemonPaths as K,resolveSessionIsolationMode as W,shellQuoteIfNeeded as z,resolveDaemonServerMode as J,resolveDaemonCodeSignature as X,serializeDaemonProgressEnvelope as Z,serializeDaemonRpcResponseEnvelope as Y}from"./9238.js";import{runAndroidAdb as Q,resolveIosSimulatorDeviceSetPath as ee,getAndroidBlockingDialogFocus as et,withRetry as er,Deadline as en,isEnvTruthy as ei,openAndroidApp as ea,classifyBootFailure as eo,streamAndroidLogcatWithAdb as es,bootFailureHint as el,androidDeviceForSerial as ed,parseSerialAllowlist as ec,retryWithPolicy as eu,getAndroidAppState as ep,classifyAndroidAppTarget as ef,captureAndroidLogcatWithAdb as em,resolveAndroidSerialAllowlist as eh,isDeepLinkTarget as ew,formatAndroidInstalledPackageRequiredMessage as eg}from"./8806.js";import{PUBLIC_COMMANDS as ev,DAEMON_COMMAND_GROUPS as ey,GESTURE_SUBCOMMAND_ERROR as eS}from"./5792.js";import{findMistargetedTypeRefToken as e_,buildSwipePresetGesturePlan as eI,analyzeReactNativeOverlay as eb,parseScrollDirection as eA,isKeyboardAction as ex,isSystemScrollIndicatorLabel as eN,isReactNativeCollapsedWarningWrapperWithVisibleBanner as eM,formatScrollEdgeMessage as eE,deriveMobileSnapshotHiddenContentHints as eD,inferVerticalScrollIndicatorDirections as ek,captureScrollEdgeState as eP,normalizeSnapshotTree as eC,isReactNativeCollapsedWarningWrapperCandidate as eR,PNG as eO,createAgentDevice as eT,runScrollEdgePasses as eL,requireIntInRange as e$,inferGestureReferenceFrame as eF,localCommandPolicy as eU,decodePng as eG,buildScrollGesturePlan as eq,parseSwipePreset as ej}from"./9533.js";import{sleep as eV}from"./4829.js";import{readLocationCoordinate as eB,successText as eH,withSuccessText as eK,parseDeviceRotation as eW}from"./1998.js";import{findNearestAncestor as ez,normalizeType as eJ,pruneGroupNodes as eX,findNodeByLabel as eZ,resolveRefLabel as eY}from"./940.js";import{snapshotPresentationOptionsFromFlags as eQ,normalizeRef as e0,findNodeByRef as e1,buildSnapshotPresentationKey as e2,centerOfRect as e3,attachRefs as e4}from"./4057.js";import{isScrollableType as e5}from"./4778.js";import{readVersion as e8,findProjectRoot as e6}from"./9671.js";import{resolveAndroidAdbProvider as e9,resolveAndroidAdbExecutor as e7}from"./9639.js";import{parseUiHierarchy as te,ensureAndroidSnapshotHelper as tt,parseUiHierarchyTree as tr,captureAndroidSnapshotWithHelper as tn,captureAndroidSnapshotWithHelperSession as ti,parseAndroidSnapshotHelperManifest as ta,forgetAndroidSnapshotHelperInstall as to,buildUiHierarchySnapshot as ts,stopAndroidSnapshotHelperSession as tl}from"./221.js";import{applyCommandDefaults as td}from"./1352.js";var tc={};e.r(tc),e.d(tc,{IH:()=>c3,ug:()=>c4,sE:()=>cJ,Bx:()=>cX,WX:()=>c2,Co:()=>cY,wg:()=>c1,withAppLogProvider:()=>cK});var tu={};e.r(tu),e.d(tu,{IO:()=>iU,LB:()=>iF,xY:()=>iq,eN:()=>iG,runMacOsPressAction:()=>iB,runMacOsReadTextAction:()=>iV,rR:()=>iH,r5:()=>ij});var tp={};e.r(tp),e.d(tp,{bu:()=>l6,abortAllIosRunnerSessions:()=>dH,hv:()=>dq,gE:()=>d9,runIosRunnerCommand:()=>d6,stopAllIosRunnerSessions:()=>dK,yA:()=>dB});var tf={};e.r(tf),e.d(tf,{vy:()=>d1,My:()=>d3,Ms:()=>d2,withAppleRunnerProvider:()=>d5});var tm={};e.r(tm),e.d(tm,{ensureBootedSimulator:()=>c6,SA:()=>c7,EB:()=>c5,N3:()=>c9});var th={};e.r(th),e.d(th,{qx:()=>iy,Ly:()=>iI,Gr:()=>ig,vT:()=>iS,Cc:()=>i_,withAppleToolProvider:()=>iv});var tw={};e.r(tw),e.d(tw,{readLinuxTextAtPoint:()=>at,r:()=>ae});var tg={};function tv(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}e.r(tg),e.d(tg,{uK:()=>iJ,nE:()=>iZ,withLinuxToolProvider:()=>iX});let ty=["platform","device","udid","serial","out","verbose","metroHost","metroPort","bundleUrl","launchUrl","snapshotInteractiveOnly","snapshotCompact","snapshotDepth","snapshotScope","snapshotRaw",..._,"relaunch","saveScript","noRecord","fps","quality","hideTouches","count","intervalMs","delayMs","holdMs","jitterPx","doubleTap","clickButton","pauseMs","pattern"];function tS(e){let t=e.result?.text;if("string"==typeof t&&t.trim().length>0)return t;let r=e.positionals??[];if(0===r.length)return"";let n=r[0];return n?.startsWith("@")?r.length>=3?r.slice(2).join(" ").trim():r.slice(1).join(" ").trim():!(r.length>=3)||Number.isNaN(Number(r[0]))||Number.isNaN(Number(r[1]))?r.slice(1).join(" ").trim():r.slice(2).join(" ").trim()}function t_(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}let tI=/^-?\d+(\.\d+)?$/,tb=/^[^\s"\\]+$/,tA=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),tx=new Map([["--count","count"],["--pause-ms","pauseMs"]]),tN=new Map([["--delay-ms","delayMs"]]);function tM(e){return"click"===e||"press"===e}function tE(e){return tM(e)||"longpress"===e}function tD(e){return"type"===e||"fill"===e}function tk(e){return tC(e,tR)}function tP(e){return JSON.stringify(e)}function tC(e,t){return t(e)?e:tP(e)}function tR(e){return tO(e)&&e.startsWith("@")||tI.test(e)}function tO(e){return tb.test(e)}function tT(e){let t=(e.positionals??[]).map(e=>tk(e));return[e.command,...t].join(" ")}function tL(e,t){let r=t.flags??{};if(tM(t.command)){"number"==typeof r.count&&e.push("--count",String(r.count)),"number"==typeof r.intervalMs&&e.push("--interval-ms",String(r.intervalMs)),"number"==typeof r.holdMs&&e.push("--hold-ms",String(r.holdMs)),"number"==typeof r.jitterPx&&e.push("--jitter-px",String(r.jitterPx)),!0===r.doubleTap&&e.push("--double-tap");let t=r.clickButton;t&&"primary"!==t&&e.push("--button",t);return}if("swipe"===t.command){"number"==typeof r.count&&e.push("--count",String(r.count)),"number"==typeof r.pauseMs&&e.push("--pause-ms",String(r.pauseMs)),("one-way"===r.pattern||"ping-pong"===r.pattern)&&e.push("--pattern",r.pattern);return}tD(t.command)&&"number"==typeof r.delayMs&&e.push("--delay-ms",String(r.delayMs))}function t$(e,t){t&&(("ios"===t.platform||"android"===t.platform)&&e.push("--platform",t.platform),"string"==typeof t.metroHost&&t.metroHost.length>0&&e.push("--metro-host",tC(t.metroHost,tO)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",tC(t.bundleUrl,tO)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",tC(t.launchUrl,tO)))}function tF(e,t){let r=[],n={},i=tM(e)?tA:"swipe"===e?tx:tD(e)?tN:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(tM(e)&&"--double-tap"===o){n.doubleTap=!0;continue}let s=t[a+1];if(tM(e)&&"--button"===o&&void 0!==s){("primary"===s||"secondary"===s||"middle"===s)&&(n.clickButton=s),a+=1;continue}let l=i?.get(o);if(l&&void 0!==s){let e=tG(s);if(null!==e){n[l]=e,a+=1;continue}}if("swipe"===e&&"--pattern"===o&&void 0!==s){("one-way"===s||"ping-pong"===s)&&(n.pattern=s),a+=1;continue}r.push(o)}return{positionals:r,flags:n}}function tU(e){let t=[],r={};for(let n=0;n<e.length;n+=1){let i=e[n],a=e[n+1];if("--platform"===i&&void 0!==a){("ios"===a||"android"===a)&&(r.platform=a),n+=1;continue}if("--metro-host"===i&&void 0!==a){r.metroHost=a,n+=1;continue}if("--metro-port"===i&&void 0!==a){let e=tG(a);null!==e&&(r.metroPort=e),n+=1;continue}if("--bundle-url"===i&&void 0!==a){r.bundleUrl=a,n+=1;continue}if("--launch-url"===i&&void 0!==a){r.launchUrl=a,n+=1;continue}t.push(i)}return{positionals:t,flags:r}}function tG(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function tq(e){var t;let r=[],n={};for(let t of e){if("--relaunch"===t){n.relaunch=!0;continue}r.push(t)}let i=tU(r);return{positionals:i.positionals,flags:n,runtime:(t=i.flags).platform||t.metroHost||void 0!==t.metroPort||t.bundleUrl||t.launchUrl?i.flags:void 0}}function tj(e,t={}){let r=[e.command];if("snapshot"===e.command)e.flags?.snapshotInteractiveOnly&&r.push("-i"),e.flags?.snapshotCompact&&r.push("-c"),"number"==typeof e.flags?.snapshotDepth&&r.push("-d",String(e.flags.snapshotDepth)),e.flags?.snapshotScope&&r.push("-s",tk(e.flags.snapshotScope)),e.flags?.snapshotRaw&&r.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])r.push(tk(t));e.flags?.relaunch&&r.push("--relaunch"),t$(r,e.runtime)}else if("runtime"===e.command)!function(e,t,r={}){let n=t.positionals??[];for(let t of r.includeAllPositionals?n:n.slice(0,1))e.push(tC(t,tO));t$(e,t.flags)}(r,e,{includeAllPositionals:t.runtimeIncludeAllPositionals});else if("record"===e.command)!function(e,t){let[r,...n]=t.positionals??[];for(let t of(r&&e.push(tC(r,tO)),n))e.push(tk(t));"number"==typeof t.flags?.fps&&e.push("--fps",String(t.flags.fps)),"number"==typeof t.flags?.quality&&e.push("--quality",String(t.flags.quality)),t.flags?.hideTouches&&e.push("--hide-touches")}(r,e);else if("screenshot"===e.command){for(let t of e.positionals??[])r.push(tk(t));v(r,e.flags)}else{for(let t of e.positionals??[])r.push(tk(t));tL(r,e)}return r.join(" ")}class tV{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let r=n.dirname(t);i.existsSync(r)||i.mkdirSync(r,{recursive:!0});let a=function(e){var t=e,r=function(e){let t=[];for(let r of e.actions){if("snapshot"===r.command)continue;let n=function(e){let t=function(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>"string"==typeof e)?e.result.selectorChain:[];return t.length>0?t.join(" || "):void 0}(e);if(t&&tB(e.command))return tM(e.command)?{...e,positionals:[t]}:"longpress"===e.command?function(e,t){let r="number"==typeof e.result?.durationMs?String(e.result.durationMs):function(e){let t=e.at(-1);if(!(e.length<=1)&&void 0!==t&&""!==t.trim())return Number.isFinite(Number(t))?t:void 0}(e.positionals??[]);return{...e,positionals:r?[t,r]:[t]}}(e,t):"fill"===e.command?function(e,t){let r=tS(e);return r.length>0?{...e,positionals:[t,r]}:void 0}(e,t):function(e,t){let r=e.positionals?.[0];return"text"===r||"attrs"===r?{...e,positionals:[r,t]}:void 0}(e,t)}(r);if(n){t.push(n);continue}let i=function(e,t){if(!tB(t.command))return;let r=t.result?.refLabel;if("string"!=typeof r||0===r.trim().length)return;let n=r.trim();return{ts:t.ts,command:"snapshot",positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotCompact:!0,snapshotScope:n},result:{scope:n}}}(e,r);i&&t.push(i),t.push(r)}return t}(e);let n=[],i=t.device.kind?` kind=${t.device.kind}`:"";for(let e of(n.push(`context platform=${t.device.platform} device=${tP(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,tM(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(tk(r)),tH(e,t),tL(e,t),e.join(" ");if(1===t.positionals.length)return e.push(tk(r)),tL(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(tk(r)),tH(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(tk(n)),tL(e,t),e.join(" ")}(t,r):"get"===r.command?function(e,t){let r=t.positionals?.[0],n=t.positionals?.[1];if(r&&n)return e.push(tk(r)),e.push(tk(n)),n.startsWith("@")&&tH(e,t),e.join(" ")}(t,r):void 0);return n||tj(e)}(e));return`${n.join("\n")}
2
- `}(e);return i.writeFileSync(t,a),{written:!0,path:t}}catch(r){return N({level:"warn",phase:"session_script_write_failed",data:{session:e.name,path:t,error:r instanceof Error?r.message:String(r)}}),{written:!1}}}resolveScriptPath(e){if(e.saveScriptPath)return g(e.saveScriptPath,{cwd:void 0});i.existsSync(this.sessionsDir)||i.mkdirSync(this.sessionsDir,{recursive:!0});let t=tv(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return n.join(this.sessionsDir,`${t}-${r}.ad`)}}function tB(e){return tE(e)||"fill"===e||"get"===e}function tH(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(tk(r))}class tK{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new tV(e)}get(e){return this.sessions.get(e)}set(e,t){this.sessions.set(e,t)}delete(e){return this.runtimeHints.delete(e),this.sessions.delete(e)}values(){return this.sessions.values()}toArray(){return Array.from(this.sessions.values())}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){this.runtimeHints.set(e,t)}clearRuntimeHints(e){return this.runtimeHints.delete(e)}recordAction(e,t){t.flags?.noRecord||(t.flags?.saveScript&&(e.recordSession=!0,"string"==typeof t.flags.saveScript&&(e.saveScriptPath=g(t.flags.saveScript,{cwd:void 0}))),e.actions.push({ts:Date.now(),command:t.command,positionals:t.positionals,runtime:t.runtime,flags:function(e){if(!e)return{};let t={};for(let r of ty)void 0!==e[r]&&(t[r]=e[r]);return t}(t.flags),result:t.result}),N({level:"debug",phase:"record_action",data:{command:t.command,session:e.name}}))}writeSessionLog(e){let t=this.scriptWriter.write(e);t.written&&N({level:"info",phase:"session_script_written",data:{session:e.name,path:t.path}})}defaultTracePath(e){let t=tv(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return n.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return n.join(this.sessionsDir,tv(e))}ensureSessionDir(e){let t=this.resolveSessionDir(e);return i.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return n.join(this.resolveSessionDir(e),"app.log")}resolveAppLogPidPath(e){return n.join(this.resolveSessionDir(e),"app-log.pid")}static expandHome(e,t){return g(e,{cwd:t})}}let tW="app-log.pid";function tz(e){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t))return{pid:Number.parseInt(t,10)};try{let e=JSON.parse(t);if(!Number.isInteger(e.pid)||e.pid<=0)return null;return e}catch{return null}}function tJ(e,t){if(!e)return;let r=n.dirname(e);i.existsSync(r)||i.mkdirSync(r,{recursive:!0});let a={pid:t,startTime:M(t)??void 0,command:E(t)??void 0};i.writeFileSync(e,`${JSON.stringify(a)}
3
- `)}function tX(e){if(e&&i.existsSync(e))try{i.unlinkSync(e)}catch{}}let tZ=new Set,tY=new Map,tQ="request_canceled",t0="request canceled";function t1(e,t){if("string"==typeof e&&e.length>0)return e;let r=("string"==typeof t?t:"number"==typeof t&&Number.isFinite(t)?String(t):"generated").trim().replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,32)||"generated",n=Math.random().toString(36).slice(2,10);return`req:${r}:${process.pid}:${Date.now()}:${n}`}function t2(e){if(!e)return;!function(e){if(e.size<=5e4)return;let t=0;for(let r of e.keys()){if(t>=1e4)break;e.delete(r),t++}}(tY);let t=new AbortController;tY.set(e,t),tZ.has(e)&&t.abort()}function t3(e){e&&(!function(e){if(e.size<=5e4)return;let t=0;for(let r of e){if(t>=1e4)break;e.delete(r),t++}}(tZ),tZ.add(e),tY.get(e)?.abort())}function t4(e){e&&(tZ.delete(e),tY.delete(e))}function t5(e){return!!e&&tZ.has(e)}function t8(e){if(e)return tY.get(e)?.signal}function t6(){return new L("COMMAND_FAILED",t0,{reason:tQ})}function t9(e){if(t5(e))throw t6()}function t7(e){return e instanceof L&&"COMMAND_FAILED"===e.code&&(e.details?.reason===tQ||e.message===t0)}let re=new Map;function rt(e){let r=t.randomUUID(),n=setTimeout(()=>{rr(r)},9e5);return n.unref(),re.set(r,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),r}function rr(e){let t=re.get(e);if(t&&(clearTimeout(t.timer),re.delete(e),t.deleteAfterDownload))try{i.rmSync(t.artifactPath,{force:!0})}catch{}}let rn=new Map;function ri(e,t){let r=rn.get(e);if(!r)throw new L("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new L("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function ra(e){let t=rn.get(e);t&&(clearTimeout(t.timer),rn.delete(e),i.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function ro(e){let t=await rs(e);await U("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=n.join(e.tempDir,t);if(!i.existsSync(r))throw new L("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function rs(e){let t=await U("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new L("INVALID_ARGS","Artifact is not a valid tar archive",{archivePath:e.archivePath,stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let r=t.stdout.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(0===r.length)throw new L("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(rl),i=e.expectedRootName??function(e,t){let r=new Set;for(let t of e){let[e]=t.split("/");e&&r.add(e)}let n=[...r];if("ios"===t){let e=n.filter(e=>e.toLowerCase().endsWith(".app")),t=e[0];if(void 0!==t&&1===e.length)return t;if(0===e.length)throw new L("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new L("INVALID_ARGS",`iOS app bundle archives must contain exactly one top-level .app directory, found: ${e.join(", ")}`)}let i=n[0];if(void 0!==i&&1===n.length)return i;throw new L("INVALID_ARGS",`Archive must contain a single top-level bundle, found: ${n.join(", ")}`)}(n,e.platform);if(!n.some(e=>e===i||e.startsWith(`${i}/`)))throw new L("INVALID_ARGS",`Uploaded archive must contain a top-level "${i}" bundle`);for(let e of n){var a=e,o=i;if(a!==o&&!a.startsWith(`${o}/`))throw new L("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await U("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new L("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rl(e){if(e.includes("\0"))throw new L("INVALID_ARGS",`Invalid archive entry: ${e}`);if(n.posix.isAbsolute(e))throw new L("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=n.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new L("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function rd(e,t){return new Promise((r,n)=>{let a,o=!1,s=0,l=i.createWriteStream(t),d=e=>{if(!o){if(o=!0,a&&clearTimeout(a),e)return void rc(l,t).finally(()=>n(e));r()}},c=()=>{a&&clearTimeout(a),a=setTimeout(()=>{let t=new L("COMMAND_FAILED","Artifact transfer timed out due to inactivity",{timeoutMs:6e4});"destroy"in e&&"function"==typeof e.destroy&&e.destroy(t),u.destroy(t),d(t)},6e4)},u=new p({transform(e,t,r){c();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new L("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{d(new L("COMMAND_FAILED","Artifact transfer was interrupted"))}),c(),f(e,u,l).then(()=>d(),e=>d(e))})}async function rc(e,t){if(e.destroy(),!e.closed)try{await u(e,"close")}catch{}await i.promises.rm(t,{force:!0}).catch(()=>{})}async function ru(e){let t,r=e.headers["x-artifact-type"],a=e.headers["x-artifact-filename"];if(!r||!a)throw new L("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new L("INVALID_ARGS",`Invalid x-artifact-type: ${r}. Must be "file" or "app-bundle".`);!function(e){if(void 0===e)return;let t=Number(e);if(Number.isFinite(t)&&t>0x80000000)throw new L("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let o=function(e){let t=e.trim(),r=n.basename(t);if(!r||"."===r||".."===r)throw new L("INVALID_ARGS",`Invalid artifact filename: ${e}`);return r}(a),s=(t=function(e){let t=e?.trim();if(!t)return"request";let r=t.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return r.length>0?r.slice(0,48):"request"}("upload"),i.mkdtempSync(n.join(c.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===r){let t=n.join(s,o);return await rd(e,t),{artifactPath:t,tempDir:s}}let t=n.join(s,"artifact.tar");await rd(e,t);let a=await ro({archivePath:t,tempDir:s,platform:"ios",expectedRootName:o});return i.rmSync(t,{force:!0}),{artifactPath:a,tempDir:s}}catch(e){throw i.rmSync(s,{recursive:!0,force:!0}),e}}let rp=new m;async function rf(e,t){return await rp.run(e,t)}function rm(e){rp.getStore()?.(e)}let rh=new Set(["agent_device.command","agent-device.command"]),rw=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rg=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rv={"agent_device.lease.allocate":"lease_allocate","agent-device.lease.allocate":"lease_allocate","agent_device.lease.heartbeat":"lease_heartbeat","agent-device.lease.heartbeat":"lease_heartbeat","agent_device.lease.release":"lease_release","agent-device.lease.release":"lease_release"},ry=new Set([...rh,...rw,...rg,...Object.keys(rv)]);function rS(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function r_(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function rI(e,t){e.destroyed||(e.write(Y(t)),e.end())}function rb(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rA(e,t){let r="string"==typeof t.authorization?t.authorization:"",n=r.toLowerCase().startsWith("bearer ")?r.slice(7):void 0,i="string"==typeof t["x-agent-device-token"]?t["x-agent-device-token"]:void 0;return("string"==typeof e.token?e.token:void 0)??i??n??""}function rx(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rN(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rM(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new L("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function rE(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new L("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function rD(e,t){if(!e)return{ok:!0};let r=await e(t);if(void 0===r||!0===r)return{ok:!0};if(!1===r){let e=T(new L("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rS(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=T(new L(R(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rS(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=B(r.tenantId);if(!e){let e=T(new L("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rS(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rk(){let e,t=process.env.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let r=process.env.AGENT_DEVICE_HTTP_AUTH_EXPORT||"default",i=n.isAbsolute(t)?t:n.resolve(t);try{e=await import(d(i).href)}catch(e){throw new L("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:i,error:e instanceof Error?e.message:String(e)})}let a=e[r];if("function"!=typeof a)throw new L("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:i,exportName:r});return a}async function rP(e){let t=await rk(),{handleRequest:r,token:n}=e;return s.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!0}));return}if("POST"===e.method&&"/upload"===e.url)return void rC(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void rR(e,i,t,n);if("POST"!==e.method||"/rpc"!==e.url){i.statusCode=404,i.end("Not found");return}let a="";e.setEncoding("utf8"),e.on("data",t=>{(a+=t).length>1048576&&e.destroy(Error("request too large"))}),e.on("error",()=>{i.headersSent||r_(i,rS(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{r_(i,rS(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void r_(i,rS(n.id??null,-32600,"Invalid Request"),400);if(!ry.has(n.method))return void r_(i,rS(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void r_(i,rS(n.id??null,-32602,"Invalid params"),400);try{var s;let a=n.params,l=function(e,t,r){if(rh.has(e))return{token:rA(t,r),session:t.session??"default",command:t.command??"",positionals:Array.isArray(t.positionals)?t.positionals:[],flags:t.flags,runtime:t.runtime,meta:t.meta};if(rw.has(e)){let e,n=rx(t,"platform");if("ios"!==n&&"android"!==n)throw new L("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:rA(t,r),session:rx(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rx(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new L("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new L("INVALID_ARGS","Invalid params: source.url is required for url sources");let r=t.headers,n={};if(void 0!==r){if(!r||"object"!=typeof r||Array.isArray(r))throw new L("INVALID_ARGS","Invalid params: source.headers must be a string map");for(let[e,t]of Object.entries(r)){if("string"!=typeof t)throw new L("INVALID_ARGS","Invalid params: source.headers values must be strings");n[e]=t}}return Object.keys(n).length>0?{kind:"url",url:e,headers:n}:{kind:"url",url:e}}if("path"===t.kind){let e="string"==typeof t.path?t.path.trim():"";if(!e)throw new L("INVALID_ARGS","Invalid params: source.path is required for path sources");return{kind:"path",path:e}}if("github-actions-artifact"===t.kind)return function(e){let t,r=rM(e,"owner"),n=rM(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new L("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new L("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new L("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:rE(e,"artifactId")}:(a&&(t=rE(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rM(e,"artifactName")})}(t);throw new L("INVALID_ARGS",'Invalid params: source.kind must be "url", "path", or "github-actions-artifact"')}(t),retainMaterializedPaths:(e=t.retainPaths,"boolean"==typeof e?e:void 0),materializedPathRetentionMs:rN(t,"retentionMs")}}}if(rg.has(e)){let e=rx(t,"materializationId")?.trim();if(!e)throw new L("INVALID_ARGS","Invalid params: materializationId is required");return{token:rA(t,r),session:rx(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rx(t,"requestId"),materializationId:e}}}let n=rv[e];if(n)return{token:rA(t,r),session:rx(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rx(t,"tenantId")??rx(t,"tenant"),runId:rx(t,"runId"),leaseId:rx(t,"leaseId"),leaseTtlMs:rN(t,"ttlMs"),leaseBackend:rx(t,"backend")}};throw new L("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(s=n.method,rh.has(s)&&("string"!=typeof l.command||0===l.command.length))return void r_(i,rS(n.id??null,-32602,"Invalid params: command is required"),400);o=t1(l.meta?.requestId,n.id),l.meta={...l.meta,requestId:o},t2(o);let d=()=>{i.writableFinished||t3(o)};e.on("aborted",d),i.on("close",d);let c=await rD(t,{headers:e.headers,rpcRequest:n,daemonRequest:l});if(!c.ok)return void r_(i,c.response,c.statusCode);if(c.tenantId&&(l.meta={...l.meta,tenantId:c.tenantId,sessionIsolation:l.meta?.sessionIsolation??l.flags?.sessionIsolation??"tenant"}),H(l)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await rf(e=>{!i.destroyed&&i.write(Z(e))},async()=>await r(l)),t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rS(n.id??null,-32e3,e.error.message,e.error);rI(i,t);return}let u=await r(l);if(u.ok)return void r_(i,{jsonrpc:"2.0",id:n.id??null,result:u});r_(i,rS(n.id??null,-32e3,u.error.message,u.error),rb(u.error.code))}catch(t){let e=T(t);if(i.headersSent)return void rI(i,rS(n.id??null,-32e3,e.message,e));r_(i,rS(n.id??null,-32e3,e.message,e),rb(e.code))}finally{t4(o)}})})}async function rC(e,r,n,i){try{var a;let o,s,l=await rO({req:e,res:r,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let d=await ru(e),c=(a={artifactPath:d.artifactPath,tempDir:d.tempDir,tenantId:l.tenantId},o=t.randomUUID(),(s=setTimeout(()=>{ra(o)},3e5)).unref(),rn.set(o,{artifactPath:a.artifactPath,tempDir:a.tempDir,tenantId:a.tenantId,timer:s}),o);r.statusCode=200,r.setHeader("content-type","application/json"),r.end(JSON.stringify({ok:!0,uploadId:c}))}catch(e){rT(r,T(e))}}async function rR(e,t,r,n){let a=e.url?.slice("/artifacts/".length)??"";if(!a){t.statusCode=400,t.end("Missing artifact id");return}try{let o=await rO({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[a]}});if(!o)return;let s=function(e,t){let r=re.get(e);if(!r)throw new L("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new L("UNAUTHORIZED","Artifact belongs to a different tenant");if(!i.existsSync(r.artifactPath))throw rr(e),new L("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(a,o.tenantId),l=i.createReadStream(s.artifactPath);t.statusCode=200,t.setHeader("content-type","application/octet-stream"),s.fileName&&t.setHeader("content-disposition",`attachment; filename="${s.fileName.replace(/"/g,"")}"`),l.on("error",e=>{if(t.headersSent)t.destroy(e);else{let r=T(e);t.statusCode=rb(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rr(a)}),l.pipe(t)}catch(e){rT(t,T(e))}}async function rO(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=rA({},n.headers),d=(t=l,(r=o)&&t!==r?T(new L("UNAUTHORIZED","Invalid token")):null);if(d)return rT(i,d),null;let c=await rD(a,{headers:n.headers,rpcRequest:{jsonrpc:"2.0",id:null,method:"agent_device.command"},daemonRequest:{token:l,session:"default",command:s.command,positionals:s.positionals}});return c.ok?{tenantId:c.tenantId}:(i.statusCode=c.statusCode,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!1,error:c.response.error?.data?.message??c.response.error?.message??"Unauthorized"})),null)}function rT(e,t){e.statusCode=rb(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function rL(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function r$(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function rF(e){let t=(e??"").trim().toLowerCase();if(!t||"ios-simulator"===t)return"ios-simulator";if("ios-instance"===t||"android-instance"===t)return t;throw new L("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class rU{leases=new Map;runBindings=new Map;maxActiveSimulatorLeases;defaultLeaseTtlMs;minLeaseTtlMs;maxLeaseTtlMs;now;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.defaultLeaseTtlMs=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,this.minLeaseTtlMs=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):5e3,this.maxLeaseTtlMs=Number.isInteger(e.maxLeaseTtlMs)?Math.max(this.minLeaseTtlMs,Number(e.maxLeaseTtlMs)):6e5,this.now=e.now??(()=>Date.now())}allocateLease(e){let r=rF(e.backend),n=B(e.tenantId);if(!n)throw new L("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=rL(e.runId);if(!i)throw new L("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");this.cleanupExpiredLeases();let a=this.resolveLeaseTtlMs(e.ttlMs),o=this.bindingKey(n,i,r),s=this.runBindings.get(o);if(s){let e=this.leases.get(s);if(e)return this.refreshLease(e,a);this.runBindings.delete(o)}this.enforceCapacity(r);let l=this.now(),d={leaseId:t.randomBytes(16).toString("hex"),tenantId:n,runId:i,backend:r,createdAt:l,heartbeatAt:l,expiresAt:l+a};return this.leases.set(d.leaseId,d),this.runBindings.set(o,d.leaseId),{...d}}heartbeatLease(e){let t=r$(e.leaseId);if(!t)throw new L("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);if(!r)throw new L("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});this.assertOptionalScopeMatch(r,e.tenantId,e.runId);let n=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(r,n)}releaseLease(e){let t=r$(e.leaseId);if(!t)throw new L("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);return r?(this.assertOptionalScopeMatch(r,e.tenantId,e.runId),this.leases.delete(t),this.runBindings.delete(this.bindingKey(r.tenantId,r.runId,r.backend)),{released:!0}):{released:!1}}assertLeaseAdmission(e){let t=rF(e.backend),r=B(e.tenantId);if(!r)throw new L("INVALID_ARGS","tenant isolation requires tenant id.");let n=rL(e.runId);if(!n)throw new L("INVALID_ARGS","tenant isolation requires run id.");let i=r$(e.leaseId);if(!i)throw new L("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new L("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==r||a.runId!==n)throw new L("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}cleanupExpiredLeases(){let e=this.now();for(let t of this.leases.values())t.expiresAt>e||(this.leases.delete(t.leaseId),this.runBindings.delete(this.bindingKey(t.tenantId,t.runId,t.backend)))}enforceCapacity(e){if("ios-simulator"!==e||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>"ios-simulator"===e.backend).length;if(!(t<this.maxActiveSimulatorLeases))throw new L("COMMAND_FAILED","No simulator lease capacity available",{reason:"LEASE_CAPACITY_EXCEEDED",activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:"Retry after releasing another simulator lease."})}resolveLeaseTtlMs(e){if(!Number.isInteger(e))return this.defaultLeaseTtlMs;let t=Number(e);if(t<this.minLeaseTtlMs||t>this.maxLeaseTtlMs)throw new L("INVALID_ARGS",`Lease ttlMs must be between ${this.minLeaseTtlMs} and ${this.maxLeaseTtlMs}.`);return t}refreshLease(e,t){let r=this.now(),n={...e,heartbeatAt:r,expiresAt:r+t};return this.leases.set(n.leaseId,n),this.runBindings.set(this.bindingKey(n.tenantId,n.runId,n.backend),n.leaseId),{...n}}bindingKey(e,t,r){return`${e}:${t}:${r}`}assertOptionalScopeMatch(e,t,r){let n=B(t),i=rL(r);if(t&&!n)throw new L("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&!i)throw new L("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(n&&e.tenantId!==n||i&&e.runId!==i)throw new L("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}function rG(e){return e}function rq(e){return"apple"===e||"ios"===e||"macos"===e}function rj(e,t){return!t||("apple"===t?rq(e):e===t)}function rV(e){let{simulatorSetPath:t,platform:r,target:n}=e;if(t&&"macos"!==r&&"desktop"!==n)return t}async function rB(e,t,r={}){let n=e,i=e=>e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim();if(t.platform&&(n=n.filter(e=>rj(e.platform,t.platform))),t.target&&(n=n.filter(e=>(e.target??"mobile")===t.target)),t.udid){let e=n.find(e=>e.id===t.udid&&rq(e.platform));if(!e)throw new L("DEVICE_NOT_FOUND",`No Apple device with UDID ${t.udid}`);return e}if(t.serial){let e=n.find(e=>e.id===t.serial&&"android"===e.platform);if(!e)throw new L("DEVICE_NOT_FOUND",`No Android device with serial ${t.serial}`);return e}if(t.deviceName){let e=i(t.deviceName),r=n.find(t=>i(t.name)===e);if(!r)throw new L("DEVICE_NOT_FOUND",`No device named ${t.deviceName}`);return r}let a=n[0];if(void 0!==a&&1===n.length)return a;if(0===n.length){var o;let e=r.simulatorSetPath;if(e&&(!(o=t.platform)||"apple"===o||"ios"===o))throw new L("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 L("DEVICE_NOT_FOUND","No devices found",{selector:t})}let s=n.filter(e=>"device"!==e.kind);s.length>0&&(n=s);let l=n.filter(e=>e.booted),d=l[0];if(void 0!==d&&1===l.length)return d;let c=l[0]??n[0];if(void 0===c)throw new L("DEVICE_NOT_FOUND","No devices found",{selector:t});return c}async function rH(e){var t;if("macos"===(t=e).platform||"apple"===t.platform&&"desktop"===t.target){let{listMacosDevices:e}=await import("./devices~2.js");return await e()}if("linux"===e.platform){let{listLinuxDevices:e}=await import("./devices~1.js");return await e()}if("android"===e.platform){let{listAndroidDevices:t}=await import("./8806.js");return await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0})}if(e.platform){let{listAppleDevices:t}=await import("./devices.js");return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}let r=[];try{let{listAndroidDevices:t}=await import("./8806.js");r.push(...await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0}))}catch{}try{let{listAppleDevices:t}=await import("./devices.js");r.push(...await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid}))}catch{}try{let{listLinuxDevices:e}=await import("./devices~1.js");r.push(...await e())}catch{}return r}let rK=new m,rW=new m;async function rz(e,t,r){var n,i;let a=await rJ(e,t,r);if(n=t,i=a,!rX(n)&&(!n.platform||"apple"===n.platform||"ios"===n.platform)&&"desktop"!==n.target&&(!i||"device"===i.kind)){let{findBootableIosSimulator:e}=await import("./devices.js"),n=await e({simulatorSetPath:r.simulatorSetPath,target:t.target});if(n)return n}if(a)return a;throw new L("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function rJ(e,t,r){try{return await rB(e,t,r)}catch(e){var n;if(n=e,!rX(t)&&n instanceof L&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function rX(e){return!!(e.udid||e.serial||e.deviceName)}async function rZ(e){let t=rG(e.platform),r=rV({simulatorSetPath:ee(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=eh(e.androidDeviceAllowlist),i=function(e){let{flags:t,normalizedPlatform:r,iosSimulatorSetPath:n,androidSerialAllowlist:i}=e;return JSON.stringify({platform:r,target:t.target,device:t.device,udid:t.udid,serial:t.serial,iosSimulatorSetPath:n,androidSerialAllowlist:i?Array.from(i).sort():void 0})}({flags:e,normalizedPlatform:t,iosSimulatorSetPath:r,androidSerialAllowlist:n}),a={platform:t,target:e.target,cacheHit:!1};return await x("resolve_target_device",async()=>{let o=function(e){let t=rK.getStore(),r=t?.get(e);if(r)return{...r}}(i);if(o)return a.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 L("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await r2({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return r3(s)?r4(i,await rz(l,s,{simulatorSetPath:r})):r4(i,await rB(l,s,{simulatorSetPath:r}));let d=await rH({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return r3(s)?r4(i,await rz(d,s,{simulatorSetPath:r})):r4(i,await rB(d,s,{simulatorSetPath:r}))},a)}async function rY(e){return rK.getStore()?await e():await rK.run(new Map,e)}async function rQ(e,t){return e?await rW.run(e,t):await t()}async function r0(e,t){return await rQ(e,async()=>await rY(t))}async function r1(e){return await r2(e)??await rH(e)}async function r2(e){let t=rW.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function r3(e){return!!e.platform&&"android"!==e.platform&&"linux"!==e.platform}function r4(e,t){return rK.getStore()?.set(e,{...t}),t}let r5=["platform","target","device","udid","serial"],r8=[...r5,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function r6(e){return"string"==typeof e&&e.trim().length>0}function r9(e,t){return!!e&&t.some(t=>r6(e[t]))}let r7=[{resolverKey:"androidAdbProvider",resolve(e,t){let r=e.androidAdbProvider;if(!r||"android"!==t.device.platform)return{};let n=r(t),i="function"==typeof n?n:n?.exec;return{androidAdb:{provider:n,executor:i,serial:t.device.id}}},async appendWrapper(e,t){if(!e.androidAdb?.provider)return;let{withAndroidAdbProvider:r}=await import("./9639.js");ni(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&rq(t.device.platform)?{appleRunner:{provider:r(t),deviceId:t.device.id,requestId:t.req.meta?.requestId}}:{}},async appendWrapper(e,t){if(!e.appleRunner?.provider)return;let{withAppleRunnerProvider:r}=await Promise.resolve(tf);ni(t,e.appleRunner,(t,n)=>r(t,{deviceId:e.appleRunner?.deviceId??"",requestId:e.appleRunner?.requestId},n))}},{resolverKey:"appleToolProvider",resolve(e,t){let r=e.appleToolProvider;return r&&rq(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(th);ni(t,e.appleTool,r)}},{resolverKey:"linuxToolProvider",resolve(e,t){let r=e.linuxToolProvider;return r&&"linux"===t.device.platform?{linuxTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.linuxTool?.provider)return;let{withLinuxToolProvider:r}=await Promise.resolve(tg);ni(t,e.linuxTool,r)}},{resolverKey:"appLogProvider",resolve(e,t){let r=e.appLogProvider;return r?{appLog:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appLog?.provider)return;let{withAppLogProvider:r}=await Promise.resolve(tc);ni(t,e.appLog,r)}},{resolverKey:"recordingProvider",resolve(e,t){let r=e.recordingProvider;return r?{recording:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.recording?.provider)return;let{withRecordingProvider:r}=await import("./recording-provider.js");ni(t,e.recording,r)}}];async function ne(e,t){let r=await nt(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await nn(r);return await na(i,async()=>await t(n))}async function nt(e){var t,r,n;if(t=e.providers,!r7.some(e=>!!t[e.resolverKey]))return{};let i=await nr(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return r7.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function nr(e,t){var r;if(t)return e.command===ev.apps&&r9(e.flags,r5)?await rZ(e.flags??{}):t.device;if(e.command===ev.open||r9(e.flags,r5)||(r=e).command===ev.record&&"start"===(r.positionals?.[0]??"").toLowerCase())return await rZ(e.flags??{})}async function nn(e){let t=[];for(let r of r7)await r.appendWrapper(e,t);return t}function ni(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function na(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function no(e,t){switch(e.platform){case"android":{let{createAndroidInteractor:t}=await import("./android.js");return t(e)}case"linux":{let{createLinuxInteractor:e}=await import("./linux.js");return e()}case"ios":case"macos":{let{createAppleInteractor:r}=await import("./apple.js");return r(e,t)}default:throw new L("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let ns=/^[A-Za-z0-9_.:-]{1,64}$/,nl="--launch-console is supported only for iOS simulator app launches",nd="--launch-console requires a direct app launch and cannot be used with URL opens";function nc(e){return e?.clickButton??"primary"}function nu(e){return"primary"===e.button?null:"click"!==e.commandLabel?new L("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new L("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new L("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 L("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function np(e){return"primary"===e?{}:{button:e}}let nf=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function nm(e){return"ios"===e.platform&&"tv"!==e.target}async function nh(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await eV(t)}async function nw(e,t){let{x:r,y:n}=nb(t,"longpress requires x y [durationMs]",{hint:"Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i -c, use the target rect center as x y, then retry longpress x y durationMs."}),i=t[2]?Number(t[2]):void 0;return await e.longPress(r,n,i),{x:r,y:n,durationMs:i,...eH(`Long pressed (${r}, ${n})`)}}async function ng(e,t){let{x:r,y:n}=nb(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...eH(`Focused (${r}, ${n})`)}}async function nv(e,t,r){let n=e_(t[0]);if(n)throw new L("INVALID_ARGS",`type does not accept a target ref like "${n}"`,{hint:`Use fill ${n} "text" to target that field, or press ${n} then type "text" to append.`});let i=t.join(" ");if(!i)throw new L("INVALID_ARGS","type requires text");let a=e$(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...eH(nB("Typed",i))}}async function ny(e,t,r){if(r?.directElementSelector)return await nS(e,r.directElementSelector,t,r);let n=Number(t[0]),i=Number(t[1]),a=t.slice(2).join(" ");if(Number.isNaN(n)||Number.isNaN(i)||!a)throw new L("INVALID_ARGS","fill requires x y text");let o=e$(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...eH(nB("Filled",a))}}async function nS(e,t,r,n){if(!e.fillElementSelector)throw new L("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new L("INVALID_ARGS","fill requires text");let a=e$(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...eH(nB("Filled",i))}}async function n_(e,t,r,n){var i,a,o,s;if(n?.directElementSelector&&"ios"===e.platform)return await nI(t,n.directElementSelector);let{x:l,y:d}=nb(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await nA(l,d,n);let c=nc(n);if("primary"!==c)return await nx(e,l,d,c,n);let u=(s=n,{count:nM(s?.count,1,"count",1,200),intervalMs:nM(s?.intervalMs,0,"interval-ms",0,1e4),holdMs:nM(s?.holdMs,0,"hold-ms",0,1e4),jitterPx:nM(s?.jitterPx,0,"jitter-px",0,100),doubleTap:!!s?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new L("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new L("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(u),i=u.count,a=u.holdMs,o=u.jitterPx,rq(e.platform)&&i>1&&0===a&&0===o)?await nE(e,l,d,u,n):await nD(t,l,d,u)}async function nI(e,t){if(!e.tapElementSelector)throw new L("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...eH(`Tapped ${t.raw}`)}}function nb(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new L("INVALID_ARGS",t,r);return{x:n,y:i}}async function nA(e,t,r){let n=nc(r);if("primary"!==n)throw new L("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(tu);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...eH(nj({x:e,y:t}))}}async function nx(e,t,r,n,i){if(function(e,t,r){let n=nu({commandLabel:"click",platform:e.platform,button:t,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(n)throw n}(e,n,i),"linux"===e.platform)return await nN(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(tp);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},nk(i)),{x:t,y:r,button:n,...eH(nj({x:t,y:r,button:n}))}}async function nN(e,t,r){if("secondary"===r){let{rightClickLinux:r}=await import("./input-actions~1.js");await r(e,t)}else{let{middleClickLinux:r}=await import("./input-actions~1.js");await r(e,t)}return{x:e,y:t,button:r,...eH(nj({x:e,y:t,button:r}))}}function nM(e,t,r,n,i){return e$(void 0===e?t:e,r,n,i)}async function nE(e,t,r,n,i){let{runIosRunnerCommand:a}=await Promise.resolve(tp),o=await a(e,{command:"tapSeries",x:t,y:r,count:n.count,intervalMs:n.intervalMs,doubleTap:n.doubleTap,appBundleId:i?.appBundleId},nk(i));return{x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,timingMode:"runner-series",...o,...eH(nj({x:t,y:r}))}}async function nD(e,t,r,n){let i;return await nh(n.count,n.intervalMs,async a=>{let[o,s]=function(e,t){if(t<=0)return[0,0];let[r,n]=nf[e%nf.length];return[r*t,n*t]}(a,n.jitterPx),l=t+o,d=r+s;if(n.doubleTap){i??=await e.doubleTap(l,d)??void 0;return}n.holdMs>0?i??=await e.longPress(l,d,n.holdMs)??void 0:i??=await e.tap(l,d)??void 0}),eK({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},nj({x:t,y:r}))}function nk(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId}}async function nP(e,t,r,n){let i=Number(r[0]),a=Number(r[1]),o=Number(r[2]),s=Number(r[3]);if([i,a,o,s].some(Number.isNaN))throw new L("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await nR({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function nC(e,t,r,n){let i=ej(r[0]),a=r[1]?Number(r[1]):300,o=eF((await t.snapshot({appBundleId:n?.appBundleId,compact:!0})).nodes??[]);if(!o)throw new L("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=eI(i,o,{platform:e.platform});return await nR({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function nR(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:d}=e,c=e$(l,"durationMs",16,1e4),u=e$(n?.count??1,"count",1,200),p=e$(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if("one-way"!==f&&"ping-pong"!==f)throw new L("INVALID_ARGS",`Invalid pattern: ${f}`);if(rq(t.platform)&&u>1){let{runIosRunnerCommand:e}=await Promise.resolve(tp),r=await e(t,{command:"dragSeries",x:i,y:a,x2:o,y2:s,durationMs:c,count:u,pauseMs:p,pattern:f,...nm(t)?{synthesized:!0}:{},appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId});return{x1:i,y1:a,x2:o,y2:s,...d?{preset:d}:{},durationMs:c,effectiveDurationMs:c,timingMode:"runner-series",count:u,pauseMs:p,pattern:f,...r,...eH(nV(u,f))}}return await nh(u,p,async e=>{"ping-pong"===f&&e%2==1?await r.swipe(o,s,i,a,c):await r.swipe(i,a,o,s,c)}),eK({x1:i,y1:a,x2:o,y2:s,...d?{preset:d}:{},durationMs:c,effectiveDurationMs:c,timingMode:"direct",count:u,pauseMs:p,pattern:f},d?`Swiped ${d}`:nV(u,f))}async function nO(e,t){let r=Number(t[0]),n=Number(t[1]),i=Number(t[2]),a=Number(t[3]);if([r,n,i,a].some(e=>!Number.isFinite(e)))throw new L("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=e$(t[4]?Number(t[4]):500,"durationMs",16,1e4),s=r+i,l=n+a,d=await e.pan(r,n,s,l,o);return{x:r,y:n,dx:i,dy:a,x2:s,y2:l,durationMs:o,...d??{},...eH(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function nT(e,t){let r=function(e,t){if("up"===e||"down"===e||"left"===e||"right"===e)return e;throw new L("INVALID_ARGS",`${t} must be up, down, left, or right`)}(t[0],"fling direction"),n=Number(t[1]),i=Number(t[2]);if(![n,i].every(Number.isFinite))throw new L("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new L("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=e$(t[4]?Number(t[4]):50,"durationMs",16,1e3),{x2:s,y2:l}=function(e,t,r,n){switch(r){case"up":return{x2:e,y2:t-n};case"down":return{x2:e,y2:t+n};case"left":return{x2:e-n,y2:t};case"right":return{x2:e+n,y2:t}}}(n,i,r,a);return await e.fling(n,i,s,l,o),{direction:r,x:n,y:i,x2:s,y2:l,distance:a,durationMs:o,...eH(`Flung ${r}`)}}async function nL(e,t,r){var n;let i=t[0],a=t[1]?Number(t[1]):void 0,o=r?.pixels;if(!i)throw new L("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new L("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==o)throw new L("INVALID_ARGS","scroll accepts either a relative amount or --pixels, not both");let s="bottom"===(n=i)?{direction:"down",edge:"bottom"}:"top"===n?{direction:"up",edge:"top"}:{direction:eA(n)},l={},d=0;if(s.edge){let t=s.edge,n=await eL({edge:t,captureState:async n=>await n$(e,r,t,n),scroll:async()=>await e.scroll(s.direction,{amount:a,pixels:o})});l=n.result??{},d=n.passes}else l=await e.scroll(s.direction,{amount:a,pixels:o}),d=1;return eK({direction:s.direction,...s.edge?{edge:s.edge,passes:d}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},eE(s.direction,s.edge,d,a,o))}async function n$(e,t,r,n){if("function"!=typeof e.snapshot)throw new L("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await eP({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,compact:!0,scope:e})).nodes??[]})}async function nF(e,t,r,n){if("tv"===e.target)throw new L("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new L("UNSUPPORTED_OPERATION","gesture pinch is only supported in macOS app sessions. Re-open the target app without --surface desktop|menubar|frontmost-app first.");let i=Number(r[0]),a=r[1]?Number(r[1]):void 0,o=r[2]?Number(r[2]):void 0;if(Number.isNaN(i)||i<=0)throw new L("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...eH(`Pinched to scale ${i}`)}}async function nU(e,t,r){if("tv"===e.target)throw new L("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new L("UNSUPPORTED_OPERATION","gesture rotate is not supported on macOS; XCTest rotation gestures are available only for iOS app sessions.");let{degrees:n,x:i,y:a,velocity:o}=function(e){let t=Number(e[0]);if(!Number.isFinite(t))throw new L("INVALID_ARGS","gesture rotate requires degrees [x] [y] [velocity]");let r=function(e,t){if(void 0===e&&void 0===t)return{};if(void 0===e||void 0===t)throw new L("INVALID_ARGS","gesture rotate center requires both x and y");let r=Number(e),n=Number(t);if(!Number.isFinite(r)||!Number.isFinite(n))throw new L("INVALID_ARGS","gesture rotate center requires finite x and y");return{x:r,y:n}}(e[1],e[2]),n=Number(e[3]??(t>=0?1:-1));if(!Number.isFinite(n)||0===n)throw new L("INVALID_ARGS","gesture rotate velocity must be a non-zero number");return{degrees:t,...r,velocity:Math.abs(n)*(t>=0?1:-1)}}(r),s=await t.rotateGesture(n,i,a,o);return{degrees:n,...void 0!==i&&void 0!==a?{x:i,y:a}:{},velocity:o,...s,...eH(`Rotated gesture ${n} degrees`)}}async function nG(e,t,r){if("tv"===e.target)throw new L("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new L("UNSUPPORTED_OPERATION","gesture transform is currently supported on Android and iOS simulators");let i=function(e){let t=Number(e[0]),r=Number(e[1]),n=Number(e[2]),i=Number(e[3]),a=Number(e[4]),o=Number(e[5]);if(![t,r,n,i,a,o].every(Number.isFinite))throw new L("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new L("INVALID_ARGS","gesture transform scale must be > 0");return{x:t,y:r,dx:n,dy:i,scale:a,degrees:o,durationMs:void 0===e[6]?void 0:e$(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...eH(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function nq(e,t,r){let{x:n,y:i}=nb(t,"read requires x y");if("android"===e.platform){let{readAndroidTextAtPoint:t}=await import("./input-actions.js");return{action:"read",text:await t(e,n,i)??""}}if("linux"===e.platform){let{readLinuxTextAtPoint:e}=await Promise.resolve(tw);return{action:"read",text:await e(n,i,r?.surface)}}if("macos"===e.platform&&r?.surface&&"app"!==r.surface){let{runMacOsReadTextAction:e}=await Promise.resolve(tu);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(tp),o=await a(e,{command:"readText",x:n,y:i,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function nj(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function nV(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function nB(e,t){return`${e} ${Array.from(t).length} chars`}function nH(e,t){let r,n=t?.subject??"Payload",a=e.trim();if(!a)throw new L("INVALID_ARGS",`${n} cannot be empty`);let o=t?.expandPath?t.expandPath(a,t.cwd):a;try{if(!i.statSync(o).isFile())throw new L("INVALID_ARGS",`${n} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof L)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new L("INVALID_ARGS",`${n} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new L("COMMAND_FAILED",`Unable to read ${n} file: ${o}`,{cause:String(t)})}if((r=a.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:a};throw new L("INVALID_ARGS",`${n} file not found: ${o}`)}async function nK(e){let t=nH(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await nW(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new L("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof L)throw t;throw new L("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function nW(e){try{return await o.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new L("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new L("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new L("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new L("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function nz(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},o=await no(e,a);return N({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await x("platform_command",async()=>await nJ(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function nJ(e,t,r,n,i,a,o){switch(r){case"open":return await nX(e,t,n,a);case"close":{let e=n[0];if(!e)return{closed:"session",...eH("Closed session")};return await t.close(e),{app:e,...eH(`Closed: ${e}`)}}case"press":return await n_(e,t,n,a);case"swipe":return await nP(e,t,n,a);case"swipe-preset":return await nC(e,t,n,a);case"pan":return await nO(t,n);case"fling":return await nT(t,n);case"longpress":return await nw(t,n);case"focus":return await ng(t,n);case"type":return await nv(t,n,a);case"fill":return await ny(t,n,a);case"scroll":return await nL(t,n,a);case"pinch":return await nF(e,t,n,a);case"rotate-gesture":return await nU(e,t,n);case"transform-gesture":return await nG(e,t,n);case"trigger-app-event":return await nZ(e,t,n,a);case"screenshot":return await nY(t,n,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...eH("Back")};case"home":return await t.home(),{action:"home",...eH("Home")};case"rotate":{let e=eW(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...eH(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...eH("Opened app switcher")};case"clipboard":return await nQ(t,n);case"keyboard":return await n0(e,n,a,o);case"settings":return await n3(e,t,n,a);case"push":return await n4(e,n,a);case"snapshot":return await n5(t,a);case"read":return await nq(e,n,a);default:throw new L("INVALID_ARGS",`Unknown command: ${r}`)}}async function nX(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new L("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new L("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new L("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...eH("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new L("UNSUPPORTED_OPERATION",nl);if("linux"===e.platform&&s&&s.length>0)throw new L("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(ew(i))throw new L("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!ew(a))throw new L("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new L("INVALID_ARGS",nd);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...eH(`Opened: ${i}`)}}if(o&&ew(i))throw new L("INVALID_ARGS",nd);if(n?.clearAppState){if(ew(i))throw new L("INVALID_ARGS","Clearing app state requires an app target, not a deep link.");await t.setSetting("clear-app-state","clear",i)}return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchConsole:o,launchArgs:s}),{app:i,...o?{launchConsole:o}:{},...eH(`Opened: ${i}`)}}async function nZ(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new L("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!ns.test(t))throw new L("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 L("INVALID_ARGS","trigger-app-event accepts at most two arguments: <event> [payloadJson]");let n=function(e,t){if(e)try{let r=JSON.parse(e);if(!r||"object"!=typeof r||Array.isArray(r))throw new L("INVALID_ARGS",`trigger-app-event payload for "${t}" must be a JSON object`);let n=JSON.stringify(r);if(Buffer.byteLength(n,"utf8")>8192)throw new L("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof L)throw t;throw new L("INVALID_ARGS",`Invalid trigger-app-event payload JSON: ${e}`)}}(r,t);return{eventName:t,payload:n}}(r),o=function(e,t,r){var n;let i,a=(i=("ios"===(n=e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:"macos"===n?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,i?.trim()||void 0);if(!a)throw new L("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=r?JSON.stringify(r):"",s=a.replaceAll("{event}",encodeURIComponent(t)).replaceAll("{payload}",encodeURIComponent(o)).replaceAll("{platform}",encodeURIComponent(e));if(s.length>4096)throw new L("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,i,a);return await t.open(o,{appBundleId:n?.appBundleId}),{event:i,eventUrl:o,transport:"deep-link",...eH(`Triggered app event: ${i}`)}}async function nY(e,t,r,i){let a=t[0]??r??`./screenshot-${Date.now()}.png`;await o.mkdir(n.dirname(a),{recursive:!0});let s=y(i);return await e.screenshot(a,{appBundleId:i?.appBundleId,fullscreen:s.fullscreen,stabilize:s.stabilize,surface:i?.surface}),{path:a,...eH(`Saved screenshot: ${a}`)}}async function nQ(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new L("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new L("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new L("INVALID_ARGS",'clipboard write requires text (use "" to clear clipboard)');let n=t.slice(1).join(" ");return await e.writeClipboard(n),{action:r,textLength:Array.from(n).length,...eH("Clipboard updated")}}async function n0(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!ex(i))throw new L("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new L("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await n1(e,i);if("ios"===e.platform)return await n2(e,i,r,n);throw new L("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function n1(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...eH("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./8133.js"),r=await t(e);return{platform:"android",action:"dismiss",attempts:r.attempts,wasVisible:r.wasVisible,dismissed:r.dismissed,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}let{getAndroidKeyboardState:r}=await import("./8133.js"),n=await r(e);return{platform:"android",action:"status",visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function n2(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new L("UNSUPPORTED_OPERATION","keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS");if("enter"===t||"return"===t){let{runIosRunnerCommand:t}=await Promise.resolve(tp),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...eH("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(tp),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...eH(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function n3(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new L("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new L("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");N({level:"debug",phase:"settings_apply",data:{setting:i,state:"clear",appBundleId:r,platform:e.platform}});let s=await t.setSetting(i,"clear",r);return s&&"object"==typeof s?eK({setting:i,state:"clear",...s},n8(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...eH(`Cleared user data for ${r}`)}}if(!a)throw new L("INVALID_ARGS","settings requires setting state");let l="location"===i&&"set"===a,d=("permission"===i||l?r[4]:r[2])??n?.appBundleId,c="permission"===i?{permissionTarget:o,permissionMode:s}:l?{latitude:eB(o,"latitude"),longitude:eB(s,"longitude")}:void 0;N({level:"debug",phase:"settings_apply",data:l?{setting:i,state:a,latitude:o,longitude:s,platform:e.platform}:"permission"===i?{setting:i,state:a,permissionTarget:o,permissionMode:s,platform:e.platform}:{setting:i,state:a,appBundleId:d,platform:e.platform}});let u=await t.setSetting(i,a,d,c);return u&&"object"==typeof u?eK({setting:i,state:a,...u},n8(u)??`Updated setting: ${i}`):{setting:i,state:a,...eH(`Updated setting: ${i}`)}}async function n4(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new L("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await nK(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...eH(`Pushed notification to ${n}`)}}let{pushAndroidNotification:o}=await import("./notifications.js"),s=await o(e,n,a);return{platform:"android",package:n,action:s.action,extrasCount:s.extrasCount,...eH(`Pushed notification to ${n}`)}}async function n5(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,compact:t?.snapshotCompact,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,surface:t?.surface})}function n8(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let n6=e=>"macos"!==e.platform,n9=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,n7=e=>"macos"===e.platform?"macOS automation has no multi-touch input — this gesture is supported on Android and the iOS simulator only.":"ios"===e.platform&&"tv"===e.target?"tvOS has no touch input — this gesture is supported on Android and the iOS simulator only.":"ios"===e.platform&&"device"===e.kind?"Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices.":void 0,ie={device:!0},it={},ir={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ie},ii={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it,supports:n6},ia={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},pinch:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it,supports:e=>"android"===e.platform||n9(e),unsupportedHint:n7},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it,supports:e=>"android"===e.platform||n9(e),unsupportedHint:n7},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it,supports:e=>"android"===e.platform||n9(e),unsupportedHint:n7},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it,supports:n6},open:ir,close:ir,reinstall:ii,install:ii,"install-from-source":ii,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ie},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it,supports:n6},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ie},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ie,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:it,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},fill:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ie},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},snapshot:ir,diff:ir,screenshot:ir,wait:ir,get:ir,find:ir,is:ir,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ie},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ie,supports:n6},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ie},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ie},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ie},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it,supports:n6},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},scroll:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ie},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ie},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},"trigger-app-event":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},type:ir};function io(e,t){let r=ia[e];if(!r)return!0;let n=rq(t.platform)?r.apple:"linux"===t.platform?r.linux:r.android;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}function is(e,t=e=>e){let r=new m;return{resolve:n=>n?t(n):r.getStore()??e,run:async(e,n)=>e?await r.run(t(e),n):await n(),hasScope:()=>!!r.getStore()}}function il(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function id(e,t){return{openBundle:async(t,r)=>{var n,i;let a;await e("open",(n=t,i=r,a=["-b",n],i&&a.push(i),a))},openTarget:async t=>{await e("open",[t])},readClipboard:async()=>{let t=await e("pbpaste",[],{allowFailure:!0});if(0!==t.exitCode)throw new L("COMMAND_FAILED","Failed to read macOS clipboard",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});return t.stdout.replace(/\r\n/g,"\n").replace(/\n$/,"")},writeClipboard:async t=>{let r=await e("pbcopy",[],{allowFailure:!0,stdin:t});if(0!==r.exitCode)throw new L("COMMAND_FAILED","Failed to write macOS clipboard",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode})},readDarkMode:async()=>{let t=await e("osascript",["-e",'tell application "System Events" to tell appearance preferences to get dark mode'],{allowFailure:!0});if(0!==t.exitCode)throw new L("COMMAND_FAILED","Failed to read macOS appearance",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let r=t.stdout.trim().toLowerCase();if("true"===r)return!0;if("false"===r)return!1;throw new L("COMMAND_FAILED",`Unable to determine current macOS appearance from osascript output: ${t.stdout.trim()}`)},setDarkMode:async t=>{let r=`tell application "System Events" to tell appearance preferences to set dark mode to ${t?"true":"false"}`,n=await e("osascript",["-e",r],{allowFailure:!0});if(0!==n.exitCode)throw new L("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await ic(e,t,r)}}async function ic(e,t,r){let i=["/Applications","/System/Applications",n.join(c.homedir(),"Applications")],a=new Set;for(let t of i){let r=await o.stat(t).catch(()=>null);if(!r?.isDirectory())continue;let n=await e("find",[t,"-maxdepth","4","-type","d","-name","*.app"],{allowFailure:!0});if(0===n.exitCode)for(let e of n.stdout.split("\n")){let t=e.trim();t&&a.add(t)}}return il((await Promise.all(Array.from(a).map(async e=>{let r=await iu(e,t).catch(()=>({})),i=r.bundleId;return i?{bundleId:i,name:r.appName??n.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function iu(e,t){for(let r of[n.join(e,"Contents","Info.plist"),n.join(e,"Info.plist")]){let e=await t(r),n=ip(e,"CFBundleIdentifier"),i=ip(e,"CFBundleDisplayName"),a=ip(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function ip(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let im={runCommand:U,simctl:{run:async(e,t)=>await U("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await U("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await ib(U,e)},macosHost:id(U,async e=>await ib(U,e)),whichCommand:q},ih=is(im,function(e){return"function"==typeof e?iw({runCommand:e}):iw(e)});function iw(e={}){let t={...im,...e},r=e.plist??{readJson:async e=>await ib(t.runCommand,e)};return{...t,simctl:e.simctl??{run:async(e,r)=>await t.runCommand("xcrun",["simctl",...e],r)},devicectl:e.devicectl??{run:async(e,r)=>await t.runCommand("xcrun",["devicectl",...e],r)},plist:r,macosHost:e.macosHost??id(t.runCommand,async e=>await r.readJson(e))}}function ig(e){return ih.resolve(e)}async function iv(e,t){return await ih.run(e,t)}function iy(){return ih.hasScope()}async function iS(e,t,r){return await ig().runCommand(e,t,r)}async function i_(e,t){let r=ig(),[n,...i]=e;return"simctl"===n?await (r.simctl?.run(i,t)??r.runCommand("xcrun",e,t)):"devicectl"===n?await (r.devicectl?.run(i,t)??r.runCommand("xcrun",e,t)):await iS("xcrun",e,t)}async function iI(e){return await ig().plist?.readJson(e)??null}async function ib(e,t){try{let r=await e("plutil",["-convert","json","-o","-",t],{allowFailure:!0});if(0!==r.exitCode||!r.stdout.trim())return null;return JSON.parse(r.stdout)}catch{return null}}let iA="agent-device-macos-helper",ix="AGENT_DEVICE_MACOS_HELPER_BIN",iN=n.join(c.homedir(),".agent-device","macos-helper","current"),iM=n.join(iN,"manifest.json"),iE=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function iD(e){let t=e.trim();if(!iE.test(t))throw new L("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function ik(e,t){t.bundleId&&e.push("--bundle-id",iD(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iP(){return function(e){let t=n.dirname(e);for(;;){let e=n.join(t,"macos-helper");if(a(n.join(e,"Package.swift")))return e;let r=n.dirname(t);if(r===t)break;t=r}throw new L("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(l(import.meta.url))}async function iC(e){let t=await o.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=n.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await iC(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function iR(e){let t=await iC(e),i=r("sha256");for(let r of t)i.update(n.relative(e,r)),i.update("\0"),i.update(await o.readFile(r)),i.update("\0");let a=await iS("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return i.update("swift-version"),i.update("\0"),i.update(a.stdout||a.stderr||`exit:${a.exitCode}`),i.update("\0"),i.digest("hex")}async function iO(){try{let e=JSON.parse(await o.readFile(iM,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function iT(){let e=await G(process.env[ix],ix);if(e)return e;let t=iP(),r=await iR(t),i=n.join(iN,iA);try{if(await iO()===r)return await o.access(i),i}catch{}let a=n.join(iP(),".build","release",iA);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await iS("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await o.mkdir(iN,{recursive:!0});let s=`${i}.tmp`;return await o.copyFile(a,s),await o.rename(s,i),await o.chmod(i,493),await o.writeFile(iM,`${JSON.stringify({fingerprint:r},null,2)}
5
- `,"utf8"),i}async function iL(){let e=process.env[ix]?.trim();if(e){let t=await G(e,ix);if(t)return t}if(iy())return iA;if("darwin"!==process.platform)throw new L("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await iT()}async function i$(e){let t={allowFailure:!0,timeoutMs:3e4},r=ig().macosHelper,n=r?iA:await iL(),i=r?await r.run(e,t):await iS(n,e,t),a=i.stdout.trim(),o=null;if(a)try{o=JSON.parse(a)}catch{o=null}if(0===i.exitCode&&o?.ok)return o.data;throw new L("COMMAND_FAILED",o&&!o.ok?o.error?.message??`macOS helper exited with code ${i.exitCode}`:a||i.stderr.trim()||`macOS helper exited with code ${i.exitCode}`,{helperPath:n,args:e,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,...o&&!o.ok?o.error?.details:{}})}async function iF(){return await i$(["app","frontmost"])}async function iU(e){return await i$(["app","quit","--bundle-id",iD(e)])}async function iG(e,t){return await i$(["permission",e,t])}async function iq(e,t={}){let r=["alert",e];return ik(r,t),await i$(r)}async function ij(e,t={}){let r=["snapshot","--surface",e];return ik(r,t),await i$(r)}async function iV(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return ik(n,r),await i$(n)}async function iB(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return ik(n,r),await i$(n)}async function iH(e,t={}){let r=["screenshot","--out",e];return ik(r,t),t.fullscreen&&r.push("--fullscreen"),await i$(r)}let iK={"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"},iW={runCommand:U,whichCommand:q,desktop:iY(U,q),clipboard:iQ(U,q),screenshot:i0(U,q)},iz=is(iW,function(e={}){let t={...iW,...e};return{...t,desktop:e.desktop??iY(t.runCommand,t.whichCommand),clipboard:e.clipboard??iQ(t.runCommand,t.whichCommand),screenshot:e.screenshot??i0(t.runCommand,t.whichCommand)}});function iJ(e){return iz.resolve(e)}async function iX(e,t){return await iz.run(e,t)}async function iZ(e,t,r){return await iJ().runCommand(e,t,r)}function iY(e,t){return{async openTarget(r){if(r.includes("://")||r.startsWith("/"))return void await e("xdg-open",[r]);if(await t(r)){e(r,[],{allowFailure:!0}).catch(e=>{N({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await eV(500);return}await e("xdg-open",[r],{allowFailure:!0})},async closeApp(r){await t("wmctrl")?await e("wmctrl",["-c",r],{allowFailure:!0}):await e("pkill",["-x",r],{allowFailure:!0})}}}function iQ(e,t){return{async readText(){let r=i3[await i8(t,i1)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=i4[await i8(t,i1)](r);await e(n.cmd,n.args,n.options)}}}function i0(e,t){return{async capture(r){let n=i5[await i8(t,i2)](r);await e(n.cmd,n.args,n.options)}}}let i1={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."},i2={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."},i3={"wl-clipboard":{cmd:"wl-paste",args:["--no-newline"],options:{allowFailure:!0,timeoutMs:5e3}},xclip:{cmd:"xclip",args:["-selection","clipboard","-o"],options:{allowFailure:!0,timeoutMs:5e3}},xsel:{cmd:"xsel",args:["--clipboard","--output"],options:{allowFailure:!0,timeoutMs:5e3}}},i4={"wl-clipboard":e=>({cmd:"wl-copy",args:["--",e],options:{allowFailure:!1,timeoutMs:5e3}}),xclip:e=>({cmd:"xclip",args:["-selection","clipboard"],options:{allowFailure:!1,timeoutMs:5e3,stdin:e}}),xsel:e=>({cmd:"xsel",args:["--clipboard","--input"],options:{allowFailure:!1,timeoutMs:5e3,stdin:e}})},i5={grim:e=>({cmd:"grim",args:[e]}),scrot:e=>({cmd:"scrot",args:[e]}),import:e=>({cmd:"import",args:["-window","root",e]}),"gnome-screenshot":e=>({cmd:"gnome-screenshot",args:["-f",e]})};async function i8(e,t){let r=process.env.WAYLAND_DISPLAY||"wayland"===process.env.XDG_SESSION_TYPE?"wayland":"x11";for(let n of t[r])if(await e(n.command))return n.tool;throw new L("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let i6="atspi-dump.py",i9=null;async function i7(e,t={}){let r,a=iJ().accessibility;if(a)return await a.captureTree(e,t);if("linux"!==process.platform)throw new L("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await iJ().whichCommand("python3"))throw new L("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let o=t.maxNodes??1500,s=t.maxDepth??12,d=t.maxApps??24,c=[function(){if(i9)return i9;let e=n.dirname(l(import.meta.url));for(let t=0;t<5;t++){let r=n.join(e,"src","platforms","linux",i6);if(i.existsSync(r))return i9=r,r;if(0===t){let t=n.join(e,i6);if(i.existsSync(t))return i9=t,t}e=n.dirname(e)}throw new L("TOOL_MISSING",`Cannot find ${i6}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(d)],u=await iZ("python3",c,{allowFailure:!0,timeoutMs:3e4});if(0!==u.exitCode){let e=u.stderr.trim();if(e.includes("No module named")||e.includes("gi.require_version"))throw new L("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new L("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new L("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new L("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=iK[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 ae(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&N({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await i7(t);return{nodes:r.nodes,truncated:r.truncated}}async function at(e,t,r){let{nodes:n}=await ae(r);for(let r of n.filter(r=>{let n=r.rect;return!!n&&e>=n.x&&t>=n.y&&e<=n.x+n.width&&t<=n.y+n.height}).sort((e,t)=>{let r=e.depth??0,n=t.depth??0;return r!==n?n-r:ar(e.rect)-ar(t.rect)})){let e=function(e){for(let t of[e.value,e.label,e.identifier])if("string"==typeof t&&t.length>0)return t;return""}(r);if(e.trim())return e}return""}function ar(e){return(e?.width??0)*(e?.height??0)}let an=[250,400,600];function ai(e,t,r=e.snapshot){if("android"!==e.device.platform)return;let n=r?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:r?.nodes.length??0,baselineSignatures:n?al(r?.nodes??[]):void 0,routeComparable:n}}function aa(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 ao(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function as(e){return"press"===e||"click"===e||"back"===e||"open"===e}function al(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 ad(e,t,r,n,i){return{requestId:i??b().requestId,appBundleId:r,activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotCompact:t?.snapshotCompact,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...S(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:nc(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function ac(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!aw(r))return;let s=function(e){if("click"===e||"press"===e)return"press"}(n);if(!s||!(2===(t=i).length&&t.every(e=>Number.isFinite(Number(e)))))return;let l=am(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:af(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function au(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function ap(e){var t,r;let{session:n,pending:i,snapshot:a}=e,o=(t=i.preSignature,r=am(a.nodes),0===t.length||0===r.length?"ambiguous":ah(t,r)?"unchanged":"changed");if("unchanged"!==o||i.attemptsRemaining<=0)return{retried:!1,change:o};let s=Date.now();return i.attemptsRemaining-=1,await nz(n.device,i.command,i.positionals,i.flags?.out,{...ad(e.logPath,i.flags,n.appBundleId,n.trace?.outPath),surface:n.surface}),N({level:"info",phase:"interaction_no_change_retry",data:{action:i.action,attemptsRemaining:i.attemptsRemaining,durationMs:Date.now()-s}}),{retried:!0,change:o}}function af(e){if(!e?.interactionOutcome)return e;let{interactionOutcome:t,...r}=e;return r}function am(e){let t=new Map,r=[];for(let n of e){let e=function(e,t){var r,n;if(!e.rect||!([(r=e.rect).x,r.y,r.width,r.height].every(e=>Number.isFinite(e))&&r.width>0&&r.height>0)||(n=e,`${n.label??""} ${n.identifier??""}`.toLowerCase().includes("scroll bar")))return;let i=function(e){let t=[e.identifier,e.label,e.value,e.type,e.role,!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].map(e=>"string"==typeof e?e.trim():"").join("|");return t.replaceAll("|","")?t:void 0}(e);if(!i)return;let a=t.get(i)??0;return t.set(i,a+1),{key:`${i}|#${a}`,x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height)}}(n,t);e&&r.push(e)}return r}function ah(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r+=1){let n=e[r],i=t[r];if(!n||!i||n.key!==i.key||Math.abs(n.x-i.x)>1||Math.abs(n.y-i.y)>1||Math.abs(n.width-i.width)>1||Math.abs(n.height-i.height)>1)return!1}return!0}function aw(e){return"ios"===e.device.platform||"android"===e.device.platform}function ag(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function av(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!ay(t.device.platform)||!n)return await r();let i=Date.now(),a=1,o=await r(),s=am(o.nodes);for(;Date.now()-i<1500;){await eV(200),a+=1;let e=await r(),l=am(e.nodes);if(ah(s,l))return ag(t),N({level:a>2?"info":"debug",phase:"post_gesture_snapshot_stabilized",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),e;o=e,s=l}return ag(t),N({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function ay(e){return"ios"===e||"android"===e}function aS(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let a_=["x","y","width","height"],aI=new WeakMap;function ab(e,t){if(!e[t])return[];let r=aN(e)[t]??t+1;return e.slice(t+1,r)}function aA(e,t,r){let n=aN(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function ax(e,t,r){let n=aN(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function aN(e){let t=aI.get(e);if(t)return t;let r=Array(e.length),n=[];for(let[t,i]of e.entries()){let e=i?.depth??0;for(;n.length>0&&e<=n[n.length-1].depth;)r[n.pop().position]=t;n.push({depth:e,position:t})}for(let t of n)r[t.position]=e.length;return aI.set(e,r),r}function aM(e,t,r){for(let n of function(e,t){let r=[],n="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,i=new Set;for(;n&&!i.has(n.index);)i.add(n.index),r.push(n),n="number"==typeof n.parentIndex?t.get(n.parentIndex):void 0;return r}(e,t))if(r(n))return n;return null}function aE(e,t){let r=eJ(e.type??""),n=e.label?.trim();return!!(aD(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function aD(e){return"button"===eJ(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function ak(e){let t=eJ(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function aP(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function aC(e,t){return!!e&&!!t&&a_.every(r=>.5>=Math.abs(e[r]-t[r]))}function aR(e){let t;for(let i of e){var r,n;let e=eJ(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||aO(r)>aO(n)))&&(t=i.rect)}return t}function aO(e){return e?e.width*e.height:0}function aT(e){let t=eJ(e.type??"");return"scrollview"===t||"scrollarea"===t}function aL(e,t){return!0===e||!!t||void 0}function a$(e,t,r,n){ax(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=eJ(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function aF(e,t,r,n){ax(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=eJ((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function aU(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===eJ(n.type??"")&&t(n,i,r)}}function aG(e,t,r,n){for(let i of e)(aE(i,t)||n&&aj(i,n))&&r.add(i.index)}function aq(e,t,r){if("button"!==eJ(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&aC(e.rect,t.rect)}function aj(e,t){return"button"===eJ(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&aC(e.rect,t.rect)}let aV=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=aR(e),n=r?r.y+r.height:null;if(null!==n)for(let r=0;r<e.length;r+=1){var i,a;let o=e[r];o&&(i=o,a=n,i.rect&&"keyboard"===eJ(i.type??"")&&i.rect.y>=a)&&(t.add(o.index),function(e,t,r,n){let i=new Map(t.map(e=>[e.index,e])),a="number"==typeof e.parentIndex?i.get(e.parentIndex):void 0;for(;a?.rect&&a.rect.y>=n;)r.add(a.index),a="number"==typeof a.parentIndex?i.get(a.parentIndex):void 0}(o,e,t,n),ax(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==eJ(r.type??"")||!0===r.hittable||r.label?.trim()||r.value?.trim())&&r.identifier?.trim()&&t.add(r.index)}(e,o);let s=new Map(e.map(e=>[e.index,e]));for(let r of e)(function(e){let t=e.label?.trim();return!!(t&&eN(t))})(r)&&function(e,t,r){var n,i,a,o;ak(e.type)||r.suppressedIndexes.add(e.index);let s=ek(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&ak(e.type)?e:null)??aM(e,t,e=>ak(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,aP(n.replacements,i,{rect:function(e,t){if(e&&t&&!(t.height<=0)&&!(t.height>=e.height)&&!(t.y<e.y)&&!(t.y>e.y+e.height))return{...e,y:t.y,height:Math.min(t.height,e.y+e.height-t.y)}}(i.rect,a.rect)??i.rect,hiddenContentAbove:aL(i.hiddenContentAbove,o.above),hiddenContentBelow:aL(i.hiddenContentBelow,o.below)}))}(r,s,t);(function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r];if(!n||"searchfield"!==eJ(n.type??""))continue;if("Search"===n.label){aF(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=aA(e,r,e=>"searchfield"===eJ(e.type??"")&&"Search"===e.label);i&&(t.add(n.index),function(e,t,r){let n=new Map(t.map(e=>[e.index,e])),i=e;for(;"number"==typeof i.parentIndex;){let e=n.get(i.parentIndex);if(!e||"Toolbar"!==e.label)return;r.add(e.index),i=e}}(n,e,t),aF(e,r,i.index,t))}})(e,o),r=e,n=o,aU(r,(e,t,i)=>{aA(r,i,r=>{let n;return("button"===(n=eJ(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(aC(r.rect,e.rect)||function(e,t){var r,n,i,a,o;let s;if(t.label?.trim()!==e.label?.trim())return!1;let l=eJ(t.type??"");return r=e,n=l,s=r.label?.trim(),"button"===n&&("Dismiss"===s||"Back"===s)||"textfield"===l||(i=e,a=l,o=t,"button"===a&&!!i.rect&&!!o.rect&&0===i.rect.x&&0===i.rect.y&&i.rect.width>=300&&i.rect.height>=600&&o.rect.width<i.rect.width)}(e,r))})&&n.add(e.index)}),i=e,a=o,aU(i,(e,t,r)=>{let n;eR(e)&&eM(e,(n=[],ax(i,r,e=>{n.push(e)}),n))&&a.add(e.index)}),function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();!(!n||t.has(n.index))&&i&&function(e,t,r,n,i){let a=eJ(r.type??"");if("statictext"===a||"link"===a)return a$(e,t,n,i);if("other"===a){if(function(e,t,r){return!!aA(e,t,e=>{let t=eJ(e.type??"");return("link"===t||"searchfield"===t||ak(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);a$(e,t,n,i)}}(e,r,n,i,t)}}(e,o)},function(e,t){let r=new Map(e.map(e=>[e.index,e])),n=aR(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==eJ(e.type??"")||!1===e.enabled||!e.rect||!function(e){let t=e?.trim();return!(!t||/^(toolbar|window|application)$/i.test(t)||t.startsWith("!,")||/debugger|fast refresh/i.test(t))}(e.label)||!aM(e,t,aT)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=aO(e),i=aO(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&aP(t.replacements,i,{type:"Cell"})},function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n?.rect&&i&&function(e,t,r,n,i){let a=eJ(r.type??"");if("button"===a)return aG(ab(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=ab(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==eJ(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r})(e,t,r));if(!i)return!1;let a=e.find(e=>aq(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&aP(n.replacements,i,{identifier:o}),n.suppressedIndexes.add(t.index),function(e,t,r,n,i){for(let a of e)a.index!==n.index&&(aq(a,t,r)||aj(a,t)||function(e,t){if("switch"!==eJ(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||aE(a,r))&&i.add(a.index)}(e,t,r,i,n.suppressedIndexes),!0}(o,r,n,i)&&function(e,t,r,n){let i=e.find(e=>aq(e,t,r));if(!i){e.some(aD)&&aG(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&aP(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),aG(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function aB(e){if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return{snapshot:await av({session:e.session,capture:async()=>(await aX(e)).snapshot})};let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!aw(e)||Date.now()-t.markedAt>3e4?void au(e):t}(e.session);if(t&&e.session)return await aH({...e,session:e.session},t);let r=aa(e.session);if(r&&"android"===e.device.platform)return await aW(e,r);let n=await aK(e);return ao(e.session),{snapshot:aQ(n,aZ(e)),analysis:n.analysis,androidSnapshot:n.androidSnapshot}}async function aH(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await aJ(e),l=await ap({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await aJ(e),l=await ap({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(au(i),"ambiguous"!==l.change&&s.freshness?.staleAfterRetries!==!0&&ao(i),"unchanged"===l.change)?N({level:"warn",phase:"interaction_settle_timeout",data:{action:(r={pending:t,attempts:o,startedAt:a}).pending.action,attempts:r.attempts,durationMs:Date.now()-r.startedAt}}):N({level:(n={pending:t,change:l.change,attempts:o,startedAt:a}).attempts>0?"info":"debug",phase:"interaction_settled",data:{action:n.pending.action,change:n.change,attempts:n.attempts,durationMs:Date.now()-n.startedAt}}),{snapshot:s.snapshot,analysis:s.data.analysis,androidSnapshot:s.data.androidSnapshot,freshness:s.freshness}}async function aK(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await ae(r?.surface);return a0({nodes:e.nodes,truncated:e.truncated,backend:"linux-atspi"},{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o})}return"macos"===t.platform&&r?.surface&&"app"!==r.surface?a0(await ij(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await nz(t,"snapshot",[],i,{...ad(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath)})}async function aW(e,t){let r=await az(e,t);return{snapshot:r.snapshot,analysis:r.data.analysis,androidSnapshot:r.data.androidSnapshot,freshness:r.freshness}}async function az(e,t){let r=await aX(e),n=aY(r,t,e),i=0,a=t.markedAt+1500;for(let o of an){if(!n)break;let s=a-Date.now();if(s<=0)break;await eV(Math.min(o,s)),r=await aX(e),i+=1,n=aY(r,t,e)}return n||ao(e.session),{...r,freshness:i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0}}async function aJ(e){let t=aa(e.session);return t&&"android"===e.device.platform?await az(e,t):await aX(e)}async function aX(e){let t=await aK(e);return{data:t,snapshot:aQ(t,aZ(e))}}function aZ(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function aY(e,t,r){var n,i;let a=r.flags?.snapshotInteractiveOnly===!0,o=e.data.analysis;if(a&&0===e.snapshot.nodes.length&&o&&o.rawNodeCount>=12)return"empty-interactive";if("ref-refresh"===r.androidFreshnessMode)return null;return(n=t.baselineCount,i=e.snapshot.nodes.length,!(n<12)&&i<=Math.floor(.2*n))?e.snapshot.nodes.some(e=>!0===e.hittable||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())?null:"sharp-drop":t.routeComparable&&as(t.action)&&function(e,t){if(!e||0===e.length)return!1;let r=Math.max(e.length,t.length);if(r<12)return!1;let n=al(t),i=Math.min(e.length,n.length),a=0;for(let t=0;t<i;t+=1)e[t]===n[t]&&(a+=1);let o=Math.max(0,n.length-e.length),s=Math.max(0,e.length-n.length),l=Math.max(3,Math.floor(.15*r));return a>=Math.floor(.9*r)&&o<=l&&s<=l}(t.baselineSignatures,e.snapshot.nodes)?"stuck-route":null}function aQ(e,t){var r,n,i,a;let o=e?.nodes??[],s=eC(t?.snapshotRaw?o:eX(o)),l=t?.snapshotScope&&e?.backend!=="macos-helper"?a1(s,t.snapshotScope):s;return{nodes:e4((r=e?.backend,n=t,"xctest"===r&&n?.snapshotInteractiveOnly===!0&&!0!==n.snapshotRaw)?function(e){if(0===e.length)return e;let t=new Map,r=new Set;for(let n of aV)n(e,{replacements:t,suppressedIndexes:r});if(0===r.size&&0===t.size)return e;var n=e.filter(e=>!r.has(e.index)).map(e=>t.get(e.index)??e);let i=new Map(e.map(e=>[e.index,e])),a=new Map;for(let[e,t]of n.entries())a.set(t.index,e);return n.map((e,t)=>{let n="number"==typeof e.parentIndex?a.get(e.parentIndex):void 0;return void 0===n&&"number"==typeof e.parentIndex&&(n=function(e,t,r,n){let i=e,a=new Set;for(;"number"==typeof i&&!a.has(i);){if(a.add(i),!t.has(i))return n.get(i);i=r.get(i)?.parentIndex}}(e.parentIndex,r,i,a)),{...e,index:t,parentIndex:n}})}(l):l),truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,presentationKey:e2(eQ(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&a?.snapshotCompact!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function a0(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=a1(i,t.snapshotScope)),t.snapshotInteractiveOnly&&(i=function(e){if(0===e.length)return e;let t=new Map;for(let r of e)t.set(r.index,r);let r=new Set;for(let n of e){if(!function(e){if(e.focused||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")}(n))continue;let e=n;for(;e&&!r.has(e.index);)r.add(e.index),e="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0}return 0===r.size?e:a2(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=a2(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function a1(e,t){let r=eZ(e4(e),t);if(!r)return[];let n=e.findIndex(e=>e.index===r.index);if(-1===n)return[];let i=e[n]?.depth??0,a=[];for(let t=n;t<e.length;t+=1){let r=e[t];if(!r)continue;let o=r.depth??0;if(t>n&&o<=i)break;a.push(r)}return a2(a,i)}function a2(e,t=0){let r=new Map;for(let[t,n]of e.entries())r.set(n.index,t);return e.map((e,n)=>({...e,index:n,depth:Math.max(0,(e.depth??0)-t),parentIndex:"number"==typeof e.parentIndex?r.get(e.parentIndex):void 0}))}function a3(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return aS("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=e0(e.trim());if(!n)return aS("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=e1(e.nodes,n);if(r=t?eY(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:aS("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function a4(e,t){e.snapshot=t,e.snapshotScopeSource=void 0}function a5(e){return{get:t=>t===e.sessionName?function(e,t,r={}){if(e)return{name:t,appBundleId:e.appBundleId,appName:e.appName,...!0===r.includeSnapshot?{snapshot:e.snapshot}:{},metadata:{surface:e.surface,...r.metadata??{}}}}(e.getSession(),e.sessionName,e.recordOptions):void 0,set:t=>{t.name!==e.sessionName?N({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function a8(e){let{session:t,sessionName:r,outPath:i,outputPlacement:a,dispatchContext:s}=e,l=eT({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...n,...S(a),surface:a?.surface};return"out"===r?a6(await nz(t.device,"screenshot",[],i,o)):a6(await nz(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:s}),artifacts:{resolveInput:async()=>{throw new L("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await o.mkdtemp(n.join(c.tmpdir(),"agent-device-screenshot-")),r=n.join(t,"screenshot.png")),await o.mkdir(n.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await o.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await o.mkdtemp(n.join(c.tmpdir(),`${e.prefix}-`));return{path:n.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await o.rm(t,{recursive:!0,force:!0})}}}},sessions:a5({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eU()});return await l.capture.screenshot({session:r,requestId:s.requestId,appBundleId:t.appBundleId,...y(s),surface:t.surface,...i?{out:{kind:"path",path:i}}:{}})}function a6(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function a9(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function a7(e,t){let r=Math.max(24,Math.round(.2*Math.min(e.size,t.size))),n=Math.max(48,Math.round(.15*Math.min(e.crossSize,t.crossSize)));return Math.abs(e.size-t.size)<=r&&Math.abs(e.crossSize-t.crossSize)<=n}function oe(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let ot=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function or(e,t={}){let r=e9(e,t.helperAdb).exec;return(await oa(e,t,r)).xml}async function on(e,t={}){let r=e9(e,t.helperAdb).exec,n=await oa(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=te(i,800,t);return a&&function(e,t){for(let[r,n]of e){let e=t[r];e&&(n.hiddenContentAbove&&(e.hiddenContentAbove=!0),n.hiddenContentBelow&&(e.hiddenContentBelow=!0))}}(await oh(e,o.nodes,i,r),o.nodes),{...o,androidSnapshot:n.metadata}}let o=tr(i),s=ts(o,800,t);a&&await oi({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:l,...d}=s;return{...d,androidSnapshot:n.metadata}}async function oi(e){if(og(e.interactiveSnapshot.nodes).size>0||ow(e.xml))return;let t=ts(e.tree,800,{...e.options,interactiveOnly:!1}),r=await oh(e.device,t.nodes,e.xml,e.adb);ob(r,t,e.interactiveSnapshot),0===r.size&&ob(eD(e4(t.nodes)),t,e.interactiveSnapshot)}async function oa(e,t,r){let n=await x("android_snapshot_helper_artifact_resolution",async()=>await of(t.helperArtifact));return n.artifact?await oo(e,t,r,n.artifact):(N({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await om(e,n.fallbackReason,r))}async function oo(e,t,r,n){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),d=e9(e,t.helperAdb);try{let e=await os(t,r,d,n,l);return e.installed&&await tl(l),a=await ol(t,r,d,n,l),o=n,s=e.reason,{xml:a.xml,metadata:{backend:"android-helper",helperVersion:o.manifest.version,helperApiVersion:a.metadata.helperApiVersion,helperTransport:a.metadata.transport,helperSessionReused:a.metadata.sessionReused,installReason:s,waitForIdleTimeoutMs:a.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:a.metadata.waitForIdleQuietMs,timeoutMs:a.metadata.timeoutMs,maxDepth:a.metadata.maxDepth,maxNodes:a.metadata.maxNodes,rootPresent:a.metadata.rootPresent,captureMode:a.metadata.captureMode,windowCount:a.metadata.windowCount,nodeCount:a.metadata.nodeCount,helperTruncated:a.metadata.truncated,elapsedMs:a.metadata.elapsedMs}}}catch(t){return await od({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function os(e,t,r,n,i){let a=await x("android_snapshot_helper_install",async()=>await tt({adb:t,adbProvider:r,artifact:n,deviceKey:i,installPolicy:e.helperInstallPolicy,timeoutMs:3e4}),{packageName:n.manifest.packageName,versionCode:n.manifest.versionCode,installPolicy:e.helperInstallPolicy??"missing-or-outdated"});return N({phase:"android_snapshot_helper_install_decision",data:{packageName:a.packageName,versionCode:a.versionCode,installedVersionCode:a.installedVersionCode,installed:a.installed,reason:a.reason}}),a}async function ol(e,t,r,n,i){let a={adb:t,adbProvider:r,deviceKey:i,helperVersion:n.manifest.version,helperVersionCode:n.manifest.versionCode,packageName:n.manifest.packageName,instrumentationRunner:n.manifest.instrumentationRunner,waitForIdleTimeoutMs:e.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await x("android_snapshot_helper_session_capture",async()=>await ti(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){N({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:T(e).message}}),await oc(t,n.manifest.packageName)}return await x("android_snapshot_helper_capture",async()=>await tn(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function od(e){let t=function(e){var t;let r=T(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=op(e)??t;return/TimeoutException/.test(r)||/timed out/i.test(n)}(r.details?.helper,r.message)&&(t=r,!(t.details?.exitCode===137&&/Android snapshot helper (failed before returning parseable output|output could not be parsed)/.test(t.message))))return;let n=ou(e);return new L(R(r.code),`${n}. Stock UIAutomator fallback was skipped because this usually means the Android accessibility tree is busy or stalled.`,{...r.details,hint:"Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout and report the busy UI if it persists."},e)}(e.error);if(t)throw t;let r=ou(e.error);return N({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tl(e.helperDeviceKey),await oc(e.adb,e.artifact.manifest.packageName),to({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await om(e.device,r,e.adb)}async function oc(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await eV(150),N({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){N({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:T(e).message}})}}function ou(e){let t=T(e),r=op(t.details?.helper);if(r&&r!==t.message)return`${t.message}: ${r}`;if(r)return r;let n=("string"==typeof t.details?.stderr?t.details.stderr.trim():"").split(/\r?\n/).find(e=>e.trim());return n?`${t.message}: ${n}`:t.message}function op(e){if(!e||"object"!=typeof e||!("message"in e))return;let t=String(e.message).trim();return t&&"null"!==t?t:void 0}async function of(e){if(e)return{artifact:e};let t=e8(),r=n.join(e6(),"android-snapshot-helper","dist"),i=n.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await h.access(i)}catch{return{}}try{let e=ta(JSON.parse(await h.readFile(i,"utf8"))),t=n.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await h.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:T(e).message}}}async function om(e,t,r){let n;try{n=await x("android_snapshot_stock_capture",async()=>await ov(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new L(R((r=T(i)).code),`${r.message} Android snapshot helper failed before stock fallback: ${a}`,{...r.details,androidSnapshotHelperFallbackReason:a,...r.hint?{hint:r.hint}:{}},i)}throw e}return{xml:n,metadata:{backend:"uiautomator-dump",...t?{fallbackReason:t}:{}}}}async function oh(e,t,r,n){if(!t.some(e=>e5(e.type)))return new Map;let i=og(t);if(i.size>0||ow(r))return i;let a=await oI(e,n);return a?function(e,t){let r=function(e){let t={className:"root",rect:{x:0,y:0,width:0,height:0},children:[]},r=[{indent:-1,node:t}],n=/^(\s*)([\w.$]+)\{[^}]* (-?\d+),(-?\d+)-(-?\d+),(-?\d+) #/;for(let t of e.split("\n")){let e=n.exec(t);if(!e)continue;let[i,a,o,s,l,d]=e.slice(1);if(void 0===i||void 0===a||void 0===o||void 0===s||void 0===l||void 0===d)continue;let c=i.length,u=Number(o),p=Number(s),f={className:a,rect:{x:u,y:p,width:Math.max(0,Number(l)-u),height:Math.max(0,Number(d)-p)},children:[]};for(;r.length>1&&c<=r[r.length-1].indent;)r.pop();r[r.length-1].node.children.push(f),r.push({indent:c,node:f})}return t.children.length>0?t:null}(t);if(!r)return new Map;let n=function(e){let t=[],r=[e];for(;r.length>0;){let e=r.pop();if(e5(e.className)){let r=function(e){let t=e.children[0];if(!t)return null;let r=Math.max(t.rect.height,...t.children.map(e=>e.rect.y+e.rect.height)),n=t.children.filter(e=>e.rect.height>0).map(t=>oe(t.rect,e.rect)).sort((e,t)=>e.start-t.start);return 0===n.length?null:{rect:e.rect,contentExtent:r,contentBlocks:n}}(e);r&&t.push(r)}r.push(...e.children)}return t}(r);if(0===n.length)return new Map;let i=new Map;for(let t of e){if(!t.rect||!e5(t.type))continue;let r=function(e,t){let r=null,n=1/0;for(let i of t){let t=Math.abs(i.rect.width-e.width)+Math.abs(i.rect.height-e.height);if(t>32)continue;let a=4*t+(Math.abs(i.rect.x-e.x)+Math.abs(i.rect.y-e.y));a<n&&(r=i,n=a)}return r}(t.rect,n);if(!r)continue;let a=function(e,t){let r=function(e,t){let r=t,n=new Set;for(;!n.has(r.index);){var i,a;n.add(r.index);let o=e.filter(e=>e.parentIndex===r.index&&e.rect);if(1!==o.length)return r;let s=o[0];if(i=s.rect,a=t.rect,i.x!==a.x||i.y!==a.y||i.width!==a.width||i.height!==a.height)return r;r=s}return t}(e,t);return e.filter(e=>e.parentIndex===r.index&&e.rect).map(e=>e.rect).filter(e=>e.height>0).sort((e,t)=>e.y-t.y).map(e=>oe(e,t.rect))}(e,t),o=function(e){let{viewportRect:t,visibleBlocks:r,nativeScrollView:n}=e;if(0===r.length||0===n.contentBlocks.length)return null;let i=function(e){if(0===e.contentBlocks.length)return null;let t=e.contentBlocks[0],r=e.contentBlocks[e.contentBlocks.length-1];if(!t||!r)return null;let n=a9(e.contentBlocks.map(e=>e.size))??e.rect.height,i=Math.max(48,Math.round(.5*n)),a=Math.max(24,Math.round(.25*n)),o=t.start>=i,s=e.contentExtent-(r.start+r.size)>=a;return o||s?{above:o,below:s}:null}(n),a=function(e,t){let r=new Map;for(let n of e)for(let e of t){if(!a7(n,e))continue;let t=n.start-e.start,i=8*Math.round(t/8),a=r.get(i)??[];a.push(t),r.set(i,a)}let n=null;for(let e of r.values())(!n||e.length>n.length)&&(n=e);if(!n||n.length<2)return null;let i=[...n].sort((e,t)=>e-t);return i[Math.floor(i.length/2)]??null}(n.contentBlocks,r)??function(e){let{nativeBlocks:t,visibleBlocks:r,viewportExtent:n,contentExtent:i}=e,a=[],o=[];for(let e of t)for(let t of r){if(!a7(e,t))continue;let r=e.start-t.start;16>=Math.abs(r)&&a.push(r),16>=Math.abs(r+n-i)&&o.push(r)}return o.length>0?a9(o):a.length>0?a9(a):null}({nativeBlocks:n.contentBlocks,visibleBlocks:r,viewportExtent:t.height,contentExtent:n.contentExtent});if(null===a)return i;let o=t.height;return{above:(i?.above??!1)||a>16,below:(i?.below??!1)||a+o<n.contentExtent-16}}({viewportRect:t.rect,visibleBlocks:a,nativeScrollView:r});if(!o)continue;let s={};o.above&&(s.hiddenContentAbove=!0),o.below&&(s.hiddenContentBelow=!0),(s.hiddenContentAbove||s.hiddenContentBelow)&&i.set(t.index,s)}return i}(t,a):new Map}function ow(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function og(e){let t=new Map;for(let r of e){let e={};r.hiddenContentAbove&&(e.hiddenContentAbove=!0),r.hiddenContentBelow&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(r.index,e)}return t}async function ov(e,t=e7(e)){try{return await er(()=>oy(t),{shouldRetry:o_})}catch(t){var r,n;let e;if((r=t)instanceof L&&"COMMAND_FAILED"===r.code&&"number"==typeof r.details?.timeoutMs&&r.details?.cmd==="adb"&&(e=Array.isArray(n=r.details?.args)?n.map(String):"string"==typeof n?n.split(/\s+/):[]).includes("uiautomator")&&e.includes("dump")){let e="Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout. Stock Android UIAutomator may still time out on app-owned infinite animations.";throw new L("COMMAND_FAILED",`Android UI hierarchy dump timed out while waiting for the UI to become idle. ${e}`,{...t.details??{},hint:e},t)}throw t}}async function oy(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=oS(a.stdout,a.stderr);if(o)return o;let s="/sdcard/window_dump.xml",l=await e(["shell","uiautomator","dump",s],{allowFailure:!0,timeoutMs:8e3}),d=(t=l.stdout,r=l.stderr,n=`${t}
6
- ${r}`,i=/dumped to:\s*(\S+)/i.exec(n),i?.[1]);if(0!==l.exitCode&&!d)throw new L("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode,reason:"missing_fresh_dump"});let c=await e(["shell","cat",d??s]),u=oS(c.stdout,c.stderr);if(!u)throw new L("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:c.stdout,stderr:c.stderr});return u}function oS(e,t){let r=`${e}
7
- ${t}`,n=r.indexOf("<?xml"),i=n>=0?n:r.indexOf("<hierarchy");if(i<0)return null;let a=r.lastIndexOf("</hierarchy>");if(a<0||a<i)return null;let o=r.slice(i,a+12).trim();return o.length>0?o:null}function o_(e){if(!(e instanceof L)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return ot.some(e=>r.includes(e))}async function oI(e,t=e7(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),r=`${e.stdout}
8
- ${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function ob(e,t,r){if(0===e.size)return;let n=new Map;for(let[e,t]of r.sourceNodes.entries()){let i=r.nodes[e];i&&n.set(t,i)}for(let[r,i]of e){let e=t.sourceNodes[r];if(!e)continue;let a=n.get(e);a&&(i.hiddenContentAbove&&(a.hiddenContentAbove=!0),i.hiddenContentBelow&&(a.hiddenContentBelow=!0))}}let oA=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,ox=/^close app$/i,oN="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function oM(e){let{session:t}=e;if("android"!==t.device.platform||!t.recording)return"absent";try{let e=await oR(t),r=oT(e);if(!r?.rect)return"absent";let n=await oO(t,r);if(!n.ok)return N({level:"warn",phase:"android_blocking_dialog_tap_failed",data:{session:t.name,deviceId:t.device.id,exitCode:n.exitCode,stdout:n.stdout.trim(),stderr:n.stderr.trim()}}),"failed";if(!await oL(t))return N({level:"warn",phase:"android_blocking_dialog_still_present",data:{session:t.name,deviceId:t.device.id}}),"failed";if(t.appBundleId&&(await ea(t.device,t.appBundleId),!await o$(t,t.appBundleId)))return N({level:"warn",phase:"android_blocking_dialog_relaunch_unfocused",data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId}}),"failed";return N({level:"warn",phase:"android_blocking_dialog_recovered",data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId,x:n.x,y:n.y}}),"recovered"}catch(e){return N({level:"warn",phase:"android_blocking_dialog_recovery_failed",data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),"failed"}}async function oE(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await et(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await oD(n)){let t=`Recovered Android app ANR before ${i}: closed and relaunched ${n.appBundleId}.`;if("before-command"===e.phase)return{status:"recovered",warning:t};throw oP({session:n,command:i,focus:a,message:`Android app ANR appeared after ${i}; ${n.appBundleId} was closed and relaunched. Retry the command against the fresh app session.`,hint:"Retry the command. If the ANR returns, inspect app logs or restart the emulator."})}throw oP({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${oC(a)}. Automatic recovery failed.`,hint:oN})}throw oP({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${oC(a)}.`,hint:oN})}async function oD(e){try{return await ok(e)}catch(t){return N({level:"warn",phase:"android_app_anr_recovery_failed",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}async function ok(e){if(!e.appBundleId)return!1;let t=oT(await oR(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await oO(e,t);if(!r.ok)return!1;await ea(e.device,e.appBundleId);let n=await o$(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&N({level:"warn",phase:"android_app_anr_recovered",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:r.x,y:r.y}}),n}function oP(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new L("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function oC(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function oR(e){return e4(eX((await on(e.device,{interactiveOnly:!1,compact:!1})).nodes))}async function oO(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=e3(t.rect),i=await Q(e.device,["shell","input","tap",String(Math.round(r)),String(Math.round(n))],{allowFailure:!0});return 0!==i.exitCode?{ok:!1,exitCode:i.exitCode,stdout:i.stdout.trim(),stderr:i.stderr.trim()}:{ok:!0,x:r,y:n}}function oT(e,t={}){if(!1===t.requireDialogSignal||oG(e))return e.find(e=>oU(e).some(e=>ox.test(e))&&e.rect)}async function oL(e){for(let t=0;t<12;t+=1){if(!oG(await oR(e)))return!0;await eV(500)}return!oG(await oR(e))}async function o$(e,t,r={}){for(let n=0;n<12;n+=1){if(await oF(e,t,r))return!0;await eV(500)}return await oF(e,t,r)}async function oF(e,t,r){return!(r.requireNoBlockingDialog&&await et(e.device))&&(await ep(e.device)).package===t}function oU(e){let t=[e.label,e.identifier];return"string"==typeof e.value&&e.value.trim().length>0&&t.push(e.value),t.filter(e=>"string"==typeof e&&e.trim().length>0).map(e=>e.trim())}function oG(e){return e.some(e=>{let t=oU(e).join(" ").trim();return t.length>0&&oA.test(t)})}function oq(e){return!!(e&&e.width>0&&e.height>0)}function oj(e){return e.width*e.height}function oV(e,t){return t.x>=e.x&&t.y>=e.y&&t.x+t.width<=e.x+e.width&&t.y+t.height<=e.y+e.height}let oB=[255,59,48,255],oH=[255,214,10,255],oK=[0,0,0,255],oW=["scroll","list","recyclerview","edittext","textfield"],oz=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],oJ={e:["01110","10000","11110","10000","10000","10001","01110"],0:["01110","10001","10011","10101","11001","10001","01110"],1:["00100","01100","00100","00100","00100","00100","01110"],2:["01110","10001","00001","00010","00100","01000","11111"],3:["11110","00001","00001","01110","00001","00001","11110"],4:["00010","00110","01010","10010","11111","00010","00010"],5:["11111","10000","10000","11110","00001","00001","11110"],6:["01110","10000","10000","11110","10001","10001","01110"],7:["11111","00001","00010","00100","01000","01000","01000"],8:["01110","10001","10001","01110","10001","10001","01110"],9:["01110","10001","10001","01111","00001","00001","01110"]};async function oX(e){let t=eG(await o.readFile(e.screenshotPath),"screenshot"),r=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)oQ(r)&&oq(r.rect)&&(!t||oj(r.rect)>oj(t))&&(t=r.rect);return t||function(e){let t=1/0,r=1/0,n=-1/0,i=-1/0;for(let a of e)a.rect&&oq(a.rect)&&(t=Math.min(t,a.rect.x),r=Math.min(r,a.rect.y),n=Math.max(n,a.rect.x+a.rect.width),i=Math.max(i,a.rect.y+a.rect.height));return!Number.isFinite(t)||!Number.isFinite(r)||n<=t||i<=r?null:{x:t,y:r,width:n-t,height:i-r}}(e.filter(e=>{var t;return oq(e.rect)&&!("image"===eJ((t=e).type??"")&&!o1(t.label))}))}(e.nodes),a=new Map;for(let n of e.nodes){var o,s;if(!function(e,t,r){let n=[r.label,r.value].some(o2)||o3(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!oq(r.rect)||oQ(r))return!1;let n=eJ(r.type??"");return!(oW.some(e=>n.includes(e))||t&&oj(r.rect)>.25*oj(t))}(e,t,r)||(oY(r)?n:n&&function(e){let t=eJ(e.type??"");return t.includes("statictext")||t.includes("image")||t.includes("text")||t.includes("other")}(r))}(e,i,n))continue;let l=(o=e.nodes,[function(e){return oY(e)&&!oQ(e)}(s=n)?s:null,ez(o,s,e=>(function(e){return oY(e)&&!oQ(e)})(e)),s.hittable?s:null,ez(o,s,e=>!0===e.hittable)].find(o0)??null);if(!l?.rect||!oq(l.rect))continue;let d=function(e,t,r){let n=o4(e);if(e.ref!==t.ref&&n)return n;let i=function(e,t){let r=null;for(let n of t){if(n.ref===e.ref||!function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r[n.parentIndex];if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(n,e,t))continue;let i=o4(n);if(!i)continue;let a=function(e){let t=0;return eJ(e.type??"").includes("text")&&(t+=2),o2(e.label)&&(t+=2),o2(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||o4(t)}(n,l,e.nodes),c=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),oY(t)&&(n+=3),oY(e)&&(n+=2),r&&(n+=2),o3(t.identifier)&&(n+=1),o1(t.value)&&(n+=1),n}(n,l,d),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=oY,i=e=>!!o4(e),(!t.rect||!0!==t.hittable||n(t)||i(t)?null:function(e,t,r){let n=e.rect,i=function(e,t,r){let n=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r.get(n.parentIndex);if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(t,e,i)&&function(e,t){let r=eJ(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&oq(t.rect)&&oV(n,t.rect)).map(e=>e.rect);return a.length<2?null:function(e){let t=e[0];if(void 0===t)throw Error("unionRects requires at least one rect");let r=t.x,n=t.y,i=t.x+t.width,a=t.y+t.height;for(let t of e.slice(1))r=Math.min(r,t.x),n=Math.min(n,t.y),i=Math.max(i,t.x+t.width),a=Math.max(a,t.y+t.height);return{x:r,y:n,width:i-r,height:a-n}}(a)}(e,t,r);if(!i)return null;let a=i.y-n.y,o=n.y+n.height-(i.y+i.height);if(a<0||o<0||16>Math.abs(o-a))return null;let s=Math.min(a,o),l=Math.round(i.y-s),d=Math.round(i.height+2*s);return d<=0||d>=n.height?null:{x:n.x,y:l,width:n.width,height:d}}(t,r,i))??t.rect)}(e,l,e.nodes),p=oZ(e,i,u,t,r);if(!oq(p))continue;let f=a.get(l.ref);(!f||c>f.score)&&a.set(l.ref,{ref:l.ref,label:d,rect:l.rect,overlayRect:p,score:c})}return function(e,t,r,n,i){let a=eb(e.nodes).primaryAction;if(!a?.ref||!a.rect||!oq(a.rect))return;let o=oZ(e,t,a.rect,n,i);if(!oq(o))return;let s={ref:a.ref,label:a.label,rect:a.rect,overlayRect:o,score:100},l=r.get(a.ref);r.set(a.ref,l?{...l,score:Math.max(l.score,s.score)}:s)}(e,i,a,t,r),(function(e){let t=[];for(let r of e.sort((e,t)=>oj(e.overlayRect)-oj(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(oV(e.overlayRect,r.overlayRect)||oV(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}oj(r.overlayRect)<oj(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(st).slice(0,n.maxRefs??24).sort(se).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:e3(e.overlayRect)}))}(e.snapshot,t.width,t.height,{maxRefs:e.maxRefs});for(let e of r){var n,i;(function(e,t,r){for(let n=0;n<2;n+=1)o6(e,t.x,t.x+t.width-1,t.y+n,r),o6(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),o9(e,t.x+n,t.y,t.y+t.height-1,r),o9(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(n=t,(i=e).overlayRect,oB),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=o8(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:o8(t.y+2,0,Math.max(0,e.height-11));(function(e,t,r,n,i){for(let a=0;a<11;a+=1)for(let o=0;o<n;o+=1)o7(e,t+o,r+a,i)})(e,i,o,n,oH),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=oJ[t];if(n)for(let t=0;t<n.length;t+=1)for(let o=0;o<n[t].length;o+=1)"1"===n[t][o]&&o7(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,oK)}(n,i.overlayRect,i.ref)}return await o.writeFile(e.screenshotPath,eO.sync.write(t)),r}function oZ(e,t,r,n,i){if("android"===e.backend||!t)return o5(function(e){return{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}(r),n,i);let a=n/t.width,o=i/t.height;return o5({x:Math.round((r.x-t.x)*a),y:Math.round((r.y-t.y)*o),width:Math.max(1,Math.round(r.width*a)),height:Math.max(1,Math.round(r.height*o))},n,i)}function oY(e){let t=[e.type,e.role,e.subrole].map(e=>eJ(e??"")).join(" ");return oz.some(e=>t.includes(e))}function oQ(e){let t=[e.type,e.role,e.subrole].map(e=>eJ(e??"")).join(" ");return t.includes("application")||t.includes("window")}function o0(e){return!!(e?.rect&&oq(e.rect)&&!oQ(e))}function o1(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function o2(e){var t;let r;return!!o1(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function o3(e){var t;return"string"==typeof e&&!!o2(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function o4(e){let t=[e.label,e.value].find(o2);return t?t.trim():o3(e.identifier)?e.identifier.trim():void 0}function o5(e,t,r){let n=o8(e.x,0,Math.max(0,t-1)),i=o8(e.y,0,Math.max(0,r-1)),a=Math.max(1,t-n),o=Math.max(1,r-i);return{x:n,y:i,width:o8(e.width,1,a),height:o8(e.height,1,o)}}function o8(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function o6(e,t,r,n,i){for(let a=t;a<=r;a+=1)o7(e,a,n,i)}function o9(e,t,r,n,i){for(let a=r;a<=n;a+=1)o7(e,t,a,i)}function o7(e,t,r,n){if(t<0||r<0||t>=e.width||r>=e.height)return;let i=(e.width*r+t)*4;e.data[i]=n[0],e.data[i+1]=n[1],e.data[i+2]=n[2],e.data[i+3]=n[3]}function se(e,t){var r,n;let i=e.overlayRect.y-t.overlayRect.y;if(0!==i)return i;let a=e.overlayRect.x-t.overlayRect.x;return 0!==a?a:(r=e.ref,n=t.ref,Number.parseInt(r.replace(/^\D+/,""),10)-Number.parseInt(n.replace(/^\D+/,""),10))}function st(e,t){return t.score!==e.score?t.score-e.score:se(e,t)}function sr(e){return"number"==typeof e.gestureClockOriginAtMs&&"number"==typeof e.gestureClockOriginUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureClockOriginAtMs+(e.gestureStartUptimeMs-e.gestureClockOriginUptimeMs)-e.recordingStartedAt):"number"==typeof e.runnerStartedAtUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureStartUptimeMs-e.runnerStartedAtUptimeMs):"number"==typeof e.gestureStartUptimeMs&&"number"==typeof e.gestureEndUptimeMs?Math.max(0,e.fallbackFinishedAtMs-(e.gestureEndUptimeMs-e.gestureStartUptimeMs)-e.recordingStartedAt):Math.max(0,e.fallbackStartedAtMs-e.recordingStartedAt)}let sn=new WeakMap;function si(e){if(!e)return;let t=sn.get(e);if(t)return t;let r=sa(e.nodes??[]);if(r)return sn.set(e,r),r}let sa=eF,so={referenceWidth:1e3,referenceHeight:1e3};function ss(e,t,r,n,i={},a=Date.now(),o=Date.now()){var s,l,d,c,u,p,f,m,h;let w,g,v,y=e.recording;if(!y)return;let S={...i,...n??{}},_=sh(S.effectiveDurationMs)??sh(S.durationMs),I={recordingStartedAt:y.startedAt,gestureClockOriginAtMs:y.gestureClockOriginAtMs,gestureClockOriginUptimeMs:y.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===y.platform?y.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:sh(S.gestureStartUptimeMs),gestureEndUptimeMs:sh(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},b="number"==typeof(s={gestureStartUptimeMs:sh(S.gestureStartUptimeMs),gestureEndUptimeMs:sh(S.gestureEndUptimeMs),reportedDurationMs:_,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}).gestureStartUptimeMs&&"number"==typeof s.gestureEndUptimeMs?Math.max(0,s.gestureEndUptimeMs-s.gestureStartUptimeMs):"number"==typeof s.reportedDurationMs?Math.max(0,s.reportedDurationMs):Math.max(0,s.fallbackFinishedAtMs-s.fallbackStartedAtMs),A="ios"===e.device.platform&&void 0===sh(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sw(sh(t.count),1)??1,r=!0===t.doubleTap,n=sw(sh(t.holdMs),1);return 1===e&&!r&&void 0===n}case"react-native":return"dismiss-overlay"===t.action;default:return!1}}(t,S)?function(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return sr(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...I,gestureDurationMs:b}):sr(I),x=(l=e.snapshot,w=sh((d=S).referenceWidth),g=sh(d.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:si(l)),M=(c=t,u=r,p=S,f=A,m=b,h=x,v=sl[c],v?.(u,p,f,m,h)??[]);0!==M.length&&(y.gestureEvents.push(...M),N({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:M.length,tMs:A,gestureDurationMs:b,kinds:M.map(e=>e.kind)}}))}let sl={click:(e,t,r,n,i)=>sd(e,t,r,i),press:(e,t,r,n,i)=>sd(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?sd(e,t,r,i):[],fill:(e,t,r,n,i)=>sc(e,t,r,i),focus:(e,t,r,n,i)=>sc(e,t,r,i),longpress:function(e,t,r,n,i){let a=sg(t,e);if(!a)return[];let{x:o,y:s}=a;return[sf(r,o,s,sS(n,[sh(t.durationMs),sh(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sv(t,e),o=sm(t.contentDirection)??sm(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:c}=a,u=sS(n,[],250),p=sh(t.amount)??sh(e[1]),f=sh(t.pixels);return[{kind:"scroll",tMs:r,x:s,y:l,x2:d,y2:c,...i,durationMs:u,contentDirection:o,...void 0!==p?{amount:p}:{},...void 0!==f?{pixels:f}:{}}]},pan:su,fling:su,swipe:su,pinch:function(e,t,r,n,i){let a=sg(t,e,1),o=sh(t.scale)??sh(e[0]);if(!a||void 0===o||o<=0)return[];let{x:s,y:l}=a;return[{kind:"pinch",tMs:r,x:s,y:l,...i,scale:o,durationMs:sS(n,[],280)}]}};function sd(e,t,r,n){let i=sg(t,e);if(!i)return[];let{x:a,y:o}=i,s=sw(sh(t.count),1)??1,l=sw(sh(t.intervalMs),0)??0,d=!0===t.doubleTap,c=sw(sh(t.holdMs),1),u=[];for(let e=0;e<s;e+=1){let t=r+e*l;if(void 0!==c&&c>0){u.push(sf(t,a,o,c,n));continue}u.push(sp(t,a,o,n)),d&&u.push(sp(t+90,a,o,n))}return u}function sc(e,t,r,n){let i=sg(t,e);if(!i)return[];let{x:a,y:o}=i;return[sp(r,a,o,n)]}function su(e,t,r,n,i){let a=sv(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,c=sS(n,[sh(t.effectiveDurationMs),sh(t.durationMs),sh(e[4])],250),u=sw(sh(t.count),1)??1,p=sw(sh(t.pauseMs),0)??0,f="ping-pong"===t.pattern?"ping-pong":"one-way";return Array.from({length:u},(e,t)=>{var n,a,u,m,h,w,g,v,y,S,_,I,b;let A,{startX:x,startY:N,endX:M,endY:E}=(n=t,a=f,u=o,m=s,h=l,w=d,"ping-pong"===a&&n%2==1?{startX:h,startY:w,endX:u,endY:m}:{startX:u,startY:m,endX:h,endY:w});return g=r+t*(c+p),v=x,y=N,S=M,_=E,I=c,"back-swipe"===(A=function(e,t,r,n,i){if(!i||Math.abs(r-e)<=1.25*Math.abs(n-t))return"swipe";let a=.08*i.referenceWidth;return e<=a&&r>e||e>=i.referenceWidth-a&&r<e?"back-swipe":"swipe"}(v,y,S,_,b=i))?{kind:A,tMs:g,x:v,y,x2:S,y2:_,...b,durationMs:I,edge:function(e,t,r){if(r){let t=.08*r.referenceWidth;if(e<=t)return"left";if(e>=r.referenceWidth-t)return"right"}return t>=e?"left":"right"}(v,S,b)}:{kind:A,tMs:g,x:v,y,x2:S,y2:_,...b,durationMs:I}})}function sp(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sf(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sm(e){if("string"!=typeof e)return;let t=e.trim().toLowerCase();switch(t){case"up":case"down":case"left":case"right":return t;default:return}}function sh(e){if("number"==typeof e&&Number.isFinite(e))return e;if("string"!=typeof e||0===e.trim().length)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function sw(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sg(e,t,r=0){let n=sh(e.x)??sh(t[r]),i=sh(e.y)??sh(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function sv(e,t){let r=sy(e.x1,e.x,t[0]),n=sy(e.y1,e.y,t[1]),i=sy(e.x2,t[2]),a=sy(e.y2,t[3]);if(void 0!==r&&void 0!==n&&void 0!==i&&void 0!==a)return{x1:r,y1:n,x2:i,y2:a}}function sy(...e){return e.map(sh).find(e=>void 0!==e)}function sS(e,t,r){return sw(e,1)??t.map(e=>sw(e,1)).find(e=>void 0!==e)??r}let s_={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sI(e){var t,r,n,i,a,o,s,l;let d,c,u,p,f,{req:m,session:h,logPath:w,sessionStore:g,contextFromFlags:v}=e,y=function(e){if("pan"===e.command||"fling"===e.command||"rotate-gesture"===e.command||"transform-gesture"===e.command)return{ok:!1,message:"Use gesture pan, gesture fling, gesture swipe, gesture rotate, or gesture transform."};if("gesture"!==e.command)return{ok:!0,platformCommand:e.command,dispatchRequest:e,recordedCommand:e.command};let[t,...r]=e.positionals??[],n=t?s_[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:eS}}(m);if(!y.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:y.message}};let{platformCommand:S,dispatchRequest:_,recordedCommand:I}=y,b=await sA(h,S);if(b)return b;let A=await sb(h,S);if("response"in A)return A.response;let{resolvedPositionals:x,resolvedOut:N,recordedPositionals:M,recordedFlags:E}="screenshot"===(t=_).command?(c=(n=(r=t).positionals??[],i=r.meta?.cwd,(d=n[0])?[tK.expandHome(d,i),...n.slice(1)]:n),p=(u=(a=r.flags?.out,o=r.meta?.cwd,a?tK.expandHome(a,o):a))?{...r.flags??{},out:u}:r.flags??{},{resolvedPositionals:c,resolvedOut:u,recordedPositionals:c,recordedFlags:p}):{resolvedPositionals:f=(s=t).positionals??[],resolvedOut:s.flags?.out,recordedPositionals:f,recordedFlags:s.flags??{}},D=Date.now(),k={...v(m.flags,h.appBundleId,h.trace?.outPath),surface:h.surface},P=await sx({session:h,sessionName:e.sessionName,logPath:w,command:S,request:_,positionals:x,out:N,dispatchContext:k}),C=await sb(h,S,"after-command");if("response"in C)return C.response;"status"in A&&"recovered"===A.status&&(!P||"object"==typeof P)&&((P??={}).warning=A.warning);let R=Date.now(),O=I===S?M:m.positionals??[],T=I===S?E:m.flags??{};return function(e){let{session:t,sessionStore:r,command:n,recordedCommand:i,resolvedPositionals:a,recordedPositionals:o,recordedFlags:s,data:l,actionStartedAt:d,actionFinishedAt:c,flags:u}=e,p=function(e,t,r,n){if("scroll"!==t)return n;let i=si(e.snapshot),a={...n??{}},o=sm(a.direction)??sm(r[0]);if(!o)return n;let s=sh(a.amount)??sh(r[1]),l=sh(a.pixels),d=sv(a,[]),c=sh(a.referenceWidth),u=sh(a.referenceHeight),p=void 0!==c&&c>0&&void 0!==u&&u>0?{referenceWidth:c,referenceHeight:u}:i??so;if(d&&(d.x1!==d.x2||d.y1!==d.y2))return{...a,x1:d.x1,y1:d.y1,x2:d.x2,y2:d.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==l?{pixels:l}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250};let f=eq({direction:o,amount:s,pixels:l,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:f.x1,y1:f.y1,x2:f.x2,y2:f.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==f.pixels?{pixels:f.pixels}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250}}(t,n,a,l);ss(t,n,a,p,u,d,c),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:h,sessionStore:g,command:S,recordedCommand:I,resolvedPositionals:x,recordedPositionals:O,recordedFlags:T,data:P,actionStartedAt:D,actionFinishedAt:R,flags:m.flags??{}}),as(S)&&ai(h,S),ay(h.device.platform)&&("swipe"===(l=S)||"scroll"===l)&&(h.postGestureStabilization={action:S,markedAt:Date.now()}),{ok:!0,data:P??{}}}async function sb(e,t,r="before-command"){if("android"!==e.device.platform||!ey.androidBlockingDialogGuardedAction.has(t))return{status:"clear"};try{return await oE({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:T(e)}}}}async function sA(e,t){if(!io(t,e.device)){var r;let n=(r=e.device,ia[t]?.unsupportedHint?.(r));return{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:`${t} is not supported on this device`,...n?{hint:n}:{}}}}return"android"===e.device.platform&&e.recording&&"record"!==t&&await oM({session:e})==="failed"?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function sx(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await nz(r.device,n,a,o,{...s});let l=await a8({session:r,sessionName:e.sessionName,outPath:a[0]??o,outputPlacement:"screenshot"!==(t=i).command?"default":(t.positionals??[])[0]?"positional":t.flags?.out?"out":"default",dispatchContext:s});return i.flags?.overlayRefs&&"string"==typeof l?.path&&await sN(r,l,e.logPath),l}async function sN(e,t,r){let n={snapshotInteractiveOnly:!0,snapshotCompact:!0},i=aQ(await aK({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);a4(e,i);let a=await oX({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let sM=sj(()=>import("./lease.js")),sE=sj(()=>import("./session.js").then(e=>e.session_namespaceObject)),sD=sj(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),sk=sj(()=>import("./react-native.js")),sP=sj(()=>import("./record-trace.js").then(e=>e.record_trace_namespaceObject)),sC=sj(()=>import("./find.js")),sR=sj(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function sO(e){let{command:t}=e.req;return ey.leaseHandler.has(t)?await sT(e):ey.sessionHandler.has(t)?await sL(e):ey.snapshot.has(t)?await s$(e):ey.reactNativeHandler.has(t)?await sF(e):ey.recordTraceHandler.has(t)?await sU(e):ey.findHandler.has(t)?await sG(e):ey.interactionHandler.has(t)?await sq(e):null}async function sT(e){let{handleLeaseCommands:t}=await sM();return sV(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function sL(e){let{handleSessionCommands:t}=await sE();return sV(e.req.command,"session",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke,invokeReplayAction:e.invokeReplayAction,androidAdbExecutor:e.androidAdbExecutor}))}async function s$(e){let{handleSnapshotCommands:t}=await sD();return sV(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function sF(e){let{handleReactNativeCommands:t}=await sk();return sV(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function sU(e){let{handleRecordTraceCommands:t}=await sP();return sV(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function sG(e){let{handleFindCommands:t}=await sC();return sV(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function sq(e){let{handleInteractionCommands:t}=await sR();return sV(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function sj(e){let t;return()=>t??=e()}function sV(e,t,r){if(r)return r;throw new L("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let sB=new m;async function sH(e,t,r){let n=sB.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>sB.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function sK(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function sW(e,t){var r,n,i,a;let o,s,l,d,c,u;return e.recording?(r=e,n=t,o=z(r.name),s=`agent-device close --session ${o}`,l=`agent-device record stop --session ${o}`,d="selector-conflict"===n?`To keep using this device, rerun the command with --session ${o} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${o} for commands that should attach to the recording session.`,`Recording session "${r.name}" owns this device. Run ${l}; if the session still appears in agent-device session list, run ${s}. ${d} Run agent-device session list to inspect active sessions.`):(i=e,a=t,c=z(i.name),u=`agent-device close --session ${c}`,"selector-conflict"===a?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${c} and remove conflicting device selectors. To switch devices, first run ${u}, then open the desired device with a different --session name.`:`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${c}. To open a new session on this device, first run ${u}.`)}function sz(e,t){if(!t)return[];let r=[],n=e.device,i=rG(t.platform);if(i&&!rj(n.platform,i)&&r.push({key:"platform",value:t.platform}),t.target&&t.target!==(n.target??"mobile")&&r.push({key:"target",value:t.target}),t.udid&&("ios"!==n.platform||t.udid!==n.id)&&r.push({key:"udid",value:t.udid}),t.serial&&("android"!==n.platform||t.serial!==n.id)&&r.push({key:"serial",value:t.serial}),t.device&&t.device.trim().toLowerCase()!==n.name.trim().toLowerCase()&&r.push({key:"device",value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=n.simulatorSetPath?.trim();("ios"!==n.platform||"simulator"!==n.kind||e!==i)&&r.push({key:"iosSimulatorDeviceSet",value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=ec(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function sJ(e){return`${function(e){switch(e){case"iosSimulatorDeviceSet":return"--ios-simulator-device-set";case"androidDeviceAllowlist":return"--android-device-allowlist";default:return`--${e}`}}(e.key)}=${e.value}`}let sX="default";function sZ(e){return e.session||sX}function sY(e){if(e.meta?.sessionExplicit===!0||(e.session||sX)!==sX||e.meta?.sessionIsolation==="tenant"||e.flags?.sessionIsolation==="tenant")return;let r=function(e){if(!e||0===e.trim().length)return;let t=function(e){let t=n.resolve(e);try{return i.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(i.existsSync(n.join(t,".git")))return t;let e=n.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(r){var a;return{kind:"cwd",id:(a=r,t.createHash("sha256").update(a).digest("hex").slice(0,16))}}}function sQ(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function s0(e,t){let r=sY(e);return!!r&&!!t.sessionScope&&!sQ(t,r)}function s1(e){return{tenantId:e.meta?.tenantId??e.flags?.tenant,runId:e.meta?.runId??e.flags?.runId,leaseId:e.meta?.leaseId??e.flags?.leaseId,leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend}}let s2=ey.selectorValidationExempt,s3=ey.leaseAdmissionExempt,s4=new Set(s3),s5=new Set([ev.apps,ev.devices]);function s8(e,t){var r,n,i,a,o,s,l,d,c,u;let p,f,m,h=e.meta?.lockPolicy;if(!h)return e;let w={...e.flags??{}},g=s5.has(e.command),v=g?[]:t?sz(t,w):(r=w,n=e.meta?.lockPlatform,p=[],f=rG(n),void 0!==r.platform&&f&&(i=rG(r.platform),a=f,i&&a&&i!==a&&("apple"===i?!rq(a):"apple"!==a||!rq(i)))&&p.push({key:"platform",value:r.platform}),f&&(o=p,s=r,l=f,(m=s.target)&&function(e,t){switch(t){case"android":case"ios":return"desktop"===e;case"macos":case"linux":return"desktop"!==e;case"apple":return!1;default:return s9(t)}}(m,l)&&o.push({key:"target",value:m}),function(e,t,r){for(let n of function(e,t){switch(e){case"android":return["udid","iosSimulatorDeviceSet"];case"ios":return["serial","androidDeviceAllowlist"];case"apple":var r;return"desktop"===(r=t).target||"macos"===rG(r.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return s9(e)}}(r,t)){let r=t[n];r6(r)&&e.push({key:n,value:r})}}(p,r,f)),p),y=e.meta?.lockPlatform;if(0===v.length){return d=g,c=t,u=w,!y||c||void 0!==u.platform||d&&r9(u,r8)||(w.platform=y),{...e,flags:w}}if("strip"===h)return function(e,t,r,n){if(n){s6(e,t),e.platform=n.device.platform;return}s6(e,t),r&&void 0===e.platform&&(e.platform=r)}(w,v,y,t),{...e,flags:w};throw new L("INVALID_ARGS",function(e,t,r){let n=t.map(sJ).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${sK(r)}, but this request selected ${n}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:"";return`${e.command} is using a bound-session lock${a}, but this request selected ${n}.`}(e,v,t),{session:e.session,conflicts:v.map(sJ),hint:function(e,t){if(t)return sW(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${z(e.session)}`:"";return"Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. "+(r?`Run agent-device open <app>${n} --platform ${r} first if no session is active. `:`Run agent-device open <app>${n} first if no session is active. `)+"Run agent-device session list to inspect active sessions."}(e,t)})}function s6(e,t){for(let r of t)delete e[r.key]}function s9(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function s7(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[le(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return s8(e)}catch{return e}}(n);if("open"===(r=l).command||r9(r.flags,r5))try{let e=await rZ(l.flags??{});s.add(le(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=lt(e)-lt(t);return 0!==r?r:e.localeCompare(t)})}function le(e){return`device:${e}`}function lt(e){return+!e.startsWith("session:")}function lr(e,t={}){let r=ee(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function ln(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:lr(t,{simulatorSetPath:e.simulatorSetPath})}function li(e,t,r){return i_(ln(e,t),r)}let la="If runner build products look stale or corrupted, run `pnpm clean:xcuitest` in a local checkout, or remove ~/.agent-device/ios-runner/derived, then retry.";function lo(e){if(!(e instanceof L)||"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"))}function ls(e){return!(e instanceof L)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function ll(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new L("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:eo({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:el("IOS_RUNNER_CONNECT_TIMEOUT")})}async function ld(e){var t,r;let n,{session:i,port:a,logPath:o}=e,s=await i.testPromise,l="Runner did not accept connection (xcodebuild exited early)",d=eo({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new L("COMMAND_FAILED",l,{port:a,logPath:o,xcodebuild:{exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr},reason:d,hint:(t=s.stdout,r=s.stderr,(n=`${l}
1
+ import{__webpack_require__ as e}from"./rslib-runtime.js";import t,{createHash as r}from"node:crypto";import n from"node:path";import i,{existsSync as a,promises as o}from"node:fs";import s from"node:http";import{fileURLToPath as l,pathToFileURL as c}from"node:url";import"node:https";import d from"node:os";import{once as u}from"node:events";import{Transform as p}from"node:stream";import{pipeline as f}from"node:stream/promises";import{AsyncLocalStorage as m}from"node:async_hooks";import h from"node:fs/promises";import w from"node:net";import{resolveUserPath as g}from"./3267.js";import{appendScreenshotScriptFlags as v,screenshotOptionsFromFlags as y,screenshotFlagsFromOptions as S,SCREENSHOT_ACTION_FLAG_KEYS as _}from"./5310.js";import{withDiagnosticsScope as I,getDiagnosticsMeta as b,flushDiagnosticsToSessionFile as A,withDiagnosticTimer as x,emitDiagnostic as N}from"./7599.js";import{readProcessStartTime as M,readProcessCommand as D,resolveRuntimeTransportHints as E,isProcessGroupAlive as k,isAgentDeviceDaemonProcess as P,isProcessAlive as C}from"./8656.js";import{toAppErrorCode as R,asAppError as O,normalizeError as T,AppError as L}from"./9152.js";import{runCmdBackground as $,runCmdStreaming as F,runCmd as U,runCmdSync as G,resolveExecutableOverridePath as q,whichCmd as V}from"./9818.js";import{consumeTextLines as j,serializeDaemonResponseEnvelope as B,normalizeTenantId as H,shouldStreamRequestProgress as K,resolveDaemonPaths as W,resolveSessionIsolationMode as z,shellQuoteIfNeeded as J,resolveDaemonServerMode as X,resolveDaemonCodeSignature as Z,serializeDaemonProgressEnvelope as Y,serializeDaemonRpcResponseEnvelope as Q}from"./9238.js";import{runAndroidAdb as ee,resolveIosSimulatorDeviceSetPath as et,getAndroidBlockingDialogFocus as er,withRetry as en,Deadline as ei,isEnvTruthy as ea,openAndroidApp as eo,classifyBootFailure as es,streamAndroidLogcatWithAdb as el,bootFailureHint as ec,androidDeviceForSerial as ed,parseSerialAllowlist as eu,retryWithPolicy as ep,getAndroidAppState as ef,classifyAndroidAppTarget as em,captureAndroidLogcatWithAdb as eh,resolveAndroidSerialAllowlist as ew,isDeepLinkTarget as eg,formatAndroidInstalledPackageRequiredMessage as ev}from"./8806.js";import{PUBLIC_COMMANDS as ey,DAEMON_COMMAND_GROUPS as eS,GESTURE_SUBCOMMAND_ERROR as e_}from"./5792.js";import{findMistargetedTypeRefToken as eI,buildSwipePresetGesturePlan as eb,analyzeReactNativeOverlay as eA,parseScrollDirection as ex,isKeyboardAction as eN,isSystemScrollIndicatorLabel as eM,isReactNativeCollapsedWarningWrapperWithVisibleBanner as eD,formatScrollEdgeMessage as eE,deriveMobileSnapshotHiddenContentHints as ek,inferVerticalScrollIndicatorDirections as eP,captureScrollEdgeState as eC,normalizeSnapshotTree as eR,isReactNativeCollapsedWarningWrapperCandidate as eO,PNG as eT,createAgentDevice as eL,runScrollEdgePasses as e$,requireIntInRange as eF,inferGestureReferenceFrame as eU,localCommandPolicy as eG,decodePng as eq,buildScrollGesturePlan as eV,parseSwipePreset as ej}from"./9533.js";import{sleep as eB}from"./4829.js";import{readLocationCoordinate as eH,successText as eK,withSuccessText as eW,parseDeviceRotation as ez}from"./1998.js";import{findNearestAncestor as eJ,normalizeType as eX,pruneGroupNodes as eZ,findNodeByLabel as eY,resolveRefLabel as eQ}from"./940.js";import{snapshotPresentationOptionsFromFlags as e0,normalizeRef as e1,findNodeByRef as e2,buildSnapshotPresentationKey as e3,centerOfRect as e4,attachRefs as e5}from"./4057.js";import{isScrollableType as e8}from"./4778.js";import{readVersion as e6,findProjectRoot as e9}from"./9671.js";import{resolveAndroidAdbProvider as e7,resolveAndroidAdbExecutor as te}from"./9639.js";import{parseUiHierarchy as tt,ensureAndroidSnapshotHelper as tr,parseUiHierarchyTree as tn,captureAndroidSnapshotWithHelper as ti,captureAndroidSnapshotWithHelperSession as ta,parseAndroidSnapshotHelperManifest as to,forgetAndroidSnapshotHelperInstall as ts,buildUiHierarchySnapshot as tl,stopAndroidSnapshotHelperSession as tc}from"./221.js";import{applyCommandDefaults as td}from"./1352.js";var tu={};e.r(tu),e.d(tu,{IH:()=>uw,ug:()=>ug,sE:()=>ul,Bx:()=>uc,WX:()=>uh,Co:()=>uu,wg:()=>um,withAppLogProvider:()=>ua});var tp={};e.r(tp),e.d(tp,{IO:()=>iG,LB:()=>iU,xY:()=>iV,eN:()=>iq,runMacOsPressAction:()=>iH,runMacOsReadTextAction:()=>iB,rR:()=>iK,r5:()=>ij});var tf={};e.r(tf),e.d(tf,{bu:()=>cc,abortAllIosRunnerSessions:()=>c8,hv:()=>c2,Nr:()=>dM,gE:()=>dN,FS:()=>cs,runIosRunnerCommand:()=>dx,stopAllIosRunnerSessions:()=>c6,yA:()=>c5});var tm={};e.r(tm),e.d(tm,{v:()=>dc,M:()=>dd,withAppleRunnerProvider:()=>du});var th={};e.r(th),e.d(th,{ensureBootedSimulator:()=>uS,SA:()=>uI,EB:()=>uv,N3:()=>u_});var tw={};e.r(tw),e.d(tw,{qx:()=>iS,Ly:()=>ib,Gr:()=>iv,vT:()=>i_,Cc:()=>iI,withAppleToolProvider:()=>iy});var tg={};e.r(tg),e.d(tg,{readLinuxTextAtPoint:()=>ar,r:()=>at});var tv={};function ty(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}e.r(tv),e.d(tv,{uK:()=>iX,nE:()=>iY,withLinuxToolProvider:()=>iZ});let tS=["platform","device","udid","serial","out","verbose","metroHost","metroPort","bundleUrl","launchUrl","snapshotInteractiveOnly","snapshotCompact","snapshotDepth","snapshotScope","snapshotRaw",..._,"relaunch","saveScript","noRecord","fps","quality","hideTouches","count","intervalMs","delayMs","holdMs","jitterPx","doubleTap","clickButton","pauseMs","pattern"];function t_(e){let t=e.result?.text;if("string"==typeof t&&t.trim().length>0)return t;let r=e.positionals??[];if(0===r.length)return"";let n=r[0];return n?.startsWith("@")?r.length>=3?r.slice(2).join(" ").trim():r.slice(1).join(" ").trim():!(r.length>=3)||Number.isNaN(Number(r[0]))||Number.isNaN(Number(r[1]))?r.slice(1).join(" ").trim():r.slice(2).join(" ").trim()}function tI(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}let tb=/^-?\d+(\.\d+)?$/,tA=/^[^\s"\\]+$/,tx=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),tN=new Map([["--count","count"],["--pause-ms","pauseMs"]]),tM=new Map([["--delay-ms","delayMs"]]);function tD(e){return"click"===e||"press"===e}function tE(e){return tD(e)||"longpress"===e}function tk(e){return"type"===e||"fill"===e}function tP(e){return tR(e,tO)}function tC(e){return JSON.stringify(e)}function tR(e,t){return t(e)?e:tC(e)}function tO(e){return tT(e)&&e.startsWith("@")||tb.test(e)}function tT(e){return tA.test(e)}function tL(e){let t=(e.positionals??[]).map(e=>tP(e));return[e.command,...t].join(" ")}function t$(e,t){let r=t.flags??{};if(tD(t.command)){"number"==typeof r.count&&e.push("--count",String(r.count)),"number"==typeof r.intervalMs&&e.push("--interval-ms",String(r.intervalMs)),"number"==typeof r.holdMs&&e.push("--hold-ms",String(r.holdMs)),"number"==typeof r.jitterPx&&e.push("--jitter-px",String(r.jitterPx)),!0===r.doubleTap&&e.push("--double-tap");let t=r.clickButton;t&&"primary"!==t&&e.push("--button",t);return}if("swipe"===t.command){"number"==typeof r.count&&e.push("--count",String(r.count)),"number"==typeof r.pauseMs&&e.push("--pause-ms",String(r.pauseMs)),("one-way"===r.pattern||"ping-pong"===r.pattern)&&e.push("--pattern",r.pattern);return}tk(t.command)&&"number"==typeof r.delayMs&&e.push("--delay-ms",String(r.delayMs))}function tF(e,t){t&&(("ios"===t.platform||"android"===t.platform)&&e.push("--platform",t.platform),"string"==typeof t.metroHost&&t.metroHost.length>0&&e.push("--metro-host",tR(t.metroHost,tT)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",tR(t.bundleUrl,tT)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",tR(t.launchUrl,tT)))}function tU(e,t){let r=[],n={},i=tD(e)?tx:"swipe"===e?tN:tk(e)?tM:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(tD(e)&&"--double-tap"===o){n.doubleTap=!0;continue}let s=t[a+1];if(tD(e)&&"--button"===o&&void 0!==s){("primary"===s||"secondary"===s||"middle"===s)&&(n.clickButton=s),a+=1;continue}let l=i?.get(o);if(l&&void 0!==s){let e=tq(s);if(null!==e){n[l]=e,a+=1;continue}}if("swipe"===e&&"--pattern"===o&&void 0!==s){("one-way"===s||"ping-pong"===s)&&(n.pattern=s),a+=1;continue}r.push(o)}return{positionals:r,flags:n}}function tG(e){let t=[],r={};for(let n=0;n<e.length;n+=1){let i=e[n],a=e[n+1];if("--platform"===i&&void 0!==a){("ios"===a||"android"===a)&&(r.platform=a),n+=1;continue}if("--metro-host"===i&&void 0!==a){r.metroHost=a,n+=1;continue}if("--metro-port"===i&&void 0!==a){let e=tq(a);null!==e&&(r.metroPort=e),n+=1;continue}if("--bundle-url"===i&&void 0!==a){r.bundleUrl=a,n+=1;continue}if("--launch-url"===i&&void 0!==a){r.launchUrl=a,n+=1;continue}t.push(i)}return{positionals:t,flags:r}}function tq(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function tV(e){var t;let r=[],n={};for(let t of e){if("--relaunch"===t){n.relaunch=!0;continue}r.push(t)}let i=tG(r);return{positionals:i.positionals,flags:n,runtime:(t=i.flags).platform||t.metroHost||void 0!==t.metroPort||t.bundleUrl||t.launchUrl?i.flags:void 0}}function tj(e,t={}){let r=[e.command];if("snapshot"===e.command)e.flags?.snapshotInteractiveOnly&&r.push("-i"),e.flags?.snapshotCompact&&r.push("-c"),"number"==typeof e.flags?.snapshotDepth&&r.push("-d",String(e.flags.snapshotDepth)),e.flags?.snapshotScope&&r.push("-s",tP(e.flags.snapshotScope)),e.flags?.snapshotRaw&&r.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])r.push(tP(t));e.flags?.relaunch&&r.push("--relaunch"),tF(r,e.runtime)}else if("runtime"===e.command)!function(e,t,r={}){let n=t.positionals??[];for(let t of r.includeAllPositionals?n:n.slice(0,1))e.push(tR(t,tT));tF(e,t.flags)}(r,e,{includeAllPositionals:t.runtimeIncludeAllPositionals});else if("record"===e.command)!function(e,t){let[r,...n]=t.positionals??[];for(let t of(r&&e.push(tR(r,tT)),n))e.push(tP(t));"number"==typeof t.flags?.fps&&e.push("--fps",String(t.flags.fps)),"number"==typeof t.flags?.quality&&e.push("--quality",String(t.flags.quality)),t.flags?.hideTouches&&e.push("--hide-touches")}(r,e);else if("screenshot"===e.command){for(let t of e.positionals??[])r.push(tP(t));v(r,e.flags)}else{for(let t of e.positionals??[])r.push(tP(t));t$(r,e)}return r.join(" ")}class tB{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let r=n.dirname(t);i.existsSync(r)||i.mkdirSync(r,{recursive:!0});let a=function(e){var t=e,r=function(e){let t=[];for(let r of e.actions){if("snapshot"===r.command)continue;let n=function(e){let t=function(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>"string"==typeof e)?e.result.selectorChain:[];return t.length>0?t.join(" || "):void 0}(e);if(t&&tH(e.command))return tD(e.command)?{...e,positionals:[t]}:"longpress"===e.command?function(e,t){let r="number"==typeof e.result?.durationMs?String(e.result.durationMs):function(e){let t=e.at(-1);if(!(e.length<=1)&&void 0!==t&&""!==t.trim())return Number.isFinite(Number(t))?t:void 0}(e.positionals??[]);return{...e,positionals:r?[t,r]:[t]}}(e,t):"fill"===e.command?function(e,t){let r=t_(e);return r.length>0?{...e,positionals:[t,r]}:void 0}(e,t):function(e,t){let r=e.positionals?.[0];return"text"===r||"attrs"===r?{...e,positionals:[r,t]}:void 0}(e,t)}(r);if(n){t.push(n);continue}let i=function(e,t){if(!tH(t.command))return;let r=t.result?.refLabel;if("string"!=typeof r||0===r.trim().length)return;let n=r.trim();return{ts:t.ts,command:"snapshot",positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotCompact:!0,snapshotScope:n},result:{scope:n}}}(e,r);i&&t.push(i),t.push(r)}return t}(e);let n=[],i=t.device.kind?` kind=${t.device.kind}`:"";for(let e of(n.push(`context platform=${t.device.platform} device=${tC(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,tD(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(tP(r)),tK(e,t),t$(e,t),e.join(" ");if(1===t.positionals.length)return e.push(tP(r)),t$(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(tP(r)),tK(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(tP(n)),t$(e,t),e.join(" ")}(t,r):"get"===r.command?function(e,t){let r=t.positionals?.[0],n=t.positionals?.[1];if(r&&n)return e.push(tP(r)),e.push(tP(n)),n.startsWith("@")&&tK(e,t),e.join(" ")}(t,r):void 0);return n||tj(e)}(e));return`${n.join("\n")}
2
+ `}(e);return i.writeFileSync(t,a),{written:!0,path:t}}catch(r){return N({level:"warn",phase:"session_script_write_failed",data:{session:e.name,path:t,error:r instanceof Error?r.message:String(r)}}),{written:!1}}}resolveScriptPath(e){if(e.saveScriptPath)return g(e.saveScriptPath,{cwd:void 0});i.existsSync(this.sessionsDir)||i.mkdirSync(this.sessionsDir,{recursive:!0});let t=ty(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return n.join(this.sessionsDir,`${t}-${r}.ad`)}}function tH(e){return tE(e)||"fill"===e||"get"===e}function tK(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(tP(r))}class tW{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new tB(e)}get(e){return this.sessions.get(e)}set(e,t){this.sessions.set(e,t)}delete(e){return this.runtimeHints.delete(e),this.sessions.delete(e)}values(){return this.sessions.values()}toArray(){return Array.from(this.sessions.values())}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){this.runtimeHints.set(e,t)}clearRuntimeHints(e){return this.runtimeHints.delete(e)}recordAction(e,t){t.flags?.noRecord||(t.flags?.saveScript&&(e.recordSession=!0,"string"==typeof t.flags.saveScript&&(e.saveScriptPath=g(t.flags.saveScript,{cwd:void 0}))),e.actions.push({ts:Date.now(),command:t.command,positionals:t.positionals,runtime:t.runtime,flags:function(e){if(!e)return{};let t={};for(let r of tS)void 0!==e[r]&&(t[r]=e[r]);return t}(t.flags),result:t.result}),N({level:"debug",phase:"record_action",data:{command:t.command,session:e.name}}))}writeSessionLog(e){let t=this.scriptWriter.write(e);t.written&&N({level:"info",phase:"session_script_written",data:{session:e.name,path:t.path}})}defaultTracePath(e){let t=ty(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return n.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return n.join(this.sessionsDir,ty(e))}ensureSessionDir(e){let t=this.resolveSessionDir(e);return i.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return n.join(this.resolveSessionDir(e),"app.log")}resolveAppLogPidPath(e){return n.join(this.resolveSessionDir(e),"app-log.pid")}static expandHome(e,t){return g(e,{cwd:t})}}let tz="app-log.pid";function tJ(e){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t))return{pid:Number.parseInt(t,10)};try{let e=JSON.parse(t);if(!Number.isInteger(e.pid)||e.pid<=0)return null;return e}catch{return null}}function tX(e,t){if(!e)return;let r=n.dirname(e);i.existsSync(r)||i.mkdirSync(r,{recursive:!0});let a={pid:t,startTime:M(t)??void 0,command:D(t)??void 0};i.writeFileSync(e,`${JSON.stringify(a)}
3
+ `)}function tZ(e){if(e&&i.existsSync(e))try{i.unlinkSync(e)}catch{}}let tY=new Set,tQ=new Map,t0="request_canceled",t1="request canceled";function t2(e,t){if("string"==typeof e&&e.length>0)return e;let r=("string"==typeof t?t:"number"==typeof t&&Number.isFinite(t)?String(t):"generated").trim().replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,32)||"generated",n=Math.random().toString(36).slice(2,10);return`req:${r}:${process.pid}:${Date.now()}:${n}`}function t3(e){if(!e)return;!function(e){if(e.size<=5e4)return;let t=0;for(let r of e.keys()){if(t>=1e4)break;e.delete(r),t++}}(tQ);let t=new AbortController;tQ.set(e,t),tY.has(e)&&t.abort()}function t4(e){e&&(!function(e){if(e.size<=5e4)return;let t=0;for(let r of e){if(t>=1e4)break;e.delete(r),t++}}(tY),tY.add(e),tQ.get(e)?.abort())}function t5(e){e&&(tY.delete(e),tQ.delete(e))}function t8(e){return!!e&&tY.has(e)}function t6(e){if(e)return tQ.get(e)?.signal}function t9(){return new L("COMMAND_FAILED",t1,{reason:t0})}function t7(e){if(t8(e))throw t9()}function re(e){return e instanceof L&&"COMMAND_FAILED"===e.code&&(e.details?.reason===t0||e.message===t1)}let rt=new Map;function rr(e){let r=t.randomUUID(),n=setTimeout(()=>{rn(r)},9e5);return n.unref(),rt.set(r,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),r}function rn(e){let t=rt.get(e);if(t&&(clearTimeout(t.timer),rt.delete(e),t.deleteAfterDownload))try{i.rmSync(t.artifactPath,{force:!0})}catch{}}let ri=new Map;function ra(e,t){let r=ri.get(e);if(!r)throw new L("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new L("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function ro(e){let t=ri.get(e);t&&(clearTimeout(t.timer),ri.delete(e),i.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function rs(e){let t=await rl(e);await U("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=n.join(e.tempDir,t);if(!i.existsSync(r))throw new L("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function rl(e){let t=await U("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new L("INVALID_ARGS","Artifact is not a valid tar archive",{archivePath:e.archivePath,stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let r=t.stdout.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(0===r.length)throw new L("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(rc),i=e.expectedRootName??function(e,t){let r=new Set;for(let t of e){let[e]=t.split("/");e&&r.add(e)}let n=[...r];if("ios"===t){let e=n.filter(e=>e.toLowerCase().endsWith(".app")),t=e[0];if(void 0!==t&&1===e.length)return t;if(0===e.length)throw new L("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new L("INVALID_ARGS",`iOS app bundle archives must contain exactly one top-level .app directory, found: ${e.join(", ")}`)}let i=n[0];if(void 0!==i&&1===n.length)return i;throw new L("INVALID_ARGS",`Archive must contain a single top-level bundle, found: ${n.join(", ")}`)}(n,e.platform);if(!n.some(e=>e===i||e.startsWith(`${i}/`)))throw new L("INVALID_ARGS",`Uploaded archive must contain a top-level "${i}" bundle`);for(let e of n){var a=e,o=i;if(a!==o&&!a.startsWith(`${o}/`))throw new L("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await U("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new L("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rc(e){if(e.includes("\0"))throw new L("INVALID_ARGS",`Invalid archive entry: ${e}`);if(n.posix.isAbsolute(e))throw new L("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=n.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new L("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function rd(e,t){return new Promise((r,n)=>{let a,o=!1,s=0,l=i.createWriteStream(t),c=e=>{if(!o){if(o=!0,a&&clearTimeout(a),e)return void ru(l,t).finally(()=>n(e));r()}},d=()=>{a&&clearTimeout(a),a=setTimeout(()=>{let t=new L("COMMAND_FAILED","Artifact transfer timed out due to inactivity",{timeoutMs:6e4});"destroy"in e&&"function"==typeof e.destroy&&e.destroy(t),u.destroy(t),c(t)},6e4)},u=new p({transform(e,t,r){d();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new L("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{c(new L("COMMAND_FAILED","Artifact transfer was interrupted"))}),d(),f(e,u,l).then(()=>c(),e=>c(e))})}async function ru(e,t){if(e.destroy(),!e.closed)try{await u(e,"close")}catch{}await i.promises.rm(t,{force:!0}).catch(()=>{})}async function rp(e){let t,r=e.headers["x-artifact-type"],a=e.headers["x-artifact-filename"];if(!r||!a)throw new L("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new L("INVALID_ARGS",`Invalid x-artifact-type: ${r}. Must be "file" or "app-bundle".`);!function(e){if(void 0===e)return;let t=Number(e);if(Number.isFinite(t)&&t>0x80000000)throw new L("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let o=function(e){let t=e.trim(),r=n.basename(t);if(!r||"."===r||".."===r)throw new L("INVALID_ARGS",`Invalid artifact filename: ${e}`);return r}(a),s=(t=function(e){let t=e?.trim();if(!t)return"request";let r=t.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return r.length>0?r.slice(0,48):"request"}("upload"),i.mkdtempSync(n.join(d.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===r){let t=n.join(s,o);return await rd(e,t),{artifactPath:t,tempDir:s}}let t=n.join(s,"artifact.tar");await rd(e,t);let a=await rs({archivePath:t,tempDir:s,platform:"ios",expectedRootName:o});return i.rmSync(t,{force:!0}),{artifactPath:a,tempDir:s}}catch(e){throw i.rmSync(s,{recursive:!0,force:!0}),e}}let rf=new m;async function rm(e,t){return await rf.run(e,t)}function rh(e){rf.getStore()?.(e)}let rw=new Set(["agent_device.command","agent-device.command"]),rg=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rv=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),ry={"agent_device.lease.allocate":"lease_allocate","agent-device.lease.allocate":"lease_allocate","agent_device.lease.heartbeat":"lease_heartbeat","agent-device.lease.heartbeat":"lease_heartbeat","agent_device.lease.release":"lease_release","agent-device.lease.release":"lease_release"},rS=new Set([...rw,...rg,...rv,...Object.keys(ry)]);function r_(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rI(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function rb(e,t){e.destroyed||(e.write(Q(t)),e.end())}function rA(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rx(e,t){let r="string"==typeof t.authorization?t.authorization:"",n=r.toLowerCase().startsWith("bearer ")?r.slice(7):void 0,i="string"==typeof t["x-agent-device-token"]?t["x-agent-device-token"]:void 0;return("string"==typeof e.token?e.token:void 0)??i??n??""}function rN(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rM(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rD(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new L("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function rE(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new L("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function rk(e,t){if(!e)return{ok:!0};let r=await e(t);if(void 0===r||!0===r)return{ok:!0};if(!1===r){let e=T(new L("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:r_(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=T(new L(R(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:r_(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=H(r.tenantId);if(!e){let e=T(new L("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:r_(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rP(){let e,t=process.env.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let r=process.env.AGENT_DEVICE_HTTP_AUTH_EXPORT||"default",i=n.isAbsolute(t)?t:n.resolve(t);try{e=await import(c(i).href)}catch(e){throw new L("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:i,error:e instanceof Error?e.message:String(e)})}let a=e[r];if("function"!=typeof a)throw new L("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:i,exportName:r});return a}async function rC(e){let t=await rP(),{handleRequest:r,token:n}=e;return s.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!0}));return}if("POST"===e.method&&"/upload"===e.url)return void rR(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void rO(e,i,t,n);if("POST"!==e.method||"/rpc"!==e.url){i.statusCode=404,i.end("Not found");return}let a="";e.setEncoding("utf8"),e.on("data",t=>{(a+=t).length>1048576&&e.destroy(Error("request too large"))}),e.on("error",()=>{i.headersSent||rI(i,r_(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rI(i,r_(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rI(i,r_(n.id??null,-32600,"Invalid Request"),400);if(!rS.has(n.method))return void rI(i,r_(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rI(i,r_(n.id??null,-32602,"Invalid params"),400);try{var s;let a=n.params,l=function(e,t,r){if(rw.has(e))return{token:rx(t,r),session:t.session??"default",command:t.command??"",positionals:Array.isArray(t.positionals)?t.positionals:[],flags:t.flags,runtime:t.runtime,meta:t.meta};if(rg.has(e)){let e,n=rN(t,"platform");if("ios"!==n&&"android"!==n)throw new L("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:rx(t,r),session:rN(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rN(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new L("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new L("INVALID_ARGS","Invalid params: source.url is required for url sources");let r=t.headers,n={};if(void 0!==r){if(!r||"object"!=typeof r||Array.isArray(r))throw new L("INVALID_ARGS","Invalid params: source.headers must be a string map");for(let[e,t]of Object.entries(r)){if("string"!=typeof t)throw new L("INVALID_ARGS","Invalid params: source.headers values must be strings");n[e]=t}}return Object.keys(n).length>0?{kind:"url",url:e,headers:n}:{kind:"url",url:e}}if("path"===t.kind){let e="string"==typeof t.path?t.path.trim():"";if(!e)throw new L("INVALID_ARGS","Invalid params: source.path is required for path sources");return{kind:"path",path:e}}if("github-actions-artifact"===t.kind)return function(e){let t,r=rD(e,"owner"),n=rD(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new L("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new L("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new L("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:rE(e,"artifactId")}:(a&&(t=rE(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rD(e,"artifactName")})}(t);throw new L("INVALID_ARGS",'Invalid params: source.kind must be "url", "path", or "github-actions-artifact"')}(t),retainMaterializedPaths:(e=t.retainPaths,"boolean"==typeof e?e:void 0),materializedPathRetentionMs:rM(t,"retentionMs")}}}if(rv.has(e)){let e=rN(t,"materializationId")?.trim();if(!e)throw new L("INVALID_ARGS","Invalid params: materializationId is required");return{token:rx(t,r),session:rN(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rN(t,"requestId"),materializationId:e}}}let n=ry[e];if(n)return{token:rx(t,r),session:rN(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rN(t,"tenantId")??rN(t,"tenant"),runId:rN(t,"runId"),leaseId:rN(t,"leaseId"),leaseTtlMs:rM(t,"ttlMs"),leaseBackend:rN(t,"backend")}};throw new L("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(s=n.method,rw.has(s)&&("string"!=typeof l.command||0===l.command.length))return void rI(i,r_(n.id??null,-32602,"Invalid params: command is required"),400);o=t2(l.meta?.requestId,n.id),l.meta={...l.meta,requestId:o},t3(o);let c=()=>{i.writableFinished||t4(o)};e.on("aborted",c),i.on("close",c);let d=await rk(t,{headers:e.headers,rpcRequest:n,daemonRequest:l});if(!d.ok)return void rI(i,d.response,d.statusCode);if(d.tenantId&&(l.meta={...l.meta,tenantId:d.tenantId,sessionIsolation:l.meta?.sessionIsolation??l.flags?.sessionIsolation??"tenant"}),K(l)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await rm(e=>{!i.destroyed&&i.write(Y(e))},async()=>await r(l)),t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:r_(n.id??null,-32e3,e.error.message,e.error);rb(i,t);return}let u=await r(l);if(u.ok)return void rI(i,{jsonrpc:"2.0",id:n.id??null,result:u});rI(i,r_(n.id??null,-32e3,u.error.message,u.error),rA(u.error.code))}catch(t){let e=T(t);if(i.headersSent)return void rb(i,r_(n.id??null,-32e3,e.message,e));rI(i,r_(n.id??null,-32e3,e.message,e),rA(e.code))}finally{t5(o)}})})}async function rR(e,r,n,i){try{var a;let o,s,l=await rT({req:e,res:r,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let c=await rp(e),d=(a={artifactPath:c.artifactPath,tempDir:c.tempDir,tenantId:l.tenantId},o=t.randomUUID(),(s=setTimeout(()=>{ro(o)},3e5)).unref(),ri.set(o,{artifactPath:a.artifactPath,tempDir:a.tempDir,tenantId:a.tenantId,timer:s}),o);r.statusCode=200,r.setHeader("content-type","application/json"),r.end(JSON.stringify({ok:!0,uploadId:d}))}catch(e){rL(r,T(e))}}async function rO(e,t,r,n){let a=e.url?.slice("/artifacts/".length)??"";if(!a){t.statusCode=400,t.end("Missing artifact id");return}try{let o=await rT({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[a]}});if(!o)return;let s=function(e,t){let r=rt.get(e);if(!r)throw new L("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new L("UNAUTHORIZED","Artifact belongs to a different tenant");if(!i.existsSync(r.artifactPath))throw rn(e),new L("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(a,o.tenantId),l=i.createReadStream(s.artifactPath);t.statusCode=200,t.setHeader("content-type","application/octet-stream"),s.fileName&&t.setHeader("content-disposition",`attachment; filename="${s.fileName.replace(/"/g,"")}"`),l.on("error",e=>{if(t.headersSent)t.destroy(e);else{let r=T(e);t.statusCode=rA(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rn(a)}),l.pipe(t)}catch(e){rL(t,T(e))}}async function rT(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=rx({},n.headers),c=(t=l,(r=o)&&t!==r?T(new L("UNAUTHORIZED","Invalid token")):null);if(c)return rL(i,c),null;let d=await rk(a,{headers:n.headers,rpcRequest:{jsonrpc:"2.0",id:null,method:"agent_device.command"},daemonRequest:{token:l,session:"default",command:s.command,positionals:s.positionals}});return d.ok?{tenantId:d.tenantId}:(i.statusCode=d.statusCode,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!1,error:d.response.error?.data?.message??d.response.error?.message??"Unauthorized"})),null)}function rL(e,t){e.statusCode=rA(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function r$(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function rF(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function rU(e){let t=(e??"").trim().toLowerCase();if(!t||"ios-simulator"===t)return"ios-simulator";if("ios-instance"===t||"android-instance"===t)return t;throw new L("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class rG{leases=new Map;runBindings=new Map;maxActiveSimulatorLeases;defaultLeaseTtlMs;minLeaseTtlMs;maxLeaseTtlMs;now;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.defaultLeaseTtlMs=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,this.minLeaseTtlMs=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):5e3,this.maxLeaseTtlMs=Number.isInteger(e.maxLeaseTtlMs)?Math.max(this.minLeaseTtlMs,Number(e.maxLeaseTtlMs)):6e5,this.now=e.now??(()=>Date.now())}allocateLease(e){let r=rU(e.backend),n=H(e.tenantId);if(!n)throw new L("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=r$(e.runId);if(!i)throw new L("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");this.cleanupExpiredLeases();let a=this.resolveLeaseTtlMs(e.ttlMs),o=this.bindingKey(n,i,r),s=this.runBindings.get(o);if(s){let e=this.leases.get(s);if(e)return this.refreshLease(e,a);this.runBindings.delete(o)}this.enforceCapacity(r);let l=this.now(),c={leaseId:t.randomBytes(16).toString("hex"),tenantId:n,runId:i,backend:r,createdAt:l,heartbeatAt:l,expiresAt:l+a};return this.leases.set(c.leaseId,c),this.runBindings.set(o,c.leaseId),{...c}}heartbeatLease(e){let t=rF(e.leaseId);if(!t)throw new L("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);if(!r)throw new L("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});this.assertOptionalScopeMatch(r,e.tenantId,e.runId);let n=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(r,n)}releaseLease(e){let t=rF(e.leaseId);if(!t)throw new L("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);return r?(this.assertOptionalScopeMatch(r,e.tenantId,e.runId),this.leases.delete(t),this.runBindings.delete(this.bindingKey(r.tenantId,r.runId,r.backend)),{released:!0}):{released:!1}}assertLeaseAdmission(e){let t=rU(e.backend),r=H(e.tenantId);if(!r)throw new L("INVALID_ARGS","tenant isolation requires tenant id.");let n=r$(e.runId);if(!n)throw new L("INVALID_ARGS","tenant isolation requires run id.");let i=rF(e.leaseId);if(!i)throw new L("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new L("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==r||a.runId!==n)throw new L("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}cleanupExpiredLeases(){let e=this.now();for(let t of this.leases.values())t.expiresAt>e||(this.leases.delete(t.leaseId),this.runBindings.delete(this.bindingKey(t.tenantId,t.runId,t.backend)))}enforceCapacity(e){if("ios-simulator"!==e||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>"ios-simulator"===e.backend).length;if(!(t<this.maxActiveSimulatorLeases))throw new L("COMMAND_FAILED","No simulator lease capacity available",{reason:"LEASE_CAPACITY_EXCEEDED",activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:"Retry after releasing another simulator lease."})}resolveLeaseTtlMs(e){if(!Number.isInteger(e))return this.defaultLeaseTtlMs;let t=Number(e);if(t<this.minLeaseTtlMs||t>this.maxLeaseTtlMs)throw new L("INVALID_ARGS",`Lease ttlMs must be between ${this.minLeaseTtlMs} and ${this.maxLeaseTtlMs}.`);return t}refreshLease(e,t){let r=this.now(),n={...e,heartbeatAt:r,expiresAt:r+t};return this.leases.set(n.leaseId,n),this.runBindings.set(this.bindingKey(n.tenantId,n.runId,n.backend),n.leaseId),{...n}}bindingKey(e,t,r){return`${e}:${t}:${r}`}assertOptionalScopeMatch(e,t,r){let n=H(t),i=r$(r);if(t&&!n)throw new L("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&!i)throw new L("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(n&&e.tenantId!==n||i&&e.runId!==i)throw new L("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}function rq(e){return e}function rV(e){return"apple"===e||"ios"===e||"macos"===e}function rj(e,t){return!t||("apple"===t?rV(e):e===t)}function rB(e){let{simulatorSetPath:t,platform:r,target:n}=e;if(t&&"macos"!==r&&"desktop"!==n)return t}async function rH(e,t,r={}){let n=e,i=e=>e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim();if(t.platform&&(n=n.filter(e=>rj(e.platform,t.platform))),t.target&&(n=n.filter(e=>(e.target??"mobile")===t.target)),t.udid){let e=n.find(e=>e.id===t.udid&&rV(e.platform));if(!e)throw new L("DEVICE_NOT_FOUND",`No Apple device with UDID ${t.udid}`);return e}if(t.serial){let e=n.find(e=>e.id===t.serial&&"android"===e.platform);if(!e)throw new L("DEVICE_NOT_FOUND",`No Android device with serial ${t.serial}`);return e}if(t.deviceName){let e=i(t.deviceName),r=n.find(t=>i(t.name)===e);if(!r)throw new L("DEVICE_NOT_FOUND",`No device named ${t.deviceName}`);return r}let a=n[0];if(void 0!==a&&1===n.length)return a;if(0===n.length){var o;let e=r.simulatorSetPath;if(e&&(!(o=t.platform)||"apple"===o||"ios"===o))throw new L("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 L("DEVICE_NOT_FOUND","No devices found",{selector:t})}let s=n.filter(e=>"device"!==e.kind);s.length>0&&(n=s);let l=n.filter(e=>e.booted),c=l[0];if(void 0!==c&&1===l.length)return c;let d=l[0]??n[0];if(void 0===d)throw new L("DEVICE_NOT_FOUND","No devices found",{selector:t});return d}async function rK(e){var t;if("macos"===(t=e).platform||"apple"===t.platform&&"desktop"===t.target){let{listMacosDevices:e}=await import("./devices~2.js");return await e()}if("linux"===e.platform){let{listLinuxDevices:e}=await import("./devices~1.js");return await e()}if("android"===e.platform){let{listAndroidDevices:t}=await import("./8806.js");return await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0})}if(e.platform){let{listAppleDevices:t}=await import("./devices.js");return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}let r=[];try{let{listAndroidDevices:t}=await import("./8806.js");r.push(...await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0}))}catch{}try{let{listAppleDevices:t}=await import("./devices.js");r.push(...await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid}))}catch{}try{let{listLinuxDevices:e}=await import("./devices~1.js");r.push(...await e())}catch{}return r}let rW=new m,rz=new m;async function rJ(e,t,r){var n,i;let a=await rX(e,t,r);if(n=t,i=a,!rZ(n)&&(!n.platform||"apple"===n.platform||"ios"===n.platform)&&"desktop"!==n.target&&(!i||"device"===i.kind)){let{findBootableIosSimulator:e}=await import("./devices.js"),n=await e({simulatorSetPath:r.simulatorSetPath,target:t.target});if(n)return n}if(a)return a;throw new L("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function rX(e,t,r){try{return await rH(e,t,r)}catch(e){var n;if(n=e,!rZ(t)&&n instanceof L&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function rZ(e){return!!(e.udid||e.serial||e.deviceName)}async function rY(e){let t=rq(e.platform),r=rB({simulatorSetPath:et(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=ew(e.androidDeviceAllowlist),i=function(e){let{flags:t,normalizedPlatform:r,iosSimulatorSetPath:n,androidSerialAllowlist:i}=e;return JSON.stringify({platform:r,target:t.target,device:t.device,udid:t.udid,serial:t.serial,iosSimulatorSetPath:n,androidSerialAllowlist:i?Array.from(i).sort():void 0})}({flags:e,normalizedPlatform:t,iosSimulatorSetPath:r,androidSerialAllowlist:n}),a={platform:t,target:e.target,cacheHit:!1};return await x("resolve_target_device",async()=>{let o=function(e){let t=rW.getStore(),r=t?.get(e);if(r)return{...r}}(i);if(o)return a.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 L("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await r3({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return r4(s)?r5(i,await rJ(l,s,{simulatorSetPath:r})):r5(i,await rH(l,s,{simulatorSetPath:r}));let c=await rK({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return r4(s)?r5(i,await rJ(c,s,{simulatorSetPath:r})):r5(i,await rH(c,s,{simulatorSetPath:r}))},a)}async function rQ(e){return rW.getStore()?await e():await rW.run(new Map,e)}async function r0(e,t){return e?await rz.run(e,t):await t()}async function r1(e,t){return await r0(e,async()=>await rQ(t))}async function r2(e){return await r3(e)??await rK(e)}async function r3(e){let t=rz.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function r4(e){return!!e.platform&&"android"!==e.platform&&"linux"!==e.platform}function r5(e,t){return rW.getStore()?.set(e,{...t}),t}let r8=["platform","target","device","udid","serial"],r6=[...r8,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function r9(e){return"string"==typeof e&&e.trim().length>0}function r7(e,t){return!!e&&t.some(t=>r9(e[t]))}let ne=[{resolverKey:"androidAdbProvider",resolve(e,t){let r=e.androidAdbProvider;if(!r||"android"!==t.device.platform)return{};let n=r(t),i="function"==typeof n?n:n?.exec;return{androidAdb:{provider:n,executor:i,serial:t.device.id}}},async appendWrapper(e,t){if(!e.androidAdb?.provider)return;let{withAndroidAdbProvider:r}=await import("./9639.js");na(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&rV(t.device.platform)?{appleRunner:{provider:r(t),deviceId:t.device.id,requestId:t.req.meta?.requestId}}:{}},async appendWrapper(e,t){if(!e.appleRunner?.provider)return;let{withAppleRunnerProvider:r}=await Promise.resolve(tm);na(t,e.appleRunner,(t,n)=>r(t,{deviceId:e.appleRunner?.deviceId??"",requestId:e.appleRunner?.requestId},n))}},{resolverKey:"appleToolProvider",resolve(e,t){let r=e.appleToolProvider;return r&&rV(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(tw);na(t,e.appleTool,r)}},{resolverKey:"linuxToolProvider",resolve(e,t){let r=e.linuxToolProvider;return r&&"linux"===t.device.platform?{linuxTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.linuxTool?.provider)return;let{withLinuxToolProvider:r}=await Promise.resolve(tv);na(t,e.linuxTool,r)}},{resolverKey:"appLogProvider",resolve(e,t){let r=e.appLogProvider;return r?{appLog:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appLog?.provider)return;let{withAppLogProvider:r}=await Promise.resolve(tu);na(t,e.appLog,r)}},{resolverKey:"recordingProvider",resolve(e,t){let r=e.recordingProvider;return r?{recording:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.recording?.provider)return;let{withRecordingProvider:r}=await import("./recording-provider.js");na(t,e.recording,r)}}];async function nt(e,t){let r=await nr(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await ni(r);return await no(i,async()=>await t(n))}async function nr(e){var t,r,n;if(t=e.providers,!ne.some(e=>!!t[e.resolverKey]))return{};let i=await nn(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return ne.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function nn(e,t){var r;if(t)return e.command===ey.apps&&r7(e.flags,r8)?await rY(e.flags??{}):t.device;if(e.command===ey.open||r7(e.flags,r8)||(r=e).command===ey.record&&"start"===(r.positionals?.[0]??"").toLowerCase())return await rY(e.flags??{})}async function ni(e){let t=[];for(let r of ne)await r.appendWrapper(e,t);return t}function na(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function no(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function ns(e,t){switch(e.platform){case"android":{let{createAndroidInteractor:t}=await import("./android.js");return t(e)}case"linux":{let{createLinuxInteractor:e}=await import("./linux.js");return e()}case"ios":case"macos":{let{createAppleInteractor:r}=await import("./apple.js");return r(e,t)}default:throw new L("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let nl=/^[A-Za-z0-9_.:-]{1,64}$/,nc="--launch-console is supported only for iOS simulator app launches",nd="--launch-console requires a direct app launch and cannot be used with URL opens";function nu(e){return e?.clickButton??"primary"}function np(e){return"primary"===e.button?null:"click"!==e.commandLabel?new L("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new L("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new L("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 L("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function nf(e){return"primary"===e?{}:{button:e}}let nm=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function nh(e){return"ios"===e.platform&&"tv"!==e.target}async function nw(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await eB(t)}async function ng(e,t){let{x:r,y:n}=nA(t,"longpress requires x y [durationMs]",{hint:"Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i -c, use the target rect center as x y, then retry longpress x y durationMs."}),i=t[2]?Number(t[2]):void 0;return await e.longPress(r,n,i),{x:r,y:n,durationMs:i,...eK(`Long pressed (${r}, ${n})`)}}async function nv(e,t){let{x:r,y:n}=nA(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...eK(`Focused (${r}, ${n})`)}}async function ny(e,t,r){let n=eI(t[0]);if(n)throw new L("INVALID_ARGS",`type does not accept a target ref like "${n}"`,{hint:`Use fill ${n} "text" to target that field, or press ${n} then type "text" to append.`});let i=t.join(" ");if(!i)throw new L("INVALID_ARGS","type requires text");let a=eF(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...eK(nH("Typed",i))}}async function nS(e,t,r){if(r?.directElementSelector)return await n_(e,r.directElementSelector,t,r);let n=Number(t[0]),i=Number(t[1]),a=t.slice(2).join(" ");if(Number.isNaN(n)||Number.isNaN(i)||!a)throw new L("INVALID_ARGS","fill requires x y text");let o=eF(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...eK(nH("Filled",a))}}async function n_(e,t,r,n){if(!e.fillElementSelector)throw new L("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new L("INVALID_ARGS","fill requires text");let a=eF(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...eK(nH("Filled",i))}}async function nI(e,t,r,n){var i,a,o,s;if(n?.directElementSelector&&"ios"===e.platform)return await nb(t,n.directElementSelector);let{x:l,y:c}=nA(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await nx(l,c,n);let d=nu(n);if("primary"!==d)return await nN(e,l,c,d,n);let u=(s=n,{count:nD(s?.count,1,"count",1,200),intervalMs:nD(s?.intervalMs,0,"interval-ms",0,1e4),holdMs:nD(s?.holdMs,0,"hold-ms",0,1e4),jitterPx:nD(s?.jitterPx,0,"jitter-px",0,100),doubleTap:!!s?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new L("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new L("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(u),i=u.count,a=u.holdMs,o=u.jitterPx,rV(e.platform)&&i>1&&0===a&&0===o)?await nE(e,l,c,u,n):await nk(t,l,c,u)}async function nb(e,t){if(!e.tapElementSelector)throw new L("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...eK(`Tapped ${t.raw}`)}}function nA(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new L("INVALID_ARGS",t,r);return{x:n,y:i}}async function nx(e,t,r){let n=nu(r);if("primary"!==n)throw new L("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(tp);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...eK(nj({x:e,y:t}))}}async function nN(e,t,r,n,i){if(function(e,t,r){let n=np({commandLabel:"click",platform:e.platform,button:t,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(n)throw n}(e,n,i),"linux"===e.platform)return await nM(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(tf);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},nP(i)),{x:t,y:r,button:n,...eK(nj({x:t,y:r,button:n}))}}async function nM(e,t,r){if("secondary"===r){let{rightClickLinux:r}=await import("./input-actions~1.js");await r(e,t)}else{let{middleClickLinux:r}=await import("./input-actions~1.js");await r(e,t)}return{x:e,y:t,button:r,...eK(nj({x:e,y:t,button:r}))}}function nD(e,t,r,n,i){return eF(void 0===e?t:e,r,n,i)}async function nE(e,t,r,n,i){let{runIosRunnerCommand:a}=await Promise.resolve(tf),o=await a(e,{command:"tapSeries",x:t,y:r,count:n.count,intervalMs:n.intervalMs,doubleTap:n.doubleTap,appBundleId:i?.appBundleId},nP(i));return{x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,timingMode:"runner-series",...o,...eK(nj({x:t,y:r}))}}async function nk(e,t,r,n){let i;return await nw(n.count,n.intervalMs,async a=>{let[o,s]=function(e,t){if(t<=0)return[0,0];let[r,n]=nm[e%nm.length];return[r*t,n*t]}(a,n.jitterPx),l=t+o,c=r+s;if(n.doubleTap){i??=await e.doubleTap(l,c)??void 0;return}n.holdMs>0?i??=await e.longPress(l,c,n.holdMs)??void 0:i??=await e.tap(l,c)??void 0}),eW({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},nj({x:t,y:r}))}function nP(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId}}async function nC(e,t,r,n){let i=Number(r[0]),a=Number(r[1]),o=Number(r[2]),s=Number(r[3]);if([i,a,o,s].some(Number.isNaN))throw new L("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await nO({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function nR(e,t,r,n){let i=ej(r[0]),a=r[1]?Number(r[1]):300,o=eU((await t.snapshot({appBundleId:n?.appBundleId,compact:!0})).nodes??[]);if(!o)throw new L("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=eb(i,o,{platform:e.platform});return await nO({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function nO(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:c}=e,d=eF(l,"durationMs",16,1e4),u=eF(n?.count??1,"count",1,200),p=eF(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if("one-way"!==f&&"ping-pong"!==f)throw new L("INVALID_ARGS",`Invalid pattern: ${f}`);if(rV(t.platform)&&u>1){let{runIosRunnerCommand:e}=await Promise.resolve(tf),r=await e(t,{command:"dragSeries",x:i,y:a,x2:o,y2:s,durationMs:d,count:u,pauseMs:p,pattern:f,...nh(t)?{synthesized:!0}:{},appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId});return{x1:i,y1:a,x2:o,y2:s,...c?{preset:c}:{},durationMs:d,effectiveDurationMs:d,timingMode:"runner-series",count:u,pauseMs:p,pattern:f,...r,...eK(nB(u,f))}}return await nw(u,p,async e=>{"ping-pong"===f&&e%2==1?await r.swipe(o,s,i,a,d):await r.swipe(i,a,o,s,d)}),eW({x1:i,y1:a,x2:o,y2:s,...c?{preset:c}:{},durationMs:d,effectiveDurationMs:d,timingMode:"direct",count:u,pauseMs:p,pattern:f},c?`Swiped ${c}`:nB(u,f))}async function nT(e,t){let r=Number(t[0]),n=Number(t[1]),i=Number(t[2]),a=Number(t[3]);if([r,n,i,a].some(e=>!Number.isFinite(e)))throw new L("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=eF(t[4]?Number(t[4]):500,"durationMs",16,1e4),s=r+i,l=n+a,c=await e.pan(r,n,s,l,o);return{x:r,y:n,dx:i,dy:a,x2:s,y2:l,durationMs:o,...c??{},...eK(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function nL(e,t){let r=function(e,t){if("up"===e||"down"===e||"left"===e||"right"===e)return e;throw new L("INVALID_ARGS",`${t} must be up, down, left, or right`)}(t[0],"fling direction"),n=Number(t[1]),i=Number(t[2]);if(![n,i].every(Number.isFinite))throw new L("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new L("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=eF(t[4]?Number(t[4]):50,"durationMs",16,1e3),{x2:s,y2:l}=function(e,t,r,n){switch(r){case"up":return{x2:e,y2:t-n};case"down":return{x2:e,y2:t+n};case"left":return{x2:e-n,y2:t};case"right":return{x2:e+n,y2:t}}}(n,i,r,a);return await e.fling(n,i,s,l,o),{direction:r,x:n,y:i,x2:s,y2:l,distance:a,durationMs:o,...eK(`Flung ${r}`)}}async function n$(e,t,r){var n;let i=t[0],a=t[1]?Number(t[1]):void 0,o=r?.pixels;if(!i)throw new L("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new L("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==o)throw new L("INVALID_ARGS","scroll accepts either a relative amount or --pixels, not both");let s="bottom"===(n=i)?{direction:"down",edge:"bottom"}:"top"===n?{direction:"up",edge:"top"}:{direction:ex(n)},l={},c=0;if(s.edge){let t=s.edge,n=await e$({edge:t,captureState:async n=>await nF(e,r,t,n),scroll:async()=>await e.scroll(s.direction,{amount:a,pixels:o})});l=n.result??{},c=n.passes}else l=await e.scroll(s.direction,{amount:a,pixels:o}),c=1;return eW({direction:s.direction,...s.edge?{edge:s.edge,passes:c}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},eE(s.direction,s.edge,c,a,o))}async function nF(e,t,r,n){if("function"!=typeof e.snapshot)throw new L("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await eC({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,compact:!0,scope:e})).nodes??[]})}async function nU(e,t,r,n){if("tv"===e.target)throw new L("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new L("UNSUPPORTED_OPERATION","gesture pinch is only supported in macOS app sessions. Re-open the target app without --surface desktop|menubar|frontmost-app first.");let i=Number(r[0]),a=r[1]?Number(r[1]):void 0,o=r[2]?Number(r[2]):void 0;if(Number.isNaN(i)||i<=0)throw new L("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...eK(`Pinched to scale ${i}`)}}async function nG(e,t,r){if("tv"===e.target)throw new L("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new L("UNSUPPORTED_OPERATION","gesture rotate is not supported on macOS; XCTest rotation gestures are available only for iOS app sessions.");let{degrees:n,x:i,y:a,velocity:o}=function(e){let t=Number(e[0]);if(!Number.isFinite(t))throw new L("INVALID_ARGS","gesture rotate requires degrees [x] [y] [velocity]");let r=function(e,t){if(void 0===e&&void 0===t)return{};if(void 0===e||void 0===t)throw new L("INVALID_ARGS","gesture rotate center requires both x and y");let r=Number(e),n=Number(t);if(!Number.isFinite(r)||!Number.isFinite(n))throw new L("INVALID_ARGS","gesture rotate center requires finite x and y");return{x:r,y:n}}(e[1],e[2]),n=Number(e[3]??(t>=0?1:-1));if(!Number.isFinite(n)||0===n)throw new L("INVALID_ARGS","gesture rotate velocity must be a non-zero number");return{degrees:t,...r,velocity:Math.abs(n)*(t>=0?1:-1)}}(r),s=await t.rotateGesture(n,i,a,o);return{degrees:n,...void 0!==i&&void 0!==a?{x:i,y:a}:{},velocity:o,...s,...eK(`Rotated gesture ${n} degrees`)}}async function nq(e,t,r){if("tv"===e.target)throw new L("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new L("UNSUPPORTED_OPERATION","gesture transform is currently supported on Android and iOS simulators");let i=function(e){let t=Number(e[0]),r=Number(e[1]),n=Number(e[2]),i=Number(e[3]),a=Number(e[4]),o=Number(e[5]);if(![t,r,n,i,a,o].every(Number.isFinite))throw new L("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new L("INVALID_ARGS","gesture transform scale must be > 0");return{x:t,y:r,dx:n,dy:i,scale:a,degrees:o,durationMs:void 0===e[6]?void 0:eF(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...eK(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function nV(e,t,r){let{x:n,y:i}=nA(t,"read requires x y");if("android"===e.platform){let{readAndroidTextAtPoint:t}=await import("./input-actions.js");return{action:"read",text:await t(e,n,i)??""}}if("linux"===e.platform){let{readLinuxTextAtPoint:e}=await Promise.resolve(tg);return{action:"read",text:await e(n,i,r?.surface)}}if("macos"===e.platform&&r?.surface&&"app"!==r.surface){let{runMacOsReadTextAction:e}=await Promise.resolve(tp);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(tf),o=await a(e,{command:"readText",x:n,y:i,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function nj(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function nB(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function nH(e,t){return`${e} ${Array.from(t).length} chars`}function nK(e,t){let r,n=t?.subject??"Payload",a=e.trim();if(!a)throw new L("INVALID_ARGS",`${n} cannot be empty`);let o=t?.expandPath?t.expandPath(a,t.cwd):a;try{if(!i.statSync(o).isFile())throw new L("INVALID_ARGS",`${n} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof L)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new L("INVALID_ARGS",`${n} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new L("COMMAND_FAILED",`Unable to read ${n} file: ${o}`,{cause:String(t)})}if((r=a.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:a};throw new L("INVALID_ARGS",`${n} file not found: ${o}`)}async function nW(e){let t=nK(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await nz(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new L("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof L)throw t;throw new L("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function nz(e){try{return await o.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new L("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new L("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new L("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new L("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function nJ(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},o=await ns(e,a);return N({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await x("platform_command",async()=>await nX(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function nX(e,t,r,n,i,a,o){switch(r){case"open":return await nZ(e,t,n,a);case"close":{let e=n[0];if(!e)return{closed:"session",...eK("Closed session")};return await t.close(e),{app:e,...eK(`Closed: ${e}`)}}case"press":return await nI(e,t,n,a);case"swipe":return await nC(e,t,n,a);case"swipe-preset":return await nR(e,t,n,a);case"pan":return await nT(t,n);case"fling":return await nL(t,n);case"longpress":return await ng(t,n);case"focus":return await nv(t,n);case"type":return await ny(t,n,a);case"fill":return await nS(t,n,a);case"scroll":return await n$(t,n,a);case"pinch":return await nU(e,t,n,a);case"rotate-gesture":return await nG(e,t,n);case"transform-gesture":return await nq(e,t,n);case"trigger-app-event":return await nY(e,t,n,a);case"screenshot":return await nQ(t,n,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...eK("Back")};case"home":return await t.home(),{action:"home",...eK("Home")};case"rotate":{let e=ez(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...eK(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...eK("Opened app switcher")};case"clipboard":return await n0(t,n);case"keyboard":return await n1(e,n,a,o);case"settings":return await n4(e,t,n,a);case"push":return await n5(e,n,a);case"snapshot":return await n8(t,a);case"read":return await nV(e,n,a);default:throw new L("INVALID_ARGS",`Unknown command: ${r}`)}}async function nZ(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new L("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new L("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new L("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...eK("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new L("UNSUPPORTED_OPERATION",nc);if("linux"===e.platform&&s&&s.length>0)throw new L("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(eg(i))throw new L("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!eg(a))throw new L("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new L("INVALID_ARGS",nd);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...eK(`Opened: ${i}`)}}if(o&&eg(i))throw new L("INVALID_ARGS",nd);if(n?.clearAppState){if(eg(i))throw new L("INVALID_ARGS","Clearing app state requires an app target, not a deep link.");await t.setSetting("clear-app-state","clear",i)}return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchConsole:o,launchArgs:s}),{app:i,...o?{launchConsole:o}:{},...eK(`Opened: ${i}`)}}async function nY(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new L("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!nl.test(t))throw new L("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 L("INVALID_ARGS","trigger-app-event accepts at most two arguments: <event> [payloadJson]");let n=function(e,t){if(e)try{let r=JSON.parse(e);if(!r||"object"!=typeof r||Array.isArray(r))throw new L("INVALID_ARGS",`trigger-app-event payload for "${t}" must be a JSON object`);let n=JSON.stringify(r);if(Buffer.byteLength(n,"utf8")>8192)throw new L("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof L)throw t;throw new L("INVALID_ARGS",`Invalid trigger-app-event payload JSON: ${e}`)}}(r,t);return{eventName:t,payload:n}}(r),o=function(e,t,r){var n;let i,a=(i=("ios"===(n=e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:"macos"===n?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,i?.trim()||void 0);if(!a)throw new L("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=r?JSON.stringify(r):"",s=a.replaceAll("{event}",encodeURIComponent(t)).replaceAll("{payload}",encodeURIComponent(o)).replaceAll("{platform}",encodeURIComponent(e));if(s.length>4096)throw new L("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,i,a);return await t.open(o,{appBundleId:n?.appBundleId}),{event:i,eventUrl:o,transport:"deep-link",...eK(`Triggered app event: ${i}`)}}async function nQ(e,t,r,i){let a=t[0]??r??`./screenshot-${Date.now()}.png`;await o.mkdir(n.dirname(a),{recursive:!0});let s=y(i);return await e.screenshot(a,{appBundleId:i?.appBundleId,fullscreen:s.fullscreen,stabilize:s.stabilize,surface:i?.surface}),{path:a,...eK(`Saved screenshot: ${a}`)}}async function n0(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new L("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new L("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new L("INVALID_ARGS",'clipboard write requires text (use "" to clear clipboard)');let n=t.slice(1).join(" ");return await e.writeClipboard(n),{action:r,textLength:Array.from(n).length,...eK("Clipboard updated")}}async function n1(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!eN(i))throw new L("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new L("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await n2(e,i);if("ios"===e.platform)return await n3(e,i,r,n);throw new L("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function n2(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...eK("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./8133.js"),r=await t(e);return{platform:"android",action:"dismiss",attempts:r.attempts,wasVisible:r.wasVisible,dismissed:r.dismissed,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}let{getAndroidKeyboardState:r}=await import("./8133.js"),n=await r(e);return{platform:"android",action:"status",visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function n3(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new L("UNSUPPORTED_OPERATION","keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS");if("enter"===t||"return"===t){let{runIosRunnerCommand:t}=await Promise.resolve(tf),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...eK("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(tf),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...eK(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function n4(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new L("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new L("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");N({level:"debug",phase:"settings_apply",data:{setting:i,state:"clear",appBundleId:r,platform:e.platform}});let s=await t.setSetting(i,"clear",r);return s&&"object"==typeof s?eW({setting:i,state:"clear",...s},n6(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...eK(`Cleared user data for ${r}`)}}if(!a)throw new L("INVALID_ARGS","settings requires setting state");let l="location"===i&&"set"===a,c=("permission"===i||l?r[4]:r[2])??n?.appBundleId,d="permission"===i?{permissionTarget:o,permissionMode:s}:l?{latitude:eH(o,"latitude"),longitude:eH(s,"longitude")}:void 0;N({level:"debug",phase:"settings_apply",data:l?{setting:i,state:a,latitude:o,longitude:s,platform:e.platform}:"permission"===i?{setting:i,state:a,permissionTarget:o,permissionMode:s,platform:e.platform}:{setting:i,state:a,appBundleId:c,platform:e.platform}});let u=await t.setSetting(i,a,c,d);return u&&"object"==typeof u?eW({setting:i,state:a,...u},n6(u)??`Updated setting: ${i}`):{setting:i,state:a,...eK(`Updated setting: ${i}`)}}async function n5(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new L("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await nW(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...eK(`Pushed notification to ${n}`)}}let{pushAndroidNotification:o}=await import("./notifications.js"),s=await o(e,n,a);return{platform:"android",package:n,action:s.action,extrasCount:s.extrasCount,...eK(`Pushed notification to ${n}`)}}async function n8(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,compact:t?.snapshotCompact,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,surface:t?.surface})}function n6(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let n9=e=>"macos"!==e.platform,n7=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,ie=e=>"macos"===e.platform?"macOS automation has no multi-touch input — this gesture is supported on Android and the iOS simulator only.":"ios"===e.platform&&"tv"===e.target?"tvOS has no touch input — this gesture is supported on Android and the iOS simulator only.":"ios"===e.platform&&"device"===e.kind?"Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices.":void 0,it={device:!0},ir={},ii={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},ia={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir,supports:n9},io={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},pinch:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir,supports:e=>"android"===e.platform||n7(e),unsupportedHint:ie},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir,supports:e=>"android"===e.platform||n7(e),unsupportedHint:ie},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir,supports:e=>"android"===e.platform||n7(e),unsupportedHint:ie},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir,supports:n9},open:ii,close:ii,reinstall:ia,install:ia,"install-from-source":ia,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir,supports:n9},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it,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:ir,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},fill:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir},snapshot:ii,diff:ii,screenshot:ii,wait:ii,get:ii,find:ii,is:ii,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it,supports:n9},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir,supports:n9},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},scroll:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:it},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},"trigger-app-event":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ir},type:ii};function is(e,t){let r=io[e];if(!r)return!0;let n=rV(t.platform)?r.apple:"linux"===t.platform?r.linux:r.android;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}function il(e,t=e=>e){let r=new m;return{resolve:n=>n?t(n):r.getStore()??e,run:async(e,n)=>e?await r.run(t(e),n):await n(),hasScope:()=>!!r.getStore()}}function ic(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function id(e,t){return{openBundle:async(t,r)=>{var n,i;let a;await e("open",(n=t,i=r,a=["-b",n],i&&a.push(i),a))},openTarget:async t=>{await e("open",[t])},readClipboard:async()=>{let t=await e("pbpaste",[],{allowFailure:!0});if(0!==t.exitCode)throw new L("COMMAND_FAILED","Failed to read macOS clipboard",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});return t.stdout.replace(/\r\n/g,"\n").replace(/\n$/,"")},writeClipboard:async t=>{let r=await e("pbcopy",[],{allowFailure:!0,stdin:t});if(0!==r.exitCode)throw new L("COMMAND_FAILED","Failed to write macOS clipboard",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode})},readDarkMode:async()=>{let t=await e("osascript",["-e",'tell application "System Events" to tell appearance preferences to get dark mode'],{allowFailure:!0});if(0!==t.exitCode)throw new L("COMMAND_FAILED","Failed to read macOS appearance",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let r=t.stdout.trim().toLowerCase();if("true"===r)return!0;if("false"===r)return!1;throw new L("COMMAND_FAILED",`Unable to determine current macOS appearance from osascript output: ${t.stdout.trim()}`)},setDarkMode:async t=>{let r=`tell application "System Events" to tell appearance preferences to set dark mode to ${t?"true":"false"}`,n=await e("osascript",["-e",r],{allowFailure:!0});if(0!==n.exitCode)throw new L("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await iu(e,t,r)}}async function iu(e,t,r){let i=["/Applications","/System/Applications",n.join(d.homedir(),"Applications")],a=new Set;for(let t of i){let r=await o.stat(t).catch(()=>null);if(!r?.isDirectory())continue;let n=await e("find",[t,"-maxdepth","4","-type","d","-name","*.app"],{allowFailure:!0});if(0===n.exitCode)for(let e of n.stdout.split("\n")){let t=e.trim();t&&a.add(t)}}return ic((await Promise.all(Array.from(a).map(async e=>{let r=await ip(e,t).catch(()=>({})),i=r.bundleId;return i?{bundleId:i,name:r.appName??n.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function ip(e,t){for(let r of[n.join(e,"Contents","Info.plist"),n.join(e,"Info.plist")]){let e=await t(r),n=im(e,"CFBundleIdentifier"),i=im(e,"CFBundleDisplayName"),a=im(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function im(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let ih={runCommand:U,simctl:{run:async(e,t)=>await U("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await U("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await iA(U,e)},macosHost:id(U,async e=>await iA(U,e)),whichCommand:V},iw=il(ih,function(e){return"function"==typeof e?ig({runCommand:e}):ig(e)});function ig(e={}){let t={...ih,...e},r=e.plist??{readJson:async e=>await iA(t.runCommand,e)};return{...t,simctl:e.simctl??{run:async(e,r)=>await t.runCommand("xcrun",["simctl",...e],r)},devicectl:e.devicectl??{run:async(e,r)=>await t.runCommand("xcrun",["devicectl",...e],r)},plist:r,macosHost:e.macosHost??id(t.runCommand,async e=>await r.readJson(e))}}function iv(e){return iw.resolve(e)}async function iy(e,t){return await iw.run(e,t)}function iS(){return iw.hasScope()}async function i_(e,t,r){return await iv().runCommand(e,t,r)}async function iI(e,t){let r=iv(),[n,...i]=e;return"simctl"===n?await (r.simctl?.run(i,t)??r.runCommand("xcrun",e,t)):"devicectl"===n?await (r.devicectl?.run(i,t)??r.runCommand("xcrun",e,t)):await i_("xcrun",e,t)}async function ib(e){return await iv().plist?.readJson(e)??null}async function iA(e,t){try{let r=await e("plutil",["-convert","json","-o","-",t],{allowFailure:!0});if(0!==r.exitCode||!r.stdout.trim())return null;return JSON.parse(r.stdout)}catch{return null}}let ix="agent-device-macos-helper",iN="AGENT_DEVICE_MACOS_HELPER_BIN",iM=n.join(d.homedir(),".agent-device","macos-helper","current"),iD=n.join(iM,"manifest.json"),iE=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function ik(e){let t=e.trim();if(!iE.test(t))throw new L("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function iP(e,t){t.bundleId&&e.push("--bundle-id",ik(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iC(){return function(e){let t=n.dirname(e);for(;;){let e=n.join(t,"macos-helper");if(a(n.join(e,"Package.swift")))return e;let r=n.dirname(t);if(r===t)break;t=r}throw new L("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(l(import.meta.url))}async function iR(e){let t=await o.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=n.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await iR(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function iO(e){let t=await iR(e),i=r("sha256");for(let r of t)i.update(n.relative(e,r)),i.update("\0"),i.update(await o.readFile(r)),i.update("\0");let a=await i_("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return i.update("swift-version"),i.update("\0"),i.update(a.stdout||a.stderr||`exit:${a.exitCode}`),i.update("\0"),i.digest("hex")}async function iT(){try{let e=JSON.parse(await o.readFile(iD,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function iL(){let e=await q(process.env[iN],iN);if(e)return e;let t=iC(),r=await iO(t),i=n.join(iM,ix);try{if(await iT()===r)return await o.access(i),i}catch{}let a=n.join(iC(),".build","release",ix);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await i_("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await o.mkdir(iM,{recursive:!0});let s=`${i}.tmp`;return await o.copyFile(a,s),await o.rename(s,i),await o.chmod(i,493),await o.writeFile(iD,`${JSON.stringify({fingerprint:r},null,2)}
5
+ `,"utf8"),i}async function i$(){let e=process.env[iN]?.trim();if(e){let t=await q(e,iN);if(t)return t}if(iS())return ix;if("darwin"!==process.platform)throw new L("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await iL()}async function iF(e){let t={allowFailure:!0,timeoutMs:3e4},r=iv().macosHelper,n=r?ix:await i$(),i=r?await r.run(e,t):await i_(n,e,t),a=i.stdout.trim(),o=null;if(a)try{o=JSON.parse(a)}catch{o=null}if(0===i.exitCode&&o?.ok)return o.data;throw new L("COMMAND_FAILED",o&&!o.ok?o.error?.message??`macOS helper exited with code ${i.exitCode}`:a||i.stderr.trim()||`macOS helper exited with code ${i.exitCode}`,{helperPath:n,args:e,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,...o&&!o.ok?o.error?.details:{}})}async function iU(){return await iF(["app","frontmost"])}async function iG(e){return await iF(["app","quit","--bundle-id",ik(e)])}async function iq(e,t){return await iF(["permission",e,t])}async function iV(e,t={}){let r=["alert",e];return iP(r,t),await iF(r)}async function ij(e,t={}){let r=["snapshot","--surface",e];return iP(r,t),await iF(r)}async function iB(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return iP(n,r),await iF(n)}async function iH(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return iP(n,r),await iF(n)}async function iK(e,t={}){let r=["screenshot","--out",e];return iP(r,t),t.fullscreen&&r.push("--fullscreen"),await iF(r)}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"},iz={runCommand:U,whichCommand:V,desktop:iQ(U,V),clipboard:i0(U,V),screenshot:i1(U,V)},iJ=il(iz,function(e={}){let t={...iz,...e};return{...t,desktop:e.desktop??iQ(t.runCommand,t.whichCommand),clipboard:e.clipboard??i0(t.runCommand,t.whichCommand),screenshot:e.screenshot??i1(t.runCommand,t.whichCommand)}});function iX(e){return iJ.resolve(e)}async function iZ(e,t){return await iJ.run(e,t)}async function iY(e,t,r){return await iX().runCommand(e,t,r)}function iQ(e,t){return{async openTarget(r){if(r.includes("://")||r.startsWith("/"))return void await e("xdg-open",[r]);if(await t(r)){e(r,[],{allowFailure:!0}).catch(e=>{N({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await eB(500);return}await e("xdg-open",[r],{allowFailure:!0})},async closeApp(r){await t("wmctrl")?await e("wmctrl",["-c",r],{allowFailure:!0}):await e("pkill",["-x",r],{allowFailure:!0})}}}function i0(e,t){return{async readText(){let r=i4[await i6(t,i2)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=i5[await i6(t,i2)](r);await e(n.cmd,n.args,n.options)}}}function i1(e,t){return{async capture(r){let n=i8[await i6(t,i3)](r);await e(n.cmd,n.args,n.options)}}}let i2={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."},i3={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."},i4={"wl-clipboard":{cmd:"wl-paste",args:["--no-newline"],options:{allowFailure:!0,timeoutMs:5e3}},xclip:{cmd:"xclip",args:["-selection","clipboard","-o"],options:{allowFailure:!0,timeoutMs:5e3}},xsel:{cmd:"xsel",args:["--clipboard","--output"],options:{allowFailure:!0,timeoutMs:5e3}}},i5={"wl-clipboard":e=>({cmd:"wl-copy",args:["--",e],options:{allowFailure:!1,timeoutMs:5e3}}),xclip:e=>({cmd:"xclip",args:["-selection","clipboard"],options:{allowFailure:!1,timeoutMs:5e3,stdin:e}}),xsel:e=>({cmd:"xsel",args:["--clipboard","--input"],options:{allowFailure:!1,timeoutMs:5e3,stdin:e}})},i8={grim:e=>({cmd:"grim",args:[e]}),scrot:e=>({cmd:"scrot",args:[e]}),import:e=>({cmd:"import",args:["-window","root",e]}),"gnome-screenshot":e=>({cmd:"gnome-screenshot",args:["-f",e]})};async function i6(e,t){let r=process.env.WAYLAND_DISPLAY||"wayland"===process.env.XDG_SESSION_TYPE?"wayland":"x11";for(let n of t[r])if(await e(n.command))return n.tool;throw new L("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let i9="atspi-dump.py",i7=null;async function ae(e,t={}){let r,a=iX().accessibility;if(a)return await a.captureTree(e,t);if("linux"!==process.platform)throw new L("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await iX().whichCommand("python3"))throw new L("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let o=t.maxNodes??1500,s=t.maxDepth??12,c=t.maxApps??24,d=[function(){if(i7)return i7;let e=n.dirname(l(import.meta.url));for(let t=0;t<5;t++){let r=n.join(e,"src","platforms","linux",i9);if(i.existsSync(r))return i7=r,r;if(0===t){let t=n.join(e,i9);if(i.existsSync(t))return i7=t,t}e=n.dirname(e)}throw new L("TOOL_MISSING",`Cannot find ${i9}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(c)],u=await iY("python3",d,{allowFailure:!0,timeoutMs:3e4});if(0!==u.exitCode){let e=u.stderr.trim();if(e.includes("No module named")||e.includes("gi.require_version"))throw new L("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new L("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new L("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new L("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=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 at(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&N({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await ae(t);return{nodes:r.nodes,truncated:r.truncated}}async function ar(e,t,r){let{nodes:n}=await at(r);for(let r of n.filter(r=>{let n=r.rect;return!!n&&e>=n.x&&t>=n.y&&e<=n.x+n.width&&t<=n.y+n.height}).sort((e,t)=>{let r=e.depth??0,n=t.depth??0;return r!==n?n-r:an(e.rect)-an(t.rect)})){let e=function(e){for(let t of[e.value,e.label,e.identifier])if("string"==typeof t&&t.length>0)return t;return""}(r);if(e.trim())return e}return""}function an(e){return(e?.width??0)*(e?.height??0)}let ai=[250,400,600];function aa(e,t,r=e.snapshot){if("android"!==e.device.platform)return;let n=function(e,t){if(t?.comparisonSafe===!0)return t;let r=e.lastComparisonSafeSnapshot;return r&&!0===r.comparisonSafe&&Date.now()-r.createdAt<=5e3?r:t}(e,r),i=n?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(n??r)?.nodes.length??0,baselineSignatures:i?ac(n?.nodes??[]):void 0,routeComparable:i}}function ao(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 as(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function al(e){return"press"===e||"click"===e||"back"===e||"open"===e}function ac(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 ad(e,t,r,n,i){return{requestId:i??b().requestId,appBundleId:r,activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotCompact:t?.snapshotCompact,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...S(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:nu(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function au(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!av(r))return;let s=function(e){if("click"===e||"press"===e)return"press"}(n);if(!s||!(2===(t=i).length&&t.every(e=>Number.isFinite(Number(e)))))return;let l=ah(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:am(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function ap(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function af(e){let{session:t,pending:r,snapshot:n}=e,i=aw(r.preSignature,ah(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await nJ(t.device,r.command,r.positionals,r.flags?.out,{...ad(e.logPath,r.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),N({level:"info",phase:"interaction_no_change_retry",data:{action:r.action,attemptsRemaining:r.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function am(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function ah(e){let t=new Map,r=[];for(let n of e){let e=function(e,t){var r,n;if(!e.rect||!([(r=e.rect).x,r.y,r.width,r.height].every(e=>Number.isFinite(e))&&r.width>0&&r.height>0)||(n=e,`${n.label??""} ${n.identifier??""}`.toLowerCase().includes("scroll bar")))return;let i=function(e){let t=[e.identifier,e.label,e.value,e.type,e.role,!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].map(e=>"string"==typeof e?e.trim():"").join("|");return t.replaceAll("|","")?t:void 0}(e);if(!i)return;let a=t.get(i)??0;return t.set(i,a+1),{key:`${i}|#${a}`,x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height)}}(n,t);e&&r.push(e)}return r}function aw(e,t){return 0===e.length||0===t.length?"ambiguous":ag(e,t)?"unchanged":"changed"}function ag(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r+=1){let n=e[r],i=t[r];if(!n||!i||n.key!==i.key||Math.abs(n.x-i.x)>1||Math.abs(n.y-i.y)>1||Math.abs(n.width-i.width)>1||Math.abs(n.height-i.height)>1)return!1}return!0}function av(e){return"ios"===e.device.platform||"android"===e.device.platform}function ay(e,t,r=[],n){var i,a,o;aI(e.device.platform)&&(i=t,a=r,o=n,(o?.postGestureStabilization===!0||"swipe"===i||"scroll"===i||"gesture"===i&&"swipe"===a[0])&&(e.postGestureStabilization={action:t,markedAt:Date.now()}))}function aS(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function a_(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!aI(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=ah(e.readSnapshot(o).nodes);for(;Date.now()-i<1500;){await eB(200),a+=1;let l=await r(),c=ah(e.readSnapshot(l).nodes);if(ag(s,c))return aS(t),N({level:a>2?"info":"debug",phase:"post_gesture_snapshot_stabilized",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),l;o=l,s=c}return aS(t),N({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function aI(e){return"ios"===e||"android"===e}function ab(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let aA=["x","y","width","height"],ax=new WeakMap;function aN(e,t){if(!e[t])return[];let r=aE(e)[t]??t+1;return e.slice(t+1,r)}function aM(e,t,r){let n=aE(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function aD(e,t,r){let n=aE(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function aE(e){let t=ax.get(e);if(t)return t;let r=Array(e.length),n=[];for(let[t,i]of e.entries()){let e=i?.depth??0;for(;n.length>0&&e<=n[n.length-1].depth;)r[n.pop().position]=t;n.push({depth:e,position:t})}for(let t of n)r[t.position]=e.length;return ax.set(e,r),r}function ak(e,t,r){for(let n of function(e,t){let r=[],n="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,i=new Set;for(;n&&!i.has(n.index);)i.add(n.index),r.push(n),n="number"==typeof n.parentIndex?t.get(n.parentIndex):void 0;return r}(e,t))if(r(n))return n;return null}function aP(e,t){let r=eX(e.type??""),n=e.label?.trim();return!!(aC(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function aC(e){return"button"===eX(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function aR(e){let t=eX(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function aO(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function aT(e,t){return!!e&&!!t&&aA.every(r=>.5>=Math.abs(e[r]-t[r]))}function aL(e){let t;for(let i of e){var r,n;let e=eX(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||a$(r)>a$(n)))&&(t=i.rect)}return t}function a$(e){return e?e.width*e.height:0}function aF(e){let t=eX(e.type??"");return"scrollview"===t||"scrollarea"===t}function aU(e,t){return!0===e||!!t||void 0}function aG(e,t,r,n){aD(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=eX(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function aq(e,t,r,n){aD(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=eX((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function aV(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===eX(n.type??"")&&t(n,i,r)}}function aj(e,t,r,n){for(let i of e)(aP(i,t)||n&&aH(i,n))&&r.add(i.index)}function aB(e,t,r){if("button"!==eX(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&aT(e.rect,t.rect)}function aH(e,t){return"button"===eX(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&aT(e.rect,t.rect)}let aK=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=aL(e),n=r?r.y+r.height:null;if(null!==n)for(let r=0;r<e.length;r+=1){var i,a;let o=e[r];o&&(i=o,a=n,i.rect&&"keyboard"===eX(i.type??"")&&i.rect.y>=a)&&(t.add(o.index),function(e,t,r,n){let i=new Map(t.map(e=>[e.index,e])),a="number"==typeof e.parentIndex?i.get(e.parentIndex):void 0;for(;a?.rect&&a.rect.y>=n;)r.add(a.index),a="number"==typeof a.parentIndex?i.get(a.parentIndex):void 0}(o,e,t,n),aD(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==eX(r.type??"")||!0===r.hittable||r.label?.trim()||r.value?.trim())&&r.identifier?.trim()&&t.add(r.index)}(e,o);let s=new Map(e.map(e=>[e.index,e]));for(let r of e)(function(e){let t=e.label?.trim();return!!(t&&eM(t))})(r)&&function(e,t,r){var n,i,a,o;aR(e.type)||r.suppressedIndexes.add(e.index);let s=eP(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&aR(e.type)?e:null)??ak(e,t,e=>aR(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,aO(n.replacements,i,{rect:function(e,t){if(e&&t&&!(t.height<=0)&&!(t.height>=e.height)&&!(t.y<e.y)&&!(t.y>e.y+e.height))return{...e,y:t.y,height:Math.min(t.height,e.y+e.height-t.y)}}(i.rect,a.rect)??i.rect,hiddenContentAbove:aU(i.hiddenContentAbove,o.above),hiddenContentBelow:aU(i.hiddenContentBelow,o.below)}))}(r,s,t);(function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r];if(!n||"searchfield"!==eX(n.type??""))continue;if("Search"===n.label){aq(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=aM(e,r,e=>"searchfield"===eX(e.type??"")&&"Search"===e.label);i&&(t.add(n.index),function(e,t,r){let n=new Map(t.map(e=>[e.index,e])),i=e;for(;"number"==typeof i.parentIndex;){let e=n.get(i.parentIndex);if(!e||"Toolbar"!==e.label)return;r.add(e.index),i=e}}(n,e,t),aq(e,r,i.index,t))}})(e,o),r=e,n=o,aV(r,(e,t,i)=>{aM(r,i,r=>{let n;return("button"===(n=eX(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(aT(r.rect,e.rect)||function(e,t){var r,n,i,a,o;let s;if(t.label?.trim()!==e.label?.trim())return!1;let l=eX(t.type??"");return r=e,n=l,s=r.label?.trim(),"button"===n&&("Dismiss"===s||"Back"===s)||"textfield"===l||(i=e,a=l,o=t,"button"===a&&!!i.rect&&!!o.rect&&0===i.rect.x&&0===i.rect.y&&i.rect.width>=300&&i.rect.height>=600&&o.rect.width<i.rect.width)}(e,r))})&&n.add(e.index)}),i=e,a=o,aV(i,(e,t,r)=>{let n;eO(e)&&eD(e,(n=[],aD(i,r,e=>{n.push(e)}),n))&&a.add(e.index)}),function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();!(!n||t.has(n.index))&&i&&function(e,t,r,n,i){let a=eX(r.type??"");if("statictext"===a||"link"===a)return aG(e,t,n,i);if("other"===a){if(function(e,t,r){return!!aM(e,t,e=>{let t=eX(e.type??"");return("link"===t||"searchfield"===t||aR(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);aG(e,t,n,i)}}(e,r,n,i,t)}}(e,o)},function(e,t){let r=new Map(e.map(e=>[e.index,e])),n=aL(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==eX(e.type??"")||!1===e.enabled||!e.rect||!function(e){let t=e?.trim();return!(!t||/^(toolbar|window|application)$/i.test(t)||t.startsWith("!,")||/debugger|fast refresh/i.test(t))}(e.label)||!ak(e,t,aF)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=a$(e),i=a$(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&aO(t.replacements,i,{type:"Cell"})},function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n?.rect&&i&&function(e,t,r,n,i){let a=eX(r.type??"");if("button"===a)return aj(aN(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=aN(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==eX(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r})(e,t,r));if(!i)return!1;let a=e.find(e=>aB(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&aO(n.replacements,i,{identifier:o}),n.suppressedIndexes.add(t.index),function(e,t,r,n,i){for(let a of e)a.index!==n.index&&(aB(a,t,r)||aH(a,t)||function(e,t){if("switch"!==eX(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||aP(a,r))&&i.add(a.index)}(e,t,r,i,n.suppressedIndexes),!0}(o,r,n,i)&&function(e,t,r,n){let i=e.find(e=>aB(e,t,r));if(!i){e.some(aC)&&aj(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&aO(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),aj(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function aW(e){let t=await az(e);if(t)return t;let r=await aZ(e);return as(e.session),{snapshot:a5(r,a3(e)),analysis:r.analysis,androidSnapshot:r.androidSnapshot}}async function az(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!av(e)||Date.now()-t.markedAt>3e4?void ap(e):t}(e.session);if(t&&e.session)return await aJ({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await a0({...e,session:e.session});let r=ao(e.session);if(r&&"android"===e.device.platform)return await aY(e,r)}async function aJ(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await aX(e,t,await a1(e)),l=await af({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await aX(e,t,await a1(e)),l=await af({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(ap(i),s=await a_({session:i,initial:s,capture:async()=>await a1(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.freshness?.staleAfterRetries!==!0&&as(i),"unchanged"===l.change)?N({level:"warn",phase:"interaction_settle_timeout",data:{action:(r={pending:t,attempts:o,startedAt:a}).pending.action,attempts:r.attempts,durationMs:Date.now()-r.startedAt}}):N({level:(n={pending:t,change:l.change,attempts:o,startedAt:a}).attempts>0?"info":"debug",phase:"interaction_settled",data:{action:n.pending.action,change:n.change,attempts:n.attempts,durationMs:Date.now()-n.startedAt}}),{snapshot:s.snapshot,analysis:s.data.analysis,androidSnapshot:s.data.androidSnapshot,freshness:s.freshness}}async function aX(e,t,r){let n=r;return"unchanged"!==aw(t.preSignature,ah(n.snapshot.nodes))?n:(await eB(500),n=await a1(e))}async function aZ(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await at(r?.surface);return a8({nodes:e.nodes,truncated:e.truncated,backend:"linux-atspi"},{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o})}return"macos"===t.platform&&r?.surface&&"app"!==r.surface?a8(await ij(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await nJ(t,"snapshot",[],i,{...ad(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath)})}async function aY(e,t){let r=await aQ(e,t);return{snapshot:r.snapshot,analysis:r.data.analysis,androidSnapshot:r.data.androidSnapshot,freshness:r.freshness}}async function aQ(e,t){let r=await a2(e),n=a4(r,t,e),i=0,a=t.markedAt+1500;for(let o of ai){if(!n)break;let s=a-Date.now();if(s<=0)break;await eB(Math.min(o,s)),r=await a2(e),i+=1,n=a4(r,t,e)}return n||as(e.session),{...r,freshness:i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0}}async function a0(e){let t=await a_({session:e.session,capture:async()=>await a1(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,analysis:t.data.analysis,androidSnapshot:t.data.androidSnapshot,freshness:t.freshness}}async function a1(e){let t=ao(e.session);return t&&"android"===e.device.platform?await aQ(e,t):await a2(e)}async function a2(e){let t=await aZ(e);return{data:t,snapshot:a5(t,a3(e))}}function a3(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function a4(e,t,r){var n,i;let a=r.flags?.snapshotInteractiveOnly===!0,o=e.data.analysis;if(a&&0===e.snapshot.nodes.length&&o&&o.rawNodeCount>=12)return"empty-interactive";if("ref-refresh"===r.androidFreshnessMode)return null;return(n=t.baselineCount,i=e.snapshot.nodes.length,!(n<12)&&i<=Math.floor(.2*n))?e.snapshot.nodes.some(e=>!0===e.hittable||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())?null:"sharp-drop":t.routeComparable&&al(t.action)&&function(e,t){if(!e||0===e.length)return!1;let r=Math.max(e.length,t.length);if(r<12)return!1;let n=ac(t),i=Math.min(e.length,n.length),a=0;for(let t=0;t<i;t+=1)e[t]===n[t]&&(a+=1);let o=Math.max(0,n.length-e.length),s=Math.max(0,e.length-n.length),l=Math.max(3,Math.floor(.15*r));return a>=Math.floor(.9*r)&&o<=l&&s<=l}(t.baselineSignatures,e.snapshot.nodes)?"stuck-route":null}function a5(e,t){var r,n,i,a;let o=e?.nodes??[],s=eR(t?.snapshotRaw?o:eZ(o)),l=t?.snapshotScope&&e?.backend!=="macos-helper"?a6(s,t.snapshotScope):s;return{nodes:e5((r=e?.backend,n=t,"xctest"===r&&n?.snapshotInteractiveOnly===!0&&!0!==n.snapshotRaw)?function(e){if(0===e.length)return e;let t=new Map,r=new Set;for(let n of aK)n(e,{replacements:t,suppressedIndexes:r});if(0===r.size&&0===t.size)return e;var n=e.filter(e=>!r.has(e.index)).map(e=>t.get(e.index)??e);let i=new Map(e.map(e=>[e.index,e])),a=new Map;for(let[e,t]of n.entries())a.set(t.index,e);return n.map((e,t)=>{let n="number"==typeof e.parentIndex?a.get(e.parentIndex):void 0;return void 0===n&&"number"==typeof e.parentIndex&&(n=function(e,t,r,n){let i=e,a=new Set;for(;"number"==typeof i&&!a.has(i);){if(a.add(i),!t.has(i))return n.get(i);i=r.get(i)?.parentIndex}}(e.parentIndex,r,i,a)),{...e,index:t,parentIndex:n}})}(l):l),truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,presentationKey:e3(e0(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&a?.snapshotCompact!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function a8(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=a6(i,t.snapshotScope)),t.snapshotInteractiveOnly&&(i=function(e){if(0===e.length)return e;let t=new Map;for(let r of e)t.set(r.index,r);let r=new Set;for(let n of e){if(!function(e){if(e.focused||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")}(n))continue;let e=n;for(;e&&!r.has(e.index);)r.add(e.index),e="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0}return 0===r.size?e:a9(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=a9(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function a6(e,t){let r=eY(e5(e),t);if(!r)return[];let n=e.findIndex(e=>e.index===r.index);if(-1===n)return[];let i=e[n]?.depth??0,a=[];for(let t=n;t<e.length;t+=1){let r=e[t];if(!r)continue;let o=r.depth??0;if(t>n&&o<=i)break;a.push(r)}return a9(a,i)}function a9(e,t=0){let r=new Map;for(let[t,n]of e.entries())r.set(n.index,t);return e.map((e,n)=>({...e,index:n,depth:Math.max(0,(e.depth??0)-t),parentIndex:"number"==typeof e.parentIndex?r.get(e.parentIndex):void 0}))}function a7(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return ab("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=e1(e.trim());if(!n)return ab("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=e2(e.nodes,n);if(r=t?eQ(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:ab("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function oe(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function ot(e){return{get:t=>t===e.sessionName?function(e,t,r={}){if(e)return{name:t,appBundleId:e.appBundleId,appName:e.appName,...!0===r.includeSnapshot?{snapshot:e.snapshot}:{},metadata:{surface:e.surface,...r.metadata??{}}}}(e.getSession(),e.sessionName,e.recordOptions):void 0,set:t=>{t.name!==e.sessionName?N({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function or(e){let{session:t,sessionName:r,outPath:i,outputPlacement:a,dispatchContext:s}=e,l=eL({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...n,...S(a),surface:a?.surface};return"out"===r?on(await nJ(t.device,"screenshot",[],i,o)):on(await nJ(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:s}),artifacts:{resolveInput:async()=>{throw new L("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await o.mkdtemp(n.join(d.tmpdir(),"agent-device-screenshot-")),r=n.join(t,"screenshot.png")),await o.mkdir(n.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await o.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await o.mkdtemp(n.join(d.tmpdir(),`${e.prefix}-`));return{path:n.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await o.rm(t,{recursive:!0,force:!0})}}}},sessions:ot({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eG()});return await l.capture.screenshot({session:r,requestId:s.requestId,appBundleId:t.appBundleId,...y(s),surface:t.surface,...i?{out:{kind:"path",path:i}}:{}})}function on(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function oi(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function oa(e,t){let r=Math.max(24,Math.round(.2*Math.min(e.size,t.size))),n=Math.max(48,Math.round(.15*Math.min(e.crossSize,t.crossSize)));return Math.abs(e.size-t.size)<=r&&Math.abs(e.crossSize-t.crossSize)<=n}function oo(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let os=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function ol(e,t={}){let r=e7(e,t.helperAdb).exec;return(await ou(e,t,r)).xml}async function oc(e,t={}){let r=e7(e,t.helperAdb).exec,n=await ou(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=tt(i,800,t);return a&&function(e,t){for(let[r,n]of e){let e=t[r];e&&(n.hiddenContentAbove&&(e.hiddenContentAbove=!0),n.hiddenContentBelow&&(e.hiddenContentBelow=!0))}}(await o_(e,o.nodes,i,r),o.nodes),{...o,androidSnapshot:n.metadata}}let o=tn(i),s=tl(o,800,t);a&&await od({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:l,...c}=s;return{...c,androidSnapshot:n.metadata}}async function od(e){if(ob(e.interactiveSnapshot.nodes).size>0||oI(e.xml))return;let t=tl(e.tree,800,{...e.options,interactiveOnly:!1}),r=await o_(e.device,t.nodes,e.xml,e.adb);oE(r,t,e.interactiveSnapshot),0===r.size&&oE(ek(e5(t.nodes)),t,e.interactiveSnapshot)}async function ou(e,t,r){let n=await x("android_snapshot_helper_artifact_resolution",async()=>await oy(t.helperArtifact));return n.artifact?await op(e,t,r,n.artifact):(N({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await oS(e,n.fallbackReason,r))}async function op(e,t,r,n){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),c=e7(e,t.helperAdb);try{let e=await of(t,r,c,n,l);return e.installed&&await tc(l),a=await om(t,r,c,n,l),o=n,s=e.reason,{xml:a.xml,metadata:{backend:"android-helper",helperVersion:o.manifest.version,helperApiVersion:a.metadata.helperApiVersion,helperTransport:a.metadata.transport,helperSessionReused:a.metadata.sessionReused,installReason:s,waitForIdleTimeoutMs:a.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:a.metadata.waitForIdleQuietMs,timeoutMs:a.metadata.timeoutMs,maxDepth:a.metadata.maxDepth,maxNodes:a.metadata.maxNodes,rootPresent:a.metadata.rootPresent,captureMode:a.metadata.captureMode,windowCount:a.metadata.windowCount,nodeCount:a.metadata.nodeCount,helperTruncated:a.metadata.truncated,elapsedMs:a.metadata.elapsedMs}}}catch(t){return await oh({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function of(e,t,r,n,i){let a=await x("android_snapshot_helper_install",async()=>await tr({adb:t,adbProvider:r,artifact:n,deviceKey:i,installPolicy:e.helperInstallPolicy,timeoutMs:3e4}),{packageName:n.manifest.packageName,versionCode:n.manifest.versionCode,installPolicy:e.helperInstallPolicy??"missing-or-outdated"});return N({phase:"android_snapshot_helper_install_decision",data:{packageName:a.packageName,versionCode:a.versionCode,installedVersionCode:a.installedVersionCode,installed:a.installed,reason:a.reason}}),a}async function om(e,t,r,n,i){let a={adb:t,adbProvider:r,deviceKey:i,helperVersion:n.manifest.version,helperVersionCode:n.manifest.versionCode,packageName:n.manifest.packageName,instrumentationRunner:n.manifest.instrumentationRunner,waitForIdleTimeoutMs:e.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await x("android_snapshot_helper_session_capture",async()=>await ta(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){N({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:T(e).message}}),await ow(t,n.manifest.packageName)}return await x("android_snapshot_helper_capture",async()=>await ti(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function oh(e){let t=function(e){var t;let r=T(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=ov(e)??t;return/TimeoutException/.test(r)||/timed out/i.test(n)}(r.details?.helper,r.message)&&(t=r,!(t.details?.exitCode===137&&/Android snapshot helper (failed before returning parseable output|output could not be parsed)/.test(t.message))))return;let n=og(e);return new L(R(r.code),`${n}. Stock UIAutomator fallback was skipped because this usually means the Android accessibility tree is busy or stalled.`,{...r.details,hint:"Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout and report the busy UI if it persists."},e)}(e.error);if(t)throw t;let r=og(e.error);return N({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tc(e.helperDeviceKey),await ow(e.adb,e.artifact.manifest.packageName),ts({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oS(e.device,r,e.adb)}async function ow(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await eB(150),N({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){N({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:T(e).message}})}}function og(e){let t=T(e),r=ov(t.details?.helper);if(r&&r!==t.message)return`${t.message}: ${r}`;if(r)return r;let n=("string"==typeof t.details?.stderr?t.details.stderr.trim():"").split(/\r?\n/).find(e=>e.trim());return n?`${t.message}: ${n}`:t.message}function ov(e){if(!e||"object"!=typeof e||!("message"in e))return;let t=String(e.message).trim();return t&&"null"!==t?t:void 0}async function oy(e){if(e)return{artifact:e};let t=e6(),r=n.join(e9(),"android-snapshot-helper","dist"),i=n.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await h.access(i)}catch{return{}}try{let e=to(JSON.parse(await h.readFile(i,"utf8"))),t=n.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await h.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:T(e).message}}}async function oS(e,t,r){let n;try{n=await x("android_snapshot_stock_capture",async()=>await oA(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new L(R((r=T(i)).code),`${r.message} Android snapshot helper failed before stock fallback: ${a}`,{...r.details,androidSnapshotHelperFallbackReason:a,...r.hint?{hint:r.hint}:{}},i)}throw e}return{xml:n,metadata:{backend:"uiautomator-dump",...t?{fallbackReason:t}:{}}}}async function o_(e,t,r,n){if(!t.some(e=>e8(e.type)))return new Map;let i=ob(t);if(i.size>0||oI(r))return i;let a=await oD(e,n);return a?function(e,t){let r=function(e){let t={className:"root",rect:{x:0,y:0,width:0,height:0},children:[]},r=[{indent:-1,node:t}],n=/^(\s*)([\w.$]+)\{[^}]* (-?\d+),(-?\d+)-(-?\d+),(-?\d+) #/;for(let t of e.split("\n")){let e=n.exec(t);if(!e)continue;let[i,a,o,s,l,c]=e.slice(1);if(void 0===i||void 0===a||void 0===o||void 0===s||void 0===l||void 0===c)continue;let d=i.length,u=Number(o),p=Number(s),f={className:a,rect:{x:u,y:p,width:Math.max(0,Number(l)-u),height:Math.max(0,Number(c)-p)},children:[]};for(;r.length>1&&d<=r[r.length-1].indent;)r.pop();r[r.length-1].node.children.push(f),r.push({indent:d,node:f})}return t.children.length>0?t:null}(t);if(!r)return new Map;let n=function(e){let t=[],r=[e];for(;r.length>0;){let e=r.pop();if(e8(e.className)){let r=function(e){let t=e.children[0];if(!t)return null;let r=Math.max(t.rect.height,...t.children.map(e=>e.rect.y+e.rect.height)),n=t.children.filter(e=>e.rect.height>0).map(t=>oo(t.rect,e.rect)).sort((e,t)=>e.start-t.start);return 0===n.length?null:{rect:e.rect,contentExtent:r,contentBlocks:n}}(e);r&&t.push(r)}r.push(...e.children)}return t}(r);if(0===n.length)return new Map;let i=new Map;for(let t of e){if(!t.rect||!e8(t.type))continue;let r=function(e,t){let r=null,n=1/0;for(let i of t){let t=Math.abs(i.rect.width-e.width)+Math.abs(i.rect.height-e.height);if(t>32)continue;let a=4*t+(Math.abs(i.rect.x-e.x)+Math.abs(i.rect.y-e.y));a<n&&(r=i,n=a)}return r}(t.rect,n);if(!r)continue;let a=function(e,t){let r=function(e,t){let r=t,n=new Set;for(;!n.has(r.index);){var i,a;n.add(r.index);let o=e.filter(e=>e.parentIndex===r.index&&e.rect);if(1!==o.length)return r;let s=o[0];if(i=s.rect,a=t.rect,i.x!==a.x||i.y!==a.y||i.width!==a.width||i.height!==a.height)return r;r=s}return t}(e,t);return e.filter(e=>e.parentIndex===r.index&&e.rect).map(e=>e.rect).filter(e=>e.height>0).sort((e,t)=>e.y-t.y).map(e=>oo(e,t.rect))}(e,t),o=function(e){let{viewportRect:t,visibleBlocks:r,nativeScrollView:n}=e;if(0===r.length||0===n.contentBlocks.length)return null;let i=function(e){if(0===e.contentBlocks.length)return null;let t=e.contentBlocks[0],r=e.contentBlocks[e.contentBlocks.length-1];if(!t||!r)return null;let n=oi(e.contentBlocks.map(e=>e.size))??e.rect.height,i=Math.max(48,Math.round(.5*n)),a=Math.max(24,Math.round(.25*n)),o=t.start>=i,s=e.contentExtent-(r.start+r.size)>=a;return o||s?{above:o,below:s}:null}(n),a=function(e,t){let r=new Map;for(let n of e)for(let e of t){if(!oa(n,e))continue;let t=n.start-e.start,i=8*Math.round(t/8),a=r.get(i)??[];a.push(t),r.set(i,a)}let n=null;for(let e of r.values())(!n||e.length>n.length)&&(n=e);if(!n||n.length<2)return null;let i=[...n].sort((e,t)=>e-t);return i[Math.floor(i.length/2)]??null}(n.contentBlocks,r)??function(e){let{nativeBlocks:t,visibleBlocks:r,viewportExtent:n,contentExtent:i}=e,a=[],o=[];for(let e of t)for(let t of r){if(!oa(e,t))continue;let r=e.start-t.start;16>=Math.abs(r)&&a.push(r),16>=Math.abs(r+n-i)&&o.push(r)}return o.length>0?oi(o):a.length>0?oi(a):null}({nativeBlocks:n.contentBlocks,visibleBlocks:r,viewportExtent:t.height,contentExtent:n.contentExtent});if(null===a)return i;let o=t.height;return{above:(i?.above??!1)||a>16,below:(i?.below??!1)||a+o<n.contentExtent-16}}({viewportRect:t.rect,visibleBlocks:a,nativeScrollView:r});if(!o)continue;let s={};o.above&&(s.hiddenContentAbove=!0),o.below&&(s.hiddenContentBelow=!0),(s.hiddenContentAbove||s.hiddenContentBelow)&&i.set(t.index,s)}return i}(t,a):new Map}function oI(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function ob(e){let t=new Map;for(let r of e){let e={};r.hiddenContentAbove&&(e.hiddenContentAbove=!0),r.hiddenContentBelow&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(r.index,e)}return t}async function oA(e,t=te(e)){try{return await en(()=>ox(t),{shouldRetry:oM})}catch(t){var r,n;let e;if((r=t)instanceof L&&"COMMAND_FAILED"===r.code&&"number"==typeof r.details?.timeoutMs&&r.details?.cmd==="adb"&&(e=Array.isArray(n=r.details?.args)?n.map(String):"string"==typeof n?n.split(/\s+/):[]).includes("uiautomator")&&e.includes("dump")){let e="Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout. Stock Android UIAutomator may still time out on app-owned infinite animations.";throw new L("COMMAND_FAILED",`Android UI hierarchy dump timed out while waiting for the UI to become idle. ${e}`,{...t.details??{},hint:e},t)}throw t}}async function ox(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=oN(a.stdout,a.stderr);if(o)return o;let s="/sdcard/window_dump.xml",l=await e(["shell","uiautomator","dump",s],{allowFailure:!0,timeoutMs:8e3}),c=(t=l.stdout,r=l.stderr,n=`${t}
6
+ ${r}`,i=/dumped to:\s*(\S+)/i.exec(n),i?.[1]);if(0!==l.exitCode&&!c)throw new L("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode,reason:"missing_fresh_dump"});let d=await e(["shell","cat",c??s]),u=oN(d.stdout,d.stderr);if(!u)throw new L("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:d.stdout,stderr:d.stderr});return u}function oN(e,t){let r=`${e}
7
+ ${t}`,n=r.indexOf("<?xml"),i=n>=0?n:r.indexOf("<hierarchy");if(i<0)return null;let a=r.lastIndexOf("</hierarchy>");if(a<0||a<i)return null;let o=r.slice(i,a+12).trim();return o.length>0?o:null}function oM(e){if(!(e instanceof L)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return os.some(e=>r.includes(e))}async function oD(e,t=te(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),r=`${e.stdout}
8
+ ${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function oE(e,t,r){if(0===e.size)return;let n=new Map;for(let[e,t]of r.sourceNodes.entries()){let i=r.nodes[e];i&&n.set(t,i)}for(let[r,i]of e){let e=t.sourceNodes[r];if(!e)continue;let a=n.get(e);a&&(i.hiddenContentAbove&&(a.hiddenContentAbove=!0),i.hiddenContentBelow&&(a.hiddenContentBelow=!0))}}let ok=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,oP=/^close app$/i,oC="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function oR(e){let{session:t}=e;if("android"!==t.device.platform||!t.recording)return"absent";try{let e=await oU(t),r=oq(e);if(!r?.rect)return"absent";let n=await oG(t,r);if(!n.ok)return N({level:"warn",phase:"android_blocking_dialog_tap_failed",data:{session:t.name,deviceId:t.device.id,exitCode:n.exitCode,stdout:n.stdout.trim(),stderr:n.stderr.trim()}}),"failed";if(!await oV(t))return N({level:"warn",phase:"android_blocking_dialog_still_present",data:{session:t.name,deviceId:t.device.id}}),"failed";if(t.appBundleId&&(await eo(t.device,t.appBundleId),!await oj(t,t.appBundleId)))return N({level:"warn",phase:"android_blocking_dialog_relaunch_unfocused",data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId}}),"failed";return N({level:"warn",phase:"android_blocking_dialog_recovered",data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId,x:n.x,y:n.y}}),"recovered"}catch(e){return N({level:"warn",phase:"android_blocking_dialog_recovery_failed",data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),"failed"}}async function oO(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await er(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await oT(n)){let t=`Recovered Android app ANR before ${i}: closed and relaunched ${n.appBundleId}.`;if("before-command"===e.phase)return{status:"recovered",warning:t};throw o$({session:n,command:i,focus:a,message:`Android app ANR appeared after ${i}; ${n.appBundleId} was closed and relaunched. Retry the command against the fresh app session.`,hint:"Retry the command. If the ANR returns, inspect app logs or restart the emulator."})}throw o$({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${oF(a)}. Automatic recovery failed.`,hint:oC})}throw o$({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${oF(a)}.`,hint:oC})}async function oT(e){try{return await oL(e)}catch(t){return N({level:"warn",phase:"android_app_anr_recovery_failed",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}async function oL(e){if(!e.appBundleId)return!1;let t=oq(await oU(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await oG(e,t);if(!r.ok)return!1;await eo(e.device,e.appBundleId);let n=await oj(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&N({level:"warn",phase:"android_app_anr_recovered",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:r.x,y:r.y}}),n}function o$(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new L("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function oF(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function oU(e){return e5(eZ((await oc(e.device,{interactiveOnly:!1,compact:!1})).nodes))}async function oG(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=e4(t.rect),i=await ee(e.device,["shell","input","tap",String(Math.round(r)),String(Math.round(n))],{allowFailure:!0});return 0!==i.exitCode?{ok:!1,exitCode:i.exitCode,stdout:i.stdout.trim(),stderr:i.stderr.trim()}:{ok:!0,x:r,y:n}}function oq(e,t={}){if(!1===t.requireDialogSignal||oK(e))return e.find(e=>oH(e).some(e=>oP.test(e))&&e.rect)}async function oV(e){for(let t=0;t<12;t+=1){if(!oK(await oU(e)))return!0;await eB(500)}return!oK(await oU(e))}async function oj(e,t,r={}){for(let n=0;n<12;n+=1){if(await oB(e,t,r))return!0;await eB(500)}return await oB(e,t,r)}async function oB(e,t,r){return!(r.requireNoBlockingDialog&&await er(e.device))&&(await ef(e.device)).package===t}function oH(e){let t=[e.label,e.identifier];return"string"==typeof e.value&&e.value.trim().length>0&&t.push(e.value),t.filter(e=>"string"==typeof e&&e.trim().length>0).map(e=>e.trim())}function oK(e){return e.some(e=>{let t=oH(e).join(" ").trim();return t.length>0&&ok.test(t)})}function oW(e){return!!(e&&e.width>0&&e.height>0)}function oz(e){return e.width*e.height}function oJ(e,t){return t.x>=e.x&&t.y>=e.y&&t.x+t.width<=e.x+e.width&&t.y+t.height<=e.y+e.height}let oX=[255,59,48,255],oZ=[255,214,10,255],oY=[0,0,0,255],oQ=["scroll","list","recyclerview","edittext","textfield"],o0=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],o1={e:["01110","10000","11110","10000","10000","10001","01110"],0:["01110","10001","10011","10101","11001","10001","01110"],1:["00100","01100","00100","00100","00100","00100","01110"],2:["01110","10001","00001","00010","00100","01000","11111"],3:["11110","00001","00001","01110","00001","00001","11110"],4:["00010","00110","01010","10010","11111","00010","00010"],5:["11111","10000","10000","11110","00001","00001","11110"],6:["01110","10000","10000","11110","10001","10001","01110"],7:["11111","00001","00010","00100","01000","01000","01000"],8:["01110","10001","10001","01110","10001","10001","01110"],9:["01110","10001","10001","01111","00001","00001","01110"]};async function o2(e){let t=eq(await o.readFile(e.screenshotPath),"screenshot"),r=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)o5(r)&&oW(r.rect)&&(!t||oz(r.rect)>oz(t))&&(t=r.rect);return t||function(e){let t=1/0,r=1/0,n=-1/0,i=-1/0;for(let a of e)a.rect&&oW(a.rect)&&(t=Math.min(t,a.rect.x),r=Math.min(r,a.rect.y),n=Math.max(n,a.rect.x+a.rect.width),i=Math.max(i,a.rect.y+a.rect.height));return!Number.isFinite(t)||!Number.isFinite(r)||n<=t||i<=r?null:{x:t,y:r,width:n-t,height:i-r}}(e.filter(e=>{var t;return oW(e.rect)&&!("image"===eX((t=e).type??"")&&!o6(t.label))}))}(e.nodes),a=new Map;for(let n of e.nodes){var o,s;if(!function(e,t,r){let n=[r.label,r.value].some(o9)||o7(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!oW(r.rect)||o5(r))return!1;let n=eX(r.type??"");return!(oQ.some(e=>n.includes(e))||t&&oz(r.rect)>.25*oz(t))}(e,t,r)||(o4(r)?n:n&&function(e){let t=eX(e.type??"");return t.includes("statictext")||t.includes("image")||t.includes("text")||t.includes("other")}(r))}(e,i,n))continue;let l=(o=e.nodes,[function(e){return o4(e)&&!o5(e)}(s=n)?s:null,eJ(o,s,e=>(function(e){return o4(e)&&!o5(e)})(e)),s.hittable?s:null,eJ(o,s,e=>!0===e.hittable)].find(o8)??null);if(!l?.rect||!oW(l.rect))continue;let c=function(e,t,r){let n=se(e);if(e.ref!==t.ref&&n)return n;let i=function(e,t){let r=null;for(let n of t){if(n.ref===e.ref||!function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r[n.parentIndex];if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(n,e,t))continue;let i=se(n);if(!i)continue;let a=function(e){let t=0;return eX(e.type??"").includes("text")&&(t+=2),o9(e.label)&&(t+=2),o9(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||se(t)}(n,l,e.nodes),d=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),o4(t)&&(n+=3),o4(e)&&(n+=2),r&&(n+=2),o7(t.identifier)&&(n+=1),o6(t.value)&&(n+=1),n}(n,l,c),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=o4,i=e=>!!se(e),(!t.rect||!0!==t.hittable||n(t)||i(t)?null:function(e,t,r){let n=e.rect,i=function(e,t,r){let n=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r.get(n.parentIndex);if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(t,e,i)&&function(e,t){let r=eX(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&oW(t.rect)&&oJ(n,t.rect)).map(e=>e.rect);return a.length<2?null:function(e){let t=e[0];if(void 0===t)throw Error("unionRects requires at least one rect");let r=t.x,n=t.y,i=t.x+t.width,a=t.y+t.height;for(let t of e.slice(1))r=Math.min(r,t.x),n=Math.min(n,t.y),i=Math.max(i,t.x+t.width),a=Math.max(a,t.y+t.height);return{x:r,y:n,width:i-r,height:a-n}}(a)}(e,t,r);if(!i)return null;let a=i.y-n.y,o=n.y+n.height-(i.y+i.height);if(a<0||o<0||16>Math.abs(o-a))return null;let s=Math.min(a,o),l=Math.round(i.y-s),c=Math.round(i.height+2*s);return c<=0||c>=n.height?null:{x:n.x,y:l,width:n.width,height:c}}(t,r,i))??t.rect)}(e,l,e.nodes),p=o3(e,i,u,t,r);if(!oW(p))continue;let f=a.get(l.ref);(!f||d>f.score)&&a.set(l.ref,{ref:l.ref,label:c,rect:l.rect,overlayRect:p,score:d})}return function(e,t,r,n,i){let a=eA(e.nodes).primaryAction;if(!a?.ref||!a.rect||!oW(a.rect))return;let o=o3(e,t,a.rect,n,i);if(!oW(o))return;let s={ref:a.ref,label:a.label,rect:a.rect,overlayRect:o,score:100},l=r.get(a.ref);r.set(a.ref,l?{...l,score:Math.max(l.score,s.score)}:s)}(e,i,a,t,r),(function(e){let t=[];for(let r of e.sort((e,t)=>oz(e.overlayRect)-oz(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(oJ(e.overlayRect,r.overlayRect)||oJ(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}oz(r.overlayRect)<oz(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(ss).slice(0,n.maxRefs??24).sort(so).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:e4(e.overlayRect)}))}(e.snapshot,t.width,t.height,{maxRefs:e.maxRefs});for(let e of r){var n,i;(function(e,t,r){for(let n=0;n<2;n+=1)sn(e,t.x,t.x+t.width-1,t.y+n,r),sn(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),si(e,t.x+n,t.y,t.y+t.height-1,r),si(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(n=t,(i=e).overlayRect,oX),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=sr(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:sr(t.y+2,0,Math.max(0,e.height-11));(function(e,t,r,n,i){for(let a=0;a<11;a+=1)for(let o=0;o<n;o+=1)sa(e,t+o,r+a,i)})(e,i,o,n,oZ),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=o1[t];if(n)for(let t=0;t<n.length;t+=1)for(let o=0;o<n[t].length;o+=1)"1"===n[t][o]&&sa(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,oY)}(n,i.overlayRect,i.ref)}return await o.writeFile(e.screenshotPath,eT.sync.write(t)),r}function o3(e,t,r,n,i){if("android"===e.backend||!t)return st(function(e){return{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}(r),n,i);let a=n/t.width,o=i/t.height;return st({x:Math.round((r.x-t.x)*a),y:Math.round((r.y-t.y)*o),width:Math.max(1,Math.round(r.width*a)),height:Math.max(1,Math.round(r.height*o))},n,i)}function o4(e){let t=[e.type,e.role,e.subrole].map(e=>eX(e??"")).join(" ");return o0.some(e=>t.includes(e))}function o5(e){let t=[e.type,e.role,e.subrole].map(e=>eX(e??"")).join(" ");return t.includes("application")||t.includes("window")}function o8(e){return!!(e?.rect&&oW(e.rect)&&!o5(e))}function o6(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function o9(e){var t;let r;return!!o6(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function o7(e){var t;return"string"==typeof e&&!!o9(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function se(e){let t=[e.label,e.value].find(o9);return t?t.trim():o7(e.identifier)?e.identifier.trim():void 0}function st(e,t,r){let n=sr(e.x,0,Math.max(0,t-1)),i=sr(e.y,0,Math.max(0,r-1)),a=Math.max(1,t-n),o=Math.max(1,r-i);return{x:n,y:i,width:sr(e.width,1,a),height:sr(e.height,1,o)}}function sr(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function sn(e,t,r,n,i){for(let a=t;a<=r;a+=1)sa(e,a,n,i)}function si(e,t,r,n,i){for(let a=r;a<=n;a+=1)sa(e,t,a,i)}function sa(e,t,r,n){if(t<0||r<0||t>=e.width||r>=e.height)return;let i=(e.width*r+t)*4;e.data[i]=n[0],e.data[i+1]=n[1],e.data[i+2]=n[2],e.data[i+3]=n[3]}function so(e,t){var r,n;let i=e.overlayRect.y-t.overlayRect.y;if(0!==i)return i;let a=e.overlayRect.x-t.overlayRect.x;return 0!==a?a:(r=e.ref,n=t.ref,Number.parseInt(r.replace(/^\D+/,""),10)-Number.parseInt(n.replace(/^\D+/,""),10))}function ss(e,t){return t.score!==e.score?t.score-e.score:so(e,t)}function sl(e){return"number"==typeof e.gestureClockOriginAtMs&&"number"==typeof e.gestureClockOriginUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureClockOriginAtMs+(e.gestureStartUptimeMs-e.gestureClockOriginUptimeMs)-e.recordingStartedAt):"number"==typeof e.runnerStartedAtUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureStartUptimeMs-e.runnerStartedAtUptimeMs):"number"==typeof e.gestureStartUptimeMs&&"number"==typeof e.gestureEndUptimeMs?Math.max(0,e.fallbackFinishedAtMs-(e.gestureEndUptimeMs-e.gestureStartUptimeMs)-e.recordingStartedAt):Math.max(0,e.fallbackStartedAtMs-e.recordingStartedAt)}let sc=new WeakMap;function sd(e){if(!e)return;let t=sc.get(e);if(t)return t;let r=su(e.nodes??[]);if(r)return sc.set(e,r),r}let su=eU,sp={referenceWidth:1e3,referenceHeight:1e3};function sf(e,t,r,n,i={},a=Date.now(),o=Date.now()){var s,l,c,d,u,p,f,m,h;let w,g,v,y=e.recording;if(!y)return;let S={...i,...n??{}},_=s_(S.effectiveDurationMs)??s_(S.durationMs),I={recordingStartedAt:y.startedAt,gestureClockOriginAtMs:y.gestureClockOriginAtMs,gestureClockOriginUptimeMs:y.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===y.platform?y.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:s_(S.gestureStartUptimeMs),gestureEndUptimeMs:s_(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},b="number"==typeof(s={gestureStartUptimeMs:s_(S.gestureStartUptimeMs),gestureEndUptimeMs:s_(S.gestureEndUptimeMs),reportedDurationMs:_,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}).gestureStartUptimeMs&&"number"==typeof s.gestureEndUptimeMs?Math.max(0,s.gestureEndUptimeMs-s.gestureStartUptimeMs):"number"==typeof s.reportedDurationMs?Math.max(0,s.reportedDurationMs):Math.max(0,s.fallbackFinishedAtMs-s.fallbackStartedAtMs),A="ios"===e.device.platform&&void 0===s_(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sI(s_(t.count),1)??1,r=!0===t.doubleTap,n=sI(s_(t.holdMs),1);return 1===e&&!r&&void 0===n}case"react-native":return"dismiss-overlay"===t.action;default:return!1}}(t,S)?function(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return sl(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...I,gestureDurationMs:b}):sl(I),x=(l=e.snapshot,w=s_((c=S).referenceWidth),g=s_(c.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:sd(l)),M=(d=t,u=r,p=S,f=A,m=b,h=x,v=sm[d],v?.(u,p,f,m,h)??[]);0!==M.length&&(y.gestureEvents.push(...M),N({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:M.length,tMs:A,gestureDurationMs:b,kinds:M.map(e=>e.kind)}}))}let sm={click:(e,t,r,n,i)=>sh(e,t,r,i),press:(e,t,r,n,i)=>sh(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?sh(e,t,r,i):[],fill:(e,t,r,n,i)=>sw(e,t,r,i),focus:(e,t,r,n,i)=>sw(e,t,r,i),longpress:function(e,t,r,n,i){let a=sb(t,e);if(!a)return[];let{x:o,y:s}=a;return[sy(r,o,s,sN(n,[s_(t.durationMs),s_(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sA(t,e),o=sS(t.contentDirection)??sS(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:c,y2:d}=a,u=sN(n,[],250),p=s_(t.amount)??s_(e[1]),f=s_(t.pixels);return[{kind:"scroll",tMs:r,x:s,y:l,x2:c,y2:d,...i,durationMs:u,contentDirection:o,...void 0!==p?{amount:p}:{},...void 0!==f?{pixels:f}:{}}]},pan:sg,fling:sg,swipe:sg,pinch:function(e,t,r,n,i){let a=sb(t,e,1),o=s_(t.scale)??s_(e[0]);if(!a||void 0===o||o<=0)return[];let{x:s,y:l}=a;return[{kind:"pinch",tMs:r,x:s,y:l,...i,scale:o,durationMs:sN(n,[],280)}]}};function sh(e,t,r,n){let i=sb(t,e);if(!i)return[];let{x:a,y:o}=i,s=sI(s_(t.count),1)??1,l=sI(s_(t.intervalMs),0)??0,c=!0===t.doubleTap,d=sI(s_(t.holdMs),1),u=[];for(let e=0;e<s;e+=1){let t=r+e*l;if(void 0!==d&&d>0){u.push(sy(t,a,o,d,n));continue}u.push(sv(t,a,o,n)),c&&u.push(sv(t+90,a,o,n))}return u}function sw(e,t,r,n){let i=sb(t,e);if(!i)return[];let{x:a,y:o}=i;return[sv(r,a,o,n)]}function sg(e,t,r,n,i){let a=sA(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:c}=a,d=sN(n,[s_(t.effectiveDurationMs),s_(t.durationMs),s_(e[4])],250),u=sI(s_(t.count),1)??1,p=sI(s_(t.pauseMs),0)??0,f="ping-pong"===t.pattern?"ping-pong":"one-way";return Array.from({length:u},(e,t)=>{var n,a,u,m,h,w,g,v,y,S,_,I,b;let A,{startX:x,startY:N,endX:M,endY:D}=(n=t,a=f,u=o,m=s,h=l,w=c,"ping-pong"===a&&n%2==1?{startX:h,startY:w,endX:u,endY:m}:{startX:u,startY:m,endX:h,endY:w});return g=r+t*(d+p),v=x,y=N,S=M,_=D,I=d,"back-swipe"===(A=function(e,t,r,n,i){if(!i||Math.abs(r-e)<=1.25*Math.abs(n-t))return"swipe";let a=.08*i.referenceWidth;return e<=a&&r>e||e>=i.referenceWidth-a&&r<e?"back-swipe":"swipe"}(v,y,S,_,b=i))?{kind:A,tMs:g,x:v,y,x2:S,y2:_,...b,durationMs:I,edge:function(e,t,r){if(r){let t=.08*r.referenceWidth;if(e<=t)return"left";if(e>=r.referenceWidth-t)return"right"}return t>=e?"left":"right"}(v,S,b)}:{kind:A,tMs:g,x:v,y,x2:S,y2:_,...b,durationMs:I}})}function sv(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sy(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sS(e){if("string"!=typeof e)return;let t=e.trim().toLowerCase();switch(t){case"up":case"down":case"left":case"right":return t;default:return}}function s_(e){if("number"==typeof e&&Number.isFinite(e))return e;if("string"!=typeof e||0===e.trim().length)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function sI(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sb(e,t,r=0){let n=s_(e.x)??s_(t[r]),i=s_(e.y)??s_(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function sA(e,t){let r=sx(e.x1,e.x,t[0]),n=sx(e.y1,e.y,t[1]),i=sx(e.x2,t[2]),a=sx(e.y2,t[3]);if(void 0!==r&&void 0!==n&&void 0!==i&&void 0!==a)return{x1:r,y1:n,x2:i,y2:a}}function sx(...e){return e.map(s_).find(e=>void 0!==e)}function sN(e,t,r){return sI(e,1)??t.map(e=>sI(e,1)).find(e=>void 0!==e)??r}let sM={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sD(e){var t,r,n,i,a,o,s;let l,c,d,u,p,{req:f,session:m,logPath:h,sessionStore:w,contextFromFlags:g}=e,v=function(e){if("pan"===e.command||"fling"===e.command||"rotate-gesture"===e.command||"transform-gesture"===e.command)return{ok:!1,message:"Use gesture pan, gesture fling, gesture swipe, gesture rotate, or gesture transform."};if("gesture"!==e.command)return{ok:!0,platformCommand:e.command,dispatchRequest:e,recordedCommand:e.command};let[t,...r]=e.positionals??[],n=t?sM[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:e_}}(f);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:y,dispatchRequest:S,recordedCommand:_}=v,I=await sk(m,y);if(I)return I;let b=await sE(m,y);if("response"in b)return b.response;let{resolvedPositionals:A,resolvedOut:x,recordedPositionals:N,recordedFlags:M}="screenshot"===(t=S).command?(c=(n=(r=t).positionals??[],i=r.meta?.cwd,(l=n[0])?[tW.expandHome(l,i),...n.slice(1)]:n),u=(d=(a=r.flags?.out,o=r.meta?.cwd,a?tW.expandHome(a,o):a))?{...r.flags??{},out:d}:r.flags??{},{resolvedPositionals:c,resolvedOut:d,recordedPositionals:c,recordedFlags:u}):{resolvedPositionals:p=(s=t).positionals??[],resolvedOut:s.flags?.out,recordedPositionals:p,recordedFlags:s.flags??{}},D=Date.now(),E={...g(f.flags,m.appBundleId,m.trace?.outPath),surface:m.surface},k=await sP({session:m,sessionName:e.sessionName,logPath:h,command:y,request:S,positionals:A,out:x,dispatchContext:E}),P=await sE(m,y,"after-command");if("response"in P)return P.response;"status"in b&&"recovered"===b.status&&(!k||"object"==typeof k)&&((k??={}).warning=b.warning);let C=Date.now(),R=_===y?N:f.positionals??[],O=_===y?M:f.flags??{};return function(e){let{session:t,sessionStore:r,command:n,recordedCommand:i,resolvedPositionals:a,recordedPositionals:o,recordedFlags:s,data:l,actionStartedAt:c,actionFinishedAt:d,flags:u}=e,p=function(e,t,r,n){if("scroll"!==t)return n;let i=sd(e.snapshot),a={...n??{}},o=sS(a.direction)??sS(r[0]);if(!o)return n;let s=s_(a.amount)??s_(r[1]),l=s_(a.pixels),c=sA(a,[]),d=s_(a.referenceWidth),u=s_(a.referenceHeight),p=void 0!==d&&d>0&&void 0!==u&&u>0?{referenceWidth:d,referenceHeight:u}:i??sp;if(c&&(c.x1!==c.x2||c.y1!==c.y2))return{...a,x1:c.x1,y1:c.y1,x2:c.x2,y2:c.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==l?{pixels:l}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250};let f=eV({direction:o,amount:s,pixels:l,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:f.x1,y1:f.y1,x2:f.x2,y2:f.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==f.pixels?{pixels:f.pixels}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250}}(t,n,a,l);sf(t,n,a,p,u,c,d),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:y,recordedCommand:_,resolvedPositionals:A,recordedPositionals:R,recordedFlags:O,data:k,actionStartedAt:D,actionFinishedAt:C,flags:f.flags??{}}),al(y)&&aa(m,y),ay(m,y,A,f.flags),{ok:!0,data:k??{}}}async function sE(e,t,r="before-command"){if("android"!==e.device.platform||!eS.androidBlockingDialogGuardedAction.has(t))return{status:"clear"};try{return await oO({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:T(e)}}}}async function sk(e,t){if(!is(t,e.device)){var r;let n=(r=e.device,io[t]?.unsupportedHint?.(r));return{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:`${t} is not supported on this device`,...n?{hint:n}:{}}}}return"android"===e.device.platform&&e.recording&&"record"!==t&&await oR({session:e})==="failed"?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function sP(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await nJ(r.device,n,a,o,{...s});let l=await or({session:r,sessionName:e.sessionName,outPath:a[0]??o,outputPlacement:"screenshot"!==(t=i).command?"default":(t.positionals??[])[0]?"positional":t.flags?.out?"out":"default",dispatchContext:s});return i.flags?.overlayRefs&&"string"==typeof l?.path&&await sC(r,l,e.logPath),l}async function sC(e,t,r){let n={snapshotInteractiveOnly:!0,snapshotCompact:!0},i=a5(await aZ({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);oe(e,i);let a=await o2({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let sR=sz(()=>import("./lease.js")),sO=sz(()=>import("./session.js").then(e=>e.session_namespaceObject)),sT=sz(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),sL=sz(()=>import("./react-native.js")),s$=sz(()=>import("./record-trace.js").then(e=>e.record_trace_namespaceObject)),sF=sz(()=>import("./find.js")),sU=sz(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function sG(e){let{command:t}=e.req;return eS.leaseHandler.has(t)?await sq(e):eS.sessionHandler.has(t)?await sV(e):eS.snapshot.has(t)?await sj(e):eS.reactNativeHandler.has(t)?await sB(e):eS.recordTraceHandler.has(t)?await sH(e):eS.findHandler.has(t)?await sK(e):eS.interactionHandler.has(t)?await sW(e):null}async function sq(e){let{handleLeaseCommands:t}=await sR();return sJ(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function sV(e){let{handleSessionCommands:t}=await sO();return sJ(e.req.command,"session",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke,invokeReplayAction:e.invokeReplayAction,androidAdbExecutor:e.androidAdbExecutor}))}async function sj(e){let{handleSnapshotCommands:t}=await sT();return sJ(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function sB(e){let{handleReactNativeCommands:t}=await sL();return sJ(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function sH(e){let{handleRecordTraceCommands:t}=await s$();return sJ(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function sK(e){let{handleFindCommands:t}=await sF();return sJ(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function sW(e){let{handleInteractionCommands:t}=await sU();return sJ(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function sz(e){let t;return()=>t??=e()}function sJ(e,t,r){if(r)return r;throw new L("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let sX=new m;async function sZ(e,t,r){let n=sX.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>sX.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function sY(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function sQ(e,t){var r,n,i,a;let o,s,l,c,d,u;return e.recording?(r=e,n=t,o=J(r.name),s=`agent-device close --session ${o}`,l=`agent-device record stop --session ${o}`,c="selector-conflict"===n?`To keep using this device, rerun the command with --session ${o} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${o} for commands that should attach to the recording session.`,`Recording session "${r.name}" owns this device. Run ${l}; if the session still appears in agent-device session list, run ${s}. ${c} Run agent-device session list to inspect active sessions.`):(i=e,a=t,d=J(i.name),u=`agent-device close --session ${d}`,"selector-conflict"===a?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${d} and remove conflicting device selectors. To switch devices, first run ${u}, then open the desired device with a different --session name.`:`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${d}. To open a new session on this device, first run ${u}.`)}function s0(e,t){if(!t)return[];let r=[],n=e.device,i=rq(t.platform);if(i&&!rj(n.platform,i)&&r.push({key:"platform",value:t.platform}),t.target&&t.target!==(n.target??"mobile")&&r.push({key:"target",value:t.target}),t.udid&&("ios"!==n.platform||t.udid!==n.id)&&r.push({key:"udid",value:t.udid}),t.serial&&("android"!==n.platform||t.serial!==n.id)&&r.push({key:"serial",value:t.serial}),t.device&&t.device.trim().toLowerCase()!==n.name.trim().toLowerCase()&&r.push({key:"device",value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=n.simulatorSetPath?.trim();("ios"!==n.platform||"simulator"!==n.kind||e!==i)&&r.push({key:"iosSimulatorDeviceSet",value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=eu(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function s1(e){return`${function(e){switch(e){case"iosSimulatorDeviceSet":return"--ios-simulator-device-set";case"androidDeviceAllowlist":return"--android-device-allowlist";default:return`--${e}`}}(e.key)}=${e.value}`}let s2="default";function s3(e){return e.session||s2}function s4(e){if(e.meta?.sessionExplicit===!0||(e.session||s2)!==s2||e.meta?.sessionIsolation==="tenant"||e.flags?.sessionIsolation==="tenant")return;let r=function(e){if(!e||0===e.trim().length)return;let t=function(e){let t=n.resolve(e);try{return i.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(i.existsSync(n.join(t,".git")))return t;let e=n.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(r){var a;return{kind:"cwd",id:(a=r,t.createHash("sha256").update(a).digest("hex").slice(0,16))}}}function s5(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function s8(e,t){let r=s4(e);return!!r&&!!t.sessionScope&&!s5(t,r)}function s6(e){return{tenantId:e.meta?.tenantId??e.flags?.tenant,runId:e.meta?.runId??e.flags?.runId,leaseId:e.meta?.leaseId??e.flags?.leaseId,leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend}}let s9=eS.selectorValidationExempt,s7=eS.leaseAdmissionExempt,le=new Set(s7),lt=new Set([ey.apps,ey.devices]);function lr(e,t){var r,n,i,a,o,s,l,c,d,u;let p,f,m,h=e.meta?.lockPolicy;if(!h)return e;let w={...e.flags??{}},g=lt.has(e.command),v=g?[]:t?s0(t,w):(r=w,n=e.meta?.lockPlatform,p=[],f=rq(n),void 0!==r.platform&&f&&(i=rq(r.platform),a=f,i&&a&&i!==a&&("apple"===i?!rV(a):"apple"!==a||!rV(i)))&&p.push({key:"platform",value:r.platform}),f&&(o=p,s=r,l=f,(m=s.target)&&function(e,t){switch(t){case"android":case"ios":return"desktop"===e;case"macos":case"linux":return"desktop"!==e;case"apple":return!1;default:return li(t)}}(m,l)&&o.push({key:"target",value:m}),function(e,t,r){for(let n of function(e,t){switch(e){case"android":return["udid","iosSimulatorDeviceSet"];case"ios":return["serial","androidDeviceAllowlist"];case"apple":var r;return"desktop"===(r=t).target||"macos"===rq(r.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return li(e)}}(r,t)){let r=t[n];r9(r)&&e.push({key:n,value:r})}}(p,r,f)),p),y=e.meta?.lockPlatform;if(0===v.length){return c=g,d=t,u=w,!y||d||void 0!==u.platform||c&&r7(u,r6)||(w.platform=y),{...e,flags:w}}if("strip"===h)return function(e,t,r,n){if(n){ln(e,t),e.platform=n.device.platform;return}ln(e,t),r&&void 0===e.platform&&(e.platform=r)}(w,v,y,t),{...e,flags:w};throw new L("INVALID_ARGS",function(e,t,r){let n=t.map(s1).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${sY(r)}, but this request selected ${n}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:"";return`${e.command} is using a bound-session lock${a}, but this request selected ${n}.`}(e,v,t),{session:e.session,conflicts:v.map(s1),hint:function(e,t){if(t)return sQ(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${J(e.session)}`:"";return"Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. "+(r?`Run agent-device open <app>${n} --platform ${r} first if no session is active. `:`Run agent-device open <app>${n} first if no session is active. `)+"Run agent-device session list to inspect active sessions."}(e,t)})}function ln(e,t){for(let r of t)delete e[r.key]}function li(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function la(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[lo(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return lr(e)}catch{return e}}(n);if("open"===(r=l).command||r7(r.flags,r8))try{let e=await rY(l.flags??{});s.add(lo(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=ls(e)-ls(t);return 0!==r?r:e.localeCompare(t)})}function lo(e){return`device:${e}`}function ls(e){return+!e.startsWith("session:")}function ll(e,t={}){let r=et(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function lc(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:ll(t,{simulatorSetPath:e.simulatorSetPath})}function ld(e,t,r){return iI(lc(e,t),r)}let lu="If runner build products look stale or corrupted, run `pnpm clean:xcuitest` in a local checkout, or remove ~/.agent-device/ios-runner/derived, then retry.";function lp(e){if(!(e instanceof L)||"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"))}function lf(e){return!(e instanceof L)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lm(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new L("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:es({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:ec("IOS_RUNNER_CONNECT_TIMEOUT")})}async function lh(e){var t,r;let n,{session:i,port:a,logPath:o}=e,s=await i.testPromise,l="Runner did not accept connection (xcodebuild exited early)",c=es({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new L("COMMAND_FAILED",l,{port:a,logPath:o,xcodebuild:{exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr},reason:c,hint:(t=s.stdout,r=s.stderr,(n=`${l}
9
9
  ${t}
10
- ${r}`.toLowerCase()).includes("device is busy")&&n.includes("connecting")?"Target iOS device is still connecting. Keep it unlocked, wait for device trust/connection to settle, then retry.":`${el("IOS_RUNNER_CONNECT_TIMEOUT")} ${la}`)})}function lc(e){return"interactionFrame"===e||"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function lu(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${t.randomUUID()}`}}function lp(e){if(t5(e))throw t6()}let lf=new Map;async function lm(e,t,r,n,i=45e3,a,o){let s=en.fromTimeoutMs(i),{getEndpoints:l}=lw(e,t),{endpoints:d}=await l(s.remainingMs()),c=null,u=Math.max(1,Math.ceil(i/250));try{return await eu(async({deadline:s})=>{if(s?.isExpired())throw new L("COMMAND_FAILED","Runner connection deadline exceeded",{port:t,timeoutMs:i});if(a&&null!==a.child.exitCode&&void 0!==a.child.exitCode)throw await ld({session:a,port:t,logPath:n});let u=!1;if("device"===e.kind){let e=await l(s?.remainingMs());d=e.endpoints,u=e.cached}let p=u?d[0]:null,f=await lg(d,{command:r,port:t,timeoutMs:i,signal:o,attemptDeadline:s,onError:(t,r)=>{var n;c=r,"device"===e.kind&&t===p&&(n=e.id,lf.delete(n))}});if(f)return f;if("device"===e.kind&&u){var m;m=e.id,lf.delete(m),d=(await l(s?.remainingMs(),!0)).endpoints;let n=await lg(d,{command:r,port:t,timeoutMs:i,signal:o,attemptDeadline:s,onError:(e,t)=>{c=t}});if(n)return n}if(o?.aborted)throw t6();throw new L("COMMAND_FAILED","Runner endpoint probe failed",{port:t,endpoints:d,lastError:c?String(c):void 0})},{maxAttempts:u,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:ls},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||t7(e))throw t6();c||(c=e)}if(o?.aborted)throw t6();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw ll({port:t,endpoints:d,logPath:n,lastError:c});let a=await l_(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw ll({port:t,endpoints:d,logPath:n,lastError:c})}async function lh(e,t,r,n=45e3,i){if(i?.aborted)throw t6();let a=en.fromTimeoutMs(n),{getEndpoints:o}=lw(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new L("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let d=a.remainingMs();if(d<=0)throw new L("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await ly(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function lw(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await lv({device:e,timeoutBudgetMs:n,forceRefresh:i,requestTunnelIp:r,setRequestTunnelIp:e=>{r=e}});return{endpoints:(a=e,o=t,s=d.ip,l=[`http://127.0.0.1:${o}/command`],"device"!==a.kind||s&&l.unshift(`http://[${s}]:${o}/command`),l),cached:d.sharedCacheHit}}}}async function lg(e,t){let{command:r,port:n,timeoutMs:i,signal:a,attemptDeadline:o,onError:s}=t;for(let t of e)try{let e=o?.remainingMs()??i;if(e<=0)throw new L("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await ly(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||t7(e))throw t6();s(t,e)}return null}async function lv(e){var t,r,n;let{device:i,timeoutBudgetMs:a,forceRefresh:o,requestTunnelIp:s,setRequestTunnelIp:l}=e;if("device"!==i.kind)return{ip:null,sharedCacheHit:!1};if(!o){let e,r=(t=i.id,(e=lf.get(t))?e.expiresAt<=Date.now()?(lf.delete(t),null):e.ip:null);if(r)return{ip:r,sharedCacheHit:!0};if(void 0!==s)return{ip:s,sharedCacheHit:!1}}let d=await lS(i.id,a);return l(d),d&&(r=i.id,n=d,lf.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function ly(e,t,r,n){let i=AbortSignal.timeout(r),a=n?AbortSignal.any([n,i]):i;return await fetch(e,{...t,signal:a})}async function lS(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,a=n.join(c.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),n=await i_(["devicectl","device","info","details","--device",e,"--json-output",a,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==n.exitCode||!i.existsSync(a))return null;let o=JSON.parse(i.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{lN(a)}}async function l_(e,t,r,n,i){let a=JSON.stringify(r),o=ln(e,["spawn",e.id,"/usr/bin/curl","-s","-X","POST","-H","Content-Type: application/json","--data",a,`http://127.0.0.1:${t}/command`]),s=await i_(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=eo({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new L("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:el(e)})}return{status:200,body:l}}async function lI(){return await new Promise((e,t)=>{let r=w.createServer();r.listen(0,"127.0.0.1",()=>{let n=r.address();if("object"==typeof n&&n?.port){let t=n.port;r.close(()=>e(t))}else r.close(()=>t(new L("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function lb(e,t,r,n){t&&lx(t,e),r&&lx(r,e),n&&process.stderr.write(e)}let lA=new Map;function lx(e,t){let r=(lA.get(e)??Promise.resolve()).catch(()=>{}).then(()=>i.promises.appendFile(e,t)).catch(()=>{}).finally(()=>{lA.get(e)===r&&lA.delete(e)});lA.set(e,r)}function lN(e){try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}let lM=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function lE(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new L("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",xctestrunPath:r});let n=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of n)if(!i.existsSync(e))throw new L("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await lD(e)){await iS("codesign",["--remove-signature",e],{allowFailure:!0});try{await iS("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof L?n:new L("COMMAND_FAILED",String(n));throw new L("COMMAND_FAILED","Failed to repair macOS runner product signature",{reason:"RUNNER_PRODUCT_REPAIR_FAILED",productPath:e,xctestrunPath:r,error:t.message,details:t.details})}}}async function lD(e){return 0===(await iS("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let lk=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),lP=new Set([" "," ","\n","\r"]),lC=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function lR(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new lT(e).parse()}function lO(e,t){for(let r of e){if("dict"===r.name)for(let e=0;e<r.children.length-1;e+=1){let n=r.children[e],i=r.children[e+1];n?.name==="key"&&n.text&&i&&t(n.text,i)}lO(r.children,t)}}class lT{roots=[];stack=[];index=0;xml;constructor(e){this.xml=e}parse(){for(this.skipByteOrderMark();this.index<this.xml.length;)this.readNextToken();return this.assertFullyClosed(),this.roots}readNextToken(){"<"!==this.xml[this.index]?this.readText():this.resolveMarkupReader()()}resolveMarkupReader(){return this.startsWith("\x3c!--")?()=>this.skipUntil("--\x3e","Comment is not closed."):this.startsWith("<?")?()=>this.skipUntil("?>","Processing instruction is not closed."):this.startsWith("<![CDATA[")?()=>this.readCdata():this.startsWith("<!")?()=>this.skipDeclaration():this.startsWith("</")?()=>this.readClosingTag():()=>this.readOpeningTag()}assertFullyClosed(){if(this.stack.length>0){let e=this.stack[this.stack.length-1];throw Error(`Unclosed XML tag <${e?.name??"unknown"}>.`)}}skipByteOrderMark(){65279===this.xml.charCodeAt(0)&&(this.index=1)}readOpeningTag(){this.index+=1,this.skipWhitespace();let e=this.readRequiredName(`Missing XML tag name at offset ${this.index}.`),{attributes:t,selfClosing:r}=this.readOpeningTagBody(),n={name:e,attributes:t,text:null,children:[]};this.addNode(n),r||this.pushOpenNode(n)}readOpeningTagBody(){let e={};for(;;){this.skipWhitespace();let t=this.readOpeningTagEnd();if(t)return{attributes:e,selfClosing:"self-closing"===t};let r=this.readAttribute();e[r.name]=r.value}}readOpeningTagEnd(){if(this.index>=this.xml.length)throw Error("Opening XML tag is not closed.");return">"===this.xml[this.index]?(this.index+=1,"open"):"/"===this.xml[this.index]&&">"===this.xml[this.index+1]?(this.index+=2,"self-closing"):null}readAttribute(){let e=this.readRequiredName(`Invalid XML attribute at offset ${this.index}.`);if(function(e){if(lC.has(e))throw Error(`Unsupported XML attribute name "${e}".`)}(e),this.skipWhitespace(),"="!==this.xml[this.index])throw Error(`Missing value for XML attribute "${e}".`);return this.index+=1,this.skipWhitespace(),{name:e,value:this.readAttributeValue(e)}}pushOpenNode(e){if(this.stack.length>=256)throw Error("Maximum XML nesting depth of 256 exceeded.");this.stack.push(e)}readClosingTag(){this.index+=2,this.skipWhitespace();let e=this.readName();if(this.skipWhitespace(),">"!==this.xml[this.index])throw Error(`Closing XML tag </${e}> is not closed.`);this.index+=1;let t=this.stack.pop();if(!t)throw Error(`Unexpected closing XML tag </${e}>.`);if(t.name!==e)throw Error(`Expected </${t.name}> before </${e}>.`)}readText(){let e=this.xml.indexOf("<",this.index),t=-1===e?this.xml.length:e;this.appendText(this.xml.slice(this.index,t),!0),this.index=t}readCdata(){let e=this.index+9,t=this.xml.indexOf("]]>",e);if(-1===t)throw Error("CDATA section is not closed.");this.appendText(this.xml.slice(e,t),!1),this.index=t+3}appendText(e,t){let r=e.trim();if(!r)return;let n=this.stack[this.stack.length-1];n&&(n.text=`${n.text??""}${t?lL(r):r}`)}addNode(e){let t=this.stack[this.stack.length-1];t?t.children.push(e):this.roots.push(e)}readName(){var e;let t=this.index;for(;this.index<this.xml.length&&void 0!==(e=this.xml[this.index])&&lk.has(e);)this.index+=1;return this.xml.slice(t,this.index)}readRequiredName(e){let t=this.readName();if(!t)throw Error(e);return t}readAttributeValue(e){let t=this.xml[this.index];if('"'!==t&&"'"!==t)throw Error(`XML attribute "${e}" must use a quoted value.`);this.index+=1;let r=this.index,n=this.xml.indexOf(t,r);if(-1===n)throw Error(`XML attribute "${e}" is not closed.`);return this.index=n+1,lL(this.xml.slice(r,n).trim())}skipDeclaration(){let e={quote:null,bracketDepth:0};for(let t=this.index+2;t<this.xml.length;t+=1)if(function(e,t){var r,n,i;return!(void 0===t||(r=e,n=t,r.quote?(n===r.quote&&(r.quote=null),!0):('"'===n||"'"===n)&&(r.quote=n,!0)))&&(function(e,t){if("["===t){e.bracketDepth+=1;return}"]"===t&&e.bracketDepth>0&&(e.bracketDepth-=1)}(e,t),i=e,">"===t&&0===i.bracketDepth)}(e,this.xml[t])){this.index=t+1;return}throw Error("XML declaration is not closed.")}skipUntil(e,t){let r=this.xml.indexOf(e,this.index+e.length);if(-1===r)throw Error(t);this.index=r+e.length}skipWhitespace(){for(var e;this.index<this.xml.length&&void 0!==(e=this.xml[this.index])&&lP.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function lL(e){return e.replace(/&(#x[0-9a-fA-F]+|#[0-9]+|amp|lt|gt|quot|apos);/g,(e,t)=>{switch(t){case"amp":return"&";case"lt":return"<";case"gt":return">";case"quot":return'"';case"apos":return"'";default:var r=e,n=t;let i=n.startsWith("#x")?Number.parseInt(n.slice(2),16):Number(n.slice(1));if(!Number.isInteger(i)||i<0||i>1114111)return r;try{return String.fromCodePoint(i)}catch{return r}}})}let l$=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function lF(e){var t;let r=await lU(e);if(!r||0===r.length)return null;let a=n.dirname(e),o=new Set,s=function(e,t){let r=[],i=new Set,a=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){a.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);r.push(n.join(t,e));let s=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(e);s&&i.add(n.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(i),hostRelativePaths:a}}(r,a);for(let e of s.testRootPaths){if(!i.existsSync(e))return null;o.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>i.existsSync(n.join(t,e)));return r?n.join(r,e):null})){if(!e)return null;o.add(e)}return Array.from(o)}async function lU(e){let t=await iI(e);if(t){var r,n,a,o=t;let e=new Set;for(let t of[a=o,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!lG(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(lG))}return r}(a),...Object.values(a).filter(e=>lG(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(l$.has(r)){if("string"==typeof n){t.add(n);continue}if(Array.isArray(n))for(let e of n)"string"==typeof e&&t.add(e)}return Array.from(t)}(t))e.add(r);return Array.from(e)}if("darwin"===process.platform)return null;try{let t;return r=i.readFileSync(e,"utf8"),n=lR(r),t=new Set,lO(n,(e,r)=>{if(l$.has(e)){if("string"===r.name&&r.text)return void t.add(r.text);if("array"===r.name)for(let e of r.children)"string"===e.name&&e.text&&t.add(e.text)}}),Array.from(t)}catch{return null}}function lG(e){return!!e&&"object"==typeof e}let lq=["CFBundleIcons","CFBundleIcons~ipad"];async function lj(e){let t=e.filter(lW);if(0===t.length)return;let r=e.filter(e=>lJ(e)&&!lz(e));for(let e of t){let t=function(e,t){let r=n.dirname(e);return t.find(e=>n.dirname(e)===r&&"AgentDeviceRunner.app"===n.basename(e))??t.find(t=>n.dirname(t)===r&&t!==e)??null}(e,r);t&&await lV(t,e)}}async function lV(e,t){var r;let a,o=function(e,t){let r=!1;for(let o of i.readdirSync(e,{withFileTypes:!0})){var a;if(o.isFile()&&(a=o.name,/^AppIcon.*\.png$/.test(a)||"Assets.car"===a))(function(e,t){if(i.existsSync(t)){let r=i.readFileSync(e),n=i.readFileSync(t);return!r.equals(n)&&(i.copyFileSync(e,t),!0)}return i.copyFileSync(e,t),!0})(n.join(e,o.name),n.join(t,o.name))&&(r=!0)}return r}(e,t),s=await lB(e,t);(o||s)&&(await lK(t),r=t,a=new Date,i.utimesSync(r,a,a))}async function lB(e,t){var r,i;let a=n.join(e,"Info.plist"),o=n.join(t,"Info.plist"),s=await iI(a),l=await iI(o);if(!s||!l)return!1;let d=(r=s,i=l,lq.flatMap(e=>{let t=r[e];return void 0===t||JSON.stringify(i[e])===JSON.stringify(t)?[]:[{key:e,value:t,shouldInsert:void 0===i[e]}]}));if(0===d.length)return!1;for(let e of d)await lH(o,e.key,e.value,e.shouldInsert);return!0}async function lH(e,t,r,n){let i=await iS("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new L("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function lK(e){let t=await iS("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new L("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function lW(e){return lJ(e)&&lz(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function lz(e){return n.basename(e).endsWith("-Runner.app")}function lJ(e){return n.basename(e).endsWith(".app")}let lX="XCTestDevices",lZ=".agent-device-backup",lY=".agent-device-xctestdevices-backup-",lQ=n.join(c.homedir(),".agent-device","ios-runner"),l0=".agent-device-runner-cache.json",l1={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},l2=new Map,l3=new Set;function l4(e){return e?.trim()??""}function l5(e=process.env){return l4(e.AGENT_DEVICE_IOS_BUNDLE_ID)||l4(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function l8(e=process.env){let t=l4(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${l5(e)}.uitests`}let l6=function(e=process.env){let t=l5(e),r=l8(e);return Array.from(new Set([l4(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function l9(e=c.homedir()){return n.join(e,"Library","Developer","XCTestDevices")}async function l7(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=ee(e.simulatorSetPath);if(!r)return null;let a=n.resolve(r),o=n.resolve(t.xctestDeviceSetPath??l9()),s=n.resolve(t.backupPath??function(e=l9()){return`${e}${lZ}`}(o)),l=n.resolve(t.lockDirPath??function(e=c.homedir()){return n.join(e,".agent-device","xctest-device-set.lock")}()),d=t.ownerStartTime??M(process.pid),u=await dr({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(de({xctestDeviceSetPath:o,backupPath:s}),function(e,t){if(n.resolve(e)===n.resolve(t))return!0;try{return i.realpathSync.native(e)===i.realpathSync.native(t)}catch{return!1}}(a,o))return await u(),null;i.mkdirSync(a,{recursive:!0}),i.existsSync(o)&&i.renameSync(o,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,a=n.dirname(r),o=n.join(a,`${lX}.agent-device-link-${process.pid}-${Date.now()}`);i.mkdirSync(a,{recursive:!0});try{i.symlinkSync(t,o,"dir"),i.renameSync(o,r)}catch(e){throw i.existsSync(o)&&dt(o),e}}({requestedSetPath:a,xctestDeviceSetPath:o})}catch(e){throw de({xctestDeviceSetPath:o,backupPath:s}),await u(),new L("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:a,xctestDeviceSetPath:o,backupPath:s,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{de({xctestDeviceSetPath:o,backupPath:s})}finally{await u()}}}}}function de(e){let{xctestDeviceSetPath:t,backupPath:r}=e,a=[r,...function(e){let t=n.dirname(e),r=n.basename(e).replace(lZ,""),a=r===lX?lY:`${r}${lY}`;try{return i.readdirSync(t).filter(e=>e.startsWith(a)).sort().map(e=>n.join(t,e))}catch{return[]}}(r)],o=a.find(e=>i.existsSync(e)),s=i.existsSync(t)&&i.lstatSync(t).isSymbolicLink();if(o){if(s&&dt(t),i.existsSync(t))if(!s)return void N({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:o}});else o!==r?i.rmSync(o,{recursive:!0,force:!0}):i.rmSync(r,{recursive:!0,force:!0});else i.mkdirSync(n.dirname(t),{recursive:!0}),i.renameSync(o,t);for(let e of a)e!==o&&i.existsSync(e)&&i.rmSync(e,{recursive:!0,force:!0});return}s&&(N({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),dt(t))}function dt(e){!i.existsSync(e)||i.lstatSync(e).isSymbolicLink()&&i.unlinkSync(e)}async function dr(e){let{lockDirPath:t,owner:r}=e,a=n.join(t,"owner.json"),o=Date.now()+(e.timeoutMs??3e4),s=e.pollMs??100,l=e.description??"XCTest device set lock";for(i.mkdirSync(n.dirname(t),{recursive:!0});Date.now()<o;)try{i.mkdirSync(t),function(e,t){let r=`${e}.${process.pid}.${Date.now()}.tmp`;i.writeFileSync(r,JSON.stringify(t),"utf8"),i.renameSync(r,e)}(a,r);let e=!1;return async()=>{e||(e=!0,i.rmSync(t,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,t){let r=null;try{r=i.statSync(e)}catch{return!0}let n=di(t);if(n){var a;return!(Number.isInteger((a=n).pid)&&!(a.pid<=0)&&C(a.pid)&&(!a.startTime||M(a.pid)===a.startTime))&&(i.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-r.mtimeMs<5e3)&&(i.rmSync(e,{recursive:!0,force:!0}),!0)}(t,a))continue;await eV(s)}throw new L("COMMAND_FAILED",`Timed out waiting for ${l}`,{lockDirPath:t,...function(e,t){let r,n=Date.now(),a=di(t);try{r=Math.max(0,Math.round(n-i.statSync(e).mtimeMs))}catch{}return{...void 0!==r?{lockAgeMs:r}:{},...a?{ownerPid:a.pid,ownerStartTime:a.startTime,ownerAgeMs:Math.max(0,Math.round(n-a.acquiredAtMs))}:{}}}(t,a)})}async function dn(e){var t;return await dr({lockDirPath:(t=e,n.join(n.dirname(t),`${n.basename(t)}.lock`)),owner:{pid:process.pid,startTime:M(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}function di(e){try{return JSON.parse(i.readFileSync(e,"utf8"))}catch{return null}}async function da(e,r){let a=e6(),o=function(e,r=e6()){var a;let o;return{schemaVersion:1,packageVersion:e8(),runnerSourceFingerprint:function(e){let r=n.join(e,"ios-runner","AgentDeviceRunner"),a=function(e){if(!i.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of i.readdirSync(e,{withFileTypes:!0})){var a,o;let i=n.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(i);continue}s.isFile()&&(a=s.name,o=i,"project.pbxproj"===a?o.includes(`${n.sep}.xcodeproj${n.sep}`):[".jpg",".json",".png",".swift",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(n.extname(a)))&&t.push(i)}}return t.sort((e,t)=>e.localeCompare(t))}(r),o=function(e,r){let a=t.createHash("sha256");for(let t of r){let r=n.relative(e,t),o=i.statSync(t);a.update(r),a.update("\0"),a.update(String(o.size)),a.update("\0"),a.update(String(Math.trunc(o.mtimeMs))),a.update("\0")}return a.digest("hex")}(r,a),s=dv.get(r);if(s?.fileStatsFingerprint===o)return s.sourceFingerprint;let l=t.createHash("sha256");for(let e of a){let t=n.relative(r,e);l.update(t),l.update("\0"),l.update(i.readFileSync(e)),l.update("\0")}let d=l.digest("hex");return dv.set(r,{fileStatsFingerprint:o,sourceFingerprint:d}),d}(r),platformName:dE(e),deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(o=dE(a=e))?`platform=macOS,arch=${dD()}`:"simulator"===a.kind?`generic/platform=${o} Simulator`:`generic/platform=${o}`,runnerBundleBuildSettings:dC(process.env),runnerSigningBuildSettings:dP(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:dR()}}(e,a),s=function(e,r){var i;let a,o=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(o)return n.resolve(o);let s=(a=t.createHash("sha256").update(JSON.stringify(dp(r))).digest("hex"),`cache-${a.slice(0,16)}`),l="macos"===(i=e).platform?n.join(lQ,"derived","macos"):"tv"===i.target?n.join(lQ,"derived","simulator"===i.kind?"tvos-simulator":"tvos-device"):"simulator"===i.kind?n.join(lQ,"derived","ios-simulator"):n.join(lQ,"derived","ios-device");return n.join(l,s)}(e,o);return await sH(l2,s,async()=>{let t=await dn(s);try{return await ds({device:e,options:r,projectRoot:a,expectedCacheMetadata:o,derived:s})}finally{await t()}})}async function ds(e){let{device:t,options:r,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;ei(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)&&(dL("clean","forced_clean",{derived:s}),dO(s),dd(s));let l=await dT({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>dy(e,t),xctestrunReferencesProjectRoot:d_,resolveExistingXctestrunProductPaths:lF});if("reuse_ready"!==l.reason&&dL("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath}),"reuse_ready"===l.reason){let e=await dl(t,s,o,l);if(e)return e}l.xctestrunPath&&(dO(s),dd(s));let d=n.join(a,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!i.existsSync(d))throw new L("COMMAND_FAILED","iOS runner project not found",{projectPath:d});await dM(t,d,s,r);let c=dy(s,t);if(!c)throw new L("COMMAND_FAILED","Failed to locate .xctestrun after build");let u=await lF(c);if(!u)throw new L("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:c});return await lE(t,u,c),await lj(u),du(s,df(o,c,u)),dL("build","built_new",{derived:s,xctestrunPath:c}),c}async function dl(e,t,r,n){try{var i,a,o,s;return await lE(e,n.productPaths,n.xctestrunPath),dL("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,du(i,df(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof L))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&lM.has(t)}(e))throw e;return dL("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function dd(e){try{if(!i.existsSync(e))return;if("derived"!==n.basename(e))return void i.rmSync(e,{recursive:!0,force:!0});for(let r of i.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,dc.has(t)&&i.rmSync(n.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let dc=new Set([l0,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function du(e,t){i.mkdirSync(e,{recursive:!0}),i.writeFileSync(n.join(e,l0),`${JSON.stringify(t,null,2)}
11
- `)}function dp(e){let{artifacts:t,...r}=e;return r}function df(e,t,r){let n=function(e,t){let r=dh(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=dh(e);if(null===t)return null;n.push({path:e,...t})}return{xctestrunPath:e,xctestrunMtimeMs:r.mtimeMs,xctestrunSize:r.size,productPaths:n}}(t,r);return n?{...e,artifacts:n}:e}function dm(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function dh(e){try{let t=i.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function dw(e,t){let r=dh(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function dg(e,t){let r=n.relative(n.resolve(t),n.resolve(e));return""!==r&&!r.startsWith("..")&&!n.isAbsolute(r)}let dv=new Map;function dy(e,t){if(!i.existsSync(e))return null;let r=[],a=[e];for(;a.length>0;){let e=a.pop();for(let t of i.readdirSync(e,{withFileTypes:!0})){let o=n.join(e,t.name);if(t.isDirectory()){a.push(o);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=i.statSync(o);r.push({path:o,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,r)=>{if(t){let n=dS(r.path,t)-dS(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function dS(e,t){var r;let i=0,a=e.toLowerCase();n.basename(a).startsWith("agentdevicerunner.env.")&&(i-=1e3),a.includes(`${n.sep}macos${n.sep}`)&&(i-=5e3);let o="macos"===(r=t).platform?{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]}:"tv"===r.target?"simulator"===r.kind?{preferred:["appletvsimulator"],disallowed:["appletvos","iphoneos","iphonesimulator","macos"]}:{preferred:["appletvos"],disallowed:["appletvsimulator","iphoneos","iphonesimulator","macos"]}:"simulator"===r.kind?{preferred:["iphonesimulator"],disallowed:["iphoneos","appletvos","appletvsimulator","macos"]}:{preferred:["iphoneos"],disallowed:["iphonesimulator","appletvos","appletvsimulator","macos"]};return o.preferred.length>0&&(o.preferred.some(e=>a.includes(e))?i+=2e3:i-=500),o.disallowed.some(e=>a.includes(e))&&(i-=2500),i}function d_(e,t){try{let r=i.readFileSync(e,"utf8"),n=new Set([t]);try{n.add(i.realpathSync(t))}catch{}for(let e of n)if(r.includes(e))return!0;return!1}catch{return!1}}async function dI(e,t,r){let i=n.dirname(e),a=r.replace(/[^a-zA-Z0-9._-]/g,"_"),o=n.join(i,`AgentDeviceRunner.env.${a}.json`),s=n.join(i,`AgentDeviceRunner.env.${a}.xctestrun`),l=await db(e);return dx(l,e=>{var r,n;return r=e,n=t,void(r.EnvironmentVariables={...r.EnvironmentVariables??{},...n},r.UITestEnvironmentVariables={...r.UITestEnvironmentVariables??{},...n},r.UITargetAppEnvironmentVariables={...r.UITargetAppEnvironmentVariables??{},...n},r.TestingEnvironmentVariables={...r.TestingEnvironmentVariables??{},...n})}),dx(l,e=>Object.assign(e,l1),{requireTestBundlePath:!0}),await dA(l,o,s),{xctestrunPath:s,jsonPath:o}}async function db(e){let t=await iS("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new L("COMMAND_FAILED","Failed to read xctestrun plist",{xctestrunPath:e,stderr:t.stderr});try{let e=JSON.parse(t.stdout);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Root must be an object");return e}catch(t){throw new L("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function dA(e,t,r){i.writeFileSync(t,JSON.stringify(e,null,2));let n=await iS("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new L("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:r,stderr:n.stderr})}function dx(e,t,r={}){let n=e.TestConfigurations;if(Array.isArray(n))for(let e of n)e&&"object"==typeof e&&function(e,t,r){if(Array.isArray(e))for(let n of e){let e=dN(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=dN(r,{requireTestBundlePath:!0});e&&t(e)}}function dN(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function dM(e,t,r,n){let i=dC(process.env),a=dP(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=dR(),l=await l7(e);try{var d;let l;await F("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",dk(e),"1","-destination",(d=e,l=dE(d),"macOS"===l?`platform=macOS,arch=${dD()}`:"simulator"===d.kind?`platform=${l} Simulator,id=${d.id}`:`generic/platform=${l}`),"-derivedDataPath",r,...s,...i,...o,...a],{detached:!0,onSpawn:e=>{l3.add(e),e.on("close",()=>{l3.delete(e)})},onStdoutChunk:e=>{lb(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{lb(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof L?a:new L("COMMAND_FAILED",String(a)),i=(e=r.details?JSON.stringify(r.details):"",((t=`${r.message}
12
- ${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)??la);throw new L("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await l?.release()}}function dE(e){var t;if("ios"!==e.platform&&"macos"!==e.platform)throw new L("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 dD(){return"arm64"===process.arch?"arm64":"x86_64"}function dk(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function dP(e=process.env,t=!1,r="ios"){if("macos"===r)return["CODE_SIGNING_ALLOWED=NO","CODE_SIGNING_REQUIRED=NO","CODE_SIGN_IDENTITY=","DEVELOPMENT_TEAM="];if(!t)return[];let n=e.AGENT_DEVICE_IOS_TEAM_ID?.trim()||"",i=e.AGENT_DEVICE_IOS_SIGNING_IDENTITY?.trim()||"",a=e.AGENT_DEVICE_IOS_PROVISIONING_PROFILE?.trim()||"",o=["CODE_SIGN_STYLE=Automatic"];return n&&o.push(`DEVELOPMENT_TEAM=${n}`),i&&o.push(`CODE_SIGN_IDENTITY=${i}`),a&&o.push(`PROVISIONING_PROFILE_SPECIFIER=${a}`),o}function dC(e=process.env){let t=l5(e),r=l8(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function dR(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function dO(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,i;if(r=e,t=n.resolve(e6(),".tmp"),""===(i=n.relative(t,n.resolve(r)))||i.startsWith("..")||n.isAbsolute(i))throw new L("COMMAND_FAILED","Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically",{derivedPath:e,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${n.join(e6(),".tmp")}.`})}}async function dT(e){var t,r;let a,o=(t=e.derived,r=e.expectedCacheMetadata,(a=function(e){try{let t=JSON.parse(i.readFileSync(n.join(e,l0),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?JSON.stringify(dp(a))!==JSON.stringify(dp(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:a}:{ok:!1,reason:"cache_metadata_missing"}),s=o.ok?function(e,t){var r;let n=t?.artifacts;if(!(!(!(r=n)||"object"!=typeof r||Array.isArray(r))&&"string"==typeof r.xctestrunPath&&Number.isInteger(r.xctestrunMtimeMs)&&Number.isInteger(r.xctestrunSize)&&Array.isArray(r.productPaths)&&r.productPaths.length>0&&r.productPaths.every(dm))||!dg(n.xctestrunPath,e)||!dw(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!dg(t.path,e)||!dw(t.path,t))return null;i.push(t.path)}return{xctestrunPath:n.xctestrunPath,productPaths:i}}(e.derived,o.metadata):null,l=s?.xctestrunPath??e.findXctestrun(e.derived);if(!l)return{reason:"missing_xctestrun",xctestrunPath:null};let d=s?.xctestrunPath===l,c=d?s.productPaths:await e.resolveExistingXctestrunProductPaths(l);return c?e.xctestrunReferencesProjectRoot(l,e.projectRoot)||d?o.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:c}:{reason:o.reason,xctestrunPath:l,productPaths:c}:{reason:"project_root_mismatch",xctestrunPath:l,productPaths:c}:{reason:"missing_products",xctestrunPath:l,productPaths:[]}}function dL(e,t,r){N({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let d$=new Map,dF=new Map;async function dU(e,t){return await sH(dF,e.id,async()=>{let r,n,i=d$.get(e.id);if(i){if(dW(i.child.pid))return N({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:i.sessionId,ready:i.ready}}),i;await dQ({},"stop_stale_session",async()=>{await dV(e.id,i)})}let a={};await dQ(a,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(N({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):dJ(t))}),t.cleanStaleBundles?await dQ(a,"cleanup_stale_bundles",async()=>{await dG(e)}):(a.cleanup_stale_bundles=0,N({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let o=await dQ(a,"ensure_xctestrun",async()=>await da(e,t)),s=await dQ(a,"allocate_port",async()=>await lI()),{xctestrunPath:l,jsonPath:d}=await dQ(a,"prepare_xctestrun_env",async()=>await dI(o,{AGENT_DEVICE_RUNNER_PORT:String(s)},`session-${e.id}-${s}`)),c=await dQ(a,"simulator_set_redirect",async()=>await l7(e));try{({child:r,wait:n}=await dQ(a,"launch_xcodebuild",()=>{let t;return $("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",dk(e),"1","-destination-timeout",String(20),"-xctestrun",l,"-destination",(t=dE(e),"macOS"===t?`platform=macOS,arch=${dD()}`:"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 c?.release(),e}r.stdout?.on("data",e=>{lb(e,t.logPath,t.traceLogPath,t.verbose)}),r.stderr?.on("data",e=>{lb(e,t.logPath,t.traceLogPath,t.verbose)});let u={sessionId:`${e.id}:${s}:${Date.now()}`,device:e,deviceId:e.id,port:s,xctestrunPath:l,jsonPath:d,testPromise:n,child:r,ready:!1,startupTimings:a,simulatorSetRedirect:c??void 0};return d$.set(e.id,u),u})}async function dG(e){if("simulator"===e.kind)for(let t of l6){let r=await i_(ln(e,["uninstall",e.id,t]),{allowFailure:!0});if(0!==r.exitCode){let e=`${r.stdout}
13
- ${r.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 dq(e){let t=d$.get(e);return t?{sessionId:t.sessionId,alive:dW(t.child.pid)}:null}async function dj(e,t){await sH(dF,e.deviceId,async()=>{d$.get(e.deviceId)===e&&(N({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await dV(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function dV(e,t,r={}){let n=t??d$.get(e);if(n){var i;if(!1!==r.graceful)try{await lm(n.device,n.port,lu({command:"shutdown"}),void 0,15e3)}catch{await dz(n.child.pid,"SIGTERM")}else await dz(n.child.pid,"SIGTERM");try{await Promise.race([n.testPromise,new Promise(e=>setTimeout(e,r.waitTimeoutMs??1e4))])}catch{}(i=n.child.pid)&&(dW(i)||k(i))&&await dz(n.child.pid,"SIGKILL"),lN(n.xctestrunPath),lN(n.jsonPath),await n.simulatorSetRedirect?.release(),d$.get(e)===n&&d$.delete(e)}}async function dB(e){await sH(dF,e,async()=>{await dV(e)})}async function dH(){let e=Array.from(d$.values()),t=Array.from(l3);await Promise.allSettled(e.map(async e=>{await dz(e.child.pid,"SIGINT")})),await Promise.allSettled(t.map(async e=>{await dz(e.pid,"SIGINT")})),await Promise.allSettled(e.map(async e=>{await dz(e.child.pid,"SIGTERM")})),await Promise.allSettled(t.map(async e=>{await dz(e.pid,"SIGTERM")})),await Promise.allSettled(e.map(async e=>{await dz(e.child.pid,"SIGKILL")})),await Promise.allSettled(t.map(async e=>{await dz(e.pid,"SIGKILL"),l3.delete(e)})),await Promise.allSettled(e.map(async e=>{await e.simulatorSetRedirect?.release()}))}async function dK(){await dH();let e=Array.from(d$.keys());await Promise.allSettled(e.map(async e=>{await dB(e)}));let t=Array.from(l3);await Promise.allSettled(t.map(async e=>{try{await dz(e.pid,"SIGTERM"),await dz(e.pid,"SIGKILL")}finally{l3.delete(e)}}))}function dW(e){return!!e&&C(e)}async function dz(e,t){if(!e||e<=0)return;try{process.kill(-e,t)}catch{}try{process.kill(e,t)}catch{}let r="SIGINT"===t?"INT":"SIGTERM"===t?"TERM":"KILL";try{await iS("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function dJ(e){await i_(ln(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}async function dX(e,t,r,n,i,a){var o,s;o=t,s=r.command,o.startupTimingsReported||!o.startupTimings||(o.startupTimingsReported=!0,N({level:"info",phase:"ios_runner_session_startup_timings",durationMs:Object.values(o.startupTimings).reduce((e,t)=>e+t,0),data:{command:s,sessionId:o.sessionId,ready:o.ready,timings:o.startupTimings}}));let l=lu(r);if(lc(l.command)){let r=await x("ios_runner_command_send",async()=>await lm(e,t.port,l,n,i,t,a),{command:l.command,commandId:l.commandId,readOnly:!0,sessionReady:t.ready,timeoutMs:i});return await dZ(r,t,n)}let d=en.fromTimeoutMs(i),c=function(e,t){if(!e.ready)return{action:"run",reason:"startup"};if("tap"!==t.command&&"tapSeries"!==t.command)return{action:"run",reason:"conservative_command"};let r=e.lastSuccessfulRunnerResponseAtMs;if(void 0===r)return{action:"run",reason:"no_successful_response"};let n=Date.now()-r;return n>1e4?{action:"run",reason:"successful_response_stale",lastSuccessfulRunnerResponseAgeMs:n}:{action:"skip",reason:"recent_successful_response",lastSuccessfulRunnerResponseAgeMs:n}}(t,l);if("run"===c.action){let r=t.ready?Math.min(5e3,d.remainingMs()):Math.min(45e3,d.remainingMs());try{let i=await x("ios_runner_readiness_preflight",async()=>await lm(e,t.port,lu({command:"uptime"}),n,r,t,a),{command:l.command,commandId:l.commandId,lastSuccessfulRunnerResponseAgeMs:c.lastSuccessfulRunnerResponseAgeMs,reason:c.reason,sessionReady:t.ready,timeoutMs:r});await dZ(i,t,n)}catch(e){throw dY(e,{runnerReadinessPreflightFailed:!0})}}else N({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:r.command,commandId:l.commandId,lastSuccessfulRunnerResponseAgeMs:c.lastSuccessfulRunnerResponseAgeMs,reason:c.reason,sessionReady:t.ready}});let u=d.remainingMs();if(u<=0)throw new L("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:i});let p=await x("ios_runner_command_send",async()=>await lh(e,t.port,l,u,a),{command:l.command,commandId:l.commandId}).catch(e=>{if("skip"===c.action){var t;throw dY(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:(t=c).reason,runnerReadinessPreflightSkippedAgeMs:t.lastSuccessfulRunnerResponseAgeMs})}throw e});return await dZ(p,t,n)}async function dZ(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new L("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?R(e):"COMMAND_FAILED",i="string"==typeof n.error?.message?n.error.message:void 0,a="string"==typeof n.error?.hint?n.error.hint:void 0;throw new L(t,i??"Runner error",{runner:n,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,logPath:r})}if(t.ready=!0,t.lastSuccessfulRunnerResponseAtMs=Date.now(),n.data&&"object"==typeof n.data&&!Array.isArray(n.data)){var a;let e,t=n.data;return"string"==typeof(e=(a=t).gestureFallback)&&0!==e.length&&N({level:"debug",phase:"ios_runner_gesture_fallback",data:{fallback:e,message:"string"==typeof a.gestureFallbackMessage?a.gestureFallbackMessage:void 0,hint:"string"==typeof a.gestureFallbackHint?a.gestureFallbackHint:void 0}}),t}return{}}function dY(e,t){let r=e instanceof L?e:new L("COMMAND_FAILED",e instanceof Error?e.message:String(e),void 0,e);return new L(r.code,r.message,{...r.details??{},...t},r.cause??e)}async function dQ(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,N({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}let d0=new m;function d1(e){return{runCommand:e}}function d2(e,t,r,n={}){if(r)return d8(r);let i=d4(e,n);return i?d8(i.provider):d8(t)}function d3(e,t={}){return void 0!==d4(e,t)}function d4(e,t={}){let r=d0.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}async function d5(e,t,r){if(!e)return await r();let n={provider:d8(e),deviceId:t.deviceId,requestId:t.requestId};return await d0.run(n,r)}function d8(e){return"function"==typeof e?{runCommand:e}:e}async function d6(e,t,r={}){if("ios"!==e.platform&&"macos"!==e.platform)throw new L("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new L("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`);lp(r.requestId);let n=lu(t),i=d2(e,d1(d7),void 0,{requestId:r.requestId});return lc(n.command)?er(()=>(lp(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(lp(r.requestId),lo(e))}):i.runCommand(e,n,r)}function d9(e,t={}){return"ios"!==e.platform?void 0:d3(e,{requestId:t.requestId})?void N({level:"debug",phase:"ios_runner_session_prewarm_skipped_scoped_provider",data:{deviceId:e.id}}):dU(e,t).then(()=>{}).catch(t=>{N({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}})})}async function d7(e,t,r){let n;lp(r.requestId);let i=t8(r.requestId);try{let a=((n=await dU(e,r)).ready,45e3);return await dX(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof L?o:new L("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&ls(a)&&n){lp(r.requestId),await dj(n,"runner_connect_failed_before_command_send"),n=await dU(e,{...r,cleanStaleBundles:!0});try{return await dX(e,n,t,r.logPath,45e3,i)}catch(o){let a=o instanceof L?o:new L("COMMAND_FAILED",String(o));if(lo(a))return await ce(e,n,t,a,r,i,"transport_error_after_retry_command_send");throw o}}if(n&&function(e){let t;return e.details?.runnerReadinessPreflightFailed===!0&&(lo(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a)){lp(r.requestId),await dj(n,"runner_readiness_preflight_failed_before_command_send"),n=await dU(e,{...r,cleanStaleBundles:!0});try{let a=await dX(e,n,t,r.logPath,45e3,i);return N({level:"debug",phase:"ios_runner_readiness_preflight_recovered",data:{command:t.command,commandId:t.commandId,recovery:"session_restarted",sessionId:n.sessionId}}),a}catch(o){let a=o instanceof L?o:new L("COMMAND_FAILED",String(o));if(lo(a))return await ce(e,n,t,a,r,i,"transport_error_after_retry_command_send");throw o}}if(!n&&a.message.includes("Runner did not accept connection")&&await dB(e.id),n&&lo(a))return await ce(e,n,t,a,r,i,"transport_error_after_command_send");throw o}}async function ce(e,t,r,n,i,a,o){let s=await cn(e,t,r,n,i,a);return await ct(s,{command:r,session:t,transportError:n,invalidationReason:o})}async function ct(e,t){var r,n,i,a;if(!e)return await cr(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,ca({command:(n=t).command,session:n.session,transportError:n.transportError,decision:"skipped",reason:r.reason,lifecycleState:r.lifecycleState}),r.data}if("skipInvalidation"===e.type){throw i=e,ca({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await cr(t,e.reason,e.lifecycleState,e.error)}async function cr(e,t,r,n){throw ca({command:e.command,session:e.session,transportError:e.transportError,decision:"retained",reason:t,lifecycleState:r}),await dj(e.session,e.invalidationReason),n??e.transportError}async function cn(e,t,r,n,i,a){var o,s,l,d,c,u,p,f,m,h;let w,g,v,y,S;if("status"===r.command||!r.commandId?.trim())return;let _=co(n);try{w=await dX(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return N({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:r.command,commandId:r.commandId,error:e instanceof Error?e.message:String(e),..._}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let I="string"==typeof w.lifecycleState?w.lifecycleState:"";return N({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:I,..._}}),o=w,s=I,l=r,d=n,c=i,"completed"===s?function(e,t,r,n){let i=function(e){if("string"!=typeof e||0===e.trim().length)return;let t=function(e){try{let t=JSON.parse(e);if(t&&"object"==typeof t)return t}catch{}return{}}(e);if(t.ok)return t.data&&"object"==typeof t.data&&!Array.isArray(t.data)?t.data:{}}(e.lifecycleResponseJson);if(i)return{type:"recovered",data:i,reason:"completed_with_retained_response",lifecycleState:"completed"};if(lc(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let a=co(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new L("COMMAND_FAILED",`Runner command "${t.command}" completed after the transport response was lost, but no recoverable response was retained.`,{command:t.command,commandId:t.commandId,lifecycleState:"completed",recovery:"completed_without_retained_response",...a,hint:function(e,t={}){return`${ci(t)}The runner is still reachable and reports "${e}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`}(t.command,a),logPath:n.logPath,transportError:r.message},r)}}(o,l,d,c):"failed"===s?{type:"skipInvalidation",reason:"runner_reported_failure",lifecycleState:s,error:(u=o,p=l,f=d,m=c,g="string"==typeof u.lifecycleErrorCode?u.lifecycleErrorCode:void 0,v="string"==typeof u.lifecycleErrorMessage?u.lifecycleErrorMessage:"Runner command failed",y="string"==typeof u.lifecycleErrorHint?u.lifecycleErrorHint:void 0,S=co(f),new L(R(g),v,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...S,hint:y??function(e,t={}){return`${ci(t)}The runner is still reachable and reports "${e}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`}(p.command,S),logPath:m.logPath,transportError:f.message},f))}:"accepted"===s||"started"===s?{type:"skipInvalidation",reason:"command_still_in_flight",lifecycleState:s,error:function(e,t,r,n){if(lc(t.command))return r;let i=co(r);return new L("COMMAND_FAILED",`Runner command "${t.command}" is still ${e} after the transport response was lost.`,{command:t.command,commandId:t.commandId,lifecycleState:e,recovery:"command_still_in_flight",...i,hint:function(e,t,r={}){return`${ci(r)}The runner is still reachable and reports "${e}" is ${t}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`}(t.command,e,i),logPath:n.logPath,transportError:r.message},r)}(s,l,d,c)}:{type:"retainInvalidation",reason:s?"unknown_lifecycle_state":"missing_lifecycle_state",lifecycleState:s,error:new L("COMMAND_FAILED",`Runner command "${l.command}" lost its transport response and lifecycle status was ${s?`"${s}"`:"missing"}, so agent-device invalidated the runner session instead of replaying the command.`,{command:l.command,commandId:l.commandId,lifecycleState:s,recovery:"lifecycle_state_not_recoverable",hint:(h=l.command,`The runner did not confirm that "${h}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`),logPath:c.logPath,transportError:d.message},d)}}function ci(e){return!0!==e.readinessPreflightSkipped?"":"This hot command skipped the uptime preflight because the runner had just responded; status recovery confirmed the runner still observed it. "}function ca(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;N({level:"retained"===i?"warn":"debug",phase:"ios_runner_command_invalidation_decision",data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:void 0!==o,sessionId:r.sessionId,transportError:n.message}})}function co(e){let t,r,n,i={},a="boolean"==typeof(t=e.details?.runnerReadinessPreflightSkipped)?t:void 0;void 0!==a&&(i.readinessPreflightSkipped=a);let o="string"==typeof(r=e.details?.runnerReadinessPreflightSkipReason)?r:void 0;void 0!==o&&(i.readinessPreflightSkipReason=o);let s="number"==typeof(n=e.details?.runnerReadinessPreflightSkippedAgeMs)?n:void 0;return void 0!==s&&(i.readinessPreflightSkippedAgeMs=s),i}let cs=new WeakMap;async function cl(e){var t,r;let n,i,a,{sessionStore:o,leaseRegistry:s}=e,l=(n={...(t=function(e){let t=W(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=B(r);if(r&&!n)throw new L("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new L("INVALID_ARGS","session isolation mode tenant requires --tenant (or meta.tenantId).");let i=e.session||"default";return i.startsWith(`${n}:`)?{...e,meta:{...e.meta,tenantId:n,sessionIsolation:t}}:{...e,session:`${n}:${i}`,meta:{...e.meta,tenantId:n,sessionIsolation:t}}}(e.req)).flags??{}},((i=td(t.command,n))||!t.flags)&&i?{...t,flags:n}:t);N({level:"info",phase:"request_start",data:{session:l.session,command:l.command,tenant:l.meta?.tenantId,isolation:l.meta?.sessionIsolation}});let d=l.command;!function(e,t){if(s3.has(e.command)||e.meta?.sessionIsolation!=="tenant")return;let r=s1(e);t.assertLeaseAdmission({tenantId:r.tenantId,runId:r.runId,leaseId:r.leaseId,backend:r.leaseBackend})}(l,s);let c=function(e){var t,r;let n=e.session||sX;if(function(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return"string"==typeof t&&t.trim().length>0}(e))return n;let i=sY(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(l),u=s4.has(d)?[]:await s7({req:l,sessionName:c,sessionStore:o}),p=(r=s,(a=cs.get(r))||(a=new Map,cs.set(r,a)),a);return{req:l,command:d,sessionName:c,throwIfCanceled:()=>t9(l.meta?.requestId),runLocked:async e=>(t9(l.meta?.requestId),0===u.length)?await e():await cd(p,u,async()=>(t9(l.meta?.requestId),await e()))}}async function cd(e,t,r){let[n,...i]=t;return n?await sH(e,n,async()=>await cd(e,i,r)):await r()}function cc(e){var t,r,i;let a,{scope:o,logPath:s,sessionStore:l,trackDownloadableArtifact:d}=e;o.throwIfCanceled();let c=l.get(o.sessionName);c&&(!function(e){var t;let r;if(!((r=(t=e).recording)&&"ios"===t.device.platform&&"ios"!==r.platform&&!1!==r.showTouches))return;let n=e.recording,i=dq(e.device.id);if(!n.runnerSessionId){i?.alive&&(n.runnerSessionId=i.sessionId);return}if(!i?.alive){n.invalidatedReason??="iOS runner session exited during recording";return}i.sessionId!==n.runnerSessionId&&(n.invalidatedReason??="iOS runner session restarted during recording")}(c),l.set(o.sessionName,c));let u=(a=(t={req:o.req,sessionName:o.sessionName,sessionStore:l}).sessionStore.get(t.sessionName),{req:s8(t.req,a),existingSession:a}),p=u.req;c=u.existingSession;let f=e=>(function(e,t,r){let i=b();if(!t.ok){N({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=A({force:!0})??void 0;return{ok:!1,error:T(new L(R(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??("string"==typeof t.error.details?.hint?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath}),{diagnosticId:i.diagnosticId,logPath:e})}}return N({level:"info",phase:"request_success"}),A(),{ok:!0,data:function(e,t,r){var i,a;let o;if(!t)return t;let s=(i=e,o=Array.isArray((a=t).artifacts)?[...a.artifacts]:[],"screenshot"!==i.command||o.some(e=>e?.field==="path")||"string"!=typeof a.path||o.push({field:"path",path:a.path,localPath:i.meta?.clientArtifactPaths?.path,fileName:n.basename(i.meta?.clientArtifactPaths?.path??a.path)}),o.filter(e=>!!(e&&"string"==typeof e.field&&"string"==typeof e.path&&"string"==typeof e.localPath&&e.localPath.length>0)));return 0===s.length?t:{...t,artifacts:s.map(t=>{let n=t.path;return{field:t.field,artifactId:r({artifactPath:n,tenantId:e.meta?.tenantId,fileName:t.fileName}),fileName:t.fileName,localPath:t.localPath}})}}(e,t.data,r)}})(p,e,d);if(c?.recording?.invalidatedReason&&"record"!==(r=o.command)&&"close"!==r)return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:c.recording.invalidatedReason}})};!c||p.meta?.lockPolicy||(i=o.command,s2.has(i))||function(e,t){let r=sz(e,t);if(0!==r.length)throw new L("INVALID_ARGS",`Session "${e.name}" is already bound to ${sK(e)}, but this request selected ${r.map(sJ).join(", ")}.`,{session:e.name,conflicts:r.map(sJ),hint:sW(e,"selector-conflict")})}(c,p.flags);let m=(e,t,r)=>{let n;return{...ad(s,e,t,r,n=b().requestId),requestId:n}};return{type:"scope",scope:{req:p,sessionName:o.sessionName,existingSession:c,finalize:f,contextFromFlags:m,handlerContextFromFlags:(e,t,r)=>({...m(e,t,r),surface:l.get(o.sessionName)?.surface})}}}async function cu(e){let{lockedScope:t,logPath:r,sessionStore:n}=e,i=n.get(t.sessionName);if(!i)return t.finalize({ok:!1,error:{code:"SESSION_NOT_FOUND",message:"No active session. Run open first."}});let a=await sI({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function cp(e){N({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=b(),r=A({force:!0})??void 0;return{ok:!1,error:T(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function cf(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function cm(e,t){let r=t.includeTokens?.filter(e=>e.length>0)??[],n="",i=n=>{(!(r.length>0)||r.some(e=>n.includes(e)))&&e.write(function(e,t){if(0===t.length)return e;let r=e;for(let e of t)r=r.replace(e,"[REDACTED]");return r}(n,t.redactionPatterns))};return{onChunk:e=>{let t=`${n}${e}`.split("\n");for(let e of(n=t.pop()??"",t))i(`${e}
14
- `)},flush:()=>{n&&(i(n),n="")}}}function ch(e,t,r){let n=e.stdout,i=e.stderr;return n&&i?(n.setEncoding("utf8"),i.setEncoding("utf8"),n.on("data",r.writer.onChunk),i.on("data",r.writer.onChunk),t.on("error",()=>{e.killed||e.kill("SIGKILL")}),e.on("error",()=>t.destroy()),new Promise(n=>{e.on("close",e=>{r.writer.flush(),r.endStreamOnClose&&t.end(),n({stdout:"",stderr:"",exitCode:e??1})})})):Promise.resolve({stdout:"",stderr:"missing stdio pipes",exitCode:1})}function cw(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new L("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function cg(e,t){let r=(await e7(ed(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function cv(e,t){var r,n;let i;cw(t);let a=await cg(e,t),o=e7(ed(e)),s=await em(o,{lines:4e3,timeoutMs:3e3}).catch(()=>"");if(0===s.trim().length)return null;let l=function(e,t,r){let n=new Set;for(let i of(r&&n.add(r),e.split("\n")))if(i.includes(t))for(let e of function(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=[RegExp(`\\bStart proc\\s+(\\d+):${r}(?:\\b|/)`,"i"),RegExp(`\\b(\\d+):${r}(?:\\b|/)`,"i"),RegExp(`${r}.*?\\bpid\\s*[=:]?\\s*(\\d+)\\b`,"i"),RegExp(`\\bpid\\s*[=:]?\\s*(\\d+)\\b.*${r}`,"i")],i=[];for(let t of n){let r=t.exec(e),n=r?.[1];n&&/^\d+$/.test(n)&&i.push(n)}return i}(i,t))n.add(e);return[...n]}(s,t,a);if(0===l.length)return null;let d=(r=s,n=t,i=new Set(l),r.split("\n").filter(e=>{var t;let r;if(!e.trim())return!1;if(e.includes(n))return!0;let a=(t=e,r=/\(\s*(\d+)\)\s*:/.exec(t),r?.[1]??null);return!!a&&i.has(a)}).join("\n"));return 0===d.trim().length?null:{pid:a,text:d,recoveredPids:l}}async function cy(e,t,r,n,i){let a,o,s="recovering",l=!1,d=(async()=>{try{for(;!l;){let d=await cg(e,t);if(!d){s="recovering",await eV(1e3);continue}let c=e9(ed(e)),u=es(c,{pid:d});a=u;let p=cm(r,{redactionPatterns:n});if(o=ch(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&tJ(i,u.pid),s="active",await o,tX(i),a=void 0,o=void 0,l)break;s="recovering",await eV(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),tX(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:d,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await cf(o),a&&!a.killed&&a.kill("SIGKILL"),await cf(d),tX(i)}}}function cS(e,t){let r=cb(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=cb(t);n.push(`process == "${e}"`,`processImagePath ENDSWITH[c] "/${e}"`,`senderImagePath ENDSWITH[c] "/${e}"`,`processImagePath CONTAINS[c] "/${e}.app/"`,`senderImagePath CONTAINS[c] "/${e}.app/"`)}return n.join(" OR ")}async function c_(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=lr(["spawn",t,"log","show","--style","compact","--info","--predicate",cS(r,n)],{simulatorSetPath:a});"number"==typeof i&&Number.isFinite(i)&&i>0?o.push("--start",`@${Math.floor(i/1e3)}`):o.push("--last","5m");let s=await i_(o,{allowFailure:!0,timeoutMs:4e3});if(0!==s.exitCode||0===s.stdout.trim().length)return null;let l=s.stdout.split("\n").map(e=>e.trimEnd()).filter(e=>{let t=e.trim();return t.length>0&&!t.startsWith("Timestamp Ty Process[PID:TID]")});return 0===l.length?null:{text:`${l.join("\n")}
15
- `,recoveredLineCount:l.length}}async function cI(e,t,r,n,i,a){let o=await cA({deviceId:e,appBundleId:t,simulatorSetPath:i});return cM({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return lr(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",cS(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function cb(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function cA(e){let{deviceId:t,appBundleId:r,simulatorSetPath:i}=e,a=await i_(lr(["get_app_container",t,r,"app"],{simulatorSetPath:i}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=n.join(o,"Info.plist"),l=await U("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function cx(e,t,r,n){return cM({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",cS(e)],stream:t,redactionPatterns:r,pidPath:n})}async function cN(e,t,r,n){return cM({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function cM(e){let t="active",r=$(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=cm(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&tJ(e.pidPath,n.pid);let a=ch(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),tX(e.pidPath),r),r=>{throw t="failed",tX(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await cf(a),n.killed||n.kill("SIGKILL"),await cf(a),tX(e.pidPath)}}}let cE=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),cD=/https?:\/\/[^\s"'<>\])]+/i,ck=[/\bstatus(?:Code)?["'=: ]+([1-5]\d{2})\b/i,/\bresponse(?:\s+code)?["'=: ]+([1-5]\d{2})\b/i,/\bHTTP\/[0-9.]+\s+([1-5]\d{2})\b/i];function cP(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>cR(e)));for(let e of t.entries){let t=cR(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function cC(e,t){let r=cV(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=cV(t?.maxPayloadChars,2048,64,16384),o=cV(t?.maxScanLines,4e3,100,2e4),s=e.split("\n"),l=Math.max(0,s.length-o),d=s.slice(l),c=[];for(let e=d.length-1;e>=0&&c.length<r;e-=1){let t=d[e];if(!t?.trim())continue;let r=function(e,t,r,n,i,a){let o=e[t]?.trim();if(!o)return null;let s=function(e){let t=e.indexOf("{");if(t<0)return null;let r=e.lastIndexOf("}");if(r<=t)return null;let n=e.slice(t,r+1);try{let e=JSON.parse(n);return e&&"object"==typeof e?e:null}catch{return null}}(o),l=cU(s,["method","httpMethod"]),d=cU(s,["url","requestUrl"]),c=function(e,t){if(!e)return null;for(let r of t){let t=e[r];if("number"==typeof t&&Number.isInteger(t))return t;if("string"==typeof t&&/^\d{3}$/.test(t.trim()))return Number.parseInt(t.trim(),10)}return null}(s,["status","statusCode","responseCode"]),u=cE.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=cD.exec(o),h=d??m?.[0];if(!h)return null;let w=c??cT(o)??void 0;if(!(l||p?.[1]||u?.[1]||void 0!==w||/\bURL["'=: ]+https?:\/\//i.test(o)||/\bheaders?["'=: ]+/i.test(o)||/\b(?:requestBody|responseBody|payload|request|response)["'=: ]+/i.test(o)))return null;let g={method:f,url:h,status:w,timestamp:cL(o),packetId:c$(o)??void 0,durationMs:cF(o)??void 0,raw:cj(o,a),line:r};if("android"===n&&function(e,t,r){let n=cO(t,r,5),i=e.packetId??n.map(e=>c$(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?cO(t,r,12).filter(e=>c$(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>cL(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>cT(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>cF(e)).find(e=>"number"==typeof e))}(g,e,t),"headers"===i||"all"===i){let e=function(e,t){if(t){let e=t.headers??t.requestHeaders??t.responseHeaders;if(void 0!==e)return cq(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=cj(e,a))}if("body"===i||"all"===i){let e=cG(o,s,["requestBody","body","payload","request"]),t=cG(o,s,["responseBody","response"]);e&&(g.requestBody=cj(e,a)),t&&(g.responseBody=cj(t,a))}return g}(d,e,l+e+1,n,i,a);r&&c.push(r)}return{path:t?.path??"<memory>",exists:!0,scannedLines:d.length,matchedLines:c.length,entries:c,include:i,limits:{maxEntries:r,maxPayloadChars:a,maxScanLines:o}}}function cR(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function cO(e,t,r){let n=[],i=Math.max(0,t-r),a=Math.min(e.length-1,t+r);for(let t=i;t<=a;t+=1){let r=e[t]?.trim();r&&n.push(r)}return n}function cT(e){for(let t of ck){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function cL(e){let t=/\b\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z)?\b/.exec(e);if(t)return t[0];let r=/\b\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\b/.exec(e);return r?.[0]}function c$(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function cF(e){let t=/\b(?:duration|elapsed request\/response time, ms)[:= ]+(\d+)\b/i.exec(e);if(!t)return null;let r=Number.parseInt(t[1]??"",10);return Number.isInteger(r)?r:null}function cU(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.trim().length>0)return t.trim()}}function cG(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return cq(t[e])}for(let t of r){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=RegExp(`\\b${r}["'=: ]+(.+)$`,"i").exec(e);if(n?.[1])return n[1].trim()}}function cq(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function cj(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function cV(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let cB={start:async e=>await cQ(e)},cH=is(cB,function(e={}){return{...cB,...e}});async function cK(e,t){return await cH.run(e,t)}function cW(e,t){let r=process.env[e];if(!r)return t;let n=Number.parseInt(r,10);return Number.isInteger(n)&&n>0?n:t}function cz(e){let t=n.dirname(e);i.existsSync(t)||i.mkdirSync(t,{recursive:!0}),function(e,t){if(i.existsSync(e)&&!(i.statSync(e).size<t.maxBytes))for(let r=t.maxRotatedFiles;r>=1;r-=1){let t=1===r?e:`${e}.${r-1}`,n=`${e}.${r}`;i.existsSync(t)&&(i.existsSync(n)&&i.unlinkSync(n),i.renameSync(t,n))}}(e,{maxBytes:cW("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:cW("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function cJ(e){if(!i.existsSync(e))return{exists:!1,sizeBytes:0};let t=i.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}async function cX(e){var t,r,n,a;let o,s,l,d,{device:c,appBundleId:u,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v}=e,y="macos"===c.platform?"macos":"ios"===c.platform?"device"===c.kind?"ios-device":"ios-simulator":"android",S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},o=cV(t?.maxEntries,25,1,200),s=t?.include??"summary",l=cV(t?.maxPayloadChars,2048,64,16384),d=cV(t?.maxScanLines,4e3,100,2e4),i.existsSync(m)?cC(i.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:o,maxPayloadChars:l,maxScanLines:d}}),_=[],I=await cZ({device:c,appBundleId:u,appLogPath:m,appLogState:p});if(I){let e=await cv(c.id,u);if(e){let t=cC(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=cP(t,S,h),_.push((r=I,n=e.recoveredPids,"stale-active"===r.reason?`Session app log stream was still bound to prior Android PID ${r.trackedPid}. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`:`Session app log stream was inactive. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`)))}}if("ios"===c.platform&&"simulator"===c.kind&&u&&0===S.entries.length){let e=await c0({deviceId:c.id,appBundleId:u,startedAt:f,simulatorSetPath:c.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});e&&(e.dump.entries.length>0?(S=cP(e.dump,S,h),_.push(`Recovered ${e.dump.entries.length} iOS simulator HTTP entr${1===e.dump.entries.length?"y":"ies"} from simctl log show (${e.recoveredLineCount} app log lines scanned).`)):e.recoveredLineCount>0&&_.push(`Recovered ${e.recoveredLineCount} recent iOS simulator app log lines from simctl log show, but none looked like HTTP traffic. This app may not emit request URLs, status, or timing into Unified Logging for this repro window.`))}return void 0===p?_.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===_.length&&("ios"===c.platform&&"simulator"===c.kind?_.push("Session app log stream is inactive. The iOS simulator recovery path scanned recent simctl log history, but a fresh logs clear --restart window is still the most reliable repro loop."):_.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===S.entries.length&&_.push("ios"===(a=c).platform&&"simulator"===a.kind?"No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.":"ios"===a.platform?"No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.":"No HTTP(s) entries were found in recent session app logs."),{backend:y,dump:S,notes:_}}async function cZ(e){let{device:t,appBundleId:r,appLogPath:a,appLogState:o}=e;if("android"!==t.platform||!r)return null;if(void 0!==o&&"active"!==o)return{reason:"inactive"};if("active"!==o)return null;let s=function(e){let t=function(e){if(!e||!i.existsSync(e))return null;try{return tz(i.readFileSync(e,"utf8"))}catch{return null}}(e)?.command;if(!t)return null;let r=/(?:^|\s)--pid\s+(\d+)(?:\s|$)/.exec(t);return r?.[1]??null}(n.join(n.dirname(a),tW));if(!s)return null;let l=await cg(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function cY(e,t,r,n){return await cH.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function cQ({device:e,appBundleId:t,outPath:r,pidPath:n}){cz(r);let a=i.createWriteStream(r,{flags:"a"}),o=function(){let e=process.env.AGENT_DEVICE_APP_LOG_REDACT_PATTERNS;if(!e)return[];let t=e.split(",").map(e=>e.trim()).filter(e=>e.length>0),r=[];for(let e of t)try{r.push(RegExp(e,"gi"))}catch{}return r}();if("ios"===e.platform)return"device"===e.kind?await cN(e.id,a,o,n):await cI(e.id,t,a,o,e.simulatorSetPath,n);if("android"===e.platform)return cw(t),await cy(e.id,t,a,o,n);if("macos"===e.platform)return await cx(t,a,o,n);throw a.end(),new L("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function c0(e){let t=await c_({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:cC(t.text,{path:`${e.appLogPath} (simctl log show recovery)`,backend:"ios-simulator",maxEntries:e.maxEntries,include:e.include,maxPayloadChars:e.maxPayloadChars,maxScanLines:e.maxScanLines}),recoveredLineCount:t.recoveredLineCount}:null}async function c1(e){await e.stop(),await cf(e.wait)}async function c2(e,t){let r={},n=[];if(t||n.push("No app bundle is tracked in this session. Run open <app> first for app-scoped logs."),"android"===e.platform){try{let t=await Q(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await Q(e,["shell","pidof",t],{allowFailure:!0,timeoutMs:1e3})).stdout.trim().length>0}catch{r.androidPidVisible=!1}}if("ios"===e.platform&&"simulator"===e.kind)try{let e=await i_(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await i_(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await U("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function c3(e,t){cz(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
16
- `;i.appendFileSync(e,r,"utf8")}function c4(e){let t=n.dirname(e),r=n.basename(e);i.existsSync(t)||i.mkdirSync(t,{recursive:!0}),i.existsSync(e)?i.truncateSync(e,0):i.writeFileSync(e,"","utf8");let a=0;for(let e of i.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let o=e.slice(r.length+1);if(/^\d+$/.test(o))try{i.unlinkSync(n.join(t,e)),a+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:a}}function c5(e,t){if("simulator"!==e.kind)throw new L("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function c8(){await iS("open",["-a","Simulator"],{allowFailure:!0,timeoutMs:1e4})}async function c6(e){let t,r;if("simulator"!==e.kind||"Booted"===await c7(e))return;let n=en.fromTimeoutMs(18e4);try{await eu(async({deadline:n})=>{if(n?.isExpired())throw new L("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:18e4});let i=Math.max(1e3,n?.remainingMs()??18e4),a=await i_(ln(e,["boot",e.id]),{allowFailure:!0,timeoutMs:i});t={stdout:String(a.stdout??""),stderr:String(a.stderr??""),exitCode:a.exitCode};let o=`${t.stdout}
17
- ${t.stderr}`.toLowerCase(),s=o.includes("already booted")||o.includes("current state: booted");if(0!==t.exitCode&&!s)throw new L("COMMAND_FAILED","simctl boot failed",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let l=await i_(ln(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:i});if(r={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==r.exitCode)throw new L("COMMAND_FAILED","simctl bootstatus failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let d=await c7(e);if("Booted"!==d)throw new L("COMMAND_FAILED","Simulator is still booting",{state:d})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let n=eo({error:e,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});return"IOS_BOOT_TIMEOUT"!==n&&"CI_RESOURCE_STARVATION_SUSPECTED"!==n}},{deadline:n,phase:"boot",classifyReason:e=>eo({error:e,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(a){let i=eo({error:a,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});throw new L("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:18e4,elapsedMs:n.elapsedMs(),reason:i,hint:el(i),boot:t,bootstatus:r})}await c8()}async function c9(e){let t=ln(e,["shutdown",e.id]),r=await i_(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===r.exitCode,exitCode:r.exitCode,stdout:String(r.stdout??""),stderr:String(r.stderr??"")}}async function c7(e){let t="string"==typeof e?e:e.id,r="string"==typeof e?lr(["list","devices","-j"]):ln(e,["list","devices","-j"]),n=await i_(r,{allowFailure:!0,timeoutMs:6e4});if(0!==n.exitCode)return null;try{let e=JSON.parse(String(n.stdout??""));for(let r of Object.values(e.devices??{})){let e=r.find(e=>e.udid===t);if(e)return e.state}return null}catch{return null}}let ue="shared_prefs/ReactNativeDevPrefs.xml",ut="debug_http_host",ur="dev_server_https",un="RCT_jsLocation",ui="RCT_packager_scheme",ua="React Native runtime hints require adb run-as access to the app sandbox. Verify the app is debuggable and the selected package/device are correct.",uo='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function us(e){return void 0!==D(e)}async function ul(e){let{device:t,appId:r,runtime:n}=e;if(!r)return;let i=D(n);if(i){if("android"===t.platform)return void await uc(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await um(t,r,i)}}async function ud(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await uu(t,r);"ios"===t.platform&&"simulator"===t.kind&&await uh(t,r)}}async function uc(e,t,r){var n,i,a,o,s,l;let d,c;uy(t);let u=(n=await up(e,t),i=ut,a=`${r.host}:${r.port}`,d=` <string name="${uS(i)}">${uS(a)}</string>`,ug(uv(n,i),d));o=u,s=ur,l="https"===r.scheme,c=` <boolean name="${uS(s)}" value="${l?"true":"false"}" />`,u=ug(uv(o,s),c),await uf(e,t,u)}async function uu(e,t){uy(t);let r=await up(e,t),n=uv(r,ut),i=uv(n,ur);i!==r&&await uf(e,t,i)}async function up(e,t){let r=await Q(e,["shell","run-as",t,"cat",ue],{allowFailure:!0});return 0!==r.exitCode?uo:uw(r.stdout)}async function uf(e,t,r){let n=["shell","run-as",t,"id"],i=await Q(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=u_(i.stdout,i.stderr);throw new L("COMMAND_FAILED",e?`Failed to access Android app sandbox for ${t}`:`Failed to probe Android app sandbox for ${t}`,{package:t,cmd:"adb",args:n,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,hint:e?ua:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await Q(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await Q(e,["shell","run-as",t,"tee",ue],{stdin:r.trimEnd()})}catch(n){let e=O(n);if("TOOL_MISSING"===e.code)throw e;let r=u_("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new L("COMMAND_FAILED",r?`Failed to access Android app sandbox for ${t}`:`Failed to write Android runtime hints for ${t}`,{...e.details??{},package:t,cmd:"adb",phase:"write-runtime-hints",hint:r?ua:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function um(e,t,r){await i_(ln(e,["spawn",e.id,"defaults","write",t,un,"-string",`${r.host}:${r.port}`])),await i_(ln(e,["spawn",e.id,"defaults","write",t,ui,"-string",r.scheme]))}async function uh(e,t){await i_(ln(e,["spawn",e.id,"defaults","delete",t,un]),{allowFailure:!0}),await i_(ln(e,["spawn",e.id,"defaults","delete",t,ui]),{allowFailure:!0})}function uw(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
18
- `:uo}function ug(e,t){return uw(e).replace("</map>",`${t}
19
- </map>`)}function uv(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return uw(e).replace(RegExp(`^\\s*<string name="${r}">[\\s\\S]*?<\\/string>\\n?`,"m"),"").replace(RegExp(`^\\s*<boolean name="${r}" value="(?:true|false)"\\s*\\/?>\\n?`,"m"),"")}function uy(e){if("binary"!==ef(e))return;let t=eg(e);throw new L("INVALID_ARGS",t,{package:e,hint:t})}function uS(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function u_(e,t){let r=`${e}
20
- ${t}`.toLowerCase();return["run-as: package not debuggable","run-as: permission denied","run-as: package is unknown","run-as: unknown package","is unknown","is not an application","could not set capabilities"].some(e=>r.includes(e))}let uI=new Map;async function ub(e){let r=await h.mkdtemp(n.join(c.tmpdir(),"agent-device-materialized-"));try{let i=await uN(e.installablePath,n.join(r,"installable")),a=e.archivePath?await uN(e.archivePath,n.join(r,"archive")):void 0,o=t.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{uA(o)},s);return uI.set(o,{rootPath:r,installablePath:i,archivePath:a,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:d}),{materializationId:o,installablePath:i,...a?{archivePath:a}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await h.rm(r,{recursive:!0,force:!0}),e}}async function uA(e,t){let r=uI.get(e);if(!r)throw new L("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new L("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),uI.delete(e),await h.rm(r.rootPath,{recursive:!0,force:!0})}async function ux(e){let t=Array.from(uI.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await uA(e)}))}async function uN(e,t){let r=await h.stat(e);await h.mkdir(t,{recursive:!0});let i=n.join(t,n.basename(e));return r.isDirectory()?await h.cp(e,i,{recursive:!0}):await h.copyFile(e,i),i}async function uM(e,t){let r=["devicectl",...e],n=await i_(r,{allowFailure:!0,timeoutMs:2e4});if(0===n.exitCode)return;let i=String(n.stdout??""),a=String(n.stderr??"");throw new L("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:r,exitCode:n.exitCode,stdout:i,stderr:a,deviceId:t.deviceId,hint:uC(i,a)??uP})}async function uE(e,t){var r;return r=function(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.bundleIdentifier?e.bundleIdentifier.trim():"";if(!t)continue;let n="string"==typeof e.name&&e.name.trim().length>0?e.name.trim():t,i="string"==typeof e.url&&e.url.trim().length>0?e.url.trim():void 0;r.push({bundleId:t,name:n,url:i})}return r}(await uk(e,{jsonPrefix:"agent-device-ios-apps",args:["devicectl","device","info","apps","--device",e.id,"--include-all-apps"],failureMessage:"Failed to list iOS apps",parseFailureMessage:"Failed to parse iOS apps list"})),il(r,t)}async function uD(e){return function(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.executable?e.executable.trim():"",n="number"==typeof e.processIdentifier&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;t&&Number.isFinite(n)&&r.push({executable:t,pid:n})}return r}(await uk(e,{jsonPrefix:"agent-device-ios-processes",args:["devicectl","device","info","processes","--device",e.id],failureMessage:"Failed to list iOS processes",parseFailureMessage:"Failed to parse iOS process list"}))}async function uk(e,t){let r=n.join(c.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),i=[...t.args,"--json-output",r],a=await i_(i,{allowFailure:!0,timeoutMs:2e4});try{if(0!==a.exitCode){let r=String(a.stdout??""),n=String(a.stderr??"");throw new L("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:i,exitCode:a.exitCode,stdout:r,stderr:n,deviceId:e.id,hint:uC(r,n)??uP})}return JSON.parse(await o.readFile(r,"utf8"))}catch(r){if(r instanceof L)throw r;throw new L("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await o.unlink(r).catch(()=>{})}}let uP="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function uC(e,t){let r=`${e}
21
- ${t}`.toLowerCase();return r.includes("device is busy")&&r.includes("connecting")?"iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.":r.includes("coredeviceservice")&&r.includes("timed out")?"CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.":null}let uR=new Map;async function uO(e){var t;let r,n=(r="simulator"===(t=e).kind?t.simulatorSetPath??"":"",JSON.stringify([t.platform,t.kind,t.id,t.target??"",r])),i=uR.get(n);if(void 0!==i){if(i>Date.now())return;uR.delete(n)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:t}=await Promise.resolve(tm);await t(e),uT(n);return}if("device"===e.kind){await uL(e.id),uT(n);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./8806.js");await t(e.id),uT(n)}}function uT(e){uR.set(e,Date.now()+5e3)}async function uL(e){let t=n.join(c.tmpdir(),`agent-device-ready-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),r=Math.max(1,Math.ceil(15));try{let n=await i_(["devicectl","device","info","details","--device",e,"--json-output",t,"--timeout",String(r)],{allowFailure:!0,timeoutMs:18e3}),i=String(n.stdout??""),a=String(n.stderr??""),o=await u$(t);if(0===n.exitCode){if(!o.parsed)throw new L("COMMAND_FAILED","iOS device readiness probe failed",{kind:"probe_inconclusive",deviceId:e,stdout:i,stderr:a,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 L("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 L("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:e,stdout:i,stderr:a,exitCode:n.exitCode,tunnelState:o?.tunnelState,hint:uF(i,a)})}catch(t){if(t instanceof L&&"COMMAND_FAILED"===t.code){if("not_ready"===("string"==typeof t.details?.kind?t.details.kind:""))throw t;let r=t.details??{},n=String(r.stdout??""),i=String(r.stderr??""),a=Number(r.timeoutMs??15e3),o=`CoreDevice did not respond within ${a}ms. Keep the device unlocked and trusted, then retry; if it persists restart Xcode and the iOS device.`;throw new L("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:a,stdout:n,stderr:i,hint:n||i?uF(n,i):o},t)}throw new L("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 o.rm(t,{force:!0}).catch(()=>{})}}async function u$(e){try{let t=await o.readFile(e,"utf8"),r=JSON.parse(t),n=function(e){let t=e?.result;if(!t||"object"!=typeof t)return{};let r=t.connectionProperties?.tunnelState,n=t.device?.connectionProperties?.tunnelState,i="string"==typeof r?r:"string"==typeof n?n:void 0;return i?{tunnelState:i}:{}}(r);return{parsed:!0,tunnelState:n.tunnelState}}catch{return{parsed:!1}}}function uF(e,t){let r=uC(e,t);return r||(`${e}
22
- ${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":uP)}let uU=300,uG=300;function uq(e,t,r){return t||r9(r,r5)?null:aS("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function uj(e){return"string"==typeof e?.session&&e.session.trim().length>0}function uV(e){return"ios"===e.platform&&"simulator"===e.kind}async function uB(e,t){uV(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function uH(e){let t=r9(e.flags,r5)||!e.session?await rZ(e.flags??{}):await uK(e.session.device);return!1!==e.ensureReady&&await uO(t),t}async function uK(e){if("ios"!==e.platform||"simulator"!==e.kind||"darwin"!==process.platform)return e;let t={platform:"ios",target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await rZ(t)}catch(e){if(!(e instanceof L)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await rZ({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function uW(e){let t=e.flags?.device?.trim();return t||(e.resolvedDevice?.platform==="android"&&"emulator"===e.resolvedDevice.kind?e.resolvedDevice.name:e.sessionDevice?.platform==="android"&&"emulator"===e.sessionDevice.kind?e.sessionDevice.name:void 0)}function uz(e,t){return!!t&&0===sz(t,e).length}async function uJ(e){let t=await Q(e,["emu","kill"],{allowFailure:!0,timeoutMs:15e3});return{success:0===t.exitCode,exitCode:t.exitCode,stdout:String(t.stdout??""),stderr:String(t.stderr??"")}}async function uX(e){let{device:t,shutdownRequested:r}=e;if(r&&(uV(t)||"android"===t.platform&&"emulator"===t.kind))try{return uV(t)?await c9(t):await uJ(t)}catch(t){let e=T(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function uZ(e){if(await dB(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await iq("dismiss",t).catch(t=>{N({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function uY(e,t){e.appLog&&await c1(e.appLog),rq(e.device.platform)&&await uZ(e),await ux(t).catch(()=>{})}async function uQ(e){let t,{req:r,sessionName:n,logPath:i,sessionStore:a}=e,o=a.get(n);if(!o)return await u0(r,i);o.appLog&&await c1(o.appLog),r.positionals&&r.positionals.length>0&&(rq(o.device.platform)&&await uZ(o),await nz(o.device,"close",r.positionals,r.flags?.out,{...ad(i,r.flags,o.appBundleId,o.trace?.outPath)}),await uB(o.device,uU)),rq(o.device.platform)&&(t=(r.positionals?.length??0)>0,!uV(o.device)||t||r.flags?.shutdown||o.recording)?await uZ(o):rq(o.device.platform)&&N({level:"debug",phase:"ios_runner_retained_after_close",data:{session:o.name,deviceId:o.device.id}}),us(a.getRuntimeHints(n))&&o.appBundleId&&await ud({device:o.device,appId:o.appBundleId}).catch(()=>{}),a.recordAction(o,{command:"close",positionals:r.positionals??[],flags:r.flags??{},result:{session:o.name,...eH(`Closed: ${o.name}`)}}),r.flags?.saveScript&&(o.recordSession=!0),a.writeSessionLog(o),await ux(n).catch(()=>{}),a.delete(n);let s=await uX({device:o.device,shutdownRequested:r.flags?.shutdown});return s?{ok:!0,data:eK({session:o.name,shutdown:s},`Closed: ${o.name}`)}:{ok:!0,data:{session:o.name,...eH(`Closed: ${o.name}`)}}}async function u0(e,t){if(!e.positionals||0===e.positionals.length)return aS("SESSION_NOT_FOUND","No active session");let r=await uH({session:void 0,flags:e.flags,ensureReady:!0});return await nz(r,"close",e.positionals,e.flags?.out,{...ad(t,e.flags)}),await uB(r,uU),{ok:!0,data:{app:e.positionals[0],...eH(`Closed: ${e.positionals[0]}`)}}}async function u1(e,t=5e3){await Promise.all(e.map(async e=>{let r;await new Promise(n=>{r=setTimeout(()=>{!function(e){e.destroyConnections?.();let t="closeAllConnections"in e?e.closeAllConnections:void 0;if("function"==typeof t)return t.call(e);let r="closeIdleConnections"in e?e.closeIdleConnections:void 0;"function"==typeof r&&r.call(e)}(e),n()},t);try{e.close(()=>n())}catch{n()}}),r&&clearTimeout(r)}))}function u2(e){i.existsSync(e)&&i.unlinkSync(e)}function u3(e){if(!i.existsSync(e))return null;try{let t=JSON.parse(i.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function u4(e){let t=u3(e);if(!t||t.pid===process.pid)try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}function u5(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function u8(e,t){return new Promise((r,n)=>{e.once("error",n),e.listen(0,"127.0.0.1",()=>{e.off("error",n);let i=e.address();"object"==typeof i&&i?.port?r(i.port):n(new L("COMMAND_FAILED",t))})})}(async function(e={}){let r,a,o=e.env??process.env,s=e.stdout??process.stdout,l=e.stderr??process.stderr,d=e.exit??(e=>process.exit(e)),{baseDir:c,infoPath:u,lockPath:p,logPath:f,sessionsDir:m}=K(o.AGENT_DEVICE_STATE_DIR),h=J(o.AGENT_DEVICE_DAEMON_SERVER_MODE);var g,v,y,S=m;if(i.existsSync(S))for(let e of i.readdirSync(S,{withFileTypes:!0})){if(!e.isDirectory())continue;let t=n.join(S,e.name,tW);if(i.existsSync(t))try{let e=tz(i.readFileSync(t,"utf8"));if(e&&function(e){let t,r=M(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=E(e.pid);return!!n&&!!((t=n.toLowerCase().replaceAll("\\","/")).includes("log stream")||t.includes("logcat")||t.includes("devicectl device log stream"))&&(!e.command||n===e.command)}(e))try{process.kill(e.pid,"SIGTERM")}catch{}}catch{}finally{tX(t)}}let _=new tK(m),b=new rU({maxActiveSimulatorLeases:u5(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:u5(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:u5(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:u5(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),x=e8(),D=t.randomBytes(24).toString("hex"),k=M(process.pid)??void 0,C=X(),R=function(e){let{logPath:t,token:r,androidAdbProvider:n,appleRunnerProvider:i,appleToolProvider:a,linuxToolProvider:o,appLogProvider:s,recordingProvider:l,deviceInventoryProvider:d,trackDownloadableArtifact:c}=e,{sessionStore:u,leaseRegistry:p}=e;async function f(e){let m=!!(e.meta?.debug||e.flags?.verbose);return await I({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:m,logPath:t},async()=>{if(e.token!==r)return{ok:!1,error:T(new L("UNAUTHORIZED","Invalid token"))};try{return await r0(d,async()=>{let d=await cl({req:e,sessionStore:u,leaseRegistry:p});return await d.runLocked(async()=>{let e=cc({scope:d,logPath:t,sessionStore:u,trackDownloadableArtifact:c});if("response"===e.type)return e.response;let m=e.scope;return await ne({req:m.req,existingSession:m.existingSession,providers:{androidAdbProvider:n,appleRunnerProvider:i,appleToolProvider:a,linuxToolProvider:o,appLogProvider:s,recordingProvider:l}},async e=>{let n=await sO({req:m.req,sessionName:m.sessionName,logPath:t,sessionStore:u,leaseRegistry:p,invoke:f,invokeReplayAction:function(e){let{parentScope:t,providerScope:r,handleRequest:n,deps:i}=e;return async e=>{var a,o;if(a=e,o=t,!(a.session===o.sessionName&&ey.replayScopedAction.has(a.command)))return await n(e);if(e.token!==i.token)return{ok:!1,error:T(new L("UNAUTHORIZED","Invalid token"))};try{let a=await cl({req:e,sessionStore:i.sessionStore,leaseRegistry:i.leaseRegistry});if(a.sessionName!==t.sessionName)return await n(e);let o=cc({scope:a,logPath:i.logPath,sessionStore:i.sessionStore,trackDownloadableArtifact:i.trackDownloadableArtifact});if("response"===o.type)return o.response;let s=o.scope,l=await sO({req:s.req,sessionName:s.sessionName,logPath:i.logPath,sessionStore:i.sessionStore,leaseRegistry:i.leaseRegistry,invoke:n,androidAdbExecutor:r.androidAdbExecutor,contextFromFlags:s.handlerContextFromFlags});if(l)return s.finalize(l);return await cu({lockedScope:s,logPath:i.logPath,sessionStore:i.sessionStore})}catch(e){return cp(e)}}}({parentScope:m,providerScope:e,handleRequest:f,deps:{logPath:t,token:r,sessionStore:u,leaseRegistry:p,trackDownloadableArtifact:c}}),androidAdbExecutor:e.androidAdbExecutor,contextFromFlags:m.handlerContextFromFlags});return n?m.finalize(n):await cu({lockedScope:m,logPath:t,sessionStore:u})})})})}catch(e){return cp(e)}})}return f}({logPath:f,token:D,sessionStore:_,leaseRegistry:b,trackDownloadableArtifact:rt}),$=async e=>{await I({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{N({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),A({force:!0})})},F=async e=>{let t=uY(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
23
- `)});await Promise.race([t,eV(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
24
- `)})]),_.writeSessionLog(e),_.delete(e.name)},U=async()=>{let e=_.toArray();await Promise.all(e.map(F))},G=async()=>{let e,t,r=[];if("http"!==h){let t,n,i=(t=new Set,(n=w.createServer(e=>{t.add(e),e.on("close",()=>t.delete(e));let r="",n=0,i=new Set,a=!1,o=()=>{if(!a&&0!==n){for(let e of(a=!0,i))t3(e);N({level:"warn",phase:"request_client_disconnected",data:{inFlightRequests:n}}),(async()=>{try{let e=Date.now()+15e3;for(;n>0&&Date.now()<e;){let{abortAllIosRunnerSessions:e}=await Promise.resolve(tp);if(await e(),n<=0)break;await eV(200)}}catch(e){N({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e),inFlightRequests:n}})}})()}};e.setEncoding("utf8"),e.on("close",o),e.on("error",o),e.on("data",async t=>{let a=j(r,t);for(let t of(r=a.buffer,a.lines)){let r,a;n+=1;let o=!1;try{let n=JSON.parse(t);if(o=H(n),a=t1(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),t2(a),t5(a))throw t6();r=await rf(o?t=>{e.destroyed||e.write(Z(t))}:void 0,async()=>await R(n))}catch(e){r={ok:!1,error:T(e)}}finally{n-=1,a&&(i.delete(a),t4(a))}e.destroyed||e.write(o?V(r):`${JSON.stringify(r)}
25
- `)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await u8(i,"Failed to bind socket server")}if("socket"!==h){let e=await rP({handleRequest:R,token:D});r.push(e),t=await u8(e,"Failed to bind HTTP server")}return{servers:r,socketPort:e,httpPort:t}};if(!function(e,t,r){i.existsSync(e)||i.mkdirSync(e,{recursive:!0});let n=JSON.stringify(r,null,2),a=()=>{try{return i.writeFileSync(t,n,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(a())return!0;let o=u3(t);if(o?.pid&&o.pid!==process.pid&&P(o.pid,o.processStartTime))return!1;try{i.unlinkSync(t)}catch{}return a()}(c,p,{pid:process.pid,version:x,startedAt:Date.now(),processStartTime:k}))return l.write("Daemon lock is held by another process; exiting.\n"),d(0),null;let q=[];try{let e,t=await G();q=t.servers,r=t.socketPort,a=t.httpPort,g=r,v=a,y={socketPort:g,httpPort:v,token:D,version:x,codeSignature:C,processStartTime:k},i.existsSync(c)||i.mkdirSync(c,{recursive:!0}),i.writeFileSync(f,""),e=y.socketPort&&y.httpPort?"dual":y.httpPort?"http":"socket",i.writeFileSync(u,JSON.stringify({port:y.socketPort,httpPort:y.httpPort,transport:e,token:y.token,pid:process.pid,version:y.version,codeSignature:y.codeSignature,processStartTime:y.processStartTime,stateDir:c},null,2),{mode:384}),g&&s.write(`AGENT_DEVICE_DAEMON_PORT=${g}
10
+ ${r}`.toLowerCase()).includes("device is busy")&&n.includes("connecting")?"Target iOS device is still connecting. Keep it unlocked, wait for device trust/connection to settle, then retry.":`${ec("IOS_RUNNER_CONNECT_TIMEOUT")} ${lu}`)})}function lw(e){return"interactionFrame"===e||"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function lg(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${t.randomUUID()}`}}function lv(e){if(t8(e))throw t9()}let ly=new Map;async function lS(e,t,r,n,i=45e3,a,o){let s=ei.fromTimeoutMs(i),{getEndpoints:l}=lI(e,t),{endpoints:c}=await l(s.remainingMs()),d=null,u=Math.max(1,Math.ceil(i/250));try{return await ep(async({deadline:s})=>{if(s?.isExpired())throw new L("COMMAND_FAILED","Runner connection deadline exceeded",{port:t,timeoutMs:i});if(a&&null!==a.child.exitCode&&void 0!==a.child.exitCode)throw await lh({session:a,port:t,logPath:n});let u=!1;if("device"===e.kind){let e=await l(s?.remainingMs());c=e.endpoints,u=e.cached}let p=u?c[0]:null,f=await lb(c,{command:r,port:t,timeoutMs:i,signal:o,attemptDeadline:s,onError:(t,r)=>{var n;d=r,"device"===e.kind&&t===p&&(n=e.id,ly.delete(n))}});if(f)return f;if("device"===e.kind&&u){var m;m=e.id,ly.delete(m),c=(await l(s?.remainingMs(),!0)).endpoints;let n=await lb(c,{command:r,port:t,timeoutMs:i,signal:o,attemptDeadline:s,onError:(e,t)=>{d=t}});if(n)return n}if(o?.aborted)throw t9();throw new L("COMMAND_FAILED","Runner endpoint probe failed",{port:t,endpoints:c,lastError:d?String(d):void 0})},{maxAttempts:u,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:lf},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||re(e))throw t9();d||(d=e)}if(o?.aborted)throw t9();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw lm({port:t,endpoints:c,logPath:n,lastError:d});let a=await lM(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw lm({port:t,endpoints:c,logPath:n,lastError:d})}async function l_(e,t,r,n=45e3,i){if(i?.aborted)throw t9();let a=ei.fromTimeoutMs(n),{getEndpoints:o}=lI(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new L("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let c=a.remainingMs();if(c<=0)throw new L("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await lx(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},c,i)}function lI(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,c=await lA({device:e,timeoutBudgetMs:n,forceRefresh:i,requestTunnelIp:r,setRequestTunnelIp:e=>{r=e}});return{endpoints:(a=e,o=t,s=c.ip,l=[`http://127.0.0.1:${o}/command`],"device"!==a.kind||s&&l.unshift(`http://[${s}]:${o}/command`),l),cached:c.sharedCacheHit}}}}async function lb(e,t){let{command:r,port:n,timeoutMs:i,signal:a,attemptDeadline:o,onError:s}=t;for(let t of e)try{let e=o?.remainingMs()??i;if(e<=0)throw new L("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await lx(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||re(e))throw t9();s(t,e)}return null}async function lA(e){var t,r,n;let{device:i,timeoutBudgetMs:a,forceRefresh:o,requestTunnelIp:s,setRequestTunnelIp:l}=e;if("device"!==i.kind)return{ip:null,sharedCacheHit:!1};if(!o){let e,r=(t=i.id,(e=ly.get(t))?e.expiresAt<=Date.now()?(ly.delete(t),null):e.ip:null);if(r)return{ip:r,sharedCacheHit:!0};if(void 0!==s)return{ip:s,sharedCacheHit:!1}}let c=await lN(i.id,a);return l(c),c&&(r=i.id,n=c,ly.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:c,sharedCacheHit:!1}}async function lx(e,t,r,n){let i=AbortSignal.timeout(r),a=n?AbortSignal.any([n,i]):i;return await fetch(e,{...t,signal:a})}async function lN(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,a=n.join(d.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),n=await iI(["devicectl","device","info","details","--device",e,"--json-output",a,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==n.exitCode||!i.existsSync(a))return null;let o=JSON.parse(i.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{lC(a)}}async function lM(e,t,r,n,i){let a=JSON.stringify(r),o=lc(e,["spawn",e.id,"/usr/bin/curl","-s","-X","POST","-H","Content-Type: application/json","--data",a,`http://127.0.0.1:${t}/command`]),s=await iI(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=es({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new L("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:ec(e)})}return{status:200,body:l}}async function lD(){return await new Promise((e,t)=>{let r=w.createServer();r.listen(0,"127.0.0.1",()=>{let n=r.address();if("object"==typeof n&&n?.port){let t=n.port;r.close(()=>e(t))}else r.close(()=>t(new L("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function lE(e,t,r,n){t&&lP(t,e),r&&lP(r,e),n&&process.stderr.write(e)}let lk=new Map;function lP(e,t){let r=(lk.get(e)??Promise.resolve()).catch(()=>{}).then(()=>i.promises.appendFile(e,t)).catch(()=>{}).finally(()=>{lk.get(e)===r&&lk.delete(e)});lk.set(e,r)}function lC(e){try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}let lR=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function lO(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new L("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",xctestrunPath:r});let n=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of n)if(!i.existsSync(e))throw new L("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await lT(e)){await i_("codesign",["--remove-signature",e],{allowFailure:!0});try{await i_("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof L?n:new L("COMMAND_FAILED",String(n));throw new L("COMMAND_FAILED","Failed to repair macOS runner product signature",{reason:"RUNNER_PRODUCT_REPAIR_FAILED",productPath:e,xctestrunPath:r,error:t.message,details:t.details})}}}async function lT(e){return 0===(await i_("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let lL=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),l$=new Set([" "," ","\n","\r"]),lF=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function lU(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new lq(e).parse()}function lG(e,t){for(let r of e){if("dict"===r.name)for(let e=0;e<r.children.length-1;e+=1){let n=r.children[e],i=r.children[e+1];n?.name==="key"&&n.text&&i&&t(n.text,i)}lG(r.children,t)}}class lq{roots=[];stack=[];index=0;xml;constructor(e){this.xml=e}parse(){for(this.skipByteOrderMark();this.index<this.xml.length;)this.readNextToken();return this.assertFullyClosed(),this.roots}readNextToken(){"<"!==this.xml[this.index]?this.readText():this.resolveMarkupReader()()}resolveMarkupReader(){return this.startsWith("\x3c!--")?()=>this.skipUntil("--\x3e","Comment is not closed."):this.startsWith("<?")?()=>this.skipUntil("?>","Processing instruction is not closed."):this.startsWith("<![CDATA[")?()=>this.readCdata():this.startsWith("<!")?()=>this.skipDeclaration():this.startsWith("</")?()=>this.readClosingTag():()=>this.readOpeningTag()}assertFullyClosed(){if(this.stack.length>0){let e=this.stack[this.stack.length-1];throw Error(`Unclosed XML tag <${e?.name??"unknown"}>.`)}}skipByteOrderMark(){65279===this.xml.charCodeAt(0)&&(this.index=1)}readOpeningTag(){this.index+=1,this.skipWhitespace();let e=this.readRequiredName(`Missing XML tag name at offset ${this.index}.`),{attributes:t,selfClosing:r}=this.readOpeningTagBody(),n={name:e,attributes:t,text:null,children:[]};this.addNode(n),r||this.pushOpenNode(n)}readOpeningTagBody(){let e={};for(;;){this.skipWhitespace();let t=this.readOpeningTagEnd();if(t)return{attributes:e,selfClosing:"self-closing"===t};let r=this.readAttribute();e[r.name]=r.value}}readOpeningTagEnd(){if(this.index>=this.xml.length)throw Error("Opening XML tag is not closed.");return">"===this.xml[this.index]?(this.index+=1,"open"):"/"===this.xml[this.index]&&">"===this.xml[this.index+1]?(this.index+=2,"self-closing"):null}readAttribute(){let e=this.readRequiredName(`Invalid XML attribute at offset ${this.index}.`);if(function(e){if(lF.has(e))throw Error(`Unsupported XML attribute name "${e}".`)}(e),this.skipWhitespace(),"="!==this.xml[this.index])throw Error(`Missing value for XML attribute "${e}".`);return this.index+=1,this.skipWhitespace(),{name:e,value:this.readAttributeValue(e)}}pushOpenNode(e){if(this.stack.length>=256)throw Error("Maximum XML nesting depth of 256 exceeded.");this.stack.push(e)}readClosingTag(){this.index+=2,this.skipWhitespace();let e=this.readName();if(this.skipWhitespace(),">"!==this.xml[this.index])throw Error(`Closing XML tag </${e}> is not closed.`);this.index+=1;let t=this.stack.pop();if(!t)throw Error(`Unexpected closing XML tag </${e}>.`);if(t.name!==e)throw Error(`Expected </${t.name}> before </${e}>.`)}readText(){let e=this.xml.indexOf("<",this.index),t=-1===e?this.xml.length:e;this.appendText(this.xml.slice(this.index,t),!0),this.index=t}readCdata(){let e=this.index+9,t=this.xml.indexOf("]]>",e);if(-1===t)throw Error("CDATA section is not closed.");this.appendText(this.xml.slice(e,t),!1),this.index=t+3}appendText(e,t){let r=e.trim();if(!r)return;let n=this.stack[this.stack.length-1];n&&(n.text=`${n.text??""}${t?lV(r):r}`)}addNode(e){let t=this.stack[this.stack.length-1];t?t.children.push(e):this.roots.push(e)}readName(){var e;let t=this.index;for(;this.index<this.xml.length&&void 0!==(e=this.xml[this.index])&&lL.has(e);)this.index+=1;return this.xml.slice(t,this.index)}readRequiredName(e){let t=this.readName();if(!t)throw Error(e);return t}readAttributeValue(e){let t=this.xml[this.index];if('"'!==t&&"'"!==t)throw Error(`XML attribute "${e}" must use a quoted value.`);this.index+=1;let r=this.index,n=this.xml.indexOf(t,r);if(-1===n)throw Error(`XML attribute "${e}" is not closed.`);return this.index=n+1,lV(this.xml.slice(r,n).trim())}skipDeclaration(){let e={quote:null,bracketDepth:0};for(let t=this.index+2;t<this.xml.length;t+=1)if(function(e,t){var r,n,i;return!(void 0===t||(r=e,n=t,r.quote?(n===r.quote&&(r.quote=null),!0):('"'===n||"'"===n)&&(r.quote=n,!0)))&&(function(e,t){if("["===t){e.bracketDepth+=1;return}"]"===t&&e.bracketDepth>0&&(e.bracketDepth-=1)}(e,t),i=e,">"===t&&0===i.bracketDepth)}(e,this.xml[t])){this.index=t+1;return}throw Error("XML declaration is not closed.")}skipUntil(e,t){let r=this.xml.indexOf(e,this.index+e.length);if(-1===r)throw Error(t);this.index=r+e.length}skipWhitespace(){for(var e;this.index<this.xml.length&&void 0!==(e=this.xml[this.index])&&l$.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function lV(e){return e.replace(/&(#x[0-9a-fA-F]+|#[0-9]+|amp|lt|gt|quot|apos);/g,(e,t)=>{switch(t){case"amp":return"&";case"lt":return"<";case"gt":return">";case"quot":return'"';case"apos":return"'";default:var r=e,n=t;let i=n.startsWith("#x")?Number.parseInt(n.slice(2),16):Number(n.slice(1));if(!Number.isInteger(i)||i<0||i>1114111)return r;try{return String.fromCodePoint(i)}catch{return r}}})}let lj=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function lB(e){var t;let r=await lH(e);if(!r||0===r.length)return null;let a=n.dirname(e),o=new Set,s=function(e,t){let r=[],i=new Set,a=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){a.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);r.push(n.join(t,e));let s=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(e);s&&i.add(n.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(i),hostRelativePaths:a}}(r,a);for(let e of s.testRootPaths){if(!i.existsSync(e))return null;o.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>i.existsSync(n.join(t,e)));return r?n.join(r,e):null})){if(!e)return null;o.add(e)}return Array.from(o)}async function lH(e){let t=await ib(e);if(t){var r,n,a,o=t;let e=new Set;for(let t of[a=o,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!lK(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(lK))}return r}(a),...Object.values(a).filter(e=>lK(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(lj.has(r)){if("string"==typeof n){t.add(n);continue}if(Array.isArray(n))for(let e of n)"string"==typeof e&&t.add(e)}return Array.from(t)}(t))e.add(r);return Array.from(e)}if("darwin"===process.platform)return null;try{let t;return r=i.readFileSync(e,"utf8"),n=lU(r),t=new Set,lG(n,(e,r)=>{if(lj.has(e)){if("string"===r.name&&r.text)return void t.add(r.text);if("array"===r.name)for(let e of r.children)"string"===e.name&&e.text&&t.add(e.text)}}),Array.from(t)}catch{return null}}function lK(e){return!!e&&"object"==typeof e}let lW=["CFBundleIcons","CFBundleIcons~ipad"];async function lz(e){let t=e.filter(lQ);if(0===t.length)return;let r=e.filter(e=>l1(e)&&!l0(e));for(let e of t){let t=function(e,t){let r=n.dirname(e);return t.find(e=>n.dirname(e)===r&&"AgentDeviceRunner.app"===n.basename(e))??t.find(t=>n.dirname(t)===r&&t!==e)??null}(e,r);t&&await lJ(t,e)}}async function lJ(e,t){var r;let a,o=function(e,t){let r=!1;for(let o of i.readdirSync(e,{withFileTypes:!0})){var a;if(o.isFile()&&(a=o.name,/^AppIcon.*\.png$/.test(a)||"Assets.car"===a))(function(e,t){if(i.existsSync(t)){let r=i.readFileSync(e),n=i.readFileSync(t);return!r.equals(n)&&(i.copyFileSync(e,t),!0)}return i.copyFileSync(e,t),!0})(n.join(e,o.name),n.join(t,o.name))&&(r=!0)}return r}(e,t),s=await lX(e,t);(o||s)&&(await lY(t),r=t,a=new Date,i.utimesSync(r,a,a))}async function lX(e,t){var r,i;let a=n.join(e,"Info.plist"),o=n.join(t,"Info.plist"),s=await ib(a),l=await ib(o);if(!s||!l)return!1;let c=(r=s,i=l,lW.flatMap(e=>{let t=r[e];return void 0===t||JSON.stringify(i[e])===JSON.stringify(t)?[]:[{key:e,value:t,shouldInsert:void 0===i[e]}]}));if(0===c.length)return!1;for(let e of c)await lZ(o,e.key,e.value,e.shouldInsert);return!0}async function lZ(e,t,r,n){let i=await i_("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new L("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function lY(e){let t=await i_("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new L("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function lQ(e){return l1(e)&&l0(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function l0(e){return n.basename(e).endsWith("-Runner.app")}function l1(e){return n.basename(e).endsWith(".app")}let l2={iOS:{sdkName:{simulator:"iphonesimulator",device:"iphoneos"},derivedBaseName:{simulator:"ios-simulator",device:"ios-device"},xctestrunHints:{simulator:{preferred:["iphonesimulator"],disallowed:["iphoneos","appletvos","appletvsimulator","macos"]},device:{preferred:["iphoneos"],disallowed:["iphonesimulator","appletvos","appletvsimulator","macos"]}}},tvOS:{sdkName:{simulator:"appletvsimulator",device:"appletvos"},derivedBaseName:{simulator:"tvos-simulator",device:"tvos-device"},xctestrunHints:{simulator:{preferred:["appletvsimulator"],disallowed:["appletvos","iphoneos","iphonesimulator","macos"]},device:{preferred:["appletvos"],disallowed:["appletvsimulator","iphoneos","iphonesimulator","macos"]}}},macOS:{sdkName:{simulator:"macosx",device:"macosx"},derivedBaseName:{simulator:"macos",device:"macos"},xctestrunHints:{simulator:{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]},device:{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]}}}};function l3(e){var t;if("ios"!==e.platform&&"macos"!==e.platform)throw new L("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":"macos"===(t=e.target)||"desktop"===t?"macOS":"tv"===t?"tvOS":"iOS"}function l4(e){return"simulator"===e?"simulator":"device"}function l5(){return"arm64"===process.arch?"arm64":"x86_64"}let l8="XCTestDevices",l6=".agent-device-backup",l9=".agent-device-xctestdevices-backup-",l7=n.join(d.homedir(),".agent-device","ios-runner"),ce=".agent-device-runner-cache.json",ct={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},cr=new Map,cn=new Set,ci=new Map,ca=new Set;function co(e){return e?.trim()??""}function cs(e=process.env){return co(e.AGENT_DEVICE_IOS_BUNDLE_ID)||co(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function cl(e=process.env){let t=co(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${cs(e)}.uitests`}let cc=function(e=process.env){let t=cs(e),r=cl(e);return Array.from(new Set([co(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function cd(e=d.homedir()){return n.join(e,"Library","Developer","XCTestDevices")}async function cu(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=et(e.simulatorSetPath);if(!r)return null;let a=n.resolve(r),o=n.resolve(t.xctestDeviceSetPath??cd()),s=n.resolve(t.backupPath??function(e=cd()){return`${e}${l6}`}(o)),l=n.resolve(t.lockDirPath??function(e=d.homedir()){return n.join(e,".agent-device","xctest-device-set.lock")}()),c=t.ownerStartTime??M(process.pid),u=await cm({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:c,acquiredAtMs:t.nowMs??Date.now()}});try{if(cp({xctestDeviceSetPath:o,backupPath:s}),function(e,t){if(n.resolve(e)===n.resolve(t))return!0;try{return i.realpathSync.native(e)===i.realpathSync.native(t)}catch{return!1}}(a,o))return await u(),null;i.mkdirSync(a,{recursive:!0}),i.existsSync(o)&&i.renameSync(o,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,a=n.dirname(r),o=n.join(a,`${l8}.agent-device-link-${process.pid}-${Date.now()}`);i.mkdirSync(a,{recursive:!0});try{i.symlinkSync(t,o,"dir"),i.renameSync(o,r)}catch(e){throw i.existsSync(o)&&cf(o),e}}({requestedSetPath:a,xctestDeviceSetPath:o})}catch(e){throw cp({xctestDeviceSetPath:o,backupPath:s}),await u(),new L("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:a,xctestDeviceSetPath:o,backupPath:s,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{cp({xctestDeviceSetPath:o,backupPath:s})}finally{await u()}}}}}function cp(e){let{xctestDeviceSetPath:t,backupPath:r}=e,a=[r,...function(e){let t=n.dirname(e),r=n.basename(e).replace(l6,""),a=r===l8?l9:`${r}${l9}`;try{return i.readdirSync(t).filter(e=>e.startsWith(a)).sort().map(e=>n.join(t,e))}catch{return[]}}(r)],o=a.find(e=>i.existsSync(e)),s=i.existsSync(t)&&i.lstatSync(t).isSymbolicLink();if(o){if(s&&cf(t),i.existsSync(t))if(!s)return void N({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:o}});else o!==r?i.rmSync(o,{recursive:!0,force:!0}):i.rmSync(r,{recursive:!0,force:!0});else i.mkdirSync(n.dirname(t),{recursive:!0}),i.renameSync(o,t);for(let e of a)e!==o&&i.existsSync(e)&&i.rmSync(e,{recursive:!0,force:!0});return}s&&(N({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),cf(t))}function cf(e){!i.existsSync(e)||i.lstatSync(e).isSymbolicLink()&&i.unlinkSync(e)}async function cm(e){let{lockDirPath:t,owner:r}=e,a=n.join(t,"owner.json"),o=Date.now()+(e.timeoutMs??3e4),s=e.pollMs??100,l=e.description??"XCTest device set lock";for(i.mkdirSync(n.dirname(t),{recursive:!0});Date.now()<o;)try{i.mkdirSync(t),function(e,t){let r=`${e}.${process.pid}.${Date.now()}.tmp`;i.writeFileSync(r,JSON.stringify(t),"utf8"),i.renameSync(r,e)}(a,r);let e=!1;return async()=>{e||(e=!0,i.rmSync(t,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,t){let r=null;try{r=i.statSync(e)}catch{return!0}let n=cw(t);if(n){var a;return!(Number.isInteger((a=n).pid)&&!(a.pid<=0)&&C(a.pid)&&(!a.startTime||M(a.pid)===a.startTime))&&(i.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-r.mtimeMs<5e3)&&(i.rmSync(e,{recursive:!0,force:!0}),!0)}(t,a))continue;await eB(s)}throw new L("COMMAND_FAILED",`Timed out waiting for ${l}`,{lockDirPath:t,...function(e,t){let r,n=Date.now(),a=cw(t);try{r=Math.max(0,Math.round(n-i.statSync(e).mtimeMs))}catch{}return{...void 0!==r?{lockAgeMs:r}:{},...a?{ownerPid:a.pid,ownerStartTime:a.startTime,ownerAgeMs:Math.max(0,Math.round(n-a.acquiredAtMs))}:{}}}(t,a)})}async function ch(e){var t;return await cm({lockDirPath:(t=e,n.join(n.dirname(t),`${n.basename(t)}.lock`)),owner:{pid:process.pid,startTime:M(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}function cw(e){try{return JSON.parse(i.readFileSync(e,"utf8"))}catch{return null}}async function cg(e,r){let a=e9(),o=function(e,r=e9()){let a,o=l3(e);return{schemaVersion:2,packageVersion:e6(),runnerSourceFingerprint:function(e){let r=n.join(e,"ios-runner","AgentDeviceRunner"),a=function(e){if(!i.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of i.readdirSync(e,{withFileTypes:!0})){var a,o;let i=n.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(i);continue}s.isFile()&&(a=s.name,o=i,"project.pbxproj"===a?o.includes(`${n.sep}.xcodeproj${n.sep}`):[".jpg",".json",".png",".swift",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(n.extname(a)))&&t.push(i)}}return t.sort((e,t)=>e.localeCompare(t))}(r),o=function(e,r){let a=t.createHash("sha256");for(let t of r){let r=n.relative(e,t),o=i.statSync(t);a.update(r),a.update("\0"),a.update(String(o.size)),a.update("\0"),a.update(String(Math.trunc(o.mtimeMs))),a.update("\0")}return a.digest("hex")}(r,a),s=cO.get(r);if(s?.fileStatsFingerprint===o)return s.sourceFingerprint;let l=t.createHash("sha256");for(let e of a){let t=n.relative(r,e);l.update(t),l.update("\0"),l.update(i.readFileSync(e)),l.update("\0")}let c=l.digest("hex");return cO.set(r,{fileStatsFingerprint:o,sourceFingerprint:c}),c}(r),...function(e,t){var r;let n=(r=cA("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=l2[e].sdkName[l4(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:cA("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:cA("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(o,e.kind),platformName:o,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(a=l3(e))?`platform=macOS,arch=${l5()}`:"simulator"===e.kind?`generic/platform=${a} Simulator`:`generic/platform=${a}`,runnerBundleBuildSettings:cK(process.env),runnerSigningBuildSettings:cH(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:cW()}}(e,a),s=function(e,r){let i,a=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(a)return n.resolve(a);let o=(i=t.createHash("sha256").update(cD(cM(r))).digest("hex"),`cache-${i.slice(0,16)}`),s=function(e){return n.join(l7,"derived",l2[l3(e)].derivedBaseName[l4(e.kind)])}(e);return n.join(s,o)}(e,o);return await sZ(cr,s,async()=>{let t=await ch(s);try{return await cv({device:e,options:r,projectRoot:a,expectedCacheMetadata:o,derived:s,forceRebuild:!0===r.forceRunnerXctestrunRebuild})}finally{await t()}})}async function cv(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(ea(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||cn.has(t))&&(cX("clean",r?"forced_rebuild":"forced_clean",{derived:t}),cz(t),cI(t),cn.delete(t));let l=await cJ({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>cT(e,n),xctestrunReferencesProjectRoot:c$,resolveExistingXctestrunProductPaths:lB}),c="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&cX("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let d=await cy({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:c});return d||(l.xctestrunPath&&(cz(s),cI(s)),await cS({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:c,reason:l.reason}))}async function cy(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await c_(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function cS(e){let{device:t,options:r,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:l,reason:c}=e,d=n.join(a,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!i.existsSync(d))throw new L("COMMAND_FAILED","iOS runner project not found",{projectPath:d});let u=Date.now();await cj(t,d,s,r);let p=Math.max(0,Date.now()-u),f=cT(s,t);if(!f)throw new L("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await lB(f);if(!m)throw new L("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await lO(t,m,f),await lz(m),cx(s,cE(o,f,m)),cX("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:c}}async function c_(e,t,r,n){try{var i,a,o,s;return await lO(e,n.productPaths,n.xctestrunPath),cX("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,cx(i,cE(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof L))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&lR.has(t)}(e))throw e;return cX("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function cI(e){try{if(!i.existsSync(e))return;if("derived"!==n.basename(e))return void i.rmSync(e,{recursive:!0,force:!0});for(let r of i.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,cb.has(t)&&i.rmSync(n.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let cb=new Set([ce,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function cA(e,t){let r=JSON.stringify([e,t]),n=ci.get(r);if(void 0!==n)return n;try{let n=G(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return ci.set(r,i),i}catch{return ci.set(r,"unknown"),"unknown"}}function cx(e,t){i.mkdirSync(e,{recursive:!0}),i.writeFileSync(n.join(e,ce),`${JSON.stringify(t,null,2)}
11
+ `)}async function cN(e,t){cn.add(e.derived);let r=await ch(e.derived);try{cX("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),cz(e.derived),cI(e.derived)}finally{await r()}}function cM(e){let{artifacts:t,...r}=e;return r}function cD(e){return JSON.stringify(function e(t){return Array.isArray(t)?t.map(t=>e(t)):t&&"object"==typeof t?Object.fromEntries(Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([t,r])=>[t,e(r)])):t}(e))}function cE(e,t,r){let n=function(e,t){let r=cP(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=cP(e);if(null===t)return null;n.push({path:e,...t})}return{xctestrunPath:e,xctestrunMtimeMs:r.mtimeMs,xctestrunSize:r.size,productPaths:n}}(t,r);return n?{...e,artifacts:n}:e}function ck(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function cP(e){try{let t=i.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function cC(e,t){let r=cP(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function cR(e,t){let r=n.relative(n.resolve(t),n.resolve(e));return""!==r&&!r.startsWith("..")&&!n.isAbsolute(r)}let cO=new Map;function cT(e,t){if(!i.existsSync(e))return null;let r=[],a=[e];for(;a.length>0;){let e=a.pop();for(let t of i.readdirSync(e,{withFileTypes:!0})){let o=n.join(e,t.name);if(t.isDirectory()){a.push(o);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=i.statSync(o);r.push({path:o,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,r)=>{if(t){let n=cL(r.path,t)-cL(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function cL(e,t){let r=0,i=e.toLowerCase();n.basename(i).startsWith("agentdevicerunner.env.")&&(r-=1e3),i.includes(`${n.sep}macos${n.sep}`)&&(r-=5e3);let a=l2[l3(t)].xctestrunHints[l4(t.kind)];return a.preferred.length>0&&(a.preferred.some(e=>i.includes(e))?r+=2e3:r-=500),a.disallowed.some(e=>i.includes(e))&&(r-=2500),r}function c$(e,t){try{let r=i.readFileSync(e,"utf8"),n=new Set([t]);try{n.add(i.realpathSync(t))}catch{}for(let e of n)if(r.includes(e))return!0;return!1}catch{return!1}}async function cF(e,t,r){let i=n.dirname(e),a=r.replace(/[^a-zA-Z0-9._-]/g,"_"),o=n.join(i,`AgentDeviceRunner.env.${a}.json`),s=n.join(i,`AgentDeviceRunner.env.${a}.xctestrun`),l=await cU(e);return cq(l,e=>{var r,n;return r=e,n=t,void(r.EnvironmentVariables={...r.EnvironmentVariables??{},...n},r.UITestEnvironmentVariables={...r.UITestEnvironmentVariables??{},...n},r.UITargetAppEnvironmentVariables={...r.UITargetAppEnvironmentVariables??{},...n},r.TestingEnvironmentVariables={...r.TestingEnvironmentVariables??{},...n})}),cq(l,e=>Object.assign(e,ct),{requireTestBundlePath:!0}),await cG(l,o,s),{xctestrunPath:s,jsonPath:o}}async function cU(e){let t=await i_("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new L("COMMAND_FAILED","Failed to read xctestrun plist",{xctestrunPath:e,stderr:t.stderr});try{let e=JSON.parse(t.stdout);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Root must be an object");return e}catch(t){throw new L("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function cG(e,t,r){i.writeFileSync(t,JSON.stringify(e,null,2));let n=await i_("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new L("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:r,stderr:n.stderr})}function cq(e,t,r={}){let n=e.TestConfigurations;if(Array.isArray(n))for(let e of n)e&&"object"==typeof e&&function(e,t,r){if(Array.isArray(e))for(let n of e){let e=cV(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=cV(r,{requireTestBundlePath:!0});e&&t(e)}}function cV(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function cj(e,t,r,n){let i=cK(process.env),a=cH(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=cW(),l=await cu(e);try{let l;await F("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",cB(e),"1","-destination",(l=l3(e),"macOS"===l?`platform=macOS,arch=${l5()}`:"simulator"===e.kind?`platform=${l} Simulator,id=${e.id}`:`generic/platform=${l}`),"-derivedDataPath",r,...s,...i,...o,...a],{detached:!0,timeoutMs:n.buildTimeoutMs,onSpawn:e=>{ca.add(e),e.on("close",()=>{ca.delete(e)})},onStdoutChunk:e=>{lE(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{lE(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof L?a:new L("COMMAND_FAILED",String(a)),i=(e=r.details?JSON.stringify(r.details):"",((t=`${r.message}
12
+ ${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)??lu);throw new L("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await l?.release()}}function cB(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function cH(e=process.env,t=!1,r="ios"){if("macos"===r)return["CODE_SIGNING_ALLOWED=NO","CODE_SIGNING_REQUIRED=NO","CODE_SIGN_IDENTITY=","DEVELOPMENT_TEAM="];if(!t)return[];let n=e.AGENT_DEVICE_IOS_TEAM_ID?.trim()||"",i=e.AGENT_DEVICE_IOS_SIGNING_IDENTITY?.trim()||"",a=e.AGENT_DEVICE_IOS_PROVISIONING_PROFILE?.trim()||"",o=["CODE_SIGN_STYLE=Automatic"];return n&&o.push(`DEVELOPMENT_TEAM=${n}`),i&&o.push(`CODE_SIGN_IDENTITY=${i}`),a&&o.push(`PROVISIONING_PROFILE_SPECIFIER=${a}`),o}function cK(e=process.env){let t=cs(e),r=cl(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function cW(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function cz(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,i;if(r=e,t=n.resolve(e9(),".tmp"),""===(i=n.relative(t,n.resolve(r)))||i.startsWith("..")||n.isAbsolute(i))throw new L("COMMAND_FAILED","Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically",{derivedPath:e,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${n.join(e9(),".tmp")}.`})}}async function cJ(e){var t,r;let a,o=(t=e.derived,r=e.expectedCacheMetadata,(a=function(e){try{let t=JSON.parse(i.readFileSync(n.join(e,ce),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?cD(cM(a))!==cD(cM(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:a}:{ok:!1,reason:"cache_metadata_missing"}),s=o.ok?function(e,t){var r;let n=t?.artifacts;if(!(!(!(r=n)||"object"!=typeof r||Array.isArray(r))&&"string"==typeof r.xctestrunPath&&Number.isInteger(r.xctestrunMtimeMs)&&Number.isInteger(r.xctestrunSize)&&Array.isArray(r.productPaths)&&r.productPaths.length>0&&r.productPaths.every(ck))||!cR(n.xctestrunPath,e)||!cC(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!cR(t.path,e)||!cC(t.path,t))return null;i.push(t.path)}return{xctestrunPath:n.xctestrunPath,productPaths:i}}(e.derived,o.metadata):null,l=s?.xctestrunPath??e.findXctestrun(e.derived);if(!l)return{reason:"missing_xctestrun",xctestrunPath:null};let c=s?.xctestrunPath===l,d=c?"manifest":"scan",u=c?s.productPaths:await e.resolveExistingXctestrunProductPaths(l);return u?e.xctestrunReferencesProjectRoot(l,e.projectRoot)||c?o.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:u,source:d}:{reason:o.reason,xctestrunPath:l,productPaths:u,source:d}:{reason:"project_root_mismatch",xctestrunPath:l,productPaths:u,source:d}:{reason:"missing_products",xctestrunPath:l,productPaths:[],source:d}}function cX(e,t,r){N({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let cZ=new Map,cY=new Map;async function cQ(e,t){return await sZ(cY,e.id,async()=>{var r;let n,i,a=cZ.get(e.id);if(a){if(c9(a.child.pid))return N({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:a.sessionId,ready:a.ready}}),a;await ds({},"stop_stale_session",async()=>{await c4(e.id,a)})}let o={};await ds(o,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(N({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):de(t))}),t.cleanStaleBundles?await ds(o,"cleanup_stale_bundles",async()=>{await c0(e)}):(o.cleanup_stale_bundles=0,N({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let s=await ds(o,"ensure_xctestrun",async()=>await cg(e,t));o.build_xctestrun=s.buildMs;let l=await ds(o,"allocate_port",async()=>await lD()),{xctestrunPath:c,jsonPath:d}=await ds(o,"prepare_xctestrun_env",async()=>await cF(s.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(l)},`session-${e.id}-${l}`)),u=await ds(o,"simulator_set_redirect",async()=>await cu(e));try{({child:n,wait:i}=await ds(o,"launch_xcodebuild",()=>{let t;return $("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",cB(e),"1","-destination-timeout",String(20),"-xctestrun",c,"-destination",(t=l3(e),"macOS"===t?`platform=macOS,arch=${l5()}`:"simulator"===e.kind?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(l)},detached:!0})}))}catch(e){throw await u?.release(),e}n.stdout?.on("data",e=>{lE(e,t.logPath,t.traceLogPath,t.verbose)}),n.stderr?.on("data",e=>{lE(e,t.logPath,t.traceLogPath,t.verbose)});let p={sessionId:`${e.id}:${l}:${Date.now()}`,device:e,deviceId:e.id,port:l,xctestrunPath:c,xctestrunArtifact:s,jsonPath:d,testPromise:i,child:n,ready:!1,startupTimeoutMs:"number"==typeof(r=t.startupTimeoutMs)&&Number.isFinite(r)&&r>0?Math.floor(r):void 0,startupTimings:o,simulatorSetRedirect:u??void 0};return cZ.set(e.id,p),p})}async function c0(e){if("simulator"===e.kind)for(let t of cc){let r=await c1(e,t);if(!r||function(e){if(0===e.exitCode)return!0;let t=`${e.stdout}
13
+ ${e.stderr}`.toLowerCase();return t.includes("not installed")||t.includes("found nothing")||t.includes("no such file")||t.includes("invalid device")||t.includes("could not find")}(r))continue}}async function c1(e,t){try{return await iI(lc(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(r){N({level:"warn",phase:"ios_runner_startup_cleanup_stale_bundle_failed",data:{deviceId:e.id,bundleId:t,timeoutMs:1e4,error:r instanceof Error?r.message:String(r)}});return}}function c2(e){let t=cZ.get(e);return t?{sessionId:t.sessionId,alive:c9(t.child.pid)}:null}async function c3(e,t){await sZ(cY,e.deviceId,async()=>{cZ.get(e.deviceId)===e&&(N({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await c4(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function c4(e,t,r={}){let n=t??cZ.get(e);if(n){var i;if(!1!==r.graceful)try{await lS(n.device,n.port,lg({command:"shutdown"}),void 0,15e3)}catch{await c7(n.child.pid,"SIGTERM")}else await c7(n.child.pid,"SIGTERM");try{await Promise.race([n.testPromise,new Promise(e=>setTimeout(e,r.waitTimeoutMs??1e4))])}catch{}(i=n.child.pid)&&(c9(i)||k(i))&&await c7(n.child.pid,"SIGKILL"),lC(n.xctestrunPath),lC(n.jsonPath),await n.simulatorSetRedirect?.release(),cZ.get(e)===n&&cZ.delete(e)}}async function c5(e){await sZ(cY,e,async()=>{await c4(e)})}async function c8(){let e=Array.from(cZ.values()),t=Array.from(ca);await Promise.allSettled(e.map(async e=>{await c7(e.child.pid,"SIGINT")})),await Promise.allSettled(t.map(async e=>{await c7(e.pid,"SIGINT")})),await Promise.allSettled(e.map(async e=>{await c7(e.child.pid,"SIGTERM")})),await Promise.allSettled(t.map(async e=>{await c7(e.pid,"SIGTERM")})),await Promise.allSettled(e.map(async e=>{await c7(e.child.pid,"SIGKILL")})),await Promise.allSettled(t.map(async e=>{await c7(e.pid,"SIGKILL"),ca.delete(e)})),await Promise.allSettled(e.map(async e=>{await e.simulatorSetRedirect?.release()}))}async function c6(){await c8();let e=Array.from(cZ.keys());await Promise.allSettled(e.map(async e=>{await c5(e)}));let t=Array.from(ca);await Promise.allSettled(t.map(async e=>{try{await c7(e.pid,"SIGTERM"),await c7(e.pid,"SIGKILL")}finally{ca.delete(e)}}))}function c9(e){return!!e&&C(e)}async function c7(e,t){if(!e||e<=0)return;try{process.kill(-e,t)}catch{}try{process.kill(e,t)}catch{}let r="SIGINT"===t?"INT":"SIGTERM"===t?"TERM":"KILL";try{await i_("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function de(e){await iI(lc(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}function dt(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new L("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new L("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function dr(e,t,r,n,i,a){var o,s;o=t,s=r.command,o.startupTimingsReported||!o.startupTimings||(o.startupTimingsReported=!0,N({level:"info",phase:"ios_runner_session_startup_timings",durationMs:Object.values(o.startupTimings).reduce((e,t)=>e+t,0),data:{command:s,sessionId:o.sessionId,ready:o.ready,timings:o.startupTimings}}));let l=lg(r);if(lw(l.command)){let r=await x("ios_runner_command_send",async()=>await lS(e,t.port,l,n,i,t,a),{command:l.command,commandId:l.commandId,readOnly:!0,sessionReady:t.ready,timeoutMs:i});return await dn(r,t,n)}let c=ei.fromTimeoutMs(i),d=function(e,t){if(!e.ready)return{action:"run",reason:"startup"};if("tap"!==t.command&&"tapSeries"!==t.command)return{action:"run",reason:"conservative_command"};let r=e.lastSuccessfulRunnerResponseAtMs;if(void 0===r)return{action:"run",reason:"no_successful_response"};let n=Date.now()-r;return n>1e4?{action:"run",reason:"successful_response_stale",lastSuccessfulRunnerResponseAgeMs:n}:{action:"skip",reason:"recent_successful_response",lastSuccessfulRunnerResponseAgeMs:n}}(t,l);if("run"===d.action){let r=t.ready?Math.min(5e3,c.remainingMs()):Math.min(da(t),c.remainingMs());try{let i=await x("ios_runner_readiness_preflight",async()=>await lS(e,t.port,lg({command:"uptime"}),n,r,t,a),{command:l.command,commandId:l.commandId,lastSuccessfulRunnerResponseAgeMs:d.lastSuccessfulRunnerResponseAgeMs,reason:d.reason,sessionReady:t.ready,timeoutMs:r});await dn(i,t,n)}catch(e){throw di(e,{runnerReadinessPreflightFailed:!0})}}else N({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:r.command,commandId:l.commandId,lastSuccessfulRunnerResponseAgeMs:d.lastSuccessfulRunnerResponseAgeMs,reason:d.reason,sessionReady:t.ready}});let u=c.remainingMs();if(u<=0)throw new L("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:i});let p=await x("ios_runner_command_send",async()=>await l_(e,t.port,l,u,a),{command:l.command,commandId:l.commandId}).catch(e=>{if("skip"===d.action){var t;throw di(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:(t=d).reason,runnerReadinessPreflightSkippedAgeMs:t.lastSuccessfulRunnerResponseAgeMs})}throw e});return await dn(p,t,n)}async function dn(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new L("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?R(e):"COMMAND_FAILED",i="string"==typeof n.error?.message?n.error.message:void 0,a="string"==typeof n.error?.hint?n.error.hint:void 0;throw new L(t,i??"Runner error",{runner:n,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,logPath:r})}if(t.ready=!0,t.lastSuccessfulRunnerResponseAtMs=Date.now(),n.data&&"object"==typeof n.data&&!Array.isArray(n.data)){var a;let e,t=n.data;return"string"==typeof(e=(a=t).gestureFallback)&&0!==e.length&&N({level:"debug",phase:"ios_runner_gesture_fallback",data:{fallback:e,message:"string"==typeof a.gestureFallbackMessage?a.gestureFallbackMessage:void 0,hint:"string"==typeof a.gestureFallbackHint?a.gestureFallbackHint:void 0}}),t}return{}}function di(e,t){let r=e instanceof L?e:new L("COMMAND_FAILED",e instanceof Error?e.message:String(e),void 0,e);return new L(r.code,r.message,{...r.details??{},...t},r.cause??e)}function da(e){return e.startupTimeoutMs??45e3}async function ds(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,N({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}let dl=new m;function dc(e,t={}){return{runCommand:e,...t}}function dd(e,t,r,n={}){if(r)return dp(r);let i=function(e,t={}){let r=dl.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?dp(i.provider):dp(t)}async function du(e,t,r){if(!e)return await r();let n={provider:dp(e),deviceId:t.deviceId,requestId:t.requestId};return await dl.run(n,r)}function dp(e){return"function"==typeof e?{runCommand:e}:e}async function df(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await dw(t,r,n,i,a,o);return await dm(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function dm(e,t){var r,n,i,a;if(!e)return await dh(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,dv({command:(n=t).command,session:n.session,transportError:n.transportError,decision:"skipped",reason:r.reason,lifecycleState:r.lifecycleState}),r.data}if("skipInvalidation"===e.type){throw i=e,dv({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await dh(t,e.reason,e.lifecycleState,e.error)}async function dh(e,t,r,n){throw dv({command:e.command,session:e.session,transportError:e.transportError,decision:"retained",reason:t,lifecycleState:r}),await e.invalidateSession(e.session,e.invalidationReason),n??e.transportError}async function dw(e,t,r,n,i,a){var o,s,l,c,d,u,p,f,m,h;let w,g,v,y,S;if("status"===r.command||!r.commandId?.trim())return;let _=dy(n);try{w=await dr(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return N({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:r.command,commandId:r.commandId,error:e instanceof Error?e.message:String(e),..._}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let I="string"==typeof w.lifecycleState?w.lifecycleState:"";return N({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:I,..._}}),o=w,s=I,l=r,c=n,d=i,"completed"===s?function(e,t,r,n){let i=function(e){if("string"!=typeof e||0===e.trim().length)return;let t=function(e){try{let t=JSON.parse(e);if(t&&"object"==typeof t)return t}catch{}return{}}(e);if(t.ok)return t.data&&"object"==typeof t.data&&!Array.isArray(t.data)?t.data:{}}(e.lifecycleResponseJson);if(i)return{type:"recovered",data:i,reason:"completed_with_retained_response",lifecycleState:"completed"};if(lw(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let a=dy(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new L("COMMAND_FAILED",`Runner command "${t.command}" completed after the transport response was lost, but no recoverable response was retained.`,{command:t.command,commandId:t.commandId,lifecycleState:"completed",recovery:"completed_without_retained_response",...a,hint:function(e,t={}){return`${dg(t)}The runner is still reachable and reports "${e}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`}(t.command,a),logPath:n.logPath,transportError:r.message},r)}}(o,l,c,d):"failed"===s?{type:"skipInvalidation",reason:"runner_reported_failure",lifecycleState:s,error:(u=o,p=l,f=c,m=d,g="string"==typeof u.lifecycleErrorCode?u.lifecycleErrorCode:void 0,v="string"==typeof u.lifecycleErrorMessage?u.lifecycleErrorMessage:"Runner command failed",y="string"==typeof u.lifecycleErrorHint?u.lifecycleErrorHint:void 0,S=dy(f),new L(R(g),v,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...S,hint:y??function(e,t={}){return`${dg(t)}The runner is still reachable and reports "${e}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`}(p.command,S),logPath:m.logPath,transportError:f.message},f))}:"accepted"===s||"started"===s?{type:"skipInvalidation",reason:"command_still_in_flight",lifecycleState:s,error:function(e,t,r,n){if(lw(t.command))return r;let i=dy(r);return new L("COMMAND_FAILED",`Runner command "${t.command}" is still ${e} after the transport response was lost.`,{command:t.command,commandId:t.commandId,lifecycleState:e,recovery:"command_still_in_flight",...i,hint:function(e,t,r={}){return`${dg(r)}The runner is still reachable and reports "${e}" is ${t}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`}(t.command,e,i),logPath:n.logPath,transportError:r.message},r)}(s,l,c,d)}:{type:"retainInvalidation",reason:s?"unknown_lifecycle_state":"missing_lifecycle_state",lifecycleState:s,error:new L("COMMAND_FAILED",`Runner command "${l.command}" lost its transport response and lifecycle status was ${s?`"${s}"`:"missing"}, so agent-device invalidated the runner session instead of replaying the command.`,{command:l.command,commandId:l.commandId,lifecycleState:s,recovery:"lifecycle_state_not_recoverable",hint:(h=l.command,`The runner did not confirm that "${h}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`),logPath:d.logPath,transportError:c.message},c)}}function dg(e){return!0!==e.readinessPreflightSkipped?"":"This hot command skipped the uptime preflight because the runner had just responded; status recovery confirmed the runner still observed it. "}function dv(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;N({level:"retained"===i?"warn":"debug",phase:"ios_runner_command_invalidation_decision",data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:void 0!==o,sessionId:r.sessionId,transportError:n.message}})}function dy(e){let t,r,n,i={},a="boolean"==typeof(t=e.details?.runnerReadinessPreflightSkipped)?t:void 0;void 0!==a&&(i.readinessPreflightSkipped=a);let o="string"==typeof(r=e.details?.runnerReadinessPreflightSkipReason)?r:void 0;void 0!==o&&(i.readinessPreflightSkipReason=o);let s="number"==typeof(n=e.details?.runnerReadinessPreflightSkippedAgeMs)?n:void 0;return void 0!==s&&(i.readinessPreflightSkippedAgeMs=s),i}async function dS(e,t){var r,n,i,a,o,s,l,c;let d;lv(t.requestId);let u=t6(t.requestId),p=lg({command:"uptime"});try{let i=Date.now();d=await cQ(e,t);let a=Date.now()-i;return r=e,n=await db(e,d,p,t,u,a),dA(r,n),n}catch(v){let r,n,f=v instanceof L?v:new L("COMMAND_FAILED",String(v));if(!d||(i=f,!((r=d.xctestrunArtifact)&&"miss"!==r.cache&&(lp(i)||lf(i)||(n=i.message.toLowerCase()).includes("timeout")||n.includes("timed out")||n.includes("deadline")))))throw v;let m=f.message||"runner_health_failed";await c3(d,"prepare_cached_runner_health_failed"),await cN(d.xctestrunArtifact,m);let h=Date.now(),w=await cQ(e,{...t,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),g=Date.now()-h;try{let r=await db(e,w,p,t,u,g,{recoveryReason:m});return N({level:"info",phase:"ios_runner_prepare_bad_cache_recovered",data:{command:p.command,commandId:p.commandId,sessionId:w.sessionId,xctestrunPath:w.xctestrunArtifact?.xctestrunPath,reason:m}}),a=e,o=r,dA(a,o),o}catch(n){let t;await c3(w,"prepare_rebuilt_runner_health_failed");let r=(s=n,l=w,c=m,t=s instanceof L?s:new L("COMMAND_FAILED",String(s)),new L(t.code,"artifact restored but runner did not connect",{...t.details??{},restoredFailureReason:c,xctestrunPath:l.xctestrunArtifact?.xctestrunPath,artifact:l.xctestrunArtifact?.artifact,cache:l.xctestrunArtifact?.cache,reason:t.message},t));throw dA(e,{cache:w.xctestrunArtifact?.cache,artifact:w.xctestrunArtifact?.artifact,buildMs:w.xctestrunArtifact?.buildMs,connectMs:g,healthCheckMs:0,xctestrunPath:w.xctestrunArtifact?.xctestrunPath,failureReason:r.message}),r}}}async function d_(e,t,r){let n;lv(r.requestId);let i=t6(r.requestId);try{let a=(n=await cQ(e,r)).ready?45e3:da(n);return await dr(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof L?o:new L("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&lf(a)&&n)return lv(r.requestId),await dI({device:e,session:n,command:t,options:r,signal:i,restartReason:"runner_connect_failed_before_command_send"});if(n&&function(e){let t;return e.details?.runnerReadinessPreflightFailed===!0&&(lp(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return lv(r.requestId),await dI({device:e,session:n,command:t,options:r,signal:i,restartReason:"runner_readiness_preflight_failed_before_command_send",recoveredDiagnosticPhase:"ios_runner_readiness_preflight_recovered"});if(n&&lp(a))return await df({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:c3});throw o}}async function dI(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await c3(e.session,a);let o=await cQ(t,{...n,cleanStaleBundles:!0});try{let a=await dr(t,o,r,n.logPath,45e3,i);return e.recoveredDiagnosticPhase&&N({level:"debug",phase:e.recoveredDiagnosticPhase,data:{command:r.command,commandId:r.commandId,recovery:"session_restarted",sessionId:o.sessionId}}),a}catch(a){let e=a instanceof L?a:new L("COMMAND_FAILED",String(a));if(lp(e))return await df({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:c3});throw a}}async function db(e,t,r,n,i,a,o){var s,l,c,d,u;let p,f,m=Date.now();return s=await dr(e,t,r,n.logPath,n.healthTimeoutMs,i),l=t,c=a,d=Date.now()-m,u=o,p=l.xctestrunArtifact,f={...u?.recoveryReason?{recoveryReason:u.recoveryReason}:{},...u?.failureReason?{failureReason:u.failureReason}:{}},p?{runner:s,cache:p.cache,artifact:p.artifact,buildMs:p.buildMs,connectMs:Math.max(0,c),healthCheckMs:Math.max(0,d),xctestrunPath:p.xctestrunPath,...f}:{runner:s,connectMs:Math.max(0,c),healthCheckMs:Math.max(0,d),...f}}function dA(e,t){N({level:t.failureReason?"warn":"info",phase:"apple_runner_prepare",data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}async function dx(e,t,r={}){dt(e),lv(r.requestId);let n=lg(t),i=dD(e,r);return lw(n.command)?en(()=>(lv(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(lv(r.requestId),lp(e))}):i.runCommand(e,n,r)}function dN(e,t={}){if("ios"!==e.platform)return;let r=dD(e,t);return r.prewarm?r.prewarm(e,t).then(()=>{}).catch(t=>{N({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}})}):void N({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function dM(e,t){dt(e),lv(t.requestId);let r=lg({command:"uptime"}),n=dD(e,t);if(n.prepare)return await n.prepare(e,t);let i=Date.now();return{runner:await n.runCommand(e,r,t),connectMs:0,healthCheckMs:Math.max(0,Date.now()-i)}}function dD(e,t){return dd(e,dE,void 0,{requestId:t.requestId})}let dE=dc(d_,{prepare:dS,prewarm:async(e,t)=>{await cQ(e,t)}}),dk=new WeakMap;async function dP(e){var t,r;let n,i,a,{sessionStore:o,leaseRegistry:s}=e,l=(n={...(t=function(e){let t=z(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=H(r);if(r&&!n)throw new L("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new L("INVALID_ARGS","session isolation mode tenant requires --tenant (or meta.tenantId).");let i=e.session||"default";return i.startsWith(`${n}:`)?{...e,meta:{...e.meta,tenantId:n,sessionIsolation:t}}:{...e,session:`${n}:${i}`,meta:{...e.meta,tenantId:n,sessionIsolation:t}}}(e.req)).flags??{}},((i=td(t.command,n))||!t.flags)&&i?{...t,flags:n}:t);N({level:"info",phase:"request_start",data:{session:l.session,command:l.command,tenant:l.meta?.tenantId,isolation:l.meta?.sessionIsolation}});let c=l.command;!function(e,t){if(s7.has(e.command)||e.meta?.sessionIsolation!=="tenant")return;let r=s6(e);t.assertLeaseAdmission({tenantId:r.tenantId,runId:r.runId,leaseId:r.leaseId,backend:r.leaseBackend})}(l,s);let d=function(e){var t,r;let n=e.session||s2;if(function(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return"string"==typeof t&&t.trim().length>0}(e))return n;let i=s4(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(l),u=le.has(c)?[]:await la({req:l,sessionName:d,sessionStore:o}),p=(r=s,(a=dk.get(r))||(a=new Map,dk.set(r,a)),a);return{req:l,command:c,sessionName:d,throwIfCanceled:()=>t7(l.meta?.requestId),runLocked:async e=>(t7(l.meta?.requestId),0===u.length)?await e():await dC(p,u,async()=>(t7(l.meta?.requestId),await e()))}}async function dC(e,t,r){let[n,...i]=t;return n?await sZ(e,n,async()=>await dC(e,i,r)):await r()}function dR(e){var t,r,i;let a,{scope:o,logPath:s,sessionStore:l,trackDownloadableArtifact:c}=e;o.throwIfCanceled();let d=l.get(o.sessionName);d&&(!function(e){var t;let r;if(!((r=(t=e).recording)&&"ios"===t.device.platform&&"ios"!==r.platform&&!1!==r.showTouches))return;let n=e.recording,i=c2(e.device.id);if(!n.runnerSessionId){i?.alive&&(n.runnerSessionId=i.sessionId);return}if(!i?.alive){n.invalidatedReason??="iOS runner session exited during recording";return}i.sessionId!==n.runnerSessionId&&(n.invalidatedReason??="iOS runner session restarted during recording")}(d),l.set(o.sessionName,d));let u=(a=(t={req:o.req,sessionName:o.sessionName,sessionStore:l}).sessionStore.get(t.sessionName),{req:lr(t.req,a),existingSession:a}),p=u.req;d=u.existingSession;let f=e=>(function(e,t,r){let i=b();if(!t.ok){N({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=A({force:!0})??void 0;return{ok:!1,error:T(new L(R(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??("string"==typeof t.error.details?.hint?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath}),{diagnosticId:i.diagnosticId,logPath:e})}}return N({level:"info",phase:"request_success"}),A(),{ok:!0,data:function(e,t,r){var i,a;let o;if(!t)return t;let s=(i=e,o=Array.isArray((a=t).artifacts)?[...a.artifacts]:[],"screenshot"!==i.command||o.some(e=>e?.field==="path")||"string"!=typeof a.path||o.push({field:"path",path:a.path,localPath:i.meta?.clientArtifactPaths?.path,fileName:n.basename(i.meta?.clientArtifactPaths?.path??a.path)}),o.filter(e=>!!(e&&"string"==typeof e.field&&"string"==typeof e.path&&"string"==typeof e.localPath&&e.localPath.length>0)));return 0===s.length?t:{...t,artifacts:s.map(t=>{let n=t.path;return{field:t.field,artifactId:r({artifactPath:n,tenantId:e.meta?.tenantId,fileName:t.fileName}),fileName:t.fileName,localPath:t.localPath}})}}(e,t.data,r)}})(p,e,c);if(d?.recording?.invalidatedReason&&"record"!==(r=o.command)&&"close"!==r)return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:d.recording.invalidatedReason}})};!d||p.meta?.lockPolicy||(i=o.command,s9.has(i))||function(e,t){let r=s0(e,t);if(0!==r.length)throw new L("INVALID_ARGS",`Session "${e.name}" is already bound to ${sY(e)}, but this request selected ${r.map(s1).join(", ")}.`,{session:e.name,conflicts:r.map(s1),hint:sQ(e,"selector-conflict")})}(d,p.flags);let m=(e,t,r)=>{let n;return{...ad(s,e,t,r,n=b().requestId),requestId:n}};return{type:"scope",scope:{req:p,sessionName:o.sessionName,existingSession:d,finalize:f,contextFromFlags:m,handlerContextFromFlags:(e,t,r)=>({...m(e,t,r),surface:l.get(o.sessionName)?.surface})}}}async function dO(e){let{lockedScope:t,logPath:r,sessionStore:n}=e,i=n.get(t.sessionName);if(!i)return t.finalize({ok:!1,error:{code:"SESSION_NOT_FOUND",message:"No active session. Run open first."}});let a=await sD({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function dT(e){N({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=b(),r=A({force:!0})??void 0;return{ok:!1,error:T(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function dL(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function d$(e,t){let r=t.includeTokens?.filter(e=>e.length>0)??[],n="",i=n=>{(!(r.length>0)||r.some(e=>n.includes(e)))&&e.write(function(e,t){if(0===t.length)return e;let r=e;for(let e of t)r=r.replace(e,"[REDACTED]");return r}(n,t.redactionPatterns))};return{onChunk:e=>{let t=`${n}${e}`.split("\n");for(let e of(n=t.pop()??"",t))i(`${e}
14
+ `)},flush:()=>{n&&(i(n),n="")}}}function dF(e,t,r){let n=e.stdout,i=e.stderr;return n&&i?(n.setEncoding("utf8"),i.setEncoding("utf8"),n.on("data",r.writer.onChunk),i.on("data",r.writer.onChunk),t.on("error",()=>{e.killed||e.kill("SIGKILL")}),e.on("error",()=>t.destroy()),new Promise(n=>{e.on("close",e=>{r.writer.flush(),r.endStreamOnClose&&t.end(),n({stdout:"",stderr:"",exitCode:e??1})})})):Promise.resolve({stdout:"",stderr:"missing stdio pipes",exitCode:1})}function dU(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new L("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function dG(e,t){let r=(await te(ed(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function dq(e,t){var r,n;let i;dU(t);let a=await dG(e,t),o=te(ed(e)),s=await eh(o,{lines:4e3,timeoutMs:3e3}).catch(()=>"");if(0===s.trim().length)return null;let l=function(e,t,r){let n=new Set;for(let i of(r&&n.add(r),e.split("\n")))if(i.includes(t))for(let e of function(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=[RegExp(`\\bStart proc\\s+(\\d+):${r}(?:\\b|/)`,"i"),RegExp(`\\b(\\d+):${r}(?:\\b|/)`,"i"),RegExp(`${r}.*?\\bpid\\s*[=:]?\\s*(\\d+)\\b`,"i"),RegExp(`\\bpid\\s*[=:]?\\s*(\\d+)\\b.*${r}`,"i")],i=[];for(let t of n){let r=t.exec(e),n=r?.[1];n&&/^\d+$/.test(n)&&i.push(n)}return i}(i,t))n.add(e);return[...n]}(s,t,a);if(0===l.length)return null;let c=(r=s,n=t,i=new Set(l),r.split("\n").filter(e=>{var t;let r;if(!e.trim())return!1;if(e.includes(n))return!0;let a=(t=e,r=/\(\s*(\d+)\)\s*:/.exec(t),r?.[1]??null);return!!a&&i.has(a)}).join("\n"));return 0===c.trim().length?null:{pid:a,text:c,recoveredPids:l}}async function dV(e,t,r,n,i){let a,o,s="recovering",l=!1,c=(async()=>{try{for(;!l;){let c=await dG(e,t);if(!c){s="recovering",await eB(1e3);continue}let d=e7(ed(e)),u=el(d,{pid:c});a=u;let p=d$(r,{redactionPatterns:n});if(o=dF(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&tX(i,u.pid),s="active",await o,tZ(i),a=void 0,o=void 0,l)break;s="recovering",await eB(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),tZ(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:c,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await dL(o),a&&!a.killed&&a.kill("SIGKILL"),await dL(c),tZ(i)}}}function dj(e,t){let r=dK(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=dK(t);n.push(`process == "${e}"`,`processImagePath ENDSWITH[c] "/${e}"`,`senderImagePath ENDSWITH[c] "/${e}"`,`processImagePath CONTAINS[c] "/${e}.app/"`,`senderImagePath CONTAINS[c] "/${e}.app/"`)}return n.join(" OR ")}async function dB(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=ll(["spawn",t,"log","show","--style","compact","--info","--predicate",dj(r,n)],{simulatorSetPath:a});"number"==typeof i&&Number.isFinite(i)&&i>0?o.push("--start",`@${Math.floor(i/1e3)}`):o.push("--last","5m");let s=await iI(o,{allowFailure:!0,timeoutMs:4e3});if(0!==s.exitCode||0===s.stdout.trim().length)return null;let l=s.stdout.split("\n").map(e=>e.trimEnd()).filter(e=>{let t=e.trim();return t.length>0&&!t.startsWith("Timestamp Ty Process[PID:TID]")});return 0===l.length?null:{text:`${l.join("\n")}
15
+ `,recoveredLineCount:l.length}}async function dH(e,t,r,n,i,a){let o=await dW({deviceId:e,appBundleId:t,simulatorSetPath:i});return dX({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return ll(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",dj(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function dK(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function dW(e){let{deviceId:t,appBundleId:r,simulatorSetPath:i}=e,a=await iI(ll(["get_app_container",t,r,"app"],{simulatorSetPath:i}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=n.join(o,"Info.plist"),l=await U("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function dz(e,t,r,n){return dX({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",dj(e)],stream:t,redactionPatterns:r,pidPath:n})}async function dJ(e,t,r,n){return dX({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function dX(e){let t="active",r=$(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=d$(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&tX(e.pidPath,n.pid);let a=dF(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),tZ(e.pidPath),r),r=>{throw t="failed",tZ(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await dL(a),n.killed||n.kill("SIGKILL"),await dL(a),tZ(e.pidPath)}}}let dZ=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),dY=/https?:\/\/[^\s"'<>\])]+/i,dQ=[/\bstatus(?:Code)?["'=: ]+([1-5]\d{2})\b/i,/\bresponse(?:\s+code)?["'=: ]+([1-5]\d{2})\b/i,/\bHTTP\/[0-9.]+\s+([1-5]\d{2})\b/i];function d0(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>d2(e)));for(let e of t.entries){let t=d2(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function d1(e,t){let r=ur(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=ur(t?.maxPayloadChars,2048,64,16384),o=ur(t?.maxScanLines,4e3,100,2e4),s=e.split("\n"),l=Math.max(0,s.length-o),c=s.slice(l),d=[];for(let e=c.length-1;e>=0&&d.length<r;e-=1){let t=c[e];if(!t?.trim())continue;let r=function(e,t,r,n,i,a){let o=e[t]?.trim();if(!o)return null;let s=function(e){let t=e.indexOf("{");if(t<0)return null;let r=e.lastIndexOf("}");if(r<=t)return null;let n=e.slice(t,r+1);try{let e=JSON.parse(n);return e&&"object"==typeof e?e:null}catch{return null}}(o),l=d9(s,["method","httpMethod"]),c=d9(s,["url","requestUrl"]),d=function(e,t){if(!e)return null;for(let r of t){let t=e[r];if("number"==typeof t&&Number.isInteger(t))return t;if("string"==typeof t&&/^\d{3}$/.test(t.trim()))return Number.parseInt(t.trim(),10)}return null}(s,["status","statusCode","responseCode"]),u=dZ.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=dY.exec(o),h=c??m?.[0];if(!h)return null;let w=d??d4(o)??void 0;if(!(l||p?.[1]||u?.[1]||void 0!==w||/\bURL["'=: ]+https?:\/\//i.test(o)||/\bheaders?["'=: ]+/i.test(o)||/\b(?:requestBody|responseBody|payload|request|response)["'=: ]+/i.test(o)))return null;let g={method:f,url:h,status:w,timestamp:d5(o),packetId:d8(o)??void 0,durationMs:d6(o)??void 0,raw:ut(o,a),line:r};if("android"===n&&function(e,t,r){let n=d3(t,r,5),i=e.packetId??n.map(e=>d8(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?d3(t,r,12).filter(e=>d8(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>d5(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>d4(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>d6(e)).find(e=>"number"==typeof e))}(g,e,t),"headers"===i||"all"===i){let e=function(e,t){if(t){let e=t.headers??t.requestHeaders??t.responseHeaders;if(void 0!==e)return ue(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=ut(e,a))}if("body"===i||"all"===i){let e=d7(o,s,["requestBody","body","payload","request"]),t=d7(o,s,["responseBody","response"]);e&&(g.requestBody=ut(e,a)),t&&(g.responseBody=ut(t,a))}return g}(c,e,l+e+1,n,i,a);r&&d.push(r)}return{path:t?.path??"<memory>",exists:!0,scannedLines:c.length,matchedLines:d.length,entries:d,include:i,limits:{maxEntries:r,maxPayloadChars:a,maxScanLines:o}}}function d2(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function d3(e,t,r){let n=[],i=Math.max(0,t-r),a=Math.min(e.length-1,t+r);for(let t=i;t<=a;t+=1){let r=e[t]?.trim();r&&n.push(r)}return n}function d4(e){for(let t of dQ){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function d5(e){let t=/\b\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z)?\b/.exec(e);if(t)return t[0];let r=/\b\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\b/.exec(e);return r?.[0]}function d8(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function d6(e){let t=/\b(?:duration|elapsed request\/response time, ms)[:= ]+(\d+)\b/i.exec(e);if(!t)return null;let r=Number.parseInt(t[1]??"",10);return Number.isInteger(r)?r:null}function d9(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.trim().length>0)return t.trim()}}function d7(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return ue(t[e])}for(let t of r){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=RegExp(`\\b${r}["'=: ]+(.+)$`,"i").exec(e);if(n?.[1])return n[1].trim()}}function ue(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function ut(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function ur(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let un={start:async e=>await up(e)},ui=il(un,function(e={}){return{...un,...e}});async function ua(e,t){return await ui.run(e,t)}function uo(e,t){let r=process.env[e];if(!r)return t;let n=Number.parseInt(r,10);return Number.isInteger(n)&&n>0?n:t}function us(e){let t=n.dirname(e);i.existsSync(t)||i.mkdirSync(t,{recursive:!0}),function(e,t){if(i.existsSync(e)&&!(i.statSync(e).size<t.maxBytes))for(let r=t.maxRotatedFiles;r>=1;r-=1){let t=1===r?e:`${e}.${r-1}`,n=`${e}.${r}`;i.existsSync(t)&&(i.existsSync(n)&&i.unlinkSync(n),i.renameSync(t,n))}}(e,{maxBytes:uo("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:uo("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function ul(e){if(!i.existsSync(e))return{exists:!1,sizeBytes:0};let t=i.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}async function uc(e){var t,r,n,a;let o,s,l,c,{device:d,appBundleId:u,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v}=e,y="macos"===d.platform?"macos":"ios"===d.platform?"device"===d.kind?"ios-device":"ios-simulator":"android",S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},o=ur(t?.maxEntries,25,1,200),s=t?.include??"summary",l=ur(t?.maxPayloadChars,2048,64,16384),c=ur(t?.maxScanLines,4e3,100,2e4),i.existsSync(m)?d1(i.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:o,maxPayloadChars:l,maxScanLines:c}}),_=[],I=await ud({device:d,appBundleId:u,appLogPath:m,appLogState:p});if(I){let e=await dq(d.id,u);if(e){let t=d1(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=d0(t,S,h),_.push((r=I,n=e.recoveredPids,"stale-active"===r.reason?`Session app log stream was still bound to prior Android PID ${r.trackedPid}. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`:`Session app log stream was inactive. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`)))}}if("ios"===d.platform&&"simulator"===d.kind&&u&&0===S.entries.length){let e=await uf({deviceId:d.id,appBundleId:u,startedAt:f,simulatorSetPath:d.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});e&&(e.dump.entries.length>0?(S=d0(e.dump,S,h),_.push(`Recovered ${e.dump.entries.length} iOS simulator HTTP entr${1===e.dump.entries.length?"y":"ies"} from simctl log show (${e.recoveredLineCount} app log lines scanned).`)):e.recoveredLineCount>0&&_.push(`Recovered ${e.recoveredLineCount} recent iOS simulator app log lines from simctl log show, but none looked like HTTP traffic. This app may not emit request URLs, status, or timing into Unified Logging for this repro window.`))}return void 0===p?_.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===_.length&&("ios"===d.platform&&"simulator"===d.kind?_.push("Session app log stream is inactive. The iOS simulator recovery path scanned recent simctl log history, but a fresh logs clear --restart window is still the most reliable repro loop."):_.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===S.entries.length&&_.push("ios"===(a=d).platform&&"simulator"===a.kind?"No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.":"ios"===a.platform?"No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.":"No HTTP(s) entries were found in recent session app logs."),{backend:y,dump:S,notes:_}}async function ud(e){let{device:t,appBundleId:r,appLogPath:a,appLogState:o}=e;if("android"!==t.platform||!r)return null;if(void 0!==o&&"active"!==o)return{reason:"inactive"};if("active"!==o)return null;let s=function(e){let t=function(e){if(!e||!i.existsSync(e))return null;try{return tJ(i.readFileSync(e,"utf8"))}catch{return null}}(e)?.command;if(!t)return null;let r=/(?:^|\s)--pid\s+(\d+)(?:\s|$)/.exec(t);return r?.[1]??null}(n.join(n.dirname(a),tz));if(!s)return null;let l=await dG(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function uu(e,t,r,n){return await ui.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function up({device:e,appBundleId:t,outPath:r,pidPath:n}){us(r);let a=i.createWriteStream(r,{flags:"a"}),o=function(){let e=process.env.AGENT_DEVICE_APP_LOG_REDACT_PATTERNS;if(!e)return[];let t=e.split(",").map(e=>e.trim()).filter(e=>e.length>0),r=[];for(let e of t)try{r.push(RegExp(e,"gi"))}catch{}return r}();if("ios"===e.platform)return"device"===e.kind?await dJ(e.id,a,o,n):await dH(e.id,t,a,o,e.simulatorSetPath,n);if("android"===e.platform)return dU(t),await dV(e.id,t,a,o,n);if("macos"===e.platform)return await dz(t,a,o,n);throw a.end(),new L("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function uf(e){let t=await dB({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:d1(t.text,{path:`${e.appLogPath} (simctl log show recovery)`,backend:"ios-simulator",maxEntries:e.maxEntries,include:e.include,maxPayloadChars:e.maxPayloadChars,maxScanLines:e.maxScanLines}),recoveredLineCount:t.recoveredLineCount}:null}async function um(e){await e.stop(),await dL(e.wait)}async function uh(e,t){let r={},n=[];if(t||n.push("No app bundle is tracked in this session. Run open <app> first for app-scoped logs."),"android"===e.platform){try{let t=await ee(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await ee(e,["shell","pidof",t],{allowFailure:!0,timeoutMs:1e3})).stdout.trim().length>0}catch{r.androidPidVisible=!1}}if("ios"===e.platform&&"simulator"===e.kind)try{let e=await iI(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await iI(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await U("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function uw(e,t){us(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
16
+ `;i.appendFileSync(e,r,"utf8")}function ug(e){let t=n.dirname(e),r=n.basename(e);i.existsSync(t)||i.mkdirSync(t,{recursive:!0}),i.existsSync(e)?i.truncateSync(e,0):i.writeFileSync(e,"","utf8");let a=0;for(let e of i.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let o=e.slice(r.length+1);if(/^\d+$/.test(o))try{i.unlinkSync(n.join(t,e)),a+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:a}}function uv(e,t){if("simulator"!==e.kind)throw new L("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function uy(){await i_("open",["-a","Simulator"],{allowFailure:!0,timeoutMs:1e4})}async function uS(e){let t,r;if("simulator"!==e.kind||"Booted"===await uI(e))return;let n=ei.fromTimeoutMs(18e4);try{await ep(async({deadline:n})=>{if(n?.isExpired())throw new L("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:18e4});let i=Math.max(1e3,n?.remainingMs()??18e4),a=await iI(lc(e,["boot",e.id]),{allowFailure:!0,timeoutMs:i});t={stdout:String(a.stdout??""),stderr:String(a.stderr??""),exitCode:a.exitCode};let o=`${t.stdout}
17
+ ${t.stderr}`.toLowerCase(),s=o.includes("already booted")||o.includes("current state: booted");if(0!==t.exitCode&&!s)throw new L("COMMAND_FAILED","simctl boot failed",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let l=await iI(lc(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:i});if(r={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==r.exitCode)throw new L("COMMAND_FAILED","simctl bootstatus failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let c=await uI(e);if("Booted"!==c)throw new L("COMMAND_FAILED","Simulator is still booting",{state:c})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let n=es({error:e,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});return"IOS_BOOT_TIMEOUT"!==n&&"CI_RESOURCE_STARVATION_SUSPECTED"!==n}},{deadline:n,phase:"boot",classifyReason:e=>es({error:e,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(a){let i=es({error:a,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});throw new L("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:18e4,elapsedMs:n.elapsedMs(),reason:i,hint:ec(i),boot:t,bootstatus:r})}await uy()}async function u_(e){let t=lc(e,["shutdown",e.id]),r=await iI(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===r.exitCode,exitCode:r.exitCode,stdout:String(r.stdout??""),stderr:String(r.stderr??"")}}async function uI(e){let t="string"==typeof e?e:e.id,r="string"==typeof e?ll(["list","devices","-j"]):lc(e,["list","devices","-j"]),n=await iI(r,{allowFailure:!0,timeoutMs:6e4});if(0!==n.exitCode)return null;try{let e=JSON.parse(String(n.stdout??""));for(let r of Object.values(e.devices??{})){let e=r.find(e=>e.udid===t);if(e)return e.state}return null}catch{return null}}let ub="shared_prefs/ReactNativeDevPrefs.xml",uA="debug_http_host",ux="dev_server_https",uN="RCT_jsLocation",uM="RCT_packager_scheme",uD="React Native runtime hints require adb run-as access to the app sandbox. Verify the app is debuggable and the selected package/device are correct.",uE='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function uk(e){return void 0!==E(e)}async function uP(e){let{device:t,appId:r,runtime:n}=e;if(!r)return;let i=E(n);if(i){if("android"===t.platform)return void await uR(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await u$(t,r,i)}}async function uC(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await uO(t,r);"ios"===t.platform&&"simulator"===t.kind&&await uF(t,r)}}async function uR(e,t,r){var n,i,a,o,s,l;let c,d;uV(t);let u=(n=await uT(e,t),i=uA,a=`${r.host}:${r.port}`,c=` <string name="${uj(i)}">${uj(a)}</string>`,uG(uq(n,i),c));o=u,s=ux,l="https"===r.scheme,d=` <boolean name="${uj(s)}" value="${l?"true":"false"}" />`,u=uG(uq(o,s),d),await uL(e,t,u)}async function uO(e,t){uV(t);let r=await uT(e,t),n=uq(r,uA),i=uq(n,ux);i!==r&&await uL(e,t,i)}async function uT(e,t){let r=await ee(e,["shell","run-as",t,"cat",ub],{allowFailure:!0});return 0!==r.exitCode?uE:uU(r.stdout)}async function uL(e,t,r){let n=["shell","run-as",t,"id"],i=await ee(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=uB(i.stdout,i.stderr);throw new L("COMMAND_FAILED",e?`Failed to access Android app sandbox for ${t}`:`Failed to probe Android app sandbox for ${t}`,{package:t,cmd:"adb",args:n,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,hint:e?uD:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await ee(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await ee(e,["shell","run-as",t,"tee",ub],{stdin:r.trimEnd()})}catch(n){let e=O(n);if("TOOL_MISSING"===e.code)throw e;let r=uB("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new L("COMMAND_FAILED",r?`Failed to access Android app sandbox for ${t}`:`Failed to write Android runtime hints for ${t}`,{...e.details??{},package:t,cmd:"adb",phase:"write-runtime-hints",hint:r?uD:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function u$(e,t,r){await iI(lc(e,["spawn",e.id,"defaults","write",t,uN,"-string",`${r.host}:${r.port}`])),await iI(lc(e,["spawn",e.id,"defaults","write",t,uM,"-string",r.scheme]))}async function uF(e,t){await iI(lc(e,["spawn",e.id,"defaults","delete",t,uN]),{allowFailure:!0}),await iI(lc(e,["spawn",e.id,"defaults","delete",t,uM]),{allowFailure:!0})}function uU(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
18
+ `:uE}function uG(e,t){return uU(e).replace("</map>",`${t}
19
+ </map>`)}function uq(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return uU(e).replace(RegExp(`^\\s*<string name="${r}">[\\s\\S]*?<\\/string>\\n?`,"m"),"").replace(RegExp(`^\\s*<boolean name="${r}" value="(?:true|false)"\\s*\\/?>\\n?`,"m"),"")}function uV(e){if("binary"!==em(e))return;let t=ev(e);throw new L("INVALID_ARGS",t,{package:e,hint:t})}function uj(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function uB(e,t){let r=`${e}
20
+ ${t}`.toLowerCase();return["run-as: package not debuggable","run-as: permission denied","run-as: package is unknown","run-as: unknown package","is unknown","is not an application","could not set capabilities"].some(e=>r.includes(e))}let uH=new Map;async function uK(e){let r=await h.mkdtemp(n.join(d.tmpdir(),"agent-device-materialized-"));try{let i=await uJ(e.installablePath,n.join(r,"installable")),a=e.archivePath?await uJ(e.archivePath,n.join(r,"archive")):void 0,o=t.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,c=setTimeout(()=>{uW(o)},s);return uH.set(o,{rootPath:r,installablePath:i,archivePath:a,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:c}),{materializationId:o,installablePath:i,...a?{archivePath:a}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await h.rm(r,{recursive:!0,force:!0}),e}}async function uW(e,t){let r=uH.get(e);if(!r)throw new L("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new L("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),uH.delete(e),await h.rm(r.rootPath,{recursive:!0,force:!0})}async function uz(e){let t=Array.from(uH.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await uW(e)}))}async function uJ(e,t){let r=await h.stat(e);await h.mkdir(t,{recursive:!0});let i=n.join(t,n.basename(e));return r.isDirectory()?await h.cp(e,i,{recursive:!0}):await h.copyFile(e,i),i}async function uX(e,t){let r=["devicectl",...e],n=await iI(r,{allowFailure:!0,timeoutMs:2e4});if(0===n.exitCode)return;let i=String(n.stdout??""),a=String(n.stderr??"");throw new L("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:r,exitCode:n.exitCode,stdout:i,stderr:a,deviceId:t.deviceId,hint:u1(i,a)??u0})}async function uZ(e,t){var r;return r=function(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.bundleIdentifier?e.bundleIdentifier.trim():"";if(!t)continue;let n="string"==typeof e.name&&e.name.trim().length>0?e.name.trim():t,i="string"==typeof e.url&&e.url.trim().length>0?e.url.trim():void 0;r.push({bundleId:t,name:n,url:i})}return r}(await uQ(e,{jsonPrefix:"agent-device-ios-apps",args:["devicectl","device","info","apps","--device",e.id,"--include-all-apps"],failureMessage:"Failed to list iOS apps",parseFailureMessage:"Failed to parse iOS apps list"})),ic(r,t)}async function uY(e){return function(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.executable?e.executable.trim():"",n="number"==typeof e.processIdentifier&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;t&&Number.isFinite(n)&&r.push({executable:t,pid:n})}return r}(await uQ(e,{jsonPrefix:"agent-device-ios-processes",args:["devicectl","device","info","processes","--device",e.id],failureMessage:"Failed to list iOS processes",parseFailureMessage:"Failed to parse iOS process list"}))}async function uQ(e,t){let r=n.join(d.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),i=[...t.args,"--json-output",r],a=await iI(i,{allowFailure:!0,timeoutMs:2e4});try{if(0!==a.exitCode){let r=String(a.stdout??""),n=String(a.stderr??"");throw new L("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:i,exitCode:a.exitCode,stdout:r,stderr:n,deviceId:e.id,hint:u1(r,n)??u0})}return JSON.parse(await o.readFile(r,"utf8"))}catch(r){if(r instanceof L)throw r;throw new L("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await o.unlink(r).catch(()=>{})}}let u0="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function u1(e,t){let r=`${e}
21
+ ${t}`.toLowerCase();return r.includes("device is busy")&&r.includes("connecting")?"iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.":r.includes("coredeviceservice")&&r.includes("timed out")?"CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.":null}let u2=new Map;async function u3(e){var t;let r,n=(r="simulator"===(t=e).kind?t.simulatorSetPath??"":"",JSON.stringify([t.platform,t.kind,t.id,t.target??"",r])),i=u2.get(n);if(void 0!==i){if(i>Date.now())return;u2.delete(n)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:t}=await Promise.resolve(th);await t(e),u4(n);return}if("device"===e.kind){await u5(e.id),u4(n);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./8806.js");await t(e.id),u4(n)}}function u4(e){u2.set(e,Date.now()+5e3)}async function u5(e){let t=n.join(d.tmpdir(),`agent-device-ready-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),r=Math.max(1,Math.ceil(15));try{let n=await iI(["devicectl","device","info","details","--device",e,"--json-output",t,"--timeout",String(r)],{allowFailure:!0,timeoutMs:18e3}),i=String(n.stdout??""),a=String(n.stderr??""),o=await u8(t);if(0===n.exitCode){if(!o.parsed)throw new L("COMMAND_FAILED","iOS device readiness probe failed",{kind:"probe_inconclusive",deviceId:e,stdout:i,stderr:a,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 L("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 L("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:e,stdout:i,stderr:a,exitCode:n.exitCode,tunnelState:o?.tunnelState,hint:u6(i,a)})}catch(t){if(t instanceof L&&"COMMAND_FAILED"===t.code){if("not_ready"===("string"==typeof t.details?.kind?t.details.kind:""))throw t;let r=t.details??{},n=String(r.stdout??""),i=String(r.stderr??""),a=Number(r.timeoutMs??15e3),o=`CoreDevice did not respond within ${a}ms. Keep the device unlocked and trusted, then retry; if it persists restart Xcode and the iOS device.`;throw new L("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:a,stdout:n,stderr:i,hint:n||i?u6(n,i):o},t)}throw new L("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 o.rm(t,{force:!0}).catch(()=>{})}}async function u8(e){try{let t=await o.readFile(e,"utf8"),r=JSON.parse(t),n=function(e){let t=e?.result;if(!t||"object"!=typeof t)return{};let r=t.connectionProperties?.tunnelState,n=t.device?.connectionProperties?.tunnelState,i="string"==typeof r?r:"string"==typeof n?n:void 0;return i?{tunnelState:i}:{}}(r);return{parsed:!0,tunnelState:n.tunnelState}}catch{return{parsed:!1}}}function u6(e,t){let r=u1(e,t);return r||(`${e}
22
+ ${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":u0)}let u9=300,u7=300;function pe(e,t,r){return t||r7(r,r8)?null:ab("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function pt(e){return"string"==typeof e?.session&&e.session.trim().length>0}function pr(e){return"ios"===e.platform&&"simulator"===e.kind}async function pn(e,t){pr(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function pi(e){let t=r7(e.flags,r8)||!e.session?await rY(e.flags??{}):await pa(e.session.device);return!1!==e.ensureReady&&await u3(t),t}async function pa(e){if("ios"!==e.platform||"simulator"!==e.kind||"darwin"!==process.platform)return e;let t={platform:"ios",target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await rY(t)}catch(e){if(!(e instanceof L)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await rY({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function po(e){let t=e.flags?.device?.trim();return t||(e.resolvedDevice?.platform==="android"&&"emulator"===e.resolvedDevice.kind?e.resolvedDevice.name:e.sessionDevice?.platform==="android"&&"emulator"===e.sessionDevice.kind?e.sessionDevice.name:void 0)}function ps(e,t){return!!t&&0===s0(t,e).length}async function pl(e){let t=await ee(e,["emu","kill"],{allowFailure:!0,timeoutMs:15e3});return{success:0===t.exitCode,exitCode:t.exitCode,stdout:String(t.stdout??""),stderr:String(t.stderr??"")}}async function pc(e){let{device:t,shutdownRequested:r}=e;if(r&&(pr(t)||"android"===t.platform&&"emulator"===t.kind))try{return pr(t)?await u_(t):await pl(t)}catch(t){let e=T(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function pd(e){if(await c5(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await iV("dismiss",t).catch(t=>{N({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function pu(e,t){e.appLog&&await um(e.appLog),rV(e.device.platform)&&await pd(e),await uz(t).catch(()=>{})}async function pp(e){let t,{req:r,sessionName:n,logPath:i,sessionStore:a}=e,o=a.get(n);if(!o)return await pf(r,i);o.appLog&&await um(o.appLog),r.positionals&&r.positionals.length>0&&(rV(o.device.platform)&&await pd(o),await nJ(o.device,"close",r.positionals,r.flags?.out,{...ad(i,r.flags,o.appBundleId,o.trace?.outPath)}),await pn(o.device,u9)),rV(o.device.platform)&&(t=(r.positionals?.length??0)>0,!pr(o.device)||t||r.flags?.shutdown||o.recording)?await pd(o):rV(o.device.platform)&&N({level:"debug",phase:"ios_runner_retained_after_close",data:{session:o.name,deviceId:o.device.id}}),uk(a.getRuntimeHints(n))&&o.appBundleId&&await uC({device:o.device,appId:o.appBundleId}).catch(()=>{}),a.recordAction(o,{command:"close",positionals:r.positionals??[],flags:r.flags??{},result:{session:o.name,...eK(`Closed: ${o.name}`)}}),r.flags?.saveScript&&(o.recordSession=!0),a.writeSessionLog(o),await uz(n).catch(()=>{}),a.delete(n);let s=await pc({device:o.device,shutdownRequested:r.flags?.shutdown});return s?{ok:!0,data:eW({session:o.name,shutdown:s},`Closed: ${o.name}`)}:{ok:!0,data:{session:o.name,...eK(`Closed: ${o.name}`)}}}async function pf(e,t){if(!e.positionals||0===e.positionals.length)return ab("SESSION_NOT_FOUND","No active session");let r=await pi({session:void 0,flags:e.flags,ensureReady:!0});return await nJ(r,"close",e.positionals,e.flags?.out,{...ad(t,e.flags)}),await pn(r,u9),{ok:!0,data:{app:e.positionals[0],...eK(`Closed: ${e.positionals[0]}`)}}}async function pm(e,t=5e3){await Promise.all(e.map(async e=>{let r;await new Promise(n=>{r=setTimeout(()=>{!function(e){e.destroyConnections?.();let t="closeAllConnections"in e?e.closeAllConnections:void 0;if("function"==typeof t)return t.call(e);let r="closeIdleConnections"in e?e.closeIdleConnections:void 0;"function"==typeof r&&r.call(e)}(e),n()},t);try{e.close(()=>n())}catch{n()}}),r&&clearTimeout(r)}))}function ph(e){i.existsSync(e)&&i.unlinkSync(e)}function pw(e){if(!i.existsSync(e))return null;try{let t=JSON.parse(i.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function pg(e){let t=pw(e);if(!t||t.pid===process.pid)try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}function pv(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function py(e,t){return new Promise((r,n)=>{e.once("error",n),e.listen(0,"127.0.0.1",()=>{e.off("error",n);let i=e.address();"object"==typeof i&&i?.port?r(i.port):n(new L("COMMAND_FAILED",t))})})}(async function(e={}){let r,a,o=e.env??process.env,s=e.stdout??process.stdout,l=e.stderr??process.stderr,c=e.exit??(e=>process.exit(e)),{baseDir:d,infoPath:u,lockPath:p,logPath:f,sessionsDir:m}=W(o.AGENT_DEVICE_STATE_DIR),h=X(o.AGENT_DEVICE_DAEMON_SERVER_MODE);var g,v,y,S=m;if(i.existsSync(S))for(let e of i.readdirSync(S,{withFileTypes:!0})){if(!e.isDirectory())continue;let t=n.join(S,e.name,tz);if(i.existsSync(t))try{let e=tJ(i.readFileSync(t,"utf8"));if(e&&function(e){let t,r=M(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=D(e.pid);return!!n&&!!((t=n.toLowerCase().replaceAll("\\","/")).includes("log stream")||t.includes("logcat")||t.includes("devicectl device log stream"))&&(!e.command||n===e.command)}(e))try{process.kill(e.pid,"SIGTERM")}catch{}}catch{}finally{tZ(t)}}let _=new tW(m),b=new rG({maxActiveSimulatorLeases:pv(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:pv(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:pv(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:pv(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),x=e6(),E=t.randomBytes(24).toString("hex"),k=M(process.pid)??void 0,C=Z(),R=function(e){let{logPath:t,token:r,androidAdbProvider:n,appleRunnerProvider:i,appleToolProvider:a,linuxToolProvider:o,appLogProvider:s,recordingProvider:l,deviceInventoryProvider:c,trackDownloadableArtifact:d}=e,{sessionStore:u,leaseRegistry:p}=e;async function f(e){let m=!!(e.meta?.debug||e.flags?.verbose);return await I({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:m,logPath:t},async()=>{if(e.token!==r)return{ok:!1,error:T(new L("UNAUTHORIZED","Invalid token"))};try{return await r1(c,async()=>{let c=await dP({req:e,sessionStore:u,leaseRegistry:p});return await c.runLocked(async()=>{let e=dR({scope:c,logPath:t,sessionStore:u,trackDownloadableArtifact:d});if("response"===e.type)return e.response;let m=e.scope;return await nt({req:m.req,existingSession:m.existingSession,providers:{androidAdbProvider:n,appleRunnerProvider:i,appleToolProvider:a,linuxToolProvider:o,appLogProvider:s,recordingProvider:l}},async e=>{let n=await sG({req:m.req,sessionName:m.sessionName,logPath:t,sessionStore:u,leaseRegistry:p,invoke:f,invokeReplayAction:function(e){let{parentScope:t,providerScope:r,handleRequest:n,deps:i}=e;return async e=>{var a,o;if(a=e,o=t,!(a.session===o.sessionName&&eS.replayScopedAction.has(a.command)))return await n(e);if(e.token!==i.token)return{ok:!1,error:T(new L("UNAUTHORIZED","Invalid token"))};try{let a=await dP({req:e,sessionStore:i.sessionStore,leaseRegistry:i.leaseRegistry});if(a.sessionName!==t.sessionName)return await n(e);let o=dR({scope:a,logPath:i.logPath,sessionStore:i.sessionStore,trackDownloadableArtifact:i.trackDownloadableArtifact});if("response"===o.type)return o.response;let s=o.scope,l=await sG({req:s.req,sessionName:s.sessionName,logPath:i.logPath,sessionStore:i.sessionStore,leaseRegistry:i.leaseRegistry,invoke:n,androidAdbExecutor:r.androidAdbExecutor,contextFromFlags:s.handlerContextFromFlags});if(l)return s.finalize(l);return await dO({lockedScope:s,logPath:i.logPath,sessionStore:i.sessionStore})}catch(e){return dT(e)}}}({parentScope:m,providerScope:e,handleRequest:f,deps:{logPath:t,token:r,sessionStore:u,leaseRegistry:p,trackDownloadableArtifact:d}}),androidAdbExecutor:e.androidAdbExecutor,contextFromFlags:m.handlerContextFromFlags});return n?m.finalize(n):await dO({lockedScope:m,logPath:t,sessionStore:u})})})})}catch(e){return dT(e)}})}return f}({logPath:f,token:E,sessionStore:_,leaseRegistry:b,trackDownloadableArtifact:rr}),$=async e=>{await I({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{N({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),A({force:!0})})},F=async e=>{let t=pu(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
23
+ `)});await Promise.race([t,eB(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
24
+ `)})]),_.writeSessionLog(e),_.delete(e.name)},U=async()=>{let e=_.toArray();await Promise.all(e.map(F))},G=async()=>{let e,t,r=[];if("http"!==h){let t,n,i=(t=new Set,(n=w.createServer(e=>{t.add(e),e.on("close",()=>t.delete(e));let r="",n=0,i=new Set,a=!1,o=()=>{if(!a&&0!==n){for(let e of(a=!0,i))t4(e);N({level:"warn",phase:"request_client_disconnected",data:{inFlightRequests:n}}),(async()=>{try{let e=Date.now()+15e3;for(;n>0&&Date.now()<e;){let{abortAllIosRunnerSessions:e}=await Promise.resolve(tf);if(await e(),n<=0)break;await eB(200)}}catch(e){N({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e),inFlightRequests:n}})}})()}};e.setEncoding("utf8"),e.on("close",o),e.on("error",o),e.on("data",async t=>{let a=j(r,t);for(let t of(r=a.buffer,a.lines)){let r,a;n+=1;let o=!1;try{let n=JSON.parse(t);if(o=K(n),a=t2(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),t3(a),t8(a))throw t9();r=await rm(o?t=>{e.destroyed||e.write(Y(t))}:void 0,async()=>await R(n))}catch(e){r={ok:!1,error:T(e)}}finally{n-=1,a&&(i.delete(a),t5(a))}e.destroyed||e.write(o?B(r):`${JSON.stringify(r)}
25
+ `)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await py(i,"Failed to bind socket server")}if("socket"!==h){let e=await rC({handleRequest:R,token:E});r.push(e),t=await py(e,"Failed to bind HTTP server")}return{servers:r,socketPort:e,httpPort:t}};if(!function(e,t,r){i.existsSync(e)||i.mkdirSync(e,{recursive:!0});let n=JSON.stringify(r,null,2),a=()=>{try{return i.writeFileSync(t,n,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(a())return!0;let o=pw(t);if(o?.pid&&o.pid!==process.pid&&P(o.pid,o.processStartTime))return!1;try{i.unlinkSync(t)}catch{}return a()}(d,p,{pid:process.pid,version:x,startedAt:Date.now(),processStartTime:k}))return l.write("Daemon lock is held by another process; exiting.\n"),c(0),null;let q=[];try{let e,t=await G();q=t.servers,r=t.socketPort,a=t.httpPort,g=r,v=a,y={socketPort:g,httpPort:v,token:E,version:x,codeSignature:C,processStartTime:k},i.existsSync(d)||i.mkdirSync(d,{recursive:!0}),i.writeFileSync(f,""),e=y.socketPort&&y.httpPort?"dual":y.httpPort?"http":"socket",i.writeFileSync(u,JSON.stringify({port:y.socketPort,httpPort:y.httpPort,transport:e,token:y.token,pid:process.pid,version:y.version,codeSignature:y.codeSignature,processStartTime:y.processStartTime,stateDir:d},null,2),{mode:384}),g&&s.write(`AGENT_DEVICE_DAEMON_PORT=${g}
26
26
  `),v&&s.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${v}
27
27
  `)}catch(t){let e=O(t);for(let t of(l.write(`Daemon error: ${e.message}
28
- `),q))try{t.close(()=>{})}catch{}return u2(u),u4(p),d(1),null}let B=!1,W=async(e={})=>{if(B)return;B=!0,e.cause&&await $(e.cause),await u1(q),await U();let{stopAllIosRunnerSessions:t}=await Promise.resolve(tp);await t(),u2(u),u4(p),d(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{W()}),process.on("SIGTERM",()=>{W()}),process.on("SIGHUP",()=>{W()}),process.on("uncaughtException",e=>{let t=e instanceof L?e:O(e);l.write(`Daemon error: ${t.message}
29
- `),W({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof L?t:O(t);l.write(`Daemon error: ${r.message}
30
- `),W({exitCode:1,cause:t})})),{httpPort:a,shutdown:W,socketPort:r,token:D}})().catch(e=>{let t=O(e);process.stderr.write(`Daemon error: ${t.message}
31
- `),process.exit(1)});export{uP as IOS_DEVICECTL_DEFAULT_HINT,l6 as IOS_RUNNER_CONTAINER_BUNDLE_IDS,uU as IOS_SIMULATOR_POST_CLOSE_SETTLE_MS,uG as IOS_SIMULATOR_POST_OPEN_SETTLE_MS,nd as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,nl as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,tK as SessionStore,oX as annotateScreenshotWithRefs,cK as withAppLogProvider,c3 as appendAppLogMarker,ul as applyRuntimeHintsToApp,sW as buildSessionRecoveryHint,lr as buildSimctlArgs,ln as buildSimctlArgsForDevice,aQ as buildSnapshotState,np as buttonTag,or as captureAndroidUiHierarchyXml,aB as captureSnapshot,uA as cleanupRetainedMaterializedPaths,ra as cleanupUploadedArtifact,c4 as clearAppLogFiles,t4 as clearRequestCanceled,ud as clearRuntimeHintsFromApp,ad as context_contextFromFlags,a5 as createDaemonRuntimeSessionStore,d1 as createLocalAppleRunnerProvider,t6 as createRequestCanceledError,is as createScopedProvider,nz as dispatchCommand,rm as emitRequestProgress,oE as ensureAndroidBlockingSystemDialogReady,uO as ensureDeviceReady,aS as errorResponse,il as filterAppleAppsByBundlePrefix,tj as formatPortableActionLine,tT as formatScriptActionSummary,tP as formatScriptStringLiteral,aa as getActiveAndroidSnapshotFreshness,cJ as getAppLogPathMetadata,nu as getClickButtonValidationError,t8 as getRequestSignal,dq as getRunnerSessionSnapshot,c7 as getSimulatorState,si as getSnapshotReferenceFrame,uQ as handleCloseCommand,us as hasRuntimeTransportHints,d3 as hasScopedAppleRunnerProvider,iy as hasScopedAppleToolProvider,tS as inferFillText,rq as isApplePlatform,tM as isClickLikeCommand,io as isCommandSupportedOnDevice,s0 as isImplicitSessionScopeConflict,as as isNavigationSensitiveAction,t5 as isRequestCanceled,tE as isTouchTargetCommand,r1 as listDeviceInventory,uE as listIosDeviceApps,uD as listIosDeviceProcesses,iB as runMacOsPressAction,iV as runMacOsReadTextAction,ai as markAndroidSnapshotFreshness,ac as markPendingInteractionOutcome,t3 as markRequestCanceled,rG as normalizePlatformSelector,tq as parseReplayOpenFlags,tU as parseReplayRuntimeFlags,tF as parseReplaySeriesFlags,lR as parseXmlDocumentSync,ri as prepareUploadedArtifact,d9 as prewarmIosRunnerSession,iU as quitMacOsApp,iI as readApplePlistJson,cX as readSessionNetworkCapture,ss as recordTouchVisualizationEvent,oM as recoverAndroidBlockingSystemDialog,uK as refreshSessionDeviceIfNeeded,t2 as registerRequestAbort,uq as requireSessionOrExplicitSelector,c5 as requireSimulatorDevice,uW as resolveAndroidEmulatorAvdName,d2 as resolveAppleRunnerProvider,rV as resolveAppleSimulatorSetPathForSelector,ig as resolveAppleToolProvider,nc as resolveClickButton,uH as resolveCommandDevice,iF as resolveFrontmostMacOsApp,sY as resolveImplicitSessionScope,uC as resolveIosDevicectlHint,s1 as resolveLeaseScope,iJ as resolveLinuxToolProvider,nH as resolvePayloadInput,sZ as resolvePublicSessionName,t1 as resolveRequestTrackingId,a3 as resolveSnapshotScope,rZ as resolveTargetDevice,ub as retainMaterializedPaths,c2 as runAppLogDoctor,iS as runAppleToolCommand,uM as runIosDevicectl,iZ as runLinuxToolCommand,iq as runMacOsAlertAction,iG as runMacOsPermissionAction,iH as runMacOsScreenshotAction,ij as runMacOsSnapshotAction,li as runSimctlForDevice,i_ as runXcrun,d6 as runIosRunnerCommand,d5 as withAppleRunnerProvider,dH as abortAllIosRunnerSessions,dK as stopAllIosRunnerSessions,uz as selectorTargetsSessionDevice,sQ as sessionMatchesScope,uj as session_device_utils_hasExplicitSessionFlag,a4 as setSessionSnapshot,uB as settleIosSimulator,nm as shouldUseSynthesizedIosDrag,c9 as shutdownSimulator,c6 as ensureBootedSimulator,on as snapshotAndroid,ae as snapshotLinux,at as readLinuxTextAtPoint,cY as startAppLog,c1 as stopAppLog,dB as stopIosRunnerSession,af as stripInternalInteractionOutcomeFlags,iv as withAppleToolProvider,iX as withLinuxToolProvider,t_ as uniqueStrings,lO as visitXmlPlistEntries,sH as withKeyedLock};
28
+ `),q))try{t.close(()=>{})}catch{}return ph(u),pg(p),c(1),null}let V=!1,H=async(e={})=>{if(V)return;V=!0,e.cause&&await $(e.cause),await pm(q),await U();let{stopAllIosRunnerSessions:t}=await Promise.resolve(tf);await t(),ph(u),pg(p),c(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{H()}),process.on("SIGTERM",()=>{H()}),process.on("SIGHUP",()=>{H()}),process.on("uncaughtException",e=>{let t=e instanceof L?e:O(e);l.write(`Daemon error: ${t.message}
29
+ `),H({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof L?t:O(t);l.write(`Daemon error: ${r.message}
30
+ `),H({exitCode:1,cause:t})})),{httpPort:a,shutdown:H,socketPort:r,token:E}})().catch(e=>{let t=O(e);process.stderr.write(`Daemon error: ${t.message}
31
+ `),process.exit(1)});export{u0 as IOS_DEVICECTL_DEFAULT_HINT,cc as IOS_RUNNER_CONTAINER_BUNDLE_IDS,u9 as IOS_SIMULATOR_POST_CLOSE_SETTLE_MS,u7 as IOS_SIMULATOR_POST_OPEN_SETTLE_MS,nd as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,nc as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,tW as SessionStore,o2 as annotateScreenshotWithRefs,ua as withAppLogProvider,uw as appendAppLogMarker,uP as applyRuntimeHintsToApp,sQ as buildSessionRecoveryHint,ll as buildSimctlArgs,lc as buildSimctlArgsForDevice,a5 as buildSnapshotState,nf as buttonTag,ol as captureAndroidUiHierarchyXml,aW as captureSnapshot,uW as cleanupRetainedMaterializedPaths,ro as cleanupUploadedArtifact,ug as clearAppLogFiles,t5 as clearRequestCanceled,uC as clearRuntimeHintsFromApp,ad as context_contextFromFlags,ot as createDaemonRuntimeSessionStore,dc as createLocalAppleRunnerProvider,t9 as createRequestCanceledError,il as createScopedProvider,nJ as dispatchCommand,rh as emitRequestProgress,oO as ensureAndroidBlockingSystemDialogReady,u3 as ensureDeviceReady,ab as errorResponse,ic as filterAppleAppsByBundlePrefix,tj as formatPortableActionLine,tL as formatScriptActionSummary,tC as formatScriptStringLiteral,ao as getActiveAndroidSnapshotFreshness,ul as getAppLogPathMetadata,np as getClickButtonValidationError,t6 as getRequestSignal,c2 as getRunnerSessionSnapshot,uI as getSimulatorState,sd as getSnapshotReferenceFrame,pp as handleCloseCommand,uk as hasRuntimeTransportHints,iS as hasScopedAppleToolProvider,t_ as inferFillText,rV as isApplePlatform,tD as isClickLikeCommand,is as isCommandSupportedOnDevice,s8 as isImplicitSessionScopeConflict,al as isNavigationSensitiveAction,t8 as isRequestCanceled,tE as isTouchTargetCommand,r2 as listDeviceInventory,uZ as listIosDeviceApps,uY as listIosDeviceProcesses,iH as runMacOsPressAction,iB as runMacOsReadTextAction,aa as markAndroidSnapshotFreshness,au as markPendingInteractionOutcome,ay as markPostGestureStabilization,t4 as markRequestCanceled,rq as normalizePlatformSelector,tV as parseReplayOpenFlags,tG as parseReplayRuntimeFlags,tU as parseReplaySeriesFlags,lU as parseXmlDocumentSync,dM as prepareIosRunner,ra as prepareUploadedArtifact,dN as prewarmIosRunnerSession,iG as quitMacOsApp,ib as readApplePlistJson,uc as readSessionNetworkCapture,sf as recordTouchVisualizationEvent,oR as recoverAndroidBlockingSystemDialog,pa as refreshSessionDeviceIfNeeded,t3 as registerRequestAbort,pe as requireSessionOrExplicitSelector,uv as requireSimulatorDevice,po as resolveAndroidEmulatorAvdName,dd as resolveAppleRunnerProvider,rB as resolveAppleSimulatorSetPathForSelector,iv as resolveAppleToolProvider,nu as resolveClickButton,pi as resolveCommandDevice,iU as resolveFrontmostMacOsApp,s4 as resolveImplicitSessionScope,u1 as resolveIosDevicectlHint,s6 as resolveLeaseScope,iX as resolveLinuxToolProvider,nK as resolvePayloadInput,s3 as resolvePublicSessionName,t2 as resolveRequestTrackingId,cs as resolveRunnerAppBundleId,a7 as resolveSnapshotScope,rY as resolveTargetDevice,uK as retainMaterializedPaths,uh as runAppLogDoctor,i_ as runAppleToolCommand,uX as runIosDevicectl,iY as runLinuxToolCommand,iV as runMacOsAlertAction,iq as runMacOsPermissionAction,iK as runMacOsScreenshotAction,ij as runMacOsSnapshotAction,ld as runSimctlForDevice,iI as runXcrun,dx as runIosRunnerCommand,du as withAppleRunnerProvider,c8 as abortAllIosRunnerSessions,c6 as stopAllIosRunnerSessions,ps as selectorTargetsSessionDevice,s5 as sessionMatchesScope,pt as session_device_utils_hasExplicitSessionFlag,oe as setSessionSnapshot,pn as settleIosSimulator,nh as shouldUseSynthesizedIosDrag,u_ as shutdownSimulator,uS as ensureBootedSimulator,oc as snapshotAndroid,at as snapshotLinux,ar as readLinuxTextAtPoint,uu as startAppLog,um as stopAppLog,c5 as stopIosRunnerSession,am as stripInternalInteractionFlags,iy as withAppleToolProvider,iZ as withLinuxToolProvider,tI as uniqueStrings,lG as visitXmlPlistEntries,sZ as withKeyedLock};