agent-device 0.17.8 → 0.17.9

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 (54) hide show
  1. package/README.md +14 -0
  2. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.8.apk → agent-device-android-multitouch-helper-0.17.9.apk} +0 -0
  3. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.9.apk.sha256 +1 -0
  4. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.8.manifest.json → agent-device-android-multitouch-helper-0.17.9.manifest.json} +4 -4
  5. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.8.apk → agent-device-android-snapshot-helper-0.17.9.apk} +0 -0
  6. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.9.apk.sha256 +1 -0
  7. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.8.manifest.json → agent-device-android-snapshot-helper-0.17.9.manifest.json} +6 -6
  8. package/dist/src/1404.js +1 -0
  9. package/dist/src/2133.js +1 -1
  10. package/dist/src/2577.js +1 -1
  11. package/dist/src/2948.js +30 -1
  12. package/dist/src/4428.js +1 -1
  13. package/dist/src/587.js +1 -1
  14. package/dist/src/7394.js +5 -5
  15. package/dist/src/8184.js +1 -1
  16. package/dist/src/8358.js +1 -1
  17. package/dist/src/9581.js +2 -2
  18. package/dist/src/9722.js +36 -36
  19. package/dist/src/9836.js +1 -1
  20. package/dist/src/9919.js +5 -5
  21. package/dist/src/android.js +3 -3
  22. package/dist/src/apple.js +1 -1
  23. package/dist/src/apps.js +1 -1
  24. package/dist/src/cli-help.js +8 -1
  25. package/dist/src/cli-output.js +1 -4
  26. package/dist/src/cli.js +18 -18
  27. package/dist/src/command-surface.js +1 -1
  28. package/dist/src/find.js +1 -1
  29. package/dist/src/generic.js +5 -5
  30. package/dist/src/index.d.ts +12 -0
  31. package/dist/src/input-actions.js +1 -1
  32. package/dist/src/input-actions~1.js +1 -1
  33. package/dist/src/interaction.js +1 -1
  34. package/dist/src/internal/bin.js +1 -1
  35. package/dist/src/react-native.js +1 -1
  36. package/dist/src/record-trace-recording.js +1 -1
  37. package/dist/src/selector-runtime.js +1 -1
  38. package/dist/src/selectors.js +1 -1
  39. package/dist/src/server.js +1 -1
  40. package/dist/src/session.js +7 -7
  41. package/dist/src/snapshot.js +1 -1
  42. package/dist/src/web.js +1 -1
  43. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +92 -4
  44. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -1
  45. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +130 -0
  46. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +4 -2
  47. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +18 -0
  48. package/package.json +3 -3
  49. package/server.json +2 -2
  50. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.8.apk.sha256 +0 -1
  51. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.8.apk.sha256 +0 -1
  52. package/dist/src/6311.js +0 -27
  53. package/dist/src/7244.js +0 -1
  54. package/dist/src/9873.js +0 -1
package/dist/src/9722.js CHANGED
@@ -1,38 +1,38 @@
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,withSuccessText as k,runScrollEdgePasses as P,splitNonEmptyTrimmedLines as E,annotateCoveredSnapshotNodes as C,parseSwipePreset as R,analyzeReactNativeOverlay as O,readLocationCoordinate as T,getClickButtonValidationError as L,areRectsApproximatelyEqual as $,isSystemScrollIndicatorLabel as F,formatScrollEdgeMessage as U,SWIPE_PATTERNS as G,successText as q,screenshotOptionsFromFlags as j,captureScrollEdgeState as V,normalizeSnapshotTree as B,isReactNativeCollapsedWarningWrapperCandidate as H,screenshotFlagsFromOptions as K,snapshotCaptureAnnotationsFrom as W,parseStringMember as X,requireIntInRange as z,inferGestureReferenceFrame as J,parseDeviceRotation as Z,buildScrollGesturePlan as Y,buildSwipePresetGesturePlan as Q}from"./9873.js";import{withDiagnosticsScope as ee,getDiagnosticsMeta as et,flushDiagnosticsToSessionFile as er,withDiagnosticTimer as en,updateDiagnosticsScope as ei,emitDiagnostic as ea}from"./432.js";import{prewarmPngWorker as eo,isKeyboardAction as es,formatScriptArg as el,encodePngAsync as ed,acquireProcessLock as ec,terminatePngWorker as eu,appendScriptSeriesFlags as ep,decodePngAsync as ef,formatScriptStringLiteral as em,formatPortableActionLine as eh,timingSafeStringEqual as ew,createAgentDevice as eg,localCommandPolicy as ev,isTouchTargetCommand as ey,mapManagedAgentBrowserError as eS,resolveAgentBrowserTool as eb,isClickLikeCommand as eA,findMistargetedTypeRefToken as eI}from"./2577.js";import{readProcessStartTime as e_,readProcessCommand as ex,resolveRuntimeTransportHints as eM,isProcessGroupAlive as eN,isAgentDeviceDaemonProcess as eD,isProcessAlive as ek}from"./5628.js";import{toAppErrorCode as eP,asAppError as eE,normalizeError as eC,AppError as eR}from"./733.js";import{runCmdBackground as eO,runCmdStreaming as eT,runCmd as eL,runCmdSync as e$,resolveExecutableOverridePath as eF,whichCmd as eU}from"./8875.js";import{buildDaemonHealthPayload as eG,consumeTextLines as eq,serializeDaemonResponseEnvelope as ej,normalizeTenantId as eV,shouldStreamRequestProgress as eB,resolveDaemonPaths as eH,resolveSessionIsolationMode as eK,shellQuoteIfNeeded as eW,resolveDaemonServerMode as eX,recordSnapshotTiming as ez,resolveDaemonCodeSignature as eJ,serializeDaemonProgressEnvelope as eZ,serializeDaemonRpcResponseEnvelope as eY}from"./8358.js";import{sleep as eQ}from"./5560.js";import{isApplePlatform as e0,resolveAppleSimulatorSetPathForSelector as e1,normalizePlatformSelector as e2,resolveDevice as e3,resolveApplePlatformName as e5,matchesPlatformSelector as e4}from"./5910.js";import{runAndroidAdb as e6,resolveIosSimulatorDeviceSetPath as e8,getAndroidBlockingDialogFocus as e9,withRetry as e7,Deadline as te,isEnvTruthy as tt,openAndroidApp as tr,classifyBootFailure as tn,streamAndroidLogcatWithAdb as ti,bootFailureHint as ta,androidDeviceForSerial as to,parseSerialAllowlist as ts,retryWithPolicy as tl,getAndroidAppState as td,classifyAndroidAppTarget as tc,captureAndroidLogcatWithAdb as tu,resolveAndroidSerialAllowlist as tp,isDeepLinkTarget as tf,formatAndroidInstalledPackageRequiredMessage as tm}from"./3340.js";import{PUBLIC_COMMANDS as th,INTERNAL_COMMANDS as tw,GESTURE_SUBCOMMAND_ERROR as tg}from"./2133.js";import{findNearestAncestor as tv,normalizeType as ty,pruneGroupNodes as tS,findNodeByLabel as tb,resolveRefLabel as tA}from"./9836.js";import{snapshotPresentationOptionsFromFlags as tI,normalizeRef as t_,findNodeByRef as tx,buildSnapshotPresentationKey as tM,centerOfRect as tN,attachRefs as tD}from"./4291.js";import{isScrollableType as tk}from"./6024.js";import{readVersion as tP,findProjectRoot as tE}from"./7244.js";import{resolveAndroidAdbProvider as tC,resolveAndroidAdbExecutor as tR}from"./2954.js";import{parseUiHierarchy as tO,ensureAndroidSnapshotHelper as tT,parseUiHierarchyTree as tL,captureAndroidSnapshotWithHelper as t$,captureAndroidSnapshotWithHelperSession as tF,parseAndroidSnapshotHelperManifest as tU,forgetAndroidSnapshotHelperInstall as tG,buildUiHierarchySnapshot as tq,stopAndroidSnapshotHelperSession as tj}from"./7394.js";import{applyCommandDefaults as tV}from"./9581.js";var tB,tH,tK={};t.r(tK),t.d(tK,{IH:()=>pX,ug:()=>pz,sE:()=>pU,Bx:()=>pq,hQ:()=>pG,WX:()=>pW,Co:()=>pV,wg:()=>pK,withAppLogProvider:()=>pL});var tW={};t.r(tW),t.d(tW,{IO:()=>ai,LB:()=>an,xY:()=>ao,eN:()=>aa,runMacOsPressAction:()=>ad,runMacOsReadTextAction:()=>al,rR:()=>ac,r5:()=>as});var tX={};t.r(tX),t.d(tX,{bu:()=>dU,abortAllIosRunnerSessions:()=>c8,hv:()=>c3,Nr:()=>uO,gE:()=>uR,FS:()=>d$,runIosRunnerCommand:()=>uC,stopAllIosRunnerSessions:()=>c9,yA:()=>c6});var tz={};t.r(tz),t.d(tz,{v:()=>uu,M:()=>up,withAppleRunnerProvider:()=>uf});var tJ={};t.r(tJ),t.d(tJ,{ensureBootedSimulator:()=>hc,SA:()=>hp,EB:()=>hl,N3:()=>hu});var tZ={};t.r(tZ),t.d(tZ,{qx:()=>iX,Ly:()=>iZ,Gr:()=>iK,vT:()=>iz,Cc:()=>iJ,withAppleToolProvider:()=>iW});var tY={};t.r(tY),t.d(tY,{readLinuxTextAtPoint:()=>aP,r:()=>ak});var tQ={};function t0(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}t.r(tQ),t.d(tQ,{uK:()=>am,nE:()=>aw,withLinuxToolProvider:()=>ah});let t1=["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 t2(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 t3(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}class t5{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&&t4(e.command))return eA(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=t2(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(!t4(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=${em(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,eA(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(el(r)),t6(e,t),ep(e,t),e.join(" ");if(1===t.positionals.length)return e.push(el(r)),ep(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(el(r)),t6(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(el(n)),ep(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(el(r)),e.push(el(n)),n.startsWith("@")&&t6(e,t),e.join(" ")}(t,r):void 0);return n||eh(e)}(e));return`${n.join("\n")}
2
- `}(e);return a.writeFileSync(t,n),{written:!0,path:t}}catch(r){return ea({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=t0(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${r}.ad`)}}function t4(e){return ey(e)||"fill"===e||"get"===e}function t6(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(el(r))}class t8{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new t5(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 t1)void 0!==e[r]&&(t[r]=e[r]);return t}(t.flags),result:t.result}),ea({level:"debug",phase:"record_action",data:{command:t.command,session:e.name}}))}writeSessionLog(e){let t=this.scriptWriter.write(e);t.written&&ea({level:"info",phase:"session_script_written",data:{session:e.name,path:t.path}})}defaultTracePath(e){let t=t0(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return i.join(this.sessionsDir,t0(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 t9(e){return i.join(e,"runner.log")}function t7(e,t){let r=t0(t&&t.length>0?t:"unknown");return i.join(e,"requests",`${r}.ndjson`)}let re="app-log.pid";function rt(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 rr(e,t){if(!e)return;let r=i.dirname(e);a.existsSync(r)||a.mkdirSync(r,{recursive:!0});let n={pid:t,startTime:e_(t)??void 0,command:ex(t)??void 0};a.writeFileSync(e,`${JSON.stringify(n)}
3
- `)}function rn(e){if(e&&a.existsSync(e))try{a.unlinkSync(e)}catch{}}let ri=new Set,ra=new Map,ro="request_canceled",rs="request canceled";function rl(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 rd(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++}}(ra);let t=new AbortController;ra.set(e,t),ri.has(e)&&t.abort()}function rc(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++}}(ri),ri.add(e),ra.get(e)?.abort())}function ru(e){e&&(ri.delete(e),ra.delete(e))}function rp(e){return!!e&&ri.has(e)}function rf(e){if(e)return ra.get(e)?.signal}function rm(){return new eR("COMMAND_FAILED",rs,{reason:ro})}function rh(e){if(rp(e))throw rm()}function rw(e){return e instanceof eR&&"COMMAND_FAILED"===e.code&&(e.details?.reason===ro||e.message===rs)}let rg=new Map;function rv(e){let t=r.randomUUID(),n=setTimeout(()=>{ry(t)},9e5);return n.unref(),rg.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),t}function ry(e){let t=rg.get(e);if(t&&(clearTimeout(t.timer),rg.delete(e),t.deleteAfterDownload))try{a.rmSync(t.artifactPath,{force:!0})}catch{}}let rS=new Map;function rb(e,t){let r=rS.get(e);if(!r)throw new eR("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eR("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function rA(e){let t=rS.get(e);t&&(clearTimeout(t.timer),rS.delete(e),a.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function rI(e){let t=await r_(e);await eL("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=i.join(e.tempDir,t);if(!a.existsSync(r))throw new eR("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function r_(e){let t=await eL("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new eR("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 eR("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(rx),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 eR("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new eR("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 eR("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 eR("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 eR("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await eL("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new eR("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rx(e){if(e.includes("\0"))throw new eR("INVALID_ARGS",`Invalid archive entry: ${e}`);if(i.posix.isAbsolute(e))throw new eR("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=i.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new eR("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function rM(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 rN(l,t).finally(()=>n(e));r()}},c=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new eR("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 eR("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{d(new eR("COMMAND_FAILED","Artifact transfer was interrupted"))}),c(),m(e,u,l).then(()=>d(),e=>d(e))})}async function rN(e,t){if(e.destroy(),!e.closed)try{await p(e,"close")}catch{}await a.promises.rm(t,{force:!0}).catch(()=>{})}async function rD(e){let t,r=e.headers["x-artifact-type"],n=e.headers["x-artifact-filename"];if(!r||!n)throw new eR("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new eR("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 eR("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 eR("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 rM(e,t),{artifactPath:t,tempDir:s}}let t=i.join(s,"artifact.tar");await rM(e,t);let n=await rI({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 rk=new h,rP=new h;async function rE(e,t){return await rk.run(e,t)}function rC(e){rk.getStore()?.(e)}async function rR(e,t){return await rP.run(e,t)}function rO(){return rP.getStore()}let rT=new Set(["replay","test"]),rL=new Set(["agent_device.command","agent-device.command"]),r$=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rF=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rU={"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"},rG=new Set([...rL,...r$,...rF,...Object.keys(rU)]);function rq(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rj(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function rV(e,t){e.destroyed||(e.write(eY(t)),e.end())}function rB(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rH(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 rK(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rW(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rX(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new eR("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function rz(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new eR("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function rJ(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=eC(new eR("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rq(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=eC(new eR(eP(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rq(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=eV(r.tenantId);if(!e){let e=eC(new eR("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rq(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rZ(){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 eR("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 eR("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:n,exportName:r});return a}async function rY(e){let t=await rZ(),{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(eG("agent-device-daemon")));return}if("POST"===e.method&&"/upload"===e.url)return void rQ(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void r0(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||rj(i,rq(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rj(i,rq(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rj(i,rq(n.id??null,-32600,"Invalid Request"),400);if(!rG.has(n.method))return void rj(i,rq(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rj(i,rq(n.id??null,-32602,"Invalid params"),400);let s=!1;try{var l,d;let a=n.params,c=function(e,t,r){if(rL.has(e))return{token:rH(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(r$.has(e)){let e,n=rK(t,"platform");if("ios"!==n&&"android"!==n)throw new eR("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:rH(t,r),session:rK(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rK(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new eR("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new eR("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 eR("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 eR("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 eR("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=rX(e,"owner"),n=rX(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new eR("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new eR("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new eR("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:rz(e,"artifactId")}:(a&&(t=rz(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rX(e,"artifactName")})}(t);throw new eR("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:rW(t,"retentionMs")}}}if(rF.has(e)){let e=rK(t,"materializationId")?.trim();if(!e)throw new eR("INVALID_ARGS","Invalid params: materializationId is required");return{token:rH(t,r),session:rK(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rK(t,"requestId"),materializationId:e}}}let n=rU[e];if(n)return{token:rH(t,r),session:rK(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rK(t,"tenantId")??rK(t,"tenant"),runId:rK(t,"runId"),leaseId:rK(t,"leaseId"),leaseTtlMs:rW(t,"ttlMs"),leaseBackend:rK(t,"backend")}};throw new eR("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(l=n.method,rL.has(l)&&("string"!=typeof c.command||0===c.command.length))return void rj(i,rq(n.id??null,-32602,"Invalid params: command is required"),400);o=rl(c.meta?.requestId,n.id),c.meta={...c.meta,requestId:o},rd(o);let u=await rJ(t,{headers:e.headers,rpcRequest:n,daemonRequest:c});if(!u.ok)return void rj(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"||rT.has(d.command))),f=!1,m=()=>{s||i.writableFinished||f||(f=!0,rc(o),ea({level:"warn",phase:"request_client_disconnected",data:{requestId:o,abortIosRunnerSessions:p}}),p&&r1(o))};if(e.on("aborted",m),i.on("close",()=>{i.headersSent&&m()}),(e.aborted||i.destroyed&&i.headersSent)&&m(),eB(c)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await rE(e=>{!i.destroyed&&i.write(eZ(e))},async()=>await r(c));s=!0;let t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rq(n.id??null,-32e3,e.error.message,e.error);rV(i,t);return}let h=await r(c);if(s=!0,h.ok)return void rj(i,{jsonrpc:"2.0",id:n.id??null,result:h});rj(i,rq(n.id??null,-32e3,h.error.message,h.error),rB(h.error.code))}catch(t){s=!0;let e=eC(t);if(i.headersSent)return void rV(i,rq(n.id??null,-32e3,e.message,e));rj(i,rq(n.id??null,-32e3,e.message,e),rB(e.code))}finally{ru(o)}})})}async function rQ(e,t,n,i){try{var a;let o,s,l=await r2({req:e,res:t,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let d=await rD(e),c=(a={artifactPath:d.artifactPath,tempDir:d.tempDir,tenantId:l.tenantId},o=r.randomUUID(),(s=setTimeout(()=>{rA(o)},3e5)).unref(),rS.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){r3(t,eC(e))}}async function r0(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 r2({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[i]}});if(!o)return;let s=function(e,t){let r=rg.get(e);if(!r)throw new eR("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eR("UNAUTHORIZED","Artifact belongs to a different tenant");if(!a.existsSync(r.artifactPath))throw ry(e),new eR("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=eC(e);t.statusCode=rB(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&ry(i)}),l.pipe(t)}catch(e){r3(t,eC(e))}}async function r1(e){try{let t=Date.now()+15e3;for(;rp(e)&&Date.now()<t;){let{abortAllIosRunnerSessions:t}=await Promise.resolve(tX);if(await t(),!rp(e))break;await eQ(200)}}catch(e){ea({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e)}})}}async function r2(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=rH({},n.headers),d=(t=l,!(r=o)||ew(t,r)?null:eC(new eR("UNAUTHORIZED","Invalid token")));if(d)return r3(i,d),null;let c=await rJ(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 r3(e,t){e.statusCode=rB(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function r5(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function r4(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function r6(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 eR("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class r8{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=r6(e.backend),n=eV(e.tenantId);if(!n)throw new eR("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=r5(e.runId);if(!i)throw new eR("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=r4(e.leaseId);if(!t)throw new eR("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);if(!r)throw new eR("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=r4(e.leaseId);if(!t)throw new eR("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=r6(e.backend),r=eV(e.tenantId);if(!r)throw new eR("INVALID_ARGS","tenant isolation requires tenant id.");let n=r5(e.runId);if(!n)throw new eR("INVALID_ARGS","tenant isolation requires run id.");let i=r4(e.leaseId);if(!i)throw new eR("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new eR("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==r||a.runId!==n)throw new eR("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 eR("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 eR("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=eV(t),i=r5(r);if(t&&!n)throw new eR("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&!i)throw new eR("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 eR("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}let r9={platform:"web",id:"agent-browser-chrome",name:"Agent Browser Chrome",kind:"device",target:"desktop",booted:!0};async function r7(e){var t;if("web"===e.platform)return[r9];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 ne=new h,nt=new h;async function nr(e,t,r){var n,i;let a=await nn(e,t,r);if(n=t,i=a,!ni(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 eR("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function nn(e,t,r){try{return await e3(e,t,r)}catch(e){var n;if(n=e,!ni(t)&&n instanceof eR&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function ni(e){return!!(e.udid||e.serial||e.deviceName)}async function na(e){let t=e2(e.platform),r=e1({simulatorSetPath:e8(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=tp(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 en("resolve_target_device",async()=>{let o=function(e){let t=ne.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 eR("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await nc({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return nu(s)?np(i,await nr(l,s,{simulatorSetPath:r})):np(i,await e3(l,s,{simulatorSetPath:r}));let d=await r7({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return nu(s)?np(i,await nr(d,s,{simulatorSetPath:r})):np(i,await e3(d,s,{simulatorSetPath:r}))},a)}async function no(e){return ne.getStore()?await e():await ne.run(new Map,e)}async function ns(e,t){return e?await nt.run(e,t):await t()}async function nl(e,t){return await ns(e,async()=>await no(t))}async function nd(e){return await nc(e)??await r7(e)}async function nc(e){let t=nt.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function nu(e){return e0(e.platform)}function np(e,t){return ne.getStore()?.set(e,{...t}),t}let nf=["platform","target","device","udid","serial"],nm=[...nf,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function nh(e){return"string"==typeof e&&e.trim().length>0}function nw(e,t){return!!e&&t.some(t=>nh(e[t]))}let ng={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},nv=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}}([...nb("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},tw.leaseAllocate,tw.leaseHeartbeat,tw.leaseRelease),nS(tw.sessionList,"session",{sessionKind:"inventory",...ng}),nS(th.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...ng}),nS(th.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...nb("session",{sessionKind:"state"},th.boot,th.shutdown,th.appState),...nb("session",{sessionKind:"observability"},th.perf,th.logs,th.network),...nb("session",{sessionKind:"replay",skipSessionlessProviderDevice:function(e){return e.command===th.test&&("number"==typeof e.flags?.shardAll||"number"==typeof e.flags?.shardSplit)}},th.replay,th.test),nS(tw.runtime,"session"),nS(th.clipboard,"session",{replayScopedAction:!0}),nS(th.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...nb("session",{},th.install,th.reinstall,tw.installSource),nS(tw.releaseMaterializedPaths,"session",ng),...nb("session",{},th.push,th.triggerAppEvent),nS(th.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...nb("session",{},th.prepare,th.batch),nS(th.close,"session",{allowInvalidRecording:!0}),...nb("snapshot",{replayScopedAction:!0},th.snapshot,th.diff,th.wait,th.alert,th.settings),nS(th.reactNative,"reactNative",{replayScopedAction:!0}),nS(th.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),nS(th.trace,"recordTrace"),nS(th.find,"find",{replayScopedAction:!0}),...nb("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},th.click,th.fill,th.longPress,th.press,th.type),...nb("interaction",{replayScopedAction:!0},th.get,th.is),...nb("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},th.back,th.gesture,th.home,th.rotate,th.scroll,th.swipe,"pinch"),nS(th.focus,"generic",{androidBlockingDialogGuard:!0}),nS(th.screenshot,"generic",{replayScopedAction:!0}),...nb("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function ny(e){return nA(e)?.sessionKind}function nS(e,t,r={}){return{command:e,route:t,...r}}function nb(e,t,...r){return r.map(r=>nS(r,e,t))}function nA(e){return nv.descriptorsByCommand.get(e)}let nI=[{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");nD(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&e0(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(tz);nD(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&&e0(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(tZ);nD(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(tQ);nD(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");nD(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(tK);nD(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");nD(t,e.recording,r)}}];async function n_(e,t){let r=await nx(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await nN(r);return await nk(i,async()=>await t(n))}async function nx(e){var t,r,n;if(t=e.providers,!nI.some(e=>!!t[e.resolverKey]))return{};let i=await nM(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return nI.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function nM(e,t){switch(function(e,t){var r;let n,i;if(t.hasExistingSession)return nA(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(r=e,"function"==typeof(i=nA(r.command)?.skipSessionlessProviderDevice)&&i(r))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(n=nA(e.command)?.allowSessionlessDefaultDevice)&&n(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:nw(e.flags,nf)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await na(e.flags??{});case"skip":return}}async function nN(e){let t=[];for(let r of nI)await r.appendWrapper(e,t);return t}function nD(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function nk(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function nP(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 eR("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let nE=/^[A-Za-z0-9_.:-]{1,64}$/,nC="--launch-console is supported only for iOS simulator app launches",nR="--launch-console requires a direct app launch and cannot be used with URL opens",nO=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function nT(e,t){if(t<=0)return[0,0];let[r,n]=nO[e%nO.length];return[r*t,n*t]}async function nL(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await eQ(t)}let n$=["tap","doubleTap","longPress","drag"];function nF(e,t,r){return new eR("INVALID_ARGS",r,{stepIndex:e,kind:"string"==typeof t?t:void 0})}function nU(e,t,r,n,i,a){if(!Number.isFinite(e)||e<t||e>r)throw nF(n,i,`sequence step ${n} (${i}) ${a} must be between ${t} and ${r}`)}function nG(e,t){if(!Array.isArray(e)||0===e.length)throw new eR("INVALID_ARGS","sequence requires at least one step",{stepCount:Array.isArray(e)?e.length:0});if(e.length>20)throw new eR("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)&&n$.includes(r)))throw nF(t,e.kind,`sequence step ${t} has unsupported kind "${String(e.kind)}"; allowed: ${n$.join(", ")}`);if(!Number.isFinite(e.x)||!Number.isFinite(e.y))throw nF(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 nF(t,e.kind,`sequence step ${t} (drag) requires finite x2 and y2`);void 0!==e.durationMs&&nU(e.durationMs,0,1e4,t,e.kind,"durationMs"),void 0!==e.pauseMs&&nU(e.pauseMs,0,1e4,t,e.kind,"pauseMs")})(e,t)),{command:"sequence",steps:e,appBundleId:t}}function nq(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 eR(eP(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 nj(e,t){let{x:r,y:n}=nz(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,...q(`Long pressed (${r}, ${n})`)}}async function nV(e,t){let{x:r,y:n}=nz(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...q(`Focused (${r}, ${n})`)}}async function nB(e,t,r){let n=eI(t[0]);if(n)throw new eR("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 eR("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,...q(il("Typed",i))}}async function nH(e,t,r){if(r?.directElementSelector)return await nK(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 eR("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,...q(il("Filled",a))}}async function nK(e,t,r,n){if(!e.fillElementSelector)throw new eR("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new eR("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??{},...q(il("Filled",i))}}async function nW(e,t,r,n){var i,a;if(n?.directElementSelector&&"ios"===e.platform)return await nX(t,n.directElementSelector);let{x:o,y:s}=nz(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await nJ(o,s,n);let l=M(n);if("primary"!==l)return await nZ(e,o,s,l,n);let d=(a=n,{count:nQ(a?.count,1,"count",1,200),intervalMs:nQ(a?.intervalMs,0,"interval-ms",0,1e4),holdMs:nQ(a?.holdMs,0,"hold-ms",0,1e4),jitterPx:nQ(a?.jitterPx,0,"jitter-px",0,100),doubleTap:!!a?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new eR("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new eR("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(d),i=d.count,e0(e.platform)&&i>1)?await n1(e,o,s,d,n):await n2(t,o,s,d)}async function nX(e,t){if(!e.tapElementSelector)throw new eR("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...q(`Tapped ${t.raw}`)}}function nz(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new eR("INVALID_ARGS",t,r);return{x:n,y:i}}async function nJ(e,t,r){let n=M(r);if("primary"!==n)throw new eR("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(tW);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...q(io({x:e,y:t}))}}async function nZ(e,t,r,n,i){if(function(e,t,r){let n=L({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 nY(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(tX);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},n3(i)),{x:t,y:r,button:n,...q(io({x:t,y:r,button:n}))}}async function nY(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,...q(io({x:e,y:t,button:r}))}}function nQ(e,t,r,n,i){return z(void 0===e?t:e,r,n,i)}async function n0(e,t,r){let n,i,{runIosRunnerCommand:a}=await Promise.resolve(tX),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,nG(t,r?.appBundleId),n3(r));n??=c,i=c;try{o=nq(c)}catch(e){throw function(e,t){if(0===t||!(e instanceof eR)||!e.details)return e;let r=e.details.failedStepIndex;if("number"!=typeof r)return e;let n=e.details.completedSteps;return new eR(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 n1(e,t,r,n,i){var a,o,s,l;let d,c,u=await n0(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]=nT(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,...q(io({x:t,y:r}))}}async function n2(e,t,r,n){let i;return await nL(n.count,n.intervalMs,async a=>{let[o,s]=nT(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}}),k({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},io({x:t,y:r}))}function n3(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 n5(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 eR("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await n6({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function n4(e,t,r,n){let i=R(r[0]),a=r[1]?Number(r[1]):300,o=J((await t.snapshot({appBundleId:n?.appBundleId})).nodes??[]);if(!o)throw new eR("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=Q(i,o,{platform:e.platform});return await n6({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function n6(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(G,f))throw new eR("INVALID_ARGS",`Invalid pattern: ${f}`);if(e0(t.platform)&&u>1){let e=await n0(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,...q(is(u,f))}}return await nL(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)}),k({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}`:is(u,f))}async function n8(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 eR("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??{},...q(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function n9(e,t){let r=X(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 eR("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new eR("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,...q(`Flung ${r}`)}}async function n7(e,t,r){var n;let i=t[0],a=t[1]?Number(t[1]):void 0,o=r?.pixels;if(!i)throw new eR("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new eR("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==o)throw new eR("INVALID_ARGS","scroll accepts either a relative amount or --pixels, not both");let s="bottom"===(n=i)?{direction:"down",edge:"bottom"}:"top"===n?{direction:"up",edge:"top"}:{direction:A(n)},l={},d=0;if(s.edge){let t=s.edge,n=await P({edge:t,captureState:async n=>await ie(e,r,t,n),scroll:async()=>await e.scroll(s.direction,{amount:a,pixels:o})});l=n.result??{},d=n.passes}else l=await e.scroll(s.direction,{amount:a,pixels:o}),d=1;return k({direction:s.direction,...s.edge?{edge:s.edge,passes:d}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},U(s.direction,s.edge,d,a,o))}async function ie(e,t,r,n){if("function"!=typeof e.snapshot)throw new eR("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await V({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,scope:e})).nodes??[]})}async function it(e,t,r,n){if("tv"===e.target)throw new eR("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new eR("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 eR("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...q(`Pinched to scale ${i}`)}}async function ir(e,t,r){if("tv"===e.target)throw new eR("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new eR("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 eR("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 eR("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 eR("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 eR("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,...q(`Rotated gesture ${n} degrees`)}}async function ii(e,t,r){if("tv"===e.target)throw new eR("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new eR("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 eR("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new eR("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,...q(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function ia(e,t,r){let{x:n,y:i}=nz(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(tY);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(tW);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(tX),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 io(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function is(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function il(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 eR("INVALID_ARGS",`${n} cannot be empty`);let o=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!a.statSync(o).isFile())throw new eR("INVALID_ARGS",`${n} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof eR)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new eR("INVALID_ARGS",`${n} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new eR("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 eR("INVALID_ARGS",`${n} file not found: ${o}`)}async function ic(e){let t=id(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await iu(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new eR("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof eR)throw t;throw new eR("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function iu(e){try{return await s.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new eR("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new eR("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new eR("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new eR("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function ip(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 nP(e,a);return ea({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await en("platform_command",async()=>await im(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function im(e,t,r,n,i,a,o){switch(r){case"open":return await ih(e,t,n,a);case"close":{let r=n[0];if(!r)return"web"===e.platform&&await t.close(""),{closed:"session",...q("Closed session")};return await t.close(r),{app:r,...q(`Closed: ${r}`)}}case"press":return await nW(e,t,n,a);case"swipe":return await n5(e,t,n,a);case"swipe-preset":return await n4(e,t,n,a);case"pan":return await n8(t,n);case"fling":return await n9(t,n);case"longpress":return await nj(t,n);case"focus":return await nV(t,n);case"type":return await nB(t,n,a);case"fill":return await nH(t,n,a);case"scroll":return await n7(t,n,a);case"pinch":return await it(e,t,n,a);case"rotate-gesture":return await ir(e,t,n);case"transform-gesture":return await ii(e,t,n);case"trigger-app-event":return await iw(e,t,n,a);case"screenshot":return await ig(t,n,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...q("Back")};case"home":return await t.home(),{action:"home",...q("Home")};case"rotate":{let e=Z(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...q(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...q("Opened app switcher")};case"clipboard":return await iv(t,n);case"keyboard":return await iy(e,n,a,o);case"settings":return await iA(e,t,n,a);case"push":return await iI(e,n,a);case"snapshot":return await i_(t,a);case"read":return await ia(e,n,a);default:throw new eR("INVALID_ARGS",`Unknown command: ${r}`)}}async function ih(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new eR("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new eR("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new eR("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...q("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new eR("UNSUPPORTED_OPERATION",nC);if("linux"===e.platform&&s&&s.length>0)throw new eR("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(tf(i))throw new eR("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!tf(a))throw new eR("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new eR("INVALID_ARGS",nR);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...q(`Opened: ${i}`)}}if(o&&tf(i))throw new eR("INVALID_ARGS",nR);if(n?.clearAppState){if(tf(i))throw new eR("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}:{},...q(`Opened: ${i}`)}}async function iw(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new eR("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!nE.test(t))throw new eR("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 eR("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 eR("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 eR("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof eR)throw t;throw new eR("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 eR("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 eR("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",...q(`Triggered app event: ${i}`)}}async function ig(e,t,r,n){let a=t[0]??r??`./screenshot-${Date.now()}.png`;await s.mkdir(i.dirname(a),{recursive:!0});let o=j(n);return await e.screenshot(a,{appBundleId:n?.appBundleId,fullscreen:o.fullscreen,stabilize:o.stabilize,surface:n?.surface}),{path:a,...q(`Saved screenshot: ${a}`)}}async function iv(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new eR("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new eR("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new eR("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,...q("Clipboard updated")}}async function iy(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!es(i))throw new eR("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new eR("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await iS(e,i);if("ios"===e.platform)return await ib(e,i,r,n);throw new eR("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function iS(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...q("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 ib(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new eR("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(tX),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...q("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(tX),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...q(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function iA(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new eR("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new eR("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");ea({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?k({setting:i,state:"clear",...s},ix(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...q(`Cleared user data for ${r}`)}}if(!a)throw new eR("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:T(o,"latitude"),longitude:T(s,"longitude")}:void 0;ea({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?k({setting:i,state:a,...u},ix(u)??`Updated setting: ${i}`):{setting:i,state:a,...q(`Updated setting: ${i}`)}}async function iI(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new eR("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await ic(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...q(`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,...q(`Pushed notification to ${n}`)}}async function i_(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 ix(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let iM=e=>"macos"!==e.platform,iN=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,iD=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,ik={device:!0},iP={},iE={device:!0},iC=new Set(["open","close","find","get","is","network","screenshot","snapshot","wait","click","fill","focus","press","scroll","type"]),iR={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},iO={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP,supports:iM},iT=function(e){let t={};for(let[r,n]of Object.entries(e))t[r]=iC.has(r)?{...n,web:iE}:n;for(let t of iC)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:iP,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:iP,supports:e=>"android"===e.platform||iN(e),unsupportedHint:iD},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP,supports:e=>"android"===e.platform||iN(e),unsupportedHint:iD},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP,supports:e=>"android"===e.platform||iN(e),unsupportedHint:iD},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP,supports:iM},open:iR,close:iR,reinstall:iO,install:iO,"install-from-source":iO,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP,supports:iM},shutdown:{apple:{simulator:!0},android:{emulator:!0},linux:iP},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik,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:iP,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:ik},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP},snapshot:iR,diff:iR,screenshot:iR,wait:iR,get:iR,find:iR,is:iR,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik,supports:iM},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP,supports:iM},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP,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:ik},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},"trigger-app-event":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iP},type:iR});function iL(e,t){let r=iT[e];if(!r)return!0;let n=e0(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 i$(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 iF(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function iU(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 eR("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 eR("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 eR("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 eR("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 eR("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await iG(e,t,r)}}async function iG(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 iF((await Promise.all(Array.from(a).map(async e=>{let r=await iq(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 iq(e,t){for(let r of[i.join(e,"Contents","Info.plist"),i.join(e,"Info.plist")]){let e=await t(r),n=ij(e,"CFBundleIdentifier"),i=ij(e,"CFBundleDisplayName"),a=ij(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function ij(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let iV={runCommand:eL,simctl:{run:async(e,t)=>await eL("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await eL("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await iY(eL,e)},macosHost:iU(eL,async e=>await iY(eL,e)),whichCommand:eU},iB=i$(iV,function(e){return"function"==typeof e?iH({runCommand:e}):iH(e)});function iH(e={}){let t={...iV,...e},r=e.plist??{readJson:async e=>await iY(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??iU(t.runCommand,async e=>await r.readJson(e))}}function iK(e){return iB.resolve(e)}async function iW(e,t){return await iB.run(e,t)}function iX(){return iB.hasScope()}async function iz(e,t,r){return await iK().runCommand(e,t,r)}async function iJ(e,t){let r=iK(),[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 iz("xcrun",e,t)}async function iZ(e){return await iK().plist?.readJson(e)??null}async function iY(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 iQ="agent-device-macos-helper",i0="AGENT_DEVICE_MACOS_HELPER_BIN",i1=i.join(u.homedir(),".agent-device","macos-helper","current"),i2=i.join(i1,"manifest.json"),i3=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function i5(e){let t=e.trim();if(!i3.test(t))throw new eR("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function i4(e,t){t.bundleId&&e.push("--bundle-id",i5(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function i6(){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 eR("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(d(import.meta.url))}async function i8(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 i8(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function i9(e){let t=await i8(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 iz("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 i7(){try{let e=JSON.parse(await s.readFile(i2,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function ae(){let e=await eF(process.env[i0],i0);if(e)return e;let t=i6(),r=await i9(t),n=i.join(i1,iQ);try{if(await i7()===r)return await s.access(n),n}catch{}let a=i.join(i6(),".build","release",iQ);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await iz("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await s.mkdir(i1,{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(i2,`${JSON.stringify({fingerprint:r},null,2)}
4
- `,"utf8"),n}async function at(){let e=process.env[i0]?.trim();if(e){let t=await eF(e,i0);if(t)return t}if(iX())return iQ;if("darwin"!==process.platform)throw new eR("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await ae()}async function ar(e){let t={allowFailure:!0,timeoutMs:3e4},r=iK().macosHelper,n=r?iQ:await at(),i=r?await r.run(e,t):await iz(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 eR("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 an(){return await ar(["app","frontmost"])}async function ai(e){return await ar(["app","quit","--bundle-id",i5(e)])}async function aa(e,t){return await ar(["permission",e,t])}async function ao(e,t={}){let r=["alert",e];return i4(r,t),await ar(r)}async function as(e,t={}){let r=["snapshot","--surface",e];return i4(r,t),await ar(r)}async function al(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return i4(n,r),await ar(n)}async function ad(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return i4(n,r),await ar(n)}async function ac(e,t={}){let r=["screenshot","--out",e];return i4(r,t),t.fullscreen&&r.push("--fullscreen"),await ar(r)}let au={"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"},ap={runCommand:eL,whichCommand:eU,desktop:ag(eL,eU),clipboard:av(eL,eU),screenshot:ay(eL,eU)},af=i$(ap,function(e={}){let t={...ap,...e};return{...t,desktop:e.desktop??ag(t.runCommand,t.whichCommand),clipboard:e.clipboard??av(t.runCommand,t.whichCommand),screenshot:e.screenshot??ay(t.runCommand,t.whichCommand)}});function am(e){return af.resolve(e)}async function ah(e,t){return await af.run(e,t)}async function aw(e,t,r){return await am().runCommand(e,t,r)}function ag(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=>{ea({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await eQ(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 av(e,t){return{async readText(){let r=aA[await ax(t,aS)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=aI[await ax(t,aS)](r);await e(n.cmd,n.args,n.options)}}}function ay(e,t){return{async capture(r){let n=a_[await ax(t,ab)](r);await e(n.cmd,n.args,n.options)}}}let aS={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."},ab={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."},aA={"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}}},aI={"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}})},a_={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 ax(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 eR("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let aM="atspi-dump.py",aN=null;async function aD(e,t={}){let r,n=am().accessibility;if(n)return await n.captureTree(e,t);if("linux"!==process.platform)throw new eR("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await am().whichCommand("python3"))throw new eR("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(aN)return aN;let e=i.dirname(d(import.meta.url));for(let t=0;t<5;t++){let r=i.join(e,"src","platforms","linux",aM);if(a.existsSync(r))return aN=r,r;if(0===t){let t=i.join(e,aM);if(a.existsSync(t))return aN=t,t}e=i.dirname(e)}throw new eR("TOOL_MISSING",`Cannot find ${aM}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(l)],u=await aw("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 eR("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new eR("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new eR("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new eR("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=au[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 ak(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&ea({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await aD(t);return{nodes:r.nodes,truncated:r.truncated}}async function aP(e,t,r){let{nodes:n}=await ak(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:aE(e.rect)-aE(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 aE(e){return(e?.width??0)*(e?.height??0)}let aC=[250,400,600];function aR(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?a$(n?.nodes??[]):void 0,routeComparable:i}}function aO(e){if(!e||"android"!==e.device.platform)return;let t=e.androidSnapshotFreshness;if(t)return Date.now()-t.markedAt>2500?void delete e.androidSnapshotFreshness:t}function aT(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function aL(e){return"press"===e||"click"===e||"back"===e||"open"===e}function a$(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 aF(e,t,r,n,i){return{requestId:i??et().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,...K(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,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 aU(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!aK(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=aV(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:aj(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function aG(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function aq(e){let{session:t,pending:r,snapshot:n}=e,i=aB(r.preSignature,aV(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await ip(t.device,r.command,r.positionals,r.flags?.out,{...aF(e.logPath,r.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),ea({level:"info",phase:"interaction_no_change_retry",data:{action:r.action,attemptsRemaining:r.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function aj(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function aV(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 aB(e,t){return 0===e.length||0===t.length?"ambiguous":aH(e,t)?"unchanged":"changed"}function aH(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r+=1){let n=e[r],i=t[r];if(!n||!i||n.key!==i.key||Math.abs(n.x-i.x)>1||Math.abs(n.y-i.y)>1||Math.abs(n.width-i.width)>1||Math.abs(n.height-i.height)>1)return!1}return!0}function aK(e){return"ios"===e.device.platform||"android"===e.device.platform}function aW(e,t,r=[],n){var i,a,o;aJ(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 aX(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function az(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!aJ(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=aV(e.readSnapshot(o).nodes);for(;a<2||Date.now()-i<1500;){await eQ(200),a+=1;let l=await r(),d=aV(e.readSnapshot(l).nodes);if(aH(s,d))return aX(t),ea({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 aX(t),ea({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function aJ(e){return"ios"===e||"android"===e}function aZ(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let aY=new WeakMap;function aQ(e,t){if(!e[t])return[];let r=a2(e)[t]??t+1;return e.slice(t+1,r)}function a0(e,t,r){let n=a2(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function a1(e,t,r){let n=a2(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function a2(e){let t=aY.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 aY.set(e,r),r}function a3(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 a5(e,t){let r=ty(e.type??""),n=e.label?.trim();return!!(a4(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function a4(e){return"button"===ty(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function a6(e){let t=ty(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function a8(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function a9(e){let t;for(let i of e){var r,n;let e=ty(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||a7(r)>a7(n)))&&(t=i.rect)}return t}function a7(e){return e?e.width*e.height:0}function oe(e){let t=ty(e.type??"");return"scrollview"===t||"scrollarea"===t}function ot(e,t){return!0===e||!!t||void 0}function or(e,t,r,n){a1(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=ty(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function on(e,t,r,n){a1(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=ty((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function oi(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===ty(n.type??"")&&t(n,i,r)}}function oa(e,t,r,n){for(let i of e)(a5(i,t)||n&&os(i,n))&&r.add(i.index)}function oo(e,t,r){if("button"!==ty(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&$(e.rect,t.rect)}function os(e,t){return"button"===ty(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&$(e.rect,t.rect)}let ol=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=a9(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"===ty(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),a1(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==ty(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&&F(t))})(r)&&function(e,t,r){var n,i,a,o;a6(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&&a6(e.type)?e:null)??a3(e,t,e=>a6(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,a8(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:ot(i.hiddenContentAbove,o.above),hiddenContentBelow:ot(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"!==ty(n.type??""))continue;if("Search"===n.label){on(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=a0(e,r,e=>"searchfield"===ty(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),on(e,r,i.index,t))}})(e,o),r=e,n=o,oi(r,(e,t,i)=>{a0(r,i,r=>{let n;return("button"===(n=ty(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&($(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=ty(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,oi(i,(e,t,r)=>{let n;H(e)&&_(e,(n=[],a1(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=ty(r.type??"");if("statictext"===a||"link"===a)return or(e,t,n,i);if("other"===a){if(function(e,t,r){return!!a0(e,t,e=>{let t=ty(e.type??"");return("link"===t||"searchfield"===t||a6(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);or(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=a9(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==ty(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)||!a3(e,t,oe)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=a7(e),i=a7(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&a8(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=ty(r.type??"");if("button"===a)return oa(aQ(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=aQ(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==ty(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=>oo(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&a8(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&&(oo(a,t,r)||os(a,t)||function(e,t){if("switch"!==ty(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||a5(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=>oo(e,t,r));if(!i){e.some(a4)&&oa(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&a8(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),oa(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function od(e){let t=await oc(e);if(t)return t;let r=await ov(e);return aT(e.session),{snapshot:r.snapshot,...r.annotations}}async function oc(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!aK(e)||Date.now()-t.markedAt>3e4?void aG(e):t}(e.session);if(t&&e.session)return await ou({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await ow({...e,session:e.session});let r=aO(e.session);if(r&&"android"===e.device.platform)return await om(e,r)}async function ou(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await op(e,t,await og(e)),l=await aq({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await op(e,t,await og(e)),l=await aq({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(aG(i),s=await az({session:i,initial:s,capture:async()=>await og(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.annotations.freshness?.staleAfterRetries!==!0&&aT(i),"unchanged"===l.change)?ea({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}}):ea({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 op(e,t,r){let n=r;return"unchanged"!==aB(t.preSignature,aV(n.snapshot.nodes))?n:(await eQ(500),n=await og(e))}async function of(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await ak(r?.surface);return ob({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?ob(await as(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await ip(t,"snapshot",[],i,{...aF(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath),snapshotIncludeRects:e.includeRects})}async function om(e,t){let r=await oh(e,t);return{snapshot:r.snapshot,...r.annotations}}async function oh(e,t){let r=await ov(e),n=oy(r,t,e),i=0,a=t.markedAt+1500;for(let o of aC){if(!n)break;let s=a-Date.now();if(s<=0)break;await eQ(Math.min(o,s)),r=await ov(e),i+=1,n=oy(r,t,e)}n||aT(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,...W({freshness:o})}}}async function ow(e){let t=await az({session:e.session,capture:async()=>await og(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,...t.annotations}}async function og(e){let t=aO(e.session);return t&&"android"===e.device.platform?await oh(e,t):await ov(e)}async function ov(e){var t;let r=Date.now(),n=await of(e);return ez(e.session,{durationMs:Date.now()-r,backend:n.backend,platform:e.device.platform}),{data:n,snapshot:oS(n,void 0===(t=e).snapshotScope?t.flags:{...t.flags,snapshotScope:t.snapshotScope}),annotations:W(n)}}function oy(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&&aL(t.action)&&function(e,t){if(!e||0===e.length)return!1;let r=Math.max(e.length,t.length);if(r<12)return!1;let n=a$(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 oS(e,t){var r,n,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=B(s?o:tS(o)),d=t?.snapshotScope&&e?.backend!=="macos-helper"?oA(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 ol)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=tD(s?c:C(c)),p=W(e).quality;return{nodes:u,truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,...p?{snapshotQuality:p}:{},presentationKey:tM(tI(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function ob(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=oA(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:oI(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=oI(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function oA(e,t){let r=tb(tD(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 oI(a,i)}function oI(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 o_(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return aZ("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=t_(e.trim());if(!n)return aZ("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=tx(e.nodes,n);if(r=t?tA(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:aZ("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function ox(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function oM(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?ea({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function oN(e){let{session:t,sessionName:r,outPath:n,outputPlacement:a,dispatchContext:o}=e,l=eg({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...n,...K(a),surface:a?.surface};return"out"===r?oD(await ip(t.device,"screenshot",[],i,o)):oD(await ip(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:o}),artifacts:{resolveInput:async()=>{throw new eR("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:oM({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:ev()});return await l.capture.screenshot({session:r,requestId:o.requestId,appBundleId:t.appBundleId,...j(o),surface:t.surface,...n?{out:{kind:"path",path:n}}:{}})}function oD(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function ok(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function oP(e,t){let r=Math.max(24,Math.round(.2*Math.min(e.size,t.size))),n=Math.max(48,Math.round(.15*Math.min(e.crossSize,t.crossSize)));return Math.abs(e.size-t.size)<=r&&Math.abs(e.crossSize-t.crossSize)<=n}function oE(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let oC=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function oR(e,t={}){let r=tC(e,t.helperAdb).exec;return(await oF(e,t,r)).xml}async function oO(e,t={}){let r=tC(e,t.helperAdb).exec,n=await oF(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=tO(i,void 0,t),s=oT(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 oX(e,o.nodes,i,r),o.nodes),{...o,...oL(s),androidSnapshot:n.metadata}}let o=tL(i),s=tq(o,void 0,t),l=oT(s.truncated,n.metadata);a&&await o$({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:d,...c}=s;return{...c,...oL(l),androidSnapshot:n.metadata}}function oT(e,t){return!0===e||!0===t.helperTruncated||e}function oL(e){return!0===e?{truncated:!0}:{}}async function o$(e){if(oJ(e.interactiveSnapshot.nodes).size>0||oz(e.xml))return;let t=tq(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await oX(e.device,t.nodes,e.xml,e.adb);o2(r,t,e.interactiveSnapshot),0===r.size&&o2(x(tD(t.nodes)),t,e.interactiveSnapshot)}async function oF(e,t,r){let n=await en("android_snapshot_helper_artifact_resolution",async()=>await oK(t.helperArtifact));return n.artifact?await oU(e,t,r,n.artifact):(ea({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await oW(e,n.fallbackReason,r))}async function oU(e,t,r,n){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),d=tC(e,t.helperAdb);try{let e=await oG(t,r,d,n,l);return e.installed&&await tj(l),a=await oq(t,r,d,n,l),o=n,s=e.reason,{xml:a.xml,metadata:{backend:"android-helper",helperVersion:o.manifest.version,helperApiVersion:a.metadata.helperApiVersion,helperTransport:a.metadata.transport,helperSessionReused:a.metadata.sessionReused,installReason:s,waitForIdleTimeoutMs:a.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:a.metadata.waitForIdleQuietMs,timeoutMs:a.metadata.timeoutMs,maxDepth:a.metadata.maxDepth,maxNodes:a.metadata.maxNodes,rootPresent:a.metadata.rootPresent,captureMode:a.metadata.captureMode,windowCount:a.metadata.windowCount,nodeCount:a.metadata.nodeCount,helperTruncated:a.metadata.truncated,elapsedMs:a.metadata.elapsedMs}}}catch(t){return await oj({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function oG(e,t,r,n,i){let a=await en("android_snapshot_helper_install",async()=>await tT({adb:t,adbProvider:r,artifact:n,deviceKey:i,installPolicy:e.helperInstallPolicy,timeoutMs:3e4}),{packageName:n.manifest.packageName,versionCode:n.manifest.versionCode,installPolicy:e.helperInstallPolicy??"missing-or-outdated"});return ea({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,t,r,n,i){let a={adb:t,adbProvider:r,deviceKey:i,helperVersion:n.manifest.version,helperVersionCode:n.manifest.versionCode,packageName:n.manifest.packageName,instrumentationRunner:n.manifest.instrumentationRunner,waitForIdleTimeoutMs:e.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await en("android_snapshot_helper_session_capture",async()=>await tF(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){ea({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:eC(e).message}}),await oV(t,n.manifest.packageName)}return await en("android_snapshot_helper_capture",async()=>await t$(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function oj(e){let t=function(e){var t;let r=eC(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=oH(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=oB(e);return new eR(eP(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=oB(e.error);return ea({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tj(e.helperDeviceKey),await oV(e.adb,e.artifact.manifest.packageName),tG({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oW(e.device,r,e.adb)}async function oV(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await eQ(150),ea({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){ea({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:eC(e).message}})}}function oB(e){let t=eC(e),r=oH(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 oH(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 oK(e){if(e)return{artifact:e};let t=tP(),r=i.join(tE(),"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=tU(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:eC(e).message}}}async function oW(e,t,r){let n;try{n=await en("android_snapshot_stock_capture",async()=>await oZ(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new eR(eP((r=eC(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 oX(e,t,r,n){if(!t.some(e=>tk(e.type)))return new Map;let i=oJ(t);if(i.size>0||oz(r))return i;let a=await o1(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(tk(e.className)){let r=function(e){let t=e.children[0];if(!t)return null;let r=Math.max(t.rect.height,...t.children.map(e=>e.rect.y+e.rect.height)),n=t.children.filter(e=>e.rect.height>0).map(t=>oE(t.rect,e.rect)).sort((e,t)=>e.start-t.start);return 0===n.length?null:{rect:e.rect,contentExtent:r,contentBlocks:n}}(e);r&&t.push(r)}r.push(...e.children)}return t}(r);if(0===n.length)return new Map;let i=new Map;for(let t of e){if(!t.rect||!tk(t.type))continue;let r=function(e,t){let r=null,n=1/0;for(let i of t){let t=Math.abs(i.rect.width-e.width)+Math.abs(i.rect.height-e.height);if(t>32)continue;let a=4*t+(Math.abs(i.rect.x-e.x)+Math.abs(i.rect.y-e.y));a<n&&(r=i,n=a)}return r}(t.rect,n);if(!r)continue;let a=function(e,t){let r=function(e,t){let r=t,n=new Set;for(;!n.has(r.index);){var i,a;n.add(r.index);let o=e.filter(e=>e.parentIndex===r.index&&e.rect);if(1!==o.length)return r;let s=o[0];if(i=s.rect,a=t.rect,i.x!==a.x||i.y!==a.y||i.width!==a.width||i.height!==a.height)return r;r=s}return t}(e,t);return e.filter(e=>e.parentIndex===r.index&&e.rect).map(e=>e.rect).filter(e=>e.height>0).sort((e,t)=>e.y-t.y).map(e=>oE(e,t.rect))}(e,t),o=function(e){let{viewportRect:t,visibleBlocks:r,nativeScrollView:n}=e;if(0===r.length||0===n.contentBlocks.length)return null;let i=function(e){if(0===e.contentBlocks.length)return null;let t=e.contentBlocks[0],r=e.contentBlocks[e.contentBlocks.length-1];if(!t||!r)return null;let n=ok(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(!oP(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(!oP(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?ok(o):a.length>0?ok(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 oz(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function oJ(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 oZ(e,t=tR(e)){try{return await e7(()=>oY(t),{shouldRetry:o0})}catch(t){var r,n;let e;if((r=t)instanceof eR&&"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 eR("COMMAND_FAILED",`Android UI hierarchy dump timed out while waiting for the UI to become idle. ${e}`,{...t.details??{},hint:e},t)}throw t}}async function oY(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=oQ(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 eR("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=oQ(c.stdout,c.stderr);if(!u)throw new eR("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:c.stdout,stderr:c.stderr});return u}function oQ(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 o0(e){if(!(e instanceof eR)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return oC.some(e=>r.includes(e))}async function o1(e,t=tR(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 o2(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 o3=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,o5=/^close app$/i,o4="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function o6(e){let t,{session:r}=e;if("android"!==r.device.platform||!r.recording)return{status:"absent"};try{t=await sr(r)}catch(e){return ea({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=si(t);if(!n?.rect)return{status:"absent"};try{let e=await sn(r,n);if(!e.ok)return ea({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 sa(r))return ea({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 tr(r.device,r.appBundleId),!await so(r,r.appBundleId)))return ea({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 ea({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 ea({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 o8(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await e9(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await o9(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 se({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 se({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${st(a)}. Automatic recovery failed.`,hint:o4})}throw se({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${st(a)}.`,hint:o4})}async function o9(e){try{return await o7(e)}catch(t){return ea({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 o7(e){if(!e.appBundleId)return!1;let t=si(await sr(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await sn(e,t);if(!r.ok)return!1;await tr(e.device,e.appBundleId);let n=await so(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&ea({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 se(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new eR("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function st(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function sr(e){return tD(tS((await oO(e.device,{interactiveOnly:!1})).nodes))}async function sn(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=tN(t.rect),i=await e6(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 si(e,t={}){if(!1===t.requireDialogSignal||sd(e))return e.find(e=>sl(e).some(e=>o5.test(e))&&e.rect)}async function sa(e){for(let t=0;t<12;t+=1){if(!sd(await sr(e)))return!0;await eQ(500)}return!sd(await sr(e))}async function so(e,t,r={}){for(let n=0;n<12;n+=1){if(await ss(e,t,r))return!0;await eQ(500)}return await ss(e,t,r)}async function ss(e,t,r){return!(r.requireNoBlockingDialog&&await e9(e.device))&&(await td(e.device)).package===t}function sl(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 sd(e){return e.some(e=>{let t=sl(e).join(" ").trim();return t.length>0&&o3.test(t)})}function sc(e){return!!(e&&e.width>0&&e.height>0)}function su(e){return e.width*e.height}function sp(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],sm=[255,214,10,255],sh=[0,0,0,255],sw=["scroll","list","recyclerview","edittext","textfield"],sg=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],sv={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 sy(e){let t=await s.readFile(e.screenshotPath),r=await ef(t,"screenshot"),n=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)sA(r)&&sc(r.rect)&&(!t||su(r.rect)>su(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&&sc(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 sc(e.rect)&&!("image"===ty((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(sx)||sM(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!sc(r.rect)||sA(r))return!1;let n=ty(r.type??"");return!(sw.some(e=>n.includes(e))||t&&su(r.rect)>.25*su(t))}(e,t,r)||(sb(r)?n:n&&function(e){let t=ty(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 sb(e)&&!sA(e)}(s=n)?s:null,tv(o,s,e=>(function(e){return sb(e)&&!sA(e)})(e)),s.hittable?s:null,tv(o,s,e=>!0===e.hittable)].find(sI)??null);if(!l?.rect||!sc(l.rect))continue;let d=function(e,t,r){let n=sN(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=sN(n);if(!i)continue;let a=function(e){let t=0;return ty(e.type??"").includes("text")&&(t+=2),sx(e.label)&&(t+=2),sx(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||sN(t)}(n,l,e.nodes),c=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),sb(t)&&(n+=3),sb(e)&&(n+=2),r&&(n+=2),sM(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=sb,i=e=>!!sN(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=ty(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&sc(t.rect)&&sp(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=sS(e,i,u,t,r);if(!sc(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=O(e.nodes).primaryAction;if(!a?.ref||!a.rect||!sc(a.rect))return;let o=sS(e,t,a.rect,n,i);if(!sc(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)=>su(e.overlayRect)-su(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(sp(e.overlayRect,r.overlayRect)||sp(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}su(r.overlayRect)<su(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(sO).slice(0,n.maxRefs??24).sort(sR).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:tN(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)sP(e,t.x,t.x+t.width-1,t.y+n,r),sP(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),sE(e,t.x+n,t.y,t.y+t.height-1,r),sE(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=sk(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:sk(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)sC(e,t+o,r+a,i)})(e,i,o,n,sm),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=sv[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]&&sC(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,sh)}(i,a.overlayRect,a.ref)}return await s.writeFile(e.screenshotPath,await ed(r)),n}function sS(e,t,r,n,i){if("android"===e.backend||!t)return sD(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 sD({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 sb(e){let t=[e.type,e.role,e.subrole].map(e=>ty(e??"")).join(" ");return sg.some(e=>t.includes(e))}function sA(e){let t=[e.type,e.role,e.subrole].map(e=>ty(e??"")).join(" ");return t.includes("application")||t.includes("window")}function sI(e){return!!(e?.rect&&sc(e.rect)&&!sA(e))}function s_(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function sx(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 sM(e){var t;return"string"==typeof e&&!!sx(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function sN(e){let t=[e.label,e.value].find(sx);return t?t.trim():sM(e.identifier)?e.identifier.trim():void 0}function sD(e,t,r){let n=sk(e.x,0,Math.max(0,t-1)),i=sk(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:sk(e.width,1,a),height:sk(e.height,1,o)}}function sk(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function sP(e,t,r,n,i){for(let a=t;a<=r;a+=1)sC(e,a,n,i)}function sE(e,t,r,n,i){for(let a=r;a<=n;a+=1)sC(e,t,a,i)}function sC(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 sR(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 sO(e,t){return t.score!==e.score?t.score-e.score:sR(e,t)}function sT(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 sL=new WeakMap;function s$(e){if(!e)return;let t=sL.get(e);if(t)return t;let r=sF(e.nodes??[]);if(r)return sL.set(e,r),r}let sF=J,sU={referenceWidth:1e3,referenceHeight:1e3};function sG(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=sX(S.effectiveDurationMs)??sX(S.durationMs),A={recordingStartedAt:y.startedAt,gestureClockOriginAtMs:y.gestureClockOriginAtMs,gestureClockOriginUptimeMs:y.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===y.platform?y.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:sX(S.gestureStartUptimeMs),gestureEndUptimeMs:sX(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},I="number"==typeof(s={gestureStartUptimeMs:sX(S.gestureStartUptimeMs),gestureEndUptimeMs:sX(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===sX(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sz(sX(t.count),1)??1,r=!0===t.doubleTap,n=sz(sX(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 sT(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...A,gestureDurationMs:I}):sT(A),x=(l=e.snapshot,w=sX((d=S).referenceWidth),g=sX(d.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:s$(l)),M=(c=t,u=r,p=S,f=_,m=I,h=x,v=sq[c],v?.(u,p,f,m,h)??[]);0!==M.length&&(y.gestureEvents.push(...M),ea({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 sq={click:(e,t,r,n,i)=>sj(e,t,r,i),press:(e,t,r,n,i)=>sj(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?sj(e,t,r,i):[],fill:(e,t,r,n,i)=>sV(e,t,r,i),focus:(e,t,r,n,i)=>sV(e,t,r,i),longpress:function(e,t,r,n,i){let a=sJ(t,e);if(!a)return[];let{x:o,y:s}=a;return[sK(r,o,s,sQ(n,[sX(t.durationMs),sX(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sZ(t,e),o=sW(t.contentDirection)??sW(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:c}=a,u=sQ(n,[],250),p=sX(t.amount)??sX(e[1]),f=sX(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:sB,fling:sB,swipe:sB,pinch:function(e,t,r,n,i){let a=sJ(t,e,1),o=sX(t.scale)??sX(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:sQ(n,[],280)}]}};function sj(e,t,r,n){let i=sJ(t,e);if(!i)return[];let{x:a,y:o}=i,s=sz(sX(t.count),1)??1,l=sz(sX(t.intervalMs),0)??0,d=!0===t.doubleTap,c=sz(sX(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(sK(t,a,o,c,n));continue}u.push(sH(t,a,o,n)),d&&u.push(sH(t+90,a,o,n))}return u}function sV(e,t,r,n){let i=sJ(t,e);if(!i)return[];let{x:a,y:o}=i;return[sH(r,a,o,n)]}function sB(e,t,r,n,i){let a=sZ(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,c=sQ(n,[sX(t.effectiveDurationMs),sX(t.durationMs),sX(e[4])],250),u=sz(sX(t.count),1)??1,p=sz(sX(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 sH(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sK(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sW(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 sX(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 sz(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sJ(e,t,r=0){let n=sX(e.x)??sX(t[r]),i=sX(e.y)??sX(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function sZ(e,t){let r=sY(e.x1,e.x,t[0]),n=sY(e.y1,e.y,t[1]),i=sY(e.x2,t[2]),a=sY(e.y2,t[3]);if(void 0!==r&&void 0!==n&&void 0!==i&&void 0!==a)return{x1:r,y1:n,x2:i,y2:a}}function sY(...e){return e.map(sX).find(e=>void 0!==e)}function sQ(e,t,r){return sz(e,1)??t.map(e=>sz(e,1)).find(e=>void 0!==e)??r}let s0={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function s1(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?s0[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:tg}}(f);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:y,dispatchRequest:S,recordedCommand:b}=v,A=await s3(m,y);if(A)return A;let I=await s2(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])?[t8.expandHome(l,i),...n.slice(1)]:n),u=(c=(a=r.flags?.out,o=r.meta?.cwd,a?t8.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 s5({session:m,sessionName:e.sessionName,logPath:h,command:y,request:S,positionals:_,out:x,dispatchContext:k}),E=await s2(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=s$(e.snapshot),a={...n??{}},o=sW(a.direction)??sW(r[0]);if(!o)return n;let s=sX(a.amount)??sX(r[1]),l=sX(a.pixels),d=sZ(a,[]),c=sX(a.referenceWidth),u=sX(a.referenceHeight),p=void 0!==c&&c>0&&void 0!==u&&u>0?{referenceWidth:c,referenceHeight:u}:i??sU;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=Y({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);sG(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??{}}),aL(y)&&aR(m,y),aW(m,y,_,f.flags),{ok:!0,data:P??{}}}async function s2(e,t,r="before-command"){if("android"!==e.device.platform||nA(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await o8({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:eC(e)}}}}async function s3(e,t){if(!iL(t,e.device)){var r;let n=(r=e.device,iT[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 o6({session:e})).status?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function s5(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await ip(r.device,n,a,o,{...s});let l=await oN({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 s4(r,l,e.logPath),l}async function s4(e,t,r){let n={snapshotInteractiveOnly:!0},i=oS(await of({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);ox(e,i);let a=await sy({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let s6=lu(()=>import("./lease.js")),s8=lu(()=>import("./session.js").then(e=>e.session_namespaceObject)),s9=lu(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),s7=lu(()=>import("./react-native.js")),le=lu(()=>import("./record-trace.js")),lt=lu(()=>import("./find.js")),lr=lu(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function ln(e){var t;switch(t=e.req.command,nA(t)?.route??"generic"){case"lease":return await li(e);case"session":return await la(e);case"snapshot":return await lo(e);case"reactNative":return await ls(e);case"recordTrace":return await ll(e);case"find":return await ld(e);case"interaction":return await lc(e);case"generic":return null}}async function li(e){let{handleLeaseCommands:t}=await s6();return lp(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function la(e){let{handleSessionCommands:t}=await s8();return lp(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 lo(e){let{handleSnapshotCommands:t}=await s9();return lp(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 s7();return lp(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function ll(e){let{handleRecordTraceCommands:t}=await le();return lp(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function ld(e){let{handleFindCommands:t}=await lt();return lp(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function lc(e){let{handleInteractionCommands:t}=await lr();return lp(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function lu(e){let t;return()=>t??=e()}function lp(e,t,r){if(r)return r;throw new eR("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let lf=new h;async function lm(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 lh(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function lw(e,t){var r,n,i,a;let o,s,l,d,c,u;return e.recording?(r=e,n=t,o=eW(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=eW(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 lg(e,t){if(!t)return[];let r=[],n=e.device,i=e2(t.platform);if(i&&!e4(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=ts(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function lv(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 ly="default";function lS(e){return e.session||ly}function lb(e){if(e.meta?.sessionExplicit===!0||(e.session||ly)!==ly||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 lA(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function lI(e,t){let r=lb(e);return!!r&&!!t.sessionScope&&!lA(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 lx(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,nA(r)?.lockPolicySelectorOverride===!0),y=v?[]:t?lg(t,g):(n=g,i=e.meta?.lockPlatform,f=[],m=e2(i),void 0!==n.platform&&m&&(a=e2(n.platform),o=m,a&&o&&a!==o&&("apple"===a?!e0(o):"apple"!==o||!e0(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 lN(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"===e2(r.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":case"web":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return lN(e)}}(r,t)){let r=t[n];nh(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&&nw(p,nm)||(g.platform=S),{...e,flags:g}}if("strip"===w)return function(e,t,r,n){if(n){lM(e,t),e.platform=n.device.platform;return}lM(e,t),r&&void 0===e.platform&&(e.platform=r)}(g,y,S,t),{...e,flags:g};throw new eR("INVALID_ARGS",function(e,t,r){let n=t.map(lv).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${lh(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(lv),hint:function(e,t){if(t)return lw(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${eW(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 lM(e,t){for(let r of t)delete e[r.key]}function lN(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function lD(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[lk(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return lx(e)}catch{return e}}(n);if("open"===(r=l).command||nw(r.flags,nf))try{let e=await na(l.flags??{});s.add(lk(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=lP(e)-lP(t);return 0!==r?r:e.localeCompare(t)})}function lk(e){return`device:${e}`}function lP(e){return+!e.startsWith("session:")}function lE(e,t={}){let r=e8(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function lC(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:lE(t,{simulatorSetPath:e.simulatorSetPath})}function lR(e,t,r){return iJ(lC(e,t),r)}let lO="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 lT(e){if(!(e instanceof eR)||"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 lL(e){return!(e instanceof eR)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function l$(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new eR("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:tn({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:ta("IOS_RUNNER_CONNECT_TIMEOUT")})}async function lF(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=tn({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new eR("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;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 C,runScrollEdgePasses as E,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 eC,isProcessAlive as eE}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 tC}from"./4291.js";import{isScrollableType as tE}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:()=>fi,ug:()=>fa,sE:()=>p4,Bx:()=>p6,hQ:()=>p8,WX:()=>fn,Co:()=>p7,wg:()=>fr,withAppLogProvider:()=>p2});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:()=>uw,hv:()=>up,Nr:()=>uQ,gE:()=>uY,FS:()=>dJ,runIosRunnerCommand:()=>uZ,stopAllIosRunnerSessions:()=>ug,yA:()=>uh});var t1={};t.r(t1),t.d(t1,{v:()=>uP,M:()=>uC,withAppleRunnerProvider:()=>uE});var t2={};t.r(t2),t.d(t2,{ensureBootedSimulator:()=>hP,SA:()=>hE,EB:()=>hD,N3:()=>hC});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(rC),i=e.expectedRootName??function(e,t){let r=new Set;for(let t of e){let[e]=t.split("/");e&&r.add(e)}let n=[...r];if("ios"===t){let e=n.filter(e=>e.toLowerCase().endsWith(".app")),t=e[0];if(void 0!==t&&1===e.length)return t;if(0===e.length)throw new 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 rC(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 rE(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 rE(e,t),{artifactPath:t,tempDir:s}}let t=i.join(s,"artifact.tar");await rE(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 nC(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await nR(r);return await nT(i,async()=>await t(n))}async function nC(e){var t,r,n;if(t=e.providers,!nk.some(e=>!!t[e.resolverKey]))return{};let i=await nE(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 nE(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=C(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 E({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 iC(e,t,n,a);case"push":return await iE(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 iC(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 iE(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=aC[await aO(t,ak)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=aE[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."},aC={"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}}},aE={"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"?oC(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=tC(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=oC(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:oE(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=oE(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function oC(e,t){let r=t_(tC(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 oE(a,i)}function oE(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(tC(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=>tE(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(tE(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||!tE(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 tC(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"],sC={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 sE(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=sC[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}),C=await la(m,y,"after-command");if("response"in C)return C.response;"status"in I&&"recovered"===I.status&&(!P||"object"==typeof P)&&((P??={}).warning=I.warning);let E=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:E,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 sE({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 lC(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 lE="default";function lR(e){return e.session||lE}function lO(e){if(e.meta?.sessionExplicit===!0||(e.session||lE)!==lE||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(lC).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(lC),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}
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.":`${ta("IOS_RUNNER_CONNECT_TIMEOUT")} ${lO}`)})}function lU(e){return"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function lG(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${r.randomUUID()}`}}function lq(e){if(rp(e))throw rm()}let lj=new Map;async function lV(e,t,r,n,i=45e3,a,o){let s=te.fromTimeoutMs(i),{getEndpoints:l}=lJ(e,t),{endpoints:d}=await l(s.remainingMs()),c=null,u=Math.max(1,Math.ceil(i/250));try{return await tl(async({deadline:s})=>{let u=await lB({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 rm();return new eR("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:lL},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||rw(e))throw rm();c||(c=e)}if(o?.aborted)throw rm();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw l$({port:t,endpoints:d,logPath:n,lastError:c});let a=await l2(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw l$({port:t,endpoints:d,logPath:n,lastError:c})}async function lB(e){await lH(e);let t=await lK(e);if(t.response)return t.response;let r=await lW(e);return r||await lX(e,t.usedCachedTunnelIp)}async function lH(e){if(e.attemptDeadline?.isExpired())throw new eR("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 lF({session:e.session,port:e.port,logPath:e.logPath})}async function lK(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 lZ(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,lj.delete(i))}}),usedCachedTunnelIp:r}}async function lW(e){return"simulator"===e.device.kind&&e.session?.ready?await lY(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function lX(e,t){var r;if("device"!==e.device.kind||!t)return null;r=e.device.id,lj.delete(r);let n=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(n.endpoints),await lZ(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 lz(e,t,r,n=45e3,i){if(i?.aborted)throw rm();let a=te.fromTimeoutMs(n),{getEndpoints:o}=lJ(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new eR("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let d=a.remainingMs();if(d<=0)throw new eR("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await l0(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function lJ(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await lQ({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 lZ(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 eR("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await l0(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||rw(e))throw rm();s(t,e)}return null}async function lY(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 l2(e,t,r,s,i);return new Response(n.body,{status:n.status})}catch(e){if(i?.aborted||rw(e))throw rm();return o(e),null}}async function lQ(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=lj.get(t))?e.expiresAt<=Date.now()?(lj.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 l1(i.id,a);return l(d),d&&(r=i.id,n=d,lj.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function l0(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 l1(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 iJ(["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{l8(n)}}async function l2(e,t,r,n,i){let a=JSON.stringify(r),o=lC(e,["spawn",e.id,"/usr/bin/curl","-s","-X","POST","-H","Content-Type: application/json","--data",a,`http://127.0.0.1:${t}/command`]),s=await iJ(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=tn({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new eR("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:ta(e)})}return{status:200,body:l}}async function l3(){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 eR("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function l5(e,t,r,n){t&&l6(t,e),r&&l6(r,e),n&&process.stderr.write(e)}let l4=new Map;function l6(e,t){let r=(l4.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await a.promises.mkdir(i.dirname(e),{recursive:!0}),await a.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{l4.get(e)===r&&l4.delete(e)});l4.set(e,r)}function l8(e){try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}let l9=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function l7(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new eR("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 eR("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await de(e)){await iz("codesign",["--remove-signature",e],{allowFailure:!0});try{await iz("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof eR?n:new eR("COMMAND_FAILED",String(n));throw new eR("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 de(e){return 0===(await iz("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let dt=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),dr=new Set([" "," ","\n","\r"]),dn=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function di(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new ds(e).parse()}function da(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)}da(r.children,t)}}class ds{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(dn.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])&&dt.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])&&dr.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 dd=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function dc(e){var t;let r=await du(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 du(e){let t=await iZ(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(!dp(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(dp))}return r}(i),...Object.values(i).filter(e=>dp(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(dd.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=di(r),t=new Set,da(n,(e,r)=>{if(dd.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 dp(e){return!!e&&"object"==typeof e}let df=["CFBundleIcons","CFBundleIcons~ipad"];async function dm(e){let t=e.filter(dy);if(0===t.length)return;let r=e.filter(e=>db(e)&&!dS(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 dh(t,e)}}async function dh(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 dw(e,t);(o||s)&&(await dv(t),r=t,n=new Date,a.utimesSync(r,n,n))}async function dw(e,t){var r,n;let a=i.join(e,"Info.plist"),o=i.join(t,"Info.plist"),s=await iZ(a),l=await iZ(o);if(!s||!l)return!1;let d=(r=s,n=l,df.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 dg(o,e.key,e.value,e.shouldInsert);return!0}async function dg(e,t,r,n){let i=await iz("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new eR("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function dv(e){let t=await iz("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new eR("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function dy(e){return db(e)&&dS(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function dS(e){return i.basename(e).endsWith("-Runner.app")}function db(e){return i.basename(e).endsWith(".app")}let dA={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 dI(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eR("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":e5(e.target)}function d_(e){return"simulator"===e?"simulator":"device"}function dx(){return"arm64"===process.arch?"arm64":"x86_64"}let dM="XCTestDevices",dN=".agent-device-backup",dD=".agent-device-xctestdevices-backup-",dk=i.join(u.homedir(),".agent-device","ios-runner"),dP=".agent-device-runner-cache.json",dE={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},dC=new Map,dR=new Set,dO=new Map,dT=new Set;function dL(e){return e?.trim()??""}function d$(e=process.env){return dL(e.AGENT_DEVICE_IOS_BUNDLE_ID)||dL(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function dF(e=process.env){let t=dL(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${d$(e)}.uitests`}let dU=function(e=process.env){let t=d$(e),r=dF(e);return Array.from(new Set([dL(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function dG(e=u.homedir()){return i.join(e,"Library","Developer","XCTestDevices")}async function dq(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=e8(e.simulatorSetPath);if(!r)return null;let n=i.resolve(r),o=i.resolve(t.xctestDeviceSetPath??dG()),s=i.resolve(t.backupPath??function(e=dG()){return`${e}${dN}`}(o)),l=i.resolve(t.lockDirPath??function(e=u.homedir()){return i.join(e,".agent-device","xctest-device-set.lock")}()),d=t.ownerStartTime??e_(process.pid),c=await dB({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(dj({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,`${dM}.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)&&dV(o),e}}({requestedSetPath:n,xctestDeviceSetPath:o})}catch(e){throw dj({xctestDeviceSetPath:o,backupPath:s}),await c(),new eR("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{dj({xctestDeviceSetPath:o,backupPath:s})}finally{await c()}}}}}function dj(e){let{xctestDeviceSetPath:t,backupPath:r}=e,n=[r,...function(e){let t=i.dirname(e),r=i.basename(e).replace(dN,""),n=r===dM?dD:`${r}${dD}`;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&&dV(t),a.existsSync(t))if(!s)return void ea({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&&(ea({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),dV(t))}function dV(e){!a.existsSync(e)||a.lstatSync(e).isSymbolicLink()&&a.unlinkSync(e)}async function dB(e){return await ec({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 dH(e){var t;return await dB({lockDirPath:(t=e,i.join(i.dirname(t),`${i.basename(t)}.lock`)),owner:{pid:process.pid,startTime:e_(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function dK(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 eR("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 cg("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=tE(),s=dQ(e,o),l=cc(e,s);return await lm(dC,l,async()=>{let r=await dH(l);try{return await dW({device:e,options:t,projectRoot:o,expectedCacheMetadata:s,derived:l,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await r()}})}async function dW(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(tt(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||dR.has(t))&&(cg("clean",r?"forced_rebuild":"forced_clean",{derived:t}),ch(t),dZ(t),dR.delete(t));let l=await cw({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>ct(e,n),xctestrunReferencesProjectRoot:cn,resolveExistingXctestrunProductPaths:dc}),d="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&cg("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let c=await dX({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:d});return c||(l.xctestrunPath&&(ch(s),dZ(s)),await dz({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:d,reason:l.reason}))}async function dX(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await dJ(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function dz(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 eR("COMMAND_FAILED","iOS runner project not found",{projectPath:c});let u=Date.now();await cd(t,c,s,r);let p=Math.max(0,Date.now()-u),f=ct(s,t);if(!f)throw new eR("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await dc(f);if(!m)throw new eR("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await l7(t,m,f),await dm(m),d1(s,d4(o,f,m)),cg("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:d}}async function dJ(e,t,r,n){try{var i,a,o,s;return await l7(e,n.productPaths,n.xctestrunPath),cg("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,d1(i,d4(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof eR))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&l9.has(t)}(e))throw e;return cg("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function dZ(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,dY.has(t)&&a.rmSync(i.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let dY=new Set([dP,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function dQ(e,t=tE()){let n,o=dI(e);return{schemaVersion:2,packageVersion:tP(),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=ce.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 ce.set(t,{fileStatsFingerprint:o,sourceFingerprint:d}),d}(t),...function(e,t){var r;let n=(r=d0("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=dA[e].sdkName[d_(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:d0("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:d0("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(o,e.kind),platformName:o,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(n=dI(e))?`platform=macOS,arch=${dx()}`:"simulator"===e.kind?`generic/platform=${n} Simulator`:`generic/platform=${n}`,runnerBundleBuildSettings:cf(process.env),runnerSigningBuildSettings:cp(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:cm()}}function d0(e,t){let r=JSON.stringify([e,t]),n=dO.get(r);if(void 0!==n)return n;try{let n=e$(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return dO.set(r,i),i}catch{return dO.set(r,"unknown"),"unknown"}}function d1(e,t){a.mkdirSync(e,{recursive:!0}),a.writeFileSync(i.join(e,dP),`${JSON.stringify(t,null,2)}
10
- `)}async function d2(e,t){if("external"===e.cache)return void cg("preserve","external_bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t});dR.add(e.derived);let r=await dH(e.derived);try{cg("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),ch(e.derived),dZ(e.derived)}finally{await r()}}function d3(e){let{artifacts:t,...r}=e;return r}function d5(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 d4(e,t,r){let n=function(e,t){let r=d8(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=d8(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 d6(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function d8(e){try{let t=a.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function d9(e,t){let r=d8(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function d7(e,t){let r=i.relative(i.resolve(t),i.resolve(e));return""!==r&&!r.startsWith("..")&&!i.isAbsolute(r)}let ce=new Map;function ct(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=cr(r.path,t)-cr(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function cr(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=dA[dI(t)].xctestrunHints[d_(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 cn(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 ci(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 ca(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,dE),{requireTestBundlePath:!0}),await co(u,d,c),{xctestrunPath:c,jsonPath:d}}async function ca(e){let t=await iz("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new eR("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 eR("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function co(e,t,r){a.writeFileSync(t,JSON.stringify(e,null,2));let n=await iz("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new eR("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=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 cd(e,t,r,n){let i=cf(process.env),a=cp(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=cm(),l=await dq(e);try{let l;await eT("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",cu(e),"1","-destination",(l=dI(e),"macOS"===l?`platform=macOS,arch=${dx()}`:"simulator"===e.kind?`platform=${l} Simulator,id=${e.id}`:`generic/platform=${l}`),"-derivedDataPath",r,...s,...i,...o,...a],{detached:!0,timeoutMs:n.buildTimeoutMs,onSpawn:e=>{dT.add(e),e.on("close",()=>{dT.delete(e)})},onStdoutChunk:e=>{l5(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{l5(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof eR?a:new eR("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)??lO);throw new eR("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await l?.release()}}function cc(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(d5(d3(t))).digest("hex"),`cache-${n.slice(0,16)}`),s=function(e){return i.join(dk,"derived",dA[dI(e)].derivedBaseName[d_(e.kind)])}(e);return i.join(s,o)}function cu(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function cp(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 cf(e=process.env){let t=d$(e),r=dF(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function cm(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function ch(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,n;if(r=e,t=i.resolve(tE(),".tmp"),""===(n=i.relative(t,i.resolve(r)))||n.startsWith("..")||i.isAbsolute(n))throw new eR("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(tE(),".tmp")}.`})}}async function cw(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,dP),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?d5(d3(n))!==d5(d3(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(d6))||!d7(n.xctestrunPath,e)||!d9(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!d7(t.path,e)||!d9(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 cg(e,t,r){ea({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let cv=process.pid,cy=e_(process.pid),cS=(tB=cv,tH=cy,(e=r.createHash("sha256")).update(String(tB)),e.update("\0"),e.update(tH??"unknown-start"),`owner-${tB}-${e.digest("hex").slice(0,8)}`);async function cb(e,t){let r=await ec({lockDirPath:`${cN(e)}.lock`,owner:{pid:cv,startTime:cy,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await r()}}function cA(e){try{let t=JSON.parse(a.readFileSync(cN(e),"utf8"));return function(e,t){var r,n,i;let a;if(!e||"object"!=typeof e||Array.isArray(e)||1!==e.schemaVersion||e.deviceId!==t)return null;let o=(r=e,a={ownerToken:cD(r.ownerToken),ownerPid:ck(r.ownerPid),sessionId:cD(r.sessionId),port:ck(r.port),xctestrunPath:cD(r.xctestrunPath),jsonPath:cD(r.jsonPath),createdAtMs:(n=r.createdAtMs,"number"==typeof n&&Number.isFinite(n)?n:null)},Object.values(a).some(e=>null===e)?null:a);return o?{schemaVersion:1,deviceId:t,...o,ownerStartTime:(i=e.ownerStartTime,"string"==typeof i?i:null),runnerPid:ck(e.runnerPid)}:null}(t,e)}catch{return null}}function cI(e){var t;return e?e.ownerToken===cS?{type:"owned",lease:e}:ek((t=e).ownerPid)&&(!t.ownerStartTime||e_(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function c_(e,t){let r=cI(cA(e));if("empty"===r.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===r.type)throw new eR("COMMAND_FAILED",`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,ownerPid:r.lease.ownerPid,ownerStartTime:r.lease.ownerStartTime,ownerToken:r.lease.ownerToken,sessionId:r.lease.sessionId,hint:"Use a different simulator/session, wait for the other run to finish, or stop the owning daemon before retrying."});await cP(r.lease,r.type,t)}async function cx(e,t){let r=cI(cA(e));"owned"===r.type&&await cP(r.lease,"owned",t)}function cM(e){e&&function(e){let t=cA(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{a.unlinkSync(cN(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function cN(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 cD(e){return"string"==typeof e&&e.length>0?e:null}function ck(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function cP(e,t,r){ea({level:"stale"===t?"warn":"debug",phase:"ios_runner_lease_cleanup",data:{deviceId:e.deviceId,ownerPid:e.ownerPid,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),cM(e)}let cE={cleanupRunnerProcessTree:cV,cleanupRunnerXcodebuildProcesses:cB,cleanupTempFile:l8};async function cC(e,t={}){var r;!1!==t.graceful?await cL(e):await cV(e.child.pid,"SIGTERM"),await c$(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(cG(r)||eN(r))&&await cV(e.child.pid,"SIGKILL"),await cF(e)}async function cR(e){await cx(e,cE)}async function cO(e){let t=Array.from(dT);await cq(e,"SIGINT"),await cj(t,"SIGINT"),await cq(e,"SIGTERM"),await cj(t,"SIGTERM"),await cq(e,"SIGKILL"),await cj(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await cF(e)}))}async function cT(){let e=Array.from(dT);await Promise.allSettled(e.map(async e=>{try{await cV(e.pid,"SIGTERM"),await cV(e.pid,"SIGKILL")}finally{dT.delete(e)}}))}async function cL(e){try{await lV(e.device,e.port,lG({command:"shutdown"}),void 0,15e3)}catch{await cV(e.child.pid,"SIGTERM")}}async function c$(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function cF(e){await cU(e.device),l8(e.xctestrunPath),l8(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{cM(e.lease)}}async function cU(e){"simulator"===e.kind&&await Promise.allSettled(dU.map(async t=>{try{await iJ(lC(e,["terminate",e.id,t]),{allowFailure:!0,timeoutMs:2e3})}catch(r){ea({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 cG(e){return!!e&&ek(e)}async function cq(e,t){await Promise.allSettled(e.map(async e=>{await cV(e.child.pid,t)}))}async function cj(e,t){await Promise.allSettled(e.map(async e=>{await cV(e.pid,t),"SIGKILL"===t&&dT.delete(e)}))}async function cV(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 iz("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function cB(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${cH(e)}-${cH(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${cH(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await iz("pkill",[`-${t}`,"-f",r],{allowFailure:!0,timeoutMs:2e3})}catch(r){ea({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:t,error:r instanceof Error?r.message:String(r)}})}}function cH(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function cK(e){let t=await cW(e.logPath);return t?new eR(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 cW(e){if(!e)return;let t=await cX(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 cX(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 cz=new Map,cJ=new Map,cZ=new Set(["tap","longPress","drag","swipe","scroll","sequence"]);async function cY(e,t){return await lm(cJ,e.id,async()=>{let r=cz.get(e.id);if(r){let t=await c0(e,r);if(t)return t}return await cb(e.id,async()=>await cQ(e,t))})}async function cQ(e,t){var r,n;let o,s,l,d={};await ud(d,"cleanup_stale_xcodebuild",async()=>{await c_(e.id,cE)}),await ud(d,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(ea({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):c7(t))}),await ud(d,"verify_developer_mode",async()=>{await ue(e)}),t.cleanStaleBundles?await ud(d,"cleanup_stale_bundles",async()=>{await c1(e)}):(d.cleanup_stale_bundles=0,ea({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let c=await ud(d,"ensure_xctestrun",async()=>await dK(e,t));d.build_xctestrun=c.buildMs;let u=await ud(d,"allocate_port",async()=>await l3()),{xctestrunPath:p,jsonPath:f}=await ud(d,"prepare_xctestrun_env",async()=>await ci(c.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(u)},`session-${e.id}-${cS}-${u}`,{iosXctestEnvDir:t.iosXctestEnvDir})),m=await ud(d,"simulator_set_redirect",async()=>await dq(e)),h=["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",p,"-derivedDataPath",c.derived,"-destination","macOS"===(l=dI(e))?`platform=macOS,arch=${dx()}`:"simulator"===e.kind?`platform=${l} Simulator,id=${e.id}`:`platform=${l},id=${e.id}`];try{({child:o,wait:s}=await ud(d,"launch_xcodebuild",()=>eO("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=>{l5(e,t.logPath,t.traceLogPath,t.verbose)}),o.stderr?.on("data",e=>{l5(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:cS,ownerPid:cv,ownerStartTime:cy,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=cN(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 c4(e.id,v,{graceful:!1,waitTimeoutMs:1e3}),t}return cz.set(e.id,v),v}async function c0(e,t){if(!cG(t.child.pid))return await ud({},"stop_stale_session",async()=>{await c4(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=t.xctestrunArtifact;if(r?.cache==="external")return ea({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,cache:r.cache}}),t;let n=cc(e,dQ(e));return r?.derived!==n?(ea({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:r?.derived,expectedDerived:n}}),await ud({},"stop_stale_artifact_session",async()=>{await c4(e.id,t)}),null):(ea({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready}}),t)}async function c1(e){if("simulator"===e.kind)for(let t of dU){let r=await c2(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 c2(e,t){try{return await iJ(lC(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(r){ea({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 c3(e){let t=cz.get(e);return t?{sessionId:t.sessionId,alive:cG(t.child.pid)}:null}async function c5(e,t){await lm(cJ,e.deviceId,async()=>{cz.get(e.deviceId)===e&&(ea({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await c4(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function c4(e,t,r={}){let n=t??cz.get(e);n&&(await cC(n,r),cz.get(e)===n&&cz.delete(e))}async function c6(e){await lm(cJ,e,async()=>{await cb(e,async()=>{await c4(e),await cR(e)})})}async function c8(){let e=Array.from(cz.values());for(let t of(await cO(e),e))cz.get(t.deviceId)===t&&cz.delete(t.deviceId)}async function c9(){await c8();let e=Array.from(cz.keys());await Promise.allSettled(e.map(async e=>{await c6(e)})),await cT()}async function c7(e){await iJ(lC(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}async function ue(e){if("ios"!==e.platform||"device"!==e.kind)return;let t=await iz("DevToolsSecurity",["-status"],{allowFailure:!0,timeoutMs:2e3}),r=`${t.stdout}
13
- ${t.stderr}`;if(/developer mode is currently disabled/i.test(r))throw new eR("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 ut(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eR("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new eR("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function ur(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,ea({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=lG(r),m=lU(f.command),h=te.fromTimeoutMs(i),w=function(e,t){var r;let n=lU(t.command);if(!e.ready)return n?{action:"skip",reason:"read_only_startup_command"}:{action:"run",reason:"startup"};if("uptime"===(r=t.command)||"status"===r)return{action:"skip",reason:"readiness_probe_command"};if(!cZ.has(t.command))return{action:"run",reason:"conservative_command"};let i=e.lastHealthyMutation;if(!i)return{action:"run",reason:"no_recent_healthy_mutation"};if(t.appBundleId!==i.appBundleId)return{action:"run",reason:"app_activation_uncertain"};let a=Date.now()-i.atMs;return a>5e3?{action:"run",reason:"healthy_mutation_stale",lastHealthyMutationAgeMs:a}:{action:"skip",reason:"recent_healthy_mutation",lastHealthyMutationAgeMs:a}}(t,f);"run"===w.action?await ua({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,signal:a,decision:w}):(l=f,d=t,c=w,ea({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 ui({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,timeoutMs:i,signal:a,readOnlyCommand:m})}catch(e){throw un(e,t,w)}try{let e=await uo(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 c5(t,r)):cZ.has(f.command)&&(t.lastHealthyMutation={atMs:Date.now(),appBundleId:f.appBundleId}),e}catch(r){let e=function(e){if(e instanceof eR){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 c5(t,e),r;if((u=r)instanceof eR&&u.details?.runner!==void 0)throw r;throw un(r,t,w)}}function un(e,t,r){return"skip"!==r.action||"recent_healthy_mutation"!==r.reason?e:(t.lastHealthyMutation=void 0,us(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:r.reason,runnerReadinessPreflightSkippedAgeMs:r.lastHealthyMutationAgeMs}))}async function ui(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 eR("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 en("ios_runner_command_send",async()=>l?await lV(t,r.port,n,i,d,r,s):await lz(t,r.port,n,d,s),c)}async function ua(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(ul(r),a.remainingMs());try{let e=await en("ios_runner_readiness_preflight",async()=>await lV(t,r.port,lG({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:r.ready,timeoutMs:l});await uo(e,r,i)}catch(e){throw us(e,{runnerReadinessPreflightFailed:!0})}}async function uo(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new eR("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?eP(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 cK({error:new eR(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&&ea({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 us(e,t){let r=e instanceof eR?e:new eR("COMMAND_FAILED",e instanceof Error?e.message:String(e),void 0,e);return new eR(r.code,r.message,{...r.details??{},...t},r.cause??e)}function ul(e){return e.startupTimeoutMs??45e3}async function ud(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,ea({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}let uc=new h;function uu(e,t={}){return{runCommand:e,...t}}function up(e,t,r,n={}){if(r)return um(r);let i=function(e,t={}){let r=uc.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?um(i.provider):um(t)}async function uf(e,t,r){if(!e)return await r();let n={provider:um(e),deviceId:t.deviceId,requestId:t.requestId};return await uc.run(n,r)}function um(e){return"function"==typeof e?{runCommand:e}:e}async function uh(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await uv(t,r,n,i,a,o);return await uw(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function uw(e,t){var r,n,i,a;if(!e)return await ug(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,ub({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,ub({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await ug(t,e.reason,e.lifecycleState,e.error)}async function ug(e,t,r,n){throw ub({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 uv(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=uS(n);try{v=await ur(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return ea({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 ea({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(lU(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let s=uS(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new eR("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,`${uy(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=uS(f),new eR(eP(y),S,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...A,hint:b??(h=p.command,w=A,`${uy(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(lU(t.command))return r;let s=uS(r);return new eR("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,`${uy(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 eR("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 uy(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 uS(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 ub(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;ea({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 uA(e,t){let r;lq(t.requestId);let n=rf(t.requestId),i=lG({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await uI({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new eR("COMMAND_FAILED","iOS runner prepare failed")}async function uI(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await cY(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles}),d=Date.now()-s;try{var c,u;let e=await uP(t,l,r,n,i,d,{recoveryReason:o});return{kind:"prepared",result:(c=t,u=e,uE(c,u),u)}}catch(e){return await u_({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function u_(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:d}=e,c=d instanceof eR?d:new eR("COMMAND_FAILED",String(d));if(1===l&&(t=c,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&uN(t)))return{kind:"prepared",result:await ux({device:n,session:i,command:a,options:o,signal:s,error:c})};if(!uN(c))throw d;let u=c.message||"runner_health_failed";if(l>=2)throw await uM(i,"prepare_runner_health_failed"),d;return lq(o.requestId),await c5(i,"prepare_runner_health_retry"),ea({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 ux(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 c5(s,"prepare_cached_runner_health_failed"),await d2(s.xctestrunArtifact,p);let f=Date.now(),m=await cY(o,{...d,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await uP(o,m,l,d,c,h,{recoveryReason:p});return ea({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,uE(t,r),r}catch(r){let e;await uM(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof eR?n:new eR("COMMAND_FAILED",String(n)),new eR(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 uE(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 uM(e,t){try{await c5(e,t)}catch{}}function uN(e){let t;return!rw(e)&&(lT(e)||lL(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function uD(e,t,r){let n;lq(r.requestId);let i=rf(r.requestId);try{let a=(n=await cY(e,r)).ready?45e3:ul(n);return await ur(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof eR?o:new eR("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&lL(a)&&n)return lq(r.requestId),await uk({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&&(lT(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return lq(r.requestId),await uk({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&&lT(a))return await uh({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:c5});throw o}}async function uk(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await c5(e.session,a);let o=await cY(t,{...n,cleanStaleBundles:!0});try{let a=await ur(t,o,r,n.logPath,45e3,i);return e.recoveredDiagnosticPhase&&ea({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 eR?a:new eR("COMMAND_FAILED",String(a));if(lT(e))return await uh({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:c5});throw a}}async function uP(e,t,r,n,i,a,o){var s,l,d,c,u;let p,f,m=Date.now();return s=await ur(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 uE(e,t){ea({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 uC(e,t,r={}){ut(e),lq(r.requestId);let n=lG(t),i=uT(e,r);return lU(n.command)?e7(()=>(lq(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(lq(r.requestId),lT(e))}):i.runCommand(e,n,r)}function uR(e,t={}){if("ios"!==e.platform)return;let{propagateError:r=!1,...n}=t,i=uT(e,n);return i.prewarm?i.prewarm(e,n).then(()=>{}).catch(t=>{if(ea({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}}),r)throw t}):void ea({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function uO(e,t){ut(e),lq(t.requestId);let r=lG({command:"uptime"}),n=uT(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 uT(e,t){return up(e,uL,void 0,{requestId:t.requestId})}let uL=uu(uD,{prepare:uA,prewarm:async(e,t)=>{await uA(e,{...t,healthTimeoutMs:45e3})}}),u$=new WeakMap;async function uF(e){var t,r;let n,i,{sessionStore:a,leaseRegistry:o}=e,s=(n={...(t=function(e){let t=eK(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=eV(r);if(r&&!n)throw new eR("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new eR("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??{}},tV(t.command,n)?{...t,flags:n}:t),l=s.command,d=function(e){var t,r;let n=e.session||ly;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=lb(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(s),c=et(),u=a.resolveSessionDir(d),p=t7(u,s.meta?.requestId??c.requestId),f=t9(u);ei({session:d,logPath:p}),ea({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,nA(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=nA(l)?.sessionExecutionLockExempt!==!0?await lD({req:s,sessionName:d,sessionStore:a}):[],h=(r=o,(i=u$.get(r))||(i=new Map,u$.set(r,i)),i);return{req:s,command:l,sessionName:d,requestLogPath:p,runnerLogPath:f,throwIfCanceled:()=>rh(s.meta?.requestId),runLocked:async e=>(rh(s.meta?.requestId),0===m.length)?await e():await uU(h,m,async()=>(rh(s.meta?.requestId),await e()))}}async function uU(e,t,r){let[n,...i]=t;return n?await lm(e,n,async()=>await uU(e,i,r)):await r()}function uG(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function uq(e,t){return uG(e)?e[t]:void 0}function uj(e,t){let r=uq(e,t);return"string"==typeof r?r:void 0}function uV(e,t){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:void 0}function uB(e){return uG(e)}function uH(e){if(!uG(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 uK(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,uX(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)??uz(t,["role","type"]);return{index:0,type:i,role:i,label:(n=e,n.match(/"([^"]+)"/)?.[1]??n.match(/'([^']+)'/)?.[1]??uz(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(uZ)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(uZ)}(e)??uz(t,["value"]),depth:r,enabled:uJ(t,["enabled"]),focused:uJ(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=uz(e,["role","type"]);return{index:0,type:t,role:t,label:uz(e,["label","name","text"]),value:uz(e,["value"]),enabled:uJ(e,["enabled"]),focused:uJ(e,["focused"])}}(e.data),index:n.length}});return n}(uj(e,"snapshot")??"",Array.isArray(r=uq(e,"refs"))?r.flatMap(e=>{let t=uG(e)?e:void 0,r=uX(uz(t,["ref","id"])??String(e));return r?[{ref:r,data:t}]:[]}):uG(r)?Object.entries(r).flatMap(([e,t])=>{let r=uX(e);return r?[{ref:r,data:uG(t)?t:void 0}]:[]}):[]);return t&&await uW(i,t),{nodes:i.map((e,t)=>({...e.node,index:t})),truncated:"boolean"==typeof(n=uq(e,"truncated"))?n:void 0}}async function uW(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 uX(e){let t=e?.trim().replace(/^@/,"");return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function uz(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.length>0)return t}}function uJ(e,t){if(e)for(let r of t){let t=e[r];if("boolean"==typeof t)return t}}function uZ(e){return"string"==typeof e}let uY="agent-browser",uQ="Run `agent-device web setup` to install the managed web backend.";function u0(e={}){let t=e.session?.trim(),r=async r=>await u5(r,{session:t,options:e});return{async open(e){await r(["open",e])},async close(){await r(["close"])},snapshot:async e=>await u2(r,e),async screenshot(e,t){await r(["screenshot",...t?.fullscreen?["--full"]:[],e])},async click(e,t){await u1(r,e,t)},async clickRef(e){await r(["click",u8(e)])},async fill(e,t,n){await u1(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",u8(e),t])},async typeText(e){await r(["keyboard","type",e])},async scroll(e,t){let n=t?.pixels??t?.amount;await r(["scroll",e,...void 0===n?[]:[String(n)]])},dumpNetwork:async e=>(function(e,t={}){var r,n;let i,a=Array.isArray(i=uG(r=e)&&Array.isArray(r.requests)?r.requests:r)?i.filter(uB).map(e=>({headers:uH(e.headers),method:uj(e,"method"),mimeType:uj(e,"mimeType"),requestId:uj(e,"requestId"),resourceType:uj(e,"resourceType"),responseHeaders:uH(e.responseHeaders),status:uV(e,"status"),timestamp:function(e){if("number"==typeof e||"string"==typeof e)return e}(e.timestamp),url:uj(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 u1(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 u2(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 uK(n,t?.includeRects?async t=>await u3(e,t):void 0)}async function u3(e,t){try{return function(e){let t=uG(e)&&uG(e.box)?e.box:e;if(uG(t)){var r,n;let e,i,a,o,s,l,d;return r=t,e=uV(r,"x"),i=uV(r,"y"),a=uV(r,"width"),u9(e,i,a,uV(r,"height"))??(n=t,o=uV(n,"left"),s=uV(n,"top"),l=uV(n,"right"),d=uV(n,"bottom"),u9(o,s,u7(l,o),u7(d,s)))}}(await e(["get","box",u8(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 u5(e,t){let{session:r,options:n}=t,i=[...e,"--json",...r?["--session",r]:[]],a=await u4(i,n);var o,s=function(e,t,r,n){try{return JSON.parse(e)}catch(a){let i=0!==n;throw new eR("COMMAND_FAILED",i?"agent-browser command failed":"agent-browser returned invalid JSON",{cmd:uY,args:r,...i?{exitCode:n}:{},stdout:e.slice(0,500),stderr:t.slice(0,500),hint:uQ},a instanceof Error?a:void 0)}}(a.stdout,a.stderr,i,a.exitCode),l=a,d=i;if(!uG(s))return s;if(!1===(s.success??s.ok)){throw new eR("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(uG(t)){let e=uj(t,"message")??uj(t,"error");if(e)return e}return uj(e,"message")??"agent-browser command failed"}(s),{cmd:uY,args:d,hint:uj(s,"hint")??uQ,agentBrowserError:s.error})}if(0!==l.exitCode)throw new eR("COMMAND_FAILED","agent-browser command failed",{cmd:uY,args:d,exitCode:l.exitCode,stdout:l.stdout.slice(0,500),stderr:l.stderr.slice(0,500),hint:uj(s,"hint")??uQ});return Object.hasOwn(s,"data")?s.data:s}async function u4(e,t){let r="",n="",i=0;try{let a=await eb({stateDir:t.stateDir}),o=await eL(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=eS(a)).code?new eR("TOOL_MISSING",t.message,{...t.details??{},cmd:uY,args:o,hint:u6(t)},t):"COMMAND_FAILED"===t.code?new eR("COMMAND_FAILED",t.message,{...t.details??{},cmd:uY,args:o,hint:u6(t)},t):t}return{stdout:r,stderr:n,exitCode:i}}function u6(e){return"string"==typeof e.details?.hint?e.details.hint:uQ}function u8(e){return e.startsWith("@")?e:`@${e}`}function u9(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 u7(e,t){return void 0===e||void 0===t?void 0:e-t}function pe(){return{ok:!1,error:eC(new eR("UNAUTHORIZED","Invalid token"))}}async function pt(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 s1({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function pr(e){ea({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=et(),r=er({force:!0})??void 0;return{ok:!1,error:eC(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function pn(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function pi(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 pa(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 po(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new eR("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function ps(e,t){let r=(await tR(to(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function pl(e,t){var r,n;let i;po(t);let a=await ps(e,t),o=tR(to(e)),s=await tu(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 pd(e,t,r,n,i){let a,o,s="recovering",l=!1,d=(async()=>{try{for(;!l;){let d=await ps(e,t);if(!d){s="recovering",await eQ(1e3);continue}let c=tC(to(e)),u=ti(c,{pid:d});a=u;let p=pi(r,{redactionPatterns:n});if(o=pa(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&rr(i,u.pid),s="active",await o,rn(i),a=void 0,o=void 0,l)break;s="recovering",await eQ(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),rn(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:d,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await pn(o),a&&!a.killed&&a.kill("SIGKILL"),await pn(d),rn(i)}}}function pc(e,t){let r=pf(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=pf(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 pu(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=lE(["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 iJ(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 pp(e,t,r,n,i,a){let o=await pm({deviceId:e,appBundleId:t,simulatorSetPath:i});return pg({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return lE(["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 pf(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function pm(e){let{deviceId:t,appBundleId:r,simulatorSetPath:n}=e,a=await iJ(lE(["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 eL("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function ph(e,t,r,n){return pg({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",pc(e)],stream:t,redactionPatterns:r,pidPath:n})}async function pw(e,t,r,n){return pg({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function pg(e){let t="active",r=eO(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=pi(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&rr(e.pidPath,n.pid);let a=pa(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),rn(e.pidPath),r),r=>{throw t="failed",rn(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await pn(a),n.killed||n.kill("SIGKILL"),await pn(a),rn(e.pidPath)}}}let pv=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),py=/https?:\/\/[^\s"'<>\])]+/i,pS=[/\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 pb(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>pI(e)));for(let e of t.entries){let t=pI(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function pA(e,t){let r=pR(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=pR(t?.maxPayloadChars,2048,64,16384),o=pR(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=pk(s,["method","httpMethod"]),d=pk(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=pv.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=py.exec(o),h=d??m?.[0];if(!h)return null;let w=c??px(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:pM(o),packetId:pN(o)??void 0,durationMs:pD(o)??void 0,raw:pC(o,a),line:r};if("android"===n&&function(e,t,r){let n=p_(t,r,5),i=e.packetId??n.map(e=>pN(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?p_(t,r,12).filter(e=>pN(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>pM(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>px(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>pD(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 pE(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=pC(e,a))}if("body"===i||"all"===i){let e=pP(o,s,["requestBody","body","payload","request"]),t=pP(o,s,["responseBody","response"]);e&&(g.requestBody=pC(e,a)),t&&(g.responseBody=pC(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 pI(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function p_(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 px(e){for(let t of pS){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function pM(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 pN(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function pD(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 pk(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 pP(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return pE(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 pE(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function pC(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function pR(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let pO={start:async e=>await pB(e)},pT=i$(pO,function(e={}){return{...pO,...e}});async function pL(e,t){return await pT.run(e,t)}function p$(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 pF(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:p$("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:p$("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function pU(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 pG(e){return"macos"===e.platform?"macos":"ios"===e.platform?"device"===e.kind?"ios-device":"ios-simulator":"android"}async function pq(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=pG(c),S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},o=pR(t?.maxEntries,25,1,200),s=t?.include??"summary",l=pR(t?.maxPayloadChars,2048,64,16384),d=pR(t?.maxScanLines,4e3,100,2e4),a.existsSync(m)?pA(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 pj({device:c,appBundleId:u,appLogPath:m,appLogState:p});if(A){let e=await pl(c.id,u);if(e){let t=pA(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=pb(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 pH({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=pb(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 pj(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 rt(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),re));if(!s)return null;let l=await ps(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function pV(e,t,r,n){return await pT.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function pB({device:e,appBundleId:t,outPath:r,pidPath:n}){pF(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 pw(e.id,i,o,n):await pp(e.id,t,i,o,e.simulatorSetPath,n);if("android"===e.platform)return po(t),await pd(e.id,t,i,o,n);if("macos"===e.platform)return await ph(t,i,o,n);throw i.end(),new eR("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function pH(e){let t=await pu({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:pA(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 pK(e){await e.stop(),await pn(e.wait)}async function pW(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 e6(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await e6(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 iJ(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await iJ(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await eL("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function pX(e,t){pF(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
16
- `;a.appendFileSync(e,r,"utf8")}function pz(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 pJ(e,t){for(let r of e){if(t(r))return r;let e=pJ(r.children,t);if(e)return e}}function pZ(e,t){let r=[];for(let n of e)t(n)&&r.push(n),r.push(...pZ(n.children,t));return r}function pY(e,t){let r=pJ(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 pQ(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 p0(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.numberValue??null:pQ(e):null}function p1(e){return Math.round(10*e)/10}async function p2(e,t){let r=["devicectl",...e],n=await iJ(r,{allowFailure:!0,timeoutMs:2e4});if(0===n.exitCode)return;let i=String(n.stdout??""),a=String(n.stderr??"");throw new eR("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:r,exitCode:n.exitCode,stdout:i,stderr:a,deviceId:t.deviceId,hint:p8(i,a)??p6})}async function p3(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 p4(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"})),iF(r,t)}async function p5(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 p4(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 p4(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 iJ(n,{allowFailure:!0,timeoutMs:2e4});try{if(0!==a.exitCode){let r=String(a.stdout??""),i=String(a.stderr??"");throw new eR("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:n,exitCode:a.exitCode,stdout:r,stderr:i,deviceId:e.id,hint:p8(r,i)??p6})}return JSON.parse(await s.readFile(r,"utf8"))}catch(r){if(r instanceof eR)throw r;throw new eR("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await s.unlink(r).catch(()=>{})}}let p6="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function p8(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 p9(e,t){try{let r=await iZ(e),n=r?.[t];if("string"==typeof n&&n.length>0)return n}catch{}try{let r=await iz("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,da(di(r),(e,t)=>{void 0===i&&e===n&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}let p7="xctrace-animation-hitches";function fe(e,t){let r=di(e),n=pY(r,t);return{rows:0===n.length?[]:pZ(r,e=>"row"===e.name),schema:n}}function ft(e,t){for(let r of e)ft(r.children,t),r.attributes.id&&t.set(r.attributes.id,{numberValue:pQ(r),process:fr(r)})}function fr(e){if(!e||e.children.some(e=>"sentinel"===e.name))return null;let t=pQ(pJ(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 fn="ps-process-snapshot",fi="ps-process-snapshot",fa="xctrace-activity-monitor",fo="xctrace-activity-monitor",fs="leaks-output-graph",fl="Memory graph captured with leaks --outputGraph for host-visible Apple app processes.";async function fd(e,t){if("ios"===e.platform&&"device"===e.kind)return await fD(e,t);let r=await fN(e,t),n=await fO(e,r);if(0===n.length)throw new eR("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 fG({usagePercent:n.reduce((e,t)=>e+t.cpuPercent,0),residentMemoryKb:n.reduce((e,t)=>e+t.rssKb,0),measuredAt:i,matchedProcesses:[r.executableName],cpuMethod:fn,memoryMethod:fi})}async function fc(e,t,r){let n,a=fg(e);if(!a.memgraph)return{available:!1,kind:"memgraph",reason:a.reason,hint:a.hint,support:a};let o=await fL(e,t,a);if(!1===o.available)return o;let{process:l}=o;await s.mkdir(i.dirname(r),{recursive:!0});let d=await fp(r);try{n=await fu(e,r,l.pid)}catch(n){throw await ff(r,d),function(e,t,r,n,a){if(a instanceof eR){let o=a.details??{};return new eR(a.code,`Failed to capture Apple memgraph for ${t}`,{...o,kind:"memgraph",appBundleId:t,pid:r.pid,processName:i.basename(fU(r.command)),path:n,hint:f$(e,"string"==typeof o.stdout?o.stdout:"","string"==typeof o.stderr&&o.stderr.length>0?o.stderr:a.message)},a)}return new eR("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:r.pid,processName:i.basename(fU(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 ff(r,d),new eR("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:l.pid,processName:i.basename(fU(l.command)),path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:f$(e,n.stdout,n.stderr)});let c=await s.stat(r).catch(()=>null);if(!c?.isFile()||c.size<=0)throw await ff(r,d),new eR("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:fs,appBundleId:t,pid:l.pid,processName:i.basename(fU(l.command)),support:a}}async function fu(e,t,r){return"macos"===e.platform?await iz("leaks",[`--outputGraph=${t}`,String(r)],{allowFailure:!0,timeoutMs:12e4}):await iJ(lC(e,["spawn",e.id,"leaks",`--outputGraph=${t}`,String(r)]),{allowFailure:!0,timeoutMs:12e4})}async function fp(e){return await s.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function ff(e,t){t||await s.rm(e,{force:!0}).catch(()=>{})}async function fm(e,t){var r;let n,a,o,s,l,c;if("ios"!==e.platform||"device"!==e.kind)throw new eR("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 fk(e,t),p=await fv(e,t,u);return n=fe((r={hitchesXml:p.hitchesXml,frameLifetimesXml:p.frameLifetimesXml,displayInfoXml:p.displayInfoXml,processIds:u.map(e=>e.pid),processNames:t3(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}=fe(e,"device-display-info"),n=r.indexOf("max-refresh-rate");if(n<0)return;let i=new Map;for(let e of t){ft(e.children,i);let t=p0(e.children[n],i);if(null!==t&&t>0)return t}}(r.displayInfoXml),s=(o=(function(e){let t,r,n=di(e),i=Object.values(r={start:(t=pY(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 pZ(n,e=>"row"===e.name).map(e=>(function(e,t,r){var n,i,a;let o;if(ft(e.children,r),!0===(n=e.children[t.isSystem],null===(o=p0(n,r))?null:0!==o))return null;let s=p0(e.children[t.start],r),l=p0(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:fr(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:p1(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?p1(s/n*100):0,droppedFrameCount:s,totalFrameCount:n,sampleWindowMs:l,windowStartedAt:r.windowStartedAt,windowEndedAt:r.windowEndedAt,measuredAt:r.measuredAt,method:p7,matchedProcesses:[...new Set(o.map(e=>e.processName).filter(e=>"string"==typeof e&&e.length>0))],frameDeadlineMs:void 0===a?void 0:p1(1e3/a),refreshRateHz:a,worstWindows:c.length>0?c:void 0}}function fh(e){return"ios"===e.platform&&"device"===e.kind?{method:p7,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:p7,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 fw(e){let t=fh(e);if("ios"===e.platform&&"device"===e.kind)return{fps:t,memory:{method:fo,description:"Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"kB"},cpu:{method:fa,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:fi,description:`Resident memory snapshot from ${r}`,unit:"kB"},cpu:{method:fn,description:`Recent CPU usage snapshot from ${r}`,unit:"percent"}}}function fg(e){return"ios"===e.platform&&"device"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:fs,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:fs,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:fs,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:fs,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 fv(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 fy({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 f_(e,t,a,"hitches",o),await f_(e,t,a,"hitches-frame-lifetimes",l);let i=await fx(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 fy(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 fS(s,e.tracePath);if(0===l.result.exitCode)return e.validateTraceOutput&&await fI(e,l.result.stdout,l.result.stderr),{startedAt:l.startedAt,endedAt:l.endedAt,capturedAtMs:l.capturedAtMs};throw new eR("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 fS(e,t){let r;for(let n=1;n<=3;n+=1){await fA(t,n,1500);let i=new Date().toISOString(),a=await iJ(e,{allowFailure:!0,timeoutMs:6e4});if(r={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},0===a.exitCode||!fb(a))break}return r}function fb(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 fA(e,t,r){t<=1||(await s.rm(e,{recursive:!0,force:!0}).catch(()=>{}),await new Promise(e=>setTimeout(e,r)))}async function fI(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 eR("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 f_(e,t,r,n,i){let a=["xctrace","export","--input",r,"--xpath",`/trace-toc/run/data/table[@schema="${n}"]`,"--output",i],o=await iJ(a,{allowFailure:!0,timeoutMs:15e3});if(0!==o.exitCode)throw new eR("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 fx(e,t,r,n,i){try{return await f_(e,t,r,n,i),!0}catch{return!1}}async function fM(e){let t=di(e),r=pY(t,"activity-monitor-process-live");if(0===r.length)throw new eR("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 eR("COMMAND_FAILED","xctrace activity-monitor-process-live export is missing expected columns");let s=pZ(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=pJ(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:pQ(e),processName:fq(e)})}let r=p0(t[n],d),s=(c=t[i],u=d,c?c.attributes.ref?u.get(c.attributes.ref)?.processName??null:fq(c):null);null!==r&&Number.isFinite(r)&&s&&l.push({pid:r,processName:s,cpuTimeNs:p0(t[a],d),residentMemoryBytes:p0(t[o],d)})}return l}async function fN(e,t){let r="macos"===e.platform?await fC(t):await fR(e,t),n="macos"===e.platform?i.join(r,"Contents","Info.plist"):i.join(r,"Info.plist"),a=await p9(n,"CFBundleExecutable");if(!a)throw new eR("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 fD(e,t){let r=await fk(e,t),n=await fP(e,t),i=await fP(e,t),a=fE(await fM(n.xml),r,t,e),o=fE(await fM(i.xml),r,t,e),s=i.capturedAtMs-n.capturedAtMs;if(s<=0)throw new eR("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 eR("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 fG({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:fa,memoryMethod:fo})}async function fk(e,t){let r=(await p3(e,"all")).find(e=>e.bundleId===t);if(!r)throw new eR("APP_NOT_INSTALLED",`No iOS device app found for ${t}`,{appBundleId:t,deviceId:e.id});if(!r.url)throw new eR("COMMAND_FAILED",`Missing app bundle URL for ${t}`,{appBundleId:t,deviceId:e.id});let n=r.url.replace(/\/$/,""),i=d(n),a=(await p5(e)).filter(e=>e.executable.startsWith(`${n}/`));if(0===a.length)throw new eR("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 fP(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 fy({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 f_(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 fE(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 eR("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:fV(t.cpuTimeNs,e.cpuTimeNs),residentMemoryBytes:fV(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:t3(c.map(e=>e.processName))}}async function fC(e){let t=`kMDItemCFBundleIdentifier == "${e.replaceAll('"','\\"')}"`,r=await iz("mdfind",[t],{allowFailure:!0,timeoutMs:15e3});if(0!==r.exitCode)throw new eR("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 eR("APP_NOT_INSTALLED",`No macOS app found for ${e}`,{appBundleId:e});return n}async function fR(e,t){let r=lC(e,["get_app_container",e.id,t,"app"]),n=await iJ(r,{allowFailure:!0,timeoutMs:15e3});if(0!==n.exitCode)throw new eR("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 eR("APP_NOT_INSTALLED",`No iOS simulator app container found for ${t}`,{appBundleId:t});return i}async function fO(e,t){let r="macos"===e.platform?["-axo","pid=,%cpu=,rss=,command="]:lC(e,["spawn",e.id,"ps","-axo","pid=,%cpu=,rss=,command="]);return(function(e){let t=[];for(let r of E(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 iz("ps",r,{timeoutMs:15e3}):await fF(r)).stdout).filter(e=>(function(e,t){let r=fU(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 fT(e,t,r){let n=(await fO(e,r)).sort((e,t)=>t.rssKb-e.rssKb)[0];if(n)return n;throw new eR("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 fL(e,t,r){try{let r=await fN(e,t);return{available:!0,process:await fT(e,t,r)}}catch(t){if(function(e,t){if("ios"!==e.platform||"simulator"!==e.kind||!(t instanceof eR))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 f$(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 fF(e){let t=await iJ(e,{allowFailure:!0,timeoutMs:15e3});return 0===t.exitCode?t:await iz("ps",["-axo","pid=,%cpu=,rss=,command="],{timeoutMs:15e3})}function fU(e){let[t=""]=e.trim().split(/\s+/,1);return t}function fG(e){return{cpu:{usagePercent:p1(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 fq(e){let t=e?.attributes.fmt?.trim()??"";return t?t.replace(/\s+\(\d+\)$/,"").trim():null}function fj(e,t){let r=p8(e,t);if(r)return r;let n=`${e}
21
- ${t}`.toLowerCase();return n.includes("no device matched")||n.includes("failed to find device")?p6: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 fV(e,t){return null===e?t:null===t?e:Math.max(e,t)}async function fB(e){var t;let r=await fX(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 fz(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 fH(e,t=e.outPath){t!==e.outPath&&await s.mkdir(i.dirname(t),{recursive:!0});let r=await fZ(e,{failOnForcedKill:!0});if(0!==r.exitCode)throw new eR("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 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 fQ(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 fK(e){return await fZ(e,{failOnForcedKill:!1})}async function fW(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 iJ(l,{allowFailure:!0,timeoutMs:15e3});if(0!==d.exitCode)throw new eR("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:fj(d.stdout,d.stderr)});let c=(n={...e,tocXml:await s.readFile(r,"utf8")},t=di(n.tocXml),a=pZ(t,e=>"run"===e.name),o=t3(pZ(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 fX(e,t){if("ios"!==e.platform&&"macos"!==e.platform)throw new eR("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 fk(e,t);return{pids:r.map(e=>e.pid),processNames:t3(r.map(e=>i.basename(d(e.executable))))}}let r=await fN(e,t),n=await fO(e,r);if(0===n.length)throw new eR("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 fz(e,t,r){let n;for(let r=1;r<=3;r+=1){await fA(t,r,1500);let i=eO("xcrun",e,{allowFailure:!0}),a=await fJ(i.wait);if(!a)return i;if(n=a,!fb(a))break}let i=n??{stdout:"",stderr:"",exitCode:1};throw new eR("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 fJ(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function fZ(e,t){e.child.kill("SIGINT");let r=await fY(e.wait,45e3);if(r)return r;e.child.kill("SIGKILL");let n=await fY(e.wait,5e3);if(n&&!t.failOnForcedKill)return n;if(n)throw new eR("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 eR("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 fY(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function fQ(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 eR("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 f0(e){let t=e.replaceAll(",","").match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let r=Number(t[0]);return Number.isFinite(r)?r:null}function f1(e){return Math.round(10*e)/10}let f2="adb-shell-dumpsys-gfxinfo-framestats",f3="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 f5(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 f4(e){return 0===e.length?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function f6(e,t){if(void 0!==e&&void 0!==t)return Math.max(0,Math.round((t-e)/1e6))}function f8(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:f0(i)??void 0}async function f9(e,t,r={}){var n,i,a,o,s,l,d,c;let u=tR(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 eR("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=f8(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=f0(i)??void 0,s=Number(a);if(void 0===o||!Number.isFinite(s)||r<0)return;let l=f8(t,"Uptime"),d=f8(t,"Stats since");return{droppedFramePercent:p1(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=f5(e,t,"Flags"),n=f5(e,t,"IntendedVsync"),i=f5(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 eR("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 eR("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=f4(t),a=n?.statsSinceNs,o=a??i.firstFrameNs,s=f6(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=f4(e);return f6(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?p1(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:f1(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:f1(l/1e6),refreshRateHz:void 0===l?void 0:f1(1e9/l)}),windowStartedAt:w.windowStartedAt,windowEndedAt:w.windowEndedAt,timestampSource:w.timestampSource,measuredAt:i,method:f2,source:p?"android-gfxinfo-summary":"framestats-rows",worstWindows:S&&S.length>0?S:void 0});return await f7(e,t,r),b}catch(e){throw d=t,(c=e)instanceof eR?new eR(c.code,c.message,{...c.details??{},metric:"fps",package:d},c):new eR("COMMAND_FAILED",`Failed to sample Android fps for ${d}`,{metric:"fps",package:d},c)}}async function f7(e,t,r={}){let n=tR(e,r.adb);try{await n(["shell","dumpsys","gfxinfo",t,"reset"],{allowFailure:!0,timeoutMs:3e3})}catch{}}function me(e,t,r,n){if(n instanceof eR){var i,a,o,s,l;let d,c=n.details??{};return new eR(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.":mt("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.":mt(i))},n)}return new eR("COMMAND_FAILED",`Failed to ${e} Android ${t} for ${r}`,{action:e,package:r,tool:t,hint:mt(t)},n)}function mt(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 mr(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 mn(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 mn(e,t,r){try{let n=await f9(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 mi="adb-shell-simpleperf",ma="adb-shell-perfetto",mo="/data/local/tmp";async function ms(e,t,r){let n=tR(e,r.adb);await mm(n,t),await mw(n,t),await mh(n,t);let i=await mp(t.outPath);await mc(n,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await mr(e,t,i,o,{adb:n});return{...t,action:"stop",platform:"android",state:"stopped",stoppedAt:a,durationMs:o,sizeBytes:i,method:"simpleperf"===t.kind?mi:ma,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function ml(e,t,r={}){let n=tR(e,r.adb);try{"running"===t.state&&(await mm(n,t),await mw(n,t).catch(()=>{}))}finally{await mc(n,t.remotePath)}}function md(e,t,r=mo){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 ${mf(t)}`],{allowFailure:!0,timeoutMs:15e3})}catch{}}async function mu(e,t){await s.mkdir(i.dirname(e),{recursive:!0}),await s.writeFile(e,`${JSON.stringify(t,null,2)}
23
- `)}async function mp(e){try{return(await s.stat(e)).size}catch(t){throw new eR("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 mf(e){return`'${e.replace(/'/g,"'\\''")}'`}async function mm(e,t){try{var r;await e(["shell",(r=t.profilerPid,`pid=${mf(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 me("stop",t.kind,t.packageName,e)}}async function mh(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 eR("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 mw(e,t){let r;for(let n=0;n<12;n+=1){let n=await mg(e,t.remotePath);if(void 0!==n&&n>0&&n===r)return;r=n,await v(250)}throw new eR("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 mg(e,t){let r=mf(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 mv(e,t){try{let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=mS(r.stdout);if(0===r.exitCode&&n)return n}catch{}throw new eR("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 my(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 eR("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 mS(e){return e.trim().split(/\s+/).find(e=>/^\d+$/.test(e))}async function mb(e,t,r,n={}){let i,a=tR(e,n.adb),o=await mv(a,t);await my(a,"perfetto",t);let s=md(t,"app.perfetto-trace","/data/misc/perfetto-traces");try{await f7(e,t,{adb:a}),i=await mI(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:ma,message:`Started Android Perfetto trace for ${t}`}}async function mA(e,t,r,n={}){return await ms(e,{...t,outPath:r},n)}async function mI(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=mS(n.stdout);if(i)return i;throw new eR("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 me("start","perfetto",r,e)}}async function m_(e,t,r,n={}){let i,a=tR(e,n.adb),o=await mv(a,t);await my(a,"simpleperf",t);let s=md(t,"cpu.perf.data");try{i=await mN(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:mi,message:`Started Android Simpleperf CPU profile for ${t}`}}async function mx(e,t,r,n={}){return await ms(e,{...t,outPath:r},n)}async function mM(e,t,r,n={}){let i=tR(e,n.adb);await my(i,"simpleperf",t.packageName);let a=await mD(i,t),o=new Date().toISOString(),s=function(e){let t=[];for(let r of E(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:p1(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 mu(r,l);let d=await mp(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:mi,message:`Wrote Android Simpleperf report for ${t.packageName}`}}async function mN(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(mf).join(" "),d=`${mo}/agent-device-${s}-${Date.now()}.err`,`err=${mf(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=mS(c.stdout);if(u)return u;throw new eR("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 me("start","simpleperf",n,e)}}async function mD(e,t){try{return await e(["shell","simpleperf","report","-i",t.remotePath,"--stdio","--sort","comm,dso,symbol"],{timeoutMs:3e4})}catch(e){throw me("report","simpleperf",t.packageName,e)}}let mk="adb-shell-dumpsys-cpuinfo",mP="Aggregated CPU usage for app processes matched from adb shell dumpsys cpuinfo.",mE="adb-shell-dumpsys-meminfo",mC="Memory snapshot from adb shell dumpsys meminfo <package>. Values are reported in kilobytes.",mR="adb-shell-am-dumpheap",mO="Java heap dump captured with adb shell am dumpheap, pulled to a local artifact path.";async function mT(e,t,r={}){let n=tR(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 E(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:p1(i),measuredAt:r,method:mk,matchedProcesses:[...n]}}(e.stdout,t,new Date().toISOString())}catch(e){throw mq("cpu",t,e)}}async function mL(e,t,r={}){let n=tR(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 eR("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!==f0(e));if(!r)break;return f0(r)??void 0}}(e);if(void 0===i)throw new eR("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:mE,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?f0(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 mq("memory",t,e)}}async function m$(e,t,r,n={}){let a,o=tR(e,n.adb),l=await mG(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 mF(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 eR("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 mU(r,c),new eR("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 mU(r,c),new eR("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:mR,packageName:t,pid:l,remotePath:d}}finally{await o(["shell","rm","-f",d],{allowFailure:!0,timeoutMs:15e3}).catch(()=>{})}}async function mF(e){return await s.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function mU(e,t){t||await s.rm(e,{force:!0}).catch(()=>{})}async function mG(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 eR("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 mq(e,t,r){return r instanceof eR?new eR(r.code,r.message,{...r.details??{},metric:e,package:t},r):new eR("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:f0(i)??void 0}let mV="shared_prefs/ReactNativeDevPrefs.xml",mB="debug_http_host",mH="dev_server_https",mK="RCT_jsLocation",mW="RCT_packager_scheme",mX="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.",mz='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function mJ(e){return void 0!==eM(e)}async function mZ(e){let{device:t,appId:r,runtime:n}=e;if(!r)return;let i=eM(n);if(i){if("android"===t.platform)return void await mQ(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await m3(t,r,i)}}async function mY(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await m0(t,r);"ios"===t.platform&&"simulator"===t.kind&&await m5(t,r)}}async function mQ(e,t,r){var n,i,a,o,s,l;let d,c;m9(t);let u=(n=await m1(e,t),i=mB,a=`${r.host}:${r.port}`,d=` <string name="${m7(i)}">${m7(a)}</string>`,m6(m8(n,i),d));o=u,s=mH,l="https"===r.scheme,c=` <boolean name="${m7(s)}" value="${l?"true":"false"}" />`,u=m6(m8(o,s),c),await m2(e,t,u)}async function m0(e,t){m9(t);let r=await m1(e,t),n=m8(r,mB),i=m8(n,mH);i!==r&&await m2(e,t,i)}async function m1(e,t){let r=await e6(e,["shell","run-as",t,"cat",mV],{allowFailure:!0});return 0!==r.exitCode?mz:m4(r.stdout)}async function m2(e,t,r){let n=["shell","run-as",t,"id"],i=await e6(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=he(i.stdout,i.stderr);throw new eR("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?mX:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await e6(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await e6(e,["shell","run-as",t,"tee",mV],{stdin:r.trimEnd()})}catch(n){let e=eE(n);if("TOOL_MISSING"===e.code)throw e;let r=he("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new eR("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?mX:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function m3(e,t,r){await iJ(lC(e,["spawn",e.id,"defaults","write",t,mK,"-string",`${r.host}:${r.port}`])),await iJ(lC(e,["spawn",e.id,"defaults","write",t,mW,"-string",r.scheme]))}async function m5(e,t){await iJ(lC(e,["spawn",e.id,"defaults","delete",t,mK]),{allowFailure:!0}),await iJ(lC(e,["spawn",e.id,"defaults","delete",t,mW]),{allowFailure:!0})}function m4(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
25
- `:mz}function m6(e,t){return m4(e).replace("</map>",`${t}
26
- </map>`)}function m8(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return m4(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 m9(e){if("binary"!==tc(e))return;let t=tm(e);throw new eR("INVALID_ARGS",t,{package:e,hint:t})}function m7(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function he(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 ht=new Map;async function hr(e){let t=await w.mkdtemp(i.join(u.tmpdir(),"agent-device-materialized-"));try{let n=await ha(e.installablePath,i.join(t,"installable")),a=e.archivePath?await ha(e.archivePath,i.join(t,"archive")):void 0,o=r.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{hn(o)},s);return ht.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 hn(e,t){let r=ht.get(e);if(!r)throw new eR("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eR("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),ht.delete(e),await w.rm(r.rootPath,{recursive:!0,force:!0})}async function hi(e){let t=Array.from(ht.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await hn(e)}))}async function ha(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 ho=["Simulator"],hs=["Device Hub","Simulator"];function hl(e,t){if("simulator"!==e.kind)throw new eR("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function hd(e={}){let t=e.deviceHub?hs:ho,r=e.background?["-g","-a"]:["-a"];for(let e of t)if(0===(await iz("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 hp(e)){t.focusExisting&&await hd({background:t.deviceHub,deviceHub:t.deviceHub});return}let i=te.fromTimeoutMs(18e4);try{await tl(async({deadline:t})=>{if(t?.isExpired())throw new eR("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:18e4});let i=Math.max(1e3,t?.remainingMs()??18e4),a=await iJ(lC(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 eR("COMMAND_FAILED","simctl boot failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let l=await iJ(lC(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 eR("COMMAND_FAILED","simctl bootstatus failed",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode});let d=await hp(e);if("Booted"!==d)throw new eR("COMMAND_FAILED","Simulator is still booting",{state:d})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let t=tn({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=>tn({error:e,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(a){let t=tn({error:a,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}});throw new eR("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:18e4,elapsedMs:i.elapsedMs(),reason:t,hint:ta(t),boot:r,bootstatus:n})}await hd({deviceHub:t.deviceHub})}async function hu(e){let t=lC(e,["shutdown",e.id]),r=await iJ(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===r.exitCode,exitCode:r.exitCode,stdout:String(r.stdout??""),stderr:String(r.stderr??"")}}async function hp(e){let t="string"==typeof e?e:e.id,r="string"==typeof e?lE(["list","devices","-j"]):lC(e,["list","devices","-j"]),n=await iJ(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 hf(e){return"ios"===e.platform&&"simulator"===e.kind}async function hm(e){if(!1===e.booted)return{success:!0,exitCode:0,stdout:"",stderr:""};try{return hf(e)?await hh(e):await hg(e)}catch(t){let e=eC(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function hh(e){let t=await hu(e);return t.success?t:"Shutdown"===await hw(e)?{...t,success:!0,exitCode:0}:t}async function hw(e){try{return await hp(e)}catch{return null}}async function hg(e){let t=await e6(e,["emu","kill"],{allowFailure:!0,timeoutMs:15e3});return{success:0===t.exitCode,exitCode:t.exitCode,stdout:String(t.stdout??""),stderr:String(t.stderr??"")}}let hv=new Map;async function hy(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=hv.get(i);if(void 0!==a){if(a>Date.now()&&!t.focusExisting)return;hv.delete(i)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:r}=await Promise.resolve(tJ);await r(e,{deviceHub:t.deviceHub,focusExisting:t.focusExisting}),hS(i);return}if("device"===e.kind){await hb(e.id),hS(i);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./3340.js");await t(e.id),hS(i)}}function hS(e){hv.set(e,Date.now()+5e3)}async function hb(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 iJ(["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 hA(t);if(0===n.exitCode){if(!o.parsed)throw new eR("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 eR("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 eR("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:hI(i,a)})}catch(t){if(t instanceof eR&&"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 eR("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:a,stdout:n,stderr:i,hint:n||i?hI(n,i):o},t)}throw new eR("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 hA(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 hI(e,t){let r=p8(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.":p6)}function h_(e,t,r){return t||nw(r,nf)?null:aZ("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function hx(e){return"string"==typeof e?.session&&e.session.trim().length>0}async function hM(e,t){hf(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function hN(e){let t=nw(e.flags,nf)||!e.session?await na(e.flags??{}):await hD(e.session.device);return!1!==e.ensureReady&&await hy(t),t}async function hD(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 na(t)}catch(e){if(!(e instanceof eR)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await na({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function hk(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 hP(e,t){return!!t&&0===lg(t,e).length}async function hE(e){let{device:t,shutdownRequested:r}=e;if(r&&(hf(t)||"android"===t.platform&&"emulator"===t.kind))return await hm(t)}async function hC(e){if(await c6(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await ao("dismiss",t).catch(t=>{ea({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function hR(e){e.applePerf?.active&&(await fK(e.applePerf.active),e.applePerf={...e.applePerf??{},active:void 0})}async function hO(e){let t=e.nativePerf?.android;t&&(await ml(e.device,t),e.nativePerf={...e.nativePerf??{},android:void 0})}async function hT(e,t){e.appLog&&await pK(e.appLog),await hR(e),await hO(e),e0(e.device.platform)&&await hC(e),await hi(t).catch(()=>{})}async function hL(e){var t,r,n;let{req:i,sessionName:a,logPath:o,sessionStore:s}=e,l=s.get(a);if(!l)return await h$(i,o);(l.appLog&&await pK(l.appLog),await hR(l),await hO(l),t=i,r=l,n=t,(n.positionals?.length??0)>0||"web"===r.device.platform)&&(e0(l.device.platform)&&!hf(l.device)&&await hC(l),await ip(l.device,"close",i.positionals??[],i.flags?.out,{...aF(o,i.flags,l.appBundleId,l.trace?.outPath)}),await hM(l.device,300));e0(l.device.platform)&&(!hf(l.device)||i.flags?.shutdown||l.recording)?await hC(l):e0(l.device.platform)&&ea({level:"debug",phase:"ios_runner_retained_after_close",data:{session:l.name,deviceId:l.device.id}}),mJ(s.getRuntimeHints(a))&&l.appBundleId&&await mY({device:l.device,appId:l.appBundleId}).catch(()=>{}),s.recordAction(l,{command:"close",positionals:i.positionals??[],flags:i.flags??{},result:{session:l.name,...q(`Closed: ${l.name}`)}}),i.flags?.saveScript&&(l.recordSession=!0),s.writeSessionLog(l),await hi(a).catch(()=>{}),s.delete(a);let d=await hE({device:l.device,shutdownRequested:i.flags?.shutdown});return d?{ok:!0,data:k({session:l.name,shutdown:d},`Closed: ${l.name}`)}:{ok:!0,data:{session:l.name,...q(`Closed: ${l.name}`)}}}async function h$(e,t){if(!e.positionals||0===e.positionals.length)return aZ("SESSION_NOT_FOUND","No active session");let r=await hN({session:void 0,flags:e.flags,ensureReady:!0});return await ip(r,"close",e.positionals,e.flags?.out,{...aF(t,e.flags)}),await hM(r,300),{ok:!0,data:{app:e.positionals[0],...q(`Closed: ${e.positionals[0]}`)}}}async function hF(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 hU(e){a.existsSync(e)&&a.unlinkSync(e)}function hG(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 hq(e){let t=hG(e);if(!t||t.pid===process.pid)try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}function hj(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function hV(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 eR("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}=eH(o.AGENT_DEVICE_STATE_DIR),h=eX(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,re);if(a.existsSync(t))try{let e=rt(a.readFileSync(t,"utf8"));if(e&&function(e){let t,r=e_(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=ex(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{rn(t)}}let b=new t8(m),A=new r8({maxActiveSimulatorLeases:hj(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:hj(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:hj(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:hj(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),I=tP(),_=r.randomBytes(24).toString("hex"),x=e_(process.pid)??void 0,M=eJ(),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 ee({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:r,logPath:t},async()=>{if(!ew(e.token,n))return pe();try{return await nl(p,async()=>{let t=await uF({req:e,sessionStore:m,leaseRegistry:h});return await g(t)})}catch(e){return pr(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=c3(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:lx(t.req,a),existingSession:a}),p=u.req;c=u.existingSession;let f=e=>(function(e,t,r){let n=et();if(!t.ok){ea({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=er({force:!0})??void 0;return{ok:!1,error:eC(new eR(eP(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 ea({level:"info",phase:"request_success"}),er(),{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,nA(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,nA(n)?.selectorValidationExempt!==!0)&&function(e,t){let r=lg(e,t);if(0!==r.length)throw new eR("INVALID_ARGS",`Session "${e.name}" is already bound to ${lh(e)}, but this request selected ${r.map(lv).join(", ")}.`,{session:e.name,conflicts:r.map(lv),hint:lw(e,"selector-conflict")})}(c,p.flags);let m=(e,t,r)=>{let n;return{...aF(d,e,t,r,n=et().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 n_({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})=>u0({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 ln({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,nA(o)?.replayScopedAction!==!0))return await w(e);if(!ew(e.token,n))return pe();try{let n=await uF({req:e,sessionStore:m,leaseRegistry:h});return n.sessionName===t.sessionName?await g(n,r):await w(e)}catch(e){return pr(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await pt({lockedScope:i,logPath:i.logPath,sessionStore:m})}return w}({logPath:f,stateDir:c,token:_,sessionStore:b,leaseRegistry:A,trackDownloadableArtifact:rv}),D=async e=>{await ee({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{ea({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),er({force:!0})})},k=async e=>{let t=hT(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,eQ(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))rc(e);ea({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(tX);if(await e(),n<=0)break;await eQ(200)}}catch(e){ea({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=eq(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=eB(n),a=rl(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),rd(a),rp(a))throw rm();r=await rE(o?t=>{e.destroyed||e.write(eZ(t))}:void 0,async()=>await N(n))}catch(e){r={ok:!1,error:eC(e)}}finally{n-=1,a&&(i.delete(a),ru(a))}e.destroyed||e.write(o?ej(r):`${JSON.stringify(r)}
32
- `)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await hV(i,"Failed to bind socket server")}if("socket"!==h){let e=await rY({handleRequest:N,token:_});r.push(e),t=await hV(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=hG(t);if(o?.pid&&o.pid!==process.pid&&eD(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}
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(dC);if(0===t.length)return;let r=e.filter(e=>dR(e)&&!dE(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 dC(e){return dR(e)&&dE(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function dE(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 cC={readOnly:!1,readinessProbe:!1,readinessPreflightSkipEligibleAfterHealthyMutation:!1},cE={...cC,readOnly:!0},cR={...cE,readinessProbe:!0},cO={...cC,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 cC;case"readOnly":return cE;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:`${cW(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 t=JSON.parse(a.readFileSync(cW(e),"utf8"));return function(e,t){var r,n,i;let a;if(!e||"object"!=typeof e||Array.isArray(e)||1!==e.schemaVersion||e.deviceId!==t)return null;let o=(r=e,a={ownerToken:cX(r.ownerToken),ownerPid:cz(r.ownerPid),sessionId:cX(r.sessionId),port:cz(r.port),xctestrunPath:cX(r.xctestrunPath),jsonPath:cX(r.jsonPath),createdAtMs:(n=r.createdAtMs,"number"==typeof n&&Number.isFinite(n)?n:null)},Object.values(a).some(e=>null===e)?null:a);return o?{schemaVersion:1,deviceId:t,...o,ownerStartTime:(i=e.ownerStartTime,"string"==typeof i?i:null),runnerPid:cz(e.runnerPid)}:null}(t,e)}catch{return null}}function cV(e){var t;return e?e.ownerToken===cG?{type:"owned",lease:e}:eE((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)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,ownerToken:r.lease.ownerToken,sessionId:r.lease.sessionId,hint:"Use a different simulator/session, wait for the other run to finish, or stop the owning daemon before retrying."});await cJ(r.lease,r.type,t)}async function cH(e,t){let r=cV(cj(e));"owned"===r.type&&await cJ(r.lease,"owned",t)}function cK(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(cW(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function cW(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 cX(e){return"string"==typeof e&&e.length>0?e:null}function cz(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function cJ(e,t,r){el({level:"stale"===t?"warn":"debug",phase:"ios_runner_lease_cleanup",data:{deviceId:e.deviceId,ownerPid:e.ownerPid,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),cK(e)}let cZ={cleanupRunnerProcessTree:c7,cleanupRunnerXcodebuildProcesses:ue,cleanupTempFile:dc};async function cY(e,t={}){var r;!1!==t.graceful?await c2(e):await c7(e.child.pid,"SIGTERM"),await c3(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(c8(r)||eP(r))&&await c7(e.child.pid,"SIGKILL"),await c5(e)}async function cQ(e){await cH(e,cZ)}async function c0(e){let t=Array.from(dX);await c6(e,"SIGINT"),await c9(t,"SIGINT"),await c6(e,"SIGTERM"),await c9(t,"SIGTERM"),await c6(e,"SIGKILL"),await c9(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await c5(e)}))}async function c1(){let e=Array.from(dX);await Promise.allSettled(e.map(async e=>{try{await c7(e.pid,"SIGTERM"),await c7(e.pid,"SIGKILL")}finally{dX.delete(e)}}))}async function c2(e){try{await l1(e.device,e.port,lY({command:"shutdown"}),void 0,15e3)}catch{await c7(e.child.pid,"SIGTERM")}}async function c3(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function c5(e){await c4(e.device),dc(e.xctestrunPath),dc(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{cK(e.lease)}}async function c4(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 c8(e){return!!e&&eE(e)}async function c6(e,t){await Promise.allSettled(e.map(async e=>{await c7(e.child.pid,t)}))}async function c9(e,t){await Promise.allSettled(e.map(async e=>{await c7(e.pid,t),"SIGKILL"===t&&dX.delete(e)}))}async function c7(e,t){if(!e||e<=0)return;try{process.kill(-e,t)}catch{}try{process.kill(e,t)}catch{}let r="SIGINT"===t?"INT":"SIGTERM"===t?"TERM":"KILL";try{await i5("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function ue(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${ut(e)}-${ut(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${ut(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 ut(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function ur(e){let t=await un(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 un(e){if(!e)return;let t=await ui(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 ui(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 ua=new Map,uo=new Map;async function us(e,t){return await lN(uo,e.id,async()=>{let r=ua.get(e.id);if(r){let t=await ud(e,r);if(t)return t}return await cq(e.id,async()=>await ul(e,t))})}async function ul(e,t){var r,n;let o,s,l,d={};await uD(d,"cleanup_stale_xcodebuild",async()=>{await cB(e.id,cZ)}),await uD(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()):uv(t))}),await uD(d,"verify_developer_mode",async()=>{await uy(e)}),t.cleanStaleBundles?await uD(d,"cleanup_stale_bundles",async()=>{await uc(e)}):(d.cleanup_stale_bundles=0,el({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let c=await uD(d,"ensure_xctestrun",async()=>await d4(e,t));d.build_xctestrun=c.buildMs;let u=await uD(d,"allocate_port",async()=>await da()),{xctestrunPath:p,jsonPath:f}=await uD(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 uD(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 uD(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,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=cW(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 um(e.id,v,{graceful:!1,waitTimeoutMs:1e3}),t}return ua.set(e.id,v),v}async function ud(e,t){if(!c8(t.child.pid))return await uD({},"stop_stale_session",async()=>{await um(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 uD({},"stop_stale_artifact_session",async()=>{await um(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 uc(e){if("simulator"===e.kind)for(let t of dY){let r=await uu(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 uu(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 up(e){let t=ua.get(e);return t?{sessionId:t.sessionId,alive:c8(t.child.pid)}:null}async function uf(e,t){await lN(uo,e.deviceId,async()=>{ua.get(e.deviceId)===e&&(el({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await um(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function um(e,t,r={}){let n=t??ua.get(e);n&&(await cY(n,r),ua.get(e)===n&&ua.delete(e))}async function uh(e){await lN(uo,e,async()=>{await cq(e,async()=>{await um(e),await cQ(e)})})}async function uw(){let e=Array.from(ua.values());for(let t of(await c0(e),e))ua.get(t.deviceId)===t&&ua.delete(t.deviceId)}async function ug(){await uw();let e=Array.from(ua.keys());await Promise.allSettled(e.map(async e=>{await uh(e)})),await c1()}async function uv(e){await i4(lH(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}async function uy(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 uS(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 ub(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 u_({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 uI({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,timeoutMs:i,signal:a,readOnlyCommand:m})}catch(e){throw uA(e,t,w)}try{let e=await ux(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 uf(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 uf(t,e),r;if((u=r)instanceof eL&&u.details?.runner!==void 0)throw r;throw uA(r,t,w)}}function uA(e,t,r){return"skip"!==r.action||"recent_healthy_mutation"!==r.reason?e:(t.lastHealthyMutation=void 0,uM(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:r.reason,runnerReadinessPreflightSkippedAgeMs:r.lastHealthyMutationAgeMs}))}async function uI(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 u_(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(uN(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 ux(e,r,i)}catch(e){throw uM(e,{runnerReadinessPreflightFailed:!0})}}async function ux(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 ur({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 uM(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 uN(e){return e.startupTimeoutMs??45e3}async function uD(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 uk=new h;function uP(e,t={}){return{runCommand:e,...t}}function uC(e,t,r,n={}){if(r)return uR(r);let i=function(e,t={}){let r=uk.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?uR(i.provider):uR(t)}async function uE(e,t,r){if(!e)return await r();let n={provider:uR(e),deviceId:t.deviceId,requestId:t.requestId};return await uk.run(n,r)}function uR(e){return"function"==typeof e?{runCommand:e}:e}async function uO(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await u$(t,r,n,i,a,o);return await uT(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function uT(e,t){var r,n,i,a;if(!e)return await uL(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,uG({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,uG({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await uL(t,e.reason,e.lifecycleState,e.error)}async function uL(e,t,r,n){throw uG({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 u$(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=uU(n);try{v=await ub(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=uU(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,`${uF(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=uU(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,`${uF(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=uU(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,`${uF(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 uF(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 uU(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 uG(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 uq(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 uj({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 uj(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await us(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,uJ(c,u),u)}}catch(e){return await uV({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function uV(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&&uK(t)))return{kind:"prepared",result:await uB({device:n,session:i,command:a,options:o,signal:s,error:c})};if(!uK(c))throw d;let u=c.message||"runner_health_failed";if(l>=2)throw await uH(i,"prepare_runner_health_failed"),d;return lQ(o.requestId),await uf(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 uB(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 uf(s,"prepare_cached_runner_health_failed"),await ca(s.xctestrunArtifact,p);let f=Date.now(),m=await us(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,uJ(t,r),r}catch(r){let e;await uH(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 uJ(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 uH(e,t){try{await uf(e,t)}catch{}}function uK(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 uW(e,t,r){let n;lQ(r.requestId);let i=ry(r.requestId);try{let a=(n=await us(e,r)).ready?45e3:uN(n);return await ub(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 uX({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 uX({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 uO({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:uf});throw o}}async function uX(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await uf(e.session,a);let o=await us(t,{...n,cleanStaleBundles:!0});try{let a=await ub(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 uO({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:uf});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 ub(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 uJ(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 uZ(e,t,r={}){uS(e),lQ(r.requestId);let n=lY(t),i=u0(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 uY(e,t={}){if("ios"!==e.platform)return;let{propagateError:r=!1,...n}=t,i=u0(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 uQ(e,t){uS(e),lQ(t.requestId);let r=lY({command:"uptime"}),n=u0(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 u0(e,t){return uC(e,u1,void 0,{requestId:t.requestId})}let u1=uP(uW,{prepare:uq,prewarm:async(e,t)=>{await uq(e,{...t,healthTimeoutMs:45e3})}}),u2=new WeakMap;async function u3(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||lE;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=u2.get(r))||(i=new Map,u2.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 u5(h,m,async()=>(rb(s.meta?.requestId),await e()))}}async function u5(e,t,r){let[n,...i]=t;return n?await lN(e,n,async()=>await u5(e,i,r)):await r()}function u4(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function u8(e,t){return u4(e)?e[t]:void 0}function u6(e,t){let r=u8(e,t);return"string"==typeof r?r:void 0}function u9(e,t){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:void 0}function u7(e){return u4(e)}function pe(e){if(!u4(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 pt(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,pn(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)??pi(t,["role","type"]);return{index:0,type:i,role:i,label:(n=e,n.match(/"([^"]+)"/)?.[1]??n.match(/'([^']+)'/)?.[1]??pi(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(po)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(po)}(e)??pi(t,["value"]),depth:r,enabled:pa(t,["enabled"]),focused:pa(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=pi(e,["role","type"]);return{index:0,type:t,role:t,label:pi(e,["label","name","text"]),value:pi(e,["value"]),enabled:pa(e,["enabled"]),focused:pa(e,["focused"])}}(e.data),index:n.length}});return n}(u6(e,"snapshot")??"",Array.isArray(r=u8(e,"refs"))?r.flatMap(e=>{let t=u4(e)?e:void 0,r=pn(pi(t,["ref","id"])??String(e));return r?[{ref:r,data:t}]:[]}):u4(r)?Object.entries(r).flatMap(([e,t])=>{let r=pn(e);return r?[{ref:r,data:u4(t)?t:void 0}]:[]}):[]);return t&&await pr(i,t),{nodes:i.map((e,t)=>({...e.node,index:t})),truncated:"boolean"==typeof(n=u8(e,"truncated"))?n:void 0}}async function pr(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 pn(e){let t=e?.trim().replace(/^@/,"");return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function pi(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.length>0)return t}}function pa(e,t){if(e)for(let r of t){let t=e[r];if("boolean"==typeof t)return t}}function po(e){return"string"==typeof e}let ps="agent-browser",pl="Run `agent-device web setup` to install the managed web backend.";function pd(e={}){let t=e.session?.trim(),r=async r=>await pm(r,{session:t,options:e});return{async open(e){await r(["open",e])},async close(){await r(["close"])},snapshot:async e=>await pp(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 pu(r,e,t)},async clickRef(e){await r(["click",pg(e)])},async fill(e,t,n){await pu(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",pg(e),t])},async typeText(e){await r(["keyboard","type",e])},scroll:async(e,t)=>(await pc(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=u4(r=e)&&Array.isArray(r.requests)?r.requests:r)?i.filter(u7).map(e=>({headers:pe(e.headers),method:u6(e,"method"),mimeType:u6(e,"mimeType"),requestId:u6(e,"requestId"),resourceType:u6(e,"resourceType"),responseHeaders:pe(e.responseHeaders),status:u9(e,"status"),timestamp:function(e){if("number"==typeof e||"string"==typeof e)return e}(e.timestamp),url:u6(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 pc(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 pu(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 pp(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 pt(n,t?.includeRects?async t=>await pf(e,t):void 0)}async function pf(e,t){try{return function(e){let t=u4(e)&&u4(e.box)?e.box:e;if(u4(t)){var r,n;let e,i,a,o,s,l,d;return r=t,e=u9(r,"x"),i=u9(r,"y"),a=u9(r,"width"),pv(e,i,a,u9(r,"height"))??(n=t,o=u9(n,"left"),s=u9(n,"top"),l=u9(n,"right"),d=u9(n,"bottom"),pv(o,s,py(l,o),py(d,s)))}}(await e(["get","box",pg(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 pm(e,t){let{session:r,options:n}=t,i=[...e,"--json",...r?["--session",r]:[]],a=await ph(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:ps,args:r,...i?{exitCode:n}:{},stdout:e.slice(0,500),stderr:t.slice(0,500),hint:pl},a instanceof Error?a:void 0)}}(a.stdout,a.stderr,i,a.exitCode),l=a,d=i;if(!u4(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(u4(t)){let e=u6(t,"message")??u6(t,"error");if(e)return e}return u6(e,"message")??"agent-browser command failed"}(s),{cmd:ps,args:d,hint:u6(s,"hint")??pl,agentBrowserError:s.error})}if(0!==l.exitCode)throw new eL("COMMAND_FAILED","agent-browser command failed",{cmd:ps,args:d,exitCode:l.exitCode,stdout:l.stdout.slice(0,500),stderr:l.stderr.slice(0,500),hint:u6(s,"hint")??pl});return Object.hasOwn(s,"data")?s.data:s}async function ph(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:ps,args:o,hint:pw(t)},t):"COMMAND_FAILED"===t.code?new eL("COMMAND_FAILED",t.message,{...t.details??{},cmd:ps,args:o,hint:pw(t)},t):t}return{stdout:r,stderr:n,exitCode:i}}function pw(e){return"string"==typeof e.details?.hint?e.details.hint:pl}function pg(e){return e.startsWith("@")?e:`@${e}`}function pv(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 py(e,t){return void 0===e||void 0===t?void 0:e-t}function pS(){return{ok:!1,error:eT(new eL("UNAUTHORIZED","Invalid token"))}}async function pb(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 pA(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 pI(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function p_(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 px(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 eL("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function pN(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 pD(e,t){var r,n;let i;pM(t);let a=await pN(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 pk(e,t,r,n,i){let a,o,s="recovering",l=!1,d=(async()=>{try{for(;!l;){let d=await pN(e,t);if(!d){s="recovering",await e2(1e3);continue}let c=tW(td(e)),u=ts(c,{pid:d});a=u;let p=p_(r,{redactionPatterns:n});if(o=px(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 pI(o),a&&!a.killed&&a.kill("SIGKILL"),await pI(d),rd(i)}}}function pP(e,t){let r=pR(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=pR(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 pC(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=lB(["spawn",t,"log","show","--style","compact","--info","--predicate",pP(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 pE(e,t,r,n,i,a){let o=await pO({deviceId:e,appBundleId:t,simulatorSetPath:i});return p$({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",pP(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function pR(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function pO(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 pT(e,t,r,n){return p$({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",pP(e)],stream:t,redactionPatterns:r,pidPath:n})}async function pL(e,t,r,n){return p$({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function p$(e){let t="active",r=e$(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=p_(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&rl(e.pidPath,n.pid);let a=px(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 pI(a),n.killed||n.kill("SIGKILL"),await pI(a),rd(e.pidPath)}}}let pF=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),pU=/https?:\/\/[^\s"'<>\])]+/i,pG=[/\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 pq(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>pV(e)));for(let e of t.entries){let t=pV(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function pj(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=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=pF.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=pU.exec(o),h=d??m?.[0];if(!h)return null;let w=c??pH(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:pK(o),packetId:pW(o)??void 0,durationMs:pX(o)??void 0,raw:pY(o,a),line:r};if("android"===n&&function(e,t,r){let n=pB(t,r,5),i=e.packetId??n.map(e=>pW(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?pB(t,r,12).filter(e=>pW(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>pK(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>pH(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>pX(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 pZ(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=pY(e,a))}if("body"===i||"all"===i){let e=pJ(o,s,["requestBody","body","payload","request"]),t=pJ(o,s,["responseBody","response"]);e&&(g.requestBody=pY(e,a)),t&&(g.responseBody=pY(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 pV(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function pB(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 pH(e){for(let t of pG){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function pK(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 pW(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function pX(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 pJ(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return pZ(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 pZ(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function pY(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 p0={start:async e=>await fe(e)},p1=iK(p0,function(e={}){return{...p0,...e}});async function p2(e,t){return await p1.run(e,t)}function p3(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 p5(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:p3("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:p3("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function p4(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 p8(e){return"macos"===e.platform?"macos":"ios"===e.platform?"device"===e.kind?"ios-device":"ios-simulator":"android"}async function p6(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=p8(c),S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},o=pQ(t?.maxEntries,25,1,200),s=t?.include??"summary",l=pQ(t?.maxPayloadChars,2048,64,16384),d=pQ(t?.maxScanLines,4e3,100,2e4),a.existsSync(m)?pj(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 p9({device:c,appBundleId:u,appLogPath:m,appLogState:p});if(A){let e=await pD(c.id,u);if(e){let t=pj(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=pq(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 ft({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=pq(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 p9(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 pN(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function p7(e,t,r,n){return await p1.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function fe({device:e,appBundleId:t,outPath:r,pidPath:n}){p5(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 pL(e.id,i,o,n):await pE(e.id,t,i,o,e.simulatorSetPath,n);if("android"===e.platform)return pM(t),await pk(e.id,t,i,o,n);if("macos"===e.platform)return await pT(t,i,o,n);throw i.end(),new eL("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function ft(e){let t=await pC({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:pj(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 fr(e){await e.stop(),await pI(e.wait)}async function fn(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 fi(e,t){p5(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
16
+ `;a.appendFileSync(e,r,"utf8")}function fa(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 fo(e,t){for(let r of e){if(t(r))return r;let e=fo(r.children,t);if(e)return e}}function fs(e,t){let r=[];for(let n of e)t(n)&&r.push(n),r.push(...fs(n.children,t));return r}function fl(e,t){let r=fo(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 fd(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 fc(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.numberValue??null:fd(e):null}function fu(e){return Math.round(10*e)/10}async function fp(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:fg(i,a)??fw})}async function ff(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 fh(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 fm(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 fh(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 fh(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:fg(r,i)??fw})}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 fw="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function fg(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 fv(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 fy="xctrace-animation-hitches";function fS(e,t){let r=dg(e),n=fl(r,t);return{rows:0===n.length?[]:fs(r,e=>"row"===e.name),schema:n}}function fb(e,t){for(let r of e)fb(r.children,t),r.attributes.id&&t.set(r.attributes.id,{numberValue:fd(r),process:fA(r)})}function fA(e){if(!e||e.children.some(e=>"sentinel"===e.name))return null;let t=fd(fo(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 fI="ps-process-snapshot",f_="ps-process-snapshot",fx="xctrace-activity-monitor",fM="xctrace-activity-monitor",fN="leaks-output-graph",fD="Memory graph captured with leaks --outputGraph for host-visible Apple app processes.";async function fk(e,t){if("ios"===e.platform&&"device"===e.kind)return await fX(e,t);let r=await fW(e,t),n=await f0(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 f8({usagePercent:n.reduce((e,t)=>e+t.cpuPercent,0),residentMemoryKb:n.reduce((e,t)=>e+t.rssKb,0),measuredAt:i,matchedProcesses:[r.executableName],cpuMethod:fI,memoryMethod:f_})}async function fP(e,t,r){let n,a=f$(e);if(!a.memgraph)return{available:!1,kind:"memgraph",reason:a.reason,hint:a.hint,support:a};let o=await f2(e,t,a);if(!1===o.available)return o;let{process:l}=o;await s.mkdir(i.dirname(r),{recursive:!0});let d=await fE(r);try{n=await fC(e,r,l.pid)}catch(n){throw await fR(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(f4(r.command)),path:n,hint:f3(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(f4(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 fR(r,d),new eL("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:l.pid,processName:i.basename(f4(l.command)),path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:f3(e,n.stdout,n.stderr)});let c=await s.stat(r).catch(()=>null);if(!c?.isFile()||c.size<=0)throw await fR(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:fN,appBundleId:t,pid:l.pid,processName:i.basename(f4(l.command)),support:a}}async function fC(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 fE(e){return await s.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function fR(e,t){t||await s.rm(e,{force:!0}).catch(()=>{})}async function fO(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 fF(e,t,u);return n=fS((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}=fS(e,"device-display-info"),n=r.indexOf("max-refresh-rate");if(n<0)return;let i=new Map;for(let e of t){fb(e.children,i);let t=fc(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=fl(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 fs(n,e=>"row"===e.name).map(e=>(function(e,t,r){var n,i,a;let o;if(fb(e.children,r),!0===(n=e.children[t.isSystem],null===(o=fc(n,r))?null:0!==o))return null;let s=fc(e.children[t.start],r),l=fc(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:fA(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:fu(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?fu(s/n*100):0,droppedFrameCount:s,totalFrameCount:n,sampleWindowMs:l,windowStartedAt:r.windowStartedAt,windowEndedAt:r.windowEndedAt,measuredAt:r.measuredAt,method:fy,matchedProcesses:[...new Set(o.map(e=>e.processName).filter(e=>"string"==typeof e&&e.length>0))],frameDeadlineMs:void 0===a?void 0:fu(1e3/a),refreshRateHz:a,worstWindows:c.length>0?c:void 0}}function fT(e){return"ios"===e.platform&&"device"===e.kind?{method:fy,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:fy,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 fL(e){let t=fT(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:fx,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:f_,description:`Resident memory snapshot from ${r}`,unit:"kB"},cpu:{method:fI,description:`Recent CPU usage snapshot from ${r}`,unit:"percent"}}}function f$(e){return"ios"===e.platform&&"device"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:fN,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:fN,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:fN,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:fN,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 fF(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 fU({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 fB(e,t,a,"hitches",o),await fB(e,t,a,"hitches-frame-lifetimes",l);let i=await fH(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 fU(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 fG(s,e.tracePath);if(0===l.result.exitCode)return e.validateTraceOutput&&await fV(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:f9(l.result.stdout,l.result.stderr)})}async function fG(e,t){let r;for(let n=1;n<=3;n+=1){await fj(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||!fq(a))break}return r}function fq(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 fj(e,t,r){t<=1||(await s.rm(e,{recursive:!0,force:!0}).catch(()=>{}),await new Promise(e=>setTimeout(e,r)))}async function fV(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 fB(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:f9(o.stdout,o.stderr)})}async function fH(e,t,r,n,i){try{return await fB(e,t,r,n,i),!0}catch{return!1}}async function fK(e){let t=dg(e),r=fl(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=fs(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=fo(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:fd(e),processName:f6(e)})}let r=fc(t[n],d),s=(c=t[i],u=d,c?c.attributes.ref?u.get(c.attributes.ref)?.processName??null:f6(c):null);null!==r&&Number.isFinite(r)&&s&&l.push({pid:r,processName:s,cpuTimeNs:fc(t[a],d),residentMemoryBytes:fc(t[o],d)})}return l}async function fW(e,t){let r="macos"===e.platform?await fY(t):await fQ(e,t),n="macos"===e.platform?i.join(r,"Contents","Info.plist"):i.join(r,"Info.plist"),a=await fv(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 fX(e,t){let r=await fz(e,t),n=await fJ(e,t),i=await fJ(e,t),a=fZ(await fK(n.xml),r,t,e),o=fZ(await fK(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 f8({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:fx,memoryMethod:fM})}async function fz(e,t){let r=(await ff(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 fm(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 fJ(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 fU({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 fB(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 fZ(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:f7(t.cpuTimeNs,e.cpuTimeNs),residentMemoryBytes:f7(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 fY(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 fQ(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 f0(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 f5(r)).stdout).filter(e=>(function(e,t){let r=f4(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 f1(e,t,r){let n=(await f0(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 f2(e,t,r){try{let r=await fW(e,t);return{available:!0,process:await f1(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 f3(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 f5(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 f4(e){let[t=""]=e.trim().split(/\s+/,1);return t}function f8(e){return{cpu:{usagePercent:fu(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 f6(e){let t=e?.attributes.fmt?.trim()??"";return t?t.replace(/\s+\(\d+\)$/,"").trim():null}function f9(e,t){let r=fg(e,t);if(r)return r;let n=`${e}
21
+ ${t}`.toLowerCase();return n.includes("no device matched")||n.includes("failed to find device")?fw: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 f7(e,t){return null===e?t:null===t?e:Math.max(e,t)}async function me(e){var t;let r=await mi(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 ma(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 mt(e,t=e.outPath){t!==e.outPath&&await s.mkdir(i.dirname(t),{recursive:!0});let r=await ms(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:f9(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 md(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 mr(e){return await ms(e,{failOnForcedKill:!1})}async function mn(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:f9(d.stdout,d.stderr)});let c=(n={...e,tocXml:await s.readFile(r,"utf8")},t=dg(n.tocXml),a=fs(t,e=>"run"===e.name),o=t7(fs(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 mi(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 fW(e,t),n=await f0(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 ma(e,t,r){let n;for(let r=1;r<=3;r+=1){await fj(t,r,1500);let i=e$("xcrun",e,{allowFailure:!0}),a=await mo(i.wait);if(!a)return i;if(n=a,!fq(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:f9(i.stdout,i.stderr)})}async function mo(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function ms(e,t){e.child.kill("SIGINT");let r=await ml(e.wait,45e3);if(r)return r;e.child.kill("SIGKILL");let n=await ml(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 ml(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function md(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 mc(e){let t=e.replaceAll(",","").match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let r=Number(t[0]);return Number.isFinite(r)?r:null}function mu(e){return Math.round(10*e)/10}let mp="adb-shell-dumpsys-gfxinfo-framestats",mf="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 mm(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 mh(e){return 0===e.length?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function mw(e,t){if(void 0!==e&&void 0!==t)return Math.max(0,Math.round((t-e)/1e6))}function mg(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:mc(i)??void 0}async function mv(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=mg(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=mc(i)??void 0,s=Number(a);if(void 0===o||!Number.isFinite(s)||r<0)return;let l=mg(t,"Uptime"),d=mg(t,"Stats since");return{droppedFramePercent:fu(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=mm(e,t,"Flags"),n=mm(e,t,"IntendedVsync"),i=mm(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=mh(t),a=n?.statsSinceNs,o=a??i.firstFrameNs,s=mw(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=mh(e);return mw(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?fu(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:mu(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:mu(l/1e6),refreshRateHz:void 0===l?void 0:mu(1e9/l)}),windowStartedAt:w.windowStartedAt,windowEndedAt:w.windowEndedAt,timestampSource:w.timestampSource,measuredAt:i,method:mp,source:p?"android-gfxinfo-summary":"framestats-rows",worstWindows:S&&S.length>0?S:void 0});return await my(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 my(e,t,r={}){let n=tX(e,r.adb);try{await n(["shell","dumpsys","gfxinfo",t,"reset"],{allowFailure:!0,timeoutMs:3e3})}catch{}}function mS(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.":mb("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.":mb(i))},n)}return new eL("COMMAND_FAILED",`Failed to ${e} Android ${t} for ${r}`,{action:e,package:r,tool:t,hint:mb(t)},n)}function mb(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 mA(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 mI(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 mI(e,t,r){try{let n=await mv(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 m_="adb-shell-simpleperf",mx="adb-shell-perfetto",mM="/data/local/tmp";async function mN(e,t,r){let n=tX(e,r.adb);await mO(n,t),await mL(n,t),await mT(n,t);let i=await mE(t.outPath);await mP(n,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await mA(e,t,i,o,{adb:n});return{...t,action:"stop",platform:"android",state:"stopped",stoppedAt:a,durationMs:o,sizeBytes:i,method:"simpleperf"===t.kind?m_:mx,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function mD(e,t,r={}){let n=tX(e,r.adb);try{"running"===t.state&&(await mO(n,t),await mL(n,t).catch(()=>{}))}finally{await mP(n,t.remotePath)}}function mk(e,t,r=mM){let n=e.replace(/[^A-Za-z0-9_.-]/g,"_");return`${r}/agent-device-${n}-${Date.now()}-${t}`}async function mP(e,t){try{await e(["shell",`rm -f ${mR(t)}`],{allowFailure:!0,timeoutMs:15e3})}catch{}}async function mC(e,t){await s.mkdir(i.dirname(e),{recursive:!0}),await s.writeFile(e,`${JSON.stringify(t,null,2)}
23
+ `)}async function mE(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 mR(e){return`'${e.replace(/'/g,"'\\''")}'`}async function mO(e,t){try{var r;await e(["shell",(r=t.profilerPid,`pid=${mR(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 mS("stop",t.kind,t.packageName,e)}}async function mT(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 mL(e,t){let r;for(let n=0;n<12;n+=1){let n=await m$(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 m$(e,t){let r=mR(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 mF(e,t){try{let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=mG(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 mU(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 mG(e){return e.trim().split(/\s+/).find(e=>/^\d+$/.test(e))}async function mq(e,t,r,n={}){let i,a=tX(e,n.adb),o=await mF(a,t);await mU(a,"perfetto",t);let s=mk(t,"app.perfetto-trace","/data/misc/perfetto-traces");try{await my(e,t,{adb:a}),i=await mV(a,s,t)}catch(e){throw await mP(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:mx,message:`Started Android Perfetto trace for ${t}`}}async function mj(e,t,r,n={}){return await mN(e,{...t,outPath:r},n)}async function mV(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=mG(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 mS("start","perfetto",r,e)}}async function mB(e,t,r,n={}){let i,a=tX(e,n.adb),o=await mF(a,t);await mU(a,"simpleperf",t);let s=mk(t,"cpu.perf.data");try{i=await mW(a,o,s,t)}catch(e){throw await mP(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:m_,message:`Started Android Simpleperf CPU profile for ${t}`}}async function mH(e,t,r,n={}){return await mN(e,{...t,outPath:r},n)}async function mK(e,t,r,n={}){let i=tX(e,n.adb);await mU(i,"simpleperf",t.packageName);let a=await mX(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:fu(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 mC(r,l);let d=await mE(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:m_,message:`Wrote Android Simpleperf report for ${t.packageName}`}}async function mW(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(mR).join(" "),d=`${mM}/agent-device-${s}-${Date.now()}.err`,`err=${mR(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=mG(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 mS("start","simpleperf",n,e)}}async function mX(e,t){try{return await e(["shell","simpleperf","report","-i",t.remotePath,"--stdio","--sort","comm,dso,symbol"],{timeoutMs:3e4})}catch(e){throw mS("report","simpleperf",t.packageName,e)}}let mz="adb-shell-dumpsys-cpuinfo",mJ="Aggregated CPU usage for app processes matched from adb shell dumpsys cpuinfo.",mZ="adb-shell-dumpsys-meminfo",mY="Memory snapshot from adb shell dumpsys meminfo <package>. Values are reported in kilobytes.",mQ="adb-shell-am-dumpheap",m0="Java heap dump captured with adb shell am dumpheap, pulled to a local artifact path.";async function m1(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:fu(i),measuredAt:r,method:mz,matchedProcesses:[...n]}}(e.stdout,t,new Date().toISOString())}catch(e){throw m6("cpu",t,e)}}async function m2(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=m9(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!==mc(e));if(!r)break;return mc(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:m9(e,"TOTAL RSS"),measuredAt:r,method:mZ,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?mc(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 m6("memory",t,e)}}async function m3(e,t,r,n={}){let a,o=tX(e,n.adb),l=await m8(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 m5(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 m4(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 m4(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:mQ,packageName:t,pid:l,remotePath:d}}finally{await o(["shell","rm","-f",d],{allowFailure:!0,timeoutMs:15e3}).catch(()=>{})}}async function m5(e){return await s.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function m4(e,t){t||await s.rm(e,{force:!0}).catch(()=>{})}async function m8(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 m6(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 m9(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:mc(i)??void 0}let m7="shared_prefs/ReactNativeDevPrefs.xml",he="debug_http_host",ht="dev_server_https",hr="RCT_jsLocation",hn="RCT_packager_scheme",hi="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.",ha='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function ho(e){return void 0!==ek(e)}async function hs(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 hd(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await hf(t,r,i)}}async function hl(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await hc(t,r);"ios"===t.platform&&"simulator"===t.kind&&await hm(t,r)}}async function hd(e,t,r){var n,i,a,o,s,l;let d,c;hv(t);let u=(n=await hu(e,t),i=he,a=`${r.host}:${r.port}`,d=` <string name="${hy(i)}">${hy(a)}</string>`,hw(hg(n,i),d));o=u,s=ht,l="https"===r.scheme,c=` <boolean name="${hy(s)}" value="${l?"true":"false"}" />`,u=hw(hg(o,s),c),await hp(e,t,u)}async function hc(e,t){hv(t);let r=await hu(e,t),n=hg(r,he),i=hg(n,ht);i!==r&&await hp(e,t,i)}async function hu(e,t){let r=await e7(e,["shell","run-as",t,"cat",m7],{allowFailure:!0});return 0!==r.exitCode?ha:hh(r.stdout)}async function hp(e,t,r){let n=["shell","run-as",t,"id"],i=await e7(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=hS(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?hi:"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",m7],{stdin:r.trimEnd()})}catch(n){let e=eO(n);if("TOOL_MISSING"===e.code)throw e;let r=hS("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?hi:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function hf(e,t,r){await i4(lH(e,["spawn",e.id,"defaults","write",t,hr,"-string",`${r.host}:${r.port}`])),await i4(lH(e,["spawn",e.id,"defaults","write",t,hn,"-string",r.scheme]))}async function hm(e,t){await i4(lH(e,["spawn",e.id,"defaults","delete",t,hr]),{allowFailure:!0}),await i4(lH(e,["spawn",e.id,"defaults","delete",t,hn]),{allowFailure:!0})}function hh(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
25
+ `:ha}function hw(e,t){return hh(e).replace("</map>",`${t}
26
+ </map>`)}function hg(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return hh(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 hv(e){if("binary"!==tf(e))return;let t=tg(e);throw new eL("INVALID_ARGS",t,{package:e,hint:t})}function hy(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function hS(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 hb=new Map;async function hA(e){let t=await w.mkdtemp(i.join(u.tmpdir(),"agent-device-materialized-"));try{let n=await hx(e.installablePath,i.join(t,"installable")),a=e.archivePath?await hx(e.archivePath,i.join(t,"archive")):void 0,o=r.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{hI(o)},s);return hb.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 hI(e,t){let r=hb.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),hb.delete(e),await w.rm(r.rootPath,{recursive:!0,force:!0})}async function h_(e){let t=Array.from(hb.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await hI(e)}))}async function hx(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 hM=["Simulator"],hN=["Device Hub","Simulator"];function hD(e,t){if("simulator"!==e.kind)throw new eL("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function hk(e={}){let t=e.deviceHub?hN:hM,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 hP(e,t={}){let r,n;if("simulator"!==e.kind)return;if("Booted"===await hE(e)){t.focusExisting&&await hk({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 hE(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 hk({deviceHub:t.deviceHub})}async function hC(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 hE(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 hR(e){return"ios"===e.platform&&"simulator"===e.kind}async function hO(e){if(!1===e.booted)return{success:!0,exitCode:0,stdout:"",stderr:""};try{return hR(e)?await hT(e):await h$(e)}catch(t){let e=eT(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function hT(e){let t=await hC(e);return t.success?t:"Shutdown"===await hL(e)?{...t,success:!0,exitCode:0}:t}async function hL(e){try{return await hE(e)}catch{return null}}async function h$(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 hF=new Map;async function hU(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=hF.get(i);if(void 0!==a){if(a>Date.now()&&!t.focusExisting)return;hF.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}),hG(i);return}if("device"===e.kind){await hq(e.id),hG(i);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./3340.js");await t(e.id),hG(i)}}function hG(e){hF.set(e,Date.now()+5e3)}async function hq(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 hj(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:hV(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?hV(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 hj(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 hV(e,t){let r=fg(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.":fw)}function hB(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 hH(e){return"string"==typeof e?.session&&e.session.trim().length>0}async function hK(e,t){hR(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function hW(e){let t=nA(e.flags,ny)||!e.session?await nu(e.flags??{}):await hX(e.session.device);return!1!==e.ensureReady&&await hU(t),t}async function hX(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 hJ(e,t){return!!t&&0===lP(t,e).length}async function hZ(e){let{device:t,shutdownRequested:r}=e;if(r&&(hR(t)||"android"===t.platform&&"emulator"===t.kind))return await hO(t)}async function hY(e){if(await uh(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 hQ(e){e.applePerf?.active&&(await mr(e.applePerf.active),e.applePerf={...e.applePerf??{},active:void 0})}async function h0(e){let t=e.nativePerf?.android;t&&(await mD(e.device,t),e.nativePerf={...e.nativePerf??{},android:void 0})}async function h1(e){"android"===e.device.platform&&await tU(e.device)}async function h2(e,t){e.appLog&&await fr(e.appLog),await hQ(e),await h0(e),await h1(e),e3(e.device.platform)&&await hY(e),await h_(t).catch(()=>{})}async function h3(e){var t,r,n;let{req:i,sessionName:a,logPath:o,sessionStore:s}=e,l=s.get(a);if(!l)return await h5(i,o);(l.appLog&&await fr(l.appLog),await hQ(l),await h0(l),await h1(l),t=i,r=l,n=t,(n.positionals?.length??0)>0||"web"===r.device.platform)&&(e3(l.device.platform)&&!hR(l.device)&&await hY(l),await iS(l.device,"close",i.positionals??[],i.flags?.out,{...aW(o,i.flags,l.appBundleId,l.trace?.outPath)}),await hK(l.device,300));e3(l.device.platform)&&(!hR(l.device)||i.flags?.shutdown||l.recording)?await hY(l):e3(l.device.platform)&&el({level:"debug",phase:"ios_runner_retained_after_close",data:{session:l.name,deviceId:l.device.id}}),ho(s.getRuntimeHints(a))&&l.appBundleId&&await hl({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 h_(a).catch(()=>{}),s.delete(a);let d=await hZ({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 h5(e,t){if(!e.positionals||0===e.positionals.length)return a8("SESSION_NOT_FOUND","No active session");let r=await hW({session:void 0,flags:e.flags,ensureReady:!0});return await iS(r,"close",e.positionals,e.flags?.out,{...aW(t,e.flags)}),await hK(r,300),{ok:!0,data:{app:e.positionals[0],...V(`Closed: ${e.positionals[0]}`)}}}async function h4(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 h8(e){a.existsSync(e)&&a.unlinkSync(e)}function h6(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 h9(e){let t=h6(e);if(!t||t.pid===process.pid)try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}function h7(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function we(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:h7(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:h7(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:h7(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:h7(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 pS();try{return await nm(p,async()=>{let t=await u3({req:e,sessionStore:m,leaseRegistry:h});return await g(t)})}catch(e){return pA(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=up(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(lC).join(", ")}.`,{session:e.name,conflicts:r.map(lC),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})=>pd({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 pS();try{let n=await u3({req:e,sessionStore:m,leaseRegistry:h});return n.sessionName===t.sessionName?await g(n,r):await w(e)}catch(e){return pA(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await pb({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=h2(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))},C=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 we(i,"Failed to bind socket server")}if("socket"!==h){let e=await r5({handleRequest:N,token:_});r.push(e),t=await we(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=h6(t);if(o?.pid&&o.pid!==process.pid&&eC(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 E=[];try{let e,r=await C();E=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
33
  `),v&&s.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${v}
34
- `)}catch(t){let e=eE(t);for(let t of(l.write(`Daemon error: ${e.message}
35
- `),C))try{t.close(()=>{})}catch{}return hU(u),hq(p),d(1),null}eo();let R=!1,O=async(e={})=>{if(R)return;R=!0,e.cause&&await D(e.cause),await hF(C),await P();let{stopAllIosRunnerSessions:t}=await Promise.resolve(tX);await t(),await Promise.race([eu().catch(()=>{}),eQ(1e3)]),hU(u),hq(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 eR?e:eE(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 eR?t:eE(t);l.write(`Daemon error: ${r.message}
37
- `),O({exitCode:1,cause:t})})),{httpPort:n,shutdown:O,socketPort:t,token:_}})().catch(e=>{let t=eE(e);process.stderr.write(`Daemon error: ${t.message}
38
- `),process.exit(1)});export{mP as ANDROID_CPU_SAMPLE_DESCRIPTION,mk as ANDROID_CPU_SAMPLE_METHOD,f3 as ANDROID_FRAME_SAMPLE_DESCRIPTION,f2 as ANDROID_FRAME_SAMPLE_METHOD,mO as ANDROID_HPROF_SNAPSHOT_DESCRIPTION,mR as ANDROID_HPROF_SNAPSHOT_METHOD,mC as ANDROID_MEMORY_SAMPLE_DESCRIPTION,mE as ANDROID_MEMORY_SAMPLE_METHOD,fl as APPLE_MEMGRAPH_SNAPSHOT_DESCRIPTION,fs as APPLE_MEMGRAPH_SNAPSHOT_METHOD,p6 as IOS_DEVICECTL_DEFAULT_HINT,dU as IOS_RUNNER_CONTAINER_BUNDLE_IDS,nR as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,nC as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,t8 as SessionStore,sy as annotateScreenshotWithRefs,pL as withAppLogProvider,pX as appendAppLogMarker,mZ as applyRuntimeHintsToApp,fh as buildAppleFrameSamplingMetadata,fg as buildAppleMemorySnapshotSupport,fw as buildAppleSamplingMetadata,nG as buildRunnerSequenceCommand,lw as buildSessionRecoveryHint,lE as buildSimctlArgs,lC as buildSimctlArgsForDevice,oS as buildSnapshotState,m$ as captureAndroidHeapSnapshot,oR as captureAndroidUiHierarchyXml,fc as captureAppleMemorySnapshot,od as captureSnapshot,hn as cleanupRetainedMaterializedPaths,rA as cleanupUploadedArtifact,pz as clearAppLogFiles,ru as clearRequestCanceled,mY as clearRuntimeHintsFromApp,aF as context_contextFromFlags,u0 as createAgentBrowserWebProvider,oM as createDaemonRuntimeSessionStore,uu as createLocalAppleRunnerProvider,rm as createRequestCanceledError,i$ as createScopedProvider,ip as dispatchCommand,rC as emitRequestProgress,o8 as ensureAndroidBlockingSystemDialogReady,hy as ensureDeviceReady,aZ as errorResponse,iF as filterAppleAppsByBundlePrefix,aO as getActiveAndroidSnapshotFreshness,pU as getAppLogPathMetadata,rf as getRequestSignal,c3 as getRunnerSessionSnapshot,ny as getSessionCommandKind,hp as getSimulatorState,s$ as getSnapshotReferenceFrame,hL as handleCloseCommand,mJ as hasRuntimeTransportHints,iX as hasScopedAppleToolProvider,t2 as inferFillText,iL as isCommandSupportedOnDevice,lI as isImplicitSessionScopeConflict,aL as isNavigationSensitiveAction,rp as isRequestCanceled,nd as listDeviceInventory,p3 as listIosDeviceApps,ad as runMacOsPressAction,al as runMacOsReadTextAction,aR as markAndroidSnapshotFreshness,aU as markPendingInteractionOutcome,aW as markPostGestureStabilization,rc as markRequestCanceled,nq as parseRunnerSequenceResult,uO as prepareIosRunner,rb as prepareUploadedArtifact,uR as prewarmIosRunnerSession,ai as quitMacOsApp,iZ as readApplePlistJson,p9 as readInfoPlistString,rO as readReplayTestActionProgress,pq as readSessionNetworkCapture,sG as recordTouchVisualizationEvent,o6 as recoverAndroidBlockingSystemDialog,hD as refreshSessionDeviceIfNeeded,rd as registerRequestAbort,h_ as requireSessionOrExplicitSelector,hl as requireSimulatorDevice,f7 as resetAndroidFramePerfStats,hk as resolveAndroidEmulatorAvdName,up as resolveAppleRunnerProvider,iK as resolveAppleToolProvider,hN as resolveCommandDevice,an as resolveFrontmostMacOsApp,lb as resolveImplicitSessionScope,p8 as resolveIosDevicectlHint,l_ as resolveLeaseScope,am as resolveLinuxToolProvider,pG as resolveLogBackend,id as resolvePayloadInput,lS as resolvePublicSessionName,rl as resolveRequestTrackingId,d$ as resolveRunnerAppBundleId,t7 as resolveSessionRequestLogPath,t9 as resolveSessionRunnerLogPath,o_ as resolveSnapshotScope,na as resolveTargetDevice,hr as retainMaterializedPaths,pW as runAppLogDoctor,iz as runAppleToolCommand,p2 as runIosDevicectl,aw as runLinuxToolCommand,ao as runMacOsAlertAction,aa as runMacOsPermissionAction,ac as runMacOsScreenshotAction,as as runMacOsSnapshotAction,lR as runSimctlForDevice,iJ as runXcrun,uC as runIosRunnerCommand,uf as withAppleRunnerProvider,c8 as abortAllIosRunnerSessions,c9 as stopAllIosRunnerSessions,mT as sampleAndroidCpuPerf,f9 as sampleAndroidFramePerf,mL as sampleAndroidMemoryPerf,fm as sampleAppleFramePerf,fd as sampleApplePerfMetrics,hP as selectorTargetsSessionDevice,lA as sessionMatchesScope,hx as session_device_utils_hasExplicitSessionFlag,ox as setSessionSnapshot,hM as settleIosSimulator,hm as shutdownDeviceTarget,hu as shutdownSimulator,hc as ensureBootedSimulator,oO as snapshotAndroid,ak as snapshotLinux,aP as readLinuxTextAtPoint,mb as startAndroidPerfettoTrace,m_ as startAndroidSimpleperfProfile,pV as startAppLog,fB as startAppleXctracePerfCapture,mA as stopAndroidPerfettoTrace,mx as stopAndroidSimpleperfProfile,pK as stopAppLog,fH as stopAppleXctracePerfCapture,c6 as stopIosRunnerSession,aj as stripInternalInteractionFlags,iW as withAppleToolProvider,ah as withLinuxToolProvider,t3 as uniqueStrings,lm as withKeyedLock,rR as withReplayTestActionProgress,mM as writeAndroidSimpleperfReport,fW as writeAppleXctracePerfReport};
34
+ `)}catch(t){let e=eO(t);for(let t of(l.write(`Daemon error: ${e.message}
35
+ `),E))try{t.close(()=>{})}catch{}return h8(u),h9(p),d(1),null}ed();let R=!1,O=async(e={})=>{if(R)return;R=!0,e.cause&&await D(e.cause),await h4(E),await P();let{stopAllIosRunnerSessions:t}=await Promise.resolve(t0);await t(),await Promise.race([em().catch(()=>{}),e2(1e3)]),h8(u),h9(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{mJ as ANDROID_CPU_SAMPLE_DESCRIPTION,mz as ANDROID_CPU_SAMPLE_METHOD,mf as ANDROID_FRAME_SAMPLE_DESCRIPTION,mp as ANDROID_FRAME_SAMPLE_METHOD,m0 as ANDROID_HPROF_SNAPSHOT_DESCRIPTION,mQ as ANDROID_HPROF_SNAPSHOT_METHOD,mY as ANDROID_MEMORY_SAMPLE_DESCRIPTION,mZ as ANDROID_MEMORY_SAMPLE_METHOD,fD as APPLE_MEMGRAPH_SNAPSHOT_DESCRIPTION,fN as APPLE_MEMGRAPH_SNAPSHOT_METHOD,fw 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,sE as annotateScreenshotWithRefs,p2 as withAppLogProvider,fi as appendAppLogMarker,hs as applyRuntimeHintsToApp,fT as buildAppleFrameSamplingMetadata,f$ as buildAppleMemorySnapshotSupport,fL as buildAppleSamplingMetadata,nK as buildRunnerSequenceCommand,lk as buildSessionRecoveryHint,lB as buildSimctlArgs,lH as buildSimctlArgsForDevice,ok as buildSnapshotState,m3 as captureAndroidHeapSnapshot,oH as captureAndroidUiHierarchyXml,fP as captureAppleMemorySnapshot,ov as captureSnapshot,hI as cleanupRetainedMaterializedPaths,rD as cleanupUploadedArtifact,fa as clearAppLogFiles,rg as clearRequestCanceled,hl as clearRuntimeHintsFromApp,aW as context_contextFromFlags,pd as createAgentBrowserWebProvider,oT as createDaemonRuntimeSessionStore,uP as createLocalAppleRunnerProvider,rS as createRequestCanceledError,iK as createScopedProvider,iS as dispatchCommand,rF as emitRequestProgress,sc as ensureAndroidBlockingSystemDialogReady,hU as ensureDeviceReady,a8 as errorResponse,iW as filterAppleAppsByBundlePrefix,aV as getActiveAndroidSnapshotFreshness,p4 as getAppLogPathMetadata,ry as getRequestSignal,up as getRunnerSessionSnapshot,nx as getSessionCommandKind,hE as getSimulatorState,sJ as getSnapshotReferenceFrame,h3 as handleCloseCommand,ho as hasRuntimeTransportHints,i3 as hasScopedAppleToolProvider,t9 as inferFillText,iH as isCommandSupportedOnDevice,lL as isImplicitSessionScopeConflict,aH as isNavigationSensitiveAction,rv as isRequestCanceled,nh as listDeviceInventory,ff as listIosDeviceApps,av as runMacOsPressAction,ag as runMacOsReadTextAction,aj as markAndroidSnapshotFreshness,aX as markPendingInteractionOutcome,a2 as markPostGestureStabilization,rw as markRequestCanceled,nW as parseRunnerSequenceResult,uQ as prepareIosRunner,rN as prepareUploadedArtifact,uY as prewarmIosRunnerSession,af as quitMacOsApp,i8 as readApplePlistJson,fv as readInfoPlistString,rG as readReplayTestActionProgress,p6 as readSessionNetworkCapture,sQ as recordTouchVisualizationEvent,sd as recoverAndroidBlockingSystemDialog,hX as refreshSessionDeviceIfNeeded,rh as registerRequestAbort,hB as requireSessionOrExplicitSelector,hD as requireSimulatorDevice,my as resetAndroidFramePerfStats,hz as resolveAndroidEmulatorAvdName,uC as resolveAppleRunnerProvider,i1 as resolveAppleToolProvider,hW as resolveCommandDevice,ap as resolveFrontmostMacOsApp,lO as resolveImplicitSessionScope,fg as resolveIosDevicectlHint,l$ as resolveLeaseScope,aI as resolveLinuxToolProvider,p8 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,hA as retainMaterializedPaths,fn as runAppLogDoctor,i5 as runAppleToolCommand,fp as runIosDevicectl,ax as runLinuxToolCommand,ah as runMacOsAlertAction,am as runMacOsPermissionAction,ay as runMacOsScreenshotAction,aw as runMacOsSnapshotAction,lK as runSimctlForDevice,i4 as runXcrun,uZ as runIosRunnerCommand,uE as withAppleRunnerProvider,uw as abortAllIosRunnerSessions,ug as stopAllIosRunnerSessions,m1 as sampleAndroidCpuPerf,mv as sampleAndroidFramePerf,m2 as sampleAndroidMemoryPerf,fO as sampleAppleFramePerf,fk as sampleApplePerfMetrics,hJ as selectorTargetsSessionDevice,lT as sessionMatchesScope,hH as session_device_utils_hasExplicitSessionFlag,oO as setSessionSnapshot,hK as settleIosSimulator,hO as shutdownDeviceTarget,hC as shutdownSimulator,hP as ensureBootedSimulator,oK as snapshotAndroid,aF as snapshotLinux,aU as readLinuxTextAtPoint,mq as startAndroidPerfettoTrace,mB as startAndroidSimpleperfProfile,p7 as startAppLog,me as startAppleXctracePerfCapture,mj as stopAndroidPerfettoTrace,mH as stopAndroidSimpleperfProfile,fr as stopAppLog,mt as stopAppleXctracePerfCapture,uh as stopIosRunnerSession,aZ as stripInternalInteractionFlags,i2 as withAppleToolProvider,a_ as withLinuxToolProvider,t7 as uniqueStrings,lN as withKeyedLock,rU as withReplayTestActionProgress,mK as writeAndroidSimpleperfReport,mn as writeAppleXctracePerfReport};