agent-device 0.17.10 → 0.18.0

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 (48) hide show
  1. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.10.apk → agent-device-android-multitouch-helper-0.18.0.apk} +0 -0
  2. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.0.apk.sha256 +1 -0
  3. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.10.manifest.json → agent-device-android-multitouch-helper-0.18.0.manifest.json} +4 -4
  4. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.10.apk → agent-device-android-snapshot-helper-0.18.0.apk} +0 -0
  5. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.0.apk.sha256 +1 -0
  6. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.10.manifest.json → agent-device-android-snapshot-helper-0.18.0.manifest.json} +6 -6
  7. package/dist/src/1848.js +4 -0
  8. package/dist/src/2577.js +1 -1
  9. package/dist/src/2948.js +20 -20
  10. package/dist/src/4291.js +1 -1
  11. package/dist/src/4723.js +1 -1
  12. package/dist/src/5341.js +1 -0
  13. package/dist/src/5643.js +1 -0
  14. package/dist/src/6918.js +1 -1
  15. package/dist/src/8275.js +2 -2
  16. package/dist/src/8936.js +1 -0
  17. package/dist/src/9414.js +1 -0
  18. package/dist/src/9581.js +4 -4
  19. package/dist/src/9722.js +32 -37
  20. package/dist/src/9919.js +5 -5
  21. package/dist/src/apple.js +1 -1
  22. package/dist/src/apps.js +10 -10
  23. package/dist/src/batch.d.ts +20 -3
  24. package/dist/src/batch.js +1 -1
  25. package/dist/src/cli-help.js +49 -32
  26. package/dist/src/cli.js +22 -25
  27. package/dist/src/contracts.d.ts +14 -0
  28. package/dist/src/device-ready.js +2 -0
  29. package/dist/src/find.js +1 -1
  30. package/dist/src/index.d.ts +67 -16
  31. package/dist/src/interaction.js +1 -1
  32. package/dist/src/internal/bin.js +1 -1
  33. package/dist/src/lease.js +1 -1
  34. package/dist/src/metro.js +1 -1
  35. package/dist/src/react-native.js +1 -1
  36. package/dist/src/record-trace-recording.js +3 -3
  37. package/dist/src/remote-config.d.ts +17 -11
  38. package/dist/src/selector-runtime.js +1 -1
  39. package/dist/src/session.js +11 -8
  40. package/dist/src/simulator.js +2 -0
  41. package/dist/src/snapshot.js +1 -1
  42. package/package.json +1 -1
  43. package/server.json +2 -2
  44. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.10.apk.sha256 +0 -1
  45. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.10.apk.sha256 +0 -1
  46. package/dist/src/2133.js +0 -1
  47. package/dist/src/5628.js +0 -1
  48. package/dist/src/8358.js +0 -4
package/dist/src/9722.js CHANGED
@@ -1,38 +1,33 @@
1
- let e;import{__webpack_require__ as t}from"./rslib-runtime.js";import r,{createHash as n}from"node:crypto";import i from"node:path";import a,{existsSync as o,promises as s}from"node:fs";import l from"node:http";import{fileURLToPath as d,pathToFileURL as c}from"node:url";import"node:https";import u from"node:os";import{once as p}from"node:events";import{Transform as f}from"node:stream";import{pipeline as m}from"node:stream/promises";import{AsyncLocalStorage as h}from"node:async_hooks";import w from"node:fs/promises";import g from"node:net";import{setTimeout as v}from"node:timers/promises";import{resolveUserPath as y}from"./9612.js";import{SCREENSHOT_ACTION_FLAG_KEYS as S,SCROLL_DIRECTIONS as b,parseScrollDirection as A,isStringMember as I,isReactNativeCollapsedWarningWrapperWithVisibleBanner as _,deriveMobileSnapshotHiddenContentHints as x,resolveClickButton as M,inferVerticalScrollIndicatorDirections as N,parsing_stripUndefined as D,normalizeScrollDurationMs as k,withSuccessText as P,honoredScrollDurationMs as E,runScrollEdgePasses as C,splitNonEmptyTrimmedLines as R,annotateCoveredSnapshotNodes as O,parseSwipePreset as T,analyzeReactNativeOverlay as L,readLocationCoordinate as $,getClickButtonValidationError as F,areRectsApproximatelyEqual as U,isSystemScrollIndicatorLabel as G,formatScrollEdgeMessage as q,SWIPE_PATTERNS as j,successText as V,assertExclusiveScrollDistanceInputs as B,screenshotOptionsFromFlags as H,captureScrollEdgeState as K,normalizeSnapshotTree as W,isReactNativeCollapsedWarningWrapperCandidate as X,screenshotFlagsFromOptions as z,snapshotCaptureAnnotationsFrom as J,requireIntInRange as Z,inferGestureReferenceFrame as Y,parseStringMember as Q,parseDeviceRotation as ee,buildScrollGesturePlan as et,buildSwipePresetGesturePlan as er}from"./2948.js";import{withDiagnosticsScope as en,getDiagnosticsMeta as ei,flushDiagnosticsToSessionFile as ea,withDiagnosticTimer as eo,updateDiagnosticsScope as es,emitDiagnostic as el}from"./432.js";import{prewarmPngWorker as ed,isKeyboardAction as ec,formatScriptArg as eu,encodePngAsync as ep,acquireProcessLock as ef,terminatePngWorker as em,appendScriptSeriesFlags as eh,decodePngAsync as ew,formatScriptStringLiteral as eg,formatPortableActionLine as ev,timingSafeStringEqual as ey,createAgentDevice as eS,localCommandPolicy as eb,isTouchTargetCommand as eA,mapManagedAgentBrowserError as eI,resolveAgentBrowserTool as e_,isClickLikeCommand as ex,findMistargetedTypeRefToken as eM}from"./2577.js";import{readProcessStartTime as eN,readProcessCommand as eD,resolveRuntimeTransportHints as ek,isProcessGroupAlive as eP,isAgentDeviceDaemonProcess as eE,isProcessAlive as eC}from"./5628.js";import{toAppErrorCode as eR,asAppError as eO,normalizeError as eT,AppError as eL}from"./733.js";import{runCmdBackground as e$,runCmdStreaming as eF,runCmd as eU,runCmdSync as eG,resolveExecutableOverridePath as eq,whichCmd as ej}from"./8875.js";import{buildDaemonHealthPayload as eV,consumeTextLines as eB,serializeDaemonResponseEnvelope as eH,normalizeTenantId as eK,shouldStreamRequestProgress as eW,resolveDaemonPaths as eX,resolveSessionIsolationMode as ez,shellQuoteIfNeeded as eJ,resolveDaemonServerMode as eZ,recordSnapshotTiming as eY,resolveDaemonCodeSignature as eQ,serializeDaemonProgressEnvelope as e0,serializeDaemonRpcResponseEnvelope as e1}from"./8358.js";import{sleep as e2}from"./5560.js";import{isApplePlatform as e3,resolveAppleSimulatorSetPathForSelector as e5,normalizePlatformSelector as e4,resolveDevice as e8,resolveApplePlatformName as e6,matchesPlatformSelector as e9}from"./5910.js";import{runAndroidAdb as e7,resolveIosSimulatorDeviceSetPath as te,getAndroidBlockingDialogFocus as tt,withRetry as tr,Deadline as tn,isEnvTruthy as ti,openAndroidApp as ta,classifyBootFailure as to,streamAndroidLogcatWithAdb as ts,bootFailureHint as tl,androidDeviceForSerial as td,parseSerialAllowlist as tc,retryWithPolicy as tu,getAndroidAppState as tp,classifyAndroidAppTarget as tf,captureAndroidLogcatWithAdb as tm,resolveAndroidSerialAllowlist as th,isDeepLinkTarget as tw,formatAndroidInstalledPackageRequiredMessage as tg}from"./3340.js";import{PUBLIC_COMMANDS as tv,INTERNAL_COMMANDS as ty,GESTURE_SUBCOMMAND_ERROR as tS}from"./2133.js";import{findNearestAncestor as tb,normalizeType as tA,pruneGroupNodes as tI,findNodeByLabel as t_,resolveRefLabel as tx}from"./9836.js";import{snapshotPresentationOptionsFromFlags as tM,normalizeRef as tN,findNodeByRef as tD,buildSnapshotPresentationKey as tk,centerOfRect as tP,attachRefs as tE}from"./4291.js";import{isScrollableType as tC}from"./6024.js";import{parseUiHierarchy as tR,getAndroidSnapshotHelperSessionDeviceKey as tO,parseUiHierarchyTree as tT,ensureAndroidSnapshotHelper as tL,captureAndroidSnapshotWithHelper as t$,captureAndroidSnapshotWithHelperSession as tF,stopAndroidSnapshotHelperSessionForDevice as tU,parseAndroidSnapshotHelperManifest as tG,androidUiNodes as tq,forgetAndroidSnapshotHelperInstall as tj,stopAndroidSnapshotHelperSession as tV,buildUiHierarchySnapshot as tB}from"./7394.js";import{readVersion as tH,findProjectRoot as tK}from"./1404.js";import{resolveAndroidAdbProvider as tW,resolveAndroidAdbExecutor as tX}from"./2954.js";import{applyCommandDefaults as tz}from"./9581.js";var tJ,tZ,tY={};t.r(tY),t.d(tY,{IH:()=>fo,ug:()=>fs,sE:()=>p6,Bx:()=>p7,hQ:()=>p9,WX:()=>fa,Co:()=>ft,wg:()=>fi,withAppLogProvider:()=>p5});var tQ={};t.r(tQ),t.d(tQ,{IO:()=>af,LB:()=>ap,xY:()=>ah,eN:()=>am,runMacOsPressAction:()=>av,runMacOsReadTextAction:()=>ag,rR:()=>ay,r5:()=>aw});var t0={};t.r(t0),t.d(t0,{bu:()=>dY,abortAllIosRunnerSessions:()=>uv,hv:()=>um,Nr:()=>u1,gE:()=>u0,FS:()=>dJ,runIosRunnerCommand:()=>uQ,stopAllIosRunnerSessions:()=>uy,yA:()=>ug});var t1={};t.r(t1),t.d(t1,{v:()=>uC,M:()=>uR,withAppleRunnerProvider:()=>uO});var t2={};t.r(t2),t.d(t2,{ensureBootedSimulator:()=>hC,SA:()=>hO,EB:()=>hP,N3:()=>hR});var t3={};t.r(t3),t.d(t3,{qx:()=>i3,Ly:()=>i8,Gr:()=>i1,vT:()=>i5,Cc:()=>i4,withAppleToolProvider:()=>i2});var t5={};t.r(t5),t.d(t5,{readLinuxTextAtPoint:()=>aU,r:()=>aF});var t4={};function t8(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}t.r(t4),t.d(t4,{uK:()=>aI,nE:()=>ax,withLinuxToolProvider:()=>a_});let t6=["platform","device","udid","serial","out","verbose","metroHost","metroPort","bundleUrl","launchUrl","snapshotInteractiveOnly","snapshotDepth","snapshotScope","snapshotRaw",...S,"relaunch","saveScript","noRecord","fps","quality","hideTouches","count","intervalMs","delayMs","holdMs","jitterPx","doubleTap","clickButton","pauseMs","pattern"];function t9(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 t7(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}class re{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let r=i.dirname(t);a.existsSync(r)||a.mkdirSync(r,{recursive:!0});let n=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&&rt(e.command))return ex(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=t9(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(!rt(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,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=${eg(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,ex(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(eu(r)),rr(e,t),eh(e,t),e.join(" ");if(1===t.positionals.length)return e.push(eu(r)),eh(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(eu(r)),rr(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(eu(n)),eh(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(eu(r)),e.push(eu(n)),n.startsWith("@")&&rr(e,t),e.join(" ")}(t,r):void 0);return n||ev(e)}(e));return`${n.join("\n")}
2
- `}(e);return a.writeFileSync(t,n),{written:!0,path:t}}catch(r){return el({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 y(e.saveScriptPath,{cwd:void 0});a.existsSync(this.sessionsDir)||a.mkdirSync(this.sessionsDir,{recursive:!0});let t=t8(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${r}.ad`)}}function rt(e){return eA(e)||"fill"===e||"get"===e}function rr(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(eu(r))}class rn{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new re(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=y(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 t6)void 0!==e[r]&&(t[r]=e[r]);return t}(t.flags),result:t.result}),el({level:"debug",phase:"record_action",data:{command:t.command,session:e.name}}))}writeSessionLog(e){let t=this.scriptWriter.write(e);t.written&&el({level:"info",phase:"session_script_written",data:{session:e.name,path:t.path}})}defaultTracePath(e){let t=t8(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return i.join(this.sessionsDir,t8(e))}ensureSessionDir(e){let t=this.resolveSessionDir(e);return a.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return i.join(this.resolveSessionDir(e),"app.log")}resolveAppLogPidPath(e){return i.join(this.resolveSessionDir(e),"app-log.pid")}static expandHome(e,t){return y(e,{cwd:t})}}function ri(e){return i.join(e,"runner.log")}function ra(e,t){let r=t8(t&&t.length>0?t:"unknown");return i.join(e,"requests",`${r}.ndjson`)}let ro="app-log.pid";function rs(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 rl(e,t){if(!e)return;let r=i.dirname(e);a.existsSync(r)||a.mkdirSync(r,{recursive:!0});let n={pid:t,startTime:eN(t)??void 0,command:eD(t)??void 0};a.writeFileSync(e,`${JSON.stringify(n)}
3
- `)}function rd(e){if(e&&a.existsSync(e))try{a.unlinkSync(e)}catch{}}let rc=new Set,ru=new Map,rp="request_canceled",rf="request canceled";function rm(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 rh(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++}}(ru);let t=new AbortController;ru.set(e,t),rc.has(e)&&t.abort()}function rw(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++}}(rc),rc.add(e),ru.get(e)?.abort())}function rg(e){e&&(rc.delete(e),ru.delete(e))}function rv(e){return!!e&&rc.has(e)}function ry(e){if(e)return ru.get(e)?.signal}function rS(){return new eL("COMMAND_FAILED",rf,{reason:rp})}function rb(e){if(rv(e))throw rS()}function rA(e){return e instanceof eL&&"COMMAND_FAILED"===e.code&&(e.details?.reason===rp||e.message===rf)}let rI=new Map;function r_(e){let t=r.randomUUID(),n=setTimeout(()=>{rx(t)},9e5);return n.unref(),rI.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),t}function rx(e){let t=rI.get(e);if(t&&(clearTimeout(t.timer),rI.delete(e),t.deleteAfterDownload))try{a.rmSync(t.artifactPath,{force:!0})}catch{}}let rM=new Map;function rN(e,t){let r=rM.get(e);if(!r)throw new eL("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eL("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function rD(e){let t=rM.get(e);t&&(clearTimeout(t.timer),rM.delete(e),a.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function rk(e){let t=await rP(e);await eU("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=i.join(e.tempDir,t);if(!a.existsSync(r))throw new eL("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function rP(e){let t=await eU("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new eL("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 eL("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(rE),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 eL("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new eL("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 eL("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 eL("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 eL("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await eU("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new eL("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rE(e){if(e.includes("\0"))throw new eL("INVALID_ARGS",`Invalid archive entry: ${e}`);if(i.posix.isAbsolute(e))throw new eL("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=i.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new eL("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function rC(e,t){return new Promise((r,n)=>{let i,o=!1,s=0,l=a.createWriteStream(t),d=e=>{if(!o){if(o=!0,i&&clearTimeout(i),e)return void rR(l,t).finally(()=>n(e));r()}},c=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new eL("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 f({transform(e,t,r){c();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new eL("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{d(new eL("COMMAND_FAILED","Artifact transfer was interrupted"))}),c(),m(e,u,l).then(()=>d(),e=>d(e))})}async function rR(e,t){if(e.destroy(),!e.closed)try{await p(e,"close")}catch{}await a.promises.rm(t,{force:!0}).catch(()=>{})}async function rO(e){let t,r=e.headers["x-artifact-type"],n=e.headers["x-artifact-filename"];if(!r||!n)throw new eL("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new eL("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 eL("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let o=function(e){let t=e.trim(),r=i.basename(t);if(!r||"."===r||".."===r)throw new eL("INVALID_ARGS",`Invalid artifact filename: ${e}`);return r}(n),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"),a.mkdtempSync(i.join(u.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===r){let t=i.join(s,o);return await rC(e,t),{artifactPath:t,tempDir:s}}let t=i.join(s,"artifact.tar");await rC(e,t);let n=await rk({archivePath:t,tempDir:s,platform:"ios",expectedRootName:o});return a.rmSync(t,{force:!0}),{artifactPath:n,tempDir:s}}catch(e){throw a.rmSync(s,{recursive:!0,force:!0}),e}}let rT=new h,rL=new h;async function r$(e,t){return await rT.run(e,t)}function rF(e){rT.getStore()?.(e)}async function rU(e,t){return await rL.run(e,t)}function rG(){return rL.getStore()}let rq=new Set(["replay","test"]),rj=new Set(["agent_device.command","agent-device.command"]),rV=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rB=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rH={"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"},rK=new Set([...rj,...rV,...rB,...Object.keys(rH)]);function rW(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rX(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function rz(e,t){e.destroyed||(e.write(e1(t)),e.end())}function rJ(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rZ(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 rY(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rQ(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function r0(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new eL("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function r1(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new eL("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function r2(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=eT(new eL("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rW(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=eT(new eL(eR(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rW(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=eK(r.tenantId);if(!e){let e=eT(new eL("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rW(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function r3(){let e,t=process.env.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let r=process.env.AGENT_DEVICE_HTTP_AUTH_EXPORT||"default",n=i.isAbsolute(t)?t:i.resolve(t);try{e=await import(c(n).href)}catch(e){throw new eL("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:n,error:e instanceof Error?e.message:String(e)})}let a=e[r];if("function"!=typeof a)throw new eL("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:n,exportName:r});return a}async function r5(e){let t=await r3(),{handleRequest:r,token:n}=e;return l.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify(eV("agent-device-daemon")));return}if("POST"===e.method&&"/upload"===e.url)return void r4(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void r8(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||rX(i,rW(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rX(i,rW(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rX(i,rW(n.id??null,-32600,"Invalid Request"),400);if(!rK.has(n.method))return void rX(i,rW(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rX(i,rW(n.id??null,-32602,"Invalid params"),400);let s=!1;try{var l,d;let a=n.params,c=function(e,t,r){if(rj.has(e))return{token:rZ(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(rV.has(e)){let e,n=rY(t,"platform");if("ios"!==n&&"android"!==n)throw new eL("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:rZ(t,r),session:rY(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rY(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new eL("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new eL("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 eL("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 eL("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 eL("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=r0(e,"owner"),n=r0(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new eL("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new eL("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new eL("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:r1(e,"artifactId")}:(a&&(t=r1(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:r0(e,"artifactName")})}(t);throw new eL("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:rQ(t,"retentionMs")}}}if(rB.has(e)){let e=rY(t,"materializationId")?.trim();if(!e)throw new eL("INVALID_ARGS","Invalid params: materializationId is required");return{token:rZ(t,r),session:rY(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rY(t,"requestId"),materializationId:e}}}let n=rH[e];if(n)return{token:rZ(t,r),session:rY(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rY(t,"tenantId")??rY(t,"tenant"),runId:rY(t,"runId"),leaseId:rY(t,"leaseId"),leaseTtlMs:rQ(t,"ttlMs"),leaseBackend:rY(t,"backend")}};throw new eL("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(l=n.method,rj.has(l)&&("string"!=typeof c.command||0===c.command.length))return void rX(i,rW(n.id??null,-32602,"Invalid params: command is required"),400);o=rm(c.meta?.requestId,n.id),c.meta={...c.meta,requestId:o},rh(o);let u=await r2(t,{headers:e.headers,rpcRequest:n,daemonRequest:c});if(!u.ok)return void rX(i,u.response,u.statusCode);u.tenantId&&(c.meta={...c.meta,tenantId:u.tenantId,sessionIsolation:c.meta?.sessionIsolation??c.flags?.sessionIsolation??"tenant"});let p=(d=c,d.flags?.platform!=="android"&&(d.flags?.platform==="ios"||rq.has(d.command))),f=!1,m=()=>{s||i.writableFinished||f||(f=!0,rw(o),el({level:"warn",phase:"request_client_disconnected",data:{requestId:o,abortIosRunnerSessions:p}}),p&&r6(o))};if(e.on("aborted",m),i.on("close",()=>{i.headersSent&&m()}),(e.aborted||i.destroyed&&i.headersSent)&&m(),eW(c)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await r$(e=>{!i.destroyed&&i.write(e0(e))},async()=>await r(c));s=!0;let t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rW(n.id??null,-32e3,e.error.message,e.error);rz(i,t);return}let h=await r(c);if(s=!0,h.ok)return void rX(i,{jsonrpc:"2.0",id:n.id??null,result:h});rX(i,rW(n.id??null,-32e3,h.error.message,h.error),rJ(h.error.code))}catch(t){s=!0;let e=eT(t);if(i.headersSent)return void rz(i,rW(n.id??null,-32e3,e.message,e));rX(i,rW(n.id??null,-32e3,e.message,e),rJ(e.code))}finally{rg(o)}})})}async function r4(e,t,n,i){try{var a;let o,s,l=await r9({req:e,res:t,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let d=await rO(e),c=(a={artifactPath:d.artifactPath,tempDir:d.tempDir,tenantId:l.tenantId},o=r.randomUUID(),(s=setTimeout(()=>{rD(o)},3e5)).unref(),rM.set(o,{artifactPath:a.artifactPath,tempDir:a.tempDir,tenantId:a.tenantId,timer:s}),o);t.statusCode=200,t.setHeader("content-type","application/json"),t.end(JSON.stringify({ok:!0,uploadId:c}))}catch(e){r7(t,eT(e))}}async function r8(e,t,r,n){let i=e.url?.slice("/artifacts/".length)??"";if(!i){t.statusCode=400,t.end("Missing artifact id");return}try{let o=await r9({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[i]}});if(!o)return;let s=function(e,t){let r=rI.get(e);if(!r)throw new eL("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eL("UNAUTHORIZED","Artifact belongs to a different tenant");if(!a.existsSync(r.artifactPath))throw rx(e),new eL("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(i,o.tenantId),l=a.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=eT(e);t.statusCode=rJ(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rx(i)}),l.pipe(t)}catch(e){r7(t,eT(e))}}async function r6(e){try{let t=Date.now()+15e3;for(;rv(e)&&Date.now()<t;){let{abortAllIosRunnerSessions:t}=await Promise.resolve(t0);if(await t(),!rv(e))break;await e2(200)}}catch(e){el({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e)}})}}async function r9(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=rZ({},n.headers),d=(t=l,!(r=o)||ey(t,r)?null:eT(new eL("UNAUTHORIZED","Invalid token")));if(d)return r7(i,d),null;let c=await r2(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 r7(e,t){e.statusCode=rJ(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function ne(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function nt(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function nr(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 eL("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class nn{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 t=nr(e.backend),n=eK(e.tenantId);if(!n)throw new eL("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=ne(e.runId);if(!i)throw new eL("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,t),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(t);let l=this.now(),d={leaseId:r.randomBytes(16).toString("hex"),tenantId:n,runId:i,backend:t,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=nt(e.leaseId);if(!t)throw new eL("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);if(!r)throw new eL("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=nt(e.leaseId);if(!t)throw new eL("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=nr(e.backend),r=eK(e.tenantId);if(!r)throw new eL("INVALID_ARGS","tenant isolation requires tenant id.");let n=ne(e.runId);if(!n)throw new eL("INVALID_ARGS","tenant isolation requires run id.");let i=nt(e.leaseId);if(!i)throw new eL("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new eL("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==r||a.runId!==n)throw new eL("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 eL("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 eL("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=eK(t),i=ne(r);if(t&&!n)throw new eL("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&!i)throw new eL("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 eL("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}let ni={platform:"web",id:"agent-browser-chrome",name:"Agent Browser Chrome",kind:"device",target:"desktop",booted:!0};async function na(e){var t;if("web"===e.platform)return[ni];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("./3340.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("./3340.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 no=new h,ns=new h;async function nl(e,t,r){var n,i;let a=await nd(e,t,r);if(n=t,i=a,!nc(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 eL("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function nd(e,t,r){try{return await e8(e,t,r)}catch(e){var n;if(n=e,!nc(t)&&n instanceof eL&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function nc(e){return!!(e.udid||e.serial||e.deviceName)}async function nu(e){let t=e4(e.platform),r=e5({simulatorSetPath:te(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=th(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 eo("resolve_target_device",async()=>{let o=function(e){let t=no.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 eL("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await nw({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return ng(s)?nv(i,await nl(l,s,{simulatorSetPath:r})):nv(i,await e8(l,s,{simulatorSetPath:r}));let d=await na({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return ng(s)?nv(i,await nl(d,s,{simulatorSetPath:r})):nv(i,await e8(d,s,{simulatorSetPath:r}))},a)}async function np(e){return no.getStore()?await e():await no.run(new Map,e)}async function nf(e,t){return e?await ns.run(e,t):await t()}async function nm(e,t){return await nf(e,async()=>await np(t))}async function nh(e){return await nw(e)??await na(e)}async function nw(e){let t=ns.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function ng(e){return e3(e.platform)}function nv(e,t){return no.getStore()?.set(e,{...t}),t}let ny=["platform","target","device","udid","serial"],nS=[...ny,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function nb(e){return"string"==typeof e&&e.trim().length>0}function nA(e,t){return!!e&&t.some(t=>nb(e[t]))}let nI={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},n_=function(e){let t=new Map;for(let r of e){if(t.has(r.command))throw Error(`Duplicate daemon command descriptor: ${r.command}`);t.set(r.command,r)}return{descriptorsByCommand:t}}([...nN("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},ty.leaseAllocate,ty.leaseHeartbeat,ty.leaseRelease),nM(ty.sessionList,"session",{sessionKind:"inventory",...nI}),nM(tv.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...nI}),nM(tv.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...nN("session",{sessionKind:"state"},tv.boot,tv.shutdown,tv.appState),...nN("session",{sessionKind:"observability"},tv.perf,tv.logs,tv.network),...nN("session",{sessionKind:"replay",skipSessionlessProviderDevice:function(e){return e.command===tv.test&&("number"==typeof e.flags?.shardAll||"number"==typeof e.flags?.shardSplit)}},tv.replay,tv.test),nM(ty.runtime,"session"),nM(tv.clipboard,"session",{replayScopedAction:!0}),nM(tv.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...nN("session",{},tv.install,tv.reinstall,ty.installSource),nM(ty.releaseMaterializedPaths,"session",nI),...nN("session",{},tv.push,tv.triggerAppEvent),nM(tv.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...nN("session",{},tv.prepare,tv.batch),nM(tv.close,"session",{allowInvalidRecording:!0}),...nN("snapshot",{replayScopedAction:!0},tv.snapshot,tv.diff,tv.wait,tv.alert,tv.settings),nM(tv.reactNative,"reactNative",{replayScopedAction:!0}),nM(tv.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),nM(tv.trace,"recordTrace"),nM(tv.find,"find",{replayScopedAction:!0}),...nN("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},tv.click,tv.fill,tv.longPress,tv.press,tv.type),...nN("interaction",{replayScopedAction:!0},tv.get,tv.is),...nN("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},tv.back,tv.gesture,tv.home,tv.rotate,tv.scroll,tv.swipe,"pinch"),nM(tv.focus,"generic",{androidBlockingDialogGuard:!0}),nM(tv.screenshot,"generic",{replayScopedAction:!0}),nM(tv.viewport,"generic",{replayScopedAction:!0}),...nN("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function nx(e){return nD(e)?.sessionKind}function nM(e,t,r={}){return{command:e,route:t,...r}}function nN(e,t,...r){return r.map(r=>nM(r,e,t))}function nD(e){return n_.descriptorsByCommand.get(e)}let nk=[{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("./2954.js");nO(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&e3(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(t1);nO(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&&e3(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(t3);nO(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(t4);nO(t,e.linuxTool,r)}},{resolverKey:"webProvider",resolve(e,t){let r=e.webProvider;return r&&"web"===t.device.platform?{web:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.web?.provider)return;let{withWebProvider:r}=await import("./provider.js");nO(t,e.web,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(tY);nO(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");nO(t,e.recording,r)}}];async function nP(e,t){let r=await nE(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await nR(r);return await nT(i,async()=>await t(n))}async function nE(e){var t,r,n;if(t=e.providers,!nk.some(e=>!!t[e.resolverKey]))return{};let i=await nC(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return nk.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function nC(e,t){switch(function(e,t){var r;let n,i;if(t.hasExistingSession)return nD(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(r=e,"function"==typeof(i=nD(r.command)?.skipSessionlessProviderDevice)&&i(r))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(n=nD(e.command)?.allowSessionlessDefaultDevice)&&n(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:nA(e.flags,ny)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await nu(e.flags??{});case"skip":return}}async function nR(e){let t=[];for(let r of nk)await r.appendWrapper(e,t);return t}function nO(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function nT(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function nL(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"web":{let{createWebInteractor:e}=await import("./web.js");return e()}case"ios":case"macos":{let{createAppleInteractor:r}=await import("./apple.js");return r(e,t)}default:throw new eL("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let n$=/^[A-Za-z0-9_.:-]{1,64}$/,nF="--launch-console is supported only for iOS simulator app launches",nU="--launch-console requires a direct app launch and cannot be used with URL opens",nG=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function nq(e,t){if(t<=0)return[0,0];let[r,n]=nG[e%nG.length];return[r*t,n*t]}async function nj(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await e2(t)}let nV=["tap","doubleTap","longPress","drag"];function nB(e,t,r){return new eL("INVALID_ARGS",r,{stepIndex:e,kind:"string"==typeof t?t:void 0})}function nH(e,t,r,n,i,a){if(!Number.isFinite(e)||e<t||e>r)throw nB(n,i,`sequence step ${n} (${i}) ${a} must be between ${t} and ${r}`)}function nK(e,t){if(!Array.isArray(e)||0===e.length)throw new eL("INVALID_ARGS","sequence requires at least one step",{stepCount:Array.isArray(e)?e.length:0});if(e.length>20)throw new eL("INVALID_ARGS",`sequence accepts at most 20 steps, received ${e.length}`,{stepCount:e.length,maxSteps:20});return e.forEach((e,t)=>(function(e,t){var r;if(!("string"==typeof(r=e.kind)&&nV.includes(r)))throw nB(t,e.kind,`sequence step ${t} has unsupported kind "${String(e.kind)}"; allowed: ${nV.join(", ")}`);if(!Number.isFinite(e.x)||!Number.isFinite(e.y))throw nB(t,e.kind,`sequence step ${t} (${e.kind}) requires finite x and y`);if("drag"===e.kind&&(!Number.isFinite(e.x2)||!Number.isFinite(e.y2)))throw nB(t,e.kind,`sequence step ${t} (drag) requires finite x2 and y2`);void 0!==e.durationMs&&nH(e.durationMs,0,1e4,t,e.kind,"durationMs"),void 0!==e.pauseMs&&nH(e.pauseMs,0,1e4,t,e.kind,"pauseMs")})(e,t)),{command:"sequence",steps:e,appBundleId:t}}function nW(e){var t,r,n,i;let a=Array.isArray(t=e.sequenceResults)?t.map(e=>{let t=e??{};return{ok:!0===t.ok,kind:"string"==typeof t.kind?t.kind:"unknown",errorCode:"string"==typeof t.errorCode?t.errorCode:void 0,errorMessage:"string"==typeof t.errorMessage?t.errorMessage:void 0,gestureStartUptimeMs:"number"==typeof t.gestureStartUptimeMs?t.gestureStartUptimeMs:void 0,gestureEndUptimeMs:"number"==typeof t.gestureEndUptimeMs?t.gestureEndUptimeMs:void 0}}):[],o="number"==typeof e.completedSteps&&Number.isFinite(e.completedSteps)?e.completedSteps:a.filter(e=>e.ok).length,s="number"==typeof e.failedStepIndex&&Number.isFinite(e.failedStepIndex)?e.failedStepIndex:a.findIndex(e=>!e.ok)>=0?a.findIndex(e=>!e.ok):void 0;if(void 0!==s){let e,t,l;throw r=a,n=o,e=r[i=s],t=e?.kind??"step",l=e?.errorMessage??`sequence step ${i} (${t}) failed`,new eL(eR(e?.errorCode),l,{failedStepIndex:i,failedStepKind:t,completedSteps:n,sequenceResults:r,hint:"Run snapshot -i to inspect the current UI, then continue from the observed state."})}return{results:a,completedSteps:o,failedStepIndex:s}}async function nX(e,t){let{x:r,y:n}=n1(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, 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,...V(`Long pressed (${r}, ${n})`)}}async function nz(e,t){let{x:r,y:n}=n1(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...V(`Focused (${r}, ${n})`)}}async function nJ(e,t,r){let n=eM(t[0]);if(n)throw new eL("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 eL("INVALID_ARGS","type requires text");let a=Z(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...V(iw("Typed",i))}}async function nZ(e,t,r){if(r?.directElementSelector)return await nY(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 eL("INVALID_ARGS","fill requires x y text");let o=Z(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...V(iw("Filled",a))}}async function nY(e,t,r,n){if(!e.fillElementSelector)throw new eL("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new eL("INVALID_ARGS","fill requires text");let a=Z(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...V(iw("Filled",i))}}async function nQ(e,t,r,n){var i,a;if(n?.directElementSelector&&"ios"===e.platform)return await n0(t,n.directElementSelector);let{x:o,y:s}=n1(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await n2(o,s,n);let l=M(n);if("primary"!==l)return await n3(e,o,s,l,n);let d=(a=n,{count:n4(a?.count,1,"count",1,200),intervalMs:n4(a?.intervalMs,0,"interval-ms",0,1e4),holdMs:n4(a?.holdMs,0,"hold-ms",0,1e4),jitterPx:n4(a?.jitterPx,0,"jitter-px",0,100),doubleTap:!!a?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new eL("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new eL("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(d),i=d.count,e3(e.platform)&&i>1)?await n6(e,o,s,d,n):await n9(t,o,s,d)}async function n0(e,t){if(!e.tapElementSelector)throw new eL("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...V(`Tapped ${t.raw}`)}}function n1(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new eL("INVALID_ARGS",t,r);return{x:n,y:i}}async function n2(e,t,r){let n=M(r);if("primary"!==n)throw new eL("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(tQ);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...V(im({x:e,y:t}))}}async function n3(e,t,r,n,i){if(function(e,t,r){let n=F({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 n5(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(t0);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},n7(i)),{x:t,y:r,button:n,...V(im({x:t,y:r,button:n}))}}async function n5(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,...V(im({x:e,y:t,button:r}))}}function n4(e,t,r,n,i){return Z(void 0===e?t:e,r,n,i)}async function n8(e,t,r){let n,i,{runIosRunnerCommand:a}=await Promise.resolve(t0),o=function(e,t=2e4){if(0===e.length)return[];let r=[],n=[],i=0;for(let a of e){let e=(a.durationMs??0)+(a.pauseMs??0)+250,o=n.length>0&&i+e>t,s=n.length>=20;(o||s)&&(r.push(n),n=[],i=0),n.push(a),i+=e}return n.length>0&&r.push(n),r}(t),s=0,l=[],d=0;for(let t of o){let o,c=await a(e,nK(t,r?.appBundleId),n7(r));n??=c,i=c;try{o=nW(c)}catch(e){throw function(e,t){if(0===t||!(e instanceof eL)||!e.details)return e;let r=e.details.failedStepIndex;if("number"!=typeof r)return e;let n=e.details.completedSteps;return new eL(e.code,e.message,{...e.details,failedStepIndex:r+t,chunkStepIndex:r,..."number"==typeof n?{completedSteps:t+n}:{}},e.cause)}(e,d)}s+=o.completedSteps,l.push(...o.results),d+=t.length}return{...n??{},completedSteps:s,sequenceResults:l,...i?.gestureEndUptimeMs!==void 0?{gestureEndUptimeMs:i.gestureEndUptimeMs}:{}}}async function n6(e,t,r,n,i){var a,o,s,l;let d,c,u=await n8(e,(a=e,o=t,s=r,c="tap"==(d=(l=n).doubleTap?"doubleTap":l.holdMs>0?"longPress":"tap")&&"ios"===a.platform&&"tv"!==a.target,Array.from({length:l.count},(e,t)=>{let[r,n]=nq(t,l.jitterPx),i=t===l.count-1;return{kind:d,x:o+r,y:s+n,...c?{synthesized:!0}:{},...l.holdMs>0?{durationMs:l.holdMs}:{},...!i&&l.intervalMs>0?{pauseMs:l.intervalMs}:{}}})),i);return{x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,timingMode:"runner-sequence",...u,...V(im({x:t,y:r}))}}async function n9(e,t,r,n){let i;return await nj(n.count,n.intervalMs,async a=>{let[o,s]=nq(a,n.jitterPx),l=t+o,d=r+s;if(n.doubleTap){let t=await e.doubleTap(l,d);i??=t??void 0;return}if(n.holdMs>0){let t=await e.longPress(l,d,n.holdMs);i??=t??void 0}else{let t=await e.tap(l,d);i??=t??void 0}}),P({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},im({x:t,y:r}))}function n7(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir}}async function ie(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 eL("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await ir({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function it(e,t,r,n){let i=T(r[0]),a=r[1]?Number(r[1]):300,o=Y((await t.snapshot({appBundleId:n?.appBundleId})).nodes??[]);if(!o)throw new eL("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=er(i,o,{platform:e.platform});return await ir({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function ir(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:d}=e,c=Z(l,"durationMs",16,1e4),u=Z(n?.count??1,"count",1,200),p=Z(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if(!I(j,f))throw new eL("INVALID_ARGS",`Invalid pattern: ${f}`);if(e3(t.platform)&&u>1){let e=await n8(t,function(e){let{device:t,x1:r,y1:n,x2:i,y2:a,count:o,pauseMs:s,pattern:l,effectiveDurationMs:d}=e,c="ios"===t.platform&&"tv"!==t.target;return Array.from({length:o},(e,t)=>{let u="ping-pong"===l&&t%2==1,p=t===o-1;return{kind:"drag",x:u?i:r,y:u?a:n,x2:u?r:i,y2:u?n:a,durationMs:d,...c?{synthesized:!0}:{},...!p&&s>0?{pauseMs:s}:{}}})}({device:t,x1:i,y1:a,x2:o,y2:s,count:u,pauseMs:p,pattern:f,effectiveDurationMs:c}),n);return{x1:i,y1:a,x2:o,y2:s,...d?{preset:d}:{},durationMs:c,effectiveDurationMs:c,timingMode:"runner-sequence",count:u,pauseMs:p,pattern:f,...e,...V(ih(u,f))}}return await nj(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)}),P({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}`:ih(u,f))}async function ii(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 eL("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=Z(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??{},...V(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function ia(e,t){let r=Q(b,t[0],{message:"fling direction must be up, down, left, or right"}),n=Number(t[1]),i=Number(t[2]);if(![n,i].every(Number.isFinite))throw new eL("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new eL("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=Z(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,...V(`Flung ${r}`)}}async function io(e,t,r){var n,i,a,o,s,l,d,c;let u,p=t[0],f=t[1]?Number(t[1]):void 0,m=r?.pixels,h=r?.durationMs;if(!p)throw new eL("INVALID_ARGS","scroll requires direction");n=f,i=m,a=h,function(e){if(void 0!==e&&!Number.isFinite(e))throw new eL("INVALID_ARGS","scroll amount must be a number")}(n),k(a),B({amount:n,pixels:i});let w="bottom"===(o=p)?{direction:"down",edge:"bottom"}:"top"===o?{direction:"up",edge:"top"}:{direction:A(o)},g={amount:f,pixels:m,durationMs:h},{interactionResult:v,completedPasses:y}=await is(e,r,w,g);return P((s=w,l=g,d=y,u=E(c=v),{direction:s.direction,...s.edge?{edge:s.edge,passes:d}:{},...void 0!==l.amount?{amount:l.amount}:{},...void 0!==l.pixels?{pixels:l.pixels}:{},...void 0!==u?{durationMs:u}:{},...c}),q(w.direction,w.edge,y,f,m))}async function is(e,t,r,n){if(r.edge){let i=r.edge,a=await C({edge:i,captureState:async r=>await il(e,t,i,r),scroll:async()=>await e.scroll(r.direction,n)});return{interactionResult:a.result??{},completedPasses:a.passes}}return{interactionResult:await e.scroll(r.direction,n)??{},completedPasses:1}}async function il(e,t,r,n){if("function"!=typeof e.snapshot)throw new eL("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await K({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,scope:e})).nodes??[]})}async function id(e,t,r,n){if("tv"===e.target)throw new eL("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new eL("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 eL("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...V(`Pinched to scale ${i}`)}}async function ic(e,t,r){if("tv"===e.target)throw new eL("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new eL("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 eL("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 eL("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 eL("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 eL("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,...V(`Rotated gesture ${n} degrees`)}}async function iu(e,t,r){if("tv"===e.target)throw new eL("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new eL("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 eL("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new eL("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:Z(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...V(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function ip(e,t,r){let{x:n,y:i}=n1(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(t5);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(tQ);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(t0),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,iosXctestrunFile:r?.iosXctestrunFile,iosXctestDerivedDataPath:r?.iosXctestDerivedDataPath,iosXctestEnvDir:r?.iosXctestEnvDir});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function im(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function ih(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function iw(e,t){return`${e} ${Array.from(t).length} chars`}function ig(e,t){let r,n=t?.subject??"Payload",i=e.trim();if(!i)throw new eL("INVALID_ARGS",`${n} cannot be empty`);let o=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!a.statSync(o).isFile())throw new eL("INVALID_ARGS",`${n} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof eL)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new eL("INVALID_ARGS",`${n} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new eL("COMMAND_FAILED",`Unable to read ${n} file: ${o}`,{cause:String(t)})}if((r=i.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:i};throw new eL("INVALID_ARGS",`${n} file not found: ${o}`)}async function iv(e){let t=ig(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await iy(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new eL("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof eL)throw t;throw new eL("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function iy(e){try{return await s.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new eL("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new eL("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new eL("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new eL("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function iS(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath,iosXctestrunFile:i?.iosXctestrunFile,iosXctestDerivedDataPath:i?.iosXctestDerivedDataPath,iosXctestEnvDir:i?.iosXctestEnvDir},o=await nL(e,a);return el({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await eo("platform_command",async()=>await ib(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function ib(e,t,r,n,i,a,o){switch(r){case"open":return await iA(e,t,n,a);case"close":{let r=n[0];if(!r)return"web"===e.platform&&await t.close(""),{closed:"session",...V("Closed session")};return await t.close(r),{app:r,...V(`Closed: ${r}`)}}case"press":return await nQ(e,t,n,a);case"swipe":return await ie(e,t,n,a);case"swipe-preset":return await it(e,t,n,a);case"pan":return await ii(t,n);case"fling":return await ia(t,n);case"longpress":return await nX(t,n);case"focus":return await nz(t,n);case"type":return await nJ(t,n,a);case"fill":return await nZ(t,n,a);case"scroll":return await io(t,n,a);case"pinch":return await id(e,t,n,a);case"rotate-gesture":return await ic(e,t,n);case"transform-gesture":return await iu(e,t,n);case"trigger-app-event":return await iI(e,t,n,a);case"screenshot":return await i_(t,n,i,a);case"viewport":return await ix(t,n);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...V("Back")};case"home":return await t.home(),{action:"home",...V("Home")};case"rotate":{let e=ee(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...V(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...V("Opened app switcher")};case"clipboard":return await iM(t,n);case"keyboard":return await iD(e,n,a,o);case"settings":return await iE(e,t,n,a);case"push":return await iC(e,n,a);case"snapshot":return await iR(t,a);case"read":return await ip(e,n,a);default:throw new eL("INVALID_ARGS",`Unknown command: ${r}`)}}async function iA(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new eL("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new eL("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new eL("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...V("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new eL("UNSUPPORTED_OPERATION",nF);if("linux"===e.platform&&s&&s.length>0)throw new eL("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(tw(i))throw new eL("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!tw(a))throw new eL("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new eL("INVALID_ARGS",nU);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...V(`Opened: ${i}`)}}if(o&&tw(i))throw new eL("INVALID_ARGS",nU);if(n?.clearAppState){if(tw(i))throw new eL("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}:{},...V(`Opened: ${i}`)}}async function iI(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new eL("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!n$.test(t))throw new eL("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 eL("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 eL("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 eL("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof eL)throw t;throw new eL("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 eL("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 eL("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",...V(`Triggered app event: ${i}`)}}async function i_(e,t,r,n){let a=t[0]??r??`./screenshot-${Date.now()}.png`;await s.mkdir(i.dirname(a),{recursive:!0});let o=H(n);return await e.screenshot(a,{appBundleId:n?.appBundleId,fullscreen:o.fullscreen,stabilize:o.stabilize,surface:n?.surface}),{path:a,...V(`Saved screenshot: ${a}`)}}async function ix(e,t){if(2!==t.length)throw new eL("INVALID_ARGS","viewport requires exactly two arguments: <width> <height>");let r=iN(t[0],"width"),n=iN(t[1],"height");if(!e.setViewport)throw new eL("UNSUPPORTED_OPERATION","viewport is not supported by this backend");return await e.setViewport(r,n),{width:r,height:n,...V(`Viewport set: ${r}x${n}`)}}async function iM(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new eL("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new eL("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new eL("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,...V("Clipboard updated")}}function iN(e,t){let r=void 0===e?NaN:Number(e);if(!Number.isInteger(r)||r<1)throw new eL("INVALID_ARGS",`viewport ${t} must be a positive integer`);return r}async function iD(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!ec(i))throw new eL("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new eL("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await ik(e,i);if("ios"===e.platform)return await iP(e,i,r,n);throw new eL("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function ik(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...V("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./9624.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("./9624.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 iP(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new eL("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(t0),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...V("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(t0),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...V(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function iE(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new eL("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new eL("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");el({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?P({setting:i,state:"clear",...s},iO(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...V(`Cleared user data for ${r}`)}}if(!a)throw new eL("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:$(o,"latitude"),longitude:$(s,"longitude")}:void 0;el({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?P({setting:i,state:a,...u},iO(u)??`Updated setting: ${i}`):{setting:i,state:a,...V(`Updated setting: ${i}`)}}async function iC(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new eL("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await iv(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...V(`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,...V(`Pushed notification to ${n}`)}}async function iR(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,includeRects:t?.snapshotIncludeRects,surface:t?.surface})}function iO(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let iT=e=>"macos"!==e.platform,iL=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,i$=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,iF={device:!0},iU={},iG={device:!0},iq=new Set(["open","close","find","get","is","network","screenshot","snapshot","wait","click","fill","focus","press","scroll","type","viewport"]),ij={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iF},iV={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU,supports:iT},iB=function(e){let t={};for(let[r,n]of Object.entries(e))t[r]=iq.has(r)?{...n,web:iG}:n;for(let t of iq)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}({alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU,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:iU,supports:e=>"android"===e.platform||iL(e),unsupportedHint:i$},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU,supports:e=>"android"===e.platform||iL(e),unsupportedHint:i$},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU,supports:e=>"android"===e.platform||iL(e),unsupportedHint:i$},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU,supports:iT},open:ij,close:ij,reinstall:iV,install:iV,"install-from-source":iV,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iF},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU,supports:iT},shutdown:{apple:{simulator:!0},android:{emulator:!0},linux:iU},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iF},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iF,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:iU,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:iF},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU},snapshot:ij,diff:ij,screenshot:ij,wait:ij,get:ij,find:ij,is:ij,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iF},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iF,supports:iT},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iF},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iF},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iF},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU,supports:iT},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU,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:iF},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iF},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},viewport:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU},"trigger-app-event":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iU},type:ij});function iH(e,t){let r=iB[e];if(!r)return!0;let n=e3(t.platform)?r.apple:"android"===t.platform?r.android:"linux"===t.platform?r.linux:r.web;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}function iK(e,t=e=>e){let r=new h;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 iW(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function iX(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 eL("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 eL("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 eL("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 eL("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 eL("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await iz(e,t,r)}}async function iz(e,t,r){let n=["/Applications","/System/Applications",i.join(u.homedir(),"Applications")],a=new Set;for(let t of n){let r=await s.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 iW((await Promise.all(Array.from(a).map(async e=>{let r=await iJ(e,t).catch(()=>({})),n=r.bundleId;return n?{bundleId:n,name:r.appName??i.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function iJ(e,t){for(let r of[i.join(e,"Contents","Info.plist"),i.join(e,"Info.plist")]){let e=await t(r),n=iZ(e,"CFBundleIdentifier"),i=iZ(e,"CFBundleDisplayName"),a=iZ(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function iZ(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let iY={runCommand:eU,simctl:{run:async(e,t)=>await eU("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await eU("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await i6(eU,e)},macosHost:iX(eU,async e=>await i6(eU,e)),whichCommand:ej},iQ=iK(iY,function(e){return"function"==typeof e?i0({runCommand:e}):i0(e)});function i0(e={}){let t={...iY,...e},r=e.plist??{readJson:async e=>await i6(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??iX(t.runCommand,async e=>await r.readJson(e))}}function i1(e){return iQ.resolve(e)}async function i2(e,t){return await iQ.run(e,t)}function i3(){return iQ.hasScope()}async function i5(e,t,r){return await i1().runCommand(e,t,r)}async function i4(e,t){let r=i1(),[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 i5("xcrun",e,t)}async function i8(e){return await i1().plist?.readJson(e)??null}async function i6(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 i9="agent-device-macos-helper",i7="AGENT_DEVICE_MACOS_HELPER_BIN",ae=i.join(u.homedir(),".agent-device","macos-helper","current"),at=i.join(ae,"manifest.json"),ar=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function an(e){let t=e.trim();if(!ar.test(t))throw new eL("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function ai(e,t){t.bundleId&&e.push("--bundle-id",an(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function aa(){return function(e){let t=i.dirname(e);for(;;){let e=i.join(t,"macos-helper");if(o(i.join(e,"Package.swift")))return e;let r=i.dirname(t);if(r===t)break;t=r}throw new eL("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(d(import.meta.url))}async function ao(e){let t=await s.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=i.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await ao(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function as(e){let t=await ao(e),r=n("sha256");for(let n of t)r.update(i.relative(e,n)),r.update("\0"),r.update(await s.readFile(n)),r.update("\0");let a=await i5("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return r.update("swift-version"),r.update("\0"),r.update(a.stdout||a.stderr||`exit:${a.exitCode}`),r.update("\0"),r.digest("hex")}async function al(){try{let e=JSON.parse(await s.readFile(at,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function ad(){let e=await eq(process.env[i7],i7);if(e)return e;let t=aa(),r=await as(t),n=i.join(ae,i9);try{if(await al()===r)return await s.access(n),n}catch{}let a=i.join(aa(),".build","release",i9);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await i5("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await s.mkdir(ae,{recursive:!0});let o=`${n}.tmp`;return await s.copyFile(a,o),await s.rename(o,n),await s.chmod(n,493),await s.writeFile(at,`${JSON.stringify({fingerprint:r},null,2)}
4
- `,"utf8"),n}async function ac(){let e=process.env[i7]?.trim();if(e){let t=await eq(e,i7);if(t)return t}if(i3())return i9;if("darwin"!==process.platform)throw new eL("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await ad()}async function au(e){let t={allowFailure:!0,timeoutMs:3e4},r=i1().macosHelper,n=r?i9:await ac(),i=r?await r.run(e,t):await i5(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 eL("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 ap(){return await au(["app","frontmost"])}async function af(e){return await au(["app","quit","--bundle-id",an(e)])}async function am(e,t){return await au(["permission",e,t])}async function ah(e,t={}){let r=["alert",e];return ai(r,t),await au(r)}async function aw(e,t={}){let r=["snapshot","--surface",e];return ai(r,t),await au(r)}async function ag(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return ai(n,r),await au(n)}async function av(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return ai(n,r),await au(n)}async function ay(e,t={}){let r=["screenshot","--out",e];return ai(r,t),t.fullscreen&&r.push("--fullscreen"),await au(r)}let aS={"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"},ab={runCommand:eU,whichCommand:ej,desktop:aM(eU,ej),clipboard:aN(eU,ej),screenshot:aD(eU,ej)},aA=iK(ab,function(e={}){let t={...ab,...e};return{...t,desktop:e.desktop??aM(t.runCommand,t.whichCommand),clipboard:e.clipboard??aN(t.runCommand,t.whichCommand),screenshot:e.screenshot??aD(t.runCommand,t.whichCommand)}});function aI(e){return aA.resolve(e)}async function a_(e,t){return await aA.run(e,t)}async function ax(e,t,r){return await aI().runCommand(e,t,r)}function aM(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=>{el({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await e2(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 aN(e,t){return{async readText(){let r=aE[await aO(t,ak)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=aC[await aO(t,ak)](r);await e(n.cmd,n.args,n.options)}}}function aD(e,t){return{async capture(r){let n=aR[await aO(t,aP)](r);await e(n.cmd,n.args,n.options)}}}let ak={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."},aP={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."},aE={"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}}},aC={"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}})},aR={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 aO(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 eL("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let aT="atspi-dump.py",aL=null;async function a$(e,t={}){let r,n=aI().accessibility;if(n)return await n.captureTree(e,t);if("linux"!==process.platform)throw new eL("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await aI().whichCommand("python3"))throw new eL("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let o=t.maxNodes??1500,s=t.maxDepth??12,l=t.maxApps??24,c=[function(){if(aL)return aL;let e=i.dirname(d(import.meta.url));for(let t=0;t<5;t++){let r=i.join(e,"src","platforms","linux",aT);if(a.existsSync(r))return aL=r,r;if(0===t){let t=i.join(e,aT);if(a.existsSync(t))return aL=t,t}e=i.dirname(e)}throw new eL("TOOL_MISSING",`Cannot find ${aT}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(l)],u=await ax("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 eL("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new eL("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new eL("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new eL("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=aS[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 aF(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&el({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await a$(t);return{nodes:r.nodes,truncated:r.truncated}}async function aU(e,t,r){let{nodes:n}=await aF(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:aG(e.rect)-aG(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 aG(e){return(e?.width??0)*(e?.height??0)}let aq=[250,400,600];function aj(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?aK(n?.nodes??[]):void 0,routeComparable:i}}function aV(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 aB(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function aH(e){return"press"===e||"click"===e||"back"===e||"open"===e}function aK(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 aW(e,t,r,n,i){return{requestId:i??ei().requestId,appBundleId:r,activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,iosXctestrunFile:t?.iosXctestrunFile,iosXctestDerivedDataPath:t?.iosXctestDerivedDataPath,iosXctestEnvDir:t?.iosXctestEnvDir,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...z(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,durationMs:t?.durationMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:M(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function aX(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!a1(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=aY(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:aZ(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function az(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function aJ(e){let{session:t,pending:r,snapshot:n}=e,i=aQ(r.preSignature,aY(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await iS(t.device,r.command,r.positionals,r.flags?.out,{...aW(e.logPath,r.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),el({level:"info",phase:"interaction_no_change_retry",data:{action:r.action,attemptsRemaining:r.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function aZ(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function aY(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 aQ(e,t){return 0===e.length||0===t.length?"ambiguous":a0(e,t)?"unchanged":"changed"}function a0(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 a1(e){return"ios"===e.device.platform||"android"===e.device.platform}function a2(e,t,r=[],n){var i,a,o;a4(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 a3(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function a5(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!a4(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=aY(e.readSnapshot(o).nodes);for(;a<2||Date.now()-i<1500;){await e2(200),a+=1;let l=await r(),d=aY(e.readSnapshot(l).nodes);if(a0(s,d))return a3(t),el({level:a>2?"info":"debug",phase:"post_gesture_snapshot_stabilized",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),l;o=l,s=d}return a3(t),el({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function a4(e){return"ios"===e||"android"===e}function a8(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let a6=new WeakMap;function a9(e,t){if(!e[t])return[];let r=ot(e)[t]??t+1;return e.slice(t+1,r)}function a7(e,t,r){let n=ot(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function oe(e,t,r){let n=ot(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function ot(e){let t=a6.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 a6.set(e,r),r}function or(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 on(e,t){let r=tA(e.type??""),n=e.label?.trim();return!!(oi(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function oi(e){return"button"===tA(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function oa(e){let t=tA(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function oo(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function os(e){let t;for(let i of e){var r,n;let e=tA(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||ol(r)>ol(n)))&&(t=i.rect)}return t}function ol(e){return e?e.width*e.height:0}function od(e){let t=tA(e.type??"");return"scrollview"===t||"scrollarea"===t}function oc(e,t){return!0===e||!!t||void 0}function ou(e,t,r,n){oe(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=tA(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function op(e,t,r,n){oe(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=tA((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function of(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===tA(n.type??"")&&t(n,i,r)}}function om(e,t,r,n){for(let i of e)(on(i,t)||n&&ow(i,n))&&r.add(i.index)}function oh(e,t,r){if("button"!==tA(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&U(e.rect,t.rect)}function ow(e,t){return"button"===tA(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&U(e.rect,t.rect)}let og=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=os(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"===tA(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),oe(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==tA(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&&G(t))})(r)&&function(e,t,r){var n,i,a,o;oa(e.type)||r.suppressedIndexes.add(e.index);let s=N(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&oa(e.type)?e:null)??or(e,t,e=>oa(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,oo(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:oc(i.hiddenContentAbove,o.above),hiddenContentBelow:oc(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"!==tA(n.type??""))continue;if("Search"===n.label){op(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=a7(e,r,e=>"searchfield"===tA(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),op(e,r,i.index,t))}})(e,o),r=e,n=o,of(r,(e,t,i)=>{a7(r,i,r=>{let n;return("button"===(n=tA(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(U(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=tA(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,of(i,(e,t,r)=>{let n;X(e)&&_(e,(n=[],oe(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=tA(r.type??"");if("statictext"===a||"link"===a)return ou(e,t,n,i);if("other"===a){if(function(e,t,r){return!!a7(e,t,e=>{let t=tA(e.type??"");return("link"===t||"searchfield"===t||oa(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);ou(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=os(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==tA(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)||!or(e,t,od)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=ol(e),i=ol(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&oo(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=tA(r.type??"");if("button"===a)return om(a9(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=a9(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==tA(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=>oh(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&oo(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&&(oh(a,t,r)||ow(a,t)||function(e,t){if("switch"!==tA(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||on(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=>oh(e,t,r));if(!i){e.some(oi)&&om(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&oo(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),om(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function ov(e){let t=await oy(e);if(t)return t;let r=await oN(e);return aB(e.session),{snapshot:r.snapshot,...r.annotations}}async function oy(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!a1(e)||Date.now()-t.markedAt>3e4?void az(e):t}(e.session);if(t&&e.session)return await oS({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await ox({...e,session:e.session});let r=aV(e.session);if(r&&"android"===e.device.platform)return await oI(e,r)}async function oS(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await ob(e,t,await oM(e)),l=await aJ({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await ob(e,t,await oM(e)),l=await aJ({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(az(i),s=await a5({session:i,initial:s,capture:async()=>await oM(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.annotations.freshness?.staleAfterRetries!==!0&&aB(i),"unchanged"===l.change)?el({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}}):el({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,...s.annotations}}async function ob(e,t,r){let n=r;return"unchanged"!==aQ(t.preSignature,aY(n.snapshot.nodes))?n:(await e2(500),n=await oM(e))}async function oA(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await aF(r?.surface);return oP({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?oP(await aw(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await iS(t,"snapshot",[],i,{...aW(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath),snapshotIncludeRects:e.includeRects})}async function oI(e,t){let r=await o_(e,t);return{snapshot:r.snapshot,...r.annotations}}async function o_(e,t){let r=await oN(e),n=oD(r,t,e),i=0,a=t.markedAt+1500;for(let o of aq){if(!n)break;let s=a-Date.now();if(s<=0)break;await e2(Math.min(o,s)),r=await oN(e),i+=1,n=oD(r,t,e)}n||aB(e.session);let o=i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0;return{...r,annotations:{...r.annotations,...J({freshness:o})}}}async function ox(e){let t=await a5({session:e.session,capture:async()=>await oM(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,...t.annotations}}async function oM(e){let t=aV(e.session);return t&&"android"===e.device.platform?await o_(e,t):await oN(e)}async function oN(e){var t;let r=Date.now(),n=await oA(e);return eY(e.session,{durationMs:Date.now()-r,backend:n.backend,platform:e.device.platform}),{data:n,snapshot:ok(n,void 0===(t=e).snapshotScope?t.flags:{...t.flags,snapshotScope:t.snapshotScope}),annotations:J(n)}}function oD(e,t,r){var n,i;let a=r.flags?.snapshotInteractiveOnly===!0,o=e.annotations.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&&aH(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=aK(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 ok(e,t){var r,n,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=W(s?o:tI(o)),d=t?.snapshotScope&&e?.backend!=="macos-helper"?oE(l,t.snapshotScope):l,c=(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 og)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}})}(d):d,u=tE(s?c:O(c)),p=J(e).quality;return{nodes:u,truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,...p?{snapshotQuality:p}:{},presentationKey:tk(tM(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function oP(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=oE(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:oC(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=oC(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function oE(e,t){let r=t_(tE(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 oC(a,i)}function oC(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 oR(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return a8("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=tN(e.trim());if(!n)return a8("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=tD(e.nodes,n);if(r=t?tx(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:a8("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function oO(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?el({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function oL(e){let{session:t,sessionName:r,outPath:n,outputPlacement:a,dispatchContext:o}=e,l=eS({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...n,...z(a),surface:a?.surface};return"out"===r?o$(await iS(t.device,"screenshot",[],i,o)):o$(await iS(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:o}),artifacts:{resolveInput:async()=>{throw new eL("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-screenshot-")),r=i.join(t,"screenshot.png")),await s.mkdir(i.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await s.mkdtemp(i.join(u.tmpdir(),`${e.prefix}-`));return{path:i.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}}},sessions:oT({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eb()});return await l.capture.screenshot({session:r,requestId:o.requestId,appBundleId:t.appBundleId,...H(o),surface:t.surface,...n?{out:{kind:"path",path:n}}:{}})}function o$(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function oF(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function oU(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 oG(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let oq=new Set(["android","com.android.systemui"]);function oj(e,t,r,n){var i,a;return{reason:r,fallbackReason:n,diagnostics:(i=e,a=t,{helperNodeCount:i.nodeCount,helperWindowRootCount:i.windowRootCount,helperApplicationWindowRootCount:i.applicationWindowRootCount,helperMeaningfulNodeCount:i.meaningfulNodeCount,helperApplicationMeaningfulNodeCount:i.applicationMeaningfulNodeCount,helperNonSystemMeaningfulNodeCount:i.nonSystemMeaningfulNodeCount,...void 0!==i.foregroundAppPackage?{helperForegroundAppPackage:i.foregroundAppPackage,helperForegroundAppMeaningfulNodeCount:i.foregroundAppMeaningfulNodeCount,helperForegroundAppMeaningfulNodeThreshold:2}:{},helperWindowTypes:i.windowTypes,...a.captureMode?{helperCaptureMode:a.captureMode}:{}})}}function oV(e){return null!==e&&""!==e.trim()}let oB=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function oH(e,t={}){let r=tW(e,t.helperAdb).exec;return(await oJ(e,t,r)).xml}async function oK(e,t={}){let r=tW(e,t.helperAdb).exec,n=await oJ(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=tR(i,void 0,t),s=oW(o.truncated,n.metadata);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 o6(e,o.nodes,i,r),o.nodes),{...o,...oX(s),androidSnapshot:n.metadata}}let o=tT(i),s=tB(o,void 0,t),l=oW(s.truncated,n.metadata);a&&await oz({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:d,...c}=s;return{...c,...oX(l),androidSnapshot:n.metadata}}function oW(e,t){return!0===e||!0===t.helperTruncated||e}function oX(e){return!0===e?{truncated:!0}:{}}async function oz(e){if(o7(e.interactiveSnapshot.nodes).size>0||o9(e.xml))return;let t=tB(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await o6(e.device,t.nodes,e.xml,e.adb);sa(r,t,e.interactiveSnapshot),0===r.size&&sa(x(tE(t.nodes)),t,e.interactiveSnapshot)}async function oJ(e,t,r){let n=await eo("android_snapshot_helper_artifact_resolution",async()=>await o4(t.helperArtifact));return n.artifact?await oZ(e,t,r,n.artifact):(el({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await o8(e,n.fallbackReason,r))}async function oZ(e,t,r,n){let i=tO(e),a=tW(e,t.helperAdb),o="daemon-session"!==t.helperSessionScope;try{var s,l,d;let o=await oY(t,r,a,n,i);o.installed&&await tV(i);let c=(s=await oQ({options:t,adb:r,adbProvider:a,artifact:n,helperDeviceKey:i}),l=n,d=o.reason,{xml:s.xml,metadata:{backend:"android-helper",helperVersion:l.manifest.version,helperApiVersion:s.metadata.helperApiVersion,helperTransport:s.metadata.transport,helperSessionReused:s.metadata.sessionReused,installReason:d,waitForIdleTimeoutMs:s.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:s.metadata.waitForIdleQuietMs,timeoutMs:s.metadata.timeoutMs,maxDepth:s.metadata.maxDepth,maxNodes:s.metadata.maxNodes,rootPresent:s.metadata.rootPresent,captureMode:s.metadata.captureMode,windowCount:s.metadata.windowCount,nodeCount:s.metadata.nodeCount,helperTruncated:s.metadata.truncated,elapsedMs:s.metadata.elapsedMs}}),u=function(e,t,r={}){if("android-helper"!==t.backend)return;let n=function(e,t){var r,n;let i=(r=t,{nodeCount:0,windowRootCount:0,applicationWindowRootCount:0,meaningfulNodeCount:0,applicationMeaningfulNodeCount:0,nonSystemMeaningfulNodeCount:0,...void 0!==r?{foregroundAppPackage:r,foregroundAppMeaningfulNodeCount:0}:{},windowTypes:new Set});for(let t of tq(e))!function(e,t){var r,n;e.nodeCount+=1,r=e,n=t,void 0!==n.windowType&&(r.currentWindowType=n.windowType,r.windowRootCount+=1,r.windowTypes.add(n.windowType),1===n.windowType&&(r.applicationWindowRootCount+=1)),function(e,t){var r,n;r=t,!1!==r.visibleToUser&&(oV(r.text)||oV(r.desc)||oV(r.resourceId))&&(e.meaningfulNodeCount+=1,1===e.currentWindowType&&(e.applicationMeaningfulNodeCount+=1),n=t.packageName,null===n||oq.has(n)||(e.nonSystemMeaningfulNodeCount+=1),void 0!==e.foregroundAppPackage&&t.packageName===e.foregroundAppPackage&&(e.foregroundAppMeaningfulNodeCount=(e.foregroundAppMeaningfulNodeCount??0)+1))}(e,t)}(i,t);return{nodeCount:(n=i).nodeCount,windowRootCount:n.windowRootCount,applicationWindowRootCount:n.applicationWindowRootCount,meaningfulNodeCount:n.meaningfulNodeCount,applicationMeaningfulNodeCount:n.applicationMeaningfulNodeCount,nonSystemMeaningfulNodeCount:n.nonSystemMeaningfulNodeCount,...void 0!==n.foregroundAppPackage?{foregroundAppPackage:n.foregroundAppPackage,foregroundAppMeaningfulNodeCount:n.foregroundAppMeaningfulNodeCount??0}:{},windowTypes:[...n.windowTypes].sort((e,t)=>e-t).slice(0,8)}}(e,r.foregroundAppPackage);if(0===n.nodeCount||0===t.nodeCount||!1===t.rootPresent)return oj(n,t,"empty-helper-output","Android snapshot helper returned no accessibility nodes");let i=n.foregroundAppMeaningfulNodeCount;return void 0!==i&&(0===i||i<2&&n.meaningfulNodeCount>i)?oj(n,t,"content-poor-app-window","Android snapshot helper returned insufficient foreground app content"):void 0===i&&n.applicationWindowRootCount>0&&n.applicationMeaningfulNodeCount<2||void 0===i&&0===n.windowRootCount&&(t.windowCount??0)>1&&n.nonSystemMeaningfulNodeCount<2?oj(n,t,"content-poor-app-window","Android snapshot helper returned insufficient application window content"):n.windowRootCount>0&&0===n.applicationWindowRootCount?oj(n,t,"system-window-only","Android snapshot helper returned only non-application windows"):void 0}(c.xml,c.metadata,{foregroundAppPackage:t.appBundleId});if(!u)return c;return await o0({contentRecovery:u,helperDeviceKey:i,artifact:n,device:e,adb:r})}catch(t){return await o1({error:t,helperDeviceKey:i,artifact:n,device:e,adb:r})}finally{o&&await tV(i)}}async function oY(e,t,r,n,i){let a=await eo("android_snapshot_helper_install",async()=>await tL({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 el({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 oQ(e){let{options:t,adb:r,adbProvider:n,artifact:i,helperDeviceKey:a}=e,o={adb:r,adbProvider:n,deviceKey:a,helperVersion:i.manifest.version,helperVersionCode:i.manifest.versionCode,packageName:i.manifest.packageName,instrumentationRunner:i.manifest.instrumentationRunner,waitForIdleTimeoutMs:t.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await eo("android_snapshot_helper_session_capture",async()=>await tF(o),{packageName:i.manifest.packageName,version:i.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){el({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:eT(e).message}}),await o2(r,i.manifest.packageName)}return await eo("android_snapshot_helper_capture",async()=>await t$(o),{packageName:i.manifest.packageName,version:i.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function o0(e){return el({level:"warn",phase:"android_snapshot_helper_content_fallback",data:{reason:e.contentRecovery.reason,fallbackReason:e.contentRecovery.fallbackReason,...e.contentRecovery.diagnostics}}),await o2(e.adb,e.artifact.manifest.packageName),await o8(e.device,e.contentRecovery.fallbackReason,e.adb)}async function o1(e){let t=function(e){var t;let r=eT(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=o5(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=o3(e);return new eL(eR(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=o3(e.error);return el({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tV(e.helperDeviceKey),await o2(e.adb,e.artifact.manifest.packageName),tj({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await o8(e.device,r,e.adb)}async function o2(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await e2(150),el({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){el({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:eT(e).message}})}}function o3(e){let t=eT(e),r=o5(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 o5(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 o4(e){if(e)return{artifact:e};let t=tH(),r=i.join(tK(),"android-snapshot-helper","dist"),n=i.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await w.access(n)}catch{return{}}try{let e=tG(JSON.parse(await w.readFile(n,"utf8"))),t=i.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await w.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:eT(e).message}}}async function o8(e,t,r){let n;try{n=await eo("android_snapshot_stock_capture",async()=>await se(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new eL(eR((r=eT(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 o6(e,t,r,n){if(!t.some(e=>tC(e.type)))return new Map;let i=o7(t);if(i.size>0||o9(r))return i;let a=await si(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(tC(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=>oG(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||!tC(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=>oG(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=oF(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(!oU(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(!oU(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?oF(o):a.length>0?oF(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 o9(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function o7(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 se(e,t=tX(e)){try{return await tr(()=>st(t),{shouldRetry:sn})}catch(t){var r,n;let e;if((r=t)instanceof eL&&"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 eL("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 st(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=sr(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}
5
- ${r}`,i=/dumped to:\s*(\S+)/i.exec(n),i?.[1]);if(0!==l.exitCode&&!d)throw new eL("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=sr(c.stdout,c.stderr);if(!u)throw new eL("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:c.stdout,stderr:c.stderr});return u}function sr(e,t){let r=`${e}
6
- ${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 sn(e){if(!(e instanceof eL)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return oB.some(e=>r.includes(e))}async function si(e,t=tX(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),r=`${e.stdout}
7
- ${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function sa(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 so=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,ss=/^close app$/i,sl="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function sd(e){let t,{session:r}=e;if("android"!==r.device.platform||!r.recording)return{status:"absent"};try{t=await sh(r)}catch(e){return el({level:"warn",phase:"android_blocking_dialog_inspection_failed",data:{session:r.name,deviceId:r.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"unknown",reason:"inspection-failed"}}let n=sg(t);if(!n?.rect)return{status:"absent"};try{let e=await sw(r,n);if(!e.ok)return el({level:"warn",phase:"android_blocking_dialog_tap_failed",data:{session:r.name,deviceId:r.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:"failed",reason:"tap-failed"};if(!await sv(r))return el({level:"warn",phase:"android_blocking_dialog_still_present",data:{session:r.name,deviceId:r.device.id}}),{status:"failed",reason:"dismiss-failed"};if(r.appBundleId&&(await ta(r.device,r.appBundleId),!await sy(r,r.appBundleId)))return el({level:"warn",phase:"android_blocking_dialog_relaunch_unfocused",data:{session:r.name,deviceId:r.device.id,appBundleId:r.appBundleId}}),{status:"failed",reason:"relaunch-failed"};return el({level:"warn",phase:"android_blocking_dialog_recovered",data:{session:r.name,deviceId:r.device.id,appBundleId:r.appBundleId,x:e.x,y:e.y}}),{status:"recovered"}}catch(e){return el({level:"warn",phase:"android_blocking_dialog_recovery_failed",data:{session:r.name,deviceId:r.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"failed",reason:"error"}}}async function sc(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await tt(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await su(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 sf({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 sf({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${sm(a)}. Automatic recovery failed.`,hint:sl})}throw sf({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${sm(a)}.`,hint:sl})}async function su(e){try{return await sp(e)}catch(t){return el({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 sp(e){if(!e.appBundleId)return!1;let t=sg(await sh(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await sw(e,t);if(!r.ok)return!1;await ta(e.device,e.appBundleId);let n=await sy(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&el({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 sf(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new eL("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function sm(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function sh(e){return tE(tI((await oK(e.device,{interactiveOnly:!1})).nodes))}async function sw(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=tP(t.rect),i=await e7(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 sg(e,t={}){if(!1===t.requireDialogSignal||sA(e))return e.find(e=>sb(e).some(e=>ss.test(e))&&e.rect)}async function sv(e){for(let t=0;t<12;t+=1){if(!sA(await sh(e)))return!0;await e2(500)}return!sA(await sh(e))}async function sy(e,t,r={}){for(let n=0;n<12;n+=1){if(await sS(e,t,r))return!0;await e2(500)}return await sS(e,t,r)}async function sS(e,t,r){return!(r.requireNoBlockingDialog&&await tt(e.device))&&(await tp(e.device)).package===t}function sb(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 sA(e){return e.some(e=>{let t=sb(e).join(" ").trim();return t.length>0&&so.test(t)})}function sI(e){return!!(e&&e.width>0&&e.height>0)}function s_(e){return e.width*e.height}function sx(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 sM=[255,59,48,255],sN=[255,214,10,255],sD=[0,0,0,255],sk=["scroll","list","recyclerview","edittext","textfield"],sP=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],sE={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 sC(e){let t=await s.readFile(e.screenshotPath),r=await ew(t,"screenshot"),n=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)sT(r)&&sI(r.rect)&&(!t||s_(r.rect)>s_(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&&sI(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 sI(e.rect)&&!("image"===tA((t=e).type??"")&&!s$(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(sF)||sU(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!sI(r.rect)||sT(r))return!1;let n=tA(r.type??"");return!(sk.some(e=>n.includes(e))||t&&s_(r.rect)>.25*s_(t))}(e,t,r)||(sO(r)?n:n&&function(e){let t=tA(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 sO(e)&&!sT(e)}(s=n)?s:null,tb(o,s,e=>(function(e){return sO(e)&&!sT(e)})(e)),s.hittable?s:null,tb(o,s,e=>!0===e.hittable)].find(sL)??null);if(!l?.rect||!sI(l.rect))continue;let d=function(e,t,r){let n=sG(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=sG(n);if(!i)continue;let a=function(e){let t=0;return tA(e.type??"").includes("text")&&(t+=2),sF(e.label)&&(t+=2),sF(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||sG(t)}(n,l,e.nodes),c=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),sO(t)&&(n+=3),sO(e)&&(n+=2),r&&(n+=2),sU(t.identifier)&&(n+=1),s$(t.value)&&(n+=1),n}(n,l,d),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=sO,i=e=>!!sG(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=tA(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&sI(t.rect)&&sx(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=sR(e,i,u,t,r);if(!sI(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=L(e.nodes).primaryAction;if(!a?.ref||!a.rect||!sI(a.rect))return;let o=sR(e,t,a.rect,n,i);if(!sI(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)=>s_(e.overlayRect)-s_(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(sx(e.overlayRect,r.overlayRect)||sx(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}s_(r.overlayRect)<s_(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(sW).slice(0,n.maxRefs??24).sort(sK).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:tP(e.overlayRect)}))}(e.snapshot,r.width,r.height,{maxRefs:e.maxRefs});for(let e of n){var i,a;(function(e,t,r){for(let n=0;n<2;n+=1)sV(e,t.x,t.x+t.width-1,t.y+n,r),sV(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),sB(e,t.x+n,t.y,t.y+t.height-1,r),sB(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(i=r,(a=e).overlayRect,sM),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=sj(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:sj(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)sH(e,t+o,r+a,i)})(e,i,o,n,sN),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=sE[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]&&sH(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,sD)}(i,a.overlayRect,a.ref)}return await s.writeFile(e.screenshotPath,await ep(r)),n}function sR(e,t,r,n,i){if("android"===e.backend||!t)return sq(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 sq({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 sO(e){let t=[e.type,e.role,e.subrole].map(e=>tA(e??"")).join(" ");return sP.some(e=>t.includes(e))}function sT(e){let t=[e.type,e.role,e.subrole].map(e=>tA(e??"")).join(" ");return t.includes("application")||t.includes("window")}function sL(e){return!!(e?.rect&&sI(e.rect)&&!sT(e))}function s$(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function sF(e){var t;let r;return!!s$(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function sU(e){var t;return"string"==typeof e&&!!sF(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function sG(e){let t=[e.label,e.value].find(sF);return t?t.trim():sU(e.identifier)?e.identifier.trim():void 0}function sq(e,t,r){let n=sj(e.x,0,Math.max(0,t-1)),i=sj(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:sj(e.width,1,a),height:sj(e.height,1,o)}}function sj(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function sV(e,t,r,n,i){for(let a=t;a<=r;a+=1)sH(e,a,n,i)}function sB(e,t,r,n,i){for(let a=r;a<=n;a+=1)sH(e,t,a,i)}function sH(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 sK(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 sW(e,t){return t.score!==e.score?t.score-e.score:sK(e,t)}function sX(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 sz=new WeakMap;function sJ(e){if(!e)return;let t=sz.get(e);if(t)return t;let r=sZ(e.nodes??[]);if(r)return sz.set(e,r),r}let sZ=Y,sY={referenceWidth:1e3,referenceHeight:1e3};function sQ(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??{}},b=s6(S.effectiveDurationMs)??s6(S.durationMs),A={recordingStartedAt:y.startedAt,gestureClockOriginAtMs:y.gestureClockOriginAtMs,gestureClockOriginUptimeMs:y.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===y.platform?y.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:s6(S.gestureStartUptimeMs),gestureEndUptimeMs:s6(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},I="number"==typeof(s={gestureStartUptimeMs:s6(S.gestureStartUptimeMs),gestureEndUptimeMs:s6(S.gestureEndUptimeMs),reportedDurationMs:b,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),_="ios"===e.device.platform&&void 0===s6(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=s9(s6(t.count),1)??1,r=!0===t.doubleTap,n=s9(s6(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 sX(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...A,gestureDurationMs:I}):sX(A),x=(l=e.snapshot,w=s6((d=S).referenceWidth),g=s6(d.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:sJ(l)),M=(c=t,u=r,p=S,f=_,m=I,h=x,v=s0[c],v?.(u,p,f,m,h)??[]);0!==M.length&&(y.gestureEvents.push(...M),el({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:M.length,tMs:_,gestureDurationMs:I,kinds:M.map(e=>e.kind)}}))}let s0={click:(e,t,r,n,i)=>s1(e,t,r,i),press:(e,t,r,n,i)=>s1(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?s1(e,t,r,i):[],fill:(e,t,r,n,i)=>s2(e,t,r,i),focus:(e,t,r,n,i)=>s2(e,t,r,i),longpress:function(e,t,r,n,i){let a=s7(t,e);if(!a)return[];let{x:o,y:s}=a;return[s4(r,o,s,lr(n,[s6(t.durationMs),s6(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=le(t,e),o=s8(t.contentDirection)??s8(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:c}=a,u=lr(n,[],250),p=s6(t.amount)??s6(e[1]),f=s6(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:s3,fling:s3,swipe:s3,pinch:function(e,t,r,n,i){let a=s7(t,e,1),o=s6(t.scale)??s6(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:lr(n,[],280)}]}};function s1(e,t,r,n){let i=s7(t,e);if(!i)return[];let{x:a,y:o}=i,s=s9(s6(t.count),1)??1,l=s9(s6(t.intervalMs),0)??0,d=!0===t.doubleTap,c=s9(s6(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(s4(t,a,o,c,n));continue}u.push(s5(t,a,o,n)),d&&u.push(s5(t+90,a,o,n))}return u}function s2(e,t,r,n){let i=s7(t,e);if(!i)return[];let{x:a,y:o}=i;return[s5(r,a,o,n)]}function s3(e,t,r,n,i){let a=le(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,c=lr(n,[s6(t.effectiveDurationMs),s6(t.durationMs),s6(e[4])],250),u=s9(s6(t.count),1)??1,p=s9(s6(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,b,A,I;let _,{startX:x,startY:M,endX:N,endY:D}=(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=M,S=N,b=D,A=c,"back-swipe"===(_=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=i))?{kind:_,tMs:g,x:v,y,x2:S,y2:b,...I,durationMs:A,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,I)}:{kind:_,tMs:g,x:v,y,x2:S,y2:b,...I,durationMs:A}})}function s5(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function s4(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function s8(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 s6(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 s9(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function s7(e,t,r=0){let n=s6(e.x)??s6(t[r]),i=s6(e.y)??s6(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function le(e,t){let r=lt(e.x1,e.x,t[0]),n=lt(e.y1,e.y,t[1]),i=lt(e.x2,t[2]),a=lt(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 lt(...e){return e.map(s6).find(e=>void 0!==e)}function lr(e,t,r){return s9(e,1)??t.map(e=>s9(e,1)).find(e=>void 0!==e)??r}let ln={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function li(e){var t,r,n,i,a,o,s;let l,d,c,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?ln[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:tS}}(f);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:y,dispatchRequest:S,recordedCommand:b}=v,A=await lo(m,y);if(A)return A;let I=await la(m,y);if("response"in I)return I.response;let{resolvedPositionals:_,resolvedOut:x,recordedPositionals:M,recordedFlags:N}="screenshot"===(t=S).command?(d=(n=(r=t).positionals??[],i=r.meta?.cwd,(l=n[0])?[rn.expandHome(l,i),...n.slice(1)]:n),u=(c=(a=r.flags?.out,o=r.meta?.cwd,a?rn.expandHome(a,o):a))?{...r.flags??{},out:c}:r.flags??{},{resolvedPositionals:d,resolvedOut:c,recordedPositionals:d,recordedFlags:u}):{resolvedPositionals:p=(s=t).positionals??[],resolvedOut:s.flags?.out,recordedPositionals:p,recordedFlags:s.flags??{}},D=Date.now(),k={...g(f.flags,m.appBundleId,m.trace?.outPath),surface:m.surface},P=await ls({session:m,sessionName:e.sessionName,logPath:h,command:y,request:S,positionals:_,out:x,dispatchContext:k}),E=await la(m,y,"after-command");if("response"in E)return E.response;"status"in I&&"recovered"===I.status&&(!P||"object"==typeof P)&&((P??={}).warning=I.warning);let C=Date.now(),R=b===y?M:f.positionals??[],O=b===y?N:f.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=sJ(e.snapshot),a={...n??{}},o=s8(a.direction)??s8(r[0]);if(!o)return n;let s=s6(a.amount)??s6(r[1]),l=s6(a.pixels),d=le(a,[]),c=s6(a.referenceWidth),u=s6(a.referenceHeight),p=void 0!==c&&c>0&&void 0!==u&&u>0?{referenceWidth:c,referenceHeight:u}:i??sY;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=et({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);sQ(t,n,a,p,u,d,c),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:y,recordedCommand:b,resolvedPositionals:_,recordedPositionals:R,recordedFlags:O,data:P,actionStartedAt:D,actionFinishedAt:C,flags:f.flags??{}}),aH(y)&&aj(m,y),a2(m,y,_,f.flags),{ok:!0,data:P??{}}}async function la(e,t,r="before-command"){if("android"!==e.device.platform||nD(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await sc({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:eT(e)}}}}async function lo(e,t){if(!iH(t,e.device)){var r;let n=(r=e.device,iB[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&&"failed"===(await sd({session:e})).status?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function ls(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await iS(r.device,n,a,o,{...s});let l=await oL({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 ll(r,l,e.logPath),l}async function ll(e,t,r){let n={snapshotInteractiveOnly:!0},i=ok(await oA({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);oO(e,i);let a=await sC({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let ld=l_(()=>import("./lease.js")),lc=l_(()=>import("./session.js").then(e=>e.session_namespaceObject)),lu=l_(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),lp=l_(()=>import("./react-native.js")),lf=l_(()=>import("./record-trace.js")),lm=l_(()=>import("./find.js")),lh=l_(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function lw(e){var t;switch(t=e.req.command,nD(t)?.route??"generic"){case"lease":return await lg(e);case"session":return await lv(e);case"snapshot":return await ly(e);case"reactNative":return await lS(e);case"recordTrace":return await lb(e);case"find":return await lA(e);case"interaction":return await lI(e);case"generic":return null}}async function lg(e){let{handleLeaseCommands:t}=await ld();return lx(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function lv(e){let{handleSessionCommands:t}=await lc();return lx(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 ly(e){let{handleSnapshotCommands:t}=await lu();return lx(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function lS(e){let{handleReactNativeCommands:t}=await lp();return lx(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function lb(e){let{handleRecordTraceCommands:t}=await lf();return lx(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function lA(e){let{handleFindCommands:t}=await lm();return lx(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function lI(e){let{handleInteractionCommands:t}=await lh();return lx(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function l_(e){let t;return()=>t??=e()}function lx(e,t,r){if(r)return r;throw new eL("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let lM=new h;async function lN(e,t,r){let n=lM.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>lM.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function lD(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function lk(e,t){var r,n,i,a;let o,s,l,d,c,u;return e.recording?(r=e,n=t,o=eJ(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=eJ(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 lP(e,t){if(!t)return[];let r=[],n=e.device,i=e4(t.platform);if(i&&!e9(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=tc(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function lE(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 lC="default";function lR(e){return e.session||lC}function lO(e){if(e.meta?.sessionExplicit===!0||(e.session||lC)!==lC||e.meta?.sessionIsolation==="tenant"||e.flags?.sessionIsolation==="tenant")return;let t=function(e){if(!e||0===e.trim().length)return;let t=function(e){let t=i.resolve(e);try{return a.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(a.existsSync(i.join(t,".git")))return t;let e=i.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(t){var n;return{kind:"cwd",id:(n=t,r.createHash("sha256").update(n).digest("hex").slice(0,16))}}}function lT(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function lL(e,t){let r=lO(e);return!!r&&!!t.sessionScope&&!lT(t,r)}function l$(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}}function lF(e,t){var r,n,i,a,o,s,l,d,c,u,p;let f,m,h,w=e.meta?.lockPolicy;if(!w)return e;let g={...e.flags??{}},v=(r=e.command,nD(r)?.lockPolicySelectorOverride===!0),y=v?[]:t?lP(t,g):(n=g,i=e.meta?.lockPlatform,f=[],m=e4(i),void 0!==n.platform&&m&&(a=e4(n.platform),o=m,a&&o&&a!==o&&("apple"===a?!e3(o):"apple"!==o||!e3(a)))&&f.push({key:"platform",value:n.platform}),m&&(s=f,l=n,d=m,(h=l.target)&&function(e,t){switch(t){case"android":case"ios":return"desktop"===e;case"macos":case"linux":case"web":return"desktop"!==e;case"apple":return!1;default:return lG(t)}}(h,d)&&s.push({key:"target",value:h}),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"===e4(r.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":case"web":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return lG(e)}}(r,t)){let r=t[n];nb(r)&&e.push({key:n,value:r})}}(f,n,m)),f),S=e.meta?.lockPlatform;if(0===y.length){return c=v,u=t,p=g,!S||u||void 0!==p.platform||c&&nA(p,nS)||(g.platform=S),{...e,flags:g}}if("strip"===w)return function(e,t,r,n){if(n){lU(e,t),e.platform=n.device.platform;return}lU(e,t),r&&void 0===e.platform&&(e.platform=r)}(g,y,S,t),{...e,flags:g};throw new eL("INVALID_ARGS",function(e,t,r){let n=t.map(lE).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${lD(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,y,t),{session:e.session,conflicts:y.map(lE),hint:function(e,t){if(t)return lk(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${eJ(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 lU(e,t){for(let r of t)delete e[r.key]}function lG(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function lq(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[lj(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return lF(e)}catch{return e}}(n);if("open"===(r=l).command||nA(r.flags,ny))try{let e=await nu(l.flags??{});s.add(lj(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=lV(e)-lV(t);return 0!==r?r:e.localeCompare(t)})}function lj(e){return`device:${e}`}function lV(e){return+!e.startsWith("session:")}function lB(e,t={}){let r=te(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function lH(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:lB(t,{simulatorSetPath:e.simulatorSetPath})}function lK(e,t,r){return i4(lH(e,t),r)}let lW="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 lX(e){if(!(e instanceof eL)||"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 lz(e){return!(e instanceof eL)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lJ(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new eL("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:to({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:tl("IOS_RUNNER_CONNECT_TIMEOUT")})}async function lZ(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=to({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new eL("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
+ let e,t;import{__webpack_require__ as r}from"./rslib-runtime.js";import n,{createHash as i}from"node:crypto";import a from"node:path";import o,{existsSync as s,promises as l}from"node:fs";import d from"node:http";import{fileURLToPath as c,pathToFileURL as u}from"node:url";import"node:https";import p from"node:os";import{once as f}from"node:events";import{Transform as m}from"node:stream";import{pipeline as h}from"node:stream/promises";import{AsyncLocalStorage as w}from"node:async_hooks";import g from"node:fs/promises";import v from"node:net";import{setTimeout as y}from"node:timers/promises";import{resolveUserPath as S}from"./9612.js";import{SCREENSHOT_ACTION_FLAG_KEYS as I,SCROLL_DIRECTIONS as A,leaseScopeToHeartbeatRequest as b,parseScrollDirection as _,leaseScopeToReleaseRequest as x,isStringMember as M,leaseScopeFromRequest as N,isReactNativeCollapsedWarningWrapperWithVisibleBanner as P,deriveMobileSnapshotHiddenContentHints as D,resolveClickButton as k,inferVerticalScrollIndicatorDirections as E,normalizeScrollDurationMs as C,withSuccessText as R,honoredScrollDurationMs as O,runScrollEdgePasses as T,readViewportDimension as L,findMissingProxyLeaseFields as $,annotateCoveredSnapshotNodes as F,parseSwipePreset as U,analyzeReactNativeOverlay as G,readLocationCoordinate as q,getClickButtonValidationError as B,areRectsApproximatelyEqual as j,isSystemScrollIndicatorLabel as V,formatScrollEdgeMessage as K,isProxyLeaseScope as H,SWIPE_PATTERNS as W,successText as X,assertExclusiveScrollDistanceInputs as z,screenshotOptionsFromFlags as J,captureScrollEdgeState as Z,normalizeSnapshotTree as Y,isReactNativeCollapsedWarningWrapperCandidate as Q,screenshotFlagsFromOptions as ee,snapshotCaptureAnnotationsFrom as et,requireIntInRange as er,inferGestureReferenceFrame as en,parseStringMember as ei,parseDeviceRotation as ea,buildScrollGesturePlan as eo,buildSwipePresetGesturePlan as es}from"./2948.js";import{withDiagnosticsScope as el,getDiagnosticsMeta as ed,flushDiagnosticsToSessionFile as ec,withDiagnosticTimer as eu,updateDiagnosticsScope as ep,emitDiagnostic as ef}from"./432.js";import{prewarmPngWorker as em,isKeyboardAction as eh,formatScriptArg as ew,encodePngAsync as eg,acquireProcessLock as ev,terminatePngWorker as ey,appendScriptSeriesFlags as eS,decodePngAsync as eI,formatScriptStringLiteral as eA,formatPortableActionLine as eb,timingSafeStringEqual as e_,createAgentDevice as ex,localCommandPolicy as eM,isTouchTargetCommand as eN,mapManagedAgentBrowserError as eP,resolveAgentBrowserTool as eD,isClickLikeCommand as ek,findMistargetedTypeRefToken as eE}from"./2577.js";import{readProcessStartTime as eC,readProcessCommand as eR,isProcessGroupAlive as eO,isAgentDeviceDaemonProcess as eT,isProcessAlive as eL}from"./9414.js";import{toAppErrorCode as e$,asAppError as eF,normalizeError as eU,AppError as eG}from"./733.js";import{runCmdBackground as eq,runCmdStreaming as eB,runCmd as ej,runCmdSync as eV,resolveExecutableOverridePath as eK,whichCmd as eH}from"./8875.js";import{buildDaemonHealthPayload as eW,consumeTextLines as eX,serializeDaemonResponseEnvelope as ez,normalizeTenantId as eJ,shouldStreamRequestProgress as eZ,resolveDaemonPaths as eY,resolveSessionIsolationMode as eQ,readScreenshotResultData as e0,resolveDaemonServerMode as e1,recordSnapshotTiming as e2,shellQuoteIfNeeded as e3,resolveDaemonCodeSignature as e5,serializeDaemonProgressEnvelope as e4,serializeDaemonRpcResponseEnvelope as e6}from"./1848.js";import{sleep as e8}from"./5560.js";import{isApplePlatform as e9,resolveAppleSimulatorSetPathForSelector as e7,normalizePlatformSelector as te,resolveDevice as tt,resolveApplePlatformName as tr,matchesPlatformSelector as tn}from"./5910.js";import{runAndroidAdb as ti,resolveIosSimulatorDeviceSetPath as ta,getAndroidBlockingDialogFocus as to,withRetry as ts,Deadline as tl,isEnvTruthy as td,openAndroidApp as tc,classifyBootFailure as tu,streamAndroidLogcatWithAdb as tp,bootFailureHint as tf,androidDeviceForSerial as tm,parseSerialAllowlist as th,retryWithPolicy as tw,getAndroidAppState as tg,captureAndroidLogcatWithAdb as tv,resolveAndroidSerialAllowlist as ty,isDeepLinkTarget as tS}from"./3340.js";import{splitNonEmptyTrimmedLines as tI,INTERNAL_COMMANDS as tA,PUBLIC_COMMANDS as tb,GESTURE_SUBCOMMAND_ERROR as t_,stripUndefined as tx,isRecord as tM}from"./5341.js";import{findNearestAncestor as tN,normalizeType as tP,pruneGroupNodes as tD,findNodeByLabel as tk,resolveRefLabel as tE}from"./9836.js";import{snapshotPresentationOptionsFromFlags as tC,normalizeRef as tR,findNodeByRef as tO,buildSnapshotPresentationKey as tT,centerOfRect as tL,attachRefs as t$}from"./4291.js";import{isScrollableType as tF}from"./6024.js";import{parseUiHierarchy as tU,getAndroidSnapshotHelperSessionDeviceKey as tG,parseUiHierarchyTree as tq,ensureAndroidSnapshotHelper as tB,captureAndroidSnapshotWithHelper as tj,captureAndroidSnapshotWithHelperSession as tV,stopAndroidSnapshotHelperSessionForDevice as tK,parseAndroidSnapshotHelperManifest as tH,androidUiNodes as tW,forgetAndroidSnapshotHelperInstall as tX,stopAndroidSnapshotHelperSession as tz,buildUiHierarchySnapshot as tJ}from"./7394.js";import{readVersion as tZ,findProjectRoot as tY}from"./1404.js";import{resolveAndroidAdbProvider as tQ,resolveAndroidAdbExecutor as t0}from"./2954.js";import{applyCommandDefaults as t1}from"./9581.js";var t2,t3,t5={};r.r(t5),r.d(t5,{IH:()=>p2,ug:()=>p3,sE:()=>pW,Bx:()=>pz,hQ:()=>pX,WX:()=>p1,Co:()=>pZ,wg:()=>p0,withAppLogProvider:()=>pV});var t4={};r.r(t4),r.d(t4,{IO:()=>a_,LB:()=>ab,xY:()=>aM,eN:()=>ax,runMacOsPressAction:()=>aD,runMacOsReadTextAction:()=>aP,rR:()=>ak,r5:()=>aN});var t6={};r.r(t6),r.d(t6,{bu:()=>cn,abortAllIosRunnerSessions:()=>uO,hv:()=>uk,Nr:()=>pl,gE:()=>ps,FS:()=>ct,runIosRunnerCommand:()=>po,stopAllIosRunnerSessions:()=>uT,yA:()=>uR});var t8={};r.r(t8),r.d(t8,{v:()=>uz,M:()=>uJ,withAppleRunnerProvider:()=>uZ});var t9={};r.r(t9),r.d(t9,{qx:()=>ai,Ly:()=>as,Gr:()=>ar,vT:()=>aa,Cc:()=>ao,withAppleToolProvider:()=>an});var t7={};r.r(t7),r.d(t7,{readLinuxTextAtPoint:()=>aJ,r:()=>az});var re={};function rt(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}r.r(re),r.d(re,{uK:()=>aO,nE:()=>aL,withLinuxToolProvider:()=>aT});let rr=["platform","device","udid","serial","out","verbose","metroHost","metroPort","bundleUrl","launchUrl","snapshotInteractiveOnly","snapshotDepth","snapshotScope","snapshotRaw",...I,"relaunch","saveScript","noRecord","fps","quality","hideTouches","count","intervalMs","delayMs","holdMs","jitterPx","doubleTap","clickButton","pauseMs","pattern"];function rn(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 ri(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}class ra{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let r=a.dirname(t);o.existsSync(r)||o.mkdirSync(r,{recursive:!0});let n=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&&ro(e.command))return ek(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=rn(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(!ro(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,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=${eA(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,ek(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(ew(r)),rs(e,t),eS(e,t),e.join(" ");if(1===t.positionals.length)return e.push(ew(r)),eS(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(ew(r)),rs(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(ew(n)),eS(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(ew(r)),e.push(ew(n)),n.startsWith("@")&&rs(e,t),e.join(" ")}(t,r):void 0);return n||eb(e)}(e));return`${n.join("\n")}
2
+ `}(e);return o.writeFileSync(t,n),{written:!0,path:t}}catch(r){return ef({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 S(e.saveScriptPath,{cwd:void 0});o.existsSync(this.sessionsDir)||o.mkdirSync(this.sessionsDir,{recursive:!0});let t=rt(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return a.join(this.sessionsDir,`${t}-${r}.ad`)}}function ro(e){return eN(e)||"fill"===e||"get"===e}function rs(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(ew(r))}class rl{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new ra(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=S(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 rr)void 0!==e[r]&&(t[r]=e[r]);return t}(t.flags),result:t.result}),ef({level:"debug",phase:"record_action",data:{command:t.command,session:e.name}}))}writeSessionLog(e){let t=this.scriptWriter.write(e);t.written&&ef({level:"info",phase:"session_script_written",data:{session:e.name,path:t.path}})}defaultTracePath(e){let t=rt(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return a.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return a.join(this.sessionsDir,rt(e))}ensureSessionDir(e){let t=this.resolveSessionDir(e);return o.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return a.join(this.resolveSessionDir(e),"app.log")}resolveAppLogPidPath(e){return a.join(this.resolveSessionDir(e),"app-log.pid")}static expandHome(e,t){return S(e,{cwd:t})}}function rd(e){return a.join(e,"runner.log")}function rc(e,t){let r=rt(t&&t.length>0?t:"unknown");return a.join(e,"requests",`${r}.ndjson`)}let ru="app-log.pid";function rp(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 rf(e,t){if(!e)return;let r=a.dirname(e);o.existsSync(r)||o.mkdirSync(r,{recursive:!0});let n={pid:t,startTime:eC(t)??void 0,command:eR(t)??void 0};o.writeFileSync(e,`${JSON.stringify(n)}
3
+ `)}function rm(e){if(e&&o.existsSync(e))try{o.unlinkSync(e)}catch{}}let rh=new Set,rw=new Map,rg="request_canceled",rv="request canceled";function ry(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 rS(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++}}(rw);let t=new AbortController;rw.set(e,t),rh.has(e)&&t.abort()}function rI(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++}}(rh),rh.add(e),rw.get(e)?.abort())}function rA(e){e&&(rh.delete(e),rw.delete(e))}function rb(e){return!!e&&rh.has(e)}function r_(e){if(e)return rw.get(e)?.signal}function rx(){return new eG("COMMAND_FAILED",rv,{reason:rg})}function rM(e){if(rb(e))throw rx()}function rN(e){return e instanceof eG&&"COMMAND_FAILED"===e.code&&(e.details?.reason===rg||e.message===rv)}let rP=new Map;function rD(e){let t=n.randomUUID(),r=setTimeout(()=>{rk(t)},9e5);return r.unref(),rP.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:r}),t}function rk(e){let t=rP.get(e);if(t&&(clearTimeout(t.timer),rP.delete(e),t.deleteAfterDownload))try{o.rmSync(t.artifactPath,{force:!0})}catch{}}let rE=new Map;function rC(e,t){let r=rE.get(e);if(!r)throw new eG("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eG("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function rR(e){let t=rE.get(e);t&&(clearTimeout(t.timer),rE.delete(e),o.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function rO(e){let t=await rT(e);await ej("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=a.join(e.tempDir,t);if(!o.existsSync(r))throw new eG("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function rT(e){let t=await ej("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new eG("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 eG("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 eG("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new eG("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 eG("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 eG("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 eG("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await ej("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new eG("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rL(e){if(e.includes("\0"))throw new eG("INVALID_ARGS",`Invalid archive entry: ${e}`);if(a.posix.isAbsolute(e))throw new eG("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=a.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new eG("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function r$(e,t){return new Promise((r,n)=>{let i,a=!1,s=0,l=o.createWriteStream(t),d=e=>{if(!a){if(a=!0,i&&clearTimeout(i),e)return void rF(l,t).finally(()=>n(e));r()}},c=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new eG("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 m({transform(e,t,r){c();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new eG("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{d(new eG("COMMAND_FAILED","Artifact transfer was interrupted"))}),c(),h(e,u,l).then(()=>d(),e=>d(e))})}async function rF(e,t){if(e.destroy(),!e.closed)try{await f(e,"close")}catch{}await o.promises.rm(t,{force:!0}).catch(()=>{})}async function rU(e){let t,r=e.headers["x-artifact-type"],n=e.headers["x-artifact-filename"];if(!r||!n)throw new eG("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new eG("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 eG("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let i=function(e){let t=e.trim(),r=a.basename(t);if(!r||"."===r||".."===r)throw new eG("INVALID_ARGS",`Invalid artifact filename: ${e}`);return r}(n),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"),o.mkdtempSync(a.join(p.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===r){let t=a.join(s,i);return await r$(e,t),{artifactPath:t,tempDir:s}}let t=a.join(s,"artifact.tar");await r$(e,t);let n=await rO({archivePath:t,tempDir:s,platform:"ios",expectedRootName:i});return o.rmSync(t,{force:!0}),{artifactPath:n,tempDir:s}}catch(e){throw o.rmSync(s,{recursive:!0,force:!0}),e}}let rG=new w,rq=new w;async function rB(e,t){return await rG.run(e,t)}function rj(e){rG.getStore()?.(e)}async function rV(e,t){return await rq.run(e,t)}function rK(){return rq.getStore()}let rH=new Set(["replay","test"]),rW=new Set(["agent_device.command","agent-device.command"]),rX=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rz=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rJ={"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"},rZ=new Set([...rW,...rX,...rz,...Object.keys(rJ)]);function rY(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rQ(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function r0(e,t){e.destroyed||(e.write(e6(t)),e.end())}function r1(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function r2(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 r3(e,t){let r=e[t];return"string"==typeof r?r:void 0}function r5(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function r4(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new eG("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function r6(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new eG("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function r8(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=eU(new eG("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rY(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=eU(new eG(e$(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rY(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=eJ(r.tenantId);if(!e){let e=eU(new eG("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rY(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function r9(){let e,t=process.env.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let r=process.env.AGENT_DEVICE_HTTP_AUTH_EXPORT||"default",n=a.isAbsolute(t)?t:a.resolve(t);try{e=await import(u(n).href)}catch(e){throw new eG("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:n,error:e instanceof Error?e.message:String(e)})}let i=e[r];if("function"!=typeof i)throw new eG("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:n,exportName:r});return i}async function r7(e){let t=await r9(),{handleRequest:r,token:n}=e;return d.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify(eW("agent-device-daemon")));return}if("POST"===e.method&&"/upload"===e.url)return void ne(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void nt(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||rQ(i,rY(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rQ(i,rY(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rQ(i,rY(n.id??null,-32600,"Invalid Request"),400);if(!rZ.has(n.method))return void rQ(i,rY(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rQ(i,rY(n.id??null,-32602,"Invalid params"),400);let s=!1;try{var l,d;let a=n.params,c=function(e,t,r){if(rW.has(e))return{token:r2(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(rX.has(e)){let e,n=r3(t,"platform");if("ios"!==n&&"android"!==n)throw new eG("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:r2(t,r),session:r3(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:r3(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new eG("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new eG("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 eG("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 eG("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 eG("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=r4(e,"owner"),n=r4(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new eG("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new eG("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new eG("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:r6(e,"artifactId")}:(a&&(t=r6(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:r4(e,"artifactName")})}(t);throw new eG("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:r5(t,"retentionMs")}}}if(rz.has(e)){let e=r3(t,"materializationId")?.trim();if(!e)throw new eG("INVALID_ARGS","Invalid params: materializationId is required");return{token:r2(t,r),session:r3(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:r3(t,"requestId"),materializationId:e}}}let n=rJ[e];if(n)return{token:r2(t,r),session:r3(t,"session")??"default",command:n,positionals:[],meta:{tenantId:r3(t,"tenantId")??r3(t,"tenant"),runId:r3(t,"runId"),leaseId:r3(t,"leaseId"),leaseTtlMs:r5(t,"ttlMs"),leaseBackend:r3(t,"backend"),leaseProvider:r3(t,"leaseProvider")??r3(t,"provider"),deviceKey:r3(t,"deviceKey"),clientId:r3(t,"clientId")}};throw new eG("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(l=n.method,rW.has(l)&&("string"!=typeof c.command||0===c.command.length))return void rQ(i,rY(n.id??null,-32602,"Invalid params: command is required"),400);o=ry(c.meta?.requestId,n.id),c.meta={...c.meta,requestId:o},rS(o);let u=await r8(t,{headers:e.headers,rpcRequest:n,daemonRequest:c});if(!u.ok)return void rQ(i,u.response,u.statusCode);u.tenantId&&(c.meta={...c.meta,tenantId:u.tenantId,sessionIsolation:c.meta?.sessionIsolation??c.flags?.sessionIsolation??"tenant"});let p=(d=c,d.flags?.platform!=="android"&&(d.flags?.platform==="ios"||rH.has(d.command))),f=!1,m=()=>{s||i.writableFinished||f||(f=!0,rI(o),ef({level:"warn",phase:"request_client_disconnected",data:{requestId:o,abortIosRunnerSessions:p}}),p&&nr(o))};if(e.on("aborted",m),i.on("close",()=>{i.headersSent&&m()}),(e.aborted||i.destroyed&&i.headersSent)&&m(),eZ(c)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await rB(e=>{!i.destroyed&&i.write(e4(e))},async()=>await r(c));s=!0;let t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rY(n.id??null,-32e3,e.error.message,e.error);r0(i,t);return}let h=await r(c);if(s=!0,h.ok)return void rQ(i,{jsonrpc:"2.0",id:n.id??null,result:h});rQ(i,rY(n.id??null,-32e3,h.error.message,h.error),r1(h.error.code))}catch(t){s=!0;let e=eU(t);if(i.headersSent)return void r0(i,rY(n.id??null,-32e3,e.message,e));rQ(i,rY(n.id??null,-32e3,e.message,e),r1(e.code))}finally{rA(o)}})})}async function ne(e,t,r,i){try{var a;let o,s,l=await nn({req:e,res:t,authHook:r,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=n.randomUUID(),(s=setTimeout(()=>{rR(o)},3e5)).unref(),rE.set(o,{artifactPath:a.artifactPath,tempDir:a.tempDir,tenantId:a.tenantId,timer:s}),o);t.statusCode=200,t.setHeader("content-type","application/json"),t.end(JSON.stringify({ok:!0,uploadId:c}))}catch(e){ni(t,eU(e))}}async function nt(e,t,r,n){let i=e.url?.slice("/artifacts/".length)??"";if(!i){t.statusCode=400,t.end("Missing artifact id");return}try{let a=await nn({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[i]}});if(!a)return;let s=function(e,t){let r=rP.get(e);if(!r)throw new eG("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eG("UNAUTHORIZED","Artifact belongs to a different tenant");if(!o.existsSync(r.artifactPath))throw rk(e),new eG("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(i,a.tenantId),l=o.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=eU(e);t.statusCode=r1(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rk(i)}),l.pipe(t)}catch(e){ni(t,eU(e))}}async function nr(e){try{let t=Date.now()+15e3;for(;rb(e)&&Date.now()<t;){let{abortAllIosRunnerSessions:t}=await Promise.resolve(t6);if(await t(),!rb(e))break;await e8(200)}}catch(e){ef({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e)}})}}async function nn(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=r2({},n.headers),d=(t=l,!(r=o)||e_(t,r)?null:eU(new eG("UNAUTHORIZED","Invalid token")));if(d)return ni(i,d),null;let c=await r8(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 ni(e,t){e.statusCode=r1(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}let na="default";function no(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function ns(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function nl(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 eG("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}function nd(e){if(void 0===e)return;let t=e.trim();if(!t||t.length>256||!/^[\x20-\x7E]+$/.test(t))throw new eG("INVALID_ARGS","Invalid device key. Use 1-256 printable characters.");return t}function nc(e){return np(e,"client id",128)}function nu(e){return np(e,"lease provider",64)}function np(e,t,r){if(void 0===e)return;let n=e.trim();if(!n||n.length>r||!/^[a-zA-Z0-9._-]+$/.test(n))throw new eG("INVALID_ARGS",`Invalid ${t}. Use 1-${String(r)} chars: letters, numbers, dot, underscore, hyphen.`);return n}class nf{leases=new Map;runBindings=new Map;deviceBindings=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 t={backend:nl(e.leaseBackend),leaseProvider:nu(e.leaseProvider),deviceKey:nd(e.deviceKey),clientId:nc(e.clientId),tenantId:function(e){let t=eJ(e);if(!t)throw new eG("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return t}(e.tenantId),runId:function(e){let t=no(e);if(!t)throw new eG("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return t}(e.runId),ttlMs:e.ttlMs};this.cleanupExpiredLeases();let r=this.resolveLeaseTtlMs(t.ttlMs),n=this.refreshExistingRunBinding(t,r);if(n)return n;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=this.createLease(t,r);return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}refreshExistingRunBinding(e,t){let r=this.bindingKey(e),n=this.runBindings.get(r);if(!n)return;let i=this.leases.get(n);return i?(this.canReuseRunBinding(i,e)||(i.deviceKey&&this.throwDeviceBusy(i),this.assertOptionalLeaseIdentityMatch(i,e)),this.refreshLease(i,t)):void this.runBindings.delete(r)}createLease(e,t){let r=this.now();return{leaseId:n.randomBytes(16).toString("hex"),tenantId:e.tenantId,runId:e.runId,backend:e.backend,...e.leaseProvider?{leaseProvider:e.leaseProvider}:{},...e.deviceKey?{deviceKey:e.deviceKey}:{},...e.clientId?{clientId:e.clientId}:{},createdAt:r,heartbeatAt:r,expiresAt:r+t}}heartbeatLease(e){let t=this.normalizeRequiredLeaseId(e.leaseId);this.cleanupExpiredLeases();let r=this.getActiveLease(t);this.assertRequiredScopeForDeviceAwareLease(r,e),this.assertOptionalScopeMatch(r,e);let n=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(r,n)}releaseLease(e){let t=this.normalizeRequiredLeaseId(e.leaseId);this.cleanupExpiredLeases();let r=this.leases.get(t);return r?(this.assertRequiredScopeForDeviceAwareLease(r,e),this.assertOptionalScopeMatch(r,e),this.leases.delete(t),this.unbindLease(r),{released:!0}):{released:!1}}assertLeaseAdmission(e){let t=nl(e.leaseBackend),r=eJ(e.tenantId);if(!r)throw new eG("INVALID_ARGS","tenant isolation requires tenant id.");let n=no(e.runId);if(!n)throw new eG("INVALID_ARGS","tenant isolation requires run id.");let i=ns(e.leaseId);if(!i)throw new eG("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.getActiveLease(i);this.assertOptionalScopeMatch(a,{tenantId:r,runId:n,leaseBackend:t,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}consumeExpiredLeases(){let e=this.now(),t=[];for(let r of this.leases.values())r.expiresAt>e||(this.leases.delete(r.leaseId),this.unbindLease(r),t.push({...r}));return t}consumeExpiredLease(e){let t=ns(e);if(!t)return;let r=this.leases.get(t);if(!(!r||r.expiresAt>this.now()))return this.leases.delete(r.leaseId),this.unbindLease(r),{...r}}cleanupExpiredLeases(){this.consumeExpiredLeases()}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 eG("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 eG("INVALID_ARGS",`Lease ttlMs must be between ${this.minLeaseTtlMs} and ${this.maxLeaseTtlMs}.`);return t}normalizeRequiredLeaseId(e){let t=ns(e);if(!t)throw new eG("INVALID_ARGS","Invalid lease id.");return t}getActiveLease(e){let t=this.leases.get(e);if(t)return t;throw new eG("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"})}refreshLease(e,t){let r=this.now(),n={...e,heartbeatAt:r,expiresAt:r+t};return this.leases.set(n.leaseId,n),this.bindLease(n),{...n}}bindLease(e){this.runBindings.set(this.bindingKey({tenantId:e.tenantId,runId:e.runId,backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey}),e.leaseId);let t=this.deviceBindingKey(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e){this.runBindings.delete(this.bindingKey({tenantId:e.tenantId,runId:e.runId,backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey}));let t=this.deviceBindingKey(e);t&&this.deviceBindings.delete(t)}bindingKey(e){return JSON.stringify([e.tenantId,e.runId,e.backend,e.leaseProvider??na,e.deviceKey??"*"])}deviceBindingKey(e){if(e.deviceKey)return JSON.stringify([e.backend,e.leaseProvider??na,e.deviceKey])}assertDeviceAvailable(e){let t=this.deviceBindingKey({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let r=this.deviceBindings.get(t);if(!r)return;let n=this.leases.get(r);n?this.throwDeviceBusy(n):this.deviceBindings.delete(t)}canReuseRunBinding(e,t){return e.clientId===t.clientId}throwDeviceBusy(e){throw new eG("COMMAND_FAILED","Device is already leased",{reason:"DEVICE_LEASE_BUSY",deviceKey:e.deviceKey,backend:e.backend,leaseProvider:e.leaseProvider,expiresAt:e.expiresAt,hint:"Retry after the lease expires or close the owning session."})}assertRequiredScopeForDeviceAwareLease(e,t){(e.leaseProvider??e.deviceKey??e.clientId)&&(t.tenantId&&t.runId&&[[e.leaseProvider,t.leaseProvider],[e.deviceKey,t.deviceKey],[e.clientId,t.clientId]].every(([e,t])=>!e||!!t)||this.throwScopeRequired())}assertOptionalScopeMatch(e,t){let r=this.normalizeOptionalScopeMatchRequest(t);(r.tenantId&&e.tenantId!==r.tenantId||r.runId&&e.runId!==r.runId||r.leaseBackend&&e.backend!==r.leaseBackend)&&this.throwScopeMismatch(),this.assertOptionalLeaseIdentityMatch(e,r)}normalizeOptionalScopeMatchRequest(e){let t=eJ(e.tenantId),r=no(e.runId);if(e.tenantId&&!t)throw new eG("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(e.runId&&!r)throw new eG("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return{tenantId:t,runId:r,leaseBackend:e.leaseBackend?nl(e.leaseBackend):void 0,leaseProvider:nu(e.leaseProvider),deviceKey:nd(e.deviceKey),clientId:nc(e.clientId)}}assertOptionalLeaseIdentityMatch(e,t){t.leaseProvider&&e.leaseProvider!==t.leaseProvider&&this.throwScopeMismatch(),t.deviceKey&&e.deviceKey!==t.deviceKey&&this.throwScopeMismatch(),t.clientId&&e.clientId!==t.clientId&&this.throwScopeMismatch()}throwScopeMismatch(){throw new eG("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}throwScopeRequired(){throw new eG("UNAUTHORIZED","Lease owner scope is required",{reason:"LEASE_SCOPE_REQUIRED"})}}let nm={platform:"web",id:"agent-browser-chrome",name:"Agent Browser Chrome",kind:"device",target:"desktop",booted:!0};async function nh(e){var t;if("web"===e.platform)return[nm];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("./3340.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("./3340.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 nw=new w,ng=new w;async function nv(e,t,r){var n,i;let a=await ny(e,t,r);if(n=t,i=a,!nS(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 eG("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function ny(e,t,r){try{return await tt(e,t,r)}catch(e){var n;if(n=e,!nS(t)&&n instanceof eG&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function nS(e){return!!(e.udid||e.serial||e.deviceName)}async function nI(e){let t=te(e.platform),r=e7({simulatorSetPath:ta(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=ty(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 eu("resolve_target_device",async()=>{let o=function(e){let t=nw.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 eG("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await nM({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return nN(s)?nP(i,await nv(l,s,{simulatorSetPath:r})):nP(i,await tt(l,s,{simulatorSetPath:r}));let d=await nh({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return nN(s)?nP(i,await nv(d,s,{simulatorSetPath:r})):nP(i,await tt(d,s,{simulatorSetPath:r}))},a)}async function nA(e){return nw.getStore()?await e():await nw.run(new Map,e)}async function nb(e,t){return e?await ng.run(e,t):await t()}async function n_(e,t){return await nb(e,async()=>await nA(t))}async function nx(e){return await nM(e)??await nh(e)}async function nM(e){let t=ng.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function nN(e){return e9(e.platform)}function nP(e,t){return nw.getStore()?.set(e,{...t}),t}let nD=["platform","target","device","udid","serial"],nk=[...nD,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function nE(e){return nR(e,nD)}function nC(e){return"string"==typeof e&&e.trim().length>0}function nR(e,t){return!!e&&t.some(t=>nC(e[t]))}let nO={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},nT=function(e){let t=new Map;for(let r of e){if(t.has(r.command))throw Error(`Duplicate daemon command descriptor: ${r.command}`);t.set(r.command,r)}return{descriptorsByCommand:t}}([...nU("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},tA.leaseAllocate,tA.leaseHeartbeat,tA.leaseRelease),nF(tA.sessionList,"session",{sessionKind:"inventory",...nO}),nF(tb.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...nO}),nF(tb.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...nU("session",{sessionKind:"state"},tb.boot,tb.shutdown,tb.appState),...nU("session",{sessionKind:"observability"},tb.perf,tb.logs,tb.network),...nU("session",{sessionKind:"replay",skipSessionlessProviderDevice:function(e){return e.command===tb.test&&("number"==typeof e.flags?.shardAll||"number"==typeof e.flags?.shardSplit)}},tb.replay,tb.test),nF(tA.runtime,"session"),nF(tb.clipboard,"session",{replayScopedAction:!0}),nF(tb.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...nU("session",{},tb.install,tb.reinstall,tA.installSource),nF(tA.releaseMaterializedPaths,"session",nO),...nU("session",{},tb.push,tb.triggerAppEvent),nF(tb.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...nU("session",{},tb.prepare,tb.batch),nF(tb.close,"session",{allowInvalidRecording:!0}),...nU("snapshot",{replayScopedAction:!0},tb.snapshot,tb.diff,tb.wait,tb.alert,tb.settings),nF(tb.reactNative,"reactNative",{replayScopedAction:!0}),nF(tb.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),nF(tb.trace,"recordTrace"),nF(tb.find,"find",{replayScopedAction:!0}),...nU("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},tb.click,tb.fill,tb.longPress,tb.press,tb.type),...nU("interaction",{replayScopedAction:!0},tb.get,tb.is),...nU("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},tb.back,tb.gesture,tb.home,tb.rotate,tb.scroll,tb.swipe,"pinch"),nF(tb.focus,"generic",{androidBlockingDialogGuard:!0}),nF(tb.screenshot,"generic",{replayScopedAction:!0}),nF(tb.viewport,"generic",{replayScopedAction:!0}),...nU("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function nL(e){return nG(e)?.sessionKind}function n$(e){return nG(e)?.leaseAdmissionExempt===!0}function nF(e,t,r={}){return{command:e,route:t,...r}}function nU(e,t,...r){return r.map(r=>nF(r,e,t))}function nG(e){return nT.descriptorsByCommand.get(e)}let nq=[{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("./2954.js");nH(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&e9(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(t8);nH(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&&e9(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(t9);nH(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(re);nH(t,e.linuxTool,r)}},{resolverKey:"webProvider",resolve(e,t){let r=e.webProvider;return r&&"web"===t.device.platform?{web:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.web?.provider)return;let{withWebProvider:r}=await import("./provider.js");nH(t,e.web,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(t5);nH(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");nH(t,e.recording,r)}}];async function nB(e,t){let r=await nj(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await nK(r);return await nW(i,async()=>await t(n))}async function nj(e){var t,r,n;if(t=e.providers,!nq.some(e=>!!t[e.resolverKey]))return{};let i=await nV(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return nq.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function nV(e,t){switch(function(e,t){var r;let n,i;if(t.hasExistingSession)return nG(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(r=e,"function"==typeof(i=nG(r.command)?.skipSessionlessProviderDevice)&&i(r))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(n=nG(e.command)?.allowSessionlessDefaultDevice)&&n(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:nE(e.flags)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await nI(e.flags??{});case"skip":return}}async function nK(e){let t=[];for(let r of nq)await r.appendWrapper(e,t);return t}function nH(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function nW(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function nX(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"web":{let{createWebInteractor:e}=await import("./web.js");return e()}case"ios":case"macos":{let{createAppleInteractor:r}=await import("./apple.js");return r(e,t)}default:throw new eG("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let nz=/^[A-Za-z0-9_.:-]{1,64}$/,nJ="--launch-console is supported only for iOS simulator app launches",nZ="--launch-console requires a direct app launch and cannot be used with URL opens",nY=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function nQ(e,t){if(t<=0)return[0,0];let[r,n]=nY[e%nY.length];return[r*t,n*t]}async function n0(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await e8(t)}let n1=["tap","doubleTap","longPress","drag"];function n2(e,t,r){return new eG("INVALID_ARGS",r,{stepIndex:e,kind:"string"==typeof t?t:void 0})}function n3(e,t,r,n,i,a){if(!Number.isFinite(e)||e<t||e>r)throw n2(n,i,`sequence step ${n} (${i}) ${a} must be between ${t} and ${r}`)}function n5(e,t){if(!Array.isArray(e)||0===e.length)throw new eG("INVALID_ARGS","sequence requires at least one step",{stepCount:Array.isArray(e)?e.length:0});if(e.length>20)throw new eG("INVALID_ARGS",`sequence accepts at most 20 steps, received ${e.length}`,{stepCount:e.length,maxSteps:20});return e.forEach((e,t)=>(function(e,t){var r;if(!("string"==typeof(r=e.kind)&&n1.includes(r)))throw n2(t,e.kind,`sequence step ${t} has unsupported kind "${String(e.kind)}"; allowed: ${n1.join(", ")}`);if(!Number.isFinite(e.x)||!Number.isFinite(e.y))throw n2(t,e.kind,`sequence step ${t} (${e.kind}) requires finite x and y`);if("drag"===e.kind&&(!Number.isFinite(e.x2)||!Number.isFinite(e.y2)))throw n2(t,e.kind,`sequence step ${t} (drag) requires finite x2 and y2`);void 0!==e.durationMs&&n3(e.durationMs,0,1e4,t,e.kind,"durationMs"),void 0!==e.pauseMs&&n3(e.pauseMs,0,1e4,t,e.kind,"pauseMs")})(e,t)),{command:"sequence",steps:e,appBundleId:t}}function n4(e){var t,r,n,i;let a=Array.isArray(t=e.sequenceResults)?t.map(e=>{let t=e??{};return{ok:!0===t.ok,kind:"string"==typeof t.kind?t.kind:"unknown",errorCode:"string"==typeof t.errorCode?t.errorCode:void 0,errorMessage:"string"==typeof t.errorMessage?t.errorMessage:void 0,gestureStartUptimeMs:"number"==typeof t.gestureStartUptimeMs?t.gestureStartUptimeMs:void 0,gestureEndUptimeMs:"number"==typeof t.gestureEndUptimeMs?t.gestureEndUptimeMs:void 0}}):[],o="number"==typeof e.completedSteps&&Number.isFinite(e.completedSteps)?e.completedSteps:a.filter(e=>e.ok).length,s="number"==typeof e.failedStepIndex&&Number.isFinite(e.failedStepIndex)?e.failedStepIndex:a.findIndex(e=>!e.ok)>=0?a.findIndex(e=>!e.ok):void 0;if(void 0!==s){let e,t,l;throw r=a,n=o,e=r[i=s],t=e?.kind??"step",l=e?.errorMessage??`sequence step ${i} (${t}) failed`,new eG(e$(e?.errorCode),l,{failedStepIndex:i,failedStepKind:t,completedSteps:n,sequenceResults:r,hint:"Run snapshot -i to inspect the current UI, then continue from the observed state."})}return{results:a,completedSteps:o,failedStepIndex:s}}async function n6(e,t){let{x:r,y:n}=ii(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, 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,...X(`Long pressed (${r}, ${n})`)}}async function n8(e,t){let{x:r,y:n}=ii(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...X(`Focused (${r}, ${n})`)}}async function n9(e,t,r){let n=eE(t[0]);if(n)throw new eG("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 eG("INVALID_ARGS","type requires text");let a=er(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...X(iP("Typed",i))}}async function n7(e,t,r){if(r?.directElementSelector)return await ie(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 eG("INVALID_ARGS","fill requires x y text");let o=er(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...X(iP("Filled",a))}}async function ie(e,t,r,n){if(!e.fillElementSelector)throw new eG("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new eG("INVALID_ARGS","fill requires text");let a=er(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...X(iP("Filled",i))}}async function it(e,t,r,n){var i,a;if(n?.directElementSelector&&"ios"===e.platform)return await ir(t,n.directElementSelector);let{x:o,y:s}=ii(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await ia(o,s,n);let l=k(n);if("primary"!==l)return await io(e,o,s,l,n);let d=(a=n,{count:il(a?.count,1,"count",1,200),intervalMs:il(a?.intervalMs,0,"interval-ms",0,1e4),holdMs:il(a?.holdMs,0,"hold-ms",0,1e4),jitterPx:il(a?.jitterPx,0,"jitter-px",0,100),doubleTap:!!a?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new eG("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new eG("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(d),i=d.count,e9(e.platform)&&i>1)?await ic(e,o,s,d,n):await iu(t,o,s,d)}async function ir(e,t){if(!e.tapElementSelector)throw new eG("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...X(`Tapped ${t.raw}`)}}function ii(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new eG("INVALID_ARGS",t,r);return{x:n,y:i}}async function ia(e,t,r){let n=k(r);if("primary"!==n)throw new eG("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(t4);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...X(iM({x:e,y:t}))}}async function io(e,t,r,n,i){if(function(e,t,r){let n=B({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 is(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(t6);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},ip(i)),{x:t,y:r,button:n,...X(iM({x:t,y:r,button:n}))}}async function is(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,...X(iM({x:e,y:t,button:r}))}}function il(e,t,r,n,i){return er(void 0===e?t:e,r,n,i)}async function id(e,t,r){let n,i,{runIosRunnerCommand:a}=await Promise.resolve(t6),o=function(e,t=2e4){if(0===e.length)return[];let r=[],n=[],i=0;for(let a of e){let e=(a.durationMs??0)+(a.pauseMs??0)+250,o=n.length>0&&i+e>t,s=n.length>=20;(o||s)&&(r.push(n),n=[],i=0),n.push(a),i+=e}return n.length>0&&r.push(n),r}(t),s=0,l=[],d=0;for(let t of o){let o,c=await a(e,n5(t,r?.appBundleId),ip(r));n??=c,i=c;try{o=n4(c)}catch(e){throw function(e,t){if(0===t||!(e instanceof eG)||!e.details)return e;let r=e.details.failedStepIndex;if("number"!=typeof r)return e;let n=e.details.completedSteps;return new eG(e.code,e.message,{...e.details,failedStepIndex:r+t,chunkStepIndex:r,..."number"==typeof n?{completedSteps:t+n}:{}},e.cause)}(e,d)}s+=o.completedSteps,l.push(...o.results),d+=t.length}return{...n??{},completedSteps:s,sequenceResults:l,...i?.gestureEndUptimeMs!==void 0?{gestureEndUptimeMs:i.gestureEndUptimeMs}:{}}}async function ic(e,t,r,n,i){var a,o,s,l;let d,c,u=await id(e,(a=e,o=t,s=r,c="tap"==(d=(l=n).doubleTap?"doubleTap":l.holdMs>0?"longPress":"tap")&&"ios"===a.platform&&"tv"!==a.target,Array.from({length:l.count},(e,t)=>{let[r,n]=nQ(t,l.jitterPx),i=t===l.count-1;return{kind:d,x:o+r,y:s+n,...c?{synthesized:!0}:{},...l.holdMs>0?{durationMs:l.holdMs}:{},...!i&&l.intervalMs>0?{pauseMs:l.intervalMs}:{}}})),i);return{x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,timingMode:"runner-sequence",...u,...X(iM({x:t,y:r}))}}async function iu(e,t,r,n){let i;return await n0(n.count,n.intervalMs,async a=>{let[o,s]=nQ(a,n.jitterPx),l=t+o,d=r+s;if(n.doubleTap){let t=await e.doubleTap(l,d);i??=t??void 0;return}if(n.holdMs>0){let t=await e.longPress(l,d,n.holdMs);i??=t??void 0}else{let t=await e.tap(l,d);i??=t??void 0}}),R({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},iM({x:t,y:r}))}function ip(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir}}async function im(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 eG("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await iw({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function ih(e,t,r,n){let i=U(r[0]),a=r[1]?Number(r[1]):300,o=en((await t.snapshot({appBundleId:n?.appBundleId})).nodes??[]);if(!o)throw new eG("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=es(i,o,{platform:e.platform});return await iw({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function iw(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:d}=e,c=er(l,"durationMs",16,1e4),u=er(n?.count??1,"count",1,200),p=er(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if(!M(W,f))throw new eG("INVALID_ARGS",`Invalid pattern: ${f}`);if(e9(t.platform)&&u>1){let e=await id(t,function(e){let{device:t,x1:r,y1:n,x2:i,y2:a,count:o,pauseMs:s,pattern:l,effectiveDurationMs:d}=e,c="ios"===t.platform&&"tv"!==t.target;return Array.from({length:o},(e,t)=>{let u="ping-pong"===l&&t%2==1,p=t===o-1;return{kind:"drag",x:u?i:r,y:u?a:n,x2:u?r:i,y2:u?n:a,durationMs:d,...c?{synthesized:!0}:{},...!p&&s>0?{pauseMs:s}:{}}})}({device:t,x1:i,y1:a,x2:o,y2:s,count:u,pauseMs:p,pattern:f,effectiveDurationMs:c}),n);return{x1:i,y1:a,x2:o,y2:s,...d?{preset:d}:{},durationMs:c,effectiveDurationMs:c,timingMode:"runner-sequence",count:u,pauseMs:p,pattern:f,...e,...X(iN(u,f))}}return await n0(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)}),R({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}`:iN(u,f))}async function ig(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 eG("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=er(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??{},...X(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function iv(e,t){let r=ei(A,t[0],{message:"fling direction must be up, down, left, or right"}),n=Number(t[1]),i=Number(t[2]);if(![n,i].every(Number.isFinite))throw new eG("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new eG("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=er(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,...X(`Flung ${r}`)}}async function iy(e,t,r){var n,i,a,o,s,l,d,c;let u,p=t[0],f=t[1]?Number(t[1]):void 0,m=r?.pixels,h=r?.durationMs;if(!p)throw new eG("INVALID_ARGS","scroll requires direction");n=f,i=m,a=h,function(e){if(void 0!==e&&!Number.isFinite(e))throw new eG("INVALID_ARGS","scroll amount must be a number")}(n),C(a),z({amount:n,pixels:i});let w="bottom"===(o=p)?{direction:"down",edge:"bottom"}:"top"===o?{direction:"up",edge:"top"}:{direction:_(o)},g={amount:f,pixels:m,durationMs:h},{interactionResult:v,completedPasses:y}=await iS(e,r,w,g);return R((s=w,l=g,d=y,u=O(c=v),{direction:s.direction,...s.edge?{edge:s.edge,passes:d}:{},...void 0!==l.amount?{amount:l.amount}:{},...void 0!==l.pixels?{pixels:l.pixels}:{},...void 0!==u?{durationMs:u}:{},...c}),K(w.direction,w.edge,y,f,m))}async function iS(e,t,r,n){if(r.edge){let i=r.edge,a=await T({edge:i,captureState:async r=>await iI(e,t,i,r),scroll:async()=>await e.scroll(r.direction,n)});return{interactionResult:a.result??{},completedPasses:a.passes}}return{interactionResult:await e.scroll(r.direction,n)??{},completedPasses:1}}async function iI(e,t,r,n){if("function"!=typeof e.snapshot)throw new eG("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await Z({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,scope:e})).nodes??[]})}async function iA(e,t,r,n){if("tv"===e.target)throw new eG("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new eG("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 eG("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...X(`Pinched to scale ${i}`)}}async function ib(e,t,r){if("tv"===e.target)throw new eG("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new eG("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 eG("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 eG("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 eG("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 eG("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,...X(`Rotated gesture ${n} degrees`)}}async function i_(e,t,r){if("tv"===e.target)throw new eG("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new eG("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 eG("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new eG("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:er(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...X(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function ix(e,t,r){let{x:n,y:i}=ii(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(t7);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(t4);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(t6),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,iosXctestrunFile:r?.iosXctestrunFile,iosXctestDerivedDataPath:r?.iosXctestDerivedDataPath,iosXctestEnvDir:r?.iosXctestEnvDir});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function iM(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function iN(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function iP(e,t){return`${e} ${Array.from(t).length} chars`}function iD(e,t){let r,n=t?.subject??"Payload",i=e.trim();if(!i)throw new eG("INVALID_ARGS",`${n} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!o.statSync(a).isFile())throw new eG("INVALID_ARGS",`${n} path is not a file: ${a}`);return{kind:"file",path:a}}catch(t){if(t instanceof eG)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new eG("INVALID_ARGS",`${n} file is not readable: ${a}`);if(e&&"ENOENT"!==e)throw new eG("COMMAND_FAILED",`Unable to read ${n} file: ${a}`,{cause:String(t)})}if((r=i.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:i};throw new eG("INVALID_ARGS",`${n} file not found: ${a}`)}async function ik(e){let t=iD(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await iE(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new eG("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof eG)throw t;throw new eG("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function iE(e){try{return await l.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new eG("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new eG("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new eG("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new eG("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function iC(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath,iosXctestrunFile:i?.iosXctestrunFile,iosXctestDerivedDataPath:i?.iosXctestDerivedDataPath,iosXctestEnvDir:i?.iosXctestEnvDir,runnerLeaseContext:i?.runnerLeaseContext},o=await nX(e,a);return ef({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await eu("platform_command",async()=>await iR(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function iR(e,t,r,n,i,a,o){switch(r){case"open":return await iO(e,t,n,a);case"close":{let r=n[0];if(!r)return"web"===e.platform&&await t.close(""),{closed:"session",...X("Closed session")};return await t.close(r),{app:r,...X(`Closed: ${r}`)}}case"press":return await it(e,t,n,a);case"swipe":return await im(e,t,n,a);case"swipe-preset":return await ih(e,t,n,a);case"pan":return await ig(t,n);case"fling":return await iv(t,n);case"longpress":return await n6(t,n);case"focus":return await n8(t,n);case"type":return await n9(t,n,a);case"fill":return await n7(t,n,a);case"scroll":return await iy(t,n,a);case"pinch":return await iA(e,t,n,a);case"rotate-gesture":return await ib(e,t,n);case"transform-gesture":return await i_(e,t,n);case"trigger-app-event":return await iT(e,t,n,a);case"screenshot":return await iL(t,n,i,a);case"viewport":return await i$(t,n);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...X("Back")};case"home":return await t.home(),{action:"home",...X("Home")};case"rotate":{let e=ea(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...X(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...X("Opened app switcher")};case"clipboard":return await iF(t,n);case"keyboard":return await iU(e,n,a,o);case"settings":return await iB(e,t,n,a);case"push":return await ij(e,n,a);case"snapshot":return await iV(t,a);case"read":return await ix(e,n,a);default:throw new eG("INVALID_ARGS",`Unknown command: ${r}`)}}async function iO(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new eG("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new eG("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new eG("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...X("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new eG("UNSUPPORTED_OPERATION",nJ);if("linux"===e.platform&&s&&s.length>0)throw new eG("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(tS(i))throw new eG("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!tS(a))throw new eG("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new eG("INVALID_ARGS",nZ);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...X(`Opened: ${i}`)}}if(o&&tS(i))throw new eG("INVALID_ARGS",nZ);if(n?.clearAppState){if(tS(i))throw new eG("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}:{},...X(`Opened: ${i}`)}}async function iT(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new eG("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!nz.test(t))throw new eG("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 eG("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 eG("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 eG("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof eG)throw t;throw new eG("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 eG("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 eG("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",...X(`Triggered app event: ${i}`)}}async function iL(e,t,r,n){let i=t[0]??r??`./screenshot-${Date.now()}.png`;await l.mkdir(a.dirname(i),{recursive:!0});let o=J(n);return await e.screenshot(i,{appBundleId:n?.appBundleId,fullscreen:o.fullscreen,stabilize:o.stabilize,surface:n?.surface}),{path:i,...X(`Saved screenshot: ${i}`)}}async function i$(e,t){if(2!==t.length)throw new eG("INVALID_ARGS","viewport requires exactly two arguments: <width> <height>");let r=L(t[0],"width"),n=L(t[1],"height");if(!e.setViewport)throw new eG("UNSUPPORTED_OPERATION","viewport is not supported by this backend");return await e.setViewport(r,n),{width:r,height:n,...X(`Viewport set: ${r}x${n}`)}}async function iF(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new eG("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new eG("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new eG("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,...X("Clipboard updated")}}async function iU(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!eh(i))throw new eG("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new eG("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await iG(e,i);if("ios"===e.platform)return await iq(e,i,r,n);throw new eG("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function iG(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...X("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./9624.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("./9624.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 iq(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new eG("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(t6),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...X("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(t6),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...X(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function iB(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new eG("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new eG("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");ef({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?R({setting:i,state:"clear",...s},iK(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...X(`Cleared user data for ${r}`)}}if(!a)throw new eG("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:q(o,"latitude"),longitude:q(s,"longitude")}:void 0;ef({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?R({setting:i,state:a,...u},iK(u)??`Updated setting: ${i}`):{setting:i,state:a,...X(`Updated setting: ${i}`)}}async function ij(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new eG("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await ik(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...X(`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,...X(`Pushed notification to ${n}`)}}async function iV(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,includeRects:t?.snapshotIncludeRects,surface:t?.surface})}function iK(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let iH=e=>"macos"!==e.platform,iW=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,iX=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,iz={device:!0},iJ={},iZ={device:!0},iY=new Set(["open","close","record","find","get","is","network","screenshot","snapshot","wait","click","fill","focus","press","scroll","type","viewport"]),iQ={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},i0={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:iH},i1=function(e){let t={};for(let[r,n]of Object.entries(e))t[r]=iY.has(r)?{...n,web:iZ}:n;for(let t of iY)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}({alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,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:iJ,supports:e=>"android"===e.platform||iW(e),unsupportedHint:iX},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:e=>"android"===e.platform||iW(e),unsupportedHint:iX},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:e=>"android"===e.platform||iW(e),unsupportedHint:iX},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:iH},open:iQ,close:iQ,reinstall:i0,install:i0,"install-from-source":i0,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:iH},shutdown:{apple:{simulator:!0},android:{emulator:!0},linux:iJ},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz,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:iJ,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:iz},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},snapshot:iQ,diff:iQ,screenshot:iQ,wait:iQ,get:iQ,find:iQ,is:iQ,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz,supports:iH},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:iH},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,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:iz},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},viewport:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},"trigger-app-event":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},type:iQ});function i2(e,t){let r=i1[e];if(!r)return!0;let n=e9(t.platform)?r.apple:"android"===t.platform?r.android:"linux"===t.platform?r.linux:r.web;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}function i3(e,t=e=>e){let r=new w;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 i5(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function i4(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 eG("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 eG("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 eG("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 eG("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 eG("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await i6(e,t,r)}}async function i6(e,t,r){let n=["/Applications","/System/Applications",a.join(p.homedir(),"Applications")],i=new Set;for(let t of n){let r=await l.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&&i.add(t)}}return i5((await Promise.all(Array.from(i).map(async e=>{let r=await i8(e,t).catch(()=>({})),n=r.bundleId;return n?{bundleId:n,name:r.appName??a.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function i8(e,t){for(let r of[a.join(e,"Contents","Info.plist"),a.join(e,"Info.plist")]){let e=await t(r),n=i9(e,"CFBundleIdentifier"),i=i9(e,"CFBundleDisplayName"),a=i9(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function i9(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let i7={runCommand:ej,simctl:{run:async(e,t)=>await ej("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await ej("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await al(ej,e)},macosHost:i4(ej,async e=>await al(ej,e)),whichCommand:eH},ae=i3(i7,function(e){return"function"==typeof e?at({runCommand:e}):at(e)});function at(e={}){let t={...i7,...e},r=e.plist??{readJson:async e=>await al(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??i4(t.runCommand,async e=>await r.readJson(e))}}function ar(e){return ae.resolve(e)}async function an(e,t){return await ae.run(e,t)}function ai(){return ae.hasScope()}async function aa(e,t,r){return await ar().runCommand(e,t,r)}async function ao(e,t){let r=ar(),[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 aa("xcrun",e,t)}async function as(e){return await ar().plist?.readJson(e)??null}async function al(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 ad="agent-device-macos-helper",ac="AGENT_DEVICE_MACOS_HELPER_BIN",au=a.join(p.homedir(),".agent-device","macos-helper","current"),ap=a.join(au,"manifest.json"),af=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function am(e){let t=e.trim();if(!af.test(t))throw new eG("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function ah(e,t){t.bundleId&&e.push("--bundle-id",am(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function aw(){return function(e){let t=a.dirname(e);for(;;){let e=a.join(t,"macos-helper");if(s(a.join(e,"Package.swift")))return e;let r=a.dirname(t);if(r===t)break;t=r}throw new eG("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(c(import.meta.url))}async function ag(e){let t=await l.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=a.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await ag(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function av(e){let t=await ag(e),r=i("sha256");for(let n of t)r.update(a.relative(e,n)),r.update("\0"),r.update(await l.readFile(n)),r.update("\0");let n=await aa("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return r.update("swift-version"),r.update("\0"),r.update(n.stdout||n.stderr||`exit:${n.exitCode}`),r.update("\0"),r.digest("hex")}async function ay(){try{let e=JSON.parse(await l.readFile(ap,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function aS(){let e=await eK(process.env[ac],ac);if(e)return e;let t=aw(),r=await av(t),n=a.join(au,ad);try{if(await ay()===r)return await l.access(n),n}catch{}let i=a.join(aw(),".build","release",ad);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await aa("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await l.mkdir(au,{recursive:!0});let o=`${n}.tmp`;return await l.copyFile(i,o),await l.rename(o,n),await l.chmod(n,493),await l.writeFile(ap,`${JSON.stringify({fingerprint:r},null,2)}
4
+ `,"utf8"),n}async function aI(){let e=process.env[ac]?.trim();if(e){let t=await eK(e,ac);if(t)return t}if(ai())return ad;if("darwin"!==process.platform)throw new eG("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await aS()}async function aA(e){let t={allowFailure:!0,timeoutMs:3e4},r=ar().macosHelper,n=r?ad:await aI(),i=r?await r.run(e,t):await aa(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 eG("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 ab(){return await aA(["app","frontmost"])}async function a_(e){return await aA(["app","quit","--bundle-id",am(e)])}async function ax(e,t){return await aA(["permission",e,t])}async function aM(e,t={}){let r=["alert",e];return ah(r,t),await aA(r)}async function aN(e,t={}){let r=["snapshot","--surface",e];return ah(r,t),await aA(r)}async function aP(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return ah(n,r),await aA(n)}async function aD(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return ah(n,r),await aA(n)}async function ak(e,t={}){let r=["screenshot","--out",e];return ah(r,t),t.fullscreen&&r.push("--fullscreen"),await aA(r)}let aE={"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"},aC={runCommand:ej,whichCommand:eH,desktop:a$(ej,eH),clipboard:aF(ej,eH),screenshot:aU(ej,eH)},aR=i3(aC,function(e={}){let t={...aC,...e};return{...t,desktop:e.desktop??a$(t.runCommand,t.whichCommand),clipboard:e.clipboard??aF(t.runCommand,t.whichCommand),screenshot:e.screenshot??aU(t.runCommand,t.whichCommand)}});function aO(e){return aR.resolve(e)}async function aT(e,t){return await aR.run(e,t)}async function aL(e,t,r){return await aO().runCommand(e,t,r)}function a$(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=>{ef({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await e8(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 aF(e,t){return{async readText(){let r=aB[await aK(t,aG)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=aj[await aK(t,aG)](r);await e(n.cmd,n.args,n.options)}}}function aU(e,t){return{async capture(r){let n=aV[await aK(t,aq)](r);await e(n.cmd,n.args,n.options)}}}let aG={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."},aq={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."},aB={"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}}},aj={"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}})},aV={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 aK(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 eG("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let aH="atspi-dump.py",aW=null;async function aX(e,t={}){let r,n=aO().accessibility;if(n)return await n.captureTree(e,t);if("linux"!==process.platform)throw new eG("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await aO().whichCommand("python3"))throw new eG("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let i=t.maxNodes??1500,s=t.maxDepth??12,l=t.maxApps??24,d=[function(){if(aW)return aW;let e=a.dirname(c(import.meta.url));for(let t=0;t<5;t++){let r=a.join(e,"src","platforms","linux",aH);if(o.existsSync(r))return aW=r,r;if(0===t){let t=a.join(e,aH);if(o.existsSync(t))return aW=t,t}e=a.dirname(e)}throw new eG("TOOL_MISSING",`Cannot find ${aH}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(i),"--max-depth",String(s),"--max-apps",String(l)],u=await aL("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 eG("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new eG("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new eG("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new eG("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=aE[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 az(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&ef({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await aX(t);return{nodes:r.nodes,truncated:r.truncated}}async function aJ(e,t,r){let{nodes:n}=await az(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:aZ(e.rect)-aZ(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 aZ(e){return(e?.width??0)*(e?.height??0)}let aY=[250,400,600];function aQ(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?a3(n?.nodes??[]):void 0,routeComparable:i}}function a0(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 a1(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function a2(e){return"press"===e||"click"===e||"back"===e||"open"===e}function a3(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 a5(e){return N(e)}function a4(e){return"string"==typeof e&&e.trim().length>0?e.trim():void 0}function a6(e,t,r,n,i,a){let o,s;return{requestId:i??ed().requestId,appBundleId:r,runnerLeaseContext:(o=({meta:a}).meta,Object.keys(s=tx({leaseId:a4(o?.leaseId),clientId:a4(o?.clientId),tenantId:a4(o?.tenantId),runId:a4(o?.runId),leaseProvider:a4(o?.leaseProvider),deviceKey:a4(o?.deviceKey)})).length>0?s:void 0),activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,iosXctestrunFile:t?.iosXctestrunFile,iosXctestDerivedDataPath:t?.iosXctestDerivedDataPath,iosXctestEnvDir:t?.iosXctestEnvDir,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...ee(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,durationMs:t?.durationMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:k(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function a8(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!oi(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=ot(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:oe(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function a9(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function a7(e){let{session:t,pending:r,snapshot:n}=e,i=or(r.preSignature,ot(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await iC(t.device,r.command,r.positionals,r.flags?.out,{...a6(e.logPath,r.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),ef({level:"info",phase:"interaction_no_change_retry",data:{action:r.action,attemptsRemaining:r.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function oe(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function ot(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 or(e,t){return 0===e.length||0===t.length?"ambiguous":on(e,t)?"unchanged":"changed"}function on(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 oi(e){return"ios"===e.device.platform||"android"===e.device.platform}function oa(e,t,r=[],n){var i,a,o;ol(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 oo(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function os(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!ol(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=ot(e.readSnapshot(o).nodes);for(;a<2||Date.now()-i<1500;){await e8(200),a+=1;let l=await r(),d=ot(e.readSnapshot(l).nodes);if(on(s,d))return oo(t),ef({level:a>2?"info":"debug",phase:"post_gesture_snapshot_stabilized",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),l;o=l,s=d}return oo(t),ef({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function ol(e){return"ios"===e||"android"===e}function od(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let oc=new WeakMap;function ou(e,t){if(!e[t])return[];let r=om(e)[t]??t+1;return e.slice(t+1,r)}function op(e,t,r){let n=om(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function of(e,t,r){let n=om(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function om(e){let t=oc.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 oc.set(e,r),r}function oh(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 ow(e,t){let r=tP(e.type??""),n=e.label?.trim();return!!(og(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function og(e){return"button"===tP(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function ov(e){let t=tP(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function oy(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function oS(e){let t;for(let i of e){var r,n;let e=tP(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||oI(r)>oI(n)))&&(t=i.rect)}return t}function oI(e){return e?e.width*e.height:0}function oA(e){let t=tP(e.type??"");return"scrollview"===t||"scrollarea"===t}function ob(e,t){return!0===e||!!t||void 0}function o_(e,t,r,n){of(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=tP(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function ox(e,t,r,n){of(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=tP((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function oM(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===tP(n.type??"")&&t(n,i,r)}}function oN(e,t,r,n){for(let i of e)(ow(i,t)||n&&oD(i,n))&&r.add(i.index)}function oP(e,t,r){if("button"!==tP(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&j(e.rect,t.rect)}function oD(e,t){return"button"===tP(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&j(e.rect,t.rect)}let ok=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=oS(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"===tP(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),of(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==tP(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&&V(t))})(r)&&function(e,t,r){var n,i,a,o;ov(e.type)||r.suppressedIndexes.add(e.index);let s=E(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&ov(e.type)?e:null)??oh(e,t,e=>ov(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,oy(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:ob(i.hiddenContentAbove,o.above),hiddenContentBelow:ob(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"!==tP(n.type??""))continue;if("Search"===n.label){ox(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=op(e,r,e=>"searchfield"===tP(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),ox(e,r,i.index,t))}})(e,o),r=e,n=o,oM(r,(e,t,i)=>{op(r,i,r=>{let n;return("button"===(n=tP(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(j(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=tP(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,oM(i,(e,t,r)=>{let n;Q(e)&&P(e,(n=[],of(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=tP(r.type??"");if("statictext"===a||"link"===a)return o_(e,t,n,i);if("other"===a){if(function(e,t,r){return!!op(e,t,e=>{let t=tP(e.type??"");return("link"===t||"searchfield"===t||ov(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);o_(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=oS(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==tP(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)||!oh(e,t,oA)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=oI(e),i=oI(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&oy(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=tP(r.type??"");if("button"===a)return oN(ou(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=ou(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==tP(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=>oP(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&oy(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&&(oP(a,t,r)||oD(a,t)||function(e,t){if("switch"!==tP(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||ow(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=>oP(e,t,r));if(!i){e.some(og)&&oN(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&oy(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),oN(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function oE(e){let t=await oC(e);if(t)return t;let r=await oG(e);return a1(e.session),{snapshot:r.snapshot,...r.annotations}}async function oC(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!oi(e)||Date.now()-t.markedAt>3e4?void a9(e):t}(e.session);if(t&&e.session)return await oR({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await oF({...e,session:e.session});let r=a0(e.session);if(r&&"android"===e.device.platform)return await oL(e,r)}async function oR(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await oO(e,t,await oU(e)),l=await a7({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await oO(e,t,await oU(e)),l=await a7({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(a9(i),s=await os({session:i,initial:s,capture:async()=>await oU(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.annotations.freshness?.staleAfterRetries!==!0&&a1(i),"unchanged"===l.change)?ef({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}}):ef({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,...s.annotations}}async function oO(e,t,r){let n=r;return"unchanged"!==or(t.preSignature,ot(n.snapshot.nodes))?n:(await e8(500),n=await oU(e))}async function oT(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await az(r?.surface);return oj({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?oj(await aN(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await iC(t,"snapshot",[],i,{...a6(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath),snapshotIncludeRects:e.includeRects})}async function oL(e,t){let r=await o$(e,t);return{snapshot:r.snapshot,...r.annotations}}async function o$(e,t){let r=await oG(e),n=oq(r,t,e),i=0,a=t.markedAt+1500;for(let o of aY){if(!n)break;let s=a-Date.now();if(s<=0)break;await e8(Math.min(o,s)),r=await oG(e),i+=1,n=oq(r,t,e)}n||a1(e.session);let o=i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0;return{...r,annotations:{...r.annotations,...et({freshness:o})}}}async function oF(e){let t=await os({session:e.session,capture:async()=>await oU(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,...t.annotations}}async function oU(e){let t=a0(e.session);return t&&"android"===e.device.platform?await o$(e,t):await oG(e)}async function oG(e){var t;let r=Date.now(),n=await oT(e);return e2(e.session,{durationMs:Date.now()-r,backend:n.backend,platform:e.device.platform}),{data:n,snapshot:oB(n,void 0===(t=e).snapshotScope?t.flags:{...t.flags,snapshotScope:t.snapshotScope}),annotations:et(n)}}function oq(e,t,r){var n,i;let a=r.flags?.snapshotInteractiveOnly===!0,o=e.annotations.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&&a2(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=a3(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 oB(e,t){var r,n,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=Y(s?o:tD(o)),d=t?.snapshotScope&&e?.backend!=="macos-helper"?oV(l,t.snapshotScope):l,c=(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 ok)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}})}(d):d,u=t$(s?c:F(c)),p=et(e).quality;return{nodes:u,truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,...p?{snapshotQuality:p}:{},presentationKey:tT(tC(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function oj(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=oV(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:oK(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=oK(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function oV(e,t){let r=tk(t$(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 oK(a,i)}function oK(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 oH(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return od("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=tR(e.trim());if(!n)return od("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=tO(e.nodes,n);if(r=t?tE(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:od("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function oW(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function oX(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?ef({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function oz(e){let{session:t,sessionName:r,outPath:n,outputPlacement:i,dispatchContext:o}=e,s=ex({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...n,...ee(a),surface:a?.surface};return"out"===r?e0(await iC(t.device,"screenshot",[],i,o)):e0(await iC(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:i,dispatchContext:o}),artifacts:{resolveInput:async()=>{throw new eG("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await l.mkdtemp(a.join(p.tmpdir(),"agent-device-screenshot-")),r=a.join(t,"screenshot.png")),await l.mkdir(a.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await l.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await l.mkdtemp(a.join(p.tmpdir(),`${e.prefix}-`));return{path:a.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await l.rm(t,{recursive:!0,force:!0})}}}},sessions:oX({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eM()});return await s.capture.screenshot({session:r,requestId:o.requestId,appBundleId:t.appBundleId,...J(o),surface:t.surface,...n?{out:{kind:"path",path:n}}:{}})}function oJ(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function oZ(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 oY(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let oQ=new Set(["android","com.android.systemui"]);function o0(e,t,r,n){var i,a;return{reason:r,fallbackReason:n,diagnostics:(i=e,a=t,{helperNodeCount:i.nodeCount,helperWindowRootCount:i.windowRootCount,helperApplicationWindowRootCount:i.applicationWindowRootCount,helperMeaningfulNodeCount:i.meaningfulNodeCount,helperApplicationMeaningfulNodeCount:i.applicationMeaningfulNodeCount,helperNonSystemMeaningfulNodeCount:i.nonSystemMeaningfulNodeCount,...void 0!==i.foregroundAppPackage?{helperForegroundAppPackage:i.foregroundAppPackage,helperForegroundAppMeaningfulNodeCount:i.foregroundAppMeaningfulNodeCount,helperForegroundAppMeaningfulNodeThreshold:2}:{},helperWindowTypes:i.windowTypes,...a.captureMode?{helperCaptureMode:a.captureMode}:{}})}}function o1(e){return null!==e&&""!==e.trim()}let o2=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function o3(e,t={}){let r=tQ(e,t.helperAdb).exec;return(await o9(e,t,r)).xml}async function o5(e,t={}){let r=tQ(e,t.helperAdb).exec,n=await o9(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=tU(i,void 0,t),s=o4(o.truncated,n.metadata);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 sd(e,o.nodes,i,r),o.nodes),{...o,...o6(s),androidSnapshot:n.metadata}}let o=tq(i),s=tJ(o,void 0,t),l=o4(s.truncated,n.metadata);a&&await o8({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:d,...c}=s;return{...c,...o6(l),androidSnapshot:n.metadata}}function o4(e,t){return!0===e||!0===t.helperTruncated||e}function o6(e){return!0===e?{truncated:!0}:{}}async function o8(e){if(su(e.interactiveSnapshot.nodes).size>0||sc(e.xml))return;let t=tJ(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await sd(e.device,t.nodes,e.xml,e.adb);sg(r,t,e.interactiveSnapshot),0===r.size&&sg(D(t$(t.nodes)),t,e.interactiveSnapshot)}async function o9(e,t,r){let n=await eu("android_snapshot_helper_artifact_resolution",async()=>await ss(t.helperArtifact));return n.artifact?await o7(e,t,r,n.artifact):(ef({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await sl(e,n.fallbackReason,r))}async function o7(e,t,r,n){let i=tG(e),a=tQ(e,t.helperAdb),o="daemon-session"!==t.helperSessionScope;try{var s,l,d;let o=await se(t,r,a,n,i);o.installed&&await tz(i);let c=(s=await st({options:t,adb:r,adbProvider:a,artifact:n,helperDeviceKey:i}),l=n,d=o.reason,{xml:s.xml,metadata:{backend:"android-helper",helperVersion:l.manifest.version,helperApiVersion:s.metadata.helperApiVersion,helperTransport:s.metadata.transport,helperSessionReused:s.metadata.sessionReused,installReason:d,waitForIdleTimeoutMs:s.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:s.metadata.waitForIdleQuietMs,timeoutMs:s.metadata.timeoutMs,maxDepth:s.metadata.maxDepth,maxNodes:s.metadata.maxNodes,rootPresent:s.metadata.rootPresent,captureMode:s.metadata.captureMode,windowCount:s.metadata.windowCount,nodeCount:s.metadata.nodeCount,helperTruncated:s.metadata.truncated,elapsedMs:s.metadata.elapsedMs}}),u=function(e,t,r={}){if("android-helper"!==t.backend)return;let n=function(e,t){var r,n;let i=(r=t,{nodeCount:0,windowRootCount:0,applicationWindowRootCount:0,meaningfulNodeCount:0,applicationMeaningfulNodeCount:0,nonSystemMeaningfulNodeCount:0,...void 0!==r?{foregroundAppPackage:r,foregroundAppMeaningfulNodeCount:0}:{},windowTypes:new Set});for(let t of tW(e))!function(e,t){var r,n;e.nodeCount+=1,r=e,n=t,void 0!==n.windowType&&(r.currentWindowType=n.windowType,r.windowRootCount+=1,r.windowTypes.add(n.windowType),1===n.windowType&&(r.applicationWindowRootCount+=1)),function(e,t){var r,n;r=t,!1!==r.visibleToUser&&(o1(r.text)||o1(r.desc)||o1(r.resourceId))&&(e.meaningfulNodeCount+=1,1===e.currentWindowType&&(e.applicationMeaningfulNodeCount+=1),n=t.packageName,null===n||oQ.has(n)||(e.nonSystemMeaningfulNodeCount+=1),void 0!==e.foregroundAppPackage&&t.packageName===e.foregroundAppPackage&&(e.foregroundAppMeaningfulNodeCount=(e.foregroundAppMeaningfulNodeCount??0)+1))}(e,t)}(i,t);return{nodeCount:(n=i).nodeCount,windowRootCount:n.windowRootCount,applicationWindowRootCount:n.applicationWindowRootCount,meaningfulNodeCount:n.meaningfulNodeCount,applicationMeaningfulNodeCount:n.applicationMeaningfulNodeCount,nonSystemMeaningfulNodeCount:n.nonSystemMeaningfulNodeCount,...void 0!==n.foregroundAppPackage?{foregroundAppPackage:n.foregroundAppPackage,foregroundAppMeaningfulNodeCount:n.foregroundAppMeaningfulNodeCount??0}:{},windowTypes:[...n.windowTypes].sort((e,t)=>e-t).slice(0,8)}}(e,r.foregroundAppPackage);if(0===n.nodeCount||0===t.nodeCount||!1===t.rootPresent)return o0(n,t,"empty-helper-output","Android snapshot helper returned no accessibility nodes");let i=n.foregroundAppMeaningfulNodeCount;return void 0!==i&&(0===i||i<2&&n.meaningfulNodeCount>i)?o0(n,t,"content-poor-app-window","Android snapshot helper returned insufficient foreground app content"):void 0===i&&n.applicationWindowRootCount>0&&n.applicationMeaningfulNodeCount<2||void 0===i&&0===n.windowRootCount&&(t.windowCount??0)>1&&n.nonSystemMeaningfulNodeCount<2?o0(n,t,"content-poor-app-window","Android snapshot helper returned insufficient application window content"):n.windowRootCount>0&&0===n.applicationWindowRootCount?o0(n,t,"system-window-only","Android snapshot helper returned only non-application windows"):void 0}(c.xml,c.metadata,{foregroundAppPackage:t.appBundleId});if(!u)return c;return await sr({contentRecovery:u,helperDeviceKey:i,artifact:n,device:e,adb:r})}catch(t){return await sn({error:t,helperDeviceKey:i,artifact:n,device:e,adb:r})}finally{o&&await tz(i)}}async function se(e,t,r,n,i){let a=await eu("android_snapshot_helper_install",async()=>await tB({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 ef({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 st(e){let{options:t,adb:r,adbProvider:n,artifact:i,helperDeviceKey:a}=e,o={adb:r,adbProvider:n,deviceKey:a,helperVersion:i.manifest.version,helperVersionCode:i.manifest.versionCode,packageName:i.manifest.packageName,instrumentationRunner:i.manifest.instrumentationRunner,waitForIdleTimeoutMs:t.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await eu("android_snapshot_helper_session_capture",async()=>await tV(o),{packageName:i.manifest.packageName,version:i.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){ef({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:eU(e).message}}),await si(r,i.manifest.packageName)}return await eu("android_snapshot_helper_capture",async()=>await tj(o),{packageName:i.manifest.packageName,version:i.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function sr(e){return ef({level:"warn",phase:"android_snapshot_helper_content_fallback",data:{reason:e.contentRecovery.reason,fallbackReason:e.contentRecovery.fallbackReason,...e.contentRecovery.diagnostics}}),await si(e.adb,e.artifact.manifest.packageName),await sl(e.device,e.contentRecovery.fallbackReason,e.adb)}async function sn(e){let t=function(e){var t;let r=eU(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=so(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=sa(e);return new eG(e$(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=sa(e.error);return ef({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tz(e.helperDeviceKey),await si(e.adb,e.artifact.manifest.packageName),tX({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await sl(e.device,r,e.adb)}async function si(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await e8(150),ef({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){ef({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:eU(e).message}})}}function sa(e){let t=eU(e),r=so(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 so(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 ss(e){if(e)return{artifact:e};let t=tZ(),r=a.join(tY(),"android-snapshot-helper","dist"),n=a.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await g.access(n)}catch{return{}}try{let e=tH(JSON.parse(await g.readFile(n,"utf8"))),t=a.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await g.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:eU(e).message}}}async function sl(e,t,r){let n;try{n=await eu("android_snapshot_stock_capture",async()=>await sp(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new eG(e$((r=eU(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 sd(e,t,r,n){if(!t.some(e=>tF(e.type)))return new Map;let i=su(t);if(i.size>0||sc(r))return i;let a=await sw(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(tF(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=>oY(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||!tF(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=>oY(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=oJ(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(!oZ(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(!oZ(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?oJ(o):a.length>0?oJ(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 sc(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function su(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 sp(e,t=t0(e)){try{return await ts(()=>sf(t),{shouldRetry:sh})}catch(t){var r,n;let e;if((r=t)instanceof eG&&"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 eG("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 sf(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=sm(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}
5
+ ${r}`,i=/dumped to:\s*(\S+)/i.exec(n),i?.[1]);if(0!==l.exitCode&&!d)throw new eG("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=sm(c.stdout,c.stderr);if(!u)throw new eG("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:c.stdout,stderr:c.stderr});return u}function sm(e,t){let r=`${e}
6
+ ${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 sh(e){if(!(e instanceof eG)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return o2.some(e=>r.includes(e))}async function sw(e,t=t0(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),r=`${e.stdout}
7
+ ${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function sg(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 sv=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,sy=/^close app$/i,sS="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function sI(e){let t,{session:r}=e;if("android"!==r.device.platform||!r.recording)return{status:"absent"};try{t=await sN(r)}catch(e){return ef({level:"warn",phase:"android_blocking_dialog_inspection_failed",data:{session:r.name,deviceId:r.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"unknown",reason:"inspection-failed"}}let n=sD(t);if(!n?.rect)return{status:"absent"};try{let e=await sP(r,n);if(!e.ok)return ef({level:"warn",phase:"android_blocking_dialog_tap_failed",data:{session:r.name,deviceId:r.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:"failed",reason:"tap-failed"};if(!await sk(r))return ef({level:"warn",phase:"android_blocking_dialog_still_present",data:{session:r.name,deviceId:r.device.id}}),{status:"failed",reason:"dismiss-failed"};if(r.appBundleId&&(await tc(r.device,r.appBundleId),!await sE(r,r.appBundleId)))return ef({level:"warn",phase:"android_blocking_dialog_relaunch_unfocused",data:{session:r.name,deviceId:r.device.id,appBundleId:r.appBundleId}}),{status:"failed",reason:"relaunch-failed"};return ef({level:"warn",phase:"android_blocking_dialog_recovered",data:{session:r.name,deviceId:r.device.id,appBundleId:r.appBundleId,x:e.x,y:e.y}}),{status:"recovered"}}catch(e){return ef({level:"warn",phase:"android_blocking_dialog_recovery_failed",data:{session:r.name,deviceId:r.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"failed",reason:"error"}}}async function sA(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await to(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await sb(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 sx({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 sx({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${sM(a)}. Automatic recovery failed.`,hint:sS})}throw sx({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${sM(a)}.`,hint:sS})}async function sb(e){try{return await s_(e)}catch(t){return ef({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 s_(e){if(!e.appBundleId)return!1;let t=sD(await sN(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await sP(e,t);if(!r.ok)return!1;await tc(e.device,e.appBundleId);let n=await sE(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&ef({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 sx(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new eG("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function sM(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function sN(e){return t$(tD((await o5(e.device,{interactiveOnly:!1})).nodes))}async function sP(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=tL(t.rect),i=await ti(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 sD(e,t={}){if(!1===t.requireDialogSignal||sO(e))return e.find(e=>sR(e).some(e=>sy.test(e))&&e.rect)}async function sk(e){for(let t=0;t<12;t+=1){if(!sO(await sN(e)))return!0;await e8(500)}return!sO(await sN(e))}async function sE(e,t,r={}){for(let n=0;n<12;n+=1){if(await sC(e,t,r))return!0;await e8(500)}return await sC(e,t,r)}async function sC(e,t,r){return!(r.requireNoBlockingDialog&&await to(e.device))&&(await tg(e.device)).package===t}function sR(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 sO(e){return e.some(e=>{let t=sR(e).join(" ").trim();return t.length>0&&sv.test(t)})}function sT(e){return!!(e&&e.width>0&&e.height>0)}function sL(e){return e.width*e.height}function s$(e,t){return t.x>=e.x&&t.y>=e.y&&t.x+t.width<=e.x+e.width&&t.y+t.height<=e.y+e.height}let sF=[255,59,48,255],sU=[255,214,10,255],sG=[0,0,0,255],sq=["scroll","list","recyclerview","edittext","textfield"],sB=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],sj={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 sV(e){let t=await l.readFile(e.screenshotPath),r=await eI(t,"screenshot"),n=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)sW(r)&&sT(r.rect)&&(!t||sL(r.rect)>sL(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&&sT(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 sT(e.rect)&&!("image"===tP((t=e).type??"")&&!sz(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(sJ)||sZ(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!sT(r.rect)||sW(r))return!1;let n=tP(r.type??"");return!(sq.some(e=>n.includes(e))||t&&sL(r.rect)>.25*sL(t))}(e,t,r)||(sH(r)?n:n&&function(e){let t=tP(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 sH(e)&&!sW(e)}(s=n)?s:null,tN(o,s,e=>(function(e){return sH(e)&&!sW(e)})(e)),s.hittable?s:null,tN(o,s,e=>!0===e.hittable)].find(sX)??null);if(!l?.rect||!sT(l.rect))continue;let d=function(e,t,r){let n=sY(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=sY(n);if(!i)continue;let a=function(e){let t=0;return tP(e.type??"").includes("text")&&(t+=2),sJ(e.label)&&(t+=2),sJ(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||sY(t)}(n,l,e.nodes),c=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),sH(t)&&(n+=3),sH(e)&&(n+=2),r&&(n+=2),sZ(t.identifier)&&(n+=1),sz(t.value)&&(n+=1),n}(n,l,d),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=sH,i=e=>!!sY(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=tP(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&sT(t.rect)&&s$(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=sK(e,i,u,t,r);if(!sT(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=G(e.nodes).primaryAction;if(!a?.ref||!a.rect||!sT(a.rect))return;let o=sK(e,t,a.rect,n,i);if(!sT(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)=>sL(e.overlayRect)-sL(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(s$(e.overlayRect,r.overlayRect)||s$(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}sL(r.overlayRect)<sL(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(s4).slice(0,n.maxRefs??24).sort(s5).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:tL(e.overlayRect)}))}(e.snapshot,r.width,r.height,{maxRefs:e.maxRefs});for(let e of n){var i,a;(function(e,t,r){for(let n=0;n<2;n+=1)s1(e,t.x,t.x+t.width-1,t.y+n,r),s1(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),s2(e,t.x+n,t.y,t.y+t.height-1,r),s2(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(i=r,(a=e).overlayRect,sF),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=s0(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:s0(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)s3(e,t+o,r+a,i)})(e,i,o,n,sU),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=sj[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]&&s3(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,sG)}(i,a.overlayRect,a.ref)}return await l.writeFile(e.screenshotPath,await eg(r)),n}function sK(e,t,r,n,i){if("android"===e.backend||!t)return sQ(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 sQ({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 sH(e){let t=[e.type,e.role,e.subrole].map(e=>tP(e??"")).join(" ");return sB.some(e=>t.includes(e))}function sW(e){let t=[e.type,e.role,e.subrole].map(e=>tP(e??"")).join(" ");return t.includes("application")||t.includes("window")}function sX(e){return!!(e?.rect&&sT(e.rect)&&!sW(e))}function sz(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function sJ(e){var t;let r;return!!sz(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function sZ(e){var t;return"string"==typeof e&&!!sJ(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function sY(e){let t=[e.label,e.value].find(sJ);return t?t.trim():sZ(e.identifier)?e.identifier.trim():void 0}function sQ(e,t,r){let n=s0(e.x,0,Math.max(0,t-1)),i=s0(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:s0(e.width,1,a),height:s0(e.height,1,o)}}function s0(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function s1(e,t,r,n,i){for(let a=t;a<=r;a+=1)s3(e,a,n,i)}function s2(e,t,r,n,i){for(let a=r;a<=n;a+=1)s3(e,t,a,i)}function s3(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 s5(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 s4(e,t){return t.score!==e.score?t.score-e.score:s5(e,t)}function s6(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 s8=new WeakMap;function s9(e){if(!e)return;let t=s8.get(e);if(t)return t;let r=s7(e.nodes??[]);if(r)return s8.set(e,r),r}let s7=en,le={referenceWidth:1e3,referenceHeight:1e3};function lt(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??{}},I=ld(S.effectiveDurationMs)??ld(S.durationMs),A={recordingStartedAt:y.startedAt,gestureClockOriginAtMs:y.gestureClockOriginAtMs,gestureClockOriginUptimeMs:y.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===y.platform?y.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:ld(S.gestureStartUptimeMs),gestureEndUptimeMs:ld(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},b="number"==typeof(s={gestureStartUptimeMs:ld(S.gestureStartUptimeMs),gestureEndUptimeMs:ld(S.gestureEndUptimeMs),reportedDurationMs:I,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),_="ios"===e.device.platform&&void 0===ld(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=lc(ld(t.count),1)??1,r=!0===t.doubleTap,n=lc(ld(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 s6(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...A,gestureDurationMs:b}):s6(A),x=(l=e.snapshot,w=ld((d=S).referenceWidth),g=ld(d.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:s9(l)),M=(c=t,u=r,p=S,f=_,m=b,h=x,v=lr[c],v?.(u,p,f,m,h)??[]);0!==M.length&&(y.gestureEvents.push(...M),ef({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:M.length,tMs:_,gestureDurationMs:b,kinds:M.map(e=>e.kind)}}))}let lr={click:(e,t,r,n,i)=>ln(e,t,r,i),press:(e,t,r,n,i)=>ln(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?ln(e,t,r,i):[],fill:(e,t,r,n,i)=>li(e,t,r,i),focus:(e,t,r,n,i)=>li(e,t,r,i),longpress:function(e,t,r,n,i){let a=lu(t,e);if(!a)return[];let{x:o,y:s}=a;return[ls(r,o,s,lm(n,[ld(t.durationMs),ld(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=lp(t,e),o=ll(t.contentDirection)??ll(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:c}=a,u=lm(n,[],250),p=ld(t.amount)??ld(e[1]),f=ld(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:la,fling:la,swipe:la,pinch:function(e,t,r,n,i){let a=lu(t,e,1),o=ld(t.scale)??ld(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:lm(n,[],280)}]}};function ln(e,t,r,n){let i=lu(t,e);if(!i)return[];let{x:a,y:o}=i,s=lc(ld(t.count),1)??1,l=lc(ld(t.intervalMs),0)??0,d=!0===t.doubleTap,c=lc(ld(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(ls(t,a,o,c,n));continue}u.push(lo(t,a,o,n)),d&&u.push(lo(t+90,a,o,n))}return u}function li(e,t,r,n){let i=lu(t,e);if(!i)return[];let{x:a,y:o}=i;return[lo(r,a,o,n)]}function la(e,t,r,n,i){let a=lp(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,c=lm(n,[ld(t.effectiveDurationMs),ld(t.durationMs),ld(e[4])],250),u=lc(ld(t.count),1)??1,p=lc(ld(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,A,b;let _,{startX:x,startY:M,endX:N,endY:P}=(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=M,S=N,I=P,A=c,"back-swipe"===(_=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,I,b=i))?{kind:_,tMs:g,x:v,y,x2:S,y2:I,...b,durationMs:A,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:_,tMs:g,x:v,y,x2:S,y2:I,...b,durationMs:A}})}function lo(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function ls(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function ll(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 ld(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 lc(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function lu(e,t,r=0){let n=ld(e.x)??ld(t[r]),i=ld(e.y)??ld(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function lp(e,t){let r=lf(e.x1,e.x,t[0]),n=lf(e.y1,e.y,t[1]),i=lf(e.x2,t[2]),a=lf(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 lf(...e){return e.map(ld).find(e=>void 0!==e)}function lm(e,t,r){return lc(e,1)??t.map(e=>lc(e,1)).find(e=>void 0!==e)??r}let lh={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function lw(e){var t,r,n,i,a,o,s;let l,d,c,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?lh[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:t_}}(f);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:y,dispatchRequest:S,recordedCommand:I}=v,A=await lv(m,y);if(A)return A;let b=await lg(m,y);if("response"in b)return b.response;let{resolvedPositionals:_,resolvedOut:x,recordedPositionals:M,recordedFlags:N}="screenshot"===(t=S).command?(d=(n=(r=t).positionals??[],i=r.meta?.cwd,(l=n[0])?[rl.expandHome(l,i),...n.slice(1)]:n),u=(c=(a=r.flags?.out,o=r.meta?.cwd,a?rl.expandHome(a,o):a))?{...r.flags??{},out:c}:r.flags??{},{resolvedPositionals:d,resolvedOut:c,recordedPositionals:d,recordedFlags:u}):{resolvedPositionals:p=(s=t).positionals??[],resolvedOut:s.flags?.out,recordedPositionals:p,recordedFlags:s.flags??{}},P=Date.now(),D={...g(f.flags,m.appBundleId,m.trace?.outPath),surface:m.surface},k=await ly({session:m,sessionName:e.sessionName,logPath:h,command:y,request:S,positionals:_,out:x,dispatchContext:D}),E=await lg(m,y,"after-command");if("response"in E)return E.response;"status"in b&&"recovered"===b.status&&(!k||"object"==typeof k)&&((k??={}).warning=b.warning);let C=Date.now(),R=I===y?M:f.positionals??[],O=I===y?N:f.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=s9(e.snapshot),a={...n??{}},o=ll(a.direction)??ll(r[0]);if(!o)return n;let s=ld(a.amount)??ld(r[1]),l=ld(a.pixels),d=lp(a,[]),c=ld(a.referenceWidth),u=ld(a.referenceHeight),p=void 0!==c&&c>0&&void 0!==u&&u>0?{referenceWidth:c,referenceHeight:u}:i??le;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=eo({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);lt(t,n,a,p,u,d,c),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:y,recordedCommand:I,resolvedPositionals:_,recordedPositionals:R,recordedFlags:O,data:k,actionStartedAt:P,actionFinishedAt:C,flags:f.flags??{}}),a2(y)&&aQ(m,y),oa(m,y,_,f.flags),{ok:!0,data:k??{}}}async function lg(e,t,r="before-command"){if("android"!==e.device.platform||nG(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await sA({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:eU(e)}}}}async function lv(e,t){if(!i2(t,e.device)){var r;let n=(r=e.device,i1[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&&"failed"===(await sI({session:e})).status?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function ly(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await iC(r.device,n,a,o,{...s});let l=await oz({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 lS(r,l,e.logPath),l}async function lS(e,t,r){let n={snapshotInteractiveOnly:!0},i=oB(await oT({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);oW(e,i);let a=await sV({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let lI=lL(()=>import("./lease.js")),lA=lL(()=>import("./session.js").then(e=>e.session_namespaceObject)),lb=lL(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),l_=lL(()=>import("./react-native.js")),lx=lL(()=>import("./record-trace.js")),lM=lL(()=>import("./find.js")),lN=lL(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function lP(e){var t;switch(t=e.req.command,nG(t)?.route??"generic"){case"lease":return await lD(e);case"session":return await lk(e);case"snapshot":return await lE(e);case"reactNative":return await lC(e);case"recordTrace":return await lR(e);case"find":return await lO(e);case"interaction":return await lT(e);case"generic":return null}}async function lD(e){let{handleLeaseCommands:t}=await lI();return l$(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function lk(e){let{handleSessionCommands:t}=await lA();return l$(e.req.command,"session",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,invoke:e.invoke,invokeReplayAction:e.invokeReplayAction,androidAdbExecutor:e.androidAdbExecutor}))}async function lE(e){let{handleSnapshotCommands:t}=await lb();return l$(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function lC(e){let{handleReactNativeCommands:t}=await l_();return l$(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function lR(e){let{handleRecordTraceCommands:t}=await lx();return l$(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function lO(e){let{handleFindCommands:t}=await lM();return l$(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function lT(e){let{handleInteractionCommands:t}=await lN();return l$(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function lL(e){let t;return()=>t??=e()}function l$(e,t,r){if(r)return r;throw new eG("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let lF=new w;async function lU(e,t,r){let n=lF.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>lF.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function lG(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function lq(e,t){var r,n,i,a;let o,s,l,d,c,u;return e.recording?(r=e,n=t,o=e3(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=e3(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 lB(e,t){if(!t)return[];let r=[],n=e.device,i=te(t.platform);if(i&&!tn(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=th(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function lj(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 lV="default";function lK(e){return e.session||lV}function lH(e){if(e.meta?.sessionExplicit===!0||(e.session||lV)!==lV||e.meta?.sessionIsolation==="tenant"||e.flags?.sessionIsolation==="tenant")return;let t=function(e){if(!e||0===e.trim().length)return;let t=function(e){let t=a.resolve(e);try{return o.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(o.existsSync(a.join(t,".git")))return t;let e=a.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(t){var r;return{kind:"cwd",id:(r=t,n.createHash("sha256").update(r).digest("hex").slice(0,16))}}}function lW(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function lX(e,t){let r=lH(e);return!!r&&!!t.sessionScope&&!lW(t,r)}function lz(e,t){if("open"!==e.command)return;let r=$(t);if(0!==r.length)throw new eG("INVALID_ARGS","Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.",{missing:r})}function lJ(e,t,r){if(t&&r&&t!==r)throw new eG("UNAUTHORIZED",`Lease does not match session owner (${e})`,{reason:"LEASE_SESSION_MISMATCH",field:e})}async function lZ(e){let t=e.sessionStore.get(e.sessionName),r=t?.lease;return!!t&&!!r&&!!e.leaseRegistry.consumeExpiredLease(r.leaseId)&&(ef({level:"info",phase:"leased_session_expired",data:{reason:"LEASE_EXPIRED",leaseId:r.leaseId,session:t.name,deviceKey:r.deviceKey}}),await e.teardownSession(t,t.name).catch(e=>{ef({level:"debug",phase:"leased_session_expiry_cleanup_failed",data:{reason:"LEASE_EXPIRED",leaseId:r.leaseId,session:t.name,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.delete(t.name),!0)}function lY(e){return function(e,t){let r=a5(e),n=r.leaseId??t?.leaseId,i=r.tenantId??t?.tenantId,a=r.runId??t?.runId;if(i&&a&&n)return tx({tenantId:i,runId:a,leaseId:n,leaseBackend:r.leaseBackend??t?.backend,leaseProvider:r.leaseProvider??t?.leaseProvider,deviceKey:r.deviceKey??t?.deviceKey,clientId:r.clientId??t?.clientId,expiresAt:t?.expiresAt})}(e.req,e.req.internal?.admittedLease)??e.existingLease}function lQ(e){let t=e.session.lease;if(!t)return;let r=e.leaseRegistry.releaseLease(x({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}));ef({level:"info",phase:"session_lease_released",data:{session:e.session.name,leaseId:t.leaseId,released:r.released}})}function l0(e,t){var r,n,i,a,o,s,l,d,c,u,p;let f,m,h,w=e.meta?.lockPolicy;if(!w)return e;let g={...e.flags??{}},v=(r=e.command,nG(r)?.lockPolicySelectorOverride===!0),y=v?[]:t?lB(t,g):(n=g,i=e.meta?.lockPlatform,f=[],m=te(i),void 0!==n.platform&&m&&(a=te(n.platform),o=m,a&&o&&a!==o&&("apple"===a?!e9(o):"apple"!==o||!e9(a)))&&f.push({key:"platform",value:n.platform}),m&&(s=f,l=n,d=m,(h=l.target)&&function(e,t){switch(t){case"android":case"ios":return"desktop"===e;case"macos":case"linux":case"web":return"desktop"!==e;case"apple":return!1;default:return l2(t)}}(h,d)&&s.push({key:"target",value:h}),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"===te(r.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":case"web":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return l2(e)}}(r,t)){let r=t[n];nC(r)&&e.push({key:n,value:r})}}(f,n,m)),f),S=e.meta?.lockPlatform;if(0===y.length){return c=v,u=t,p=g,!S||u||void 0!==p.platform||c&&nR(p,nk)||(g.platform=S),{...e,flags:g}}if("strip"===w)return function(e,t,r,n){if(n){l1(e,t),e.platform=n.device.platform;return}l1(e,t),r&&void 0===e.platform&&(e.platform=r)}(g,y,S,t),{...e,flags:g};throw new eG("INVALID_ARGS",function(e,t,r){let n=t.map(lj).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${lG(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,y,t),{session:e.session,conflicts:y.map(lj),hint:function(e,t){if(t)return lq(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${e3(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 l1(e,t){for(let r of t)delete e[r.key]}function l2(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function l3(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[l5(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return l0(e)}catch{return e}}(n);if("open"===(r=l).command||nE(r.flags))try{let e=await nI(l.flags??{});s.add(l5(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=l4(e)-l4(t);return 0!==r?r:e.localeCompare(t)})}function l5(e){return`device:${e}`}function l4(e){return+!e.startsWith("session:")}function l6(e,t={}){let r=ta(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function l8(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:l6(t,{simulatorSetPath:e.simulatorSetPath})}function l9(e,t,r){return ao(l8(e,t),r)}let l7="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 de(e){if(!(e instanceof eG)||"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 dt(e){return!(e instanceof eG)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function dr(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new eG("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:tu({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:tf("IOS_RUNNER_CONNECT_TIMEOUT")})}async function dn(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=tu({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new eG("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}
8
8
  ${t}
9
- ${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.":`${tl("IOS_RUNNER_CONNECT_TIMEOUT")} ${lW}`)})}function lY(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${r.randomUUID()}`}}function lQ(e){if(rv(e))throw rS()}let l0=new Map;async function l1(e,t,r,n,i=45e3,a,o){let s=tn.fromTimeoutMs(i),{getEndpoints:l}=l9(e,t),{endpoints:d}=await l(s.remainingMs()),c=null,u=Math.max(1,Math.ceil(i/250));try{return await tu(async({deadline:s})=>{let u=await l2({device:e,port:t,command:r,timeoutMs:i,logPath:n,session:a,endpoints:d,getEndpoints:l,signal:o,attemptDeadline:s,setEndpoints:e=>{d=e},setLastError:e=>{c=e}});if(u)return u;throw function(e){if(e.signal?.aborted)throw rS();return new eL("COMMAND_FAILED","Runner endpoint probe failed",{port:e.port,endpoints:e.endpoints,lastError:e.lastError?String(e.lastError):void 0})}({port:t,endpoints:d,lastError:c,signal:o})},{maxAttempts:u,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:lz},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||rA(e))throw rS();c||(c=e)}if(o?.aborted)throw rS();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw lJ({port:t,endpoints:d,logPath:n,lastError:c});let a=await di(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw lJ({port:t,endpoints:d,logPath:n,lastError:c})}async function l2(e){await l3(e);let t=await l5(e);if(t.response)return t.response;let r=await l4(e);return r||await l8(e,t.usedCachedTunnelIp)}async function l3(e){if(e.attemptDeadline?.isExpired())throw new eL("COMMAND_FAILED","Runner connection deadline exceeded",{port:e.port,timeoutMs:e.timeoutMs});if(e.session?.child.exitCode!==null&&e.session?.child.exitCode!==void 0)throw await lZ({session:e.session,port:e.port,logPath:e.logPath})}async function l5(e){let t=e.endpoints,r=!1;if("device"===e.device.kind){let n=await e.getEndpoints(e.attemptDeadline?.remainingMs());t=n.endpoints,r=n.cached,e.setEndpoints(t)}let n=r?t[0]:null;return{response:await l7(t,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,r)=>{var i;e.setLastError(r),"device"===e.device.kind&&t===n&&(i=e.device.id,l0.delete(i))}}),usedCachedTunnelIp:r}}async function l4(e){return"simulator"===e.device.kind&&e.session?.ready?await de(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function l8(e,t){var r;if("device"!==e.device.kind||!t)return null;r=e.device.id,l0.delete(r);let n=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(n.endpoints),await l7(n.endpoints,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,r)=>{e.setLastError(r)}})}async function l6(e,t,r,n=45e3,i){if(i?.aborted)throw rS();let a=tn.fromTimeoutMs(n),{getEndpoints:o}=l9(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new eL("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let d=a.remainingMs();if(d<=0)throw new eL("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await dr(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function l9(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await dt({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 l7(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 eL("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await dr(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||rA(e))throw rS();s(t,e)}return null}async function de(e,t,r,n){let{signal:i,attemptDeadline:a,onError:o}=n,s=a?.remainingMs()??45e3;if(s<=0)return null;try{let n=await di(e,t,r,s,i);return new Response(n.body,{status:n.status})}catch(e){if(i?.aborted||rA(e))throw rS();return o(e),null}}async function dt(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=l0.get(t))?e.expiresAt<=Date.now()?(l0.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 dn(i.id,a);return l(d),d&&(r=i.id,n=d,l0.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function dr(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 dn(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,n=i.join(u.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),i=await i4(["devicectl","device","info","details","--device",e,"--json-output",n,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==i.exitCode||!a.existsSync(n))return null;let o=JSON.parse(a.readFileSync(n,"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{dc(n)}}async function di(e,t,r,n,i){let a=JSON.stringify(r),o=lH(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 i4(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=to({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new eL("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:tl(e)})}return{status:200,body:l}}async function da(){return await new Promise((e,t)=>{let r=g.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 eL("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function ds(e,t,r,n){t&&dd(t,e),r&&dd(r,e),n&&process.stderr.write(e)}let dl=new Map;function dd(e,t){let r=(dl.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await a.promises.mkdir(i.dirname(e),{recursive:!0}),await a.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{dl.get(e)===r&&dl.delete(e)});dl.set(e,r)}function dc(e){try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}let du=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function dp(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new eL("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(!a.existsSync(e))throw new eL("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await df(e)){await i5("codesign",["--remove-signature",e],{allowFailure:!0});try{await i5("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof eL?n:new eL("COMMAND_FAILED",String(n));throw new eL("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 df(e){return 0===(await i5("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let dm=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),dh=new Set([" "," ","\n","\r"]),dw=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function dg(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new dy(e).parse()}function dv(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)}dv(r.children,t)}}class dy{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(dw.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?dS(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])&&dm.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,dS(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])&&dh.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function dS(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 db=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function dA(e){var t;let r=await dI(e);if(!r||0===r.length)return null;let n=i.dirname(e),o=new Set,s=function(e,t){let r=[],n=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(i.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&&n.add(i.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(n),hostRelativePaths:a}}(r,n);for(let e of s.testRootPaths){if(!a.existsSync(e))return null;o.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>a.existsSync(i.join(t,e)));return r?i.join(r,e):null})){if(!e)return null;o.add(e)}return Array.from(o)}async function dI(e){let t=await i8(e);if(t){var r,n,i,o=t;let e=new Set;for(let t of[i=o,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!d_(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(d_))}return r}(i),...Object.values(i).filter(e=>d_(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(db.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=a.readFileSync(e,"utf8"),n=dg(r),t=new Set,dv(n,(e,r)=>{if(db.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 d_(e){return!!e&&"object"==typeof e}let dx=["CFBundleIcons","CFBundleIcons~ipad"];async function dM(e){let t=e.filter(dE);if(0===t.length)return;let r=e.filter(e=>dR(e)&&!dC(e));for(let e of t){let t=function(e,t){let r=i.dirname(e);return t.find(e=>i.dirname(e)===r&&"AgentDeviceRunner.app"===i.basename(e))??t.find(t=>i.dirname(t)===r&&t!==e)??null}(e,r);t&&await dN(t,e)}}async function dN(e,t){var r;let n,o=function(e,t){let r=!1;for(let o of a.readdirSync(e,{withFileTypes:!0})){var n;if(o.isFile()&&(n=o.name,/^AppIcon.*\.png$/.test(n)||"Assets.car"===n))(function(e,t){if(a.existsSync(t)){let r=a.readFileSync(e),n=a.readFileSync(t);return!r.equals(n)&&(a.copyFileSync(e,t),!0)}return a.copyFileSync(e,t),!0})(i.join(e,o.name),i.join(t,o.name))&&(r=!0)}return r}(e,t),s=await dD(e,t);(o||s)&&(await dP(t),r=t,n=new Date,a.utimesSync(r,n,n))}async function dD(e,t){var r,n;let a=i.join(e,"Info.plist"),o=i.join(t,"Info.plist"),s=await i8(a),l=await i8(o);if(!s||!l)return!1;let d=(r=s,n=l,dx.flatMap(e=>{let t=r[e];return void 0===t||JSON.stringify(n[e])===JSON.stringify(t)?[]:[{key:e,value:t,shouldInsert:void 0===n[e]}]}));if(0===d.length)return!1;for(let e of d)await dk(o,e.key,e.value,e.shouldInsert);return!0}async function dk(e,t,r,n){let i=await i5("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new eL("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function dP(e){let t=await i5("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new eL("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function dE(e){return dR(e)&&dC(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function dC(e){return i.basename(e).endsWith("-Runner.app")}function dR(e){return i.basename(e).endsWith(".app")}let dO={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 dT(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eL("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":e6(e.target)}function dL(e){return"simulator"===e?"simulator":"device"}function d$(){return"arm64"===process.arch?"arm64":"x86_64"}let dF="XCTestDevices",dU=".agent-device-backup",dG=".agent-device-xctestdevices-backup-",dq=i.join(u.homedir(),".agent-device","ios-runner"),dj=".agent-device-runner-cache.json",dV={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},dB=["-IDEPackageSupportDisableManifestSandbox=1","-IDEPackageSupportDisablePluginExecutionSandbox=1","ENABLE_USER_SCRIPT_SANDBOXING=NO","OTHER_SWIFT_FLAGS=$(inherited) -disable-sandbox"],dH=new Map,dK=new Set,dW=new Map,dX=new Set;function dz(e){return e?.trim()??""}function dJ(e=process.env){return dz(e.AGENT_DEVICE_IOS_BUNDLE_ID)||dz(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function dZ(e=process.env){let t=dz(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${dJ(e)}.uitests`}let dY=function(e=process.env){let t=dJ(e),r=dZ(e);return Array.from(new Set([dz(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function dQ(e=u.homedir()){return i.join(e,"Library","Developer","XCTestDevices")}async function d0(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=te(e.simulatorSetPath);if(!r)return null;let n=i.resolve(r),o=i.resolve(t.xctestDeviceSetPath??dQ()),s=i.resolve(t.backupPath??function(e=dQ()){return`${e}${dU}`}(o)),l=i.resolve(t.lockDirPath??function(e=u.homedir()){return i.join(e,".agent-device","xctest-device-set.lock")}()),d=t.ownerStartTime??eN(process.pid),c=await d3({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(d1({xctestDeviceSetPath:o,backupPath:s}),function(e,t){if(i.resolve(e)===i.resolve(t))return!0;try{return a.realpathSync.native(e)===a.realpathSync.native(t)}catch{return!1}}(n,o))return await c(),null;a.mkdirSync(n,{recursive:!0}),a.existsSync(o)&&a.renameSync(o,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,n=i.dirname(r),o=i.join(n,`${dF}.agent-device-link-${process.pid}-${Date.now()}`);a.mkdirSync(n,{recursive:!0});try{a.symlinkSync(t,o,"dir"),a.renameSync(o,r)}catch(e){throw a.existsSync(o)&&d2(o),e}}({requestedSetPath:n,xctestDeviceSetPath:o})}catch(e){throw d1({xctestDeviceSetPath:o,backupPath:s}),await c(),new eL("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:n,xctestDeviceSetPath:o,backupPath:s,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{d1({xctestDeviceSetPath:o,backupPath:s})}finally{await c()}}}}}function d1(e){let{xctestDeviceSetPath:t,backupPath:r}=e,n=[r,...function(e){let t=i.dirname(e),r=i.basename(e).replace(dU,""),n=r===dF?dG:`${r}${dG}`;try{return a.readdirSync(t).filter(e=>e.startsWith(n)).sort().map(e=>i.join(t,e))}catch{return[]}}(r)],o=n.find(e=>a.existsSync(e)),s=a.existsSync(t)&&a.lstatSync(t).isSymbolicLink();if(o){if(s&&d2(t),a.existsSync(t))if(!s)return void el({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:o}});else o!==r?a.rmSync(o,{recursive:!0,force:!0}):a.rmSync(r,{recursive:!0,force:!0});else a.mkdirSync(i.dirname(t),{recursive:!0}),a.renameSync(o,t);for(let e of n)e!==o&&a.existsSync(e)&&a.rmSync(e,{recursive:!0,force:!0});return}s&&(el({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),d2(t))}function d2(e){!a.existsSync(e)||a.lstatSync(e).isSymbolicLink()&&a.unlinkSync(e)}async function d3(e){return await ef({lockDirPath:e.lockDirPath,owner:e.owner,timeoutMs:e.timeoutMs??3e4,pollMs:e.pollMs??100,ownerGraceMs:5e3,description:e.description??"XCTest device set lock"})}async function d5(e){var t;return await d3({lockDirPath:(t=e,i.join(i.dirname(t),`${i.basename(t)}.lock`)),owner:{pid:process.pid,startTime:eN(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function d4(e,t){let n=function(e){var t;let n,o,s=e.iosXctestrunFile?.trim();if(!s)return null;let l=i.resolve(s);if(!a.existsSync(l))throw new eL("COMMAND_FAILED","Configured iOS XCTest runner .xctestrun file not found",{configKey:"iosXctestrunFile",xctestrunPath:l});let d=e.iosXctestDerivedDataPath?.trim(),c=d?i.resolve(d):(t=l,(n=r.createHash("sha1")).update(t),o=n.digest("hex").slice(0,12),i.join(u.tmpdir(),"agent-device-ios-xctest-derived",o));return cP("reuse","external_xctestrun",{derived:c,xctestrunPath:l}),{xctestrunPath:l,derived:c,cache:"external",artifact:"valid",buildMs:0,xctestrunPathSource:"external"}}(t);if(n)return n;let o=tK(),s=cr(e,o),l=cI(e,s);return await lN(dH,l,async()=>{let r=await d5(l);try{return await d8({device:e,options:t,projectRoot:o,expectedCacheMetadata:s,derived:l,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await r()}})}async function d8(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(ti(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||dK.has(t))&&(cP("clean",r?"forced_rebuild":"forced_clean",{derived:t}),cD(t),ce(t),dK.delete(t));let l=await ck({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>cm(e,n),xctestrunReferencesProjectRoot:cw,resolveExistingXctestrunProductPaths:dA}),d="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&cP("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let c=await d6({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:d});return c||(l.xctestrunPath&&(cD(s),ce(s)),await d9({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:d,reason:l.reason}))}async function d6(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await d7(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function d9(e){let{device:t,options:r,projectRoot:n,expectedCacheMetadata:o,derived:s,cache:l,reason:d}=e,c=i.join(n,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!a.existsSync(c))throw new eL("COMMAND_FAILED","iOS runner project not found",{projectPath:c});let u=Date.now();await cA(t,c,s,r);let p=Math.max(0,Date.now()-u),f=cm(s,t);if(!f)throw new eL("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await dA(f);if(!m)throw new eL("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await dp(t,m,f),await dM(m),ci(s,cl(o,f,m)),cP("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:d}}async function d7(e,t,r,n){try{var i,a,o,s;return await dp(e,n.productPaths,n.xctestrunPath),cP("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,ci(i,cl(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof eL))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&du.has(t)}(e))throw e;return cP("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function ce(e){try{if(!a.existsSync(e))return;if("derived"!==i.basename(e))return void a.rmSync(e,{recursive:!0,force:!0});for(let r of a.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,ct.has(t)&&a.rmSync(i.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let ct=new Set([dj,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function cr(e,t=tK()){let n,o=dT(e);return{schemaVersion:2,packageVersion:tH(),runnerSourceFingerprint:function(e){let t=i.join(e,"ios-runner","AgentDeviceRunner"),n=function(e){if(!a.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of a.readdirSync(e,{withFileTypes:!0})){var n,o;let a=i.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(a);continue}s.isFile()&&(n=s.name,o=a,"project.pbxproj"===n?o.includes(`${i.sep}.xcodeproj${i.sep}`):[".jpg",".json",".png",".swift",".m",".h",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(i.extname(n)))&&t.push(a)}}return t.sort((e,t)=>e.localeCompare(t))}(t),o=function(e,t){let n=r.createHash("sha256");for(let r of t){let t=i.relative(e,r),o=a.statSync(r);n.update(t),n.update("\0"),n.update(String(o.size)),n.update("\0"),n.update(String(Math.trunc(o.mtimeMs))),n.update("\0")}return n.digest("hex")}(t,n),s=cf.get(t);if(s?.fileStatsFingerprint===o)return s.sourceFingerprint;let l=r.createHash("sha256");for(let e of n){let r=i.relative(t,e);l.update(r),l.update("\0"),l.update(a.readFileSync(e)),l.update("\0")}let d=l.digest("hex");return cf.set(t,{fileStatsFingerprint:o,sourceFingerprint:d}),d}(t),...function(e,t){var r;let n=(r=cn("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=dO[e].sdkName[dL(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:cn("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:cn("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(o,e.kind),platformName:o,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(n=dT(e))?`platform=macOS,arch=${d$()}`:"simulator"===e.kind?`generic/platform=${n} Simulator`:`generic/platform=${n}`,runnerBundleBuildSettings:cM(process.env),runnerSigningBuildSettings:cx(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:cN(),runnerSandboxBuildArgs:[...dB]}}function cn(e,t){let r=JSON.stringify([e,t]),n=dW.get(r);if(void 0!==n)return n;try{let n=eG(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return dW.set(r,i),i}catch{return dW.set(r,"unknown"),"unknown"}}function ci(e,t){a.mkdirSync(e,{recursive:!0}),a.writeFileSync(i.join(e,dj),`${JSON.stringify(t,null,2)}
10
- `)}async function ca(e,t){if("external"===e.cache)return void cP("preserve","external_bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t});dK.add(e.derived);let r=await d5(e.derived);try{cP("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),cD(e.derived),ce(e.derived)}finally{await r()}}function co(e){let{artifacts:t,...r}=e;return r}function cs(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 cl(e,t,r){let n=function(e,t){let r=cc(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=cc(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 cd(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function cc(e){try{let t=a.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function cu(e,t){let r=cc(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function cp(e,t){let r=i.relative(i.resolve(t),i.resolve(e));return""!==r&&!r.startsWith("..")&&!i.isAbsolute(r)}let cf=new Map;function cm(e,t){if(!a.existsSync(e))return null;let r=[],n=[e];for(;n.length>0;){let e=n.pop();for(let t of a.readdirSync(e,{withFileTypes:!0})){let o=i.join(e,t.name);if(t.isDirectory()){n.push(o);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=a.statSync(o);r.push({path:o,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,r)=>{if(t){let n=ch(r.path,t)-ch(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function ch(e,t){let r=0,n=e.toLowerCase();i.basename(n).startsWith("agentdevicerunner.env.")&&(r-=1e3),n.includes(`${i.sep}macos${i.sep}`)&&(r-=5e3);let a=dO[dT(t)].xctestrunHints[dL(t.kind)];return a.preferred.length>0&&(a.preferred.some(e=>n.includes(e))?r+=2e3:r-=500),a.disallowed.some(e=>n.includes(e))&&(r-=2500),r}function cw(e,t){try{let r=a.readFileSync(e,"utf8"),n=new Set([t]);try{n.add(a.realpathSync(t))}catch{}for(let e of n)if(r.includes(e))return!0;return!1}catch{return!1}}async function cg(e,t,r,n={}){let o=n.iosXctestEnvDir?.trim(),s=o?i.resolve(o):i.dirname(e);a.mkdirSync(s,{recursive:!0});let l=r.replace(/[^a-zA-Z0-9._-]/g,"_"),d=i.join(s,`AgentDeviceRunner.env.${l}.json`),c=i.join(s,`AgentDeviceRunner.env.${l}.xctestrun`),u=await cv(e);return cS(u,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})}),cS(u,e=>Object.assign(e,dV),{requireTestBundlePath:!0}),await cy(u,d,c),{xctestrunPath:c,jsonPath:d}}async function cv(e){let t=await i5("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new eL("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 eL("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function cy(e,t,r){a.writeFileSync(t,JSON.stringify(e,null,2));let n=await i5("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new eL("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:r,stderr:n.stderr})}function cS(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=cb(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=cb(r,{requireTestBundlePath:!0});e&&t(e)}}function cb(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function cA(e,t,r,n){let i=cM(process.env),a=cx(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=cN(),l=[...dB],d=await d0(e);try{let d;await eF("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",c_(e),"1","-destination",(d=dT(e),"macOS"===d?`platform=macOS,arch=${d$()}`:"simulator"===e.kind?`platform=${d} Simulator,id=${e.id}`:`generic/platform=${d}`),"-derivedDataPath",r,...s,...l,...i,...o,...a],{detached:!0,timeoutMs:n.buildTimeoutMs,onSpawn:e=>{dX.add(e),e.on("close",()=>{dX.delete(e)})},onStdoutChunk:e=>{ds(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{ds(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof eL?a:new eL("COMMAND_FAILED",String(a)),i=(e=r.details?JSON.stringify(r.details):"",((t=`${r.message}
11
- ${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)??lW);throw new eL("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await d?.release()}}function cI(e,t){let n,a=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(a)return i.resolve(a);let o=(n=r.createHash("sha256").update(cs(co(t))).digest("hex"),`cache-${n.slice(0,16)}`),s=function(e){return i.join(dq,"derived",dO[dT(e)].derivedBaseName[dL(e.kind)])}(e);return i.join(s,o)}function c_(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function cx(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 cM(e=process.env){let t=dJ(e),r=dZ(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function cN(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function cD(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,n;if(r=e,t=i.resolve(tK(),".tmp"),""===(n=i.relative(t,i.resolve(r)))||n.startsWith("..")||i.isAbsolute(n))throw new eL("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 ${i.join(tK(),".tmp")}.`})}}async function ck(e){var t,r;let n,o=(t=e.derived,r=e.expectedCacheMetadata,(n=function(e){try{let t=JSON.parse(a.readFileSync(i.join(e,dj),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?cs(co(n))!==cs(co(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:n}:{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(cd))||!cp(n.xctestrunPath,e)||!cu(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!cp(t.path,e)||!cu(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?"manifest":"scan",u=d?s.productPaths:await e.resolveExistingXctestrunProductPaths(l);return u?e.xctestrunReferencesProjectRoot(l,e.projectRoot)||d?o.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:u,source:c}:{reason:o.reason,xctestrunPath:l,productPaths:u,source:c}:{reason:"project_root_mismatch",xctestrunPath:l,productPaths:u,source:c}:{reason:"missing_products",xctestrunPath:l,productPaths:[],source:c}}function cP(e,t,r){el({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let cE={readOnly:!1,readinessProbe:!1,readinessPreflightSkipEligibleAfterHealthyMutation:!1},cC={...cE,readOnly:!0},cR={...cC,readinessProbe:!0},cO={...cE,readinessPreflightSkipEligibleAfterHealthyMutation:!0},cT=Object.fromEntries(Object.entries({tap:"preflightSkippableTouchMutation",mouseClick:"default",longPress:"preflightSkippableTouchMutation",drag:"preflightSkippableTouchMutation",remotePress:"default",type:"default",swipe:"preflightSkippableTouchMutation",scroll:"preflightSkippableTouchMutation",desktopScroll:"preflightSkippableTouchMutation",findText:"readOnly",querySelector:"readOnly",readText:"readOnly",snapshot:"readOnly",screenshot:"readOnly",back:"default",backInApp:"default",backSystem:"default",home:"default",rotate:"default",rotateGesture:"default",transformGesture:"default",appSwitcher:"default",keyboardDismiss:"default",keyboardReturn:"default",alert:"readOnly",pinch:"default",sequence:"preflightSkippableTouchMutation",recordStart:"default",recordStop:"default",status:"readOnlyReadinessProbe",uptime:"readOnlyReadinessProbe",shutdown:"default"}).map(([e,t])=>[e,function(e){switch(e){case"default":return cE;case"readOnly":return cC;case"readOnlyReadinessProbe":return cR;case"preflightSkippableTouchMutation":return cO}}(t)]));function cL(e){return cT[e].readOnly}function c$(e){return cT[e].readinessPreflightSkipEligibleAfterHealthyMutation}let cF=process.pid,cU=eN(process.pid),cG=(tJ=cF,tZ=cU,(e=r.createHash("sha256")).update(String(tJ)),e.update("\0"),e.update(tZ??"unknown-start"),`owner-${tJ}-${e.digest("hex").slice(0,8)}`);async function cq(e,t){let r=await ef({lockDirPath:`${cX(e)}.lock`,owner:{pid:cF,startTime:cU,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await r()}}function cj(e){try{let o;var t,r,n=JSON.parse(a.readFileSync(cX(e),"utf8")),i=e;if(!n||"object"!=typeof n||Array.isArray(n)||1!==n.schemaVersion||n.deviceId!==i)return null;let s=(t=n,o={ownerToken:cz(t.ownerToken),ownerPid:cZ(t.ownerPid),sessionId:cz(t.sessionId),port:cZ(t.port),xctestrunPath:cz(t.xctestrunPath),jsonPath:cz(t.jsonPath),createdAtMs:(r=t.createdAtMs,"number"==typeof r&&Number.isFinite(r)?r:null)},Object.values(o).some(e=>null===e)?null:o);return s?{schemaVersion:1,deviceId:i,...s,ownerStartTime:cJ(n.ownerStartTime),ownerStateDir:cJ(n.ownerStateDir)??void 0,runnerPid:cZ(n.runnerPid)}:null}catch{return null}}function cV(e){var t;return e?e.ownerToken===cG?{type:"owned",lease:e}:eC((t=e).ownerPid)&&(!t.ownerStartTime||eN(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function cB(e,t){let r=cV(cj(e));if("empty"===r.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===r.type){var n,a;let o,s,l;if(n=r.lease,(o=cH())&&n.ownerStateDir&&i.resolve(o)===i.resolve(n.ownerStateDir))return void await cY(r.lease,"same-state-dir",t);throw new eL("COMMAND_FAILED",`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,ownerPid:r.lease.ownerPid,ownerStartTime:r.lease.ownerStartTime,ownerStateDir:r.lease.ownerStateDir,ownerToken:r.lease.ownerToken,sessionId:r.lease.sessionId,hint:(a=r.lease,s=`PID ${a.ownerPid}`,l=a.ownerStateDir?` with AGENT_DEVICE_STATE_DIR=${a.ownerStateDir}`:"",`The Mac operator must stop the owning daemon (${s}${l}) or wait for that run to finish, then retry. Do not run prepare ios-runner from another daemon/client to recover this; a live foreign runner lease cannot be released by the remote client.`)})}await cY(r.lease,r.type,t)}function cH(){return process.env.AGENT_DEVICE_STATE_DIR?.trim()||void 0}async function cK(e,t){let r=cV(cj(e));"owned"===r.type&&await cY(r.lease,"owned",t)}function cW(e){e&&function(e){let t=cj(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{a.unlinkSync(cX(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function cX(e){let t;return i.join((t=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim())?i.resolve(t):i.join(u.homedir(),".agent-device","ios-runner","leases"),`${e.replaceAll(/[^A-Za-z0-9._-]/g,"-")||"unknown-device"}.json`)}function cz(e){return"string"==typeof e&&e.length>0?e:null}function cJ(e){return"string"==typeof e?e:null}function cZ(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function cY(e,t,r){el({level:"stale"===t||"same-state-dir"===t?"warn":"debug",phase:"ios_runner_lease_cleanup",data:{deviceId:e.deviceId,ownerPid:e.ownerPid,ownerStateDir:e.ownerStateDir,ownerToken:e.ownerToken,runnerPid:e.runnerPid,sessionId:e.sessionId,reason:t}}),await r.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGTERM"),await r.cleanupRunnerXcodebuildProcesses(e.deviceId,e.ownerToken),await r.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGKILL"),r.cleanupTempFile(e.xctestrunPath),r.cleanupTempFile(e.jsonPath),cW(e)}let cQ={cleanupRunnerProcessTree:ut,cleanupRunnerXcodebuildProcesses:ur,cleanupTempFile:dc};async function c0(e,t={}){var r;!1!==t.graceful?await c5(e):await ut(e.child.pid,"SIGTERM"),await c4(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(c9(r)||eP(r))&&await ut(e.child.pid,"SIGKILL"),await c8(e)}async function c1(e){await cK(e,cQ)}async function c2(e){let t=Array.from(dX);await c7(e,"SIGINT"),await ue(t,"SIGINT"),await c7(e,"SIGTERM"),await ue(t,"SIGTERM"),await c7(e,"SIGKILL"),await ue(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await c8(e)}))}async function c3(){let e=Array.from(dX);await Promise.allSettled(e.map(async e=>{try{await ut(e.pid,"SIGTERM"),await ut(e.pid,"SIGKILL")}finally{dX.delete(e)}}))}async function c5(e){try{await l1(e.device,e.port,lY({command:"shutdown"}),void 0,15e3)}catch{await ut(e.child.pid,"SIGTERM")}}async function c4(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function c8(e){await c6(e.device),dc(e.xctestrunPath),dc(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{cW(e.lease)}}async function c6(e){"simulator"===e.kind&&await Promise.allSettled(dY.map(async t=>{try{await i4(lH(e,["terminate",e.id,t]),{allowFailure:!0,timeoutMs:2e3})}catch(r){el({level:"warn",phase:"ios_runner_simulator_app_terminate_failed",data:{deviceId:e.id,bundleId:t,timeoutMs:2e3,error:r instanceof Error?r.message:String(r)}})}}))}function c9(e){return!!e&&eC(e)}async function c7(e,t){await Promise.allSettled(e.map(async e=>{await ut(e.child.pid,t)}))}async function ue(e,t){await Promise.allSettled(e.map(async e=>{await ut(e.pid,t),"SIGKILL"===t&&dX.delete(e)}))}async function ut(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 i5("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function ur(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${un(e)}-${un(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${un(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await i5("pkill",[`-${t}`,"-f",r],{allowFailure:!0,timeoutMs:2e3})}catch(r){el({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:t,error:r instanceof Error?r.message:String(r)}})}}function un(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function ui(e){let t=await ua(e.logPath);return t?new eL(t.code??e.error.code,e.error.message,{...e.error.details??{},hint:"string"==typeof e.error.details?.hint?`${e.error.details.hint} ${t.hint}`:t.hint,runnerFailureReason:t.reason},e.error):e.error}async function ua(e){if(!e)return;let t=await uo(e,65536);if(t){var r,n;let e;return(r=e=t.toLowerCase()).includes("axruntime")&&r.includes("coretext")&&(r.includes("attributesforelement")||r.includes("axuielementcopymultipleattributevalues")||r.includes("reconstitutedsmuggledctfontfromdictionary")||r.includes("reconstitutedsmuggledattributedstringfromdictionary"))?{code:"IOS_TARGET_APP_CRASH",reason:"target_app_axruntime_coretext_crash",hint:"The target iOS app appears to have crashed while XCTest/AXRuntime read accessibility attributes. This is usually a simulator/XCTest/runtime or app accessibility payload issue, not a text-entry failure. Reproduce on the latest stable simulator runtime, reinstall the app, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime."}:(n=e).includes("process crashed")||n.includes("the application under test")||n.includes("terminated unexpectedly")||n.includes("exception type:")&&n.includes("thread 0 crashed")?{code:"IOS_TARGET_APP_CRASH",reason:"target_app_crash",hint:"The target iOS app appears to have crashed while the runner was executing the command. Reopen or reinstall the app, retry on a fresh/latest stable simulator runtime, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime."}:void 0}}async function uo(e,t){let r;try{let n=await w.stat(e),i=Math.max(0,n.size-t),a=n.size-i;if(a<=0)return;r=await w.open(e,"r");let o=Buffer.alloc(a);return await r.read(o,0,a,i),o.toString("utf8")}catch{return}finally{await r?.close().catch(()=>{})}}let us=new Map,ul=new Map;async function ud(e,t){return await lN(ul,e.id,async()=>{let r=us.get(e.id);if(r){let t=await uu(e,r);if(t)return t}return await cq(e.id,async()=>await uc(e,t))})}async function uc(e,t){var r,n;let o,s,l,d={};await uP(d,"cleanup_stale_xcodebuild",async()=>{await cB(e.id,cQ)}),await uP(d,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(el({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):uS(t))}),await uP(d,"verify_developer_mode",async()=>{await ub(e)}),t.cleanStaleBundles?await uP(d,"cleanup_stale_bundles",async()=>{await up(e)}):(d.cleanup_stale_bundles=0,el({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let c=await uP(d,"ensure_xctestrun",async()=>await d4(e,t));d.build_xctestrun=c.buildMs;let u=await uP(d,"allocate_port",async()=>await da()),{xctestrunPath:p,jsonPath:f}=await uP(d,"prepare_xctestrun_env",async()=>await cg(c.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(u)},`session-${e.id}-${cG}-${u}`,{iosXctestEnvDir:t.iosXctestEnvDir})),m=await uP(d,"simulator_set_redirect",async()=>await d0(e)),h=["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",c_(e),"1","-destination-timeout",String(20),"-xctestrun",p,"-derivedDataPath",c.derived,"-destination","macOS"===(l=dT(e))?`platform=macOS,arch=${d$()}`:"simulator"===e.kind?`platform=${l} Simulator,id=${e.id}`:`platform=${l},id=${e.id}`];try{({child:o,wait:s}=await uP(d,"launch_xcodebuild",()=>e$("xcodebuild",h,{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(u)},detached:!0})))}catch(e){throw await m?.release(),e}o.stdout?.on("data",e=>{ds(e,t.logPath,t.traceLogPath,t.verbose)}),o.stderr?.on("data",e=>{ds(e,t.logPath,t.traceLogPath,t.verbose)});let w=`${e.id}:${u}:${Date.now()}`,g={schemaVersion:1,deviceId:(r={deviceId:e.id,sessionId:w,runnerPid:o.pid,port:u,xctestrunPath:p,jsonPath:f}).deviceId,ownerToken:cG,ownerPid:cF,ownerStartTime:cU,ownerStateDir:cH(),sessionId:r.sessionId,runnerPid:r.runnerPid??null,port:r.port,xctestrunPath:r.xctestrunPath,jsonPath:r.jsonPath,createdAtMs:Date.now()},v={sessionId:w,device:e,deviceId:e.id,port:u,xctestrunPath:p,xctestrunArtifact:c,jsonPath:f,testPromise:s,child:o,ready:!1,startupTimeoutMs:"number"==typeof(n=t.startupTimeoutMs)&&Number.isFinite(n)&&n>0?Math.floor(n):void 0,startupTimings:d,simulatorSetRedirect:m??void 0,lease:g};try{let e,t;e=cX(g.deviceId),a.mkdirSync(i.dirname(e),{recursive:!0}),t=`${e}.${process.pid}.${Date.now()}.tmp`,a.writeFileSync(t,JSON.stringify(g,null,2),"utf8"),a.renameSync(t,e)}catch(t){throw await uw(e.id,v,{graceful:!1,waitTimeoutMs:1e3}),t}return us.set(e.id,v),v}async function uu(e,t){if(!c9(t.child.pid))return await uP({},"stop_stale_session",async()=>{await uw(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=t.xctestrunArtifact;if(r?.cache==="external")return el({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,cache:r.cache}}),t;let n=cI(e,cr(e));return r?.derived!==n?(el({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:r?.derived,expectedDerived:n}}),await uP({},"stop_stale_artifact_session",async()=>{await uw(e.id,t)}),null):(el({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready}}),t)}async function up(e){if("simulator"===e.kind)for(let t of dY){let r=await uf(e,t);if(!r||function(e){if(0===e.exitCode)return!0;let t=`${e.stdout}
12
- ${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 uf(e,t){try{return await i4(lH(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(r){el({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 um(e){let t=us.get(e);return t?{sessionId:t.sessionId,alive:c9(t.child.pid)}:null}async function uh(e,t){await lN(ul,e.deviceId,async()=>{us.get(e.deviceId)===e&&(el({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await uw(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function uw(e,t,r={}){let n=t??us.get(e);n&&(await c0(n,r),us.get(e)===n&&us.delete(e))}async function ug(e){await lN(ul,e,async()=>{await cq(e,async()=>{await uw(e),await c1(e)})})}async function uv(){let e=Array.from(us.values());for(let t of(await c2(e),e))us.get(t.deviceId)===t&&us.delete(t.deviceId)}async function uy(){await uv();let e=Array.from(us.keys());await Promise.allSettled(e.map(async e=>{await ug(e)})),await c3()}async function uS(e){await i4(lH(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}async function ub(e){if("ios"!==e.platform||"device"!==e.kind)return;let t=await i5("DevToolsSecurity",["-status"],{allowFailure:!0,timeoutMs:2e3}),r=`${t.stdout}
13
- ${t.stderr}`;if(/developer mode is currently disabled/i.test(r))throw new eL("COMMAND_FAILED","Developer mode is disabled for Apple development tools",{hint:"Run `sudo DevToolsSecurity -enable`, then retry the iOS runner. UI test runners start suspended until Xcode/testmanagerd can attach.",devToolsSecurityStatus:r.trim()})}function uA(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eL("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new eL("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function uI(e,t,r,n,i,a){var o,s,l,d,c,u;let p;o=t,s=r.command,o.startupTimingsReported||!o.startupTimings||(o.startupTimingsReported=!0,el({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 f=lY(r),m=cL(f.command),h=tn.fromTimeoutMs(i),w=function(e,t){let r=cL(t.command);if(!e.ready)return r?{action:"skip",reason:"read_only_startup_command"}:{action:"run",reason:"startup"};if(cT[t.command].readinessProbe)return{action:"skip",reason:"readiness_probe_command"};if(!c$(t.command))return{action:"run",reason:"conservative_command"};let n=e.lastHealthyMutation;if(!n)return{action:"run",reason:"no_recent_healthy_mutation"};if(t.appBundleId!==n.appBundleId)return{action:"run",reason:"app_activation_uncertain"};let i=Date.now()-n.atMs;return i>5e3?{action:"run",reason:"healthy_mutation_stale",lastHealthyMutationAgeMs:i}:{action:"skip",reason:"recent_healthy_mutation",lastHealthyMutationAgeMs:i}}(t,f);"run"===w.action?await uM({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,signal:a,decision:w}):(l=f,d=t,c=w,el({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:l.command,commandId:l.commandId,reason:c.reason,lastHealthyMutationAgeMs:"recent_healthy_mutation"===c.reason?c.lastHealthyMutationAgeMs:void 0,sessionReady:d.ready}}));try{p=await ux({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,timeoutMs:i,signal:a,readOnlyCommand:m})}catch(e){throw u_(e,t,w)}try{let e=await uN(p,t,n),r=function(e){if(!0===e.runnerFatal)return"string"==typeof e.runnerFatalReason&&e.runnerFatalReason.trim().length>0?e.runnerFatalReason:"runner_reported_fatal_response"}(e);return r?(t.lastHealthyMutation=void 0,await uh(t,r)):c$(f.command)&&(t.lastHealthyMutation={atMs:Date.now(),appBundleId:f.appBundleId}),e}catch(r){let e=function(e){if(e instanceof eL){if("IOS_AX_SNAPSHOT_FAILED"===e.code)return"ax_snapshot_failure";if("XCTEST_RECORDED_FAILURE"===e.code)return"xctest_recorded_failure"}}(r);if(e)throw t.lastHealthyMutation=void 0,await uh(t,e),r;if((u=r)instanceof eL&&u.details?.runner!==void 0)throw r;throw u_(r,t,w)}}function u_(e,t,r){return"skip"!==r.action||"recent_healthy_mutation"!==r.reason?e:(t.lastHealthyMutation=void 0,uD(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:r.reason,runnerReadinessPreflightSkippedAgeMs:r.lastHealthyMutationAgeMs}))}async function ux(e){let{device:t,session:r,runnerCommand:n,logPath:i,deadline:a,timeoutMs:o,signal:s,readOnlyCommand:l}=e,d=a.remainingMs();if(d<=0)throw new eL("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:o});let c=l?{command:n.command,commandId:n.commandId,readOnly:!0,sessionReady:r.ready,timeoutMs:d}:{command:n.command,commandId:n.commandId};return await eo("ios_runner_command_send",async()=>l?await l1(t,r.port,n,i,d,r,s):await l6(t,r.port,n,d,s),c)}async function uM(e){let{device:t,session:r,runnerCommand:n,logPath:i,deadline:a,signal:o,decision:s}=e,l=r.ready?Math.min(1e3,a.remainingMs()):Math.min(uk(r),a.remainingMs());try{let e=await eo("ios_runner_readiness_preflight",async()=>await l1(t,r.port,lY({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:r.ready,timeoutMs:l});await uN(e,r,i)}catch(e){throw uD(e,{runnerReadinessPreflightFailed:!0})}}async function uN(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new eL("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?eR(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 await ui({error:new eL(t,i??"Runner error",{runner:n,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,logPath:r}),logPath:r})}if(t.ready=!0,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&&el({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 uD(e,t){let r=e instanceof eL?e:new eL("COMMAND_FAILED",e instanceof Error?e.message:String(e),void 0,e);return new eL(r.code,r.message,{...r.details??{},...t},r.cause??e)}function uk(e){return e.startupTimeoutMs??45e3}async function uP(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,el({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}let uE=new h;function uC(e,t={}){return{runCommand:e,...t}}function uR(e,t,r,n={}){if(r)return uT(r);let i=function(e,t={}){let r=uE.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?uT(i.provider):uT(t)}async function uO(e,t,r){if(!e)return await r();let n={provider:uT(e),deviceId:t.deviceId,requestId:t.requestId};return await uE.run(n,r)}function uT(e){return"function"==typeof e?{runCommand:e}:e}async function uL(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await uU(t,r,n,i,a,o);return await u$(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function u$(e,t){var r,n,i,a;if(!e)return await uF(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,uj({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,uj({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await uF(t,e.reason,e.lifecycleState,e.error)}async function uF(e,t,r,n){throw uj({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 uU(e,t,r,n,i,a){var o,s,l,d,c,u,p,f,m,h,w,g;let v,y,S,b,A;if("status"===r.command||!r.commandId?.trim())return;let I=uq(n);try{v=await uI(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return el({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:r.command,commandId:r.commandId,error:e instanceof Error?e.message:String(e),...I}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let _="string"==typeof v.lifecycleState?v.lifecycleState:"";return el({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:_,...I}}),o=v,s=_,l=r,d=n,c=i,"completed"===s?function(e,t,r,n){var i,a;let o=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(o)return{type:"recovered",data:o,reason:"completed_with_retained_response",lifecycleState:"completed"};if(cL(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let s=uq(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new eL("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",...s,hint:(i=t.command,a=s,`${uG(a)}The runner is still reachable and reports "${i}" 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.`),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,y="string"==typeof u.lifecycleErrorCode?u.lifecycleErrorCode:void 0,S="string"==typeof u.lifecycleErrorMessage?u.lifecycleErrorMessage:"Runner command failed",b="string"==typeof u.lifecycleErrorHint?u.lifecycleErrorHint:void 0,A=uq(f),new eL(eR(y),S,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...A,hint:b??(h=p.command,w=A,`${uG(w)}The runner is still reachable and reports "${h}" 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.`),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){var i,a,o;if(cL(t.command))return r;let s=uq(r);return new eL("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",...s,hint:(i=t.command,a=e,o=s,`${uG(o)}The runner is still reachable and reports "${i}" is ${a}, 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.`),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 eL("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:(g=l.command,`The runner did not confirm that "${g}" 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 uG(e){return!0!==e.readinessPreflightSkipped?"":"This hot command skipped the uptime preflight because the runner had just completed a healthy interaction; status recovery confirmed the runner still observed it. "}function uq(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}function uj(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;el({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}})}async function uV(e,t){let r;lQ(t.requestId);let n=ry(t.requestId),i=lY({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await uB({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new eL("COMMAND_FAILED","iOS runner prepare failed")}async function uB(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await ud(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles}),d=Date.now()-s;try{var c,u;let e=await uZ(t,l,r,n,i,d,{recoveryReason:o});return{kind:"prepared",result:(c=t,u=e,uY(c,u),u)}}catch(e){return await uH({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function uH(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:d}=e,c=d instanceof eL?d:new eL("COMMAND_FAILED",String(d));if(1===l&&(t=c,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&uX(t)))return{kind:"prepared",result:await uK({device:n,session:i,command:a,options:o,signal:s,error:c})};if(!uX(c))throw d;let u=c.message||"runner_health_failed";if(l>=2)throw await uW(i,"prepare_runner_health_failed"),d;return lQ(o.requestId),await uh(i,"prepare_runner_health_retry"),el({level:"warn",phase:"ios_runner_prepare_health_retry",data:{command:a.command,commandId:a.commandId,sessionId:i.sessionId,attempt:l,maxAttempts:2,reason:u}}),{kind:"retry",recoveryReason:u}}async function uK(e){var t,r,n,i,a;let{device:o,session:s,command:l,options:d,signal:c,error:u}=e,p=u.message||"runner_health_failed";await uh(s,"prepare_cached_runner_health_failed"),await ca(s.xctestrunArtifact,p);let f=Date.now(),m=await ud(o,{...d,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await uZ(o,m,l,d,c,h,{recoveryReason:p});return el({level:"info",phase:"ios_runner_prepare_bad_cache_recovered",data:{command:l.command,commandId:l.commandId,sessionId:m.sessionId,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,reason:p}}),t=o,r=e,uY(t,r),r}catch(r){let e;await uW(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof eL?n:new eL("COMMAND_FAILED",String(n)),new eL(e.code,"artifact restored but runner did not connect",{...e.details??{},restoredFailureReason:a,xctestrunPath:i.xctestrunArtifact?.xctestrunPath,artifact:i.xctestrunArtifact?.artifact,cache:i.xctestrunArtifact?.cache,reason:e.message},e));throw uY(o,{cache:m.xctestrunArtifact?.cache,artifact:m.xctestrunArtifact?.artifact,buildMs:m.xctestrunArtifact?.buildMs,connectMs:h,healthCheckMs:0,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,failureReason:t.message}),t}}async function uW(e,t){try{await uh(e,t)}catch{}}function uX(e){let t;return!rA(e)&&(lX(e)||lz(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function uz(e,t,r){let n;lQ(r.requestId);let i=ry(r.requestId);try{let a=(n=await ud(e,r)).ready?45e3:uk(n);return await uI(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof eL?o:new eL("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&lz(a)&&n)return lQ(r.requestId),await uJ({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&&(lX(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return lQ(r.requestId),await uJ({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&&lX(a))return await uL({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:uh});throw o}}async function uJ(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await uh(e.session,a);let o=await ud(t,{...n,cleanStaleBundles:!0});try{let a=await uI(t,o,r,n.logPath,45e3,i);return e.recoveredDiagnosticPhase&&el({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 eL?a:new eL("COMMAND_FAILED",String(a));if(lX(e))return await uL({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:uh});throw a}}async function uZ(e,t,r,n,i,a,o){var s,l,d,c,u;let p,f,m=Date.now();return s=await uI(e,t,r,n.logPath,n.healthTimeoutMs,i),l=t,d=a,c=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,d),healthCheckMs:Math.max(0,c),xctestrunPath:p.xctestrunPath,...f}:{runner:s,connectMs:Math.max(0,d),healthCheckMs:Math.max(0,c),...f}}function uY(e,t){el({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 uQ(e,t,r={}){uA(e),lQ(r.requestId);let n=lY(t),i=u2(e,r);return cL(n.command)?tr(()=>(lQ(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(lQ(r.requestId),lX(e))}):i.runCommand(e,n,r)}function u0(e,t={}){if("ios"!==e.platform)return;let{propagateError:r=!1,...n}=t,i=u2(e,n);return i.prewarm?i.prewarm(e,n).then(()=>{}).catch(t=>{if(el({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}}),r)throw t}):void el({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function u1(e,t){uA(e),lQ(t.requestId);let r=lY({command:"uptime"}),n=u2(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 u2(e,t){return uR(e,u3,void 0,{requestId:t.requestId})}let u3=uC(uz,{prepare:uV,prewarm:async(e,t)=>{await uV(e,{...t,healthTimeoutMs:45e3})}}),u5=new WeakMap;async function u4(e){var t,r;let n,i,{sessionStore:a,leaseRegistry:o}=e,s=(n={...(t=function(e){let t=ez(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=eK(r);if(r&&!n)throw new eL("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new eL("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??{}},tz(t.command,n)?{...t,flags:n}:t),l=s.command,d=function(e){var t,r;let n=e.session||lC;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=lO(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(s),c=ei(),u=a.resolveSessionDir(d),p=ra(u,s.meta?.requestId??c.requestId),f=ri(u);es({session:d,logPath:p}),el({level:"info",phase:"request_start",data:{publicSession:s.session,effectiveSession:d,command:s.command,tenant:s.meta?.tenantId,isolation:s.meta?.sessionIsolation,requestLogPath:p,runnerLogPath:f}}),function(e,t){var r;if(r=e.command,nD(r)?.leaseAdmissionExempt===!0||e.meta?.sessionIsolation!=="tenant")return;let n=l$(e);t.assertLeaseAdmission({tenantId:n.tenantId,runId:n.runId,leaseId:n.leaseId,backend:n.leaseBackend})}(s,o);let m=nD(l)?.sessionExecutionLockExempt!==!0?await lq({req:s,sessionName:d,sessionStore:a}):[],h=(r=o,(i=u5.get(r))||(i=new Map,u5.set(r,i)),i);return{req:s,command:l,sessionName:d,requestLogPath:p,runnerLogPath:f,throwIfCanceled:()=>rb(s.meta?.requestId),runLocked:async e=>(rb(s.meta?.requestId),0===m.length)?await e():await u8(h,m,async()=>(rb(s.meta?.requestId),await e()))}}async function u8(e,t,r){let[n,...i]=t;return n?await lN(e,n,async()=>await u8(e,i,r)):await r()}function u6(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function u9(e,t){return u6(e)?e[t]:void 0}function u7(e,t){let r=u9(e,t);return"string"==typeof r?r:void 0}function pe(e,t){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:void 0}function pt(e){return u6(e)}function pr(e){if(!u6(e))return;let t={};for(let[r,n]of Object.entries(e))"string"==typeof n&&(t[r]=n);return Object.keys(t).length>0?t:void 0}async function pn(e,t){var r;let n,i=function(e,t){let r=new Map(t.map(e=>[e.ref,e])),n=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){var o,s;let e=(o=t,pa(o.match(/\bref=['"]?(@?e\d+)['"]?/i)?.[1]??o.match(/@?(e\d+)\b/i)?.[1]));if(!e)continue;i.add(e);let l=r.get(e)?.data,d=(s=t,Math.floor((s.match(/^\s*/)?.[0].length??0)/2)),c=function(e,t,r){var n;let i=function(e){let t=e.replace(/\[[^\]]*ref[^\]]*\]/gi,"").replace(/@?e\d+\b/gi,"").replace(/^[\s|├└─>*-]+/g,"").trim();return t.match(/^([A-Za-z][\w-]*)\b/)?.[1]}(e)??po(t,["role","type"]);return{index:0,type:i,role:i,label:(n=e,n.match(/"([^"]+)"/)?.[1]??n.match(/'([^']+)'/)?.[1]??po(t,["label","name","text"])),value:function(e){var t;return t=e,(t.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(pl)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(pl)}(e)??po(t,["value"]),depth:r,enabled:ps(t,["enabled"]),focused:ps(t,["focused"])}}(t,l,d),u=function(e,t){for(let r=t-1;r>=0;r-=1){let t=e.get(r);if(void 0!==t)return t}}(a,d);void 0!==u&&(c.parentIndex=u),n.push({ref:e,node:{...c,index:n.length}}),a.set(d,n.length-1)}for(let e of t)i.has(e.ref)||n.push({ref:e.ref,node:{...function(e){let t=po(e,["role","type"]);return{index:0,type:t,role:t,label:po(e,["label","name","text"]),value:po(e,["value"]),enabled:ps(e,["enabled"]),focused:ps(e,["focused"])}}(e.data),index:n.length}});return n}(u7(e,"snapshot")??"",Array.isArray(r=u9(e,"refs"))?r.flatMap(e=>{let t=u6(e)?e:void 0,r=pa(po(t,["ref","id"])??String(e));return r?[{ref:r,data:t}]:[]}):u6(r)?Object.entries(r).flatMap(([e,t])=>{let r=pa(e);return r?[{ref:r,data:u6(t)?t:void 0}]:[]}):[]);return t&&await pi(i,t),{nodes:i.map((e,t)=>({...e.node,index:t})),truncated:"boolean"==typeof(n=u9(e,"truncated"))?n:void 0}}async function pi(e,t){for(let r=0;r<e.length;r+=8){let n=e.slice(r,r+8);for(let[e,r]of(await Promise.all(n.map(e=>t(e.ref)))).entries())r&&(n[e].node.rect=r)}}function pa(e){let t=e?.trim().replace(/^@/,"");return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function po(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.length>0)return t}}function ps(e,t){if(e)for(let r of t){let t=e[r];if("boolean"==typeof t)return t}}function pl(e){return"string"==typeof e}let pd="agent-browser",pc="Run `agent-device web setup` to install the managed web backend.";function pu(e={}){let t=e.session?.trim(),r=async r=>await pw(r,{session:t,options:e});return{async open(e){await r(["open",e])},async close(){await r(["close"])},snapshot:async e=>await pm(r,e),async screenshot(e,t){await r(["screenshot",...t?.fullscreen?["--full"]:[],e])},async setViewport(e,t){await r(["set","viewport",String(e),String(t)])},async click(e,t){await pf(r,e,t)},async clickRef(e){await r(["click",py(e)])},async fill(e,t,n){await pf(r,e,t),await r(["press","darwin"===process.platform?"Meta+a":"Control+a"]),await r(["keyboard","type",n])},async fillRef(e,t){await r(["fill",py(e),t])},async typeText(e){await r(["keyboard","type",e])},scroll:async(e,t)=>(await pp(r,e,t),t?.durationMs!==void 0?{durationMs:t.durationMs}:{}),dumpNetwork:async e=>(function(e,t={}){var r,n;let i,a=Array.isArray(i=u6(r=e)&&Array.isArray(r.requests)?r.requests:r)?i.filter(pt).map(e=>({headers:pr(e.headers),method:u7(e,"method"),mimeType:u7(e,"mimeType"),requestId:u7(e,"requestId"),resourceType:u7(e,"resourceType"),responseHeaders:pr(e.responseHeaders),status:pe(e,"status"),timestamp:function(e){if("number"==typeof e||"string"==typeof e)return e}(e.timestamp),url:u7(e,"url")})):[],o="number"==typeof(n=t.limit)&&Number.isInteger(n)?Math.max(1,Math.min(n,200)):25,s="headers"===t.include||"all"===t.include,l=a.slice(-o).reverse().map(e=>{var t,r;let n,i;return t=e,r=s,n=void 0===t.timestamp?void 0:function e(t){if("string"==typeof t){let r=Number(t);return Number.isFinite(r)?e(r):t}let r=new Date(t>1e10?t:1e3*t);return Number.isNaN(r.getTime())?String(t):r.toISOString()}(t.timestamp),i=D({requestId:t.requestId,resourceType:t.resourceType,mimeType:t.mimeType}),D({timestamp:n,method:t.method,url:t.url,status:t.status,requestHeaders:r?t.headers:void 0,responseHeaders:r?t.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}),d="body"===t.include||"all"===t.include?["agent-browser network requests does not expose request or response bodies."]:void 0;return{entries:l,backend:"agent-browser",redacted:!1,...d?{notes:d}:{}}})(await r(["network","requests"]),e)}}async function pp(e,t,r){for(let i of function(e){var t,r,n,i;let a,o,s,l=e?.pixels??e?.amount,d=e?.durationMs;if(void 0===d||d<=0)return[{distance:l,delayAfterMs:0}];let c=Math.max(1,Math.min(20,Math.ceil(d/50))),u=d/Math.max(1,c-1);return(t=e,r=c,a=t?.pixels??t?.amount??300,t?.amount!==void 0&&void 0===t.pixels?Array.from({length:r},()=>a/r):(o=Math.floor((n=Math.round(a))/(i=r)),s=n-o*i,Array.from({length:i},(e,t)=>t<s?o+1:o))).map((e,t)=>({distance:e,delayAfterMs:t<c-1?u:0}))}(r)){var n;await e(["scroll",t,...void 0===(n=i.distance)?[]:[String(n)]]),i.delayAfterMs>0&&await e2(i.delayAfterMs)}}async function pf(e,t,r){await e(["mouse","move",String(Math.round(t)),String(Math.round(r))]),await e(["mouse","down"]),await e(["mouse","up"])}async function pm(e,t){var r;let n=await e((r=t,["snapshot",...r?.interactiveOnly?["--interactive"]:[],...r?.raw?[]:["--compact"],..."number"==typeof r?.depth?["--depth",String(r.depth)]:[],...r?.scope?["--selector",r.scope]:[]]));return await pn(n,t?.includeRects?async t=>await ph(e,t):void 0)}async function ph(e,t){try{return function(e){let t=u6(e)&&u6(e.box)?e.box:e;if(u6(t)){var r,n;let e,i,a,o,s,l,d;return r=t,e=pe(r,"x"),i=pe(r,"y"),a=pe(r,"width"),pS(e,i,a,pe(r,"height"))??(n=t,o=pe(n,"left"),s=pe(n,"top"),l=pe(n,"right"),d=pe(n,"bottom"),pS(o,s,pb(l,o),pb(d,s)))}}(await e(["get","box",py(t)]))}catch(t){var r;let e;if(e=(r=t)instanceof Error?r.message:String(r),!/\bstale\b/i.test(e)&&/\bbox\b|not visible|not found|no element/i.test(e))return;throw t}}async function pw(e,t){let{session:r,options:n}=t,i=[...e,"--json",...r?["--session",r]:[]],a=await pg(i,n);var o,s=function(e,t,r,n){try{return JSON.parse(e)}catch(a){let i=0!==n;throw new eL("COMMAND_FAILED",i?"agent-browser command failed":"agent-browser returned invalid JSON",{cmd:pd,args:r,...i?{exitCode:n}:{},stdout:e.slice(0,500),stderr:t.slice(0,500),hint:pc},a instanceof Error?a:void 0)}}(a.stdout,a.stderr,i,a.exitCode),l=a,d=i;if(!u6(s))return s;if(!1===(s.success??s.ok)){throw new eL("string"==typeof(o=s.code)&&o.length>0?o:"COMMAND_FAILED",function(e){let t=e.error;if("string"==typeof t&&t.trim())return t.trim();if(u6(t)){let e=u7(t,"message")??u7(t,"error");if(e)return e}return u7(e,"message")??"agent-browser command failed"}(s),{cmd:pd,args:d,hint:u7(s,"hint")??pc,agentBrowserError:s.error})}if(0!==l.exitCode)throw new eL("COMMAND_FAILED","agent-browser command failed",{cmd:pd,args:d,exitCode:l.exitCode,stdout:l.stdout.slice(0,500),stderr:l.stderr.slice(0,500),hint:u7(s,"hint")??pc});return Object.hasOwn(s,"data")?s.data:s}async function pg(e,t){let r="",n="",i=0;try{let a=await e_({stateDir:t.stateDir}),o=await eU(a.command,e,{allowFailure:!0,env:a.env,timeoutMs:3e4});r=o.stdout,n=o.stderr,i=o.exitCode}catch(r){var a,o;let t;throw a=r,o=e,"TOOL_MISSING"===(t=eI(a)).code?new eL("TOOL_MISSING",t.message,{...t.details??{},cmd:pd,args:o,hint:pv(t)},t):"COMMAND_FAILED"===t.code?new eL("COMMAND_FAILED",t.message,{...t.details??{},cmd:pd,args:o,hint:pv(t)},t):t}return{stdout:r,stderr:n,exitCode:i}}function pv(e){return"string"==typeof e.details?.hint?e.details.hint:pc}function py(e){return e.startsWith("@")?e:`@${e}`}function pS(e,t,r,n){if(void 0!==e&&void 0!==t&&void 0!==r&&void 0!==n)return{x:e,y:t,width:r,height:n}}function pb(e,t){return void 0===e||void 0===t?void 0:e-t}function pA(){return{ok:!1,error:eT(new eL("UNAUTHORIZED","Invalid token"))}}async function pI(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 li({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function p_(e){el({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=ei(),r=ea({force:!0})??void 0;return{ok:!1,error:eT(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function px(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function pM(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 pN(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 pD(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new eL("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function pk(e,t){let r=(await tX(td(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function pP(e,t){var r,n;let i;pD(t);let a=await pk(e,t),o=tX(td(e)),s=await tm(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 pE(e,t,r,n,i){let a,o,s="recovering",l=!1,d=(async()=>{try{for(;!l;){let d=await pk(e,t);if(!d){s="recovering",await e2(1e3);continue}let c=tW(td(e)),u=ts(c,{pid:d});a=u;let p=pM(r,{redactionPatterns:n});if(o=pN(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&rl(i,u.pid),s="active",await o,rd(i),a=void 0,o=void 0,l)break;s="recovering",await e2(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),rd(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:d,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await px(o),a&&!a.killed&&a.kill("SIGKILL"),await px(d),rd(i)}}}function pC(e,t){let r=pT(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=pT(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 pR(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=lB(["spawn",t,"log","show","--style","compact","--info","--predicate",pC(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 i4(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 pO(e,t,r,n,i,a){let o=await pL({deviceId:e,appBundleId:t,simulatorSetPath:i});return pU({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return lB(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",pC(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function pT(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function pL(e){let{deviceId:t,appBundleId:r,simulatorSetPath:n}=e,a=await i4(lB(["get_app_container",t,r,"app"],{simulatorSetPath:n}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=i.join(o,"Info.plist"),l=await eU("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function p$(e,t,r,n){return pU({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",pC(e)],stream:t,redactionPatterns:r,pidPath:n})}async function pF(e,t,r,n){return pU({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function pU(e){let t="active",r=e$(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=pM(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&rl(e.pidPath,n.pid);let a=pN(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),rd(e.pidPath),r),r=>{throw t="failed",rd(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await px(a),n.killed||n.kill("SIGKILL"),await px(a),rd(e.pidPath)}}}let pG=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),pq=/https?:\/\/[^\s"'<>\])]+/i,pj=[/\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 pV(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>pH(e)));for(let e of t.entries){let t=pH(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function pB(e,t){let r=p1(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=p1(t?.maxPayloadChars,2048,64,16384),o=p1(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=pZ(s,["method","httpMethod"]),d=pZ(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=pG.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=pq.exec(o),h=d??m?.[0];if(!h)return null;let w=c??pW(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:pX(o),packetId:pz(o)??void 0,durationMs:pJ(o)??void 0,raw:p0(o,a),line:r};if("android"===n&&function(e,t,r){let n=pK(t,r,5),i=e.packetId??n.map(e=>pz(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?pK(t,r,12).filter(e=>pz(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>pX(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>pW(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>pJ(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 pQ(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=p0(e,a))}if("body"===i||"all"===i){let e=pY(o,s,["requestBody","body","payload","request"]),t=pY(o,s,["responseBody","response"]);e&&(g.requestBody=p0(e,a)),t&&(g.responseBody=p0(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 pH(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function pK(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 pW(e){for(let t of pj){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function pX(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 pz(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function pJ(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 pZ(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 pY(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return pQ(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 pQ(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function p0(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function p1(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let p2={start:async e=>await fr(e)},p3=iK(p2,function(e={}){return{...p2,...e}});async function p5(e,t){return await p3.run(e,t)}function p4(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 p8(e){let t=i.dirname(e);a.existsSync(t)||a.mkdirSync(t,{recursive:!0}),function(e,t){if(a.existsSync(e)&&!(a.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}`;a.existsSync(t)&&(a.existsSync(n)&&a.unlinkSync(n),a.renameSync(t,n))}}(e,{maxBytes:p4("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:p4("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function p6(e){if(!a.existsSync(e))return{exists:!1,sizeBytes:0};let t=a.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}function p9(e){return"macos"===e.platform?"macos":"ios"===e.platform?"device"===e.kind?"ios-device":"ios-simulator":"android"}async function p7(e){var t,r,n,i;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=p9(c),S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},o=p1(t?.maxEntries,25,1,200),s=t?.include??"summary",l=p1(t?.maxPayloadChars,2048,64,16384),d=p1(t?.maxScanLines,4e3,100,2e4),a.existsSync(m)?pB(a.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:o,maxPayloadChars:l,maxScanLines:d}}),b=[],A=await fe({device:c,appBundleId:u,appLogPath:m,appLogState:p});if(A){let e=await pP(c.id,u);if(e){let t=pB(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=pV(t,S,h),b.push((r=A,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 fn({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=pV(e.dump,S,h),b.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&&b.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?b.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===b.length&&("ios"===c.platform&&"simulator"===c.kind?b.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."):b.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===S.entries.length&&b.push("ios"===(i=c).platform&&"simulator"===i.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"===i.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:b}}async function fe(e){let{device:t,appBundleId:r,appLogPath:n,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||!a.existsSync(e))return null;try{return rs(a.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}(i.join(i.dirname(n),ro));if(!s)return null;let l=await pk(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function ft(e,t,r,n){return await p3.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function fr({device:e,appBundleId:t,outPath:r,pidPath:n}){p8(r);let i=a.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 pF(e.id,i,o,n):await pO(e.id,t,i,o,e.simulatorSetPath,n);if("android"===e.platform)return pD(t),await pE(e.id,t,i,o,n);if("macos"===e.platform)return await p$(t,i,o,n);throw i.end(),new eL("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function fn(e){let t=await pR({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:pB(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 fi(e){await e.stop(),await px(e.wait)}async function fa(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 e7(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await e7(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 i4(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await i4(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await eU("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function fo(e,t){p8(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
16
- `;a.appendFileSync(e,r,"utf8")}function fs(e){let t=i.dirname(e),r=i.basename(e);a.existsSync(t)||a.mkdirSync(t,{recursive:!0}),a.existsSync(e)?a.truncateSync(e,0):a.writeFileSync(e,"","utf8");let n=0;for(let e of a.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let o=e.slice(r.length+1);if(/^\d+$/.test(o))try{a.unlinkSync(i.join(t,e)),n+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:n}}function fl(e,t){for(let r of e){if(t(r))return r;let e=fl(r.children,t);if(e)return e}}function fd(e,t){let r=[];for(let n of e)t(n)&&r.push(n),r.push(...fd(n.children,t));return r}function fc(e,t){let r=fl(e,e=>"schema"===e.name&&e.attributes.name===t);return r?r.children.filter(e=>"col"===e.name).map(e=>{let t;return t=e.children.find(e=>"mnemonic"===e.name),t?.text??null??""}):[]}function fu(e){if(!e||e.children.some(e=>"sentinel"===e.name)||!e.text)return null;let t=Number(e.text);return Number.isFinite(t)?t:null}function fp(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.numberValue??null:fu(e):null}function ff(e){return Math.round(10*e)/10}async function fm(e,t){let r=["devicectl",...e],n=await i4(r,{allowFailure:!0,timeoutMs:2e4});if(0===n.exitCode)return;let i=String(n.stdout??""),a=String(n.stderr??"");throw new eL("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:r,exitCode:n.exitCode,stdout:i,stderr:a,deviceId:t.deviceId,hint:fy(i,a)??fv})}async function fh(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 fg(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"})),iW(r,t)}async function fw(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 fg(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 fg(e,t){let r=i.join(u.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=[...t.args,"--json-output",r],a=await i4(n,{allowFailure:!0,timeoutMs:2e4});try{if(0!==a.exitCode){let r=String(a.stdout??""),i=String(a.stderr??"");throw new eL("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:n,exitCode:a.exitCode,stdout:r,stderr:i,deviceId:e.id,hint:fy(r,i)??fv})}return JSON.parse(await s.readFile(r,"utf8"))}catch(r){if(r instanceof eL)throw r;throw new eL("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await s.unlink(r).catch(()=>{})}}let fv="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function fy(e,t){let r=`${e}
17
- ${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}async function fS(e,t){try{let r=await i8(e),n=r?.[t];if("string"==typeof n&&n.length>0)return n}catch{}try{let r=await i5("plutil",["-extract",t,"raw","-o","-",e],{allowFailure:!0});if(0===r.exitCode){let e=String(r.stdout??"").trim();if(e.length>0)return e}}catch{}try{var r,n;let i;return r=await s.readFile(e,"utf8"),n=t,dv(dg(r),(e,t)=>{void 0===i&&e===n&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}let fb="xctrace-animation-hitches";function fA(e,t){let r=dg(e),n=fc(r,t);return{rows:0===n.length?[]:fd(r,e=>"row"===e.name),schema:n}}function fI(e,t){for(let r of e)fI(r.children,t),r.attributes.id&&t.set(r.attributes.id,{numberValue:fu(r),process:f_(r)})}function f_(e){if(!e||e.children.some(e=>"sentinel"===e.name))return null;let t=fu(fl(e.children,e=>"pid"===e.name)),r=(e.attributes.fmt??"").replace(/\s+\(\d+\)$/,"").trim();return null===t&&0===r.length?null:{pid:t??void 0,name:r.length>0?r:void 0}}let fx="ps-process-snapshot",fM="ps-process-snapshot",fN="xctrace-activity-monitor",fD="xctrace-activity-monitor",fk="leaks-output-graph",fP="Memory graph captured with leaks --outputGraph for host-visible Apple app processes.";async function fE(e,t){if("ios"===e.platform&&"device"===e.kind)return await fJ(e,t);let r=await fz(e,t),n=await f2(e,r);if(0===n.length)throw new eL("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf."});let i=new Date().toISOString();return f9({usagePercent:n.reduce((e,t)=>e+t.cpuPercent,0),residentMemoryKb:n.reduce((e,t)=>e+t.rssKb,0),measuredAt:i,matchedProcesses:[r.executableName],cpuMethod:fx,memoryMethod:fM})}async function fC(e,t,r){let n,a=fU(e);if(!a.memgraph)return{available:!1,kind:"memgraph",reason:a.reason,hint:a.hint,support:a};let o=await f5(e,t,a);if(!1===o.available)return o;let{process:l}=o;await s.mkdir(i.dirname(r),{recursive:!0});let d=await fO(r);try{n=await fR(e,r,l.pid)}catch(n){throw await fT(r,d),function(e,t,r,n,a){if(a instanceof eL){let o=a.details??{};return new eL(a.code,`Failed to capture Apple memgraph for ${t}`,{...o,kind:"memgraph",appBundleId:t,pid:r.pid,processName:i.basename(f6(r.command)),path:n,hint:f4(e,"string"==typeof o.stdout?o.stdout:"","string"==typeof o.stderr&&o.stderr.length>0?o.stderr:a.message)},a)}return new eL("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:r.pid,processName:i.basename(f6(r.command)),path:n,hint:"Retry perf memory snapshot. If it still fails, run with --debug and inspect leaks output."},a)}(e,t,l,r,n)}if(0!==n.exitCode)throw await fT(r,d),new eL("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:l.pid,processName:i.basename(f6(l.command)),path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:f4(e,n.stdout,n.stderr)});let c=await s.stat(r).catch(()=>null);if(!c?.isFile()||c.size<=0)throw await fT(r,d),new eL("COMMAND_FAILED","Apple memgraph artifact is missing or empty",{kind:"memgraph",appBundleId:t,pid:l.pid,path:r,hint:"Retry with a writable --out path. If the file is still empty, run with --debug and inspect leaks output."});return{available:!0,kind:"memgraph",path:r,sizeBytes:c.size,measuredAt:new Date().toISOString(),method:fk,appBundleId:t,pid:l.pid,processName:i.basename(f6(l.command)),support:a}}async function fR(e,t,r){return"macos"===e.platform?await i5("leaks",[`--outputGraph=${t}`,String(r)],{allowFailure:!0,timeoutMs:12e4}):await i4(lH(e,["spawn",e.id,"leaks",`--outputGraph=${t}`,String(r)]),{allowFailure:!0,timeoutMs:12e4})}async function fO(e){return await s.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function fT(e,t){t||await s.rm(e,{force:!0}).catch(()=>{})}async function fL(e,t){var r;let n,a,o,s,l,c;if("ios"!==e.platform||"device"!==e.kind)throw new eL("COMMAND_FAILED","Apple frame-health sampling is currently available only on connected iOS devices.",{metric:"fps",platform:e.platform,deviceKind:e.kind});let u=await fZ(e,t),p=await fG(e,t,u);return n=fA((r={hitchesXml:p.hitchesXml,frameLifetimesXml:p.frameLifetimesXml,displayInfoXml:p.displayInfoXml,processIds:u.map(e=>e.pid),processNames:t7(u.map(e=>i.basename(d(e.executable)))),windowStartedAt:p.windowStartedAt,windowEndedAt:p.windowEndedAt,measuredAt:p.windowEndedAt}).frameLifetimesXml,"hitches-frame-lifetimes").rows.length,a=function(e){if(!e)return;let{rows:t,schema:r}=fA(e,"device-display-info"),n=r.indexOf("max-refresh-rate");if(n<0)return;let i=new Map;for(let e of t){fI(e.children,i);let t=fp(e.children[n],i);if(null!==t&&t>0)return t}}(r.displayInfoXml),s=(o=(function(e){let t,r,n=dg(e),i=Object.values(r={start:(t=fc(n,"hitches")).indexOf("start"),duration:t.indexOf("duration"),process:t.indexOf("process"),isSystem:t.indexOf("is-system")}).every(e=>e>=0)?r:null;if(!i)return[];let a=new Map;return fd(n,e=>"row"===e.name).map(e=>(function(e,t,r){var n,i,a;let o;if(fI(e.children,r),!0===(n=e.children[t.isSystem],null===(o=fp(n,r))?null:0!==o))return null;let s=fp(e.children[t.start],r),l=fp(e.children[t.duration],r);if(null===s||null===l)return null;let d=(i=e.children[t.process],a=r,i?i.attributes.ref?a.get(i.attributes.ref)?.process??null:f_(i):null);return{startNs:s,durationNs:l,pid:d?.pid,processName:d?.name}})(e,i,a)).filter(e=>!!e)})(r.hitchesXml).filter(e=>{var t,n,i;return t=e,n=r.processIds,i=r.processNames,!!(void 0!==t.pid&&n.includes(t.pid))||!!t.processName&&i.includes(t.processName)})).length,l=Math.max(0,Math.round(Date.parse(r.windowEndedAt)-Date.parse(r.windowStartedAt))),c=function(e,t){if(0===e.length)return[];let r=[...e].sort((e,t)=>e.startNs-t.startNs),n=[],i=[];for(let e of r){let t=i.at(-1);if(!t||e.startNs-(t.startNs+t.durationNs)<=5e8){i.push(e);continue}n.push(i),i=[e]}return i.length>0&&n.push(i),n.map(e=>{var r,n;let i,a,o,s;return r=e,n=t,i=Math.min(...r.map(e=>e.startNs)),a=Math.max(...r.map(e=>e.startNs+e.durationNs)),s=Math.max(o=Math.max(0,Math.round(i/1e6)),Math.round(a/1e6)),{startOffsetMs:o,endOffsetMs:s,startAt:new Date(n+o).toISOString(),endAt:new Date(n+s).toISOString(),missedDeadlineFrameCount:r.length,worstFrameMs:ff(Math.max(...r.map(e=>e.durationNs))/1e6)}}).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}(o,Date.parse(r.windowStartedAt)),{droppedFramePercent:n>0?ff(s/n*100):0,droppedFrameCount:s,totalFrameCount:n,sampleWindowMs:l,windowStartedAt:r.windowStartedAt,windowEndedAt:r.windowEndedAt,measuredAt:r.measuredAt,method:fb,matchedProcesses:[...new Set(o.map(e=>e.processName).filter(e=>"string"==typeof e&&e.length>0))],frameDeadlineMs:void 0===a?void 0:ff(1e3/a),refreshRateHz:a,worstWindows:c.length>0?c:void 0}}function f$(e){return"ios"===e.platform&&"device"===e.kind?{method:fb,description:"Rendered-frame hitch health from xctrace Animation Hitches on connected iOS devices. Dropped frames are counted from native hitch rows for the attached app process, with total frames from the same trace frame-lifetime table.",unit:"percent",primaryField:"droppedFramePercent",window:"short 2s xctrace Animation Hitches record of the active app process",resetsAfterRead:!1}:{method:fb,description:"Unavailable on iOS simulators and macOS because local Apple tooling does not expose reliable app frame hitches for these targets.",unit:"percent",primaryField:"droppedFramePercent"}}function fF(e){let t=f$(e);if("ios"===e.platform&&"device"===e.kind)return{fps:t,memory:{method:fD,description:"Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"kB"},cpu:{method:fN,description:"Recent CPU usage snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"percent"}};let r="macos"===e.platform?"host ps for the running macOS app executable resolved from the bundle ID.":"xcrun simctl spawn ps, with host ps fallback, for the running iOS simulator app executable resolved from the bundle ID.";return{fps:t,memory:{method:fM,description:`Resident memory snapshot from ${r}`,unit:"kB"},cpu:{method:fx,description:`Recent CPU usage snapshot from ${r}`,unit:"percent"}}}function fU(e){return"ios"===e.platform&&"device"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:fk,reason:"Physical iOS device memgraph capture is not exposed through reliable local agent-device tooling.",hint:"Use perf memory sample for a compact resident-memory reading, or reproduce on an iOS simulator/macOS target for memgraph capture."}:"ios"===e.platform&&"simulator"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!0,method:fk,reason:"iOS simulator processes are host-visible through simctl spawn leaks.",hint:"Keep the simulator app running in the foreground while the memgraph is captured."}:"macos"===e.platform?{platform:e.platform,deviceKind:e.kind,memgraph:!0,method:fk,reason:"macOS app processes are host-visible to leaks --outputGraph.",hint:"Grant Terminal/agent process permissions if macOS denies process inspection."}:{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:fk,reason:"Apple memgraph capture is available only for iOS simulator and macOS app sessions.",hint:"Use perf memory sample on supported app sessions, or rerun against iOS simulator/macOS for memgraph capture."}}async function fG(e,t,r){let n=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-ios-frame-perf-")),a=i.join(n,"animation-hitches.trace"),o=i.join(n,"hitches.xml"),l=i.join(n,"frame-lifetimes.xml"),d=i.join(n,"display-info.xml");try{let n=await fq({device:e,appBundleId:t,tracePath:a,template:"Animation Hitches",duration:"2s",targetPids:r.map(e=>e.pid),validateTraceOutput:!0,failureMessage:`Failed to record iOS frame-health sample for ${t}`});await fK(e,t,a,"hitches",o),await fK(e,t,a,"hitches-frame-lifetimes",l);let i=await fW(e,t,a,"device-display-info",d);return{windowStartedAt:n.startedAt,windowEndedAt:n.endedAt,hitchesXml:await s.readFile(o,"utf8"),frameLifetimesXml:await s.readFile(l,"utf8"),displayInfoXml:i?await s.readFile(d,"utf8"):void 0}}finally{await s.rm(n,{recursive:!0,force:!0}).catch(()=>{})}}async function fq(e){let{device:t,appBundleId:r,tracePath:n,template:i,duration:a}=e,o=e.allProcesses?["--all-processes"]:(e.targetPids??[]).flatMap(e=>["--attach",String(e)]),s=["xctrace","record","--template",i,"--device",t.id,...o,"--time-limit",a,"--output",n,"--quiet","--no-prompt"],l=await fj(s,e.tracePath);if(0===l.result.exitCode)return e.validateTraceOutput&&await fH(e,l.result.stdout,l.result.stderr),{startedAt:l.startedAt,endedAt:l.endedAt,capturedAtMs:l.capturedAtMs};throw new eL("COMMAND_FAILED",e.failureMessage,{cmd:"xcrun",args:s,exitCode:l.result.exitCode,stdout:l.result.stdout,stderr:l.result.stderr,appBundleId:r,deviceId:t.id,hint:me(l.result.stdout,l.result.stderr)})}async function fj(e,t){let r;for(let n=1;n<=3;n+=1){await fB(t,n,1500);let i=new Date().toISOString(),a=await i4(e,{allowFailure:!0,timeoutMs:6e4});if(r={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},0===a.exitCode||!fV(a))break}return r}function fV(e){let t=`${e.stdout}
18
- ${e.stderr}`.toLowerCase();return t.includes("_lockkperf")||t.includes("could not lock kperf")||t.includes("likely another session just started")}async function fB(e,t,r){t<=1||(await s.rm(e,{recursive:!0,force:!0}).catch(()=>{}),await new Promise(e=>setTimeout(e,r)))}async function fH(e,t,r){let n=await s.stat(e.tracePath).catch(()=>null);if(!(n?.isDirectory()===!0?(await s.readdir(e.tracePath).catch(()=>[])).length>0:(n?.size??0)>0))throw new eL("COMMAND_FAILED",`${e.failureMessage}: xctrace produced no trace data`,{tracePath:e.tracePath,appBundleId:e.appBundleId,deviceId:e.device.id,stdout:t,stderr:r,hint:"Keep the iOS device unlocked and connected by cable, keep the app active, then retry perf."})}async function fK(e,t,r,n,i){let a=["xctrace","export","--input",r,"--xpath",`/trace-toc/run/data/table[@schema="${n}"]`,"--output",i],o=await i4(a,{allowFailure:!0,timeoutMs:15e3});if(0!==o.exitCode)throw new eL("COMMAND_FAILED",`Failed to export iOS device ${n} data`,{cmd:"xcrun",args:a,exitCode:o.exitCode,stdout:o.stdout,stderr:o.stderr,appBundleId:t,deviceId:e.id,hint:me(o.stdout,o.stderr)})}async function fW(e,t,r,n,i){try{return await fK(e,t,r,n,i),!0}catch{return!1}}async function fX(e){let t=dg(e),r=fc(t,"activity-monitor-process-live");if(0===r.length)throw new eL("COMMAND_FAILED","Failed to parse xctrace activity-monitor-process-live schema");let n=r.indexOf("pid"),i=r.indexOf("process"),a=r.indexOf("cpu-total"),o=r.indexOf("memory-real");if(n<0||i<0||a<0||o<0)throw new eL("COMMAND_FAILED","xctrace activity-monitor-process-live export is missing expected columns");let s=fd(t,e=>"row"===e.name),l=[],d=new Map;for(let e of s){var c,u;let t=e.children;if(0===t.length)continue;for(let e of t){let t=fl(e.children,e=>"pid"===e.name&&"string"==typeof e.attributes.id);if(t?.attributes.id){let e=Number(t.text);d.set(t.attributes.id,{numberValue:Number.isFinite(e)?e:null})}e.attributes.id&&d.set(e.attributes.id,{numberValue:fu(e),processName:f7(e)})}let r=fp(t[n],d),s=(c=t[i],u=d,c?c.attributes.ref?u.get(c.attributes.ref)?.processName??null:f7(c):null);null!==r&&Number.isFinite(r)&&s&&l.push({pid:r,processName:s,cpuTimeNs:fp(t[a],d),residentMemoryBytes:fp(t[o],d)})}return l}async function fz(e,t){let r="macos"===e.platform?await f0(t):await f1(e,t),n="macos"===e.platform?i.join(r,"Contents","Info.plist"):i.join(r,"Info.plist"),a=await fS(n,"CFBundleExecutable");if(!a)throw new eL("COMMAND_FAILED",`Failed to resolve executable for ${t}`,{appBundleId:t,appPath:r});return{executableName:a,executablePath:"macos"===e.platform?i.join(r,"Contents","MacOS",a):i.join(r,a)}}async function fJ(e,t){let r=await fZ(e,t),n=await fY(e,t),i=await fY(e,t),a=fQ(await fX(n.xml),r,t,e),o=fQ(await fX(i.xml),r,t,e),s=i.capturedAtMs-n.capturedAtMs;if(s<=0)throw new eL("COMMAND_FAILED",`Invalid Activity Monitor sample window for ${t}`,{appBundleId:t,deviceId:e.id});if(null===a.cpuTimeNs||null===o.cpuTimeNs||null===o.residentMemoryBytes)throw new eL("COMMAND_FAILED",`Incomplete Activity Monitor sample for ${t}`,{appBundleId:t,deviceId:e.id,hint:"Keep the app running in the foreground while perf samples the device, then retry."});return f9({usagePercent:Math.max(0,o.cpuTimeNs-a.cpuTimeNs)/(1e6*s)*100,residentMemoryKb:o.residentMemoryBytes/1024,measuredAt:new Date(i.capturedAtMs).toISOString(),matchedProcesses:o.matchedProcesses,cpuMethod:fN,memoryMethod:fD})}async function fZ(e,t){let r=(await fh(e,"all")).find(e=>e.bundleId===t);if(!r)throw new eL("APP_NOT_INSTALLED",`No iOS device app found for ${t}`,{appBundleId:t,deviceId:e.id});if(!r.url)throw new eL("COMMAND_FAILED",`Missing app bundle URL for ${t}`,{appBundleId:t,deviceId:e.id});let n=r.url.replace(/\/$/,""),i=d(n),a=(await fw(e)).filter(e=>e.executable.startsWith(`${n}/`));if(0===a.length)throw new eL("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,deviceId:e.id,appBundlePath:i,hint:"Run open <app> for this session again to ensure the iOS app is active, then retry perf."});return a}async function fY(e,t){let r=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-ios-perf-")),n=i.join(r,"sample.trace"),a=i.join(r,"activity-monitor-process-live.xml");try{let r=await fq({device:e,appBundleId:t,tracePath:n,template:"Activity Monitor",duration:"1s",allProcesses:!0,failureMessage:`Failed to record iOS device Activity Monitor sample for ${t}`});return await fK(e,t,n,"activity-monitor-process-live",a),{capturedAtMs:r.capturedAtMs,xml:await s.readFile(a,"utf8")}}finally{await s.rm(r,{recursive:!0,force:!0}).catch(()=>{})}}function fQ(e,t,r,n){let a=new Set(t.map(e=>e.pid)),o=new Set(t.map(e=>i.basename(d(e.executable)))),s=e.filter(e=>a.has(e.pid)||o.has(e.processName));if(0===s.length)throw new eL("COMMAND_FAILED",`No Activity Monitor sample found for ${r}`,{appBundleId:r,deviceId:n.id,hint:"Keep the app running in the foreground while perf samples the device, then retry."});let l=new Map;for(let e of s){let t=l.get(e.pid);if(!t){l.set(e.pid,e);continue}l.set(e.pid,{pid:e.pid,processName:e.processName||t.processName,cpuTimeNs:mt(t.cpuTimeNs,e.cpuTimeNs),residentMemoryBytes:mt(t.residentMemoryBytes,e.residentMemoryBytes)})}let c=[...l.values()],u=c.map(e=>e.cpuTimeNs).filter(e=>null!==e),p=c.map(e=>e.residentMemoryBytes).filter(e=>null!==e);return{cpuTimeNs:u.length>0?u.reduce((e,t)=>e+t,0):null,residentMemoryBytes:p.length>0?p.reduce((e,t)=>e+t,0):null,matchedProcesses:t7(c.map(e=>e.processName))}}async function f0(e){let t=`kMDItemCFBundleIdentifier == "${e.replaceAll('"','\\"')}"`,r=await i5("mdfind",[t],{allowFailure:!0,timeoutMs:15e3});if(0!==r.exitCode)throw new eL("COMMAND_FAILED",`Failed to resolve macOS app bundle for ${e}`,{appBundleId:e,stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let n=r.stdout.split("\n").map(e=>e.trim()).find(e=>e.endsWith(".app"));if(!n)throw new eL("APP_NOT_INSTALLED",`No macOS app found for ${e}`,{appBundleId:e});return n}async function f1(e,t){let r=lH(e,["get_app_container",e.id,t,"app"]),n=await i4(r,{allowFailure:!0,timeoutMs:15e3});if(0!==n.exitCode)throw new eL("COMMAND_FAILED",`Failed to resolve iOS simulator app container for ${t}`,{appBundleId:t,stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode,hint:"Ensure the iOS simulator app is installed and booted, then retry perf."});let i=n.stdout.trim();if(0===i.length)throw new eL("APP_NOT_INSTALLED",`No iOS simulator app container found for ${t}`,{appBundleId:t});return i}async function f2(e,t){let r="macos"===e.platform?["-axo","pid=,%cpu=,rss=,command="]:lH(e,["spawn",e.id,"ps","-axo","pid=,%cpu=,rss=,command="]);return(function(e){let t=[];for(let r of R(e)){let e=r.match(/^(\d+)\s+([0-9]+(?:\.[0-9]+)?)\s+(\d+)\s+(.+)$/);if(!e)continue;let[n,i,a,o]=e.slice(1);if(void 0===n||void 0===i||void 0===a||void 0===o)continue;let s=Number(n),l=Number(i),d=Number(a),c=o.trim();Number.isFinite(s)&&Number.isFinite(l)&&Number.isFinite(d)&&t.push({pid:s,cpuPercent:l,rssKb:d,command:c})}return t})(("macos"===e.platform?await i5("ps",r,{timeoutMs:15e3}):await f8(r)).stdout).filter(e=>(function(e,t){let r=f6(e);if(t.executablePath){var n;let i;for(let a of(i=[n=t.executablePath],n.startsWith("/private/var/")?i.push(n.replace("/private/var/","/var/")):n.startsWith("/var/")&&i.push(n.replace("/var/","/private/var/")),i))if(e===a||r===a||e.startsWith(`${a} `))return!0}return i.basename(r)===t.executableName})(e.command,t))}async function f3(e,t,r){let n=(await f2(e,r)).sort((e,t)=>t.rssKb-e.rssKb)[0];if(n)return n;throw new eL("COMMAND_FAILED",`No running process found for ${t}`,{kind:"memgraph",appBundleId:t,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf memory snapshot."})}async function f5(e,t,r){try{let r=await fz(e,t);return{available:!0,process:await f3(e,t,r)}}catch(t){if(function(e,t){if("ios"!==e.platform||"simulator"!==e.kind||!(t instanceof eL))return!1;let r=t.details??{},n=Array.isArray(r.args)?r.args.join(" "):"",i="string"==typeof r.stderr?r.stderr:"",a=`${t.message}
19
- ${i}`.toLowerCase();return n.includes("simctl spawn")&&n.includes(" ps ")&&a.includes("no such file")}(e,t))return{available:!1,kind:"memgraph",reason:"iOS simulator memgraph capture needs process tools inside simctl spawn, but this simulator runtime did not provide ps.",hint:"Use perf memory sample when available, or retry memgraph on a simulator runtime that includes process tools such as ps and leaks.",support:{...r,memgraph:!1}};throw t}}function f4(e,t,r){let n=`${t}
20
- ${r}`.toLowerCase();return n.includes("timed out")||n.includes("timeout")?"Apple memgraph capture can take longer than metric sampling. Keep the app running and retry; if it times out again, collect a smaller reproduction before capturing leaks --outputGraph.":n.includes("not found")||n.includes("no such file")?"Install Xcode command line tools and ensure leaks is available, then retry.":n.includes("permission")||n.includes("denied")||n.includes("not authorized")?"macos"===e.platform?"Grant the agent terminal process permission to inspect this macOS app, then retry.":"Keep the simulator booted and app running; if inspection is denied, retry with a debug simulator build.":"Keep the app process running and retry perf memory snapshot with --debug if the failure persists."}async function f8(e){let t=await i4(e,{allowFailure:!0,timeoutMs:15e3});return 0===t.exitCode?t:await i5("ps",["-axo","pid=,%cpu=,rss=,command="],{timeoutMs:15e3})}function f6(e){let[t=""]=e.trim().split(/\s+/,1);return t}function f9(e){return{cpu:{usagePercent:ff(e.usagePercent),measuredAt:e.measuredAt,method:e.cpuMethod,matchedProcesses:e.matchedProcesses},memory:{residentMemoryKb:Math.round(e.residentMemoryKb),measuredAt:e.measuredAt,method:e.memoryMethod,matchedProcesses:e.matchedProcesses}}}function f7(e){let t=e?.attributes.fmt?.trim()??"";return t?t.replace(/\s+\(\d+\)$/,"").trim():null}function me(e,t){let r=fy(e,t);if(r)return r;let n=`${e}
21
- ${t}`.toLowerCase();return n.includes("no device matched")||n.includes("failed to find device")?fv:n.includes("timed out")?"Keep the iOS device unlocked and connected by cable, keep the app active, then retry perf.":"Ensure the iOS device is unlocked, trusted, visible to xctrace, and the target app stays active while perf samples it."}function mt(e,t){return null===e?t:null===t?e:Math.max(e,t)}async function mr(e){var t;let r=await mo(e.device,e.appBundleId);await s.mkdir(i.dirname(e.outPath),{recursive:!0});let n=["xctrace","record","--template",(t={device:e.device,template:e.template,targetPids:r.pids,outPath:e.outPath}).template,..."ios"===t.device.platform?["--device",t.device.id]:[],...t.targetPids.flatMap(e=>["--attach",String(e)]),"--output",t.outPath,"--quiet","--no-prompt"],a=new Date().toISOString(),o=await ms(n,e.outPath,{device:e.device,appBundleId:e.appBundleId,failureMessage:`Failed to start Apple xctrace ${e.mode} capture for ${e.appBundleId}`});return{kind:"xctrace",mode:e.mode,template:e.template,outPath:e.outPath,appBundleId:e.appBundleId,deviceId:e.device.id,platform:e.device.platform,targetPids:r.pids,targetProcesses:r.processNames,startedAt:a,child:o.child,wait:o.wait}}async function mn(e,t=e.outPath){t!==e.outPath&&await s.mkdir(i.dirname(t),{recursive:!0});let r=await md(e,{failOnForcedKill:!0});if(0!==r.exitCode)throw new eL("COMMAND_FAILED",`Failed to stop Apple xctrace ${e.mode} capture`,{exitCode:r.exitCode,stdout:r.stdout,stderr:r.stderr,tracePath:e.outPath,captureCleanedUp:!0,hint:me(r.stdout,r.stderr)});return t!==e.outPath&&await s.rename(e.outPath,t).catch(async()=>{await s.cp(e.outPath,t,{recursive:!0}),await s.rm(e.outPath,{recursive:!0,force:!0})}),await mu(t,{appBundleId:e.appBundleId,deviceId:e.deviceId,stdout:r.stdout,stderr:r.stderr}),{kind:"xctrace",mode:e.mode,template:e.template,outPath:t,appBundleId:e.appBundleId,deviceId:e.deviceId,platform:e.platform,targetPids:e.targetPids,targetProcesses:e.targetProcesses,startedAt:e.startedAt,endedAt:new Date().toISOString()}}async function mi(e){return await md(e,{failOnForcedKill:!1})}async function ma(e){let t=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-xctrace-report-")),r=i.join(t,"trace-toc.xml");try{var n;let t,a,o,l=["xctrace","export","--input",e.tracePath,"--xpath","/trace-toc","--output",r],d=await i4(l,{allowFailure:!0,timeoutMs:15e3});if(0!==d.exitCode)throw new eL("COMMAND_FAILED","Failed to export Apple xctrace report metadata",{cmd:"xcrun",args:l,exitCode:d.exitCode,stdout:d.stdout,stderr:d.stderr,tracePath:e.tracePath,hint:me(d.stdout,d.stderr)});let c=(n={...e,tocXml:await s.readFile(r,"utf8")},t=dg(n.tocXml),a=fd(t,e=>"run"===e.name),o=t7(fd(t,e=>"table"===e.name).map(e=>e.attributes.schema).filter(e=>"string"==typeof e&&e.length>0)).sort(),{kind:"xctrace",mode:n.mode,template:n.template,tracePath:n.tracePath,reportPath:n.outPath,appBundleId:n.appBundleId,generatedAt:new Date().toISOString(),summary:{runCount:a.length,tableSchemas:o}});return await s.mkdir(i.dirname(e.outPath),{recursive:!0}),await s.writeFile(e.outPath,`${JSON.stringify(c,null,2)}
22
- `,"utf8"),c}finally{await s.rm(t,{recursive:!0,force:!0}).catch(()=>{})}}async function mo(e,t){if("ios"!==e.platform&&"macos"!==e.platform)throw new eL("UNSUPPORTED_OPERATION","Apple xctrace perf is not supported on Android.",{platform:e.platform,hint:"Android native profiling belongs to the Android perf rollout and is not implemented under Apple xctrace."});if("ios"===e.platform&&"device"===e.kind){let r=await fZ(e,t);return{pids:r.map(e=>e.pid),processNames:t7(r.map(e=>i.basename(d(e.executable))))}}let r=await fz(e,t),n=await f2(e,r);if(0===n.length)throw new eL("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,deviceId:e.id,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf."});return{pids:n.map(e=>e.pid),processNames:[r.executableName]}}async function ms(e,t,r){let n;for(let r=1;r<=3;r+=1){await fB(t,r,1500);let i=e$("xcrun",e,{allowFailure:!0}),a=await ml(i.wait);if(!a)return i;if(n=a,!fV(a))break}let i=n??{stdout:"",stderr:"",exitCode:1};throw new eL("COMMAND_FAILED",r.failureMessage,{cmd:"xcrun",args:e,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,appBundleId:r.appBundleId,deviceId:r.device.id,hint:me(i.stdout,i.stderr)})}async function ml(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function md(e,t){e.child.kill("SIGINT");let r=await mc(e.wait,45e3);if(r)return r;e.child.kill("SIGKILL");let n=await mc(e.wait,5e3);if(n&&!t.failOnForcedKill)return n;if(n)throw new eL("COMMAND_FAILED","Timed out waiting for Apple xctrace capture to stop",{exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,tracePath:e.outPath,captureCleanedUp:!0,forcedKill:!0,hint:"xctrace did not finish after SIGINT, so it was force-killed. Retry the perf command after confirming no other xctrace session is active."});throw new eL("COMMAND_FAILED","Timed out waiting for Apple xctrace capture to stop after SIGKILL",{tracePath:e.outPath,captureCleanedUp:!1,forcedKill:!0,hint:"xctrace did not exit after SIGKILL. Inspect running xctrace processes before retrying."})}async function mc(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function mu(e,t){let r=await s.stat(e).catch(()=>null);if(!(r?.isDirectory()===!0?(await s.readdir(e).catch(()=>[])).length>0:(r?.size??0)>0))throw new eL("COMMAND_FAILED","xctrace produced no trace data",{tracePath:e,appBundleId:t.appBundleId,deviceId:t.deviceId,stdout:t.stdout,stderr:t.stderr,hint:"Keep the Apple device unlocked and connected, keep the app active, then retry perf."})}function mp(e){let t=e.replaceAll(",","").match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let r=Number(t[0]);return Number.isFinite(r)?r:null}function mf(e){return Math.round(10*e)/10}let mm="adb-shell-dumpsys-gfxinfo-framestats",mh="Rendered-frame health from the current adb shell dumpsys gfxinfo <package> framestats window. Dropped frames use Android gfxinfo janky-frame/frame-deadline data when available; this is not video recording FPS.";function mw(e,t,r){let n=t.get(r);if(void 0===n)return null;let i=Number(e[n]);return Number.isFinite(i)?i:null}function mg(e){return 0===e.length?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function mv(e,t){if(void 0!==e&&void 0!==t)return Math.max(0,Math.round((t-e)/1e6))}function my(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=e.match(RegExp(`^\\s*${r}:\\s*([0-9][0-9,]*)`,"im"));if(!n)return;let i=n[1];return void 0===i?void 0:mp(i)??void 0}async function mS(e,t,r={}){var n,i,a,o,s,l,d,c;let u=tX(e,r.adb);try{let d,c,p,f,m,h,w,g,v,y,S,b=(n=(await u(["shell","dumpsys","gfxinfo",t,"framestats"],{timeoutMs:15e3})).stdout,i=new Date().toISOString(),function(e,t){if(/no process found for:/i.test(e))throw new eL("COMMAND_FAILED",`Android gfxinfo did not find a running process for ${t}`,{metric:"fps",package:t,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf after the interaction you want to inspect."})}(n,t),p=function(e){let t=e.split(/\nProfile data in ms:\n/i)[0]??"",r=my(t,"Total frames rendered"),n=t.match(/^\s*Janky frames:\s*([0-9][0-9,]*)\s*\(([0-9.]+)%\)/im);if(void 0===r||!n)return;let i=n[1],a=n[2];if(void 0===i||void 0===a)return;let o=mp(i)??void 0,s=Number(a);if(void 0===o||!Number.isFinite(s)||r<0)return;let l=my(t,"Uptime"),d=my(t,"Stats since");return{droppedFramePercent:ff(s),droppedFrameCount:o,totalFrameCount:r,sampleWindowMs:function(e){let{uptimeMs:t,statsSinceNs:r}=e;if(void 0===t||void 0===r)return;let n=t-Math.round(r/1e6);return n>=0?n:void 0}({uptimeMs:l,statsSinceNs:d}),uptimeMs:l,statsSinceNs:d}}(n),f=function(e){let t=[],r=null;for(let i of e.split("\n")){var n;let e=i.trim();if(0===e.length||"---PROFILEDATA---"===e)continue;let a=e.split(",").map(e=>e.trim());if((n=a).includes("IntendedVsync")&&n.includes("FrameCompleted")){r=new Map(a.map((e,t)=>[e,t]));continue}let o=function(e,t){if(!t||e.length<t.size)return;let r=mw(e,t,"Flags"),n=mw(e,t,"IntendedVsync"),i=mw(e,t,"FrameCompleted");if(0===r&&null!==n&&null!==i&&!(n<=0)&&!(i<=n))return{intendedVsyncNs:n,frameCompletedNs:i,durationNs:i-n}}(a,r);o&&t.push(o)}return t.sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs)}(n),m=function(e,t,r){let n=function(e){var t;let r=(t=e.map(e=>e.intendedVsyncNs),[...new Set(t.filter(e=>Number.isFinite(e)))].sort((e,t)=>e-t)),n=[];for(let e=1;e<r.length;e+=1){let t=r[e]-r[e-1];t>=4e6&&t<=5e7&&n.push(t)}if(0!==n.length){let e,t;return e=[...n].sort((e,t)=>e-t),t=Math.floor(e.length/2),e.length%2==1?e[t]:(e[t-1]+e[t])/2}}(e);if(t||0!==e.length||function(e){throw new eL("COMMAND_FAILED",`Failed to parse Android framestats output for ${e}`,{metric:"fps",package:e,hint:"Retry perf after exercising the app screen. If the problem persists, capture adb shell dumpsys gfxinfo <package> framestats output for debugging."})}(r),t||void 0!==n)return n;throw new eL("COMMAND_FAILED",`Failed to infer Android frame deadline from framestats output for ${r}`,{metric:"fps",package:r,hint:"Retry perf after a longer interaction window so consecutive Android frame timestamps are available."})}(f,p,t),h=Date.parse(i),w=function(e){let{frames:t,measuredAtMs:r,summary:n}=e,i=mg(t),a=n?.statsSinceNs,o=a??i.firstFrameNs,s=mv(o,i.lastFrameNs),l=n?.sampleWindowMs??s;if(!Number.isFinite(r)||n?.uptimeMs===void 0||void 0===o)return{sampleWindowMs:l,windowStartNs:o};let d=r-n.uptimeMs;return{sampleWindowMs:l,windowStartNs:o,windowStartedAt:new Date(d+o/1e6).toISOString(),windowEndedAt:function(e){let{deviceBootWallClockMs:t,measuredAtMs:r,summaryStartNs:n,lastFrameNs:i}=e;return void 0!==n?new Date(r).toISOString():void 0===i?void 0:new Date(t+i/1e6).toISOString()}({deviceBootWallClockMs:d,measuredAtMs:r,summaryStartNs:a,lastFrameNs:i.lastFrameNs}),timestampSource:"estimated-from-device-uptime"}}({frames:f,measuredAtMs:h,summary:p}),g=function(e){let{frames:t,frameDeadlineNs:r,summaryDroppedFrameCount:n}=e;return void 0!==n?n<=0?[]:[...t].sort((e,t)=>t.durationNs-e.durationNs).slice(0,n).sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs):void 0===r?[]:t.filter(e=>e.durationNs>r)}({frames:f,frameDeadlineNs:m,summaryDroppedFrameCount:p?.droppedFrameCount}),v=p?.sampleWindowMs??w.sampleWindowMs??function(e){if(0===e.length)return;let t=mg(e);return mv(t.firstFrameNs,t.lastFrameNs)}(f),a=p,o=f,s=g,d=a?.totalFrameCount??o.length,c=a?.droppedFrameCount??s.length,y={totalFrameCount:d,droppedFrameCount:c,droppedFramePercent:a?.droppedFramePercent??(d>0?ff(c/d*100):0)},S=function(e){let{droppedFrames:t,timing:r,measuredAtMs:n,summary:i}=e;if(0===t.length)return;let a=function(e){let{frames:t,windowStartNs:r,measuredAtMs:n,uptimeMs:i}=e;if(0===t.length||void 0===r)return[];let a=[],o=[];for(let e of t){let t=o.at(-1);if(!t||e.intendedVsyncNs-t.frameCompletedNs<=5e8){o.push(e);continue}a.push(o),o=[e]}return o.length>0&&a.push(o),a.map(e=>(function(e){let{frames:t,windowStartNs:r,measuredAtMs:n,uptimeMs:i}=e,a=Math.min(...t.map(e=>e.intendedVsyncNs)),o=Math.max(...t.map(e=>e.frameCompletedNs)),s=Math.max(0,Math.round((a-r)/1e6)),l=Math.max(s,Math.round((o-r)/1e6)),d=void 0!==i&&Number.isFinite(n)?n-i:void 0;return{startOffsetMs:s,endOffsetMs:l,startAt:void 0===d?void 0:new Date(d+a/1e6).toISOString(),endAt:void 0===d?void 0:new Date(d+o/1e6).toISOString(),missedDeadlineFrameCount:t.length,worstFrameMs:mf(Math.max(...t.map(e=>e.durationNs))/1e6)}})({frames:e,windowStartNs:r,measuredAtMs:n,uptimeMs:i})).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}({frames:t,windowStartNs:r.windowStartNs,measuredAtMs:n,uptimeMs:i?.uptimeMs});return a.length>0?a:void 0}({droppedFrames:g,timing:w,measuredAtMs:h,summary:p}),{...y,sampleWindowMs:v,...(l=m,{frameDeadlineMs:void 0===l?void 0:mf(l/1e6),refreshRateHz:void 0===l?void 0:mf(1e9/l)}),windowStartedAt:w.windowStartedAt,windowEndedAt:w.windowEndedAt,timestampSource:w.timestampSource,measuredAt:i,method:mm,source:p?"android-gfxinfo-summary":"framestats-rows",worstWindows:S&&S.length>0?S:void 0});return await mb(e,t,r),b}catch(e){throw d=t,(c=e)instanceof eL?new eL(c.code,c.message,{...c.details??{},metric:"fps",package:d},c):new eL("COMMAND_FAILED",`Failed to sample Android fps for ${d}`,{metric:"fps",package:d},c)}}async function mb(e,t,r={}){let n=tX(e,r.adb);try{await n(["shell","dumpsys","gfxinfo",t,"reset"],{allowFailure:!0,timeoutMs:3e3})}catch{}}function mA(e,t,r,n){if(n instanceof eL){var i,a,o,s,l;let d,c=n.details??{};return new eL(n.code,n.message,{...c,action:e,package:r,tool:t,hint:"string"==typeof c.hint?c.hint:(i=t,d=("string"==typeof(a=c).stderr?a.stderr:"").toLowerCase(),"simpleperf"===i?(s=o=d).includes("permission denied")||s.includes("not profileable")||s.includes("profileable")?"Use a debuggable/profileable Android app or a device image that permits simpleperf for the target process, then retry perf cpu profile start.":o.includes("not supported")||o.includes("failed to open perf event")?"This device image does not expose the requested simpleperf event for the app process. Try a different emulator/system image or a profileable app.":mI("simpleperf"):(l=d).includes("permission denied")||l.includes("not allowed")?"Use a device image that permits perfetto trace capture for shell, keep the app running, then retry perf trace start.":mI(i))},n)}return new eL("COMMAND_FAILED",`Failed to ${e} Android ${t} for ${r}`,{action:e,package:r,tool:t,hint:mI(t)},n)}function mI(e){return"simpleperf"===e?"Verify simpleperf is available, the app process is running, and the app/device permits native CPU profiling.":"Verify perfetto is available, the app process is running, and the device permits trace capture."}async function m_(e,t,r,n,i){return{capture:{durationMs:n,packageName:t.packageName,appPid:t.appPid,artifactPath:t.outPath,sizeBytes:r},frameHealth:"perfetto"===t.kind?await mx(e,t.packageName,i):void 0,notes:["perfetto"===t.kind?"Frame health is sampled from Android gfxinfo around the trace window; open the Perfetto artifact for timeline root cause.":"Open the Simpleperf report artifact for symbol-level CPU attribution."]}}async function mx(e,t,r){try{let n=await mS(e,t,r);return{available:!0,droppedFramePercent:n.droppedFramePercent,droppedFrameCount:n.droppedFrameCount,totalFrameCount:n.totalFrameCount,method:n.method,worstWindows:n.worstWindows?.slice(0,3).map(e=>({startOffsetMs:e.startOffsetMs,endOffsetMs:e.endOffsetMs,missedDeadlineFrameCount:e.missedDeadlineFrameCount,worstFrameMs:e.worstFrameMs}))}}catch(e){return{available:!1,reason:e instanceof Error?e.message:"Android frame health was not available"}}}let mM="adb-shell-simpleperf",mN="adb-shell-perfetto",mD="/data/local/tmp";async function mk(e,t,r){let n=tX(e,r.adb);await mL(n,t),await mF(n,t),await m$(n,t);let i=await mO(t.outPath);await mC(n,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await m_(e,t,i,o,{adb:n});return{...t,action:"stop",platform:"android",state:"stopped",stoppedAt:a,durationMs:o,sizeBytes:i,method:"simpleperf"===t.kind?mM:mN,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function mP(e,t,r={}){let n=tX(e,r.adb);try{"running"===t.state&&(await mL(n,t),await mF(n,t).catch(()=>{}))}finally{await mC(n,t.remotePath)}}function mE(e,t,r=mD){let n=e.replace(/[^A-Za-z0-9_.-]/g,"_");return`${r}/agent-device-${n}-${Date.now()}-${t}`}async function mC(e,t){try{await e(["shell",`rm -f ${mT(t)}`],{allowFailure:!0,timeoutMs:15e3})}catch{}}async function mR(e,t){await s.mkdir(i.dirname(e),{recursive:!0}),await s.writeFile(e,`${JSON.stringify(t,null,2)}
23
- `)}async function mO(e){try{return(await s.stat(e)).size}catch(t){throw new eL("COMMAND_FAILED",`Profiler artifact was not written: ${e}`,{outPath:e,hint:"Retry the profiling command and check daemon logs if the artifact path is still missing."},t)}}function mT(e){return`'${e.replace(/'/g,"'\\''")}'`}async function mL(e,t){try{var r;await e(["shell",(r=t.profilerPid,`pid=${mT(r)}; kill -INT "$pid" 2>/dev/null || true; for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done; kill -TERM "$pid" 2>/dev/null || true; for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done; echo "profiler process did not stop after SIGTERM" >&2; exit 1`)],{timeoutMs:3e4})}catch(e){throw mA("stop",t.kind,t.packageName,e)}}async function m$(e,t){await s.mkdir(i.dirname(t.outPath),{recursive:!0});try{await e(["pull",t.remotePath,t.outPath],{timeoutMs:3e4})}catch(e){throw new eL("COMMAND_FAILED",`Failed to pull Android ${t.kind} artifact for ${t.packageName}`,{package:t.packageName,tool:t.kind,remotePath:t.remotePath,outPath:t.outPath,hint:"Check that the profiling command ran long enough to create an artifact, then retry stop with the same session."},e)}}async function mF(e,t){let r;for(let n=0;n<12;n+=1){let n=await mU(e,t.remotePath);if(void 0!==n&&n>0&&n===r)return;r=n,await v(250)}throw new eL("COMMAND_FAILED",`Android ${t.kind} artifact is not ready to pull`,{package:t.packageName,tool:t.kind,remotePath:t.remotePath,hint:"The profiler stopped, but the remote artifact was missing, empty, or still changing. Retry stop with the same session or inspect the device-side artifact."})}async function mU(e,t){let r=mT(t),n=await e(["shell",`if [ -f ${r} ]; then stat -c %s ${r} 2>/dev/null || wc -c < ${r}; fi`],{allowFailure:!0,timeoutMs:15e3});if(0!==n.exitCode)return;let i=Number(n.stdout.trim().split(/\s+/)[0]);return Number.isFinite(i)?i:void 0}async function mG(e,t){try{let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=mj(r.stdout);if(0===r.exitCode&&n)return n}catch{}throw new eL("COMMAND_FAILED",`No active Android app process found for ${t}`,{package:t,hint:"Run open <app> for this session again, wait for the app UI to appear, then retry perf."})}async function mq(e,t,r){let n=await e(["shell",`command -v ${t} || which ${t}`],{allowFailure:!0,timeoutMs:15e3});if(!(0===n.exitCode&&n.stdout.trim()))throw new eL("UNSUPPORTED_OPERATION",`Android device does not expose ${t}`,{package:r,tool:t,hint:"simpleperf"===t?"Use an emulator/system image with simpleperf available, or install the Android NDK simpleperf binary for this device.":"Use Android 10+ or a system image that exposes the perfetto command-line binary."})}function mj(e){return e.trim().split(/\s+/).find(e=>/^\d+$/.test(e))}async function mV(e,t,r,n={}){let i,a=tX(e,n.adb),o=await mG(a,t);await mq(a,"perfetto",t);let s=mE(t,"app.perfetto-trace","/data/misc/perfetto-traces");try{await mb(e,t,{adb:a}),i=await mH(a,s,t)}catch(e){throw await mC(a,s),e}return{...{type:"trace",kind:"perfetto",packageName:t,appPid:o,profilerPid:i,remotePath:s,outPath:r,startedAt:Date.now(),state:"running"},action:"start",platform:"android",method:mN,message:`Started Android Perfetto trace for ${t}`}}async function mB(e,t,r,n={}){return await mk(e,{...t,outPath:r},n)}async function mH(e,t,r){try{let n=await e(["shell","perfetto","--background-wait","-o",t,"-t","3600s","sched","freq","idle","am","wm","gfx","view","binder_driver","hal","dalvik"],{timeoutMs:3e4}),i=mj(n.stdout);if(i)return i;throw new eL("COMMAND_FAILED","Android perfetto did not return a profiler pid",{package:r,tool:"perfetto",hint:"Retry perf trace start. If perfetto exits immediately, verify the device permits trace capture."})}catch(e){throw mA("start","perfetto",r,e)}}async function mK(e,t,r,n={}){let i,a=tX(e,n.adb),o=await mG(a,t);await mq(a,"simpleperf",t);let s=mE(t,"cpu.perf.data");try{i=await mz(a,o,s,t)}catch(e){throw await mC(a,s),e}return{...{type:"cpu-profile",kind:"simpleperf",packageName:t,appPid:o,profilerPid:i,remotePath:s,outPath:r,startedAt:Date.now(),state:"running"},action:"start",platform:"android",method:mM,message:`Started Android Simpleperf CPU profile for ${t}`}}async function mW(e,t,r,n={}){return await mk(e,{...t,outPath:r},n)}async function mX(e,t,r,n={}){let i=tX(e,n.adb);await mq(i,"simpleperf",t.packageName);let a=await mJ(i,t),o=new Date().toISOString(),s=function(e){let t=[];for(let r of R(e)){let e=r.match(/^([0-9]+(?:\.[0-9]+)?)%\s+(.+)$/);if(!e)continue;let n=Number(e[1]),i=e[2]?.trim();if(!Number.isFinite(n)||!i)continue;let a=i.split(/\s{2,}/).filter(Boolean);if(t.push({percentage:ff(n),command:a[0],dso:a[1],symbol:a.slice(2).join(" ")||void 0}),t.length>=50)break}return t}(a.stdout),l={kind:"simpleperf-report",generatedAt:o,packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,sourceRemotePath:t.remotePath,entryCount:s.length,entries:s};await mR(r,l);let d=await mO(r);return{action:"report",platform:"android",type:"cpu-profile-report",kind:"simpleperf",packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,outPath:r,sizeBytes:d,generatedAt:o,entryCount:s.length,method:mM,message:`Wrote Android Simpleperf report for ${t.packageName}`}}async function mz(e,t,r,n){try{var i,a,o,s;let l,d,c=await e(["shell",(i=t,a=r,o=["simpleperf","record","-e","cpu-clock:u","-p",i,"-o",a,"--duration",String(3600)],s="simpleperf",l=o.map(mT).join(" "),d=`${mD}/agent-device-${s}-${Date.now()}.err`,`err=${mT(d)}; (${l}) >/dev/null 2>"$err" & pid=$!; sleep 1; if kill -0 "$pid" 2>/dev/null; then rm -f "$err"; echo "$pid"; exit 0; fi; cat "$err" >&2; rm -f "$err"; exit 1`)],{timeoutMs:3e4}),u=mj(c.stdout);if(u)return u;throw new eL("COMMAND_FAILED","Android simpleperf did not return a profiler pid",{package:n,tool:"simpleperf",hint:"Retry perf. If simpleperf exits immediately, verify the app is profileable and the device permits native profiling."})}catch(e){throw mA("start","simpleperf",n,e)}}async function mJ(e,t){try{return await e(["shell","simpleperf","report","-i",t.remotePath,"--stdio","--sort","comm,dso,symbol"],{timeoutMs:3e4})}catch(e){throw mA("report","simpleperf",t.packageName,e)}}let mZ="adb-shell-dumpsys-cpuinfo",mY="Aggregated CPU usage for app processes matched from adb shell dumpsys cpuinfo.",mQ="adb-shell-dumpsys-meminfo",m0="Memory snapshot from adb shell dumpsys meminfo <package>. Values are reported in kilobytes.",m1="adb-shell-am-dumpheap",m2="Java heap dump captured with adb shell am dumpheap, pulled to a local artifact path.";async function m3(e,t,r={}){let n=tX(e,r.adb);try{let e=await n(["shell","dumpsys","cpuinfo"],{timeoutMs:15e3});return function(e,t,r){let n=new Set,i=0;for(let r of R(e)){var a,o;let e=r.match(/^([0-9]+(?:\.[0-9]+)?)%\s+\d+\/([^\s]+):\s/);if(!e)continue;let s=e[1],l=e[2];if(void 0===s||void 0===l)continue;let d=Number(s);Number.isFinite(d)&&(a=l,o=t,a===o||a.startsWith(`${o}:`))&&(i+=d,n.add(l))}return{usagePercent:ff(i),measuredAt:r,method:mZ,matchedProcesses:[...n]}}(e.stdout,t,new Date().toISOString())}catch(e){throw m7("cpu",t,e)}}async function m5(e,t,r={}){let n=tX(e,r.adb);try{let e=await n(["shell","dumpsys","meminfo",t],{timeoutMs:15e3});return function(e,t,r){let n;if(/no process found for:/i.test(e))throw new eL("COMMAND_FAILED",`Android meminfo did not find a running process for ${t}`,{metric:"memory",package:t,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf."});let i=he(e,"TOTAL PSS")??function(e){for(let t of e.split("\n")){let e=t.trim();if(!/^TOTAL\b(?!\s+PSS:)/.test(e))continue;let r=e.split(/\s+/).slice(1).find(e=>null!==mp(e));if(!r)break;return mp(r)??void 0}}(e);if(void 0===i)throw new eL("COMMAND_FAILED",`Failed to parse Android meminfo output for ${t}`,{metric:"memory",package:t,hint:"Retry perf after reopening the app session. If the problem persists, capture adb shell dumpsys meminfo output for debugging."});return{totalPssKb:i,totalRssKb:he(e,"TOTAL RSS"),measuredAt:r,method:mQ,topConsumers:(n=e.split("\n").flatMap(e=>(function(e){let t=e.trim();if(function(e){if(!e||e.startsWith("**")||e.startsWith("-")||e.includes(":"))return!0;let t=/^\S.+\s+\d/.test(e);return/^(pss|total|native|dalvik|unknown|app summary\b)/i.test(e)&&!t}(t))return;let r=t.match(/^(.+?)\s+([0-9][0-9,]*(?:\(\d+\))?)(?:\s|$)/);if(r)return function(e,t){let r=e?.trim(),n=t?mp(t):null;if(r&&"TOTAL"!==r&&null!==n&&!(n<=0)&&!/^(pss|private|shared|heap|size|alloc|free)$/i.test(r))return{name:r,pssKb:n}}(r[1],r[2])})(e)??[]).sort((e,t)=>t.pssKb-e.pssKb).slice(0,5)).length>0?n:void 0}}(e.stdout,t,new Date().toISOString())}catch(e){throw m7("memory",t,e)}}async function m4(e,t,r,n={}){let a,o=tX(e,n.adb),l=await m9(o,t),d=(a=t.replace(/[^a-zA-Z0-9._-]/g,"_"),`/data/local/tmp/agent-device-${a}-${Date.now()}.hprof`);await s.mkdir(i.dirname(r),{recursive:!0});let c=await m8(r);try{let e=await o(["shell","am","dumpheap",t,d],{allowFailure:!0,timeoutMs:12e4});if(0!==e.exitCode){var u,p;let r;throw new eL("COMMAND_FAILED",`Failed to capture Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:l,remotePath:d,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,hint:(u=e.stdout,p=e.stderr,(r=`${u}
24
- ${p}`.toLowerCase()).includes("profileable")||r.includes("debuggable")||r.includes("not allowed")?"Android heap dumps require a debuggable/profileable app process on many devices. Use a debug/profileable build, reopen the app, then retry.":r.includes("permission")||r.includes("denied")?"The device denied heap dump access. Use a debug/profileable build or a device image that permits app heap dumping.":"Reopen the app to refresh the process, then retry perf memory snapshot. If it still fails, run with --debug and inspect adb am dumpheap output.")})}let n=await o(["pull",d,r],{allowFailure:!0,timeoutMs:12e4});if(0!==n.exitCode)throw await m6(r,c),new eL("COMMAND_FAILED",`Failed to pull Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:l,remotePath:d,path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:"Verify the daemon can write the requested --out path and retry. The heap dump stays on-device only until cleanup runs."});let i=await s.stat(r).catch(()=>null);if(!i?.isFile()||i.size<=0)throw await m6(r,c),new eL("COMMAND_FAILED","Android heap dump artifact is missing or empty",{kind:"android-hprof",package:t,pid:l,path:r,remotePath:d,hint:"Retry with a writable --out path. If the file is still empty, inspect adb pull output with --debug."});return{available:!0,kind:"android-hprof",path:r,sizeBytes:i.size,measuredAt:new Date().toISOString(),method:m1,packageName:t,pid:l,remotePath:d}}finally{await o(["shell","rm","-f",d],{allowFailure:!0,timeoutMs:15e3}).catch(()=>{})}}async function m8(e){return await s.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function m6(e,t){t||await s.rm(e,{force:!0}).catch(()=>{})}async function m9(e,t){let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=r.stdout.trim().split(/\s+/).map(e=>Number(e)).find(e=>Number.isInteger(e)&&e>0);if(0===r.exitCode&&void 0!==n)return n;throw new eL("COMMAND_FAILED",`No running Android process found for ${t}`,{kind:"android-hprof",package:t,stdout:r.stdout,stderr:r.stderr,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf memory snapshot."})}function m7(e,t,r){return r instanceof eL?new eL(r.code,r.message,{...r.details??{},metric:e,package:t},r):new eL("COMMAND_FAILED",`Failed to sample Android ${e} for ${t}`,{metric:e,package:t},r)}function he(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=e.match(RegExp(`${r}:\\s*([0-9][0-9,]*)`,"i"));if(!n)return;let i=n[1];return void 0===i?void 0:mp(i)??void 0}let ht="shared_prefs/ReactNativeDevPrefs.xml",hr="debug_http_host",hn="dev_server_https",hi="RCT_jsLocation",ha="RCT_packager_scheme",ho="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.",hs='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function hl(e){return void 0!==ek(e)}async function hd(e){let{device:t,appId:r,runtime:n}=e;if(!r)return;let i=ek(n);if(i){if("android"===t.platform)return void await hu(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await hh(t,r,i)}}async function hc(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await hp(t,r);"ios"===t.platform&&"simulator"===t.kind&&await hw(t,r)}}async function hu(e,t,r){var n,i,a,o,s,l;let d,c;hS(t);let u=(n=await hf(e,t),i=hr,a=`${r.host}:${r.port}`,d=` <string name="${hb(i)}">${hb(a)}</string>`,hv(hy(n,i),d));o=u,s=hn,l="https"===r.scheme,c=` <boolean name="${hb(s)}" value="${l?"true":"false"}" />`,u=hv(hy(o,s),c),await hm(e,t,u)}async function hp(e,t){hS(t);let r=await hf(e,t),n=hy(r,hr),i=hy(n,hn);i!==r&&await hm(e,t,i)}async function hf(e,t){let r=await e7(e,["shell","run-as",t,"cat",ht],{allowFailure:!0});return 0!==r.exitCode?hs:hg(r.stdout)}async function hm(e,t,r){let n=["shell","run-as",t,"id"],i=await e7(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=hA(i.stdout,i.stderr);throw new eL("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?ho:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await e7(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await e7(e,["shell","run-as",t,"tee",ht],{stdin:r.trimEnd()})}catch(n){let e=eO(n);if("TOOL_MISSING"===e.code)throw e;let r=hA("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new eL("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?ho:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function hh(e,t,r){await i4(lH(e,["spawn",e.id,"defaults","write",t,hi,"-string",`${r.host}:${r.port}`])),await i4(lH(e,["spawn",e.id,"defaults","write",t,ha,"-string",r.scheme]))}async function hw(e,t){await i4(lH(e,["spawn",e.id,"defaults","delete",t,hi]),{allowFailure:!0}),await i4(lH(e,["spawn",e.id,"defaults","delete",t,ha]),{allowFailure:!0})}function hg(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
25
- `:hs}function hv(e,t){return hg(e).replace("</map>",`${t}
26
- </map>`)}function hy(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return hg(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 hS(e){if("binary"!==tf(e))return;let t=tg(e);throw new eL("INVALID_ARGS",t,{package:e,hint:t})}function hb(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function hA(e,t){let r=`${e}
27
- ${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 hI=new Map;async function h_(e){let t=await w.mkdtemp(i.join(u.tmpdir(),"agent-device-materialized-"));try{let n=await hN(e.installablePath,i.join(t,"installable")),a=e.archivePath?await hN(e.archivePath,i.join(t,"archive")):void 0,o=r.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{hx(o)},s);return hI.set(o,{rootPath:t,installablePath:n,archivePath:a,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:d}),{materializationId:o,installablePath:n,...a?{archivePath:a}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await w.rm(t,{recursive:!0,force:!0}),e}}async function hx(e,t){let r=hI.get(e);if(!r)throw new eL("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eL("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),hI.delete(e),await w.rm(r.rootPath,{recursive:!0,force:!0})}async function hM(e){let t=Array.from(hI.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await hx(e)}))}async function hN(e,t){let r=await w.stat(e);await w.mkdir(t,{recursive:!0});let n=i.join(t,i.basename(e));return r.isDirectory()?await w.cp(e,n,{recursive:!0}):await w.copyFile(e,n),n}let hD=["Simulator"],hk=["Device Hub","Simulator"];function hP(e,t){if("simulator"!==e.kind)throw new eL("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function hE(e={}){let t=e.deviceHub?hk:hD,r=e.background?["-g","-a"]:["-a"];for(let e of t)if(0===(await i5("open",[...r,e],{allowFailure:!0,timeoutMs:1e4})).exitCode)return}async function hC(e,t={}){let r,n;if("simulator"!==e.kind)return;if("Booted"===await hO(e)){t.focusExisting&&await hE({background:t.deviceHub,deviceHub:t.deviceHub});return}let i=tn.fromTimeoutMs(18e4);try{await tu(async({deadline:t})=>{if(t?.isExpired())throw new eL("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:18e4});let i=Math.max(1e3,t?.remainingMs()??18e4),a=await i4(lH(e,["boot",e.id]),{allowFailure:!0,timeoutMs:i});r={stdout:String(a.stdout??""),stderr:String(a.stderr??""),exitCode:a.exitCode};let o=`${r.stdout}
28
- ${r.stderr}`.toLowerCase(),s=o.includes("already booted")||o.includes("current state: booted");if(0!==r.exitCode&&!s)throw new eL("COMMAND_FAILED","simctl boot failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let l=await i4(lH(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:i});if(n={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==n.exitCode)throw new eL("COMMAND_FAILED","simctl bootstatus failed",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode});let d=await hO(e);if("Booted"!==d)throw new eL("COMMAND_FAILED","Simulator is still booting",{state:d})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let t=to({error:e,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}});return"IOS_BOOT_TIMEOUT"!==t&&"CI_RESOURCE_STARVATION_SUSPECTED"!==t}},{deadline:i,phase:"boot",classifyReason:e=>to({error:e,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(a){let t=to({error:a,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}});throw new eL("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:18e4,elapsedMs:i.elapsedMs(),reason:t,hint:tl(t),boot:r,bootstatus:n})}await hE({deviceHub:t.deviceHub})}async function hR(e){let t=lH(e,["shutdown",e.id]),r=await i4(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===r.exitCode,exitCode:r.exitCode,stdout:String(r.stdout??""),stderr:String(r.stderr??"")}}async function hO(e){let t="string"==typeof e?e:e.id,r="string"==typeof e?lB(["list","devices","-j"]):lH(e,["list","devices","-j"]),n=await i4(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}}function hT(e){return"ios"===e.platform&&"simulator"===e.kind}async function hL(e){if(!1===e.booted)return{success:!0,exitCode:0,stdout:"",stderr:""};try{return hT(e)?await h$(e):await hU(e)}catch(t){let e=eT(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function h$(e){let t=await hR(e);return t.success?t:"Shutdown"===await hF(e)?{...t,success:!0,exitCode:0}:t}async function hF(e){try{return await hO(e)}catch{return null}}async function hU(e){let t=await e7(e,["emu","kill"],{allowFailure:!0,timeoutMs:15e3});return{success:0===t.exitCode,exitCode:t.exitCode,stdout:String(t.stdout??""),stderr:String(t.stderr??"")}}let hG=new Map;async function hq(e,t={}){var r;let n,i=(n="simulator"===(r=e).kind?r.simulatorSetPath??"":"",JSON.stringify([r.platform,r.kind,r.id,r.target??"",n])),a=hG.get(i);if(void 0!==a){if(a>Date.now()&&!t.focusExisting)return;hG.delete(i)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:r}=await Promise.resolve(t2);await r(e,{deviceHub:t.deviceHub,focusExisting:t.focusExisting}),hj(i);return}if("device"===e.kind){await hV(e.id),hj(i);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./3340.js");await t(e.id),hj(i)}}function hj(e){hG.set(e,Date.now()+5e3)}async function hV(e){let t=i.join(u.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 i4(["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 hB(t);if(0===n.exitCode){if(!o.parsed)throw new eL("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 eL("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 eL("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:hH(i,a)})}catch(t){if(t instanceof eL&&"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 eL("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:a,stdout:n,stderr:i,hint:n||i?hH(n,i):o},t)}throw new eL("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 s.rm(t,{force:!0}).catch(()=>{})}}async function hB(e){try{let t=await s.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 hH(e,t){let r=fy(e,t);return r||(`${e}
29
- ${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":fv)}function hK(e,t,r){return t||nA(r,ny)?null:a8("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function hW(e){return"string"==typeof e?.session&&e.session.trim().length>0}async function hX(e,t){hT(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function hz(e){let t=nA(e.flags,ny)||!e.session?await nu(e.flags??{}):await hJ(e.session.device);return!1!==e.ensureReady&&await hq(t),t}async function hJ(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 nu(t)}catch(e){if(!(e instanceof eL)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await nu({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function hZ(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 hY(e,t){return!!t&&0===lP(t,e).length}async function hQ(e){let{device:t,shutdownRequested:r}=e;if(r&&(hT(t)||"android"===t.platform&&"emulator"===t.kind))return await hL(t)}async function h0(e){if(await ug(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await ah("dismiss",t).catch(t=>{el({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function h1(e){e.applePerf?.active&&(await mi(e.applePerf.active),e.applePerf={...e.applePerf??{},active:void 0})}async function h2(e){let t=e.nativePerf?.android;t&&(await mP(e.device,t),e.nativePerf={...e.nativePerf??{},android:void 0})}async function h3(e){"android"===e.device.platform&&await tU(e.device)}async function h5(e,t){e.appLog&&await fi(e.appLog),await h1(e),await h2(e),await h3(e),e3(e.device.platform)&&await h0(e),await hM(t).catch(()=>{})}async function h4(e){var t,r,n;let{req:i,sessionName:a,logPath:o,sessionStore:s}=e,l=s.get(a);if(!l)return await h8(i,o);(l.appLog&&await fi(l.appLog),await h1(l),await h2(l),await h3(l),t=i,r=l,n=t,(n.positionals?.length??0)>0||"web"===r.device.platform)&&(e3(l.device.platform)&&!hT(l.device)&&await h0(l),await iS(l.device,"close",i.positionals??[],i.flags?.out,{...aW(o,i.flags,l.appBundleId,l.trace?.outPath)}),await hX(l.device,300));e3(l.device.platform)&&(!hT(l.device)||i.flags?.shutdown||l.recording)?await h0(l):e3(l.device.platform)&&el({level:"debug",phase:"ios_runner_retained_after_close",data:{session:l.name,deviceId:l.device.id}}),hl(s.getRuntimeHints(a))&&l.appBundleId&&await hc({device:l.device,appId:l.appBundleId}).catch(()=>{}),s.recordAction(l,{command:"close",positionals:i.positionals??[],flags:i.flags??{},result:{session:l.name,...V(`Closed: ${l.name}`)}}),i.flags?.saveScript&&(l.recordSession=!0),s.writeSessionLog(l),await hM(a).catch(()=>{}),s.delete(a);let d=await hQ({device:l.device,shutdownRequested:i.flags?.shutdown});return d?{ok:!0,data:P({session:l.name,shutdown:d},`Closed: ${l.name}`)}:{ok:!0,data:{session:l.name,...V(`Closed: ${l.name}`)}}}async function h8(e,t){if(!e.positionals||0===e.positionals.length)return a8("SESSION_NOT_FOUND","No active session");let r=await hz({session:void 0,flags:e.flags,ensureReady:!0});return await iS(r,"close",e.positionals,e.flags?.out,{...aW(t,e.flags)}),await hX(r,300),{ok:!0,data:{app:e.positionals[0],...V(`Closed: ${e.positionals[0]}`)}}}async function h6(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 h9(e){a.existsSync(e)&&a.unlinkSync(e)}function h7(e){if(!a.existsSync(e))return null;try{let t=JSON.parse(a.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function we(e){let t=h7(e);if(!t||t.pid===process.pid)try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}function wt(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function wr(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 eL("COMMAND_FAILED",t))})})}(async function(e={}){let t,n,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}=eX(o.AGENT_DEVICE_STATE_DIR),h=eZ(o.AGENT_DEVICE_DAEMON_SERVER_MODE);var w,v,y,S=m;if(a.existsSync(S))for(let e of a.readdirSync(S,{withFileTypes:!0})){if(!e.isDirectory())continue;let t=i.join(S,e.name,ro);if(a.existsSync(t))try{let e=rs(a.readFileSync(t,"utf8"));if(e&&function(e){let t,r=eN(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=eD(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{rd(t)}}let b=new rn(m),A=new nn({maxActiveSimulatorLeases:wt(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:wt(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:wt(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:wt(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),I=tH(),_=r.randomBytes(24).toString("hex"),x=eN(process.pid)??void 0,M=eQ(),N=function(e){let{logPath:t,stateDir:r,token:n,androidAdbProvider:a,appleRunnerProvider:o,appleToolProvider:s,linuxToolProvider:l,webProvider:d,appLogProvider:c,recordingProvider:u,deviceInventoryProvider:p,trackDownloadableArtifact:f}=e,{sessionStore:m,leaseRegistry:h}=e;async function w(e){let r=!!(e.meta?.debug||e.flags?.verbose);return await en({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:r,logPath:t},async()=>{if(!ey(e.token,n))return pA();try{return await nm(p,async()=>{let t=await u4({req:e,sessionStore:m,leaseRegistry:h});return await g(t)})}catch(e){return p_(e)}})}async function g(e,t){let n=async()=>{var n;let p,h=function(e){var t,r,n;let a,{scope:o,sessionStore:s,trackDownloadableArtifact:l}=e,d=o.runnerLogPath;o.throwIfCanceled();let c=s.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=um(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),s.set(o.sessionName,c));let u=(a=(t={req:o.req,sessionName:o.sessionName,sessionStore:s}).sessionStore.get(t.sessionName),{req:lF(t.req,a),existingSession:a}),p=u.req;c=u.existingSession;let f=e=>(function(e,t,r){let n=ei();if(!t.ok){el({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=ea({force:!0})??void 0;return{ok:!1,error:eT(new eL(eR(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:n.diagnosticId,logPath:e})}}return el({level:"info",phase:"request_success"}),ea(),{ok:!0,data:function(e,t,r){var n,a;let o;if(!t)return t;let s=(n=e,o=Array.isArray((a=t).artifacts)?[...a.artifacts]:[],"screenshot"!==n.command||o.some(e=>e?.field==="path")||"string"!=typeof a.path||o.push({field:"path",path:a.path,localPath:n.meta?.clientArtifactPaths?.path,fileName:i.basename(n.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,l);if(c?.recording?.invalidatedReason&&(r=o.command,nD(r)?.allowInvalidRecording!==!0))return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:c.recording.invalidatedReason}})};c&&!p.meta?.lockPolicy&&(n=o.command,nD(n)?.selectorValidationExempt!==!0)&&function(e,t){let r=lP(e,t);if(0!==r.length)throw new eL("INVALID_ARGS",`Session "${e.name}" is already bound to ${lD(e)}, but this request selected ${r.map(lE).join(", ")}.`,{session:e.name,conflicts:r.map(lE),hint:lk(e,"selector-conflict")})}(c,p.flags);let m=(e,t,r)=>{let n;return{...aW(d,e,t,r,n=ei().requestId),requestId:n}};return{type:"scope",scope:{req:p,sessionName:o.sessionName,logPath:d,existingSession:c,finalize:f,contextFromFlags:m,handlerContextFromFlags:(e,t,r)=>({...m(e,t,r),surface:s.get(o.sessionName)?.surface})}}}({scope:e,sessionStore:m,trackDownloadableArtifact:f});if("response"===h.type)return h.response;let w=h.scope,g=async e=>await v({lockedScope:w,providerScope:e,allowReplayActions:void 0===t});return t?await g(t):await nP({req:w.req,existingSession:w.existingSession,providers:{androidAdbProvider:a,appleRunnerProvider:o,appleToolProvider:s,linuxToolProvider:l,webProvider:d??((n=w,n.existingSession?.device.platform==="web"||n.req.flags?.platform==="web")?(p=r,({req:e,session:t})=>pu({session:t?.name??e.session,stateDir:p})):void 0),appLogProvider:c,recordingProvider:u}},g)};return t?await n():await e.runLocked(n)}async function v(e){var t,r;let{lockedScope:i,providerScope:a,allowReplayActions:o}=e,s=await lw({req:i.req,sessionName:i.sessionName,logPath:i.logPath,sessionStore:m,leaseRegistry:h,invoke:w,invokeReplayAction:o?(t=i,r=a,async e=>{var i,a,o;if(i=e,a=t,i.session!==a.sessionName||(o=i.command,nD(o)?.replayScopedAction!==!0))return await w(e);if(!ey(e.token,n))return pA();try{let n=await u4({req:e,sessionStore:m,leaseRegistry:h});return n.sessionName===t.sessionName?await g(n,r):await w(e)}catch(e){return p_(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await pI({lockedScope:i,logPath:i.logPath,sessionStore:m})}return w}({logPath:f,stateDir:c,token:_,sessionStore:b,leaseRegistry:A,trackDownloadableArtifact:r_}),D=async e=>{await en({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{el({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),ea({force:!0})})},k=async e=>{let t=h5(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
30
- `)});await Promise.race([t,e2(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
31
- `)})]),b.writeSessionLog(e),b.delete(e.name)},P=async()=>{let e=b.toArray();await Promise.all(e.map(k))},E=async()=>{let e,t,r=[];if("http"!==h){let t,n,i=(t=new Set,(n=g.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))rw(e);el({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(t0);if(await e(),n<=0)break;await e2(200)}}catch(e){el({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=eB(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=eW(n),a=rm(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),rh(a),rv(a))throw rS();r=await r$(o?t=>{e.destroyed||e.write(e0(t))}:void 0,async()=>await N(n))}catch(e){r={ok:!1,error:eT(e)}}finally{n-=1,a&&(i.delete(a),rg(a))}e.destroyed||e.write(o?eH(r):`${JSON.stringify(r)}
32
- `)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await wr(i,"Failed to bind socket server")}if("socket"!==h){let e=await r5({handleRequest:N,token:_});r.push(e),t=await wr(e,"Failed to bind HTTP server")}return{servers:r,socketPort:e,httpPort:t}};if(!function(e,t,r){a.existsSync(e)||a.mkdirSync(e,{recursive:!0});let n=JSON.stringify(r,null,2),i=()=>{try{return a.writeFileSync(t,n,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(i())return!0;let o=h7(t);if(o?.pid&&o.pid!==process.pid&&eE(o.pid,o.processStartTime))return!1;try{a.unlinkSync(t)}catch{}return i()}(c,p,{pid:process.pid,version:I,startedAt:Date.now(),processStartTime:x}))return l.write("Daemon lock is held by another process; exiting.\n"),d(0),null;let C=[];try{let e,r=await E();C=r.servers,t=r.socketPort,n=r.httpPort,w=t,v=n,y={socketPort:w,httpPort:v,token:_,version:I,codeSignature:M,processStartTime:x},a.existsSync(c)||a.mkdirSync(c,{recursive:!0}),a.writeFileSync(f,""),e=y.socketPort&&y.httpPort?"dual":y.httpPort?"http":"socket",a.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}),a.chmodSync(u,384),w&&s.write(`AGENT_DEVICE_DAEMON_PORT=${w}
33
- `),v&&s.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${v}
34
- `)}catch(t){let e=eO(t);for(let t of(l.write(`Daemon error: ${e.message}
35
- `),C))try{t.close(()=>{})}catch{}return h9(u),we(p),d(1),null}ed();let R=!1,O=async(e={})=>{if(R)return;R=!0,e.cause&&await D(e.cause),await h6(C),await P();let{stopAllIosRunnerSessions:t}=await Promise.resolve(t0);await t(),await Promise.race([em().catch(()=>{}),e2(1e3)]),h9(u),we(p),d(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{O()}),process.on("SIGTERM",()=>{O()}),process.on("SIGHUP",()=>{O()}),process.on("uncaughtException",e=>{let t=e instanceof eL?e:eO(e);l.write(`Daemon error: ${t.message}
36
- `),O({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof eL?t:eO(t);l.write(`Daemon error: ${r.message}
37
- `),O({exitCode:1,cause:t})})),{httpPort:n,shutdown:O,socketPort:t,token:_}})().catch(e=>{let t=eO(e);process.stderr.write(`Daemon error: ${t.message}
38
- `),process.exit(1)});export{mY as ANDROID_CPU_SAMPLE_DESCRIPTION,mZ as ANDROID_CPU_SAMPLE_METHOD,mh as ANDROID_FRAME_SAMPLE_DESCRIPTION,mm as ANDROID_FRAME_SAMPLE_METHOD,m2 as ANDROID_HPROF_SNAPSHOT_DESCRIPTION,m1 as ANDROID_HPROF_SNAPSHOT_METHOD,m0 as ANDROID_MEMORY_SAMPLE_DESCRIPTION,mQ as ANDROID_MEMORY_SAMPLE_METHOD,fP as APPLE_MEMGRAPH_SNAPSHOT_DESCRIPTION,fk as APPLE_MEMGRAPH_SNAPSHOT_METHOD,fv as IOS_DEVICECTL_DEFAULT_HINT,dY as IOS_RUNNER_CONTAINER_BUNDLE_IDS,nU as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,nF as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,rn as SessionStore,sC as annotateScreenshotWithRefs,p5 as withAppLogProvider,fo as appendAppLogMarker,hd as applyRuntimeHintsToApp,f$ as buildAppleFrameSamplingMetadata,fU as buildAppleMemorySnapshotSupport,fF as buildAppleSamplingMetadata,nK as buildRunnerSequenceCommand,lk as buildSessionRecoveryHint,lB as buildSimctlArgs,lH as buildSimctlArgsForDevice,ok as buildSnapshotState,m4 as captureAndroidHeapSnapshot,oH as captureAndroidUiHierarchyXml,fC as captureAppleMemorySnapshot,ov as captureSnapshot,hx as cleanupRetainedMaterializedPaths,rD as cleanupUploadedArtifact,fs as clearAppLogFiles,rg as clearRequestCanceled,hc as clearRuntimeHintsFromApp,aW as context_contextFromFlags,pu as createAgentBrowserWebProvider,oT as createDaemonRuntimeSessionStore,uC as createLocalAppleRunnerProvider,rS as createRequestCanceledError,iK as createScopedProvider,iS as dispatchCommand,rF as emitRequestProgress,sc as ensureAndroidBlockingSystemDialogReady,hq as ensureDeviceReady,a8 as errorResponse,iW as filterAppleAppsByBundlePrefix,aV as getActiveAndroidSnapshotFreshness,p6 as getAppLogPathMetadata,ry as getRequestSignal,um as getRunnerSessionSnapshot,nx as getSessionCommandKind,hO as getSimulatorState,sJ as getSnapshotReferenceFrame,h4 as handleCloseCommand,hl as hasRuntimeTransportHints,i3 as hasScopedAppleToolProvider,t9 as inferFillText,iH as isCommandSupportedOnDevice,lL as isImplicitSessionScopeConflict,aH as isNavigationSensitiveAction,rv as isRequestCanceled,nh as listDeviceInventory,fh as listIosDeviceApps,av as runMacOsPressAction,ag as runMacOsReadTextAction,aj as markAndroidSnapshotFreshness,aX as markPendingInteractionOutcome,a2 as markPostGestureStabilization,rw as markRequestCanceled,nW as parseRunnerSequenceResult,u1 as prepareIosRunner,rN as prepareUploadedArtifact,u0 as prewarmIosRunnerSession,af as quitMacOsApp,i8 as readApplePlistJson,fS as readInfoPlistString,rG as readReplayTestActionProgress,p7 as readSessionNetworkCapture,sQ as recordTouchVisualizationEvent,sd as recoverAndroidBlockingSystemDialog,hJ as refreshSessionDeviceIfNeeded,rh as registerRequestAbort,hK as requireSessionOrExplicitSelector,hP as requireSimulatorDevice,mb as resetAndroidFramePerfStats,hZ as resolveAndroidEmulatorAvdName,uR as resolveAppleRunnerProvider,i1 as resolveAppleToolProvider,hz as resolveCommandDevice,ap as resolveFrontmostMacOsApp,lO as resolveImplicitSessionScope,fy as resolveIosDevicectlHint,l$ as resolveLeaseScope,aI as resolveLinuxToolProvider,p9 as resolveLogBackend,ig as resolvePayloadInput,lR as resolvePublicSessionName,rm as resolveRequestTrackingId,dJ as resolveRunnerAppBundleId,ra as resolveSessionRequestLogPath,ri as resolveSessionRunnerLogPath,oR as resolveSnapshotScope,nu as resolveTargetDevice,h_ as retainMaterializedPaths,fa as runAppLogDoctor,i5 as runAppleToolCommand,fm as runIosDevicectl,ax as runLinuxToolCommand,ah as runMacOsAlertAction,am as runMacOsPermissionAction,ay as runMacOsScreenshotAction,aw as runMacOsSnapshotAction,lK as runSimctlForDevice,i4 as runXcrun,uQ as runIosRunnerCommand,uO as withAppleRunnerProvider,uv as abortAllIosRunnerSessions,uy as stopAllIosRunnerSessions,m3 as sampleAndroidCpuPerf,mS as sampleAndroidFramePerf,m5 as sampleAndroidMemoryPerf,fL as sampleAppleFramePerf,fE as sampleApplePerfMetrics,hY as selectorTargetsSessionDevice,lT as sessionMatchesScope,hW as session_device_utils_hasExplicitSessionFlag,oO as setSessionSnapshot,hX as settleIosSimulator,hL as shutdownDeviceTarget,hR as shutdownSimulator,hC as ensureBootedSimulator,oK as snapshotAndroid,aF as snapshotLinux,aU as readLinuxTextAtPoint,mV as startAndroidPerfettoTrace,mK as startAndroidSimpleperfProfile,ft as startAppLog,mr as startAppleXctracePerfCapture,mB as stopAndroidPerfettoTrace,mW as stopAndroidSimpleperfProfile,fi as stopAppLog,mn as stopAppleXctracePerfCapture,ug as stopIosRunnerSession,aZ as stripInternalInteractionFlags,i2 as withAppleToolProvider,a_ as withLinuxToolProvider,t7 as uniqueStrings,lN as withKeyedLock,rU as withReplayTestActionProgress,mX as writeAndroidSimpleperfReport,ma as writeAppleXctracePerfReport};
9
+ ${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.":`${tf("IOS_RUNNER_CONNECT_TIMEOUT")} ${l7}`)})}function di(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${n.randomUUID()}`}}function da(e){if(rb(e))throw rx()}let ds=new Map;async function dl(e,t,r,n,i=45e3,a,o){let s=tl.fromTimeoutMs(i),{getEndpoints:l}=dh(e,t),{endpoints:d}=await l(s.remainingMs()),c=null,u=Math.max(1,Math.ceil(i/250));try{return await tw(async({deadline:s})=>{let u=await dd({device:e,port:t,command:r,timeoutMs:i,logPath:n,session:a,endpoints:d,getEndpoints:l,signal:o,attemptDeadline:s,setEndpoints:e=>{d=e},setLastError:e=>{c=e}});if(u)return u;throw function(e){if(e.signal?.aborted)throw rx();return new eG("COMMAND_FAILED","Runner endpoint probe failed",{port:e.port,endpoints:e.endpoints,lastError:e.lastError?String(e.lastError):void 0})}({port:t,endpoints:d,lastError:c,signal:o})},{maxAttempts:u,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:dt},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||rN(e))throw rx();c||(c=e)}if(o?.aborted)throw rx();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw dr({port:t,endpoints:d,logPath:n,lastError:c});let a=await dI(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw dr({port:t,endpoints:d,logPath:n,lastError:c})}async function dd(e){await dc(e);let t=await du(e);if(t.response)return t.response;let r=await dp(e);return r||await df(e,t.usedCachedTunnelIp)}async function dc(e){if(e.attemptDeadline?.isExpired())throw new eG("COMMAND_FAILED","Runner connection deadline exceeded",{port:e.port,timeoutMs:e.timeoutMs});if(e.session?.child.exitCode!==null&&e.session?.child.exitCode!==void 0)throw await dn({session:e.session,port:e.port,logPath:e.logPath})}async function du(e){let t=e.endpoints,r=!1;if("device"===e.device.kind){let n=await e.getEndpoints(e.attemptDeadline?.remainingMs());t=n.endpoints,r=n.cached,e.setEndpoints(t)}let n=r?t[0]:null;return{response:await dw(t,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,r)=>{var i;e.setLastError(r),"device"===e.device.kind&&t===n&&(i=e.device.id,ds.delete(i))}}),usedCachedTunnelIp:r}}async function dp(e){return"simulator"===e.device.kind&&e.session?.ready?await dg(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function df(e,t){var r;if("device"!==e.device.kind||!t)return null;r=e.device.id,ds.delete(r);let n=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(n.endpoints),await dw(n.endpoints,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,r)=>{e.setLastError(r)}})}async function dm(e,t,r,n=45e3,i){if(i?.aborted)throw rx();let a=tl.fromTimeoutMs(n),{getEndpoints:o}=dh(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new eG("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let d=a.remainingMs();if(d<=0)throw new eG("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await dy(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function dh(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await dv({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 dw(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 eG("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await dy(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||rN(e))throw rx();s(t,e)}return null}async function dg(e,t,r,n){let{signal:i,attemptDeadline:a,onError:o}=n,s=a?.remainingMs()??45e3;if(s<=0)return null;try{let n=await dI(e,t,r,s,i);return new Response(n.body,{status:n.status})}catch(e){if(i?.aborted||rN(e))throw rx();return o(e),null}}async function dv(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=ds.get(t))?e.expiresAt<=Date.now()?(ds.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 dS(i.id,a);return l(d),d&&(r=i.id,n=d,ds.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function dy(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 dS(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,n=a.join(p.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),i=await ao(["devicectl","device","info","details","--device",e,"--json-output",n,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==i.exitCode||!o.existsSync(n))return null;let a=JSON.parse(o.readFileSync(n,"utf8"));if(a.info?.outcome&&"success"!==a.info.outcome)return null;let s=(a.result?.connectionProperties?.tunnelIPAddress??a.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{dM(n)}}async function dI(e,t,r,n,i){let a=JSON.stringify(r),o=l8(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 ao(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=tu({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new eG("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:tf(e)})}return{status:200,body:l}}async function dA(){return await new Promise((e,t)=>{let r=v.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 eG("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function db(e,t,r,n){t&&dx(t,e),r&&dx(r,e),n&&process.stderr.write(e)}let d_=new Map;function dx(e,t){let r=(d_.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await o.promises.mkdir(a.dirname(e),{recursive:!0}),await o.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{d_.get(e)===r&&d_.delete(e)});d_.set(e,r)}function dM(e){try{o.existsSync(e)&&o.unlinkSync(e)}catch{}}let dN=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function dP(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new eG("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(!o.existsSync(e))throw new eG("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await dD(e)){await aa("codesign",["--remove-signature",e],{allowFailure:!0});try{await aa("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof eG?n:new eG("COMMAND_FAILED",String(n));throw new eG("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 dD(e){return 0===(await aa("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let dk=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),dE=new Set([" "," ","\n","\r"]),dC=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function dR(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new dT(e).parse()}function dO(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)}dO(r.children,t)}}class dT{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(dC.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?dL(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])&&dk.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,dL(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])&&dE.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function dL(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 d$=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function dF(e){var t;let r=await dU(e);if(!r||0===r.length)return null;let n=a.dirname(e),i=new Set,s=function(e,t){let r=[],n=new Set,i=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){i.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);r.push(a.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&&n.add(a.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(n),hostRelativePaths:i}}(r,n);for(let e of s.testRootPaths){if(!o.existsSync(e))return null;i.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>o.existsSync(a.join(t,e)));return r?a.join(r,e):null})){if(!e)return null;i.add(e)}return Array.from(i)}async function dU(e){let t=await as(e);if(t){var r,n,i=t;let e=new Set;for(let t of[i,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!tM(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(tM))}return r}(i),...Object.values(i).filter(e=>tM(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(d$.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=o.readFileSync(e,"utf8"),n=dR(r),t=new Set,dO(n,(e,r)=>{if(d$.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}}let dG=["CFBundleIcons","CFBundleIcons~ipad"];async function dq(e){let t=e.filter(dH);if(0===t.length)return;let r=e.filter(e=>dX(e)&&!dW(e));for(let e of t){let t=function(e,t){let r=a.dirname(e);return t.find(e=>a.dirname(e)===r&&"AgentDeviceRunner.app"===a.basename(e))??t.find(t=>a.dirname(t)===r&&t!==e)??null}(e,r);t&&await dB(t,e)}}async function dB(e,t){var r;let n,i=function(e,t){let r=!1;for(let i of o.readdirSync(e,{withFileTypes:!0})){var n;if(i.isFile()&&(n=i.name,/^AppIcon.*\.png$/.test(n)||"Assets.car"===n))(function(e,t){if(o.existsSync(t)){let r=o.readFileSync(e),n=o.readFileSync(t);return!r.equals(n)&&(o.copyFileSync(e,t),!0)}return o.copyFileSync(e,t),!0})(a.join(e,i.name),a.join(t,i.name))&&(r=!0)}return r}(e,t),s=await dj(e,t);(i||s)&&(await dK(t),r=t,n=new Date,o.utimesSync(r,n,n))}async function dj(e,t){var r,n;let i=a.join(e,"Info.plist"),o=a.join(t,"Info.plist"),s=await as(i),l=await as(o);if(!s||!l)return!1;let d=(r=s,n=l,dG.flatMap(e=>{let t=r[e];return void 0===t||JSON.stringify(n[e])===JSON.stringify(t)?[]:[{key:e,value:t,shouldInsert:void 0===n[e]}]}));if(0===d.length)return!1;for(let e of d)await dV(o,e.key,e.value,e.shouldInsert);return!0}async function dV(e,t,r,n){let i=await aa("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new eG("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function dK(e){let t=await aa("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new eG("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function dH(e){return dX(e)&&dW(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function dW(e){return a.basename(e).endsWith("-Runner.app")}function dX(e){return a.basename(e).endsWith(".app")}let dz={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 dJ(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eG("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":tr(e.target)}function dZ(e){return"simulator"===e?"simulator":"device"}function dY(){return"arm64"===process.arch?"arm64":"x86_64"}let dQ="XCTestDevices",d0=".agent-device-backup",d1=".agent-device-xctestdevices-backup-",d2=a.join(p.homedir(),".agent-device","ios-runner"),d3=".agent-device-runner-cache.json",d5={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},d4=["-IDEPackageSupportDisableManifestSandbox=1","-IDEPackageSupportDisablePluginExecutionSandbox=1","ENABLE_USER_SCRIPT_SANDBOXING=NO","OTHER_SWIFT_FLAGS=$(inherited) -disable-sandbox"],d6=new Map,d8=new Set,d9=new Map,d7=new Set;function ce(e){return e?.trim()??""}function ct(e=process.env){return ce(e.AGENT_DEVICE_IOS_BUNDLE_ID)||ce(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function cr(e=process.env){let t=ce(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${ct(e)}.uitests`}let cn=function(e=process.env){let t=ct(e),r=cr(e);return Array.from(new Set([ce(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function ci(e=p.homedir()){return a.join(e,"Library","Developer","XCTestDevices")}async function ca(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=ta(e.simulatorSetPath);if(!r)return null;let n=a.resolve(r),i=a.resolve(t.xctestDeviceSetPath??ci()),s=a.resolve(t.backupPath??function(e=ci()){return`${e}${d0}`}(i)),l=a.resolve(t.lockDirPath??function(e=p.homedir()){return a.join(e,".agent-device","xctest-device-set.lock")}()),d=t.ownerStartTime??eC(process.pid),c=await cl({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(co({xctestDeviceSetPath:i,backupPath:s}),function(e,t){if(a.resolve(e)===a.resolve(t))return!0;try{return o.realpathSync.native(e)===o.realpathSync.native(t)}catch{return!1}}(n,i))return await c(),null;o.mkdirSync(n,{recursive:!0}),o.existsSync(i)&&o.renameSync(i,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,n=a.dirname(r),i=a.join(n,`${dQ}.agent-device-link-${process.pid}-${Date.now()}`);o.mkdirSync(n,{recursive:!0});try{o.symlinkSync(t,i,"dir"),o.renameSync(i,r)}catch(e){throw o.existsSync(i)&&cs(i),e}}({requestedSetPath:n,xctestDeviceSetPath:i})}catch(e){throw co({xctestDeviceSetPath:i,backupPath:s}),await c(),new eG("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:n,xctestDeviceSetPath:i,backupPath:s,error:String(e)})}let u=!1;return{release:async()=>{if(!u){u=!0;try{co({xctestDeviceSetPath:i,backupPath:s})}finally{await c()}}}}}function co(e){let{xctestDeviceSetPath:t,backupPath:r}=e,n=[r,...function(e){let t=a.dirname(e),r=a.basename(e).replace(d0,""),n=r===dQ?d1:`${r}${d1}`;try{return o.readdirSync(t).filter(e=>e.startsWith(n)).sort().map(e=>a.join(t,e))}catch{return[]}}(r)],i=n.find(e=>o.existsSync(e)),s=o.existsSync(t)&&o.lstatSync(t).isSymbolicLink();if(i){if(s&&cs(t),o.existsSync(t))if(!s)return void ef({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:i}});else i!==r?o.rmSync(i,{recursive:!0,force:!0}):o.rmSync(r,{recursive:!0,force:!0});else o.mkdirSync(a.dirname(t),{recursive:!0}),o.renameSync(i,t);for(let e of n)e!==i&&o.existsSync(e)&&o.rmSync(e,{recursive:!0,force:!0});return}s&&(ef({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),cs(t))}function cs(e){!o.existsSync(e)||o.lstatSync(e).isSymbolicLink()&&o.unlinkSync(e)}async function cl(e){return await ev({lockDirPath:e.lockDirPath,owner:e.owner,timeoutMs:e.timeoutMs??3e4,pollMs:e.pollMs??100,ownerGraceMs:5e3,description:e.description??"XCTest device set lock"})}async function cd(e){var t;return await cl({lockDirPath:(t=e,a.join(a.dirname(t),`${a.basename(t)}.lock`)),owner:{pid:process.pid,startTime:eC(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function cc(e,t){let r=function(e){var t;let r,i,s=e.iosXctestrunFile?.trim();if(!s)return null;let l=a.resolve(s);if(!o.existsSync(l))throw new eG("COMMAND_FAILED","Configured iOS XCTest runner .xctestrun file not found",{configKey:"iosXctestrunFile",xctestrunPath:l});let d=e.iosXctestDerivedDataPath?.trim(),c=d?a.resolve(d):(t=l,(r=n.createHash("sha1")).update(t),i=r.digest("hex").slice(0,12),a.join(p.tmpdir(),"agent-device-ios-xctest-derived",i));return cK("reuse","external_xctestrun",{derived:c,xctestrunPath:l}),{xctestrunPath:l,derived:c,cache:"external",artifact:"valid",buildMs:0,xctestrunPathSource:"external"}}(t);if(r)return r;let i=tY(),s=cg(e,i),l=cF(e,s);return await lU(d6,l,async()=>{let r=await cd(l);try{return await cu({device:e,options:t,projectRoot:i,expectedCacheMetadata:s,derived:l,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await r()}})}async function cu(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(td(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||d8.has(t))&&(cK("clean",r?"forced_rebuild":"forced_clean",{derived:t}),cj(t),ch(t),d8.delete(t));let l=await cV({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>cD(e,n),xctestrunReferencesProjectRoot:cE,resolveExistingXctestrunProductPaths:dF}),d="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&cK("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let c=await cp({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:d});return c||(l.xctestrunPath&&(cj(s),ch(s)),await cf({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:d,reason:l.reason}))}async function cp(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await cm(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function cf(e){let{device:t,options:r,projectRoot:n,expectedCacheMetadata:i,derived:s,cache:l,reason:d}=e,c=a.join(n,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!o.existsSync(c))throw new eG("COMMAND_FAILED","iOS runner project not found",{projectPath:c});let u=Date.now();await c$(t,c,s,r);let p=Math.max(0,Date.now()-u),f=cD(s,t);if(!f)throw new eG("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await dF(f);if(!m)throw new eG("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await dP(t,m,f),await dq(m),cy(s,cb(i,f,m)),cK("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:d}}async function cm(e,t,r,n){try{var i,a,o,s;return await dP(e,n.productPaths,n.xctestrunPath),cK("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,cy(i,cb(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof eG))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&dN.has(t)}(e))throw e;return cK("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function ch(e){try{if(!o.existsSync(e))return;if("derived"!==a.basename(e))return void o.rmSync(e,{recursive:!0,force:!0});for(let r of o.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,cw.has(t)&&o.rmSync(a.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let cw=new Set([d3,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function cg(e,t=tY()){let r,i=dJ(e);return{schemaVersion:2,packageVersion:tZ(),runnerSourceFingerprint:function(e){let t=a.join(e,"ios-runner","AgentDeviceRunner"),r=function(e){if(!o.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of o.readdirSync(e,{withFileTypes:!0})){var n,i;let o=a.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(o);continue}s.isFile()&&(n=s.name,i=o,"project.pbxproj"===n?i.includes(`${a.sep}.xcodeproj${a.sep}`):[".jpg",".json",".png",".swift",".m",".h",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(a.extname(n)))&&t.push(o)}}return t.sort((e,t)=>e.localeCompare(t))}(t),i=function(e,t){let r=n.createHash("sha256");for(let n of t){let t=a.relative(e,n),i=o.statSync(n);r.update(t),r.update("\0"),r.update(String(i.size)),r.update("\0"),r.update(String(Math.trunc(i.mtimeMs))),r.update("\0")}return r.digest("hex")}(t,r),s=cP.get(t);if(s?.fileStatsFingerprint===i)return s.sourceFingerprint;let l=n.createHash("sha256");for(let e of r){let r=a.relative(t,e);l.update(r),l.update("\0"),l.update(o.readFileSync(e)),l.update("\0")}let d=l.digest("hex");return cP.set(t,{fileStatsFingerprint:i,sourceFingerprint:d}),d}(t),...function(e,t){var r;let n=(r=cv("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=dz[e].sdkName[dZ(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:cv("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:cv("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(i,e.kind),platformName:i,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(r=dJ(e))?`platform=macOS,arch=${dY()}`:"simulator"===e.kind?`generic/platform=${r} Simulator`:`generic/platform=${r}`,runnerBundleBuildSettings:cq(process.env),runnerSigningBuildSettings:cG(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:cB(),runnerSandboxBuildArgs:[...d4]}}function cv(e,t){let r=JSON.stringify([e,t]),n=d9.get(r);if(void 0!==n)return n;try{let n=eV(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return d9.set(r,i),i}catch{return d9.set(r,"unknown"),"unknown"}}function cy(e,t){o.mkdirSync(e,{recursive:!0}),o.writeFileSync(a.join(e,d3),`${JSON.stringify(t,null,2)}
10
+ `)}async function cS(e,t){if("external"===e.cache)return void cK("preserve","external_bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t});d8.add(e.derived);let r=await cd(e.derived);try{cK("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),cj(e.derived),ch(e.derived)}finally{await r()}}function cI(e){let{artifacts:t,...r}=e;return r}function cA(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 cb(e,t,r){let n=function(e,t){let r=cx(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=cx(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 c_(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function cx(e){try{let t=o.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function cM(e,t){let r=cx(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function cN(e,t){let r=a.relative(a.resolve(t),a.resolve(e));return""!==r&&!r.startsWith("..")&&!a.isAbsolute(r)}let cP=new Map;function cD(e,t){if(!o.existsSync(e))return null;let r=[],n=[e];for(;n.length>0;){let e=n.pop();for(let t of o.readdirSync(e,{withFileTypes:!0})){let i=a.join(e,t.name);if(t.isDirectory()){n.push(i);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=o.statSync(i);r.push({path:i,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,r)=>{if(t){let n=ck(r.path,t)-ck(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function ck(e,t){let r=0,n=e.toLowerCase();a.basename(n).startsWith("agentdevicerunner.env.")&&(r-=1e3),n.includes(`${a.sep}macos${a.sep}`)&&(r-=5e3);let i=dz[dJ(t)].xctestrunHints[dZ(t.kind)];return i.preferred.length>0&&(i.preferred.some(e=>n.includes(e))?r+=2e3:r-=500),i.disallowed.some(e=>n.includes(e))&&(r-=2500),r}function cE(e,t){try{let r=o.readFileSync(e,"utf8"),n=new Set([t]);try{n.add(o.realpathSync(t))}catch{}for(let e of n)if(r.includes(e))return!0;return!1}catch{return!1}}async function cC(e,t,r,n={}){let i=n.iosXctestEnvDir?.trim(),s=i?a.resolve(i):a.dirname(e);o.mkdirSync(s,{recursive:!0});let l=r.replace(/[^a-zA-Z0-9._-]/g,"_"),d=a.join(s,`AgentDeviceRunner.env.${l}.json`),c=a.join(s,`AgentDeviceRunner.env.${l}.xctestrun`),u=await cR(e);return cT(u,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})}),cT(u,e=>Object.assign(e,d5),{requireTestBundlePath:!0}),await cO(u,d,c),{xctestrunPath:c,jsonPath:d}}async function cR(e){let t=await aa("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new eG("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 eG("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function cO(e,t,r){o.writeFileSync(t,JSON.stringify(e,null,2));let n=await aa("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new eG("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:r,stderr:n.stderr})}function cT(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=cL(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=cL(r,{requireTestBundlePath:!0});e&&t(e)}}function cL(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function c$(e,t,r,n){let i=cq(process.env),a=cG(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=cB(),l=[...d4],d=await ca(e);try{let d;await eB("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",cU(e),"1","-destination",(d=dJ(e),"macOS"===d?`platform=macOS,arch=${dY()}`:"simulator"===e.kind?`platform=${d} Simulator,id=${e.id}`:`generic/platform=${d}`),"-derivedDataPath",r,...s,...l,...i,...o,...a],{detached:!0,timeoutMs:n.buildTimeoutMs,onSpawn:e=>{d7.add(e),e.on("close",()=>{d7.delete(e)})},onStdoutChunk:e=>{db(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{db(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof eG?a:new eG("COMMAND_FAILED",String(a)),i=(e=r.details?JSON.stringify(r.details):"",((t=`${r.message}
11
+ ${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)??l7);throw new eG("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await d?.release()}}function cF(e,t){let r,i=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(i)return a.resolve(i);let o=(r=n.createHash("sha256").update(cA(cI(t))).digest("hex"),`cache-${r.slice(0,16)}`),s=function(e){return a.join(d2,"derived",dz[dJ(e)].derivedBaseName[dZ(e.kind)])}(e);return a.join(s,o)}function cU(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function cG(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 cq(e=process.env){let t=ct(e),r=cr(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function cB(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function cj(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,n;if(r=e,t=a.resolve(tY(),".tmp"),""===(n=a.relative(t,a.resolve(r)))||n.startsWith("..")||a.isAbsolute(n))throw new eG("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 ${a.join(tY(),".tmp")}.`})}}async function cV(e){var t,r;let n,i=(t=e.derived,r=e.expectedCacheMetadata,(n=function(e){try{let t=JSON.parse(o.readFileSync(a.join(e,d3),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?cA(cI(n))!==cA(cI(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:n}:{ok:!1,reason:"cache_metadata_missing"}),s=i.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(c_))||!cN(n.xctestrunPath,e)||!cM(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!cN(t.path,e)||!cM(t.path,t))return null;i.push(t.path)}return{xctestrunPath:n.xctestrunPath,productPaths:i}}(e.derived,i.metadata):null,l=s?.xctestrunPath??e.findXctestrun(e.derived);if(!l)return{reason:"missing_xctestrun",xctestrunPath:null};let d=s?.xctestrunPath===l,c=d?"manifest":"scan",u=d?s.productPaths:await e.resolveExistingXctestrunProductPaths(l);return u?e.xctestrunReferencesProjectRoot(l,e.projectRoot)||d?i.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:u,source:c}:{reason:i.reason,xctestrunPath:l,productPaths:u,source:c}:{reason:"project_root_mismatch",xctestrunPath:l,productPaths:u,source:c}:{reason:"missing_products",xctestrunPath:l,productPaths:[],source:c}}function cK(e,t,r){ef({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let cH={readOnly:!1,readinessProbe:!1,readinessPreflightSkipEligibleAfterHealthyMutation:!1},cW={...cH,readOnly:!0},cX={...cW,readinessProbe:!0},cz={...cH,readinessPreflightSkipEligibleAfterHealthyMutation:!0},cJ=Object.fromEntries(Object.entries({tap:"preflightSkippableTouchMutation",mouseClick:"default",longPress:"preflightSkippableTouchMutation",drag:"preflightSkippableTouchMutation",remotePress:"default",type:"default",swipe:"preflightSkippableTouchMutation",scroll:"preflightSkippableTouchMutation",desktopScroll:"preflightSkippableTouchMutation",findText:"readOnly",querySelector:"readOnly",readText:"readOnly",snapshot:"readOnly",screenshot:"readOnly",back:"default",backInApp:"default",backSystem:"default",home:"default",rotate:"default",rotateGesture:"default",transformGesture:"default",appSwitcher:"default",keyboardDismiss:"default",keyboardReturn:"default",alert:"readOnly",pinch:"default",sequence:"preflightSkippableTouchMutation",recordStart:"default",recordStop:"default",status:"readOnlyReadinessProbe",uptime:"readOnlyReadinessProbe",shutdown:"default"}).map(([e,t])=>[e,function(e){switch(e){case"default":return cH;case"readOnly":return cW;case"readOnlyReadinessProbe":return cX;case"preflightSkippableTouchMutation":return cz}}(t)]));function cZ(e){return cJ[e].readOnly}function cY(e){return cJ[e].readinessPreflightSkipEligibleAfterHealthyMutation}let cQ=process.pid,c0=eC(process.pid),c1=(t2=cQ,t3=c0,(t=n.createHash("sha256")).update(String(t2)),t.update("\0"),t.update(t3??"unknown-start"),`owner-${t2}-${t.digest("hex").slice(0,8)}`);function c2(t){e=t?.trim()||void 0}async function c3(e,t){let r=await ev({lockDirPath:`${ue(e)}.lock`,owner:{pid:cQ,startTime:c0,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await r()}}function c5(e){try{let a;var t,r,n=JSON.parse(o.readFileSync(ue(e),"utf8")),i=e;if(!n||"object"!=typeof n||Array.isArray(n)||1!==n.schemaVersion||n.deviceId!==i)return null;let s=(t=n,a={ownerToken:ut(t.ownerToken),ownerPid:un(t.ownerPid),sessionId:ut(t.sessionId),port:un(t.port),xctestrunPath:ut(t.xctestrunPath),jsonPath:ut(t.jsonPath),createdAtMs:(r=t.createdAtMs,"number"==typeof r&&Number.isFinite(r)?r:null)},Object.values(a).some(e=>null===e)?null:a);return s?{schemaVersion:1,deviceId:i,...s,ownerStartTime:ur(n.ownerStartTime),ownerStateDir:ur(n.ownerStateDir)??void 0,runnerPid:un(n.runnerPid)}:null}catch{return null}}function c4(e){var t;return e?e.ownerToken===c1?{type:"owned",lease:e}:eL((t=e).ownerPid)&&(!t.ownerStartTime||eC(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function c6(e,t,r){let n=c4(c5(e));if("empty"===n.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===n.type){var i,o,s,l,d;let c,u,p,f,m;if(i=n.lease,(c=c8())&&i.ownerStateDir&&a.resolve(c)===a.resolve(i.ownerStateDir))return void await ui(n.lease,"same-state-dir",t);if(o=n.lease,(s=r)&&"proxy"===s.leaseProvider&&s.leaseId&&s.clientId&&function(e,t){if(!e)return!1;if(e===t)return!0;let[,,r]=e.split(":",3);return r===t}(s.deviceKey,o.deviceId))return void await ui(n.lease,"logical-lease-takeover",t);throw new eG("COMMAND_FAILED",r?`iOS runner for ${e} is busy after device lease admission`:`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,logicalLeaseContext:r,ownerPid:n.lease.ownerPid,ownerStartTime:n.lease.ownerStartTime,ownerStateDir:n.lease.ownerStateDir,ownerToken:n.lease.ownerToken,sessionId:n.lease.sessionId,hint:(l=n.lease,d=r,u=`PID ${l.ownerPid}`,p=l.ownerStateDir?` with AGENT_DEVICE_STATE_DIR=${l.ownerStateDir}`:"",m=(f=c8())&&f!==l.ownerStateDir?` Current daemon state dir is ${f}.`:"",d?`The device is busy because another active device lease owns it, or the runner is owned by another daemon/process after lease admission. Runner owner: ${u}${p}.${m} Retry after the owning session closes or after the five-minute inactivity lease expires. If this persists after expiry, inspect the runner owner details and clean the stale daemon state on the machine with simulator access.`:`Runner owner details: ${u}${p}.${m} Retry after the owning runner finishes. Do not run prepare ios-runner from another daemon/client to recover this; a live foreign runner lease cannot be released by the remote client.`)})}await ui(n.lease,n.type,t)}function c8(){return e||process.env.AGENT_DEVICE_STATE_DIR?.trim()||void 0}async function c9(e,t){let r=c4(c5(e));"owned"===r.type&&await ui(r.lease,"owned",t)}function c7(e){e&&function(e){let t=c5(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{o.unlinkSync(ue(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function ue(e){let t;return a.join((t=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim())?a.resolve(t):a.join(p.homedir(),".agent-device","ios-runner","leases"),`${e.replaceAll(/[^A-Za-z0-9._-]/g,"-")||"unknown-device"}.json`)}function ut(e){return"string"==typeof e&&e.length>0?e:null}function ur(e){return"string"==typeof e?e:null}function un(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function ui(e,t,r){ef({level:"stale"===t||"same-state-dir"===t||"logical-lease-takeover"===t?"warn":"debug",phase:"ios_runner_lease_cleanup",data:{deviceId:e.deviceId,ownerPid:e.ownerPid,ownerStateDir:e.ownerStateDir,ownerToken:e.ownerToken,runnerPid:e.runnerPid,sessionId:e.sessionId,reason:t}}),await r.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGTERM"),await r.cleanupRunnerXcodebuildProcesses(e.deviceId,e.ownerToken),await r.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGKILL"),r.cleanupTempFile(e.xctestrunPath),r.cleanupTempFile(e.jsonPath),c7(e)}let ua={cleanupRunnerProcessTree:ug,cleanupRunnerXcodebuildProcesses:uv,cleanupTempFile:dM};async function uo(e,t={}){var r;!1!==t.graceful?await uc(e):await ug(e.child.pid,"SIGTERM"),await uu(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(um(r)||eO(r))&&await ug(e.child.pid,"SIGKILL"),await up(e)}async function us(e){await c9(e,ua)}async function ul(e){let t=Array.from(d7);await uh(e,"SIGINT"),await uw(t,"SIGINT"),await uh(e,"SIGTERM"),await uw(t,"SIGTERM"),await uh(e,"SIGKILL"),await uw(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await up(e)}))}async function ud(){let e=Array.from(d7);await Promise.allSettled(e.map(async e=>{try{await ug(e.pid,"SIGTERM"),await ug(e.pid,"SIGKILL")}finally{d7.delete(e)}}))}async function uc(e){try{await dl(e.device,e.port,di({command:"shutdown"}),void 0,15e3)}catch{await ug(e.child.pid,"SIGTERM")}}async function uu(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function up(e){await uf(e.device),dM(e.xctestrunPath),dM(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{c7(e.lease)}}async function uf(e){"simulator"===e.kind&&await Promise.allSettled(cn.map(async t=>{try{await ao(l8(e,["terminate",e.id,t]),{allowFailure:!0,timeoutMs:2e3})}catch(r){ef({level:"warn",phase:"ios_runner_simulator_app_terminate_failed",data:{deviceId:e.id,bundleId:t,timeoutMs:2e3,error:r instanceof Error?r.message:String(r)}})}}))}function um(e){return!!e&&eL(e)}async function uh(e,t){await Promise.allSettled(e.map(async e=>{await ug(e.child.pid,t)}))}async function uw(e,t){await Promise.allSettled(e.map(async e=>{await ug(e.pid,t),"SIGKILL"===t&&d7.delete(e)}))}async function ug(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 aa("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function uv(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${uy(e)}-${uy(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${uy(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await aa("pkill",[`-${t}`,"-f",r],{allowFailure:!0,timeoutMs:2e3})}catch(r){ef({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:t,error:r instanceof Error?r.message:String(r)}})}}function uy(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function uS(e){let t=await uI(e.logPath);return t?new eG(t.code??e.error.code,e.error.message,{...e.error.details??{},hint:"string"==typeof e.error.details?.hint?`${e.error.details.hint} ${t.hint}`:t.hint,runnerFailureReason:t.reason},e.error):e.error}async function uI(e){if(!e)return;let t=await uA(e,65536);if(t){var r,n;let e;return(r=e=t.toLowerCase()).includes("axruntime")&&r.includes("coretext")&&(r.includes("attributesforelement")||r.includes("axuielementcopymultipleattributevalues")||r.includes("reconstitutedsmuggledctfontfromdictionary")||r.includes("reconstitutedsmuggledattributedstringfromdictionary"))?{code:"IOS_TARGET_APP_CRASH",reason:"target_app_axruntime_coretext_crash",hint:"The target iOS app appears to have crashed while XCTest/AXRuntime read accessibility attributes. This is usually a simulator/XCTest/runtime or app accessibility payload issue, not a text-entry failure. Reproduce on the latest stable simulator runtime, reinstall the app, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime."}:(n=e).includes("process crashed")||n.includes("the application under test")||n.includes("terminated unexpectedly")||n.includes("exception type:")&&n.includes("thread 0 crashed")?{code:"IOS_TARGET_APP_CRASH",reason:"target_app_crash",hint:"The target iOS app appears to have crashed while the runner was executing the command. Reopen or reinstall the app, retry on a fresh/latest stable simulator runtime, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime."}:void 0}}async function uA(e,t){let r;try{let n=await g.stat(e),i=Math.max(0,n.size-t),a=n.size-i;if(a<=0)return;r=await g.open(e,"r");let o=Buffer.alloc(a);return await r.read(o,0,a,i),o.toString("utf8")}catch{return}finally{await r?.close().catch(()=>{})}}let ub=new Map,u_=new Map;async function ux(e,t){return await lU(u_,e.id,async()=>{let r=ub.get(e.id);if(r){let t=await uN(e,r);if(t)return t}return await c3(e.id,async()=>await uM(e,t))})}async function uM(e,t){var r,n;let i,s,l,d={},c=function(e,t){if(!e)return;let r=Object.entries({leaseId:uW(e.leaseId),clientId:uW(e.clientId),tenantId:uW(e.tenantId),runId:uW(e.runId),leaseProvider:uW(e.leaseProvider),deviceKey:uW(e.deviceKey)??t}).filter(([,e])=>void 0!==e);return r.length>0?Object.fromEntries(r):void 0}(t.runnerLeaseContext,e.id);ef({level:"debug",phase:"ios_runner_session_startup",data:{deviceId:e.id,logicalLeaseContext:c}}),await uH(d,"cleanup_stale_xcodebuild",async()=>{await c6(e.id,ua,c)}),await uH(d,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(ef({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):uL(t))}),await uH(d,"verify_developer_mode",async()=>{await u$(e)}),t.cleanStaleBundles?await uH(d,"cleanup_stale_bundles",async()=>{await uP(e)}):(d.cleanup_stale_bundles=0,ef({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let u=await uH(d,"ensure_xctestrun",async()=>await cc(e,t));d.build_xctestrun=u.buildMs;let p=await uH(d,"allocate_port",async()=>await dA()),{xctestrunPath:f,jsonPath:m}=await uH(d,"prepare_xctestrun_env",async()=>await cC(u.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(p)},`session-${e.id}-${c1}-${p}`,{iosXctestEnvDir:t.iosXctestEnvDir})),h=await uH(d,"simulator_set_redirect",async()=>await ca(e)),w=["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",cU(e),"1","-destination-timeout",String(20),"-xctestrun",f,"-derivedDataPath",u.derived,"-destination","macOS"===(l=dJ(e))?`platform=macOS,arch=${dY()}`:"simulator"===e.kind?`platform=${l} Simulator,id=${e.id}`:`platform=${l},id=${e.id}`];try{({child:i,wait:s}=await uH(d,"launch_xcodebuild",()=>eq("xcodebuild",w,{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(p)},detached:!0})))}catch(e){throw await h?.release(),e}i.stdout?.on("data",e=>{db(e,t.logPath,t.traceLogPath,t.verbose)}),i.stderr?.on("data",e=>{db(e,t.logPath,t.traceLogPath,t.verbose)});let g=`${e.id}:${p}:${Date.now()}`,v={schemaVersion:1,deviceId:(r={deviceId:e.id,sessionId:g,runnerPid:i.pid,port:p,xctestrunPath:f,jsonPath:m}).deviceId,ownerToken:c1,ownerPid:cQ,ownerStartTime:c0,ownerStateDir:c8(),sessionId:r.sessionId,runnerPid:r.runnerPid??null,port:r.port,xctestrunPath:r.xctestrunPath,jsonPath:r.jsonPath,createdAtMs:Date.now()},y={sessionId:g,device:e,deviceId:e.id,port:p,xctestrunPath:f,xctestrunArtifact:u,jsonPath:m,testPromise:s,child:i,ready:!1,startupTimeoutMs:"number"==typeof(n=t.startupTimeoutMs)&&Number.isFinite(n)&&n>0?Math.floor(n):void 0,startupTimings:d,logicalLeaseContext:c,simulatorSetRedirect:h??void 0,lease:v};try{let e,t;e=ue(v.deviceId),o.mkdirSync(a.dirname(e),{recursive:!0}),t=`${e}.${process.pid}.${Date.now()}.tmp`,o.writeFileSync(t,JSON.stringify(v,null,2),"utf8"),o.renameSync(t,e)}catch(t){throw await uC(e.id,y,{graceful:!1,waitTimeoutMs:1e3}),t}return ub.set(e.id,y),y}async function uN(e,t){if(!um(t.child.pid))return await uH({},"stop_stale_session",async()=>{await uC(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=t.xctestrunArtifact;if(r?.cache==="external")return ef({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,cache:r.cache,logicalLeaseContext:t.logicalLeaseContext}}),t;let n=cF(e,cg(e));return r?.derived!==n?(ef({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:r?.derived,expectedDerived:n}}),await uH({},"stop_stale_artifact_session",async()=>{await uC(e.id,t)}),null):(ef({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,logicalLeaseContext:t.logicalLeaseContext}}),t)}async function uP(e){if("simulator"===e.kind)for(let t of cn){let r=await uD(e,t);if(!r||function(e){if(0===e.exitCode)return!0;let t=`${e.stdout}
12
+ ${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 uD(e,t){try{return await ao(l8(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(r){ef({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 uk(e){let t=ub.get(e);return t?{sessionId:t.sessionId,alive:um(t.child.pid)}:null}async function uE(e,t){await lU(u_,e.deviceId,async()=>{ub.get(e.deviceId)===e&&(ef({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await uC(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function uC(e,t,r={}){let n=t??ub.get(e);n&&(await uo(n,r),ub.get(e)===n&&ub.delete(e))}async function uR(e){await lU(u_,e,async()=>{await c3(e,async()=>{await uC(e),await us(e)})})}async function uO(){let e=Array.from(ub.values());for(let t of(await ul(e),e))ub.get(t.deviceId)===t&&ub.delete(t.deviceId)}async function uT(){await uO();let e=Array.from(ub.keys());await Promise.allSettled(e.map(async e=>{await uR(e)})),await ud()}async function uL(e){await ao(l8(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}async function u$(e){if("ios"!==e.platform||"device"!==e.kind)return;let t=await aa("DevToolsSecurity",["-status"],{allowFailure:!0,timeoutMs:2e3}),r=`${t.stdout}
13
+ ${t.stderr}`;if(/developer mode is currently disabled/i.test(r))throw new eG("COMMAND_FAILED","Developer mode is disabled for Apple development tools",{hint:"Run `sudo DevToolsSecurity -enable`, then retry the iOS runner. UI test runners start suspended until Xcode/testmanagerd can attach.",devToolsSecurityStatus:r.trim()})}function uF(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eG("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new eG("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function uU(e,t,r,n,i,a){var o,s,l,d,c,u;let p;o=t,s=r.command,o.startupTimingsReported||!o.startupTimings||(o.startupTimingsReported=!0,ef({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,logicalLeaseContext:o.logicalLeaseContext,timings:o.startupTimings}}));let f=di(r),m=cZ(f.command),h=tl.fromTimeoutMs(i),w=function(e,t){let r=cZ(t.command);if(!e.ready)return r?{action:"skip",reason:"read_only_startup_command"}:{action:"run",reason:"startup"};if(cJ[t.command].readinessProbe)return{action:"skip",reason:"readiness_probe_command"};if(!cY(t.command))return{action:"run",reason:"conservative_command"};let n=e.lastHealthyMutation;if(!n)return{action:"run",reason:"no_recent_healthy_mutation"};if(t.appBundleId!==n.appBundleId)return{action:"run",reason:"app_activation_uncertain"};let i=Date.now()-n.atMs;return i>5e3?{action:"run",reason:"healthy_mutation_stale",lastHealthyMutationAgeMs:i}:{action:"skip",reason:"recent_healthy_mutation",lastHealthyMutationAgeMs:i}}(t,f);"run"===w.action?await uB({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,signal:a,decision:w}):(l=f,d=t,c=w,ef({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:l.command,commandId:l.commandId,reason:c.reason,lastHealthyMutationAgeMs:"recent_healthy_mutation"===c.reason?c.lastHealthyMutationAgeMs:void 0,sessionReady:d.ready}}));try{p=await uq({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,timeoutMs:i,signal:a,readOnlyCommand:m})}catch(e){throw uG(e,t,w)}try{let e=await uj(p,t,n),r=function(e){if(!0===e.runnerFatal)return"string"==typeof e.runnerFatalReason&&e.runnerFatalReason.trim().length>0?e.runnerFatalReason:"runner_reported_fatal_response"}(e);return r?(t.lastHealthyMutation=void 0,await uE(t,r)):cY(f.command)&&(t.lastHealthyMutation={atMs:Date.now(),appBundleId:f.appBundleId}),e}catch(r){let e=function(e){if(e instanceof eG){if("IOS_AX_SNAPSHOT_FAILED"===e.code)return"ax_snapshot_failure";if("XCTEST_RECORDED_FAILURE"===e.code)return"xctest_recorded_failure"}}(r);if(e)throw t.lastHealthyMutation=void 0,await uE(t,e),r;if((u=r)instanceof eG&&u.details?.runner!==void 0)throw r;throw uG(r,t,w)}}function uG(e,t,r){return"skip"!==r.action||"recent_healthy_mutation"!==r.reason?e:(t.lastHealthyMutation=void 0,uV(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:r.reason,runnerReadinessPreflightSkippedAgeMs:r.lastHealthyMutationAgeMs}))}async function uq(e){let{device:t,session:r,runnerCommand:n,logPath:i,deadline:a,timeoutMs:o,signal:s,readOnlyCommand:l}=e,d=a.remainingMs();if(d<=0)throw new eG("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:o});let c=l?{command:n.command,commandId:n.commandId,readOnly:!0,sessionReady:r.ready,timeoutMs:d}:{command:n.command,commandId:n.commandId};return await eu("ios_runner_command_send",async()=>l?await dl(t,r.port,n,i,d,r,s):await dm(t,r.port,n,d,s),c)}async function uB(e){let{device:t,session:r,runnerCommand:n,logPath:i,deadline:a,signal:o,decision:s}=e,l=r.ready?Math.min(1e3,a.remainingMs()):Math.min(uK(r),a.remainingMs());try{let e=await eu("ios_runner_readiness_preflight",async()=>await dl(t,r.port,di({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:r.ready,timeoutMs:l});await uj(e,r,i)}catch(e){throw uV(e,{runnerReadinessPreflightFailed:!0})}}async function uj(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new eG("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?e$(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 await uS({error:new eG(t,i??"Runner error",{runner:n,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,logPath:r}),logPath:r})}if(t.ready=!0,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&&ef({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 uV(e,t){let r=e instanceof eG?e:new eG("COMMAND_FAILED",e instanceof Error?e.message:String(e),void 0,e);return new eG(r.code,r.message,{...r.details??{},...t},r.cause??e)}function uK(e){return e.startupTimeoutMs??45e3}async function uH(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,ef({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}function uW(e){return"string"==typeof e&&e.trim().length>0?e.trim():void 0}let uX=new w;function uz(e,t={}){return{runCommand:e,...t}}function uJ(e,t,r,n={}){if(r)return uY(r);let i=function(e,t={}){let r=uX.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?uY(i.provider):uY(t)}async function uZ(e,t,r){if(!e)return await r();let n={provider:uY(e),deviceId:t.deviceId,requestId:t.requestId};return await uX.run(n,r)}function uY(e){return"function"==typeof e?{runCommand:e}:e}async function uQ(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await u2(t,r,n,i,a,o);return await u0(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function u0(e,t){var r,n,i,a;if(!e)return await u1(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,u4({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,u4({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await u1(t,e.reason,e.lifecycleState,e.error)}async function u1(e,t,r,n){throw u4({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 u2(e,t,r,n,i,a){var o,s,l,d,c,u,p,f,m,h,w,g;let v,y,S,I,A;if("status"===r.command||!r.commandId?.trim())return;let b=u5(n);try{v=await uU(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return ef({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:r.command,commandId:r.commandId,error:e instanceof Error?e.message:String(e),...b}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let _="string"==typeof v.lifecycleState?v.lifecycleState:"";return ef({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:_,...b}}),o=v,s=_,l=r,d=n,c=i,"completed"===s?function(e,t,r,n){var i,a;let o=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(o)return{type:"recovered",data:o,reason:"completed_with_retained_response",lifecycleState:"completed"};if(cZ(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let s=u5(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new eG("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",...s,hint:(i=t.command,a=s,`${u3(a)}The runner is still reachable and reports "${i}" 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.`),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,y="string"==typeof u.lifecycleErrorCode?u.lifecycleErrorCode:void 0,S="string"==typeof u.lifecycleErrorMessage?u.lifecycleErrorMessage:"Runner command failed",I="string"==typeof u.lifecycleErrorHint?u.lifecycleErrorHint:void 0,A=u5(f),new eG(e$(y),S,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...A,hint:I??(h=p.command,w=A,`${u3(w)}The runner is still reachable and reports "${h}" 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.`),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){var i,a,o;if(cZ(t.command))return r;let s=u5(r);return new eG("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",...s,hint:(i=t.command,a=e,o=s,`${u3(o)}The runner is still reachable and reports "${i}" is ${a}, 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.`),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 eG("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:(g=l.command,`The runner did not confirm that "${g}" 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 u3(e){return!0!==e.readinessPreflightSkipped?"":"This hot command skipped the uptime preflight because the runner had just completed a healthy interaction; status recovery confirmed the runner still observed it. "}function u5(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}function u4(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;ef({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}})}async function u6(e,t){let r;da(t.requestId);let n=r_(t.requestId),i=di({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await u8({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new eG("COMMAND_FAILED","iOS runner prepare failed")}async function u8(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await ux(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles}),d=Date.now()-s;try{var c,u;let e=await pi(t,l,r,n,i,d,{recoveryReason:o});return{kind:"prepared",result:(c=t,u=e,pa(c,u),u)}}catch(e){return await u9({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function u9(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:d}=e,c=d instanceof eG?d:new eG("COMMAND_FAILED",String(d));if(1===l&&(t=c,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&pt(t)))return{kind:"prepared",result:await u7({device:n,session:i,command:a,options:o,signal:s,error:c})};if(!pt(c))throw d;let u=c.message||"runner_health_failed";if(l>=2)throw await pe(i,"prepare_runner_health_failed"),d;return da(o.requestId),await uE(i,"prepare_runner_health_retry"),ef({level:"warn",phase:"ios_runner_prepare_health_retry",data:{command:a.command,commandId:a.commandId,sessionId:i.sessionId,attempt:l,maxAttempts:2,reason:u}}),{kind:"retry",recoveryReason:u}}async function u7(e){var t,r,n,i,a;let{device:o,session:s,command:l,options:d,signal:c,error:u}=e,p=u.message||"runner_health_failed";await uE(s,"prepare_cached_runner_health_failed"),await cS(s.xctestrunArtifact,p);let f=Date.now(),m=await ux(o,{...d,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await pi(o,m,l,d,c,h,{recoveryReason:p});return ef({level:"info",phase:"ios_runner_prepare_bad_cache_recovered",data:{command:l.command,commandId:l.commandId,sessionId:m.sessionId,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,reason:p}}),t=o,r=e,pa(t,r),r}catch(r){let e;await pe(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof eG?n:new eG("COMMAND_FAILED",String(n)),new eG(e.code,"artifact restored but runner did not connect",{...e.details??{},restoredFailureReason:a,xctestrunPath:i.xctestrunArtifact?.xctestrunPath,artifact:i.xctestrunArtifact?.artifact,cache:i.xctestrunArtifact?.cache,reason:e.message},e));throw pa(o,{cache:m.xctestrunArtifact?.cache,artifact:m.xctestrunArtifact?.artifact,buildMs:m.xctestrunArtifact?.buildMs,connectMs:h,healthCheckMs:0,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,failureReason:t.message}),t}}async function pe(e,t){try{await uE(e,t)}catch{}}function pt(e){let t;return!rN(e)&&(de(e)||dt(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function pr(e,t,r){let n;da(r.requestId);let i=r_(r.requestId);try{let a=(n=await ux(e,r)).ready?45e3:uK(n);return await uU(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof eG?o:new eG("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&dt(a)&&n)return da(r.requestId),await pn({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&&(de(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return da(r.requestId),await pn({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&&de(a))return await uQ({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:uE});throw o}}async function pn(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await uE(e.session,a);let o=await ux(t,{...n,cleanStaleBundles:!0});try{let a=await uU(t,o,r,n.logPath,45e3,i);return e.recoveredDiagnosticPhase&&ef({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 eG?a:new eG("COMMAND_FAILED",String(a));if(de(e))return await uQ({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:uE});throw a}}async function pi(e,t,r,n,i,a,o){var s,l,d,c,u;let p,f,m=Date.now();return s=await uU(e,t,r,n.logPath,n.healthTimeoutMs,i),l=t,d=a,c=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,d),healthCheckMs:Math.max(0,c),xctestrunPath:p.xctestrunPath,...f}:{runner:s,connectMs:Math.max(0,d),healthCheckMs:Math.max(0,c),...f}}function pa(e,t){ef({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 po(e,t,r={}){uF(e),da(r.requestId);let n=di(t),i=pd(e,r);return cZ(n.command)?ts(()=>(da(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(da(r.requestId),de(e))}):i.runCommand(e,n,r)}function ps(e,t={}){if("ios"!==e.platform)return;let{propagateError:r=!1,...n}=t,i=pd(e,n);return i.prewarm?i.prewarm(e,n).then(()=>{}).catch(t=>{if(ef({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}}),r)throw t}):void ef({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function pl(e,t){uF(e),da(t.requestId);let r=di({command:"uptime"}),n=pd(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 pd(e,t){return uJ(e,pc,void 0,{requestId:t.requestId})}let pc=uz(pr,{prepare:u6,prewarm:async(e,t)=>{await u6(e,{...t,healthTimeoutMs:45e3})}});async function pu(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function pp(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 pf(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 pm(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new eG("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function ph(e,t){let r=(await t0(tm(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function pw(e,t){var r,n;let i;pm(t);let a=await ph(e,t),o=t0(tm(e)),s=await tv(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 pg(e,t,r,n,i){let a,o,s="recovering",l=!1,d=(async()=>{try{for(;!l;){let d=await ph(e,t);if(!d){s="recovering",await e8(1e3);continue}let c=tQ(tm(e)),u=tp(c,{pid:d});a=u;let p=pp(r,{redactionPatterns:n});if(o=pf(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&rf(i,u.pid),s="active",await o,rm(i),a=void 0,o=void 0,l)break;s="recovering",await e8(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),rm(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:d,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await pu(o),a&&!a.killed&&a.kill("SIGKILL"),await pu(d),rm(i)}}}function pv(e,t){let r=pI(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=pI(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 py(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=l6(["spawn",t,"log","show","--style","compact","--info","--predicate",pv(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 ao(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 pS(e,t,r,n,i,a){let o=await pA({deviceId:e,appBundleId:t,simulatorSetPath:i});return px({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return l6(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",pv(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function pI(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function pA(e){let{deviceId:t,appBundleId:r,simulatorSetPath:n}=e,i=await ao(l6(["get_app_container",t,r,"app"],{simulatorSetPath:n}),{allowFailure:!0,timeoutMs:4e3});if(0!==i.exitCode)return;let o=i.stdout.trim();if(!o)return;let s=a.join(o,"Info.plist"),l=await ej("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function pb(e,t,r,n){return px({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",pv(e)],stream:t,redactionPatterns:r,pidPath:n})}async function p_(e,t,r,n){return px({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function px(e){let t="active",r=eq(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=pp(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&rf(e.pidPath,n.pid);let a=pf(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),rm(e.pidPath),r),r=>{throw t="failed",rm(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await pu(a),n.killed||n.kill("SIGKILL"),await pu(a),rm(e.pidPath)}}}let pM=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),pN=/https?:\/\/[^\s"'<>\])]+/i,pP=[/\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 pD(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>pE(e)));for(let e of t.entries){let t=pE(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function pk(e,t){let r=pq(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=pq(t?.maxPayloadChars,2048,64,16384),o=pq(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=p$(s,["method","httpMethod"]),d=p$(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=pM.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=pN.exec(o),h=d??m?.[0];if(!h)return null;let w=c??pR(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:pO(o),packetId:pT(o)??void 0,durationMs:pL(o)??void 0,raw:pG(o,a),line:r};if("android"===n&&function(e,t,r){let n=pC(t,r,5),i=e.packetId??n.map(e=>pT(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?pC(t,r,12).filter(e=>pT(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>pO(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>pR(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>pL(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 pU(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=pG(e,a))}if("body"===i||"all"===i){let e=pF(o,s,["requestBody","body","payload","request"]),t=pF(o,s,["responseBody","response"]);e&&(g.requestBody=pG(e,a)),t&&(g.responseBody=pG(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 pE(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function pC(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 pR(e){for(let t of pP){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function pO(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 pT(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function pL(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 p$(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 pF(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return pU(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 pU(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function pG(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function pq(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let pB={start:async e=>await pY(e)},pj=i3(pB,function(e={}){return{...pB,...e}});async function pV(e,t){return await pj.run(e,t)}function pK(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 pH(e){let t=a.dirname(e);o.existsSync(t)||o.mkdirSync(t,{recursive:!0}),function(e,t){if(o.existsSync(e)&&!(o.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}`;o.existsSync(t)&&(o.existsSync(n)&&o.unlinkSync(n),o.renameSync(t,n))}}(e,{maxBytes:pK("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:pK("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function pW(e){if(!o.existsSync(e))return{exists:!1,sizeBytes:0};let t=o.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}function pX(e){return"macos"===e.platform?"macos":"ios"===e.platform?"device"===e.kind?"ios-device":"ios-simulator":"android"}async function pz(e){var t,r,n,i;let a,s,l,d,{device:c,appBundleId:u,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v}=e,y=pX(c),S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},a=pq(t?.maxEntries,25,1,200),s=t?.include??"summary",l=pq(t?.maxPayloadChars,2048,64,16384),d=pq(t?.maxScanLines,4e3,100,2e4),o.existsSync(m)?pk(o.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:a,maxPayloadChars:l,maxScanLines:d}}),I=[],A=await pJ({device:c,appBundleId:u,appLogPath:m,appLogState:p});if(A){let e=await pw(c.id,u);if(e){let t=pk(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=pD(t,S,h),I.push((r=A,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 pQ({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=pD(e.dump,S,h),I.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&&I.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?I.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===I.length&&("ios"===c.platform&&"simulator"===c.kind?I.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."):I.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===S.entries.length&&I.push("ios"===(i=c).platform&&"simulator"===i.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"===i.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:I}}async function pJ(e){let{device:t,appBundleId:r,appLogPath:n,appLogState:i}=e;if("android"!==t.platform||!r)return null;if(void 0!==i&&"active"!==i)return{reason:"inactive"};if("active"!==i)return null;let s=function(e){let t=function(e){if(!e||!o.existsSync(e))return null;try{return rp(o.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}(a.join(a.dirname(n),ru));if(!s)return null;let l=await ph(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function pZ(e,t,r,n){return await pj.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function pY({device:e,appBundleId:t,outPath:r,pidPath:n}){pH(r);let i=o.createWriteStream(r,{flags:"a"}),a=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 p_(e.id,i,a,n):await pS(e.id,t,i,a,e.simulatorSetPath,n);if("android"===e.platform)return pm(t),await pg(e.id,t,i,a,n);if("macos"===e.platform)return await pb(t,i,a,n);throw i.end(),new eG("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function pQ(e){let t=await py({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:pk(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 p0(e){await e.stop(),await pu(e.wait)}async function p1(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 ti(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await ti(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 ao(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await ao(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await ej("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function p2(e,t){pH(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
16
+ `;o.appendFileSync(e,r,"utf8")}function p3(e){let t=a.dirname(e),r=a.basename(e);o.existsSync(t)||o.mkdirSync(t,{recursive:!0}),o.existsSync(e)?o.truncateSync(e,0):o.writeFileSync(e,"","utf8");let n=0;for(let e of o.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let i=e.slice(r.length+1);if(/^\d+$/.test(i))try{o.unlinkSync(a.join(t,e)),n+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:n}}function p5(e,t){for(let r of e){if(t(r))return r;let e=p5(r.children,t);if(e)return e}}function p4(e,t){let r=[];for(let n of e)t(n)&&r.push(n),r.push(...p4(n.children,t));return r}function p6(e,t){let r=p5(e,e=>"schema"===e.name&&e.attributes.name===t);return r?r.children.filter(e=>"col"===e.name).map(e=>{let t;return t=e.children.find(e=>"mnemonic"===e.name),t?.text??null??""}):[]}function p8(e){if(!e||e.children.some(e=>"sentinel"===e.name)||!e.text)return null;let t=Number(e.text);return Number.isFinite(t)?t:null}function p9(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.numberValue??null:p8(e):null}function p7(e){return Math.round(10*e)/10}async function fe(e,t){let r=["devicectl",...e],n=await ao(r,{allowFailure:!0,timeoutMs:2e4});if(0===n.exitCode)return;let i=String(n.stdout??""),a=String(n.stderr??"");throw new eG("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:r,exitCode:n.exitCode,stdout:i,stderr:a,deviceId:t.deviceId,hint:fa(i,a)??fi})}async function ft(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 fn(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"})),i5(r,t)}async function fr(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 fn(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 fn(e,t){let r=a.join(p.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=[...t.args,"--json-output",r],i=await ao(n,{allowFailure:!0,timeoutMs:2e4});try{if(0!==i.exitCode){let r=String(i.stdout??""),a=String(i.stderr??"");throw new eG("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:n,exitCode:i.exitCode,stdout:r,stderr:a,deviceId:e.id,hint:fa(r,a)??fi})}return JSON.parse(await l.readFile(r,"utf8"))}catch(r){if(r instanceof eG)throw r;throw new eG("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await l.unlink(r).catch(()=>{})}}let fi="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function fa(e,t){let r=`${e}
17
+ ${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}async function fo(e,t){try{let r=await as(e),n=r?.[t];if("string"==typeof n&&n.length>0)return n}catch{}try{let r=await aa("plutil",["-extract",t,"raw","-o","-",e],{allowFailure:!0});if(0===r.exitCode){let e=String(r.stdout??"").trim();if(e.length>0)return e}}catch{}try{var r,n;let i;return r=await l.readFile(e,"utf8"),n=t,dO(dR(r),(e,t)=>{void 0===i&&e===n&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}let fs="xctrace-animation-hitches";function fl(e,t){let r=dR(e),n=p6(r,t);return{rows:0===n.length?[]:p4(r,e=>"row"===e.name),schema:n}}function fd(e,t){for(let r of e)fd(r.children,t),r.attributes.id&&t.set(r.attributes.id,{numberValue:p8(r),process:fc(r)})}function fc(e){if(!e||e.children.some(e=>"sentinel"===e.name))return null;let t=p8(p5(e.children,e=>"pid"===e.name)),r=(e.attributes.fmt??"").replace(/\s+\(\d+\)$/,"").trim();return null===t&&0===r.length?null:{pid:t??void 0,name:r.length>0?r:void 0}}let fu="ps-process-snapshot",fp="ps-process-snapshot",ff="xctrace-activity-monitor",fm="xctrace-activity-monitor",fh="leaks-output-graph",fw="Memory graph captured with leaks --outputGraph for host-visible Apple app processes.";async function fg(e,t){if("ios"===e.platform&&"device"===e.kind)return await fL(e,t);let r=await fT(e,t),n=await fB(e,r);if(0===n.length)throw new eG("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf."});let i=new Date().toISOString();return fX({usagePercent:n.reduce((e,t)=>e+t.cpuPercent,0),residentMemoryKb:n.reduce((e,t)=>e+t.rssKb,0),measuredAt:i,matchedProcesses:[r.executableName],cpuMethod:fu,memoryMethod:fp})}async function fv(e,t,r){let n,i=fx(e);if(!i.memgraph)return{available:!1,kind:"memgraph",reason:i.reason,hint:i.hint,support:i};let o=await fV(e,t,i);if(!1===o.available)return o;let{process:s}=o;await l.mkdir(a.dirname(r),{recursive:!0});let d=await fS(r);try{n=await fy(e,r,s.pid)}catch(n){throw await fI(r,d),function(e,t,r,n,i){if(i instanceof eG){let o=i.details??{};return new eG(i.code,`Failed to capture Apple memgraph for ${t}`,{...o,kind:"memgraph",appBundleId:t,pid:r.pid,processName:a.basename(fW(r.command)),path:n,hint:fK(e,"string"==typeof o.stdout?o.stdout:"","string"==typeof o.stderr&&o.stderr.length>0?o.stderr:i.message)},i)}return new eG("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:r.pid,processName:a.basename(fW(r.command)),path:n,hint:"Retry perf memory snapshot. If it still fails, run with --debug and inspect leaks output."},i)}(e,t,s,r,n)}if(0!==n.exitCode)throw await fI(r,d),new eG("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:s.pid,processName:a.basename(fW(s.command)),path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:fK(e,n.stdout,n.stderr)});let c=await l.stat(r).catch(()=>null);if(!c?.isFile()||c.size<=0)throw await fI(r,d),new eG("COMMAND_FAILED","Apple memgraph artifact is missing or empty",{kind:"memgraph",appBundleId:t,pid:s.pid,path:r,hint:"Retry with a writable --out path. If the file is still empty, run with --debug and inspect leaks output."});return{available:!0,kind:"memgraph",path:r,sizeBytes:c.size,measuredAt:new Date().toISOString(),method:fh,appBundleId:t,pid:s.pid,processName:a.basename(fW(s.command)),support:i}}async function fy(e,t,r){return"macos"===e.platform?await aa("leaks",[`--outputGraph=${t}`,String(r)],{allowFailure:!0,timeoutMs:12e4}):await ao(l8(e,["spawn",e.id,"leaks",`--outputGraph=${t}`,String(r)]),{allowFailure:!0,timeoutMs:12e4})}async function fS(e){return await l.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function fI(e,t){t||await l.rm(e,{force:!0}).catch(()=>{})}async function fA(e,t){var r;let n,i,o,s,l,d;if("ios"!==e.platform||"device"!==e.kind)throw new eG("COMMAND_FAILED","Apple frame-health sampling is currently available only on connected iOS devices.",{metric:"fps",platform:e.platform,deviceKind:e.kind});let u=await f$(e,t),p=await fM(e,t,u);return n=fl((r={hitchesXml:p.hitchesXml,frameLifetimesXml:p.frameLifetimesXml,displayInfoXml:p.displayInfoXml,processIds:u.map(e=>e.pid),processNames:ri(u.map(e=>a.basename(c(e.executable)))),windowStartedAt:p.windowStartedAt,windowEndedAt:p.windowEndedAt,measuredAt:p.windowEndedAt}).frameLifetimesXml,"hitches-frame-lifetimes").rows.length,i=function(e){if(!e)return;let{rows:t,schema:r}=fl(e,"device-display-info"),n=r.indexOf("max-refresh-rate");if(n<0)return;let i=new Map;for(let e of t){fd(e.children,i);let t=p9(e.children[n],i);if(null!==t&&t>0)return t}}(r.displayInfoXml),s=(o=(function(e){let t,r,n=dR(e),i=Object.values(r={start:(t=p6(n,"hitches")).indexOf("start"),duration:t.indexOf("duration"),process:t.indexOf("process"),isSystem:t.indexOf("is-system")}).every(e=>e>=0)?r:null;if(!i)return[];let a=new Map;return p4(n,e=>"row"===e.name).map(e=>(function(e,t,r){var n,i,a;let o;if(fd(e.children,r),!0===(n=e.children[t.isSystem],null===(o=p9(n,r))?null:0!==o))return null;let s=p9(e.children[t.start],r),l=p9(e.children[t.duration],r);if(null===s||null===l)return null;let d=(i=e.children[t.process],a=r,i?i.attributes.ref?a.get(i.attributes.ref)?.process??null:fc(i):null);return{startNs:s,durationNs:l,pid:d?.pid,processName:d?.name}})(e,i,a)).filter(e=>!!e)})(r.hitchesXml).filter(e=>{var t,n,i;return t=e,n=r.processIds,i=r.processNames,!!(void 0!==t.pid&&n.includes(t.pid))||!!t.processName&&i.includes(t.processName)})).length,l=Math.max(0,Math.round(Date.parse(r.windowEndedAt)-Date.parse(r.windowStartedAt))),d=function(e,t){if(0===e.length)return[];let r=[...e].sort((e,t)=>e.startNs-t.startNs),n=[],i=[];for(let e of r){let t=i.at(-1);if(!t||e.startNs-(t.startNs+t.durationNs)<=5e8){i.push(e);continue}n.push(i),i=[e]}return i.length>0&&n.push(i),n.map(e=>{var r,n;let i,a,o,s;return r=e,n=t,i=Math.min(...r.map(e=>e.startNs)),a=Math.max(...r.map(e=>e.startNs+e.durationNs)),s=Math.max(o=Math.max(0,Math.round(i/1e6)),Math.round(a/1e6)),{startOffsetMs:o,endOffsetMs:s,startAt:new Date(n+o).toISOString(),endAt:new Date(n+s).toISOString(),missedDeadlineFrameCount:r.length,worstFrameMs:p7(Math.max(...r.map(e=>e.durationNs))/1e6)}}).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}(o,Date.parse(r.windowStartedAt)),{droppedFramePercent:n>0?p7(s/n*100):0,droppedFrameCount:s,totalFrameCount:n,sampleWindowMs:l,windowStartedAt:r.windowStartedAt,windowEndedAt:r.windowEndedAt,measuredAt:r.measuredAt,method:fs,matchedProcesses:[...new Set(o.map(e=>e.processName).filter(e=>"string"==typeof e&&e.length>0))],frameDeadlineMs:void 0===i?void 0:p7(1e3/i),refreshRateHz:i,worstWindows:d.length>0?d:void 0}}function fb(e){return"ios"===e.platform&&"device"===e.kind?{method:fs,description:"Rendered-frame hitch health from xctrace Animation Hitches on connected iOS devices. Dropped frames are counted from native hitch rows for the attached app process, with total frames from the same trace frame-lifetime table.",unit:"percent",primaryField:"droppedFramePercent",window:"short 2s xctrace Animation Hitches record of the active app process",resetsAfterRead:!1}:{method:fs,description:"Unavailable on iOS simulators and macOS because local Apple tooling does not expose reliable app frame hitches for these targets.",unit:"percent",primaryField:"droppedFramePercent"}}function f_(e){let t=fb(e);if("ios"===e.platform&&"device"===e.kind)return{fps:t,memory:{method:fm,description:"Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"kB"},cpu:{method:ff,description:"Recent CPU usage snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"percent"}};let r="macos"===e.platform?"host ps for the running macOS app executable resolved from the bundle ID.":"xcrun simctl spawn ps, with host ps fallback, for the running iOS simulator app executable resolved from the bundle ID.";return{fps:t,memory:{method:fp,description:`Resident memory snapshot from ${r}`,unit:"kB"},cpu:{method:fu,description:`Recent CPU usage snapshot from ${r}`,unit:"percent"}}}function fx(e){return"ios"===e.platform&&"device"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:fh,reason:"Physical iOS device memgraph capture is not exposed through reliable local agent-device tooling.",hint:"Use perf memory sample for a compact resident-memory reading, or reproduce on an iOS simulator/macOS target for memgraph capture."}:"ios"===e.platform&&"simulator"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!0,method:fh,reason:"iOS simulator processes are host-visible through simctl spawn leaks.",hint:"Keep the simulator app running in the foreground while the memgraph is captured."}:"macos"===e.platform?{platform:e.platform,deviceKind:e.kind,memgraph:!0,method:fh,reason:"macOS app processes are host-visible to leaks --outputGraph.",hint:"Grant Terminal/agent process permissions if macOS denies process inspection."}:{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:fh,reason:"Apple memgraph capture is available only for iOS simulator and macOS app sessions.",hint:"Use perf memory sample on supported app sessions, or rerun against iOS simulator/macOS for memgraph capture."}}async function fM(e,t,r){let n=await l.mkdtemp(a.join(p.tmpdir(),"agent-device-ios-frame-perf-")),i=a.join(n,"animation-hitches.trace"),o=a.join(n,"hitches.xml"),s=a.join(n,"frame-lifetimes.xml"),d=a.join(n,"display-info.xml");try{let n=await fN({device:e,appBundleId:t,tracePath:i,template:"Animation Hitches",duration:"2s",targetPids:r.map(e=>e.pid),validateTraceOutput:!0,failureMessage:`Failed to record iOS frame-health sample for ${t}`});await fC(e,t,i,"hitches",o),await fC(e,t,i,"hitches-frame-lifetimes",s);let a=await fR(e,t,i,"device-display-info",d);return{windowStartedAt:n.startedAt,windowEndedAt:n.endedAt,hitchesXml:await l.readFile(o,"utf8"),frameLifetimesXml:await l.readFile(s,"utf8"),displayInfoXml:a?await l.readFile(d,"utf8"):void 0}}finally{await l.rm(n,{recursive:!0,force:!0}).catch(()=>{})}}async function fN(e){let{device:t,appBundleId:r,tracePath:n,template:i,duration:a}=e,o=e.allProcesses?["--all-processes"]:(e.targetPids??[]).flatMap(e=>["--attach",String(e)]),s=["xctrace","record","--template",i,"--device",t.id,...o,"--time-limit",a,"--output",n,"--quiet","--no-prompt"],l=await fP(s,e.tracePath);if(0===l.result.exitCode)return e.validateTraceOutput&&await fE(e,l.result.stdout,l.result.stderr),{startedAt:l.startedAt,endedAt:l.endedAt,capturedAtMs:l.capturedAtMs};throw new eG("COMMAND_FAILED",e.failureMessage,{cmd:"xcrun",args:s,exitCode:l.result.exitCode,stdout:l.result.stdout,stderr:l.result.stderr,appBundleId:r,deviceId:t.id,hint:fJ(l.result.stdout,l.result.stderr)})}async function fP(e,t){let r;for(let n=1;n<=3;n+=1){await fk(t,n,1500);let i=new Date().toISOString(),a=await ao(e,{allowFailure:!0,timeoutMs:6e4});if(r={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},0===a.exitCode||!fD(a))break}return r}function fD(e){let t=`${e.stdout}
18
+ ${e.stderr}`.toLowerCase();return t.includes("_lockkperf")||t.includes("could not lock kperf")||t.includes("likely another session just started")}async function fk(e,t,r){t<=1||(await l.rm(e,{recursive:!0,force:!0}).catch(()=>{}),await new Promise(e=>setTimeout(e,r)))}async function fE(e,t,r){let n=await l.stat(e.tracePath).catch(()=>null);if(!(n?.isDirectory()===!0?(await l.readdir(e.tracePath).catch(()=>[])).length>0:(n?.size??0)>0))throw new eG("COMMAND_FAILED",`${e.failureMessage}: xctrace produced no trace data`,{tracePath:e.tracePath,appBundleId:e.appBundleId,deviceId:e.device.id,stdout:t,stderr:r,hint:"Keep the iOS device unlocked and connected by cable, keep the app active, then retry perf."})}async function fC(e,t,r,n,i){let a=["xctrace","export","--input",r,"--xpath",`/trace-toc/run/data/table[@schema="${n}"]`,"--output",i],o=await ao(a,{allowFailure:!0,timeoutMs:15e3});if(0!==o.exitCode)throw new eG("COMMAND_FAILED",`Failed to export iOS device ${n} data`,{cmd:"xcrun",args:a,exitCode:o.exitCode,stdout:o.stdout,stderr:o.stderr,appBundleId:t,deviceId:e.id,hint:fJ(o.stdout,o.stderr)})}async function fR(e,t,r,n,i){try{return await fC(e,t,r,n,i),!0}catch{return!1}}async function fO(e){let t=dR(e),r=p6(t,"activity-monitor-process-live");if(0===r.length)throw new eG("COMMAND_FAILED","Failed to parse xctrace activity-monitor-process-live schema");let n=r.indexOf("pid"),i=r.indexOf("process"),a=r.indexOf("cpu-total"),o=r.indexOf("memory-real");if(n<0||i<0||a<0||o<0)throw new eG("COMMAND_FAILED","xctrace activity-monitor-process-live export is missing expected columns");let s=p4(t,e=>"row"===e.name),l=[],d=new Map;for(let e of s){var c,u;let t=e.children;if(0===t.length)continue;for(let e of t){let t=p5(e.children,e=>"pid"===e.name&&"string"==typeof e.attributes.id);if(t?.attributes.id){let e=Number(t.text);d.set(t.attributes.id,{numberValue:Number.isFinite(e)?e:null})}e.attributes.id&&d.set(e.attributes.id,{numberValue:p8(e),processName:fz(e)})}let r=p9(t[n],d),s=(c=t[i],u=d,c?c.attributes.ref?u.get(c.attributes.ref)?.processName??null:fz(c):null);null!==r&&Number.isFinite(r)&&s&&l.push({pid:r,processName:s,cpuTimeNs:p9(t[a],d),residentMemoryBytes:p9(t[o],d)})}return l}async function fT(e,t){let r="macos"===e.platform?await fG(t):await fq(e,t),n="macos"===e.platform?a.join(r,"Contents","Info.plist"):a.join(r,"Info.plist"),i=await fo(n,"CFBundleExecutable");if(!i)throw new eG("COMMAND_FAILED",`Failed to resolve executable for ${t}`,{appBundleId:t,appPath:r});return{executableName:i,executablePath:"macos"===e.platform?a.join(r,"Contents","MacOS",i):a.join(r,i)}}async function fL(e,t){let r=await f$(e,t),n=await fF(e,t),i=await fF(e,t),a=fU(await fO(n.xml),r,t,e),o=fU(await fO(i.xml),r,t,e),s=i.capturedAtMs-n.capturedAtMs;if(s<=0)throw new eG("COMMAND_FAILED",`Invalid Activity Monitor sample window for ${t}`,{appBundleId:t,deviceId:e.id});if(null===a.cpuTimeNs||null===o.cpuTimeNs||null===o.residentMemoryBytes)throw new eG("COMMAND_FAILED",`Incomplete Activity Monitor sample for ${t}`,{appBundleId:t,deviceId:e.id,hint:"Keep the app running in the foreground while perf samples the device, then retry."});return fX({usagePercent:Math.max(0,o.cpuTimeNs-a.cpuTimeNs)/(1e6*s)*100,residentMemoryKb:o.residentMemoryBytes/1024,measuredAt:new Date(i.capturedAtMs).toISOString(),matchedProcesses:o.matchedProcesses,cpuMethod:ff,memoryMethod:fm})}async function f$(e,t){let r=(await ft(e,"all")).find(e=>e.bundleId===t);if(!r)throw new eG("APP_NOT_INSTALLED",`No iOS device app found for ${t}`,{appBundleId:t,deviceId:e.id});if(!r.url)throw new eG("COMMAND_FAILED",`Missing app bundle URL for ${t}`,{appBundleId:t,deviceId:e.id});let n=r.url.replace(/\/$/,""),i=c(n),a=(await fr(e)).filter(e=>e.executable.startsWith(`${n}/`));if(0===a.length)throw new eG("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,deviceId:e.id,appBundlePath:i,hint:"Run open <app> for this session again to ensure the iOS app is active, then retry perf."});return a}async function fF(e,t){let r=await l.mkdtemp(a.join(p.tmpdir(),"agent-device-ios-perf-")),n=a.join(r,"sample.trace"),i=a.join(r,"activity-monitor-process-live.xml");try{let r=await fN({device:e,appBundleId:t,tracePath:n,template:"Activity Monitor",duration:"1s",allProcesses:!0,failureMessage:`Failed to record iOS device Activity Monitor sample for ${t}`});return await fC(e,t,n,"activity-monitor-process-live",i),{capturedAtMs:r.capturedAtMs,xml:await l.readFile(i,"utf8")}}finally{await l.rm(r,{recursive:!0,force:!0}).catch(()=>{})}}function fU(e,t,r,n){let i=new Set(t.map(e=>e.pid)),o=new Set(t.map(e=>a.basename(c(e.executable)))),s=e.filter(e=>i.has(e.pid)||o.has(e.processName));if(0===s.length)throw new eG("COMMAND_FAILED",`No Activity Monitor sample found for ${r}`,{appBundleId:r,deviceId:n.id,hint:"Keep the app running in the foreground while perf samples the device, then retry."});let l=new Map;for(let e of s){let t=l.get(e.pid);if(!t){l.set(e.pid,e);continue}l.set(e.pid,{pid:e.pid,processName:e.processName||t.processName,cpuTimeNs:fZ(t.cpuTimeNs,e.cpuTimeNs),residentMemoryBytes:fZ(t.residentMemoryBytes,e.residentMemoryBytes)})}let d=[...l.values()],u=d.map(e=>e.cpuTimeNs).filter(e=>null!==e),p=d.map(e=>e.residentMemoryBytes).filter(e=>null!==e);return{cpuTimeNs:u.length>0?u.reduce((e,t)=>e+t,0):null,residentMemoryBytes:p.length>0?p.reduce((e,t)=>e+t,0):null,matchedProcesses:ri(d.map(e=>e.processName))}}async function fG(e){let t=`kMDItemCFBundleIdentifier == "${e.replaceAll('"','\\"')}"`,r=await aa("mdfind",[t],{allowFailure:!0,timeoutMs:15e3});if(0!==r.exitCode)throw new eG("COMMAND_FAILED",`Failed to resolve macOS app bundle for ${e}`,{appBundleId:e,stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let n=r.stdout.split("\n").map(e=>e.trim()).find(e=>e.endsWith(".app"));if(!n)throw new eG("APP_NOT_INSTALLED",`No macOS app found for ${e}`,{appBundleId:e});return n}async function fq(e,t){let r=l8(e,["get_app_container",e.id,t,"app"]),n=await ao(r,{allowFailure:!0,timeoutMs:15e3});if(0!==n.exitCode)throw new eG("COMMAND_FAILED",`Failed to resolve iOS simulator app container for ${t}`,{appBundleId:t,stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode,hint:"Ensure the iOS simulator app is installed and booted, then retry perf."});let i=n.stdout.trim();if(0===i.length)throw new eG("APP_NOT_INSTALLED",`No iOS simulator app container found for ${t}`,{appBundleId:t});return i}async function fB(e,t){let r="macos"===e.platform?["-axo","pid=,%cpu=,rss=,command="]:l8(e,["spawn",e.id,"ps","-axo","pid=,%cpu=,rss=,command="]);return(function(e){let t=[];for(let r of tI(e)){let e=r.match(/^(\d+)\s+([0-9]+(?:\.[0-9]+)?)\s+(\d+)\s+(.+)$/);if(!e)continue;let[n,i,a,o]=e.slice(1);if(void 0===n||void 0===i||void 0===a||void 0===o)continue;let s=Number(n),l=Number(i),d=Number(a),c=o.trim();Number.isFinite(s)&&Number.isFinite(l)&&Number.isFinite(d)&&t.push({pid:s,cpuPercent:l,rssKb:d,command:c})}return t})(("macos"===e.platform?await aa("ps",r,{timeoutMs:15e3}):await fH(r)).stdout).filter(e=>(function(e,t){let r=fW(e);if(t.executablePath){var n;let i;for(let a of(i=[n=t.executablePath],n.startsWith("/private/var/")?i.push(n.replace("/private/var/","/var/")):n.startsWith("/var/")&&i.push(n.replace("/var/","/private/var/")),i))if(e===a||r===a||e.startsWith(`${a} `))return!0}return a.basename(r)===t.executableName})(e.command,t))}async function fj(e,t,r){let n=(await fB(e,r)).sort((e,t)=>t.rssKb-e.rssKb)[0];if(n)return n;throw new eG("COMMAND_FAILED",`No running process found for ${t}`,{kind:"memgraph",appBundleId:t,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf memory snapshot."})}async function fV(e,t,r){try{let r=await fT(e,t);return{available:!0,process:await fj(e,t,r)}}catch(t){if(function(e,t){if("ios"!==e.platform||"simulator"!==e.kind||!(t instanceof eG))return!1;let r=t.details??{},n=Array.isArray(r.args)?r.args.join(" "):"",i="string"==typeof r.stderr?r.stderr:"",a=`${t.message}
19
+ ${i}`.toLowerCase();return n.includes("simctl spawn")&&n.includes(" ps ")&&a.includes("no such file")}(e,t))return{available:!1,kind:"memgraph",reason:"iOS simulator memgraph capture needs process tools inside simctl spawn, but this simulator runtime did not provide ps.",hint:"Use perf memory sample when available, or retry memgraph on a simulator runtime that includes process tools such as ps and leaks.",support:{...r,memgraph:!1}};throw t}}function fK(e,t,r){let n=`${t}
20
+ ${r}`.toLowerCase();return n.includes("timed out")||n.includes("timeout")?"Apple memgraph capture can take longer than metric sampling. Keep the app running and retry; if it times out again, collect a smaller reproduction before capturing leaks --outputGraph.":n.includes("not found")||n.includes("no such file")?"Install Xcode command line tools and ensure leaks is available, then retry.":n.includes("permission")||n.includes("denied")||n.includes("not authorized")?"macos"===e.platform?"Grant the agent terminal process permission to inspect this macOS app, then retry.":"Keep the simulator booted and app running; if inspection is denied, retry with a debug simulator build.":"Keep the app process running and retry perf memory snapshot with --debug if the failure persists."}async function fH(e){let t=await ao(e,{allowFailure:!0,timeoutMs:15e3});return 0===t.exitCode?t:await aa("ps",["-axo","pid=,%cpu=,rss=,command="],{timeoutMs:15e3})}function fW(e){let[t=""]=e.trim().split(/\s+/,1);return t}function fX(e){return{cpu:{usagePercent:p7(e.usagePercent),measuredAt:e.measuredAt,method:e.cpuMethod,matchedProcesses:e.matchedProcesses},memory:{residentMemoryKb:Math.round(e.residentMemoryKb),measuredAt:e.measuredAt,method:e.memoryMethod,matchedProcesses:e.matchedProcesses}}}function fz(e){let t=e?.attributes.fmt?.trim()??"";return t?t.replace(/\s+\(\d+\)$/,"").trim():null}function fJ(e,t){let r=fa(e,t);if(r)return r;let n=`${e}
21
+ ${t}`.toLowerCase();return n.includes("no device matched")||n.includes("failed to find device")?fi:n.includes("timed out")?"Keep the iOS device unlocked and connected by cable, keep the app active, then retry perf.":"Ensure the iOS device is unlocked, trusted, visible to xctrace, and the target app stays active while perf samples it."}function fZ(e,t){return null===e?t:null===t?e:Math.max(e,t)}async function fY(e){var t;let r=await f2(e.device,e.appBundleId);await l.mkdir(a.dirname(e.outPath),{recursive:!0});let n=["xctrace","record","--template",(t={device:e.device,template:e.template,targetPids:r.pids,outPath:e.outPath}).template,..."ios"===t.device.platform?["--device",t.device.id]:[],...t.targetPids.flatMap(e=>["--attach",String(e)]),"--output",t.outPath,"--quiet","--no-prompt"],i=new Date().toISOString(),o=await f3(n,e.outPath,{device:e.device,appBundleId:e.appBundleId,failureMessage:`Failed to start Apple xctrace ${e.mode} capture for ${e.appBundleId}`});return{kind:"xctrace",mode:e.mode,template:e.template,outPath:e.outPath,appBundleId:e.appBundleId,deviceId:e.device.id,platform:e.device.platform,targetPids:r.pids,targetProcesses:r.processNames,startedAt:i,child:o.child,wait:o.wait}}async function fQ(e,t=e.outPath){t!==e.outPath&&await l.mkdir(a.dirname(t),{recursive:!0});let r=await f4(e,{failOnForcedKill:!0});if(0!==r.exitCode)throw new eG("COMMAND_FAILED",`Failed to stop Apple xctrace ${e.mode} capture`,{exitCode:r.exitCode,stdout:r.stdout,stderr:r.stderr,tracePath:e.outPath,captureCleanedUp:!0,hint:fJ(r.stdout,r.stderr)});return t!==e.outPath&&await l.rename(e.outPath,t).catch(async()=>{await l.cp(e.outPath,t,{recursive:!0}),await l.rm(e.outPath,{recursive:!0,force:!0})}),await f8(t,{appBundleId:e.appBundleId,deviceId:e.deviceId,stdout:r.stdout,stderr:r.stderr}),{kind:"xctrace",mode:e.mode,template:e.template,outPath:t,appBundleId:e.appBundleId,deviceId:e.deviceId,platform:e.platform,targetPids:e.targetPids,targetProcesses:e.targetProcesses,startedAt:e.startedAt,endedAt:new Date().toISOString()}}async function f0(e){return await f4(e,{failOnForcedKill:!1})}async function f1(e){let t=await l.mkdtemp(a.join(p.tmpdir(),"agent-device-xctrace-report-")),r=a.join(t,"trace-toc.xml");try{var n;let t,i,o,s=["xctrace","export","--input",e.tracePath,"--xpath","/trace-toc","--output",r],d=await ao(s,{allowFailure:!0,timeoutMs:15e3});if(0!==d.exitCode)throw new eG("COMMAND_FAILED","Failed to export Apple xctrace report metadata",{cmd:"xcrun",args:s,exitCode:d.exitCode,stdout:d.stdout,stderr:d.stderr,tracePath:e.tracePath,hint:fJ(d.stdout,d.stderr)});let c=(n={...e,tocXml:await l.readFile(r,"utf8")},t=dR(n.tocXml),i=p4(t,e=>"run"===e.name),o=ri(p4(t,e=>"table"===e.name).map(e=>e.attributes.schema).filter(e=>"string"==typeof e&&e.length>0)).sort(),{kind:"xctrace",mode:n.mode,template:n.template,tracePath:n.tracePath,reportPath:n.outPath,appBundleId:n.appBundleId,generatedAt:new Date().toISOString(),summary:{runCount:i.length,tableSchemas:o}});return await l.mkdir(a.dirname(e.outPath),{recursive:!0}),await l.writeFile(e.outPath,`${JSON.stringify(c,null,2)}
22
+ `,"utf8"),c}finally{await l.rm(t,{recursive:!0,force:!0}).catch(()=>{})}}async function f2(e,t){if("ios"!==e.platform&&"macos"!==e.platform)throw new eG("UNSUPPORTED_OPERATION","Apple xctrace perf is not supported on Android.",{platform:e.platform,hint:"Android native profiling belongs to the Android perf rollout and is not implemented under Apple xctrace."});if("ios"===e.platform&&"device"===e.kind){let r=await f$(e,t);return{pids:r.map(e=>e.pid),processNames:ri(r.map(e=>a.basename(c(e.executable))))}}let r=await fT(e,t),n=await fB(e,r);if(0===n.length)throw new eG("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,deviceId:e.id,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf."});return{pids:n.map(e=>e.pid),processNames:[r.executableName]}}async function f3(e,t,r){let n;for(let r=1;r<=3;r+=1){await fk(t,r,1500);let i=eq("xcrun",e,{allowFailure:!0}),a=await f5(i.wait);if(!a)return i;if(n=a,!fD(a))break}let i=n??{stdout:"",stderr:"",exitCode:1};throw new eG("COMMAND_FAILED",r.failureMessage,{cmd:"xcrun",args:e,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,appBundleId:r.appBundleId,deviceId:r.device.id,hint:fJ(i.stdout,i.stderr)})}async function f5(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function f4(e,t){e.child.kill("SIGINT");let r=await f6(e.wait,45e3);if(r)return r;e.child.kill("SIGKILL");let n=await f6(e.wait,5e3);if(n&&!t.failOnForcedKill)return n;if(n)throw new eG("COMMAND_FAILED","Timed out waiting for Apple xctrace capture to stop",{exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,tracePath:e.outPath,captureCleanedUp:!0,forcedKill:!0,hint:"xctrace did not finish after SIGINT, so it was force-killed. Retry the perf command after confirming no other xctrace session is active."});throw new eG("COMMAND_FAILED","Timed out waiting for Apple xctrace capture to stop after SIGKILL",{tracePath:e.outPath,captureCleanedUp:!1,forcedKill:!0,hint:"xctrace did not exit after SIGKILL. Inspect running xctrace processes before retrying."})}async function f6(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function f8(e,t){let r=await l.stat(e).catch(()=>null);if(!(r?.isDirectory()===!0?(await l.readdir(e).catch(()=>[])).length>0:(r?.size??0)>0))throw new eG("COMMAND_FAILED","xctrace produced no trace data",{tracePath:e,appBundleId:t.appBundleId,deviceId:t.deviceId,stdout:t.stdout,stderr:t.stderr,hint:"Keep the Apple device unlocked and connected, keep the app active, then retry perf."})}function f9(e){let t=e.replaceAll(",","").match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let r=Number(t[0]);return Number.isFinite(r)?r:null}function f7(e){return Math.round(10*e)/10}let me="adb-shell-dumpsys-gfxinfo-framestats",mt="Rendered-frame health from the current adb shell dumpsys gfxinfo <package> framestats window. Dropped frames use Android gfxinfo janky-frame/frame-deadline data when available; this is not video recording FPS.";function mr(e,t,r){let n=t.get(r);if(void 0===n)return null;let i=Number(e[n]);return Number.isFinite(i)?i:null}function mn(e){return 0===e.length?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function mi(e,t){if(void 0!==e&&void 0!==t)return Math.max(0,Math.round((t-e)/1e6))}function ma(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=e.match(RegExp(`^\\s*${r}:\\s*([0-9][0-9,]*)`,"im"));if(!n)return;let i=n[1];return void 0===i?void 0:f9(i)??void 0}async function mo(e,t,r={}){var n,i,a,o,s,l,d,c;let u=t0(e,r.adb);try{let d,c,p,f,m,h,w,g,v,y,S,I=(n=(await u(["shell","dumpsys","gfxinfo",t,"framestats"],{timeoutMs:15e3})).stdout,i=new Date().toISOString(),function(e,t){if(/no process found for:/i.test(e))throw new eG("COMMAND_FAILED",`Android gfxinfo did not find a running process for ${t}`,{metric:"fps",package:t,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf after the interaction you want to inspect."})}(n,t),p=function(e){let t=e.split(/\nProfile data in ms:\n/i)[0]??"",r=ma(t,"Total frames rendered"),n=t.match(/^\s*Janky frames:\s*([0-9][0-9,]*)\s*\(([0-9.]+)%\)/im);if(void 0===r||!n)return;let i=n[1],a=n[2];if(void 0===i||void 0===a)return;let o=f9(i)??void 0,s=Number(a);if(void 0===o||!Number.isFinite(s)||r<0)return;let l=ma(t,"Uptime"),d=ma(t,"Stats since");return{droppedFramePercent:p7(s),droppedFrameCount:o,totalFrameCount:r,sampleWindowMs:function(e){let{uptimeMs:t,statsSinceNs:r}=e;if(void 0===t||void 0===r)return;let n=t-Math.round(r/1e6);return n>=0?n:void 0}({uptimeMs:l,statsSinceNs:d}),uptimeMs:l,statsSinceNs:d}}(n),f=function(e){let t=[],r=null;for(let i of e.split("\n")){var n;let e=i.trim();if(0===e.length||"---PROFILEDATA---"===e)continue;let a=e.split(",").map(e=>e.trim());if((n=a).includes("IntendedVsync")&&n.includes("FrameCompleted")){r=new Map(a.map((e,t)=>[e,t]));continue}let o=function(e,t){if(!t||e.length<t.size)return;let r=mr(e,t,"Flags"),n=mr(e,t,"IntendedVsync"),i=mr(e,t,"FrameCompleted");if(0===r&&null!==n&&null!==i&&!(n<=0)&&!(i<=n))return{intendedVsyncNs:n,frameCompletedNs:i,durationNs:i-n}}(a,r);o&&t.push(o)}return t.sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs)}(n),m=function(e,t,r){let n=function(e){var t;let r=(t=e.map(e=>e.intendedVsyncNs),[...new Set(t.filter(e=>Number.isFinite(e)))].sort((e,t)=>e-t)),n=[];for(let e=1;e<r.length;e+=1){let t=r[e]-r[e-1];t>=4e6&&t<=5e7&&n.push(t)}if(0!==n.length){let e,t;return e=[...n].sort((e,t)=>e-t),t=Math.floor(e.length/2),e.length%2==1?e[t]:(e[t-1]+e[t])/2}}(e);if(t||0!==e.length||function(e){throw new eG("COMMAND_FAILED",`Failed to parse Android framestats output for ${e}`,{metric:"fps",package:e,hint:"Retry perf after exercising the app screen. If the problem persists, capture adb shell dumpsys gfxinfo <package> framestats output for debugging."})}(r),t||void 0!==n)return n;throw new eG("COMMAND_FAILED",`Failed to infer Android frame deadline from framestats output for ${r}`,{metric:"fps",package:r,hint:"Retry perf after a longer interaction window so consecutive Android frame timestamps are available."})}(f,p,t),h=Date.parse(i),w=function(e){let{frames:t,measuredAtMs:r,summary:n}=e,i=mn(t),a=n?.statsSinceNs,o=a??i.firstFrameNs,s=mi(o,i.lastFrameNs),l=n?.sampleWindowMs??s;if(!Number.isFinite(r)||n?.uptimeMs===void 0||void 0===o)return{sampleWindowMs:l,windowStartNs:o};let d=r-n.uptimeMs;return{sampleWindowMs:l,windowStartNs:o,windowStartedAt:new Date(d+o/1e6).toISOString(),windowEndedAt:function(e){let{deviceBootWallClockMs:t,measuredAtMs:r,summaryStartNs:n,lastFrameNs:i}=e;return void 0!==n?new Date(r).toISOString():void 0===i?void 0:new Date(t+i/1e6).toISOString()}({deviceBootWallClockMs:d,measuredAtMs:r,summaryStartNs:a,lastFrameNs:i.lastFrameNs}),timestampSource:"estimated-from-device-uptime"}}({frames:f,measuredAtMs:h,summary:p}),g=function(e){let{frames:t,frameDeadlineNs:r,summaryDroppedFrameCount:n}=e;return void 0!==n?n<=0?[]:[...t].sort((e,t)=>t.durationNs-e.durationNs).slice(0,n).sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs):void 0===r?[]:t.filter(e=>e.durationNs>r)}({frames:f,frameDeadlineNs:m,summaryDroppedFrameCount:p?.droppedFrameCount}),v=p?.sampleWindowMs??w.sampleWindowMs??function(e){if(0===e.length)return;let t=mn(e);return mi(t.firstFrameNs,t.lastFrameNs)}(f),a=p,o=f,s=g,d=a?.totalFrameCount??o.length,c=a?.droppedFrameCount??s.length,y={totalFrameCount:d,droppedFrameCount:c,droppedFramePercent:a?.droppedFramePercent??(d>0?p7(c/d*100):0)},S=function(e){let{droppedFrames:t,timing:r,measuredAtMs:n,summary:i}=e;if(0===t.length)return;let a=function(e){let{frames:t,windowStartNs:r,measuredAtMs:n,uptimeMs:i}=e;if(0===t.length||void 0===r)return[];let a=[],o=[];for(let e of t){let t=o.at(-1);if(!t||e.intendedVsyncNs-t.frameCompletedNs<=5e8){o.push(e);continue}a.push(o),o=[e]}return o.length>0&&a.push(o),a.map(e=>(function(e){let{frames:t,windowStartNs:r,measuredAtMs:n,uptimeMs:i}=e,a=Math.min(...t.map(e=>e.intendedVsyncNs)),o=Math.max(...t.map(e=>e.frameCompletedNs)),s=Math.max(0,Math.round((a-r)/1e6)),l=Math.max(s,Math.round((o-r)/1e6)),d=void 0!==i&&Number.isFinite(n)?n-i:void 0;return{startOffsetMs:s,endOffsetMs:l,startAt:void 0===d?void 0:new Date(d+a/1e6).toISOString(),endAt:void 0===d?void 0:new Date(d+o/1e6).toISOString(),missedDeadlineFrameCount:t.length,worstFrameMs:f7(Math.max(...t.map(e=>e.durationNs))/1e6)}})({frames:e,windowStartNs:r,measuredAtMs:n,uptimeMs:i})).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}({frames:t,windowStartNs:r.windowStartNs,measuredAtMs:n,uptimeMs:i?.uptimeMs});return a.length>0?a:void 0}({droppedFrames:g,timing:w,measuredAtMs:h,summary:p}),{...y,sampleWindowMs:v,...(l=m,{frameDeadlineMs:void 0===l?void 0:f7(l/1e6),refreshRateHz:void 0===l?void 0:f7(1e9/l)}),windowStartedAt:w.windowStartedAt,windowEndedAt:w.windowEndedAt,timestampSource:w.timestampSource,measuredAt:i,method:me,source:p?"android-gfxinfo-summary":"framestats-rows",worstWindows:S&&S.length>0?S:void 0});return await ms(e,t,r),I}catch(e){throw d=t,(c=e)instanceof eG?new eG(c.code,c.message,{...c.details??{},metric:"fps",package:d},c):new eG("COMMAND_FAILED",`Failed to sample Android fps for ${d}`,{metric:"fps",package:d},c)}}async function ms(e,t,r={}){let n=t0(e,r.adb);try{await n(["shell","dumpsys","gfxinfo",t,"reset"],{allowFailure:!0,timeoutMs:3e3})}catch{}}function ml(e,t,r,n){if(n instanceof eG){var i,a,o,s,l;let d,c=n.details??{};return new eG(n.code,n.message,{...c,action:e,package:r,tool:t,hint:"string"==typeof c.hint?c.hint:(i=t,d=("string"==typeof(a=c).stderr?a.stderr:"").toLowerCase(),"simpleperf"===i?(s=o=d).includes("permission denied")||s.includes("not profileable")||s.includes("profileable")?"Use a debuggable/profileable Android app or a device image that permits simpleperf for the target process, then retry perf cpu profile start.":o.includes("not supported")||o.includes("failed to open perf event")?"This device image does not expose the requested simpleperf event for the app process. Try a different emulator/system image or a profileable app.":md("simpleperf"):(l=d).includes("permission denied")||l.includes("not allowed")?"Use a device image that permits perfetto trace capture for shell, keep the app running, then retry perf trace start.":md(i))},n)}return new eG("COMMAND_FAILED",`Failed to ${e} Android ${t} for ${r}`,{action:e,package:r,tool:t,hint:md(t)},n)}function md(e){return"simpleperf"===e?"Verify simpleperf is available, the app process is running, and the app/device permits native CPU profiling.":"Verify perfetto is available, the app process is running, and the device permits trace capture."}async function mc(e,t,r,n,i){return{capture:{durationMs:n,packageName:t.packageName,appPid:t.appPid,artifactPath:t.outPath,sizeBytes:r},frameHealth:"perfetto"===t.kind?await mu(e,t.packageName,i):void 0,notes:["perfetto"===t.kind?"Frame health is sampled from Android gfxinfo around the trace window; open the Perfetto artifact for timeline root cause.":"Open the Simpleperf report artifact for symbol-level CPU attribution."]}}async function mu(e,t,r){try{let n=await mo(e,t,r);return{available:!0,droppedFramePercent:n.droppedFramePercent,droppedFrameCount:n.droppedFrameCount,totalFrameCount:n.totalFrameCount,method:n.method,worstWindows:n.worstWindows?.slice(0,3).map(e=>({startOffsetMs:e.startOffsetMs,endOffsetMs:e.endOffsetMs,missedDeadlineFrameCount:e.missedDeadlineFrameCount,worstFrameMs:e.worstFrameMs}))}}catch(e){return{available:!1,reason:e instanceof Error?e.message:"Android frame health was not available"}}}let mp="adb-shell-simpleperf",mf="adb-shell-perfetto",mm="/data/local/tmp";async function mh(e,t,r){let n=t0(e,r.adb);await mA(n,t),await m_(n,t),await mb(n,t);let i=await mS(t.outPath);await mv(n,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await mc(e,t,i,o,{adb:n});return{...t,action:"stop",platform:"android",state:"stopped",stoppedAt:a,durationMs:o,sizeBytes:i,method:"simpleperf"===t.kind?mp:mf,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function mw(e,t,r={}){let n=t0(e,r.adb);try{"running"===t.state&&(await mA(n,t),await m_(n,t).catch(()=>{}))}finally{await mv(n,t.remotePath)}}function mg(e,t,r=mm){let n=e.replace(/[^A-Za-z0-9_.-]/g,"_");return`${r}/agent-device-${n}-${Date.now()}-${t}`}async function mv(e,t){try{await e(["shell",`rm -f ${mI(t)}`],{allowFailure:!0,timeoutMs:15e3})}catch{}}async function my(e,t){await l.mkdir(a.dirname(e),{recursive:!0}),await l.writeFile(e,`${JSON.stringify(t,null,2)}
23
+ `)}async function mS(e){try{return(await l.stat(e)).size}catch(t){throw new eG("COMMAND_FAILED",`Profiler artifact was not written: ${e}`,{outPath:e,hint:"Retry the profiling command and check daemon logs if the artifact path is still missing."},t)}}function mI(e){return`'${e.replace(/'/g,"'\\''")}'`}async function mA(e,t){try{var r;await e(["shell",(r=t.profilerPid,`pid=${mI(r)}; kill -INT "$pid" 2>/dev/null || true; for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done; kill -TERM "$pid" 2>/dev/null || true; for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done; echo "profiler process did not stop after SIGTERM" >&2; exit 1`)],{timeoutMs:3e4})}catch(e){throw ml("stop",t.kind,t.packageName,e)}}async function mb(e,t){await l.mkdir(a.dirname(t.outPath),{recursive:!0});try{await e(["pull",t.remotePath,t.outPath],{timeoutMs:3e4})}catch(e){throw new eG("COMMAND_FAILED",`Failed to pull Android ${t.kind} artifact for ${t.packageName}`,{package:t.packageName,tool:t.kind,remotePath:t.remotePath,outPath:t.outPath,hint:"Check that the profiling command ran long enough to create an artifact, then retry stop with the same session."},e)}}async function m_(e,t){let r;for(let n=0;n<12;n+=1){let n=await mx(e,t.remotePath);if(void 0!==n&&n>0&&n===r)return;r=n,await y(250)}throw new eG("COMMAND_FAILED",`Android ${t.kind} artifact is not ready to pull`,{package:t.packageName,tool:t.kind,remotePath:t.remotePath,hint:"The profiler stopped, but the remote artifact was missing, empty, or still changing. Retry stop with the same session or inspect the device-side artifact."})}async function mx(e,t){let r=mI(t),n=await e(["shell",`if [ -f ${r} ]; then stat -c %s ${r} 2>/dev/null || wc -c < ${r}; fi`],{allowFailure:!0,timeoutMs:15e3});if(0!==n.exitCode)return;let i=Number(n.stdout.trim().split(/\s+/)[0]);return Number.isFinite(i)?i:void 0}async function mM(e,t){try{let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=mP(r.stdout);if(0===r.exitCode&&n)return n}catch{}throw new eG("COMMAND_FAILED",`No active Android app process found for ${t}`,{package:t,hint:"Run open <app> for this session again, wait for the app UI to appear, then retry perf."})}async function mN(e,t,r){let n=await e(["shell",`command -v ${t} || which ${t}`],{allowFailure:!0,timeoutMs:15e3});if(!(0===n.exitCode&&n.stdout.trim()))throw new eG("UNSUPPORTED_OPERATION",`Android device does not expose ${t}`,{package:r,tool:t,hint:"simpleperf"===t?"Use an emulator/system image with simpleperf available, or install the Android NDK simpleperf binary for this device.":"Use Android 10+ or a system image that exposes the perfetto command-line binary."})}function mP(e){return e.trim().split(/\s+/).find(e=>/^\d+$/.test(e))}async function mD(e,t,r,n={}){let i,a=t0(e,n.adb),o=await mM(a,t);await mN(a,"perfetto",t);let s=mg(t,"app.perfetto-trace","/data/misc/perfetto-traces");try{await ms(e,t,{adb:a}),i=await mE(a,s,t)}catch(e){throw await mv(a,s),e}return{...{type:"trace",kind:"perfetto",packageName:t,appPid:o,profilerPid:i,remotePath:s,outPath:r,startedAt:Date.now(),state:"running"},action:"start",platform:"android",method:mf,message:`Started Android Perfetto trace for ${t}`}}async function mk(e,t,r,n={}){return await mh(e,{...t,outPath:r},n)}async function mE(e,t,r){try{let n=await e(["shell","perfetto","--background-wait","-o",t,"-t","3600s","sched","freq","idle","am","wm","gfx","view","binder_driver","hal","dalvik"],{timeoutMs:3e4}),i=mP(n.stdout);if(i)return i;throw new eG("COMMAND_FAILED","Android perfetto did not return a profiler pid",{package:r,tool:"perfetto",hint:"Retry perf trace start. If perfetto exits immediately, verify the device permits trace capture."})}catch(e){throw ml("start","perfetto",r,e)}}async function mC(e,t,r,n={}){let i,a=t0(e,n.adb),o=await mM(a,t);await mN(a,"simpleperf",t);let s=mg(t,"cpu.perf.data");try{i=await mT(a,o,s,t)}catch(e){throw await mv(a,s),e}return{...{type:"cpu-profile",kind:"simpleperf",packageName:t,appPid:o,profilerPid:i,remotePath:s,outPath:r,startedAt:Date.now(),state:"running"},action:"start",platform:"android",method:mp,message:`Started Android Simpleperf CPU profile for ${t}`}}async function mR(e,t,r,n={}){return await mh(e,{...t,outPath:r},n)}async function mO(e,t,r,n={}){let i=t0(e,n.adb);await mN(i,"simpleperf",t.packageName);let a=await mL(i,t),o=new Date().toISOString(),s=function(e){let t=[];for(let r of tI(e)){let e=r.match(/^([0-9]+(?:\.[0-9]+)?)%\s+(.+)$/);if(!e)continue;let n=Number(e[1]),i=e[2]?.trim();if(!Number.isFinite(n)||!i)continue;let a=i.split(/\s{2,}/).filter(Boolean);if(t.push({percentage:p7(n),command:a[0],dso:a[1],symbol:a.slice(2).join(" ")||void 0}),t.length>=50)break}return t}(a.stdout),l={kind:"simpleperf-report",generatedAt:o,packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,sourceRemotePath:t.remotePath,entryCount:s.length,entries:s};await my(r,l);let d=await mS(r);return{action:"report",platform:"android",type:"cpu-profile-report",kind:"simpleperf",packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,outPath:r,sizeBytes:d,generatedAt:o,entryCount:s.length,method:mp,message:`Wrote Android Simpleperf report for ${t.packageName}`}}async function mT(e,t,r,n){try{var i,a,o,s;let l,d,c=await e(["shell",(i=t,a=r,o=["simpleperf","record","-e","cpu-clock:u","-p",i,"-o",a,"--duration",String(3600)],s="simpleperf",l=o.map(mI).join(" "),d=`${mm}/agent-device-${s}-${Date.now()}.err`,`err=${mI(d)}; (${l}) >/dev/null 2>"$err" & pid=$!; sleep 1; if kill -0 "$pid" 2>/dev/null; then rm -f "$err"; echo "$pid"; exit 0; fi; cat "$err" >&2; rm -f "$err"; exit 1`)],{timeoutMs:3e4}),u=mP(c.stdout);if(u)return u;throw new eG("COMMAND_FAILED","Android simpleperf did not return a profiler pid",{package:n,tool:"simpleperf",hint:"Retry perf. If simpleperf exits immediately, verify the app is profileable and the device permits native profiling."})}catch(e){throw ml("start","simpleperf",n,e)}}async function mL(e,t){try{return await e(["shell","simpleperf","report","-i",t.remotePath,"--stdio","--sort","comm,dso,symbol"],{timeoutMs:3e4})}catch(e){throw ml("report","simpleperf",t.packageName,e)}}let m$="adb-shell-dumpsys-cpuinfo",mF="Aggregated CPU usage for app processes matched from adb shell dumpsys cpuinfo.",mU="adb-shell-dumpsys-meminfo",mG="Memory snapshot from adb shell dumpsys meminfo <package>. Values are reported in kilobytes.",mq="adb-shell-am-dumpheap",mB="Java heap dump captured with adb shell am dumpheap, pulled to a local artifact path.";async function mj(e,t,r={}){let n=t0(e,r.adb);try{let e=await n(["shell","dumpsys","cpuinfo"],{timeoutMs:15e3});return function(e,t,r){let n=new Set,i=0;for(let r of tI(e)){var a,o;let e=r.match(/^([0-9]+(?:\.[0-9]+)?)%\s+\d+\/([^\s]+):\s/);if(!e)continue;let s=e[1],l=e[2];if(void 0===s||void 0===l)continue;let d=Number(s);Number.isFinite(d)&&(a=l,o=t,a===o||a.startsWith(`${o}:`))&&(i+=d,n.add(l))}return{usagePercent:p7(i),measuredAt:r,method:m$,matchedProcesses:[...n]}}(e.stdout,t,new Date().toISOString())}catch(e){throw mz("cpu",t,e)}}async function mV(e,t,r={}){let n=t0(e,r.adb);try{let e=await n(["shell","dumpsys","meminfo",t],{timeoutMs:15e3});return function(e,t,r){let n;if(/no process found for:/i.test(e))throw new eG("COMMAND_FAILED",`Android meminfo did not find a running process for ${t}`,{metric:"memory",package:t,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf."});let i=mJ(e,"TOTAL PSS")??function(e){for(let t of e.split("\n")){let e=t.trim();if(!/^TOTAL\b(?!\s+PSS:)/.test(e))continue;let r=e.split(/\s+/).slice(1).find(e=>null!==f9(e));if(!r)break;return f9(r)??void 0}}(e);if(void 0===i)throw new eG("COMMAND_FAILED",`Failed to parse Android meminfo output for ${t}`,{metric:"memory",package:t,hint:"Retry perf after reopening the app session. If the problem persists, capture adb shell dumpsys meminfo output for debugging."});return{totalPssKb:i,totalRssKb:mJ(e,"TOTAL RSS"),measuredAt:r,method:mU,topConsumers:(n=e.split("\n").flatMap(e=>(function(e){let t=e.trim();if(function(e){if(!e||e.startsWith("**")||e.startsWith("-")||e.includes(":"))return!0;let t=/^\S.+\s+\d/.test(e);return/^(pss|total|native|dalvik|unknown|app summary\b)/i.test(e)&&!t}(t))return;let r=t.match(/^(.+?)\s+([0-9][0-9,]*(?:\(\d+\))?)(?:\s|$)/);if(r)return function(e,t){let r=e?.trim(),n=t?f9(t):null;if(r&&"TOTAL"!==r&&null!==n&&!(n<=0)&&!/^(pss|private|shared|heap|size|alloc|free)$/i.test(r))return{name:r,pssKb:n}}(r[1],r[2])})(e)??[]).sort((e,t)=>t.pssKb-e.pssKb).slice(0,5)).length>0?n:void 0}}(e.stdout,t,new Date().toISOString())}catch(e){throw mz("memory",t,e)}}async function mK(e,t,r,n={}){let i,o=t0(e,n.adb),s=await mX(o,t),d=(i=t.replace(/[^a-zA-Z0-9._-]/g,"_"),`/data/local/tmp/agent-device-${i}-${Date.now()}.hprof`);await l.mkdir(a.dirname(r),{recursive:!0});let c=await mH(r);try{let e=await o(["shell","am","dumpheap",t,d],{allowFailure:!0,timeoutMs:12e4});if(0!==e.exitCode){var u,p;let r;throw new eG("COMMAND_FAILED",`Failed to capture Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:s,remotePath:d,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,hint:(u=e.stdout,p=e.stderr,(r=`${u}
24
+ ${p}`.toLowerCase()).includes("profileable")||r.includes("debuggable")||r.includes("not allowed")?"Android heap dumps require a debuggable/profileable app process on many devices. Use a debug/profileable build, reopen the app, then retry.":r.includes("permission")||r.includes("denied")?"The device denied heap dump access. Use a debug/profileable build or a device image that permits app heap dumping.":"Reopen the app to refresh the process, then retry perf memory snapshot. If it still fails, run with --debug and inspect adb am dumpheap output.")})}let n=await o(["pull",d,r],{allowFailure:!0,timeoutMs:12e4});if(0!==n.exitCode)throw await mW(r,c),new eG("COMMAND_FAILED",`Failed to pull Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:s,remotePath:d,path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:"Verify the daemon can write the requested --out path and retry. The heap dump stays on-device only until cleanup runs."});let i=await l.stat(r).catch(()=>null);if(!i?.isFile()||i.size<=0)throw await mW(r,c),new eG("COMMAND_FAILED","Android heap dump artifact is missing or empty",{kind:"android-hprof",package:t,pid:s,path:r,remotePath:d,hint:"Retry with a writable --out path. If the file is still empty, inspect adb pull output with --debug."});return{available:!0,kind:"android-hprof",path:r,sizeBytes:i.size,measuredAt:new Date().toISOString(),method:mq,packageName:t,pid:s,remotePath:d}}finally{await o(["shell","rm","-f",d],{allowFailure:!0,timeoutMs:15e3}).catch(()=>{})}}async function mH(e){return await l.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function mW(e,t){t||await l.rm(e,{force:!0}).catch(()=>{})}async function mX(e,t){let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=r.stdout.trim().split(/\s+/).map(e=>Number(e)).find(e=>Number.isInteger(e)&&e>0);if(0===r.exitCode&&void 0!==n)return n;throw new eG("COMMAND_FAILED",`No running Android process found for ${t}`,{kind:"android-hprof",package:t,stdout:r.stdout,stderr:r.stderr,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf memory snapshot."})}function mz(e,t,r){return r instanceof eG?new eG(r.code,r.message,{...r.details??{},metric:e,package:t},r):new eG("COMMAND_FAILED",`Failed to sample Android ${e} for ${t}`,{metric:e,package:t},r)}function mJ(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=e.match(RegExp(`${r}:\\s*([0-9][0-9,]*)`,"i"));if(!n)return;let i=n[1];return void 0===i?void 0:f9(i)??void 0}let mZ=new Map;async function mY(e){let t=await g.mkdtemp(a.join(p.tmpdir(),"agent-device-materialized-"));try{let r=await m1(e.installablePath,a.join(t,"installable")),i=e.archivePath?await m1(e.archivePath,a.join(t,"archive")):void 0,o=n.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{mQ(o)},s);return mZ.set(o,{rootPath:t,installablePath:r,archivePath:i,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:d}),{materializationId:o,installablePath:r,...i?{archivePath:i}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await g.rm(t,{recursive:!0,force:!0}),e}}async function mQ(e,t){let r=mZ.get(e);if(!r)throw new eG("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eG("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),mZ.delete(e),await g.rm(r.rootPath,{recursive:!0,force:!0})}async function m0(e){let t=Array.from(mZ.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await mQ(e)}))}async function m1(e,t){let r=await g.stat(e);await g.mkdir(t,{recursive:!0});let n=a.join(t,a.basename(e));return r.isDirectory()?await g.cp(e,n,{recursive:!0}):await g.copyFile(e,n),n}async function m2(e){if(await uR(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await aM("dismiss",t).catch(t=>{ef({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function m3(e){e.appLog&&await p0(e.appLog)}async function m5(e){e.applePerf?.active&&(await f0(e.applePerf.active),e.applePerf={...e.applePerf??{},active:void 0})}async function m4(e){let t=e.nativePerf?.android;t&&(await mw(e.device,t),e.nativePerf={...e.nativePerf??{},android:void 0})}async function m6(e){"android"===e.device.platform&&await tK(e.device)}async function m8(e,t){await m3(e),await m5(e),await m4(e),await m6(e),e9(e.device.platform)&&await m2(e),await m0(t).catch(()=>{})}let m9=new WeakMap;async function m7(e){var t,r,n;let i,a,{sessionStore:o,leaseRegistry:s}=e,l=(i={...(r=function(e){let t=eQ(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=eJ(r);if(r&&!n)throw new eG("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new eG("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??{}},t1(r.command,i)?{...r,flags:i}:r),d=l.command,c=function(e){var t,r;let n=e.session||lV;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=lH(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(l),u=ed(),p=o.resolveSessionDir(c),f=rc(p,l.meta?.requestId??u.requestId),m=rd(p);ep({session:c,logPath:f}),ef({level:"info",phase:"request_start",data:{publicSession:l.session,effectiveSession:c,command:l.command,tenant:l.meta?.tenantId,isolation:l.meta?.sessionIsolation,requestLogPath:f,runnerLogPath:m}}),n$((t=l).command)||lz(t,a5(t));let h=nG(d)?.sessionExecutionLockExempt!==!0?await l3({req:l,sessionName:c,sessionStore:o}):[],w=(n=s,(a=m9.get(n))||(a=new Map,m9.set(n,a)),a),g={req:l,command:d,sessionName:c,requestLogPath:f,runnerLogPath:m,throwIfCanceled:()=>rM(l.meta?.requestId),runAdmitted:async e=>(rM(l.meta?.requestId),await lZ({sessionName:c,sessionStore:o,leaseRegistry:s,teardownSession:m8}),g.req=l=function(e){let{sessionName:t,sessionStore:r,leaseRegistry:n}=e,i=r.get(t),a=function(e,t,r){var n,i;let a,o;if(n$(e.command))return;let s=a5(e);lz(e,s);let l=r?.lease;if(!l&&e.meta?.sessionIsolation!=="tenant"&&(!s.leaseId||!s.tenantId&&!s.runId))return;n=s,(i=l)&&(lJ("leaseId",n.leaseId,i.leaseId),lJ("tenantId",n.tenantId,i.tenantId),lJ("runId",n.runId,i.runId),lJ("leaseProvider",n.leaseProvider,i.leaseProvider),lJ("clientId",n.clientId,i.clientId),lJ("deviceKey",n.deviceKey,i.deviceKey));let d=(a=a5(e),o=r?.lease??r?.deviceLease??void 0,tx({tenantId:a.tenantId??o?.tenantId,runId:a.runId??o?.runId,leaseId:a.leaseId??o?.leaseId,leaseTtlMs:a.leaseTtlMs,leaseBackend:a.leaseBackend??o?.leaseBackend,leaseProvider:a.leaseProvider??o?.leaseProvider,deviceKey:a.deviceKey??o?.deviceKey,clientId:a.clientId??o?.clientId})),c={...d,leaseTtlMs:d.leaseTtlMs??(H(d)?3e5:void 0)};return t.assertLeaseAdmission(b(d)),t.heartbeatLease(b(c))}(e.req,n,i);if(!a)return e.req;let o={...e.req,internal:{...e.req.internal,admittedLease:a}};return i?.lease&&r.set(t,{...i,lease:{...i.lease,leaseBackend:a.backend,expiresAt:a.expiresAt}}),o}({req:l,sessionName:c,sessionStore:o,leaseRegistry:s}),await e()),runLocked:async e=>(rM(l.meta?.requestId),0===h.length)?await g.runAdmitted(e):await he(w,h,async()=>await g.runAdmitted(e))};return g}async function he(e,t,r){let[n,...i]=t;return n?await lU(e,n,async()=>await he(e,i,r)):await r()}function ht(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function hr(e,t){return ht(e)?e[t]:void 0}function hn(e,t){let r=hr(e,t);return"string"==typeof r?r:void 0}function hi(e,t){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:void 0}function ha(e){return ht(e)}function ho(e){if(!ht(e))return;let t={};for(let[r,n]of Object.entries(e))"string"==typeof n&&(t[r]=n);return Object.keys(t).length>0?t:void 0}async function hs(e,t){var r;let n,i=function(e,t){let r=new Map(t.map(e=>[e.ref,e])),n=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){var o,s;let e=(o=t,hd(o.match(/\bref=['"]?(@?e\d+)['"]?/i)?.[1]??o.match(/@?(e\d+)\b/i)?.[1]));if(!e)continue;i.add(e);let l=r.get(e)?.data,d=(s=t,Math.floor((s.match(/^\s*/)?.[0].length??0)/2)),c=function(e,t,r){var n;let i=function(e){let t=e.replace(/\[[^\]]*ref[^\]]*\]/gi,"").replace(/@?e\d+\b/gi,"").replace(/^[\s|├└─>*-]+/g,"").trim();return t.match(/^([A-Za-z][\w-]*)\b/)?.[1]}(e)??hc(t,["role","type"]);return{index:0,type:i,role:i,label:(n=e,n.match(/"([^"]+)"/)?.[1]??n.match(/'([^']+)'/)?.[1]??hc(t,["label","name","text"])),value:function(e){var t;return t=e,(t.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(hp)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(hp)}(e)??hc(t,["value"]),depth:r,enabled:hu(t,["enabled"]),focused:hu(t,["focused"])}}(t,l,d),u=function(e,t){for(let r=t-1;r>=0;r-=1){let t=e.get(r);if(void 0!==t)return t}}(a,d);void 0!==u&&(c.parentIndex=u),n.push({ref:e,node:{...c,index:n.length}}),a.set(d,n.length-1)}for(let e of t)i.has(e.ref)||n.push({ref:e.ref,node:{...function(e){let t=hc(e,["role","type"]);return{index:0,type:t,role:t,label:hc(e,["label","name","text"]),value:hc(e,["value"]),enabled:hu(e,["enabled"]),focused:hu(e,["focused"])}}(e.data),index:n.length}});return n}(hn(e,"snapshot")??"",Array.isArray(r=hr(e,"refs"))?r.flatMap(e=>{let t=ht(e)?e:void 0,r=hd(hc(t,["ref","id"])??String(e));return r?[{ref:r,data:t}]:[]}):ht(r)?Object.entries(r).flatMap(([e,t])=>{let r=hd(e);return r?[{ref:r,data:ht(t)?t:void 0}]:[]}):[]);return t&&await hl(i,t),{nodes:i.map((e,t)=>({...e.node,index:t})),truncated:"boolean"==typeof(n=hr(e,"truncated"))?n:void 0}}async function hl(e,t){for(let r=0;r<e.length;r+=8){let n=e.slice(r,r+8);for(let[e,r]of(await Promise.all(n.map(e=>t(e.ref)))).entries())r&&(n[e].node.rect=r)}}function hd(e){let t=e?.trim().replace(/^@/,"");return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function hc(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.length>0)return t}}function hu(e,t){if(e)for(let r of t){let t=e[r];if("boolean"==typeof t)return t}}function hp(e){return"string"==typeof e}let hf="agent-browser",hm="Run `agent-device web setup` to install the managed web backend.";function hh(e={}){let t=e.session?.trim(),r=async r=>await hS(r,{session:t,options:e});return{async open(e){await r(["open",e])},async close(){await r(["close"])},async startRecording(e){await r(["record","start",e])},async stopRecording(){await r(["record","stop"])},snapshot:async e=>await hv(r,e),async screenshot(e,t){await r(["screenshot",...t?.fullscreen?["--full"]:[],e])},async setViewport(e,t){await r(["set","viewport",String(e),String(t)])},async click(e,t){await hg(r,e,t)},async clickRef(e){await r(["click",hb(e)])},async fill(e,t,n){await hg(r,e,t),await r(["press","darwin"===process.platform?"Meta+a":"Control+a"]),await r(["keyboard","type",n])},async fillRef(e,t){await r(["fill",hb(e),t])},async typeText(e){await r(["keyboard","type",e])},scroll:async(e,t)=>(await hw(r,e,t),t?.durationMs!==void 0?{durationMs:t.durationMs}:{}),dumpNetwork:async e=>(function(e,t={}){var r,n;let i,a=Array.isArray(i=ht(r=e)&&Array.isArray(r.requests)?r.requests:r)?i.filter(ha).map(e=>({headers:ho(e.headers),method:hn(e,"method"),mimeType:hn(e,"mimeType"),requestId:hn(e,"requestId"),resourceType:hn(e,"resourceType"),responseHeaders:ho(e.responseHeaders),status:hi(e,"status"),timestamp:function(e){if("number"==typeof e||"string"==typeof e)return e}(e.timestamp),url:hn(e,"url")})):[],o="number"==typeof(n=t.limit)&&Number.isInteger(n)?Math.max(1,Math.min(n,200)):25,s="headers"===t.include||"all"===t.include,l=a.slice(-o).reverse().map(e=>{var t,r;let n,i;return t=e,r=s,n=void 0===t.timestamp?void 0:function e(t){if("string"==typeof t){let r=Number(t);return Number.isFinite(r)?e(r):t}let r=new Date(t>1e10?t:1e3*t);return Number.isNaN(r.getTime())?String(t):r.toISOString()}(t.timestamp),i=tx({requestId:t.requestId,resourceType:t.resourceType,mimeType:t.mimeType}),tx({timestamp:n,method:t.method,url:t.url,status:t.status,requestHeaders:r?t.headers:void 0,responseHeaders:r?t.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}),d="body"===t.include||"all"===t.include?["agent-browser network requests does not expose request or response bodies."]:void 0;return{entries:l,backend:"agent-browser",redacted:!1,...d?{notes:d}:{}}})(await r(["network","requests"]),e)}}async function hw(e,t,r){for(let i of function(e){var t,r,n,i;let a,o,s,l=e?.pixels??e?.amount,d=e?.durationMs;if(void 0===d||d<=0)return[{distance:l,delayAfterMs:0}];let c=Math.max(1,Math.min(20,Math.ceil(d/50))),u=d/Math.max(1,c-1);return(t=e,r=c,a=t?.pixels??t?.amount??300,t?.amount!==void 0&&void 0===t.pixels?Array.from({length:r},()=>a/r):(o=Math.floor((n=Math.round(a))/(i=r)),s=n-o*i,Array.from({length:i},(e,t)=>t<s?o+1:o))).map((e,t)=>({distance:e,delayAfterMs:t<c-1?u:0}))}(r)){var n;await e(["scroll",t,...void 0===(n=i.distance)?[]:[String(n)]]),i.delayAfterMs>0&&await e8(i.delayAfterMs)}}async function hg(e,t,r){await e(["mouse","move",String(Math.round(t)),String(Math.round(r))]),await e(["mouse","down"]),await e(["mouse","up"])}async function hv(e,t){var r;let n=await e((r=t,["snapshot",...r?.interactiveOnly?["--interactive"]:[],...r?.raw?[]:["--compact"],..."number"==typeof r?.depth?["--depth",String(r.depth)]:[],...r?.scope?["--selector",r.scope]:[]]));return await hs(n,t?.includeRects?async t=>await hy(e,t):void 0)}async function hy(e,t){try{return function(e){let t=ht(e)&&ht(e.box)?e.box:e;if(ht(t)){var r,n;let e,i,a,o,s,l,d;return r=t,e=hi(r,"x"),i=hi(r,"y"),a=hi(r,"width"),h_(e,i,a,hi(r,"height"))??(n=t,o=hi(n,"left"),s=hi(n,"top"),l=hi(n,"right"),d=hi(n,"bottom"),h_(o,s,hx(l,o),hx(d,s)))}}(await e(["get","box",hb(t)]))}catch(t){var r;let e;if(e=(r=t)instanceof Error?r.message:String(r),!/\bstale\b/i.test(e)&&/\bbox\b|not visible|not found|no element/i.test(e))return;throw t}}async function hS(e,t){let{session:r,options:n}=t,i=[...e,"--json",...r?["--session",r]:[]],a=await hI(i,n);var o,s=function(e,t,r,n){try{return JSON.parse(e)}catch(a){let i=0!==n;throw new eG("COMMAND_FAILED",i?"agent-browser command failed":"agent-browser returned invalid JSON",{cmd:hf,args:r,...i?{exitCode:n}:{},stdout:e.slice(0,500),stderr:t.slice(0,500),hint:hm},a instanceof Error?a:void 0)}}(a.stdout,a.stderr,i,a.exitCode),l=a,d=i;if(!ht(s))return s;if(!1===(s.success??s.ok)){throw new eG("string"==typeof(o=s.code)&&o.length>0?o:"COMMAND_FAILED",function(e){let t=e.error;if("string"==typeof t&&t.trim())return t.trim();if(ht(t)){let e=hn(t,"message")??hn(t,"error");if(e)return e}return hn(e,"message")??"agent-browser command failed"}(s),{cmd:hf,args:d,hint:hn(s,"hint")??hm,agentBrowserError:s.error})}if(0!==l.exitCode)throw new eG("COMMAND_FAILED","agent-browser command failed",{cmd:hf,args:d,exitCode:l.exitCode,stdout:l.stdout.slice(0,500),stderr:l.stderr.slice(0,500),hint:hn(s,"hint")??hm});return Object.hasOwn(s,"data")?s.data:s}async function hI(e,t){let r="",n="",i=0;try{let a=await eD({stateDir:t.stateDir}),o=await ej(a.command,e,{allowFailure:!0,env:a.env,timeoutMs:3e4});r=o.stdout,n=o.stderr,i=o.exitCode}catch(r){var a,o;let t;throw a=r,o=e,"TOOL_MISSING"===(t=eP(a)).code?new eG("TOOL_MISSING",t.message,{...t.details??{},cmd:hf,args:o,hint:hA(t)},t):"COMMAND_FAILED"===t.code?new eG("COMMAND_FAILED",t.message,{...t.details??{},cmd:hf,args:o,hint:hA(t)},t):t}return{stdout:r,stderr:n,exitCode:i}}function hA(e){return"string"==typeof e.details?.hint?e.details.hint:hm}function hb(e){return e.startsWith("@")?e:`@${e}`}function h_(e,t,r,n){if(void 0!==e&&void 0!==t&&void 0!==r&&void 0!==n)return{x:e,y:t,width:r,height:n}}function hx(e,t){return void 0===e||void 0===t?void 0:e-t}function hM(){return{ok:!1,error:eU(new eG("UNAUTHORIZED","Invalid token"))}}async function hN(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 lw({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function hP(e){ef({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=ed(),r=ec({force:!0})??void 0;return{ok:!1,error:eU(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function hD(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 hk(e){o.existsSync(e)&&o.unlinkSync(e)}function hE(e){if(!o.existsSync(e))return null;try{let t=JSON.parse(o.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function hC(e){let t=hE(e);if(!t||t.pid===process.pid)try{o.existsSync(e)&&o.unlinkSync(e)}catch{}}function hR(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function hO(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 eG("COMMAND_FAILED",t))})})}(async function(e={}){let t,r,i=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}=eY(i.AGENT_DEVICE_STATE_DIR),h=e1(i.AGENT_DEVICE_DAEMON_SERVER_MODE);c2(c),function(e){if(o.existsSync(e))for(let t of o.readdirSync(e,{withFileTypes:!0})){if(!t.isDirectory())continue;let r=a.join(e,t.name,ru);if(o.existsSync(r))try{let e=rp(o.readFileSync(r,"utf8"));if(e&&function(e){let t,r=eC(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=eR(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{rm(r)}}}(m);let w=new rl(m),g=new nf({maxActiveSimulatorLeases:hR(i.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:hR(i.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:hR(i.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:hR(i.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),y=tZ(),S=n.randomBytes(24).toString("hex"),I=eC(process.pid)??void 0,A=e5(),b=function(e){let{logPath:t,stateDir:r,token:n,androidAdbProvider:i,appleRunnerProvider:o,appleToolProvider:s,linuxToolProvider:l,webProvider:d,appLogProvider:c,recordingProvider:u,deviceInventoryProvider:p,trackDownloadableArtifact:f}=e,{sessionStore:m,leaseRegistry:h}=e;async function w(e){let r=!!(e.meta?.debug||e.flags?.verbose);return await el({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:r,logPath:t},async()=>{if(!e_(e.token,n))return hM();try{return await n_(p,async()=>{let t=await m7({req:e,sessionStore:m,leaseRegistry:h});return await g(t)})}catch(e){return hP(e)}})}async function g(e,t){let n=async()=>{var n;let p,h=function(e){var t,r,n;let i,{scope:o,sessionStore:s,trackDownloadableArtifact:l}=e,d=o.runnerLogPath;o.throwIfCanceled();let c=s.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=uk(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),s.set(o.sessionName,c));let u=(i=(t={req:o.req,sessionName:o.sessionName,sessionStore:s}).sessionStore.get(t.sessionName),{req:l0(t.req,i),existingSession:i}),p=u.req;c=u.existingSession;let f=e=>(function(e,t,r){let n=ed();if(!t.ok){ef({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=ec({force:!0})??void 0;return{ok:!1,error:eU(new eG(e$(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:n.diagnosticId,logPath:e})}}return ef({level:"info",phase:"request_success"}),ec(),{ok:!0,data:function(e,t,r){var n,i;let o;if(!t)return t;let s=(n=e,o=Array.isArray((i=t).artifacts)?[...i.artifacts]:[],"screenshot"!==n.command||o.some(e=>e?.field==="path")||"string"!=typeof i.path||o.push({field:"path",path:i.path,localPath:n.meta?.clientArtifactPaths?.path,fileName:a.basename(n.meta?.clientArtifactPaths?.path??i.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,l);if(c?.recording?.invalidatedReason&&(r=o.command,nG(r)?.allowInvalidRecording!==!0))return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:c.recording.invalidatedReason}})};c&&!p.meta?.lockPolicy&&(n=o.command,nG(n)?.selectorValidationExempt!==!0)&&function(e,t){let r=lB(e,t);if(0!==r.length)throw new eG("INVALID_ARGS",`Session "${e.name}" is already bound to ${lG(e)}, but this request selected ${r.map(lj).join(", ")}.`,{session:e.name,conflicts:r.map(lj),hint:lq(e,"selector-conflict")})}(c,p.flags);let m=(e,t,r)=>{var n,i,a,o,s;let l;return n=d,i=e,a=t,o=r,s=p.meta,{...a6(n,i,a,o,l=ed().requestId,s),requestId:l}};return{type:"scope",scope:{req:p,sessionName:o.sessionName,logPath:d,existingSession:c,finalize:f,contextFromFlags:m,handlerContextFromFlags:(e,t,r)=>({...m(e,t,r),surface:s.get(o.sessionName)?.surface})}}}({scope:e,sessionStore:m,trackDownloadableArtifact:f});if("response"===h.type)return h.response;let w=h.scope,g=async e=>await v({lockedScope:w,providerScope:e,allowReplayActions:void 0===t});return t?await g(t):await nB({req:w.req,existingSession:w.existingSession,providers:{androidAdbProvider:i,appleRunnerProvider:o,appleToolProvider:s,linuxToolProvider:l,webProvider:d??((n=w,n.existingSession?.device.platform==="web"||n.req.flags?.platform==="web")?(p=r,({req:e,session:t})=>hh({session:t?.name??e.session,stateDir:p})):void 0),appLogProvider:c,recordingProvider:u}},g)};return t?await e.runAdmitted(n):await e.runLocked(n)}async function v(e){var t,r;let{lockedScope:i,providerScope:a,allowReplayActions:o}=e,s=await lP({req:i.req,sessionName:i.sessionName,logPath:i.logPath,sessionStore:m,leaseRegistry:h,invoke:w,invokeReplayAction:o?(t=i,r=a,async e=>{var i,a,o;if(i=e,a=t,i.session!==a.sessionName||(o=i.command,nG(o)?.replayScopedAction!==!0))return await w(e);if(!e_(e.token,n))return hM();try{let n=await m7({req:e,sessionStore:m,leaseRegistry:h});return n.sessionName===t.sessionName?await g(n,r):await w(e)}catch(e){return hP(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await hN({lockedScope:i,logPath:i.logPath,sessionStore:m})}return w}({logPath:f,stateDir:c,token:S,sessionStore:w,leaseRegistry:g,trackDownloadableArtifact:rD}),_=async e=>{await el({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{ef({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),ec({force:!0})})},x=async e=>{let t=m8(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
25
+ `)});await Promise.race([t,e8(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
26
+ `)})]),w.writeSessionLog(e),w.delete(e.name)},M=async()=>{let e=w.toArray();await Promise.all(e.map(x))},N=async()=>{let e,t,r=[];if("http"!==h){let t,n,i=(t=new Set,(n=v.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))rI(e);ef({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(t6);if(await e(),n<=0)break;await e8(200)}}catch(e){ef({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=eX(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=eZ(n),a=ry(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),rS(a),rb(a))throw rx();r=await rB(o?t=>{e.destroyed||e.write(e4(t))}:void 0,async()=>await b(n))}catch(e){r={ok:!1,error:eU(e)}}finally{n-=1,a&&(i.delete(a),rA(a))}e.destroyed||e.write(o?ez(r):`${JSON.stringify(r)}
27
+ `)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await hO(i,"Failed to bind socket server")}if("socket"!==h){let e=await r7({handleRequest:b,token:S});r.push(e),t=await hO(e,"Failed to bind HTTP server")}return{servers:r,socketPort:e,httpPort:t}};if(!function(e,t,r){o.existsSync(e)||o.mkdirSync(e,{recursive:!0});let n=JSON.stringify(r,null,2),i=()=>{try{return o.writeFileSync(t,n,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(i())return!0;let a=hE(t);if(a?.pid&&a.pid!==process.pid&&eT(a.pid,a.processStartTime))return!1;try{o.unlinkSync(t)}catch{}return i()}(c,p,{pid:process.pid,version:y,startedAt:Date.now(),processStartTime:I}))return l.write("Daemon lock is held by another process; exiting.\n"),c2(void 0),d(0),null;let P=[];try{var D,k,E;let e,n=await N();P=n.servers,t=n.socketPort,r=n.httpPort,D=t,k=r,E={socketPort:D,httpPort:k,token:S,version:y,codeSignature:A,processStartTime:I},o.existsSync(c)||o.mkdirSync(c,{recursive:!0}),o.writeFileSync(f,""),e=E.socketPort&&E.httpPort?"dual":E.httpPort?"http":"socket",o.writeFileSync(u,JSON.stringify({port:E.socketPort,httpPort:E.httpPort,transport:e,token:E.token,pid:process.pid,version:E.version,codeSignature:E.codeSignature,processStartTime:E.processStartTime,stateDir:c},null,2),{mode:384}),o.chmodSync(u,384),D&&s.write(`AGENT_DEVICE_DAEMON_PORT=${D}
28
+ `),k&&s.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${k}
29
+ `)}catch(t){let e=eF(t);for(let t of(l.write(`Daemon error: ${e.message}
30
+ `),P))try{t.close(()=>{})}catch{}return hk(u),hC(p),c2(void 0),d(1),null}em();let C=!1,R=async(e={})=>{if(C)return;C=!0,e.cause&&await _(e.cause),await hD(P),await M();let{stopAllIosRunnerSessions:t}=await Promise.resolve(t6);await t(),await Promise.race([ey().catch(()=>{}),e8(1e3)]),hk(u),hC(p),c2(void 0),d(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{R()}),process.on("SIGTERM",()=>{R()}),process.on("SIGHUP",()=>{R()}),process.on("uncaughtException",e=>{let t=e instanceof eG?e:eF(e);l.write(`Daemon error: ${t.message}
31
+ `),R({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof eG?t:eF(t);l.write(`Daemon error: ${r.message}
32
+ `),R({exitCode:1,cause:t})})),{httpPort:r,shutdown:R,socketPort:t,token:S}})().catch(e=>{let t=eF(e);process.stderr.write(`Daemon error: ${t.message}
33
+ `),process.exit(1)});export{mF as ANDROID_CPU_SAMPLE_DESCRIPTION,m$ as ANDROID_CPU_SAMPLE_METHOD,mt as ANDROID_FRAME_SAMPLE_DESCRIPTION,me as ANDROID_FRAME_SAMPLE_METHOD,mB as ANDROID_HPROF_SNAPSHOT_DESCRIPTION,mq as ANDROID_HPROF_SNAPSHOT_METHOD,mG as ANDROID_MEMORY_SAMPLE_DESCRIPTION,mU as ANDROID_MEMORY_SAMPLE_METHOD,fw as APPLE_MEMGRAPH_SNAPSHOT_DESCRIPTION,fh as APPLE_MEMGRAPH_SNAPSHOT_METHOD,fi as IOS_DEVICECTL_DEFAULT_HINT,cn as IOS_RUNNER_CONTAINER_BUNDLE_IDS,nZ as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,nJ as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,nf as LeaseRegistry,rl as SessionStore,sV as annotateScreenshotWithRefs,pV as withAppLogProvider,p2 as appendAppLogMarker,fb as buildAppleFrameSamplingMetadata,fx as buildAppleMemorySnapshotSupport,f_ as buildAppleSamplingMetadata,n5 as buildRunnerSequenceCommand,lq as buildSessionRecoveryHint,l6 as buildSimctlArgs,l8 as buildSimctlArgsForDevice,oB as buildSnapshotState,mK as captureAndroidHeapSnapshot,o3 as captureAndroidUiHierarchyXml,fv as captureAppleMemorySnapshot,oE as captureSnapshot,mQ as cleanupRetainedMaterializedPaths,m0 as cleanupRetainedMaterializedPathsForSession,rR as cleanupUploadedArtifact,p3 as clearAppLogFiles,rA as clearRequestCanceled,a6 as context_contextFromFlags,hh as createAgentBrowserWebProvider,oX as createDaemonRuntimeSessionStore,uz as createLocalAppleRunnerProvider,rx as createRequestCanceledError,i3 as createScopedProvider,iC as dispatchCommand,rj as emitRequestProgress,sA as ensureAndroidBlockingSystemDialogReady,od as errorResponse,i5 as filterAppleAppsByBundlePrefix,a0 as getActiveAndroidSnapshotFreshness,pW as getAppLogPathMetadata,r_ as getRequestSignal,uk as getRunnerSessionSnapshot,nL as getSessionCommandKind,s9 as getSnapshotReferenceFrame,nE as hasExplicitDeviceSelector,ai as hasScopedAppleToolProvider,rn as inferFillText,i2 as isCommandSupportedOnDevice,lX as isImplicitSessionScopeConflict,a2 as isNavigationSensitiveAction,rb as isRequestCanceled,nx as listDeviceInventory,ft as listIosDeviceApps,lB as listSessionSelectorConflicts,aD as runMacOsPressAction,aP as runMacOsReadTextAction,aQ as markAndroidSnapshotFreshness,a8 as markPendingInteractionOutcome,oa as markPostGestureStabilization,rI as markRequestCanceled,n4 as parseRunnerSequenceResult,pl as prepareIosRunner,rC as prepareUploadedArtifact,ps as prewarmIosRunnerSession,a_ as quitMacOsApp,as as readApplePlistJson,fo as readInfoPlistString,rK as readReplayTestActionProgress,pz as readSessionNetworkCapture,lt as recordTouchVisualizationEvent,sI as recoverAndroidBlockingSystemDialog,rS as registerRequestAbort,lQ as releaseSessionLease,ms as resetAndroidFramePerfStats,uJ as resolveAppleRunnerProvider,ar as resolveAppleToolProvider,ab as resolveFrontmostMacOsApp,lH as resolveImplicitSessionScope,fa as resolveIosDevicectlHint,a5 as resolveLeaseScope,aO as resolveLinuxToolProvider,pX as resolveLogBackend,iD as resolvePayloadInput,lK as resolvePublicSessionName,ry as resolveRequestTrackingId,ct as resolveRunnerAppBundleId,lY as resolveSessionLeaseForRequest,rc as resolveSessionRequestLogPath,rd as resolveSessionRunnerLogPath,oH as resolveSnapshotScope,nI as resolveTargetDevice,mY as retainMaterializedPaths,p1 as runAppLogDoctor,aa as runAppleToolCommand,fe as runIosDevicectl,aL as runLinuxToolCommand,aM as runMacOsAlertAction,ax as runMacOsPermissionAction,ak as runMacOsScreenshotAction,aN as runMacOsSnapshotAction,l9 as runSimctlForDevice,ao as runXcrun,po as runIosRunnerCommand,uZ as withAppleRunnerProvider,uO as abortAllIosRunnerSessions,uT as stopAllIosRunnerSessions,mj as sampleAndroidCpuPerf,mo as sampleAndroidFramePerf,mV as sampleAndroidMemoryPerf,fA as sampleAppleFramePerf,fg as sampleApplePerfMetrics,lW as sessionMatchesScope,oW as setSessionSnapshot,o5 as snapshotAndroid,az as snapshotLinux,aJ as readLinuxTextAtPoint,mD as startAndroidPerfettoTrace,mC as startAndroidSimpleperfProfile,pZ as startAppLog,fY as startAppleXctracePerfCapture,mk as stopAndroidPerfettoTrace,mR as stopAndroidSimpleperfProfile,p0 as stopAppLog,m2 as stopAppleRunnerForClose,fQ as stopAppleXctracePerfCapture,uR as stopIosRunnerSession,m4 as stopSessionAndroidNativePerfCapture,m6 as stopSessionAndroidSnapshotHelper,m3 as stopSessionAppLog,m5 as stopSessionApplePerfCapture,oe as stripInternalInteractionFlags,an as withAppleToolProvider,aT as withLinuxToolProvider,ri as uniqueStrings,lU as withKeyedLock,rV as withReplayTestActionProgress,mO as writeAndroidSimpleperfReport,f1 as writeAppleXctracePerfReport};