agent-device 0.16.14 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.16.14.apk → agent-device-android-multitouch-helper-0.17.0.apk} +0 -0
  2. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.0.apk.sha256 +1 -0
  3. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.16.14.manifest.json → agent-device-android-multitouch-helper-0.17.0.manifest.json} +4 -4
  4. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.16.14.apk → agent-device-android-snapshot-helper-0.17.0.apk} +0 -0
  5. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.0.apk.sha256 +1 -0
  6. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.16.14.manifest.json → agent-device-android-snapshot-helper-0.17.0.manifest.json} +6 -6
  7. package/dist/src/1352.js +1 -1
  8. package/dist/src/221.js +4 -4
  9. package/dist/src/2415.js +29 -29
  10. package/dist/src/2805.js +1 -1
  11. package/dist/src/6232.js +1 -1
  12. package/dist/src/7599.js +4 -3
  13. package/dist/src/8020.js +1 -0
  14. package/dist/src/8699.js +1 -1
  15. package/dist/src/940.js +1 -1
  16. package/dist/src/9533.js +1 -1
  17. package/dist/src/android-snapshot-helper.d.ts +1 -0
  18. package/dist/src/apple.js +1 -1
  19. package/dist/src/args.js +14 -9
  20. package/dist/src/cli.js +9 -9
  21. package/dist/src/command-metadata.js +1 -1
  22. package/dist/src/contracts.d.ts +1 -0
  23. package/dist/src/find.js +1 -1
  24. package/dist/src/finders.d.ts +1 -0
  25. package/dist/src/generic.js +9 -9
  26. package/dist/src/index.d.ts +19 -1
  27. package/dist/src/selectors.d.ts +1 -0
  28. package/dist/src/session.js +11 -11
  29. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +4 -0
  30. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +71 -0
  31. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +41 -7
  32. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +154 -11
  33. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +11 -0
  34. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +12 -4
  35. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +26 -0
  36. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -0
  37. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +7 -1
  38. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +571 -56
  39. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +21 -0
  40. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +11 -0
  41. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +13 -2
  42. package/ios-runner/README.md +13 -0
  43. package/package.json +1 -1
  44. package/server.json +2 -2
  45. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.14.apk.sha256 +0 -1
  46. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.14.apk.sha256 +0 -1
package/dist/src/2415.js CHANGED
@@ -1,31 +1,31 @@
1
- import{__webpack_require__ as e}from"./rslib-runtime.js";import t,{createHash as r}from"node:crypto";import n from"node:path";import i,{existsSync as a,promises as o}from"node:fs";import s from"node:http";import{fileURLToPath as l,pathToFileURL as c}from"node:url";import"node:https";import d from"node:os";import{once as u}from"node:events";import{Transform as p}from"node:stream";import{pipeline as f}from"node:stream/promises";import{AsyncLocalStorage as m}from"node:async_hooks";import h from"node:fs/promises";import w from"node:net";import{resolveUserPath as g}from"./3267.js";import{appendScreenshotScriptFlags as v,screenshotOptionsFromFlags as y,screenshotFlagsFromOptions as S,SCREENSHOT_ACTION_FLAG_KEYS as _}from"./5310.js";import{withDiagnosticsScope as I,getDiagnosticsMeta as b,flushDiagnosticsToSessionFile as A,withDiagnosticTimer as x,emitDiagnostic as N}from"./7599.js";import{readProcessStartTime as M,readProcessCommand as D,resolveRuntimeTransportHints as E,isProcessGroupAlive as k,isAgentDeviceDaemonProcess as P,isProcessAlive as C}from"./8656.js";import{toAppErrorCode as R,asAppError as O,normalizeError as T,AppError as L}from"./9152.js";import{runCmdBackground as $,runCmdStreaming as F,runCmd as U,runCmdSync as G,resolveExecutableOverridePath as q,whichCmd as V}from"./9818.js";import{consumeTextLines as j,serializeDaemonResponseEnvelope as B,normalizeTenantId as H,shouldStreamRequestProgress as K,resolveDaemonPaths as W,resolveSessionIsolationMode as z,shellQuoteIfNeeded as J,resolveDaemonServerMode as X,resolveDaemonCodeSignature as Z,serializeDaemonProgressEnvelope as Y,serializeDaemonRpcResponseEnvelope as Q}from"./9238.js";import{runAndroidAdb as ee,resolveIosSimulatorDeviceSetPath as et,getAndroidBlockingDialogFocus as er,withRetry as en,Deadline as ei,isEnvTruthy as ea,openAndroidApp as eo,classifyBootFailure as es,streamAndroidLogcatWithAdb as el,bootFailureHint as ec,androidDeviceForSerial as ed,parseSerialAllowlist as eu,retryWithPolicy as ep,getAndroidAppState as ef,classifyAndroidAppTarget as em,captureAndroidLogcatWithAdb as eh,resolveAndroidSerialAllowlist as ew,isDeepLinkTarget as eg,formatAndroidInstalledPackageRequiredMessage as ev}from"./8806.js";import{PUBLIC_COMMANDS as ey,INTERNAL_COMMANDS as eS,GESTURE_SUBCOMMAND_ERROR as e_}from"./5792.js";import{findMistargetedTypeRefToken as eI,buildSwipePresetGesturePlan as eb,analyzeReactNativeOverlay as eA,parseScrollDirection as ex,isKeyboardAction as eN,isSystemScrollIndicatorLabel as eM,isReactNativeCollapsedWarningWrapperWithVisibleBanner as eD,formatScrollEdgeMessage as eE,deriveMobileSnapshotHiddenContentHints as ek,inferVerticalScrollIndicatorDirections as eP,captureScrollEdgeState as eC,normalizeSnapshotTree as eR,isReactNativeCollapsedWarningWrapperCandidate as eO,PNG as eT,createAgentDevice as eL,runScrollEdgePasses as e$,requireIntInRange as eF,inferGestureReferenceFrame as eU,localCommandPolicy as eG,decodePng as eq,buildScrollGesturePlan as eV,parseSwipePreset as ej}from"./9533.js";import{sleep as eB}from"./4829.js";import{readLocationCoordinate as eH,successText as eK,withSuccessText as eW,parseDeviceRotation as ez}from"./1998.js";import{findNearestAncestor as eJ,normalizeType as eX,pruneGroupNodes as eZ,findNodeByLabel as eY,resolveRefLabel as eQ}from"./940.js";import{snapshotPresentationOptionsFromFlags as e0,normalizeRef as e1,findNodeByRef as e2,buildSnapshotPresentationKey as e3,centerOfRect as e4,attachRefs as e5}from"./4057.js";import{isScrollableType as e8}from"./4778.js";import{readVersion as e6,findProjectRoot as e9}from"./9671.js";import{resolveAndroidAdbProvider as e7,resolveAndroidAdbExecutor as te}from"./9639.js";import{parseUiHierarchy as tt,ensureAndroidSnapshotHelper as tr,parseUiHierarchyTree as tn,captureAndroidSnapshotWithHelper as ti,captureAndroidSnapshotWithHelperSession as ta,parseAndroidSnapshotHelperManifest as to,forgetAndroidSnapshotHelperInstall as ts,buildUiHierarchySnapshot as tl,stopAndroidSnapshotHelperSession as tc}from"./221.js";import{applyCommandDefaults as td}from"./1352.js";var tu={};e.r(tu),e.d(tu,{IH:()=>ub,ug:()=>uA,sE:()=>uh,Bx:()=>uw,WX:()=>uI,Co:()=>uv,wg:()=>u_,withAppLogProvider:()=>up});var tp={};e.r(tp),e.d(tp,{IO:()=>iK,LB:()=>iH,xY:()=>iz,eN:()=>iW,runMacOsPressAction:()=>iZ,runMacOsReadTextAction:()=>iX,rR:()=>iY,r5:()=>iJ});var tf={};e.r(tf),e.d(tf,{bu:()=>cu,abortAllIosRunnerSessions:()=>c9,hv:()=>c4,Nr:()=>dO,gE:()=>dR,FS:()=>cc,runIosRunnerCommand:()=>dC,stopAllIosRunnerSessions:()=>c7,yA:()=>c6});var tm={};e.r(tm),e.d(tm,{v:()=>du,M:()=>dp,withAppleRunnerProvider:()=>df});var th={};e.r(th),e.d(th,{ensureBootedSimulator:()=>uM,SA:()=>uE,EB:()=>ux,N3:()=>uD});var tw={};e.r(tw),e.d(tw,{qx:()=>iN,Ly:()=>iE,Gr:()=>iA,vT:()=>iM,Cc:()=>iD,withAppleToolProvider:()=>ix});var tg={};e.r(tg),e.d(tg,{readLinuxTextAtPoint:()=>al,r:()=>as});var tv={};function ty(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}e.r(tv),e.d(tv,{uK:()=>i2,nE:()=>i4,withLinuxToolProvider:()=>i3});let tS=["platform","device","udid","serial","out","verbose","metroHost","metroPort","bundleUrl","launchUrl","snapshotInteractiveOnly","snapshotCompact","snapshotDepth","snapshotScope","snapshotRaw",..._,"relaunch","saveScript","noRecord","fps","quality","hideTouches","count","intervalMs","delayMs","holdMs","jitterPx","doubleTap","clickButton","pauseMs","pattern"];function t_(e){let t=e.result?.text;if("string"==typeof t&&t.trim().length>0)return t;let r=e.positionals??[];if(0===r.length)return"";let n=r[0];return n?.startsWith("@")?r.length>=3?r.slice(2).join(" ").trim():r.slice(1).join(" ").trim():!(r.length>=3)||Number.isNaN(Number(r[0]))||Number.isNaN(Number(r[1]))?r.slice(1).join(" ").trim():r.slice(2).join(" ").trim()}function tI(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}let tb=/^-?\d+(\.\d+)?$/,tA=/^[^\s"\\]+$/,tx=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),tN=new Map([["--count","count"],["--pause-ms","pauseMs"]]),tM=new Map([["--delay-ms","delayMs"]]);function tD(e){return"click"===e||"press"===e}function tE(e){return tD(e)||"longpress"===e}function tk(e){return"type"===e||"fill"===e}function tP(e){return tR(e,tO)}function tC(e){return JSON.stringify(e)}function tR(e,t){return t(e)?e:tC(e)}function tO(e){return tT(e)&&e.startsWith("@")||tb.test(e)}function tT(e){return tA.test(e)}function tL(e){let t=(e.positionals??[]).map(e=>tP(e));return[e.command,...t].join(" ")}function t$(e,t){let r=t.flags??{};if(tD(t.command)){"number"==typeof r.count&&e.push("--count",String(r.count)),"number"==typeof r.intervalMs&&e.push("--interval-ms",String(r.intervalMs)),"number"==typeof r.holdMs&&e.push("--hold-ms",String(r.holdMs)),"number"==typeof r.jitterPx&&e.push("--jitter-px",String(r.jitterPx)),!0===r.doubleTap&&e.push("--double-tap");let t=r.clickButton;t&&"primary"!==t&&e.push("--button",t);return}if("swipe"===t.command){"number"==typeof r.count&&e.push("--count",String(r.count)),"number"==typeof r.pauseMs&&e.push("--pause-ms",String(r.pauseMs)),("one-way"===r.pattern||"ping-pong"===r.pattern)&&e.push("--pattern",r.pattern);return}tk(t.command)&&"number"==typeof r.delayMs&&e.push("--delay-ms",String(r.delayMs))}function tF(e,t){t&&(("ios"===t.platform||"android"===t.platform)&&e.push("--platform",t.platform),"string"==typeof t.metroHost&&t.metroHost.length>0&&e.push("--metro-host",tR(t.metroHost,tT)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",tR(t.bundleUrl,tT)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",tR(t.launchUrl,tT)))}function tU(e,t){let r=[],n={},i=tD(e)?tx:"swipe"===e?tN:tk(e)?tM:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(tD(e)&&"--double-tap"===o){n.doubleTap=!0;continue}let s=t[a+1];if(tD(e)&&"--button"===o&&void 0!==s){("primary"===s||"secondary"===s||"middle"===s)&&(n.clickButton=s),a+=1;continue}let l=i?.get(o);if(l&&void 0!==s){let e=tq(s);if(null!==e){n[l]=e,a+=1;continue}}if("swipe"===e&&"--pattern"===o&&void 0!==s){("one-way"===s||"ping-pong"===s)&&(n.pattern=s),a+=1;continue}r.push(o)}return{positionals:r,flags:n}}function tG(e){let t=[],r={};for(let n=0;n<e.length;n+=1){let i=e[n],a=e[n+1];if("--platform"===i&&void 0!==a){("ios"===a||"android"===a)&&(r.platform=a),n+=1;continue}if("--metro-host"===i&&void 0!==a){r.metroHost=a,n+=1;continue}if("--metro-port"===i&&void 0!==a){let e=tq(a);null!==e&&(r.metroPort=e),n+=1;continue}if("--bundle-url"===i&&void 0!==a){r.bundleUrl=a,n+=1;continue}if("--launch-url"===i&&void 0!==a){r.launchUrl=a,n+=1;continue}t.push(i)}return{positionals:t,flags:r}}function tq(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function tV(e){var t;let r=[],n={};for(let t of e){if("--relaunch"===t){n.relaunch=!0;continue}r.push(t)}let i=tG(r);return{positionals:i.positionals,flags:n,runtime:(t=i.flags).platform||t.metroHost||void 0!==t.metroPort||t.bundleUrl||t.launchUrl?i.flags:void 0}}function tj(e,t={}){let r=[e.command];if("snapshot"===e.command)e.flags?.snapshotInteractiveOnly&&r.push("-i"),e.flags?.snapshotCompact&&r.push("-c"),"number"==typeof e.flags?.snapshotDepth&&r.push("-d",String(e.flags.snapshotDepth)),e.flags?.snapshotScope&&r.push("-s",tP(e.flags.snapshotScope)),e.flags?.snapshotRaw&&r.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])r.push(tP(t));e.flags?.relaunch&&r.push("--relaunch"),tF(r,e.runtime)}else if("runtime"===e.command)!function(e,t,r={}){let n=t.positionals??[];for(let t of r.includeAllPositionals?n:n.slice(0,1))e.push(tR(t,tT));tF(e,t.flags)}(r,e,{includeAllPositionals:t.runtimeIncludeAllPositionals});else if("record"===e.command)!function(e,t){let[r,...n]=t.positionals??[];for(let t of(r&&e.push(tR(r,tT)),n))e.push(tP(t));"number"==typeof t.flags?.fps&&e.push("--fps",String(t.flags.fps)),"number"==typeof t.flags?.quality&&e.push("--quality",String(t.flags.quality)),t.flags?.hideTouches&&e.push("--hide-touches")}(r,e);else if("screenshot"===e.command){for(let t of e.positionals??[])r.push(tP(t));v(r,e.flags)}else{for(let t of e.positionals??[])r.push(tP(t));t$(r,e)}return r.join(" ")}class tB{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let r=n.dirname(t);i.existsSync(r)||i.mkdirSync(r,{recursive:!0});let a=function(e){var t=e,r=function(e){let t=[];for(let r of e.actions){if("snapshot"===r.command)continue;let n=function(e){let t=function(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>"string"==typeof e)?e.result.selectorChain:[];return t.length>0?t.join(" || "):void 0}(e);if(t&&tH(e.command))return tD(e.command)?{...e,positionals:[t]}:"longpress"===e.command?function(e,t){let r="number"==typeof e.result?.durationMs?String(e.result.durationMs):function(e){let t=e.at(-1);if(!(e.length<=1)&&void 0!==t&&""!==t.trim())return Number.isFinite(Number(t))?t:void 0}(e.positionals??[]);return{...e,positionals:r?[t,r]:[t]}}(e,t):"fill"===e.command?function(e,t){let r=t_(e);return r.length>0?{...e,positionals:[t,r]}:void 0}(e,t):function(e,t){let r=e.positionals?.[0];return"text"===r||"attrs"===r?{...e,positionals:[r,t]}:void 0}(e,t)}(r);if(n){t.push(n);continue}let i=function(e,t){if(!tH(t.command))return;let r=t.result?.refLabel;if("string"!=typeof r||0===r.trim().length)return;let n=r.trim();return{ts:t.ts,command:"snapshot",positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotCompact:!0,snapshotScope:n},result:{scope:n}}}(e,r);i&&t.push(i),t.push(r)}return t}(e);let n=[],i=t.device.kind?` kind=${t.device.kind}`:"";for(let e of(n.push(`context platform=${t.device.platform} device=${tC(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,tD(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(tP(r)),tK(e,t),t$(e,t),e.join(" ");if(1===t.positionals.length)return e.push(tP(r)),t$(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(tP(r)),tK(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(tP(n)),t$(e,t),e.join(" ")}(t,r):"get"===r.command?function(e,t){let r=t.positionals?.[0],n=t.positionals?.[1];if(r&&n)return e.push(tP(r)),e.push(tP(n)),n.startsWith("@")&&tK(e,t),e.join(" ")}(t,r):void 0);return n||tj(e)}(e));return`${n.join("\n")}
2
- `}(e);return i.writeFileSync(t,a),{written:!0,path:t}}catch(r){return N({level:"warn",phase:"session_script_write_failed",data:{session:e.name,path:t,error:r instanceof Error?r.message:String(r)}}),{written:!1}}}resolveScriptPath(e){if(e.saveScriptPath)return g(e.saveScriptPath,{cwd:void 0});i.existsSync(this.sessionsDir)||i.mkdirSync(this.sessionsDir,{recursive:!0});let t=ty(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return n.join(this.sessionsDir,`${t}-${r}.ad`)}}function tH(e){return tE(e)||"fill"===e||"get"===e}function tK(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(tP(r))}class tW{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new tB(e)}get(e){return this.sessions.get(e)}set(e,t){this.sessions.set(e,t)}delete(e){return this.runtimeHints.delete(e),this.sessions.delete(e)}values(){return this.sessions.values()}toArray(){return Array.from(this.sessions.values())}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){this.runtimeHints.set(e,t)}clearRuntimeHints(e){return this.runtimeHints.delete(e)}recordAction(e,t){t.flags?.noRecord||(t.flags?.saveScript&&(e.recordSession=!0,"string"==typeof t.flags.saveScript&&(e.saveScriptPath=g(t.flags.saveScript,{cwd:void 0}))),e.actions.push({ts:Date.now(),command:t.command,positionals:t.positionals,runtime:t.runtime,flags:function(e){if(!e)return{};let t={};for(let r of tS)void 0!==e[r]&&(t[r]=e[r]);return t}(t.flags),result:t.result}),N({level:"debug",phase:"record_action",data:{command:t.command,session:e.name}}))}writeSessionLog(e){let t=this.scriptWriter.write(e);t.written&&N({level:"info",phase:"session_script_written",data:{session:e.name,path:t.path}})}defaultTracePath(e){let t=ty(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return n.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return n.join(this.sessionsDir,ty(e))}ensureSessionDir(e){let t=this.resolveSessionDir(e);return i.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return n.join(this.resolveSessionDir(e),"app.log")}resolveAppLogPidPath(e){return n.join(this.resolveSessionDir(e),"app-log.pid")}static expandHome(e,t){return g(e,{cwd:t})}}let tz="app-log.pid";function tJ(e){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t))return{pid:Number.parseInt(t,10)};try{let e=JSON.parse(t);if(!Number.isInteger(e.pid)||e.pid<=0)return null;return e}catch{return null}}function tX(e,t){if(!e)return;let r=n.dirname(e);i.existsSync(r)||i.mkdirSync(r,{recursive:!0});let a={pid:t,startTime:M(t)??void 0,command:D(t)??void 0};i.writeFileSync(e,`${JSON.stringify(a)}
3
- `)}function tZ(e){if(e&&i.existsSync(e))try{i.unlinkSync(e)}catch{}}let tY=new Set,tQ=new Map,t0="request_canceled",t1="request canceled";function t2(e,t){if("string"==typeof e&&e.length>0)return e;let r=("string"==typeof t?t:"number"==typeof t&&Number.isFinite(t)?String(t):"generated").trim().replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,32)||"generated",n=Math.random().toString(36).slice(2,10);return`req:${r}:${process.pid}:${Date.now()}:${n}`}function t3(e){if(!e)return;!function(e){if(e.size<=5e4)return;let t=0;for(let r of e.keys()){if(t>=1e4)break;e.delete(r),t++}}(tQ);let t=new AbortController;tQ.set(e,t),tY.has(e)&&t.abort()}function t4(e){e&&(!function(e){if(e.size<=5e4)return;let t=0;for(let r of e){if(t>=1e4)break;e.delete(r),t++}}(tY),tY.add(e),tQ.get(e)?.abort())}function t5(e){e&&(tY.delete(e),tQ.delete(e))}function t8(e){return!!e&&tY.has(e)}function t6(e){if(e)return tQ.get(e)?.signal}function t9(){return new L("COMMAND_FAILED",t1,{reason:t0})}function t7(e){if(t8(e))throw t9()}function re(e){return e instanceof L&&"COMMAND_FAILED"===e.code&&(e.details?.reason===t0||e.message===t1)}let rt=new Map;function rr(e){let r=t.randomUUID(),n=setTimeout(()=>{rn(r)},9e5);return n.unref(),rt.set(r,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),r}function rn(e){let t=rt.get(e);if(t&&(clearTimeout(t.timer),rt.delete(e),t.deleteAfterDownload))try{i.rmSync(t.artifactPath,{force:!0})}catch{}}let ri=new Map;function ra(e,t){let r=ri.get(e);if(!r)throw new L("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new L("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function ro(e){let t=ri.get(e);t&&(clearTimeout(t.timer),ri.delete(e),i.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function rs(e){let t=await rl(e);await U("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=n.join(e.tempDir,t);if(!i.existsSync(r))throw new L("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function rl(e){let t=await U("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new L("INVALID_ARGS","Artifact is not a valid tar archive",{archivePath:e.archivePath,stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let r=t.stdout.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(0===r.length)throw new L("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(rc),i=e.expectedRootName??function(e,t){let r=new Set;for(let t of e){let[e]=t.split("/");e&&r.add(e)}let n=[...r];if("ios"===t){let e=n.filter(e=>e.toLowerCase().endsWith(".app")),t=e[0];if(void 0!==t&&1===e.length)return t;if(0===e.length)throw new L("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new L("INVALID_ARGS",`iOS app bundle archives must contain exactly one top-level .app directory, found: ${e.join(", ")}`)}let i=n[0];if(void 0!==i&&1===n.length)return i;throw new L("INVALID_ARGS",`Archive must contain a single top-level bundle, found: ${n.join(", ")}`)}(n,e.platform);if(!n.some(e=>e===i||e.startsWith(`${i}/`)))throw new L("INVALID_ARGS",`Uploaded archive must contain a top-level "${i}" bundle`);for(let e of n){var a=e,o=i;if(a!==o&&!a.startsWith(`${o}/`))throw new L("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await U("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new L("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rc(e){if(e.includes("\0"))throw new L("INVALID_ARGS",`Invalid archive entry: ${e}`);if(n.posix.isAbsolute(e))throw new L("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=n.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new L("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function rd(e,t){return new Promise((r,n)=>{let a,o=!1,s=0,l=i.createWriteStream(t),c=e=>{if(!o){if(o=!0,a&&clearTimeout(a),e)return void ru(l,t).finally(()=>n(e));r()}},d=()=>{a&&clearTimeout(a),a=setTimeout(()=>{let t=new L("COMMAND_FAILED","Artifact transfer timed out due to inactivity",{timeoutMs:6e4});"destroy"in e&&"function"==typeof e.destroy&&e.destroy(t),u.destroy(t),c(t)},6e4)},u=new p({transform(e,t,r){d();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new L("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{c(new L("COMMAND_FAILED","Artifact transfer was interrupted"))}),d(),f(e,u,l).then(()=>c(),e=>c(e))})}async function ru(e,t){if(e.destroy(),!e.closed)try{await u(e,"close")}catch{}await i.promises.rm(t,{force:!0}).catch(()=>{})}async function rp(e){let t,r=e.headers["x-artifact-type"],a=e.headers["x-artifact-filename"];if(!r||!a)throw new L("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new L("INVALID_ARGS",`Invalid x-artifact-type: ${r}. Must be "file" or "app-bundle".`);!function(e){if(void 0===e)return;let t=Number(e);if(Number.isFinite(t)&&t>0x80000000)throw new L("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let o=function(e){let t=e.trim(),r=n.basename(t);if(!r||"."===r||".."===r)throw new L("INVALID_ARGS",`Invalid artifact filename: ${e}`);return r}(a),s=(t=function(e){let t=e?.trim();if(!t)return"request";let r=t.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return r.length>0?r.slice(0,48):"request"}("upload"),i.mkdtempSync(n.join(d.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===r){let t=n.join(s,o);return await rd(e,t),{artifactPath:t,tempDir:s}}let t=n.join(s,"artifact.tar");await rd(e,t);let a=await rs({archivePath:t,tempDir:s,platform:"ios",expectedRootName:o});return i.rmSync(t,{force:!0}),{artifactPath:a,tempDir:s}}catch(e){throw i.rmSync(s,{recursive:!0,force:!0}),e}}let rf=new m;async function rm(e,t){return await rf.run(e,t)}function rh(e){rf.getStore()?.(e)}let rw=new Set(["agent_device.command","agent-device.command"]),rg=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rv=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),ry={"agent_device.lease.allocate":"lease_allocate","agent-device.lease.allocate":"lease_allocate","agent_device.lease.heartbeat":"lease_heartbeat","agent-device.lease.heartbeat":"lease_heartbeat","agent_device.lease.release":"lease_release","agent-device.lease.release":"lease_release"},rS=new Set([...rw,...rg,...rv,...Object.keys(ry)]);function r_(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rI(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function rb(e,t){e.destroyed||(e.write(Q(t)),e.end())}function rA(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rx(e,t){let r="string"==typeof t.authorization?t.authorization:"",n=r.toLowerCase().startsWith("bearer ")?r.slice(7):void 0,i="string"==typeof t["x-agent-device-token"]?t["x-agent-device-token"]:void 0;return("string"==typeof e.token?e.token:void 0)??i??n??""}function rN(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rM(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rD(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new L("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function rE(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new L("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function rk(e,t){if(!e)return{ok:!0};let r=await e(t);if(void 0===r||!0===r)return{ok:!0};if(!1===r){let e=T(new L("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:r_(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=T(new L(R(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:r_(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=H(r.tenantId);if(!e){let e=T(new L("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:r_(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rP(){let e,t=process.env.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let r=process.env.AGENT_DEVICE_HTTP_AUTH_EXPORT||"default",i=n.isAbsolute(t)?t:n.resolve(t);try{e=await import(c(i).href)}catch(e){throw new L("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:i,error:e instanceof Error?e.message:String(e)})}let a=e[r];if("function"!=typeof a)throw new L("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:i,exportName:r});return a}async function rC(e){let t=await rP(),{handleRequest:r,token:n}=e;return s.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!0}));return}if("POST"===e.method&&"/upload"===e.url)return void rR(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void rO(e,i,t,n);if("POST"!==e.method||"/rpc"!==e.url){i.statusCode=404,i.end("Not found");return}let a="";e.setEncoding("utf8"),e.on("data",t=>{(a+=t).length>1048576&&e.destroy(Error("request too large"))}),e.on("error",()=>{i.headersSent||rI(i,r_(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rI(i,r_(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rI(i,r_(n.id??null,-32600,"Invalid Request"),400);if(!rS.has(n.method))return void rI(i,r_(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rI(i,r_(n.id??null,-32602,"Invalid params"),400);try{var s;let a=n.params,l=function(e,t,r){if(rw.has(e))return{token:rx(t,r),session:t.session??"default",command:t.command??"",positionals:Array.isArray(t.positionals)?t.positionals:[],flags:t.flags,runtime:t.runtime,meta:t.meta};if(rg.has(e)){let e,n=rN(t,"platform");if("ios"!==n&&"android"!==n)throw new L("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:rx(t,r),session:rN(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rN(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new L("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new L("INVALID_ARGS","Invalid params: source.url is required for url sources");let r=t.headers,n={};if(void 0!==r){if(!r||"object"!=typeof r||Array.isArray(r))throw new L("INVALID_ARGS","Invalid params: source.headers must be a string map");for(let[e,t]of Object.entries(r)){if("string"!=typeof t)throw new L("INVALID_ARGS","Invalid params: source.headers values must be strings");n[e]=t}}return Object.keys(n).length>0?{kind:"url",url:e,headers:n}:{kind:"url",url:e}}if("path"===t.kind){let e="string"==typeof t.path?t.path.trim():"";if(!e)throw new L("INVALID_ARGS","Invalid params: source.path is required for path sources");return{kind:"path",path:e}}if("github-actions-artifact"===t.kind)return function(e){let t,r=rD(e,"owner"),n=rD(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new L("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new L("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new L("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:rE(e,"artifactId")}:(a&&(t=rE(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rD(e,"artifactName")})}(t);throw new L("INVALID_ARGS",'Invalid params: source.kind must be "url", "path", or "github-actions-artifact"')}(t),retainMaterializedPaths:(e=t.retainPaths,"boolean"==typeof e?e:void 0),materializedPathRetentionMs:rM(t,"retentionMs")}}}if(rv.has(e)){let e=rN(t,"materializationId")?.trim();if(!e)throw new L("INVALID_ARGS","Invalid params: materializationId is required");return{token:rx(t,r),session:rN(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rN(t,"requestId"),materializationId:e}}}let n=ry[e];if(n)return{token:rx(t,r),session:rN(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rN(t,"tenantId")??rN(t,"tenant"),runId:rN(t,"runId"),leaseId:rN(t,"leaseId"),leaseTtlMs:rM(t,"ttlMs"),leaseBackend:rN(t,"backend")}};throw new L("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(s=n.method,rw.has(s)&&("string"!=typeof l.command||0===l.command.length))return void rI(i,r_(n.id??null,-32602,"Invalid params: command is required"),400);o=t2(l.meta?.requestId,n.id),l.meta={...l.meta,requestId:o},t3(o);let c=()=>{i.writableFinished||t4(o)};e.on("aborted",c),i.on("close",c);let d=await rk(t,{headers:e.headers,rpcRequest:n,daemonRequest:l});if(!d.ok)return void rI(i,d.response,d.statusCode);if(d.tenantId&&(l.meta={...l.meta,tenantId:d.tenantId,sessionIsolation:l.meta?.sessionIsolation??l.flags?.sessionIsolation??"tenant"}),K(l)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await rm(e=>{!i.destroyed&&i.write(Y(e))},async()=>await r(l)),t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:r_(n.id??null,-32e3,e.error.message,e.error);rb(i,t);return}let u=await r(l);if(u.ok)return void rI(i,{jsonrpc:"2.0",id:n.id??null,result:u});rI(i,r_(n.id??null,-32e3,u.error.message,u.error),rA(u.error.code))}catch(t){let e=T(t);if(i.headersSent)return void rb(i,r_(n.id??null,-32e3,e.message,e));rI(i,r_(n.id??null,-32e3,e.message,e),rA(e.code))}finally{t5(o)}})})}async function rR(e,r,n,i){try{var a;let o,s,l=await rT({req:e,res:r,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let c=await rp(e),d=(a={artifactPath:c.artifactPath,tempDir:c.tempDir,tenantId:l.tenantId},o=t.randomUUID(),(s=setTimeout(()=>{ro(o)},3e5)).unref(),ri.set(o,{artifactPath:a.artifactPath,tempDir:a.tempDir,tenantId:a.tenantId,timer:s}),o);r.statusCode=200,r.setHeader("content-type","application/json"),r.end(JSON.stringify({ok:!0,uploadId:d}))}catch(e){rL(r,T(e))}}async function rO(e,t,r,n){let a=e.url?.slice("/artifacts/".length)??"";if(!a){t.statusCode=400,t.end("Missing artifact id");return}try{let o=await rT({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[a]}});if(!o)return;let s=function(e,t){let r=rt.get(e);if(!r)throw new L("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new L("UNAUTHORIZED","Artifact belongs to a different tenant");if(!i.existsSync(r.artifactPath))throw rn(e),new L("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(a,o.tenantId),l=i.createReadStream(s.artifactPath);t.statusCode=200,t.setHeader("content-type","application/octet-stream"),s.fileName&&t.setHeader("content-disposition",`attachment; filename="${s.fileName.replace(/"/g,"")}"`),l.on("error",e=>{if(t.headersSent)t.destroy(e);else{let r=T(e);t.statusCode=rA(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rn(a)}),l.pipe(t)}catch(e){rL(t,T(e))}}async function rT(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=rx({},n.headers),c=(t=l,(r=o)&&t!==r?T(new L("UNAUTHORIZED","Invalid token")):null);if(c)return rL(i,c),null;let d=await rk(a,{headers:n.headers,rpcRequest:{jsonrpc:"2.0",id:null,method:"agent_device.command"},daemonRequest:{token:l,session:"default",command:s.command,positionals:s.positionals}});return d.ok?{tenantId:d.tenantId}:(i.statusCode=d.statusCode,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!1,error:d.response.error?.data?.message??d.response.error?.message??"Unauthorized"})),null)}function rL(e,t){e.statusCode=rA(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function r$(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function rF(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function rU(e){let t=(e??"").trim().toLowerCase();if(!t||"ios-simulator"===t)return"ios-simulator";if("ios-instance"===t||"android-instance"===t)return t;throw new L("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class rG{leases=new Map;runBindings=new Map;maxActiveSimulatorLeases;defaultLeaseTtlMs;minLeaseTtlMs;maxLeaseTtlMs;now;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.defaultLeaseTtlMs=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,this.minLeaseTtlMs=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):5e3,this.maxLeaseTtlMs=Number.isInteger(e.maxLeaseTtlMs)?Math.max(this.minLeaseTtlMs,Number(e.maxLeaseTtlMs)):6e5,this.now=e.now??(()=>Date.now())}allocateLease(e){let r=rU(e.backend),n=H(e.tenantId);if(!n)throw new L("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=r$(e.runId);if(!i)throw new L("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");this.cleanupExpiredLeases();let a=this.resolveLeaseTtlMs(e.ttlMs),o=this.bindingKey(n,i,r),s=this.runBindings.get(o);if(s){let e=this.leases.get(s);if(e)return this.refreshLease(e,a);this.runBindings.delete(o)}this.enforceCapacity(r);let l=this.now(),c={leaseId:t.randomBytes(16).toString("hex"),tenantId:n,runId:i,backend:r,createdAt:l,heartbeatAt:l,expiresAt:l+a};return this.leases.set(c.leaseId,c),this.runBindings.set(o,c.leaseId),{...c}}heartbeatLease(e){let t=rF(e.leaseId);if(!t)throw new L("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);if(!r)throw new L("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});this.assertOptionalScopeMatch(r,e.tenantId,e.runId);let n=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(r,n)}releaseLease(e){let t=rF(e.leaseId);if(!t)throw new L("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);return r?(this.assertOptionalScopeMatch(r,e.tenantId,e.runId),this.leases.delete(t),this.runBindings.delete(this.bindingKey(r.tenantId,r.runId,r.backend)),{released:!0}):{released:!1}}assertLeaseAdmission(e){let t=rU(e.backend),r=H(e.tenantId);if(!r)throw new L("INVALID_ARGS","tenant isolation requires tenant id.");let n=r$(e.runId);if(!n)throw new L("INVALID_ARGS","tenant isolation requires run id.");let i=rF(e.leaseId);if(!i)throw new L("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new L("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==r||a.runId!==n)throw new L("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}cleanupExpiredLeases(){let e=this.now();for(let t of this.leases.values())t.expiresAt>e||(this.leases.delete(t.leaseId),this.runBindings.delete(this.bindingKey(t.tenantId,t.runId,t.backend)))}enforceCapacity(e){if("ios-simulator"!==e||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>"ios-simulator"===e.backend).length;if(!(t<this.maxActiveSimulatorLeases))throw new L("COMMAND_FAILED","No simulator lease capacity available",{reason:"LEASE_CAPACITY_EXCEEDED",activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:"Retry after releasing another simulator lease."})}resolveLeaseTtlMs(e){if(!Number.isInteger(e))return this.defaultLeaseTtlMs;let t=Number(e);if(t<this.minLeaseTtlMs||t>this.maxLeaseTtlMs)throw new L("INVALID_ARGS",`Lease ttlMs must be between ${this.minLeaseTtlMs} and ${this.maxLeaseTtlMs}.`);return t}refreshLease(e,t){let r=this.now(),n={...e,heartbeatAt:r,expiresAt:r+t};return this.leases.set(n.leaseId,n),this.runBindings.set(this.bindingKey(n.tenantId,n.runId,n.backend),n.leaseId),{...n}}bindingKey(e,t,r){return`${e}:${t}:${r}`}assertOptionalScopeMatch(e,t,r){let n=H(t),i=r$(r);if(t&&!n)throw new L("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&!i)throw new L("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(n&&e.tenantId!==n||i&&e.runId!==i)throw new L("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}function rq(e){return e}function rV(e){return"apple"===e||"ios"===e||"macos"===e}function rj(e,t){return!t||("apple"===t?rV(e):e===t)}function rB(e){let{simulatorSetPath:t,platform:r,target:n}=e;if(t&&"macos"!==r&&"desktop"!==n)return t}async function rH(e,t,r={}){let n=e,i=e=>e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim();if(t.platform&&(n=n.filter(e=>rj(e.platform,t.platform))),t.target&&(n=n.filter(e=>(e.target??"mobile")===t.target)),t.udid){let e=n.find(e=>e.id===t.udid&&rV(e.platform));if(!e)throw new L("DEVICE_NOT_FOUND",`No Apple device with UDID ${t.udid}`);return e}if(t.serial){let e=n.find(e=>e.id===t.serial&&"android"===e.platform);if(!e)throw new L("DEVICE_NOT_FOUND",`No Android device with serial ${t.serial}`);return e}if(t.deviceName){let e=i(t.deviceName),r=n.find(t=>i(t.name)===e);if(!r)throw new L("DEVICE_NOT_FOUND",`No device named ${t.deviceName}`);return r}let a=n[0];if(void 0!==a&&1===n.length)return a;if(0===n.length){var o;let e=r.simulatorSetPath;if(e&&(!(o=t.platform)||"apple"===o||"ios"===o))throw new L("DEVICE_NOT_FOUND","No devices found in the scoped simulator set",{simulatorSetPath:e,hint:`The simulator set at "${e}" appears to be empty. Create a simulator first:
4
- xcrun simctl --set "${e}" create "iPhone 16" com.apple.CoreSimulator.SimDeviceType.iPhone-16 com.apple.CoreSimulator.SimRuntime.iOS-18-0`,selector:t});throw new L("DEVICE_NOT_FOUND","No devices found",{selector:t})}let s=n.filter(e=>"device"!==e.kind);s.length>0&&(n=s);let l=n.filter(e=>e.booted),c=l[0];if(void 0!==c&&1===l.length)return c;let d=l[0]??n[0];if(void 0===d)throw new L("DEVICE_NOT_FOUND","No devices found",{selector:t});return d}async function rK(e){var t;if("macos"===(t=e).platform||"apple"===t.platform&&"desktop"===t.target){let{listMacosDevices:e}=await import("./devices~2.js");return await e()}if("linux"===e.platform){let{listLinuxDevices:e}=await import("./devices~1.js");return await e()}if("android"===e.platform){let{listAndroidDevices:t}=await import("./8806.js");return await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0})}if(e.platform){let{listAppleDevices:t}=await import("./devices.js");return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}let r=[];try{let{listAndroidDevices:t}=await import("./8806.js");r.push(...await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0}))}catch{}try{let{listAppleDevices:t}=await import("./devices.js");r.push(...await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid}))}catch{}try{let{listLinuxDevices:e}=await import("./devices~1.js");r.push(...await e())}catch{}return r}let rW=new m,rz=new m;async function rJ(e,t,r){var n,i;let a=await rX(e,t,r);if(n=t,i=a,!rZ(n)&&(!n.platform||"apple"===n.platform||"ios"===n.platform)&&"desktop"!==n.target&&(!i||"device"===i.kind)){let{findBootableIosSimulator:e}=await import("./devices.js"),n=await e({simulatorSetPath:r.simulatorSetPath,target:t.target});if(n)return n}if(a)return a;throw new L("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function rX(e,t,r){try{return await rH(e,t,r)}catch(e){var n;if(n=e,!rZ(t)&&n instanceof L&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function rZ(e){return!!(e.udid||e.serial||e.deviceName)}async function rY(e){let t=rq(e.platform),r=rB({simulatorSetPath:et(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=ew(e.androidDeviceAllowlist),i=function(e){let{flags:t,normalizedPlatform:r,iosSimulatorSetPath:n,androidSerialAllowlist:i}=e;return JSON.stringify({platform:r,target:t.target,device:t.device,udid:t.udid,serial:t.serial,iosSimulatorSetPath:n,androidSerialAllowlist:i?Array.from(i).sort():void 0})}({flags:e,normalizedPlatform:t,iosSimulatorSetPath:r,androidSerialAllowlist:n}),a={platform:t,target:e.target,cacheHit:!1};return await x("resolve_target_device",async()=>{let o=function(e){let t=rW.getStore(),r=t?.get(e);if(r)return{...r}}(i);if(o)return a.cacheHit=!0,o;let s={platform:t,target:e.target,deviceName:e.device,udid:e.udid,serial:e.serial};if(s.target&&!s.platform)throw new L("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await r3({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return r4(s)?r5(i,await rJ(l,s,{simulatorSetPath:r})):r5(i,await rH(l,s,{simulatorSetPath:r}));let c=await rK({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return r4(s)?r5(i,await rJ(c,s,{simulatorSetPath:r})):r5(i,await rH(c,s,{simulatorSetPath:r}))},a)}async function rQ(e){return rW.getStore()?await e():await rW.run(new Map,e)}async function r0(e,t){return e?await rz.run(e,t):await t()}async function r1(e,t){return await r0(e,async()=>await rQ(t))}async function r2(e){return await r3(e)??await rK(e)}async function r3(e){let t=rz.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function r4(e){return!!e.platform&&"android"!==e.platform&&"linux"!==e.platform}function r5(e,t){return rW.getStore()?.set(e,{...t}),t}let r8=["platform","target","device","udid","serial"],r6=[...r8,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function r9(e){return"string"==typeof e&&e.trim().length>0}function r7(e,t){return!!e&&t.some(t=>r9(e[t]))}let ne={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},nt=function(e){let t=new Map,r=new Map;for(let n of e){if(t.has(n.command))throw Error(`Duplicate daemon command descriptor: ${n.command}`);if(t.set(n.command,n),"generic"!==n.route){let e=r.get(n.route)??[];e.push(n.command),r.set(n.route,e)}}return{descriptorsByCommand:t,handlerCommandsByRoute:r}}([...ni("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},eS.leaseAllocate,eS.leaseHeartbeat,eS.leaseRelease),nn(eS.sessionList,"session",{sessionKind:"inventory",...ne}),nn(ey.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...ne}),nn(ey.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...ni("session",{sessionKind:"state"},ey.boot,ey.appState),...ni("session",{sessionKind:"observability"},ey.perf,ey.logs,ey.network),...ni("session",{sessionKind:"replay"},ey.replay,ey.test),nn(eS.runtime,"session"),nn(ey.clipboard,"session",{replayScopedAction:!0}),nn(ey.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...ni("session",{},ey.install,ey.reinstall,eS.installSource),nn(eS.releaseMaterializedPaths,"session",ne),...ni("session",{},ey.push,ey.triggerAppEvent),nn(ey.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...ni("session",{},ey.prepare,ey.batch),nn(ey.close,"session",{allowInvalidRecording:!0}),...ni("snapshot",{replayScopedAction:!0},ey.snapshot,ey.diff,ey.wait,ey.alert,ey.settings),nn(ey.reactNative,"reactNative",{replayScopedAction:!0}),nn(ey.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),nn(ey.trace,"recordTrace"),nn(ey.find,"find",{replayScopedAction:!0}),...ni("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},ey.click,ey.fill,ey.longPress,ey.press,ey.type),...ni("interaction",{replayScopedAction:!0},ey.get,ey.is),...ni("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},ey.back,ey.gesture,ey.home,ey.rotate,ey.scroll,ey.swipe,"pinch"),nn(ey.focus,"generic",{androidBlockingDialogGuard:!0}),nn(ey.screenshot,"generic",{replayScopedAction:!0}),...ni("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function nr(e){return na(e)?.sessionKind}function nn(e,t,r={}){return{command:e,route:t,...r}}function ni(e,t,...r){return r.map(r=>nn(r,e,t))}function na(e){return nt.descriptorsByCommand.get(e)}let no=[{resolverKey:"androidAdbProvider",resolve(e,t){let r=e.androidAdbProvider;if(!r||"android"!==t.device.platform)return{};let n=r(t),i="function"==typeof n?n:n?.exec;return{androidAdb:{provider:n,executor:i,serial:t.device.id}}},async appendWrapper(e,t){if(!e.androidAdb?.provider)return;let{withAndroidAdbProvider:r}=await import("./9639.js");nu(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&rV(t.device.platform)?{appleRunner:{provider:r(t),deviceId:t.device.id,requestId:t.req.meta?.requestId}}:{}},async appendWrapper(e,t){if(!e.appleRunner?.provider)return;let{withAppleRunnerProvider:r}=await Promise.resolve(tm);nu(t,e.appleRunner,(t,n)=>r(t,{deviceId:e.appleRunner?.deviceId??"",requestId:e.appleRunner?.requestId},n))}},{resolverKey:"appleToolProvider",resolve(e,t){let r=e.appleToolProvider;return r&&rV(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(tw);nu(t,e.appleTool,r)}},{resolverKey:"linuxToolProvider",resolve(e,t){let r=e.linuxToolProvider;return r&&"linux"===t.device.platform?{linuxTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.linuxTool?.provider)return;let{withLinuxToolProvider:r}=await Promise.resolve(tv);nu(t,e.linuxTool,r)}},{resolverKey:"appLogProvider",resolve(e,t){let r=e.appLogProvider;return r?{appLog:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appLog?.provider)return;let{withAppLogProvider:r}=await Promise.resolve(tu);nu(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");nu(t,e.recording,r)}}];async function ns(e,t){let r=await nl(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await nd(r);return await np(i,async()=>await t(n))}async function nl(e){var t,r,n;if(t=e.providers,!no.some(e=>!!t[e.resolverKey]))return{};let i=await nc(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return no.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function nc(e,t){let r;return t?na(e.command)?.preferExplicitDeviceOverExistingSession===!0&&r7(e.flags,r8)?await rY(e.flags??{}):t.device:r7(e.flags,r8)||"function"==typeof(r=na(e.command)?.allowSessionlessDefaultDevice)&&r(e)?await rY(e.flags??{}):void 0}async function nd(e){let t=[];for(let r of no)await r.appendWrapper(e,t);return t}function nu(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function np(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function nf(e,t){switch(e.platform){case"android":{let{createAndroidInteractor:t}=await import("./android.js");return t(e)}case"linux":{let{createLinuxInteractor:e}=await import("./linux.js");return e()}case"ios":case"macos":{let{createAppleInteractor:r}=await import("./apple.js");return r(e,t)}default:throw new L("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let nm=/^[A-Za-z0-9_.:-]{1,64}$/,nh="--launch-console is supported only for iOS simulator app launches",nw="--launch-console requires a direct app launch and cannot be used with URL opens";function ng(e){return e?.clickButton??"primary"}function nv(e){return"primary"===e.button?null:"click"!==e.commandLabel?new L("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new L("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new L("UNSUPPORTED_OPERATION","click --button middle is not supported by the macOS runner yet"):"number"==typeof e.count||"number"==typeof e.intervalMs||"number"==typeof e.holdMs||"number"==typeof e.jitterPx||!0===e.doubleTap?new L("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function ny(e){return"primary"===e?{}:{button:e}}let nS=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function n_(e){return"ios"===e.platform&&"tv"!==e.target}async function nI(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await eB(t)}async function nb(e,t){let{x:r,y:n}=nk(t,"longpress requires x y [durationMs]",{hint:"Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i -c, use the target rect center as x y, then retry longpress x y durationMs."}),i=t[2]?Number(t[2]):void 0;return await e.longPress(r,n,i),{x:r,y:n,durationMs:i,...eK(`Long pressed (${r}, ${n})`)}}async function nA(e,t){let{x:r,y:n}=nk(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...eK(`Focused (${r}, ${n})`)}}async function nx(e,t,r){let n=eI(t[0]);if(n)throw new L("INVALID_ARGS",`type does not accept a target ref like "${n}"`,{hint:`Use fill ${n} "text" to target that field, or press ${n} then type "text" to append.`});let i=t.join(" ");if(!i)throw new L("INVALID_ARGS","type requires text");let a=eF(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...eK(nZ("Typed",i))}}async function nN(e,t,r){if(r?.directElementSelector)return await nM(e,r.directElementSelector,t,r);let n=Number(t[0]),i=Number(t[1]),a=t.slice(2).join(" ");if(Number.isNaN(n)||Number.isNaN(i)||!a)throw new L("INVALID_ARGS","fill requires x y text");let o=eF(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...eK(nZ("Filled",a))}}async function nM(e,t,r,n){if(!e.fillElementSelector)throw new L("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new L("INVALID_ARGS","fill requires text");let a=eF(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...eK(nZ("Filled",i))}}async function nD(e,t,r,n){var i,a,o,s;if(n?.directElementSelector&&"ios"===e.platform)return await nE(t,n.directElementSelector);let{x:l,y:c}=nk(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await nP(l,c,n);let d=ng(n);if("primary"!==d)return await nC(e,l,c,d,n);let u=(s=n,{count:nO(s?.count,1,"count",1,200),intervalMs:nO(s?.intervalMs,0,"interval-ms",0,1e4),holdMs:nO(s?.holdMs,0,"hold-ms",0,1e4),jitterPx:nO(s?.jitterPx,0,"jitter-px",0,100),doubleTap:!!s?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new L("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new L("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(u),i=u.count,a=u.holdMs,o=u.jitterPx,rV(e.platform)&&i>1&&0===a&&0===o)?await nT(e,l,c,u,n):await nL(t,l,c,u)}async function nE(e,t){if(!e.tapElementSelector)throw new L("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...eK(`Tapped ${t.raw}`)}}function nk(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new L("INVALID_ARGS",t,r);return{x:n,y:i}}async function nP(e,t,r){let n=ng(r);if("primary"!==n)throw new L("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(tp);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...eK(nJ({x:e,y:t}))}}async function nC(e,t,r,n,i){if(function(e,t,r){let n=nv({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 nR(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(tf);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},n$(i)),{x:t,y:r,button:n,...eK(nJ({x:t,y:r,button:n}))}}async function nR(e,t,r){if("secondary"===r){let{rightClickLinux:r}=await import("./input-actions~1.js");await r(e,t)}else{let{middleClickLinux:r}=await import("./input-actions~1.js");await r(e,t)}return{x:e,y:t,button:r,...eK(nJ({x:e,y:t,button:r}))}}function nO(e,t,r,n,i){return eF(void 0===e?t:e,r,n,i)}async function nT(e,t,r,n,i){let{runIosRunnerCommand:a}=await Promise.resolve(tf),o=await a(e,{command:"tapSeries",x:t,y:r,count:n.count,intervalMs:n.intervalMs,doubleTap:n.doubleTap,appBundleId:i?.appBundleId},n$(i));return{x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,timingMode:"runner-series",...o,...eK(nJ({x:t,y:r}))}}async function nL(e,t,r,n){let i;return await nI(n.count,n.intervalMs,async a=>{let[o,s]=function(e,t){if(t<=0)return[0,0];let[r,n]=nS[e%nS.length];return[r*t,n*t]}(a,n.jitterPx),l=t+o,c=r+s;if(n.doubleTap){i??=await e.doubleTap(l,c)??void 0;return}n.holdMs>0?i??=await e.longPress(l,c,n.holdMs)??void 0:i??=await e.tap(l,c)??void 0}),eW({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},nJ({x:t,y:r}))}function n$(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId}}async function nF(e,t,r,n){let i=Number(r[0]),a=Number(r[1]),o=Number(r[2]),s=Number(r[3]);if([i,a,o,s].some(Number.isNaN))throw new L("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await nG({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function nU(e,t,r,n){let i=ej(r[0]),a=r[1]?Number(r[1]):300,o=eU((await t.snapshot({appBundleId:n?.appBundleId,compact:!0})).nodes??[]);if(!o)throw new L("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=eb(i,o,{platform:e.platform});return await nG({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function nG(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:c}=e,d=eF(l,"durationMs",16,1e4),u=eF(n?.count??1,"count",1,200),p=eF(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if("one-way"!==f&&"ping-pong"!==f)throw new L("INVALID_ARGS",`Invalid pattern: ${f}`);if(rV(t.platform)&&u>1){let{runIosRunnerCommand:e}=await Promise.resolve(tf),r=await e(t,{command:"dragSeries",x:i,y:a,x2:o,y2:s,durationMs:d,count:u,pauseMs:p,pattern:f,...n_(t)?{synthesized:!0}:{},appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId});return{x1:i,y1:a,x2:o,y2:s,...c?{preset:c}:{},durationMs:d,effectiveDurationMs:d,timingMode:"runner-series",count:u,pauseMs:p,pattern:f,...r,...eK(nX(u,f))}}return await nI(u,p,async e=>{"ping-pong"===f&&e%2==1?await r.swipe(o,s,i,a,d):await r.swipe(i,a,o,s,d)}),eW({x1:i,y1:a,x2:o,y2:s,...c?{preset:c}:{},durationMs:d,effectiveDurationMs:d,timingMode:"direct",count:u,pauseMs:p,pattern:f},c?`Swiped ${c}`:nX(u,f))}async function nq(e,t){let r=Number(t[0]),n=Number(t[1]),i=Number(t[2]),a=Number(t[3]);if([r,n,i,a].some(e=>!Number.isFinite(e)))throw new L("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=eF(t[4]?Number(t[4]):500,"durationMs",16,1e4),s=r+i,l=n+a,c=await e.pan(r,n,s,l,o);return{x:r,y:n,dx:i,dy:a,x2:s,y2:l,durationMs:o,...c??{},...eK(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function nV(e,t){let r=function(e,t){if("up"===e||"down"===e||"left"===e||"right"===e)return e;throw new L("INVALID_ARGS",`${t} must be up, down, left, or right`)}(t[0],"fling direction"),n=Number(t[1]),i=Number(t[2]);if(![n,i].every(Number.isFinite))throw new L("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new L("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=eF(t[4]?Number(t[4]):50,"durationMs",16,1e3),{x2:s,y2:l}=function(e,t,r,n){switch(r){case"up":return{x2:e,y2:t-n};case"down":return{x2:e,y2:t+n};case"left":return{x2:e-n,y2:t};case"right":return{x2:e+n,y2:t}}}(n,i,r,a);return await e.fling(n,i,s,l,o),{direction:r,x:n,y:i,x2:s,y2:l,distance:a,durationMs:o,...eK(`Flung ${r}`)}}async function nj(e,t,r){var n;let i=t[0],a=t[1]?Number(t[1]):void 0,o=r?.pixels;if(!i)throw new L("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new L("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==o)throw new L("INVALID_ARGS","scroll accepts either a relative amount or --pixels, not both");let s="bottom"===(n=i)?{direction:"down",edge:"bottom"}:"top"===n?{direction:"up",edge:"top"}:{direction:ex(n)},l={},c=0;if(s.edge){let t=s.edge,n=await e$({edge:t,captureState:async n=>await nB(e,r,t,n),scroll:async()=>await e.scroll(s.direction,{amount:a,pixels:o})});l=n.result??{},c=n.passes}else l=await e.scroll(s.direction,{amount:a,pixels:o}),c=1;return eW({direction:s.direction,...s.edge?{edge:s.edge,passes:c}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},eE(s.direction,s.edge,c,a,o))}async function nB(e,t,r,n){if("function"!=typeof e.snapshot)throw new L("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await eC({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,compact:!0,scope:e})).nodes??[]})}async function nH(e,t,r,n){if("tv"===e.target)throw new L("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new L("UNSUPPORTED_OPERATION","gesture pinch is only supported in macOS app sessions. Re-open the target app without --surface desktop|menubar|frontmost-app first.");let i=Number(r[0]),a=r[1]?Number(r[1]):void 0,o=r[2]?Number(r[2]):void 0;if(Number.isNaN(i)||i<=0)throw new L("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...eK(`Pinched to scale ${i}`)}}async function nK(e,t,r){if("tv"===e.target)throw new L("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new L("UNSUPPORTED_OPERATION","gesture rotate is not supported on macOS; XCTest rotation gestures are available only for iOS app sessions.");let{degrees:n,x:i,y:a,velocity:o}=function(e){let t=Number(e[0]);if(!Number.isFinite(t))throw new L("INVALID_ARGS","gesture rotate requires degrees [x] [y] [velocity]");let r=function(e,t){if(void 0===e&&void 0===t)return{};if(void 0===e||void 0===t)throw new L("INVALID_ARGS","gesture rotate center requires both x and y");let r=Number(e),n=Number(t);if(!Number.isFinite(r)||!Number.isFinite(n))throw new L("INVALID_ARGS","gesture rotate center requires finite x and y");return{x:r,y:n}}(e[1],e[2]),n=Number(e[3]??(t>=0?1:-1));if(!Number.isFinite(n)||0===n)throw new L("INVALID_ARGS","gesture rotate velocity must be a non-zero number");return{degrees:t,...r,velocity:Math.abs(n)*(t>=0?1:-1)}}(r),s=await t.rotateGesture(n,i,a,o);return{degrees:n,...void 0!==i&&void 0!==a?{x:i,y:a}:{},velocity:o,...s,...eK(`Rotated gesture ${n} degrees`)}}async function nW(e,t,r){if("tv"===e.target)throw new L("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new L("UNSUPPORTED_OPERATION","gesture transform is currently supported on Android and iOS simulators");let i=function(e){let t=Number(e[0]),r=Number(e[1]),n=Number(e[2]),i=Number(e[3]),a=Number(e[4]),o=Number(e[5]);if(![t,r,n,i,a,o].every(Number.isFinite))throw new L("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new L("INVALID_ARGS","gesture transform scale must be > 0");return{x:t,y:r,dx:n,dy:i,scale:a,degrees:o,durationMs:void 0===e[6]?void 0:eF(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...eK(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function nz(e,t,r){let{x:n,y:i}=nk(t,"read requires x y");if("android"===e.platform){let{readAndroidTextAtPoint:t}=await import("./input-actions.js");return{action:"read",text:await t(e,n,i)??""}}if("linux"===e.platform){let{readLinuxTextAtPoint:e}=await Promise.resolve(tg);return{action:"read",text:await e(n,i,r?.surface)}}if("macos"===e.platform&&r?.surface&&"app"!==r.surface){let{runMacOsReadTextAction:e}=await Promise.resolve(tp);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(tf),o=await a(e,{command:"readText",x:n,y:i,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function nJ(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function nX(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function nZ(e,t){return`${e} ${Array.from(t).length} chars`}function nY(e,t){let r,n=t?.subject??"Payload",a=e.trim();if(!a)throw new L("INVALID_ARGS",`${n} cannot be empty`);let o=t?.expandPath?t.expandPath(a,t.cwd):a;try{if(!i.statSync(o).isFile())throw new L("INVALID_ARGS",`${n} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof L)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new L("INVALID_ARGS",`${n} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new L("COMMAND_FAILED",`Unable to read ${n} file: ${o}`,{cause:String(t)})}if((r=a.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:a};throw new L("INVALID_ARGS",`${n} file not found: ${o}`)}async function nQ(e){let t=nY(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await n0(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new L("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof L)throw t;throw new L("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function n0(e){try{return await o.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new L("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new L("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new L("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new L("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function n1(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},o=await nf(e,a);return N({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await x("platform_command",async()=>await n2(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function n2(e,t,r,n,i,a,o){switch(r){case"open":return await n3(e,t,n,a);case"close":{let e=n[0];if(!e)return{closed:"session",...eK("Closed session")};return await t.close(e),{app:e,...eK(`Closed: ${e}`)}}case"press":return await nD(e,t,n,a);case"swipe":return await nF(e,t,n,a);case"swipe-preset":return await nU(e,t,n,a);case"pan":return await nq(t,n);case"fling":return await nV(t,n);case"longpress":return await nb(t,n);case"focus":return await nA(t,n);case"type":return await nx(t,n,a);case"fill":return await nN(t,n,a);case"scroll":return await nj(t,n,a);case"pinch":return await nH(e,t,n,a);case"rotate-gesture":return await nK(e,t,n);case"transform-gesture":return await nW(e,t,n);case"trigger-app-event":return await n4(e,t,n,a);case"screenshot":return await n5(t,n,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...eK("Back")};case"home":return await t.home(),{action:"home",...eK("Home")};case"rotate":{let e=ez(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...eK(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...eK("Opened app switcher")};case"clipboard":return await n8(t,n);case"keyboard":return await n6(e,n,a,o);case"settings":return await ie(e,t,n,a);case"push":return await it(e,n,a);case"snapshot":return await ir(t,a);case"read":return await nz(e,n,a);default:throw new L("INVALID_ARGS",`Unknown command: ${r}`)}}async function n3(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new L("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new L("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new L("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...eK("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new L("UNSUPPORTED_OPERATION",nh);if("linux"===e.platform&&s&&s.length>0)throw new L("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(eg(i))throw new L("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!eg(a))throw new L("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new L("INVALID_ARGS",nw);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...eK(`Opened: ${i}`)}}if(o&&eg(i))throw new L("INVALID_ARGS",nw);if(n?.clearAppState){if(eg(i))throw new L("INVALID_ARGS","Clearing app state requires an app target, not a deep link.");await t.setSetting("clear-app-state","clear",i)}return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchConsole:o,launchArgs:s}),{app:i,...o?{launchConsole:o}:{},...eK(`Opened: ${i}`)}}async function n4(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new L("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!nm.test(t))throw new L("INVALID_ARGS",`Invalid trigger-app-event event name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});if(e.length>2)throw new L("INVALID_ARGS","trigger-app-event accepts at most two arguments: <event> [payloadJson]");let n=function(e,t){if(e)try{let r=JSON.parse(e);if(!r||"object"!=typeof r||Array.isArray(r))throw new L("INVALID_ARGS",`trigger-app-event payload for "${t}" must be a JSON object`);let n=JSON.stringify(r);if(Buffer.byteLength(n,"utf8")>8192)throw new L("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof L)throw t;throw new L("INVALID_ARGS",`Invalid trigger-app-event payload JSON: ${e}`)}}(r,t);return{eventName:t,payload:n}}(r),o=function(e,t,r){var n;let i,a=(i=("ios"===(n=e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:"macos"===n?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE,i?.trim()||void 0);if(!a)throw new L("UNSUPPORTED_OPERATION",`No app event URL template configured for ${e}.`,{hint:`Set AGENT_DEVICE_${e.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):"",s=a.replaceAll("{event}",encodeURIComponent(t)).replaceAll("{payload}",encodeURIComponent(o)).replaceAll("{platform}",encodeURIComponent(e));if(s.length>4096)throw new L("INVALID_ARGS","trigger-app-event URL exceeds maximum supported length",{hint:"Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.",length:s.length,maxLength:4096});return s}(e.platform,i,a);return await t.open(o,{appBundleId:n?.appBundleId}),{event:i,eventUrl:o,transport:"deep-link",...eK(`Triggered app event: ${i}`)}}async function n5(e,t,r,i){let a=t[0]??r??`./screenshot-${Date.now()}.png`;await o.mkdir(n.dirname(a),{recursive:!0});let s=y(i);return await e.screenshot(a,{appBundleId:i?.appBundleId,fullscreen:s.fullscreen,stabilize:s.stabilize,surface:i?.surface}),{path:a,...eK(`Saved screenshot: ${a}`)}}async function n8(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new L("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new L("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new L("INVALID_ARGS",'clipboard write requires text (use "" to clear clipboard)');let n=t.slice(1).join(" ");return await e.writeClipboard(n),{action:r,textLength:Array.from(n).length,...eK("Clipboard updated")}}async function n6(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!eN(i))throw new L("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new L("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await n9(e,i);if("ios"===e.platform)return await n7(e,i,r,n);throw new L("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function n9(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...eK("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./8133.js"),r=await t(e);return{platform:"android",action:"dismiss",attempts:r.attempts,wasVisible:r.wasVisible,dismissed:r.dismissed,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}let{getAndroidKeyboardState:r}=await import("./8133.js"),n=await r(e);return{platform:"android",action:"status",visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function n7(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new L("UNSUPPORTED_OPERATION","keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS");if("enter"===t||"return"===t){let{runIosRunnerCommand:t}=await Promise.resolve(tf),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...eK("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(tf),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...eK(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function ie(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new L("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new L("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");N({level:"debug",phase:"settings_apply",data:{setting:i,state:"clear",appBundleId:r,platform:e.platform}});let s=await t.setSetting(i,"clear",r);return s&&"object"==typeof s?eW({setting:i,state:"clear",...s},ii(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...eK(`Cleared user data for ${r}`)}}if(!a)throw new L("INVALID_ARGS","settings requires setting state");let l="location"===i&&"set"===a,c=("permission"===i||l?r[4]:r[2])??n?.appBundleId,d="permission"===i?{permissionTarget:o,permissionMode:s}:l?{latitude:eH(o,"latitude"),longitude:eH(s,"longitude")}:void 0;N({level:"debug",phase:"settings_apply",data:l?{setting:i,state:a,latitude:o,longitude:s,platform:e.platform}:"permission"===i?{setting:i,state:a,permissionTarget:o,permissionMode:s,platform:e.platform}:{setting:i,state:a,appBundleId:c,platform:e.platform}});let u=await t.setSetting(i,a,c,d);return u&&"object"==typeof u?eW({setting:i,state:a,...u},ii(u)??`Updated setting: ${i}`):{setting:i,state:a,...eK(`Updated setting: ${i}`)}}async function it(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new L("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await nQ(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...eK(`Pushed notification to ${n}`)}}let{pushAndroidNotification:o}=await import("./notifications.js"),s=await o(e,n,a);return{platform:"android",package:n,action:s.action,extrasCount:s.extrasCount,...eK(`Pushed notification to ${n}`)}}async function ir(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,compact:t?.snapshotCompact,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,surface:t?.surface})}function ii(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let ia=e=>"macos"!==e.platform,io=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,is=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,il={device:!0},ic={},id={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:il},iu={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic,supports:ia},ip={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic,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:ic,supports:e=>"android"===e.platform||io(e),unsupportedHint:is},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic,supports:e=>"android"===e.platform||io(e),unsupportedHint:is},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic,supports:e=>"android"===e.platform||io(e),unsupportedHint:is},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic,supports:ia},open:id,close:id,reinstall:iu,install:iu,"install-from-source":iu,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:il},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic,supports:ia},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:il},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:il,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:ic,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:il},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic},snapshot:id,diff:id,screenshot:id,wait:id,get:id,find:id,is:id,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:il},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:il,supports:ia},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:il},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:il},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:il},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic,supports:ia},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic,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:il},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:il},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ic,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:ic},type:id};function im(e,t){let r=ip[e];if(!r)return!0;let n=rV(t.platform)?r.apple:"linux"===t.platform?r.linux:r.android;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}function ih(e,t=e=>e){let r=new m;return{resolve:n=>n?t(n):r.getStore()??e,run:async(e,n)=>e?await r.run(t(e),n):await n(),hasScope:()=>!!r.getStore()}}function iw(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function ig(e,t){return{openBundle:async(t,r)=>{var n,i;let a;await e("open",(n=t,i=r,a=["-b",n],i&&a.push(i),a))},openTarget:async t=>{await e("open",[t])},readClipboard:async()=>{let t=await e("pbpaste",[],{allowFailure:!0});if(0!==t.exitCode)throw new L("COMMAND_FAILED","Failed to read macOS clipboard",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});return t.stdout.replace(/\r\n/g,"\n").replace(/\n$/,"")},writeClipboard:async t=>{let r=await e("pbcopy",[],{allowFailure:!0,stdin:t});if(0!==r.exitCode)throw new L("COMMAND_FAILED","Failed to write macOS clipboard",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode})},readDarkMode:async()=>{let t=await e("osascript",["-e",'tell application "System Events" to tell appearance preferences to get dark mode'],{allowFailure:!0});if(0!==t.exitCode)throw new L("COMMAND_FAILED","Failed to read macOS appearance",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let r=t.stdout.trim().toLowerCase();if("true"===r)return!0;if("false"===r)return!1;throw new L("COMMAND_FAILED",`Unable to determine current macOS appearance from osascript output: ${t.stdout.trim()}`)},setDarkMode:async t=>{let r=`tell application "System Events" to tell appearance preferences to set dark mode to ${t?"true":"false"}`,n=await e("osascript",["-e",r],{allowFailure:!0});if(0!==n.exitCode)throw new L("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await iv(e,t,r)}}async function iv(e,t,r){let i=["/Applications","/System/Applications",n.join(d.homedir(),"Applications")],a=new Set;for(let t of i){let r=await o.stat(t).catch(()=>null);if(!r?.isDirectory())continue;let n=await e("find",[t,"-maxdepth","4","-type","d","-name","*.app"],{allowFailure:!0});if(0===n.exitCode)for(let e of n.stdout.split("\n")){let t=e.trim();t&&a.add(t)}}return iw((await Promise.all(Array.from(a).map(async e=>{let r=await iy(e,t).catch(()=>({})),i=r.bundleId;return i?{bundleId:i,name:r.appName??n.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function iy(e,t){for(let r of[n.join(e,"Contents","Info.plist"),n.join(e,"Info.plist")]){let e=await t(r),n=iS(e,"CFBundleIdentifier"),i=iS(e,"CFBundleDisplayName"),a=iS(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function iS(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let i_={runCommand:U,simctl:{run:async(e,t)=>await U("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await U("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await ik(U,e)},macosHost:ig(U,async e=>await ik(U,e)),whichCommand:V},iI=ih(i_,function(e){return"function"==typeof e?ib({runCommand:e}):ib(e)});function ib(e={}){let t={...i_,...e},r=e.plist??{readJson:async e=>await ik(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??ig(t.runCommand,async e=>await r.readJson(e))}}function iA(e){return iI.resolve(e)}async function ix(e,t){return await iI.run(e,t)}function iN(){return iI.hasScope()}async function iM(e,t,r){return await iA().runCommand(e,t,r)}async function iD(e,t){let r=iA(),[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 iM("xcrun",e,t)}async function iE(e){return await iA().plist?.readJson(e)??null}async function ik(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 iP="agent-device-macos-helper",iC="AGENT_DEVICE_MACOS_HELPER_BIN",iR=n.join(d.homedir(),".agent-device","macos-helper","current"),iO=n.join(iR,"manifest.json"),iT=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function iL(e){let t=e.trim();if(!iT.test(t))throw new L("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function i$(e,t){t.bundleId&&e.push("--bundle-id",iL(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iF(){return function(e){let t=n.dirname(e);for(;;){let e=n.join(t,"macos-helper");if(a(n.join(e,"Package.swift")))return e;let r=n.dirname(t);if(r===t)break;t=r}throw new L("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(l(import.meta.url))}async function iU(e){let t=await o.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=n.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await iU(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function iG(e){let t=await iU(e),i=r("sha256");for(let r of t)i.update(n.relative(e,r)),i.update("\0"),i.update(await o.readFile(r)),i.update("\0");let a=await iM("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return i.update("swift-version"),i.update("\0"),i.update(a.stdout||a.stderr||`exit:${a.exitCode}`),i.update("\0"),i.digest("hex")}async function iq(){try{let e=JSON.parse(await o.readFile(iO,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function iV(){let e=await q(process.env[iC],iC);if(e)return e;let t=iF(),r=await iG(t),i=n.join(iR,iP);try{if(await iq()===r)return await o.access(i),i}catch{}let a=n.join(iF(),".build","release",iP);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await iM("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await o.mkdir(iR,{recursive:!0});let s=`${i}.tmp`;return await o.copyFile(a,s),await o.rename(s,i),await o.chmod(i,493),await o.writeFile(iO,`${JSON.stringify({fingerprint:r},null,2)}
5
- `,"utf8"),i}async function ij(){let e=process.env[iC]?.trim();if(e){let t=await q(e,iC);if(t)return t}if(iN())return iP;if("darwin"!==process.platform)throw new L("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await iV()}async function iB(e){let t={allowFailure:!0,timeoutMs:3e4},r=iA().macosHelper,n=r?iP:await ij(),i=r?await r.run(e,t):await iM(n,e,t),a=i.stdout.trim(),o=null;if(a)try{o=JSON.parse(a)}catch{o=null}if(0===i.exitCode&&o?.ok)return o.data;throw new L("COMMAND_FAILED",o&&!o.ok?o.error?.message??`macOS helper exited with code ${i.exitCode}`:a||i.stderr.trim()||`macOS helper exited with code ${i.exitCode}`,{helperPath:n,args:e,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,...o&&!o.ok?o.error?.details:{}})}async function iH(){return await iB(["app","frontmost"])}async function iK(e){return await iB(["app","quit","--bundle-id",iL(e)])}async function iW(e,t){return await iB(["permission",e,t])}async function iz(e,t={}){let r=["alert",e];return i$(r,t),await iB(r)}async function iJ(e,t={}){let r=["snapshot","--surface",e];return i$(r,t),await iB(r)}async function iX(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return i$(n,r),await iB(n)}async function iZ(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return i$(n,r),await iB(n)}async function iY(e,t={}){let r=["screenshot","--out",e];return i$(r,t),t.fullscreen&&r.push("--fullscreen"),await iB(r)}let iQ={"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"},i0={runCommand:U,whichCommand:V,desktop:i5(U,V),clipboard:i8(U,V),screenshot:i6(U,V)},i1=ih(i0,function(e={}){let t={...i0,...e};return{...t,desktop:e.desktop??i5(t.runCommand,t.whichCommand),clipboard:e.clipboard??i8(t.runCommand,t.whichCommand),screenshot:e.screenshot??i6(t.runCommand,t.whichCommand)}});function i2(e){return i1.resolve(e)}async function i3(e,t){return await i1.run(e,t)}async function i4(e,t,r){return await i2().runCommand(e,t,r)}function i5(e,t){return{async openTarget(r){if(r.includes("://")||r.startsWith("/"))return void await e("xdg-open",[r]);if(await t(r)){e(r,[],{allowFailure:!0}).catch(e=>{N({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await eB(500);return}await e("xdg-open",[r],{allowFailure:!0})},async closeApp(r){await t("wmctrl")?await e("wmctrl",["-c",r],{allowFailure:!0}):await e("pkill",["-x",r],{allowFailure:!0})}}}function i8(e,t){return{async readText(){let r=ae[await an(t,i9)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=at[await an(t,i9)](r);await e(n.cmd,n.args,n.options)}}}function i6(e,t){return{async capture(r){let n=ar[await an(t,i7)](r);await e(n.cmd,n.args,n.options)}}}let i9={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."},i7={wayland:[{tool:"grim",command:"grim"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],x11:[{tool:"scrot",command:"scrot"},{tool:"import",command:"import"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],waylandError:"grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.",x11Error:"scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager."},ae={"wl-clipboard":{cmd:"wl-paste",args:["--no-newline"],options:{allowFailure:!0,timeoutMs:5e3}},xclip:{cmd:"xclip",args:["-selection","clipboard","-o"],options:{allowFailure:!0,timeoutMs:5e3}},xsel:{cmd:"xsel",args:["--clipboard","--output"],options:{allowFailure:!0,timeoutMs:5e3}}},at={"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 an(e,t){let r=process.env.WAYLAND_DISPLAY||"wayland"===process.env.XDG_SESSION_TYPE?"wayland":"x11";for(let n of t[r])if(await e(n.command))return n.tool;throw new L("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let ai="atspi-dump.py",aa=null;async function ao(e,t={}){let r,a=i2().accessibility;if(a)return await a.captureTree(e,t);if("linux"!==process.platform)throw new L("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await i2().whichCommand("python3"))throw new L("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let o=t.maxNodes??1500,s=t.maxDepth??12,c=t.maxApps??24,d=[function(){if(aa)return aa;let e=n.dirname(l(import.meta.url));for(let t=0;t<5;t++){let r=n.join(e,"src","platforms","linux",ai);if(i.existsSync(r))return aa=r,r;if(0===t){let t=n.join(e,ai);if(i.existsSync(t))return aa=t,t}e=n.dirname(e)}throw new L("TOOL_MISSING",`Cannot find ${ai}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(c)],u=await i4("python3",d,{allowFailure:!0,timeoutMs:3e4});if(0!==u.exitCode){let e=u.stderr.trim();if(e.includes("No module named")||e.includes("gi.require_version"))throw new L("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new L("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new L("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new L("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=iQ[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 as(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&N({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await ao(t);return{nodes:r.nodes,truncated:r.truncated}}async function al(e,t,r){let{nodes:n}=await as(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:ac(e.rect)-ac(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 ac(e){return(e?.width??0)*(e?.height??0)}let ad=[250,400,600];function au(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?ah(n?.nodes??[]):void 0,routeComparable:i}}function ap(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 af(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function am(e){return"press"===e||"click"===e||"back"===e||"open"===e}function ah(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??b().requestId,appBundleId:r,activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotCompact:t?.snapshotCompact,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...S(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:ng(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function ag(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!aA(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=a_(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:aS(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function av(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function ay(e){let{session:t,pending:r,snapshot:n}=e,i=aI(r.preSignature,a_(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await n1(t.device,r.command,r.positionals,r.flags?.out,{...aw(e.logPath,r.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),N({level:"info",phase:"interaction_no_change_retry",data:{action:r.action,attemptsRemaining:r.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function aS(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function a_(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 aI(e,t){return 0===e.length||0===t.length?"ambiguous":ab(e,t)?"unchanged":"changed"}function ab(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 aA(e){return"ios"===e.device.platform||"android"===e.device.platform}function ax(e,t,r=[],n){var i,a,o;aD(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 aN(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function aM(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!aD(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=a_(e.readSnapshot(o).nodes);for(;Date.now()-i<1500;){await eB(200),a+=1;let l=await r(),c=a_(e.readSnapshot(l).nodes);if(ab(s,c))return aN(t),N({level:a>2?"info":"debug",phase:"post_gesture_snapshot_stabilized",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),l;o=l,s=c}return aN(t),N({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function aD(e){return"ios"===e||"android"===e}function aE(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let ak=["x","y","width","height"],aP=new WeakMap;function aC(e,t){if(!e[t])return[];let r=aT(e)[t]??t+1;return e.slice(t+1,r)}function aR(e,t,r){let n=aT(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function aO(e,t,r){let n=aT(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function aT(e){let t=aP.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 aP.set(e,r),r}function aL(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 a$(e,t){let r=eX(e.type??""),n=e.label?.trim();return!!(aF(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function aF(e){return"button"===eX(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function aU(e){let t=eX(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function aG(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function aq(e,t){return!!e&&!!t&&ak.every(r=>.5>=Math.abs(e[r]-t[r]))}function aV(e){let t;for(let i of e){var r,n;let e=eX(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||aj(r)>aj(n)))&&(t=i.rect)}return t}function aj(e){return e?e.width*e.height:0}function aB(e){let t=eX(e.type??"");return"scrollview"===t||"scrollarea"===t}function aH(e,t){return!0===e||!!t||void 0}function aK(e,t,r,n){aO(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=eX(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function aW(e,t,r,n){aO(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=eX((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function az(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===eX(n.type??"")&&t(n,i,r)}}function aJ(e,t,r,n){for(let i of e)(a$(i,t)||n&&aZ(i,n))&&r.add(i.index)}function aX(e,t,r){if("button"!==eX(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&aq(e.rect,t.rect)}function aZ(e,t){return"button"===eX(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&aq(e.rect,t.rect)}let aY=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=aV(e),n=r?r.y+r.height:null;if(null!==n)for(let r=0;r<e.length;r+=1){var i,a;let o=e[r];o&&(i=o,a=n,i.rect&&"keyboard"===eX(i.type??"")&&i.rect.y>=a)&&(t.add(o.index),function(e,t,r,n){let i=new Map(t.map(e=>[e.index,e])),a="number"==typeof e.parentIndex?i.get(e.parentIndex):void 0;for(;a?.rect&&a.rect.y>=n;)r.add(a.index),a="number"==typeof a.parentIndex?i.get(a.parentIndex):void 0}(o,e,t,n),aO(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==eX(r.type??"")||!0===r.hittable||r.label?.trim()||r.value?.trim())&&r.identifier?.trim()&&t.add(r.index)}(e,o);let s=new Map(e.map(e=>[e.index,e]));for(let r of e)(function(e){let t=e.label?.trim();return!!(t&&eM(t))})(r)&&function(e,t,r){var n,i,a,o;aU(e.type)||r.suppressedIndexes.add(e.index);let s=eP(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&aU(e.type)?e:null)??aL(e,t,e=>aU(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,aG(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:aH(i.hiddenContentAbove,o.above),hiddenContentBelow:aH(i.hiddenContentBelow,o.below)}))}(r,s,t);(function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r];if(!n||"searchfield"!==eX(n.type??""))continue;if("Search"===n.label){aW(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=aR(e,r,e=>"searchfield"===eX(e.type??"")&&"Search"===e.label);i&&(t.add(n.index),function(e,t,r){let n=new Map(t.map(e=>[e.index,e])),i=e;for(;"number"==typeof i.parentIndex;){let e=n.get(i.parentIndex);if(!e||"Toolbar"!==e.label)return;r.add(e.index),i=e}}(n,e,t),aW(e,r,i.index,t))}})(e,o),r=e,n=o,az(r,(e,t,i)=>{aR(r,i,r=>{let n;return("button"===(n=eX(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(aq(r.rect,e.rect)||function(e,t){var r,n,i,a,o;let s;if(t.label?.trim()!==e.label?.trim())return!1;let l=eX(t.type??"");return r=e,n=l,s=r.label?.trim(),"button"===n&&("Dismiss"===s||"Back"===s)||"textfield"===l||(i=e,a=l,o=t,"button"===a&&!!i.rect&&!!o.rect&&0===i.rect.x&&0===i.rect.y&&i.rect.width>=300&&i.rect.height>=600&&o.rect.width<i.rect.width)}(e,r))})&&n.add(e.index)}),i=e,a=o,az(i,(e,t,r)=>{let n;eO(e)&&eD(e,(n=[],aO(i,r,e=>{n.push(e)}),n))&&a.add(e.index)}),function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();!(!n||t.has(n.index))&&i&&function(e,t,r,n,i){let a=eX(r.type??"");if("statictext"===a||"link"===a)return aK(e,t,n,i);if("other"===a){if(function(e,t,r){return!!aR(e,t,e=>{let t=eX(e.type??"");return("link"===t||"searchfield"===t||aU(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);aK(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=aV(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==eX(e.type??"")||!1===e.enabled||!e.rect||!function(e){let t=e?.trim();return!(!t||/^(toolbar|window|application)$/i.test(t)||t.startsWith("!,")||/debugger|fast refresh/i.test(t))}(e.label)||!aL(e,t,aB)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=aj(e),i=aj(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&aG(t.replacements,i,{type:"Cell"})},function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n?.rect&&i&&function(e,t,r,n,i){let a=eX(r.type??"");if("button"===a)return aJ(aC(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=aC(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==eX(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r})(e,t,r));if(!i)return!1;let a=e.find(e=>aX(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&aG(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&&(aX(a,t,r)||aZ(a,t)||function(e,t){if("switch"!==eX(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||a$(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=>aX(e,t,r));if(!i){e.some(aF)&&aJ(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&aG(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),aJ(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function aQ(e){let t=await a0(e);if(t)return t;let r=await a3(e);return af(e.session),{snapshot:ot(r,a7(e)),analysis:r.analysis,androidSnapshot:r.androidSnapshot}}async function a0(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!aA(e)||Date.now()-t.markedAt>3e4?void av(e):t}(e.session);if(t&&e.session)return await a1({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await a8({...e,session:e.session});let r=ap(e.session);if(r&&"android"===e.device.platform)return await a4(e,r)}async function a1(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await a2(e,t,await a6(e)),l=await ay({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await a2(e,t,await a6(e)),l=await ay({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(av(i),s=await aM({session:i,initial:s,capture:async()=>await a6(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.freshness?.staleAfterRetries!==!0&&af(i),"unchanged"===l.change)?N({level:"warn",phase:"interaction_settle_timeout",data:{action:(r={pending:t,attempts:o,startedAt:a}).pending.action,attempts:r.attempts,durationMs:Date.now()-r.startedAt}}):N({level:(n={pending:t,change:l.change,attempts:o,startedAt:a}).attempts>0?"info":"debug",phase:"interaction_settled",data:{action:n.pending.action,change:n.change,attempts:n.attempts,durationMs:Date.now()-n.startedAt}}),{snapshot:s.snapshot,analysis:s.data.analysis,androidSnapshot:s.data.androidSnapshot,freshness:s.freshness}}async function a2(e,t,r){let n=r;return"unchanged"!==aI(t.preSignature,a_(n.snapshot.nodes))?n:(await eB(500),n=await a6(e))}async function a3(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await as(r?.surface);return or({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?or(await iJ(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await n1(t,"snapshot",[],i,{...aw(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath)})}async function a4(e,t){let r=await a5(e,t);return{snapshot:r.snapshot,analysis:r.data.analysis,androidSnapshot:r.data.androidSnapshot,freshness:r.freshness}}async function a5(e,t){let r=await a9(e),n=oe(r,t,e),i=0,a=t.markedAt+1500;for(let o of ad){if(!n)break;let s=a-Date.now();if(s<=0)break;await eB(Math.min(o,s)),r=await a9(e),i+=1,n=oe(r,t,e)}return n||af(e.session),{...r,freshness:i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0}}async function a8(e){let t=await aM({session:e.session,capture:async()=>await a6(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,analysis:t.data.analysis,androidSnapshot:t.data.androidSnapshot,freshness:t.freshness}}async function a6(e){let t=ap(e.session);return t&&"android"===e.device.platform?await a5(e,t):await a9(e)}async function a9(e){let t=await a3(e);return{data:t,snapshot:ot(t,a7(e))}}function a7(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function oe(e,t,r){var n,i;let a=r.flags?.snapshotInteractiveOnly===!0,o=e.data.analysis;if(a&&0===e.snapshot.nodes.length&&o&&o.rawNodeCount>=12)return"empty-interactive";if("ref-refresh"===r.androidFreshnessMode)return null;return(n=t.baselineCount,i=e.snapshot.nodes.length,!(n<12)&&i<=Math.floor(.2*n))?e.snapshot.nodes.some(e=>!0===e.hittable||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())?null:"sharp-drop":t.routeComparable&&am(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=ah(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 ot(e,t){var r,n,i,a;let o=e?.nodes??[],s=eR(t?.snapshotRaw?o:eZ(o)),l=t?.snapshotScope&&e?.backend!=="macos-helper"?on(s,t.snapshotScope):s;return{nodes:e5((r=e?.backend,n=t,"xctest"===r&&n?.snapshotInteractiveOnly===!0&&!0!==n.snapshotRaw)?function(e){if(0===e.length)return e;let t=new Map,r=new Set;for(let n of aY)n(e,{replacements:t,suppressedIndexes:r});if(0===r.size&&0===t.size)return e;var n=e.filter(e=>!r.has(e.index)).map(e=>t.get(e.index)??e);let i=new Map(e.map(e=>[e.index,e])),a=new Map;for(let[e,t]of n.entries())a.set(t.index,e);return n.map((e,t)=>{let n="number"==typeof e.parentIndex?a.get(e.parentIndex):void 0;return void 0===n&&"number"==typeof e.parentIndex&&(n=function(e,t,r,n){let i=e,a=new Set;for(;"number"==typeof i&&!a.has(i);){if(a.add(i),!t.has(i))return n.get(i);i=r.get(i)?.parentIndex}}(e.parentIndex,r,i,a)),{...e,index:t,parentIndex:n}})}(l):l),truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,presentationKey:e3(e0(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&a?.snapshotCompact!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function or(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=on(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 on(e,t){let r=eY(e5(e),t);if(!r)return[];let n=e.findIndex(e=>e.index===r.index);if(-1===n)return[];let i=e[n]?.depth??0,a=[];for(let t=n;t<e.length;t+=1){let r=e[t];if(!r)continue;let o=r.depth??0;if(t>n&&o<=i)break;a.push(r)}return 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 oa(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return aE("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=e1(e.trim());if(!n)return aE("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=e2(e.nodes,n);if(r=t?eQ(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:aE("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 os(e){return{get:t=>t===e.sessionName?function(e,t,r={}){if(e)return{name:t,appBundleId:e.appBundleId,appName:e.appName,...!0===r.includeSnapshot?{snapshot:e.snapshot}:{},metadata:{surface:e.surface,...r.metadata??{}}}}(e.getSession(),e.sessionName,e.recordOptions):void 0,set:t=>{t.name!==e.sessionName?N({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function ol(e){let{session:t,sessionName:r,outPath:i,outputPlacement:a,dispatchContext:s}=e,l=eL({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...n,...S(a),surface:a?.surface};return"out"===r?oc(await n1(t.device,"screenshot",[],i,o)):oc(await n1(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:s}),artifacts:{resolveInput:async()=>{throw new L("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await o.mkdtemp(n.join(d.tmpdir(),"agent-device-screenshot-")),r=n.join(t,"screenshot.png")),await o.mkdir(n.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await o.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await o.mkdtemp(n.join(d.tmpdir(),`${e.prefix}-`));return{path:n.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await o.rm(t,{recursive:!0,force:!0})}}}},sessions:os({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eG()});return await l.capture.screenshot({session:r,requestId:s.requestId,appBundleId:t.appBundleId,...y(s),surface:t.surface,...i?{out:{kind:"path",path:i}}:{}})}function oc(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function od(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 op(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let of=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function om(e,t={}){let r=e7(e,t.helperAdb).exec;return(await og(e,t,r)).xml}async function oh(e,t={}){let r=e7(e,t.helperAdb).exec,n=await og(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=tt(i,800,t);return a&&function(e,t){for(let[r,n]of e){let e=t[r];e&&(n.hiddenContentAbove&&(e.hiddenContentAbove=!0),n.hiddenContentBelow&&(e.hiddenContentBelow=!0))}}(await oM(e,o.nodes,i,r),o.nodes),{...o,androidSnapshot:n.metadata}}let o=tn(i),s=tl(o,800,t);a&&await ow({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:l,...c}=s;return{...c,androidSnapshot:n.metadata}}async function ow(e){if(oE(e.interactiveSnapshot.nodes).size>0||oD(e.xml))return;let t=tl(e.tree,800,{...e.options,interactiveOnly:!1}),r=await oM(e.device,t.nodes,e.xml,e.adb);oT(r,t,e.interactiveSnapshot),0===r.size&&oT(ek(e5(t.nodes)),t,e.interactiveSnapshot)}async function og(e,t,r){let n=await x("android_snapshot_helper_artifact_resolution",async()=>await ox(t.helperArtifact));return n.artifact?await ov(e,t,r,n.artifact):(N({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await oN(e,n.fallbackReason,r))}async function ov(e,t,r,n){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),c=e7(e,t.helperAdb);try{let e=await oy(t,r,c,n,l);return e.installed&&await tc(l),a=await oS(t,r,c,n,l),o=n,s=e.reason,{xml:a.xml,metadata:{backend:"android-helper",helperVersion:o.manifest.version,helperApiVersion:a.metadata.helperApiVersion,helperTransport:a.metadata.transport,helperSessionReused:a.metadata.sessionReused,installReason:s,waitForIdleTimeoutMs:a.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:a.metadata.waitForIdleQuietMs,timeoutMs:a.metadata.timeoutMs,maxDepth:a.metadata.maxDepth,maxNodes:a.metadata.maxNodes,rootPresent:a.metadata.rootPresent,captureMode:a.metadata.captureMode,windowCount:a.metadata.windowCount,nodeCount:a.metadata.nodeCount,helperTruncated:a.metadata.truncated,elapsedMs:a.metadata.elapsedMs}}}catch(t){return await o_({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function oy(e,t,r,n,i){let a=await x("android_snapshot_helper_install",async()=>await tr({adb:t,adbProvider:r,artifact:n,deviceKey:i,installPolicy:e.helperInstallPolicy,timeoutMs:3e4}),{packageName:n.manifest.packageName,versionCode:n.manifest.versionCode,installPolicy:e.helperInstallPolicy??"missing-or-outdated"});return N({phase:"android_snapshot_helper_install_decision",data:{packageName:a.packageName,versionCode:a.versionCode,installedVersionCode:a.installedVersionCode,installed:a.installed,reason:a.reason}}),a}async function oS(e,t,r,n,i){let a={adb:t,adbProvider:r,deviceKey:i,helperVersion:n.manifest.version,helperVersionCode:n.manifest.versionCode,packageName:n.manifest.packageName,instrumentationRunner:n.manifest.instrumentationRunner,waitForIdleTimeoutMs:e.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await x("android_snapshot_helper_session_capture",async()=>await ta(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){N({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:T(e).message}}),await oI(t,n.manifest.packageName)}return await x("android_snapshot_helper_capture",async()=>await ti(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function o_(e){let t=function(e){var t;let r=T(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=oA(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 L(R(r.code),`${n}. Stock UIAutomator fallback was skipped because this usually means the Android accessibility tree is busy or stalled.`,{...r.details,hint:"Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout and report the busy UI if it persists."},e)}(e.error);if(t)throw t;let r=ob(e.error);return N({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tc(e.helperDeviceKey),await oI(e.adb,e.artifact.manifest.packageName),ts({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oN(e.device,r,e.adb)}async function oI(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await eB(150),N({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){N({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:T(e).message}})}}function ob(e){let t=T(e),r=oA(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 oA(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 ox(e){if(e)return{artifact:e};let t=e6(),r=n.join(e9(),"android-snapshot-helper","dist"),i=n.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await h.access(i)}catch{return{}}try{let e=to(JSON.parse(await h.readFile(i,"utf8"))),t=n.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await h.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:T(e).message}}}async function oN(e,t,r){let n;try{n=await x("android_snapshot_stock_capture",async()=>await ok(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new L(R((r=T(i)).code),`${r.message} Android snapshot helper failed before stock fallback: ${a}`,{...r.details,androidSnapshotHelperFallbackReason:a,...r.hint?{hint:r.hint}:{}},i)}throw e}return{xml:n,metadata:{backend:"uiautomator-dump",...t?{fallbackReason:t}:{}}}}async function oM(e,t,r,n){if(!t.some(e=>e8(e.type)))return new Map;let i=oE(t);if(i.size>0||oD(r))return i;let a=await oO(e,n);return a?function(e,t){let r=function(e){let t={className:"root",rect:{x:0,y:0,width:0,height:0},children:[]},r=[{indent:-1,node:t}],n=/^(\s*)([\w.$]+)\{[^}]* (-?\d+),(-?\d+)-(-?\d+),(-?\d+) #/;for(let t of e.split("\n")){let e=n.exec(t);if(!e)continue;let[i,a,o,s,l,c]=e.slice(1);if(void 0===i||void 0===a||void 0===o||void 0===s||void 0===l||void 0===c)continue;let d=i.length,u=Number(o),p=Number(s),f={className:a,rect:{x:u,y:p,width:Math.max(0,Number(l)-u),height:Math.max(0,Number(c)-p)},children:[]};for(;r.length>1&&d<=r[r.length-1].indent;)r.pop();r[r.length-1].node.children.push(f),r.push({indent:d,node:f})}return t.children.length>0?t:null}(t);if(!r)return new Map;let n=function(e){let t=[],r=[e];for(;r.length>0;){let e=r.pop();if(e8(e.className)){let r=function(e){let t=e.children[0];if(!t)return null;let r=Math.max(t.rect.height,...t.children.map(e=>e.rect.y+e.rect.height)),n=t.children.filter(e=>e.rect.height>0).map(t=>op(t.rect,e.rect)).sort((e,t)=>e.start-t.start);return 0===n.length?null:{rect:e.rect,contentExtent:r,contentBlocks:n}}(e);r&&t.push(r)}r.push(...e.children)}return t}(r);if(0===n.length)return new Map;let i=new Map;for(let t of e){if(!t.rect||!e8(t.type))continue;let r=function(e,t){let r=null,n=1/0;for(let i of t){let t=Math.abs(i.rect.width-e.width)+Math.abs(i.rect.height-e.height);if(t>32)continue;let a=4*t+(Math.abs(i.rect.x-e.x)+Math.abs(i.rect.y-e.y));a<n&&(r=i,n=a)}return r}(t.rect,n);if(!r)continue;let a=function(e,t){let r=function(e,t){let r=t,n=new Set;for(;!n.has(r.index);){var i,a;n.add(r.index);let o=e.filter(e=>e.parentIndex===r.index&&e.rect);if(1!==o.length)return r;let s=o[0];if(i=s.rect,a=t.rect,i.x!==a.x||i.y!==a.y||i.width!==a.width||i.height!==a.height)return r;r=s}return t}(e,t);return e.filter(e=>e.parentIndex===r.index&&e.rect).map(e=>e.rect).filter(e=>e.height>0).sort((e,t)=>e.y-t.y).map(e=>op(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=od(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?od(o):a.length>0?od(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 oD(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function oE(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 ok(e,t=te(e)){try{return await en(()=>oP(t),{shouldRetry:oR})}catch(t){var r,n;let e;if((r=t)instanceof L&&"COMMAND_FAILED"===r.code&&"number"==typeof r.details?.timeoutMs&&r.details?.cmd==="adb"&&(e=Array.isArray(n=r.details?.args)?n.map(String):"string"==typeof n?n.split(/\s+/):[]).includes("uiautomator")&&e.includes("dump")){let e="Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout. Stock Android UIAutomator may still time out on app-owned infinite animations.";throw new L("COMMAND_FAILED",`Android UI hierarchy dump timed out while waiting for the UI to become idle. ${e}`,{...t.details??{},hint:e},t)}throw t}}async function oP(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=oC(a.stdout,a.stderr);if(o)return o;let s="/sdcard/window_dump.xml",l=await e(["shell","uiautomator","dump",s],{allowFailure:!0,timeoutMs:8e3}),c=(t=l.stdout,r=l.stderr,n=`${t}
6
- ${r}`,i=/dumped to:\s*(\S+)/i.exec(n),i?.[1]);if(0!==l.exitCode&&!c)throw new L("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode,reason:"missing_fresh_dump"});let d=await e(["shell","cat",c??s]),u=oC(d.stdout,d.stderr);if(!u)throw new L("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:d.stdout,stderr:d.stderr});return u}function oC(e,t){let r=`${e}
7
- ${t}`,n=r.indexOf("<?xml"),i=n>=0?n:r.indexOf("<hierarchy");if(i<0)return null;let a=r.lastIndexOf("</hierarchy>");if(a<0||a<i)return null;let o=r.slice(i,a+12).trim();return o.length>0?o:null}function oR(e){if(!(e instanceof L)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return of.some(e=>r.includes(e))}async function oO(e,t=te(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),r=`${e.stdout}
8
- ${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function oT(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 oL=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,o$=/^close app$/i,oF="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function oU(e){let{session:t}=e;if("android"!==t.device.platform||!t.recording)return"absent";try{let e=await oH(t),r=oW(e);if(!r?.rect)return"absent";let n=await oK(t,r);if(!n.ok)return N({level:"warn",phase:"android_blocking_dialog_tap_failed",data:{session:t.name,deviceId:t.device.id,exitCode:n.exitCode,stdout:n.stdout.trim(),stderr:n.stderr.trim()}}),"failed";if(!await oz(t))return N({level:"warn",phase:"android_blocking_dialog_still_present",data:{session:t.name,deviceId:t.device.id}}),"failed";if(t.appBundleId&&(await eo(t.device,t.appBundleId),!await oJ(t,t.appBundleId)))return N({level:"warn",phase:"android_blocking_dialog_relaunch_unfocused",data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId}}),"failed";return N({level:"warn",phase:"android_blocking_dialog_recovered",data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId,x:n.x,y:n.y}}),"recovered"}catch(e){return N({level:"warn",phase:"android_blocking_dialog_recovery_failed",data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),"failed"}}async function oG(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await er(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await oq(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 oj({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 oj({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${oB(a)}. Automatic recovery failed.`,hint:oF})}throw oj({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${oB(a)}.`,hint:oF})}async function oq(e){try{return await oV(e)}catch(t){return N({level:"warn",phase:"android_app_anr_recovery_failed",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}async function oV(e){if(!e.appBundleId)return!1;let t=oW(await oH(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await oK(e,t);if(!r.ok)return!1;await eo(e.device,e.appBundleId);let n=await oJ(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&N({level:"warn",phase:"android_app_anr_recovered",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:r.x,y:r.y}}),n}function oj(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new L("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function oB(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function oH(e){return e5(eZ((await oh(e.device,{interactiveOnly:!1,compact:!1})).nodes))}async function oK(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=e4(t.rect),i=await ee(e.device,["shell","input","tap",String(Math.round(r)),String(Math.round(n))],{allowFailure:!0});return 0!==i.exitCode?{ok:!1,exitCode:i.exitCode,stdout:i.stdout.trim(),stderr:i.stderr.trim()}:{ok:!0,x:r,y:n}}function oW(e,t={}){if(!1===t.requireDialogSignal||oY(e))return e.find(e=>oZ(e).some(e=>o$.test(e))&&e.rect)}async function oz(e){for(let t=0;t<12;t+=1){if(!oY(await oH(e)))return!0;await eB(500)}return!oY(await oH(e))}async function oJ(e,t,r={}){for(let n=0;n<12;n+=1){if(await oX(e,t,r))return!0;await eB(500)}return await oX(e,t,r)}async function oX(e,t,r){return!(r.requireNoBlockingDialog&&await er(e.device))&&(await ef(e.device)).package===t}function oZ(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 oY(e){return e.some(e=>{let t=oZ(e).join(" ").trim();return t.length>0&&oL.test(t)})}function oQ(e){return!!(e&&e.width>0&&e.height>0)}function o0(e){return e.width*e.height}function o1(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 o2=[255,59,48,255],o3=[255,214,10,255],o4=[0,0,0,255],o5=["scroll","list","recyclerview","edittext","textfield"],o8=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],o6={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 o9(e){let t=eq(await o.readFile(e.screenshotPath),"screenshot"),r=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)st(r)&&oQ(r.rect)&&(!t||o0(r.rect)>o0(t))&&(t=r.rect);return t||function(e){let t=1/0,r=1/0,n=-1/0,i=-1/0;for(let a of e)a.rect&&oQ(a.rect)&&(t=Math.min(t,a.rect.x),r=Math.min(r,a.rect.y),n=Math.max(n,a.rect.x+a.rect.width),i=Math.max(i,a.rect.y+a.rect.height));return!Number.isFinite(t)||!Number.isFinite(r)||n<=t||i<=r?null:{x:t,y:r,width:n-t,height:i-r}}(e.filter(e=>{var t;return oQ(e.rect)&&!("image"===eX((t=e).type??"")&&!sn(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(si)||sa(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!oQ(r.rect)||st(r))return!1;let n=eX(r.type??"");return!(o5.some(e=>n.includes(e))||t&&o0(r.rect)>.25*o0(t))}(e,t,r)||(se(r)?n:n&&function(e){let t=eX(e.type??"");return t.includes("statictext")||t.includes("image")||t.includes("text")||t.includes("other")}(r))}(e,i,n))continue;let l=(o=e.nodes,[function(e){return se(e)&&!st(e)}(s=n)?s:null,eJ(o,s,e=>(function(e){return se(e)&&!st(e)})(e)),s.hittable?s:null,eJ(o,s,e=>!0===e.hittable)].find(sr)??null);if(!l?.rect||!oQ(l.rect))continue;let c=function(e,t,r){let n=so(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=so(n);if(!i)continue;let a=function(e){let t=0;return eX(e.type??"").includes("text")&&(t+=2),si(e.label)&&(t+=2),si(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||so(t)}(n,l,e.nodes),d=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),se(t)&&(n+=3),se(e)&&(n+=2),r&&(n+=2),sa(t.identifier)&&(n+=1),sn(t.value)&&(n+=1),n}(n,l,c),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=se,i=e=>!!so(e),(!t.rect||!0!==t.hittable||n(t)||i(t)?null:function(e,t,r){let n=e.rect,i=function(e,t,r){let n=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r.get(n.parentIndex);if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(t,e,i)&&function(e,t){let r=eX(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&oQ(t.rect)&&o1(n,t.rect)).map(e=>e.rect);return a.length<2?null:function(e){let t=e[0];if(void 0===t)throw Error("unionRects requires at least one rect");let r=t.x,n=t.y,i=t.x+t.width,a=t.y+t.height;for(let t of e.slice(1))r=Math.min(r,t.x),n=Math.min(n,t.y),i=Math.max(i,t.x+t.width),a=Math.max(a,t.y+t.height);return{x:r,y:n,width:i-r,height:a-n}}(a)}(e,t,r);if(!i)return null;let a=i.y-n.y,o=n.y+n.height-(i.y+i.height);if(a<0||o<0||16>Math.abs(o-a))return null;let s=Math.min(a,o),l=Math.round(i.y-s),c=Math.round(i.height+2*s);return c<=0||c>=n.height?null:{x:n.x,y:l,width:n.width,height:c}}(t,r,i))??t.rect)}(e,l,e.nodes),p=o7(e,i,u,t,r);if(!oQ(p))continue;let f=a.get(l.ref);(!f||d>f.score)&&a.set(l.ref,{ref:l.ref,label:c,rect:l.rect,overlayRect:p,score:d})}return function(e,t,r,n,i){let a=eA(e.nodes).primaryAction;if(!a?.ref||!a.rect||!oQ(a.rect))return;let o=o7(e,t,a.rect,n,i);if(!oQ(o))return;let s={ref:a.ref,label:a.label,rect:a.rect,overlayRect:o,score:100},l=r.get(a.ref);r.set(a.ref,l?{...l,score:Math.max(l.score,s.score)}:s)}(e,i,a,t,r),(function(e){let t=[];for(let r of e.sort((e,t)=>o0(e.overlayRect)-o0(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(o1(e.overlayRect,r.overlayRect)||o1(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}o0(r.overlayRect)<o0(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(sf).slice(0,n.maxRefs??24).sort(sp).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:e4(e.overlayRect)}))}(e.snapshot,t.width,t.height,{maxRefs:e.maxRefs});for(let e of r){var n,i;(function(e,t,r){for(let n=0;n<2;n+=1)sc(e,t.x,t.x+t.width-1,t.y+n,r),sc(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),sd(e,t.x+n,t.y,t.y+t.height-1,r),sd(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(n=t,(i=e).overlayRect,o2),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=sl(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:sl(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)su(e,t+o,r+a,i)})(e,i,o,n,o3),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=o6[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]&&su(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,o4)}(n,i.overlayRect,i.ref)}return await o.writeFile(e.screenshotPath,eT.sync.write(t)),r}function o7(e,t,r,n,i){if("android"===e.backend||!t)return ss(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 ss({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 se(e){let t=[e.type,e.role,e.subrole].map(e=>eX(e??"")).join(" ");return o8.some(e=>t.includes(e))}function st(e){let t=[e.type,e.role,e.subrole].map(e=>eX(e??"")).join(" ");return t.includes("application")||t.includes("window")}function sr(e){return!!(e?.rect&&oQ(e.rect)&&!st(e))}function sn(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function si(e){var t;let r;return!!sn(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function sa(e){var t;return"string"==typeof e&&!!si(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function so(e){let t=[e.label,e.value].find(si);return t?t.trim():sa(e.identifier)?e.identifier.trim():void 0}function ss(e,t,r){let n=sl(e.x,0,Math.max(0,t-1)),i=sl(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:sl(e.width,1,a),height:sl(e.height,1,o)}}function sl(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function sc(e,t,r,n,i){for(let a=t;a<=r;a+=1)su(e,a,n,i)}function sd(e,t,r,n,i){for(let a=r;a<=n;a+=1)su(e,t,a,i)}function su(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 sp(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 sf(e,t){return t.score!==e.score?t.score-e.score:sp(e,t)}function sm(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 sh=new WeakMap;function sw(e){if(!e)return;let t=sh.get(e);if(t)return t;let r=sg(e.nodes??[]);if(r)return sh.set(e,r),r}let sg=eU,sv={referenceWidth:1e3,referenceHeight:1e3};function sy(e,t,r,n,i={},a=Date.now(),o=Date.now()){var s,l,c,d,u,p,f,m,h;let w,g,v,y=e.recording;if(!y)return;let S={...i,...n??{}},_=sM(S.effectiveDurationMs)??sM(S.durationMs),I={recordingStartedAt:y.startedAt,gestureClockOriginAtMs:y.gestureClockOriginAtMs,gestureClockOriginUptimeMs:y.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===y.platform?y.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:sM(S.gestureStartUptimeMs),gestureEndUptimeMs:sM(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},b="number"==typeof(s={gestureStartUptimeMs:sM(S.gestureStartUptimeMs),gestureEndUptimeMs:sM(S.gestureEndUptimeMs),reportedDurationMs:_,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}).gestureStartUptimeMs&&"number"==typeof s.gestureEndUptimeMs?Math.max(0,s.gestureEndUptimeMs-s.gestureStartUptimeMs):"number"==typeof s.reportedDurationMs?Math.max(0,s.reportedDurationMs):Math.max(0,s.fallbackFinishedAtMs-s.fallbackStartedAtMs),A="ios"===e.device.platform&&void 0===sM(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sD(sM(t.count),1)??1,r=!0===t.doubleTap,n=sD(sM(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 sm(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...I,gestureDurationMs:b}):sm(I),x=(l=e.snapshot,w=sM((c=S).referenceWidth),g=sM(c.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:sw(l)),M=(d=t,u=r,p=S,f=A,m=b,h=x,v=sS[d],v?.(u,p,f,m,h)??[]);0!==M.length&&(y.gestureEvents.push(...M),N({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:M.length,tMs:A,gestureDurationMs:b,kinds:M.map(e=>e.kind)}}))}let sS={click:(e,t,r,n,i)=>s_(e,t,r,i),press:(e,t,r,n,i)=>s_(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?s_(e,t,r,i):[],fill:(e,t,r,n,i)=>sI(e,t,r,i),focus:(e,t,r,n,i)=>sI(e,t,r,i),longpress:function(e,t,r,n,i){let a=sE(t,e);if(!a)return[];let{x:o,y:s}=a;return[sx(r,o,s,sC(n,[sM(t.durationMs),sM(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sk(t,e),o=sN(t.contentDirection)??sN(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:c,y2:d}=a,u=sC(n,[],250),p=sM(t.amount)??sM(e[1]),f=sM(t.pixels);return[{kind:"scroll",tMs:r,x:s,y:l,x2:c,y2:d,...i,durationMs:u,contentDirection:o,...void 0!==p?{amount:p}:{},...void 0!==f?{pixels:f}:{}}]},pan:sb,fling:sb,swipe:sb,pinch:function(e,t,r,n,i){let a=sE(t,e,1),o=sM(t.scale)??sM(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:sC(n,[],280)}]}};function s_(e,t,r,n){let i=sE(t,e);if(!i)return[];let{x:a,y:o}=i,s=sD(sM(t.count),1)??1,l=sD(sM(t.intervalMs),0)??0,c=!0===t.doubleTap,d=sD(sM(t.holdMs),1),u=[];for(let e=0;e<s;e+=1){let t=r+e*l;if(void 0!==d&&d>0){u.push(sx(t,a,o,d,n));continue}u.push(sA(t,a,o,n)),c&&u.push(sA(t+90,a,o,n))}return u}function sI(e,t,r,n){let i=sE(t,e);if(!i)return[];let{x:a,y:o}=i;return[sA(r,a,o,n)]}function sb(e,t,r,n,i){let a=sk(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:c}=a,d=sC(n,[sM(t.effectiveDurationMs),sM(t.durationMs),sM(e[4])],250),u=sD(sM(t.count),1)??1,p=sD(sM(t.pauseMs),0)??0,f="ping-pong"===t.pattern?"ping-pong":"one-way";return Array.from({length:u},(e,t)=>{var n,a,u,m,h,w,g,v,y,S,_,I,b;let A,{startX:x,startY:N,endX:M,endY:D}=(n=t,a=f,u=o,m=s,h=l,w=c,"ping-pong"===a&&n%2==1?{startX:h,startY:w,endX:u,endY:m}:{startX:u,startY:m,endX:h,endY:w});return g=r+t*(d+p),v=x,y=N,S=M,_=D,I=d,"back-swipe"===(A=function(e,t,r,n,i){if(!i||Math.abs(r-e)<=1.25*Math.abs(n-t))return"swipe";let a=.08*i.referenceWidth;return e<=a&&r>e||e>=i.referenceWidth-a&&r<e?"back-swipe":"swipe"}(v,y,S,_,b=i))?{kind:A,tMs:g,x:v,y,x2:S,y2:_,...b,durationMs:I,edge:function(e,t,r){if(r){let t=.08*r.referenceWidth;if(e<=t)return"left";if(e>=r.referenceWidth-t)return"right"}return t>=e?"left":"right"}(v,S,b)}:{kind:A,tMs:g,x:v,y,x2:S,y2:_,...b,durationMs:I}})}function sA(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sx(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sN(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 sM(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 sD(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sE(e,t,r=0){let n=sM(e.x)??sM(t[r]),i=sM(e.y)??sM(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function sk(e,t){let r=sP(e.x1,e.x,t[0]),n=sP(e.y1,e.y,t[1]),i=sP(e.x2,t[2]),a=sP(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 sP(...e){return e.map(sM).find(e=>void 0!==e)}function sC(e,t,r){return sD(e,1)??t.map(e=>sD(e,1)).find(e=>void 0!==e)??r}let sR={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sO(e){var t,r,n,i,a,o,s;let l,c,d,u,p,{req:f,session:m,logPath:h,sessionStore:w,contextFromFlags:g}=e,v=function(e){if("pan"===e.command||"fling"===e.command||"rotate-gesture"===e.command||"transform-gesture"===e.command)return{ok:!1,message:"Use gesture pan, gesture fling, gesture swipe, gesture rotate, or gesture transform."};if("gesture"!==e.command)return{ok:!0,platformCommand:e.command,dispatchRequest:e,recordedCommand:e.command};let[t,...r]=e.positionals??[],n=t?sR[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:e_}}(f);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:y,dispatchRequest:S,recordedCommand:_}=v,I=await sL(m,y);if(I)return I;let b=await sT(m,y);if("response"in b)return b.response;let{resolvedPositionals:A,resolvedOut:x,recordedPositionals:N,recordedFlags:M}="screenshot"===(t=S).command?(c=(n=(r=t).positionals??[],i=r.meta?.cwd,(l=n[0])?[tW.expandHome(l,i),...n.slice(1)]:n),u=(d=(a=r.flags?.out,o=r.meta?.cwd,a?tW.expandHome(a,o):a))?{...r.flags??{},out:d}:r.flags??{},{resolvedPositionals:c,resolvedOut:d,recordedPositionals:c,recordedFlags:u}):{resolvedPositionals:p=(s=t).positionals??[],resolvedOut:s.flags?.out,recordedPositionals:p,recordedFlags:s.flags??{}},D=Date.now(),E={...g(f.flags,m.appBundleId,m.trace?.outPath),surface:m.surface},k=await s$({session:m,sessionName:e.sessionName,logPath:h,command:y,request:S,positionals:A,out:x,dispatchContext:E}),P=await sT(m,y,"after-command");if("response"in P)return P.response;"status"in b&&"recovered"===b.status&&(!k||"object"==typeof k)&&((k??={}).warning=b.warning);let C=Date.now(),R=_===y?N:f.positionals??[],O=_===y?M:f.flags??{};return function(e){let{session:t,sessionStore:r,command:n,recordedCommand:i,resolvedPositionals:a,recordedPositionals:o,recordedFlags:s,data:l,actionStartedAt:c,actionFinishedAt:d,flags:u}=e,p=function(e,t,r,n){if("scroll"!==t)return n;let i=sw(e.snapshot),a={...n??{}},o=sN(a.direction)??sN(r[0]);if(!o)return n;let s=sM(a.amount)??sM(r[1]),l=sM(a.pixels),c=sk(a,[]),d=sM(a.referenceWidth),u=sM(a.referenceHeight),p=void 0!==d&&d>0&&void 0!==u&&u>0?{referenceWidth:d,referenceHeight:u}:i??sv;if(c&&(c.x1!==c.x2||c.y1!==c.y2))return{...a,x1:c.x1,y1:c.y1,x2:c.x2,y2:c.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==l?{pixels:l}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250};let f=eV({direction:o,amount:s,pixels:l,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:f.x1,y1:f.y1,x2:f.x2,y2:f.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==f.pixels?{pixels:f.pixels}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250}}(t,n,a,l);sy(t,n,a,p,u,c,d),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:y,recordedCommand:_,resolvedPositionals:A,recordedPositionals:R,recordedFlags:O,data:k,actionStartedAt:D,actionFinishedAt:C,flags:f.flags??{}}),am(y)&&au(m,y),ax(m,y,A,f.flags),{ok:!0,data:k??{}}}async function sT(e,t,r="before-command"){if("android"!==e.device.platform||na(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await oG({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:T(e)}}}}async function sL(e,t){if(!im(t,e.device)){var r;let n=(r=e.device,ip[t]?.unsupportedHint?.(r));return{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:`${t} is not supported on this device`,...n?{hint:n}:{}}}}return"android"===e.device.platform&&e.recording&&"record"!==t&&await oU({session:e})==="failed"?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function s$(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await n1(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 sF(r,l,e.logPath),l}async function sF(e,t,r){let n={snapshotInteractiveOnly:!0,snapshotCompact:!0},i=ot(await a3({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);oo(e,i);let a=await o9({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let sU=s0(()=>import("./lease.js")),sG=s0(()=>import("./session.js").then(e=>e.session_namespaceObject)),sq=s0(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),sV=s0(()=>import("./react-native.js")),sj=s0(()=>import("./record-trace.js").then(e=>e.record_trace_namespaceObject)),sB=s0(()=>import("./find.js")),sH=s0(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function sK(e){var t;switch(t=e.req.command,na(t)?.route??"generic"){case"lease":return await sW(e);case"session":return await sz(e);case"snapshot":return await sJ(e);case"reactNative":return await sX(e);case"recordTrace":return await sZ(e);case"find":return await sY(e);case"interaction":return await sQ(e);case"generic":return null}}async function sW(e){let{handleLeaseCommands:t}=await sU();return s1(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function sz(e){let{handleSessionCommands:t}=await sG();return s1(e.req.command,"session",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke,invokeReplayAction:e.invokeReplayAction,androidAdbExecutor:e.androidAdbExecutor}))}async function sJ(e){let{handleSnapshotCommands:t}=await sq();return s1(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function sX(e){let{handleReactNativeCommands:t}=await sV();return s1(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function sZ(e){let{handleRecordTraceCommands:t}=await sj();return s1(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function sY(e){let{handleFindCommands:t}=await sB();return s1(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function sQ(e){let{handleInteractionCommands:t}=await sH();return s1(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function s0(e){let t;return()=>t??=e()}function s1(e,t,r){if(r)return r;throw new L("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let s2=new m;async function s3(e,t,r){let n=s2.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>s2.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function s4(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function s5(e,t){var r,n,i,a;let o,s,l,c,d,u;return e.recording?(r=e,n=t,o=J(r.name),s=`agent-device close --session ${o}`,l=`agent-device record stop --session ${o}`,c="selector-conflict"===n?`To keep using this device, rerun the command with --session ${o} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${o} for commands that should attach to the recording session.`,`Recording session "${r.name}" owns this device. Run ${l}; if the session still appears in agent-device session list, run ${s}. ${c} Run agent-device session list to inspect active sessions.`):(i=e,a=t,d=J(i.name),u=`agent-device close --session ${d}`,"selector-conflict"===a?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${d} and remove conflicting device selectors. To switch devices, first run ${u}, then open the desired device with a different --session name.`:`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${d}. To open a new session on this device, first run ${u}.`)}function s8(e,t){if(!t)return[];let r=[],n=e.device,i=rq(t.platform);if(i&&!rj(n.platform,i)&&r.push({key:"platform",value:t.platform}),t.target&&t.target!==(n.target??"mobile")&&r.push({key:"target",value:t.target}),t.udid&&("ios"!==n.platform||t.udid!==n.id)&&r.push({key:"udid",value:t.udid}),t.serial&&("android"!==n.platform||t.serial!==n.id)&&r.push({key:"serial",value:t.serial}),t.device&&t.device.trim().toLowerCase()!==n.name.trim().toLowerCase()&&r.push({key:"device",value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=n.simulatorSetPath?.trim();("ios"!==n.platform||"simulator"!==n.kind||e!==i)&&r.push({key:"iosSimulatorDeviceSet",value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=eu(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function s6(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 s9="default";function s7(e){return e.session||s9}function le(e){if(e.meta?.sessionExplicit===!0||(e.session||s9)!==s9||e.meta?.sessionIsolation==="tenant"||e.flags?.sessionIsolation==="tenant")return;let r=function(e){if(!e||0===e.trim().length)return;let t=function(e){let t=n.resolve(e);try{return i.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(i.existsSync(n.join(t,".git")))return t;let e=n.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(r){var a;return{kind:"cwd",id:(a=r,t.createHash("sha256").update(a).digest("hex").slice(0,16))}}}function lt(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function lr(e,t){let r=le(e);return!!r&&!!t.sessionScope&&!lt(t,r)}function ln(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 li(e,t){var r,n,i,a,o,s,l,c,d,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?s8(t,g):(n=g,i=e.meta?.lockPlatform,f=[],m=rq(i),void 0!==n.platform&&m&&(a=rq(n.platform),o=m,a&&o&&a!==o&&("apple"===a?!rV(o):"apple"!==o||!rV(a)))&&f.push({key:"platform",value:n.platform}),m&&(s=f,l=n,c=m,(h=l.target)&&function(e,t){switch(t){case"android":case"ios":return"desktop"===e;case"macos":case"linux":return"desktop"!==e;case"apple":return!1;default:return lo(t)}}(h,c)&&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"===rq(r.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return lo(e)}}(r,t)){let r=t[n];r9(r)&&e.push({key:n,value:r})}}(f,n,m)),f),S=e.meta?.lockPlatform;if(0===y.length){return d=v,u=t,p=g,!S||u||void 0!==p.platform||d&&r7(p,r6)||(g.platform=S),{...e,flags:g}}if("strip"===w)return function(e,t,r,n){if(n){la(e,t),e.platform=n.device.platform;return}la(e,t),r&&void 0===e.platform&&(e.platform=r)}(g,y,S,t),{...e,flags:g};throw new L("INVALID_ARGS",function(e,t,r){let n=t.map(s6).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${s4(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(s6),hint:function(e,t){if(t)return s5(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${J(e.session)}`:"";return"Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. "+(r?`Run agent-device open <app>${n} --platform ${r} first if no session is active. `:`Run agent-device open <app>${n} first if no session is active. `)+"Run agent-device session list to inspect active sessions."}(e,t)})}function la(e,t){for(let r of t)delete e[r.key]}function lo(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function ls(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[ll(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return li(e)}catch{return e}}(n);if("open"===(r=l).command||r7(r.flags,r8))try{let e=await rY(l.flags??{});s.add(ll(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=lc(e)-lc(t);return 0!==r?r:e.localeCompare(t)})}function ll(e){return`device:${e}`}function lc(e){return+!e.startsWith("session:")}function ld(e,t={}){let r=et(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function lu(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:ld(t,{simulatorSetPath:e.simulatorSetPath})}function lp(e,t,r){return iD(lu(e,t),r)}let lf="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 lm(e){if(!(e instanceof L)||"COMMAND_FAILED"!==e.code)return!1;let t=`${e.message??""}`.toLowerCase();return!(t.includes("xcodebuild exited early")||t.includes("device is busy")&&t.includes("connecting"))&&!!(t.includes("runner did not accept connection")||t.includes("fetch failed")||t.includes("econnrefused")||t.includes("socket hang up"))}function lh(e){return!(e instanceof L)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lw(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new L("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:es({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:ec("IOS_RUNNER_CONNECT_TIMEOUT")})}async function lg(e){var t,r;let n,{session:i,port:a,logPath:o}=e,s=await i.testPromise,l="Runner did not accept connection (xcodebuild exited early)",c=es({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new L("COMMAND_FAILED",l,{port:a,logPath:o,xcodebuild:{exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr},reason:c,hint:(t=s.stdout,r=s.stderr,(n=`${l}
1
+ import{__webpack_require__ as e}from"./rslib-runtime.js";import t,{createHash as r}from"node:crypto";import n from"node:path";import i,{existsSync as a,promises as o}from"node:fs";import s from"node:http";import{fileURLToPath as l,pathToFileURL as c}from"node:url";import"node:https";import d from"node:os";import{once as u}from"node:events";import{Transform as p}from"node:stream";import{pipeline as f}from"node:stream/promises";import{AsyncLocalStorage as m}from"node:async_hooks";import h from"node:fs/promises";import w from"node:net";import{resolveUserPath as g}from"./3267.js";import{appendScreenshotScriptFlags as v,screenshotOptionsFromFlags as y,screenshotFlagsFromOptions as S,SCREENSHOT_ACTION_FLAG_KEYS as _}from"./5310.js";import{withDiagnosticsScope as I,getDiagnosticsMeta as b,flushDiagnosticsToSessionFile as A,withDiagnosticTimer as x,updateDiagnosticsScope as N,emitDiagnostic as M}from"./7599.js";import{readProcessStartTime as E,readProcessCommand as D,resolveRuntimeTransportHints as k,isProcessGroupAlive as P,isAgentDeviceDaemonProcess as C,isProcessAlive as R}from"./8656.js";import{toAppErrorCode as O,asAppError as T,normalizeError as L,AppError as $}from"./9152.js";import{runCmdBackground as F,runCmdStreaming as U,runCmd as G,runCmdSync as q,resolveExecutableOverridePath as V,whichCmd as j}from"./9818.js";import{consumeTextLines as B,serializeDaemonResponseEnvelope as H,normalizeTenantId as K,shouldStreamRequestProgress as W,resolveDaemonPaths as z,resolveSessionIsolationMode as J,shellQuoteIfNeeded as X,resolveDaemonServerMode as Z,resolveDaemonCodeSignature as Y,serializeDaemonProgressEnvelope as Q,serializeDaemonRpcResponseEnvelope as ee}from"./9238.js";import{runAndroidAdb as et,resolveIosSimulatorDeviceSetPath as er,getAndroidBlockingDialogFocus as en,withRetry as ei,Deadline as ea,isEnvTruthy as eo,openAndroidApp as es,classifyBootFailure as el,streamAndroidLogcatWithAdb as ec,bootFailureHint as ed,androidDeviceForSerial as eu,parseSerialAllowlist as ep,retryWithPolicy as ef,getAndroidAppState as em,classifyAndroidAppTarget as eh,captureAndroidLogcatWithAdb as ew,resolveAndroidSerialAllowlist as eg,isDeepLinkTarget as ev,formatAndroidInstalledPackageRequiredMessage as ey}from"./8806.js";import{PUBLIC_COMMANDS as eS,INTERNAL_COMMANDS as e_,GESTURE_SUBCOMMAND_ERROR as eI}from"./5792.js";import{findMistargetedTypeRefToken as eb,buildSwipePresetGesturePlan as eA,analyzeReactNativeOverlay as ex,parseScrollDirection as eN,isKeyboardAction as eM,areRectsApproximatelyEqual as eE,isSystemScrollIndicatorLabel as eD,formatScrollEdgeMessage as ek,isReactNativeCollapsedWarningWrapperWithVisibleBanner as eP,deriveMobileSnapshotHiddenContentHints as eC,decodePng as eR,inferVerticalScrollIndicatorDirections as eO,captureScrollEdgeState as eT,normalizeSnapshotTree as eL,isReactNativeCollapsedWarningWrapperCandidate as e$,PNG as eF,createAgentDevice as eU,runScrollEdgePasses as eG,requireIntInRange as eq,inferGestureReferenceFrame as eV,annotateCoveredSnapshotNodes as ej,localCommandPolicy as eB,buildScrollGesturePlan as eH,parseSwipePreset as eK}from"./9533.js";import{sleep as eW}from"./4829.js";import{readLocationCoordinate as ez,successText as eJ,withSuccessText as eX,parseDeviceRotation as eZ}from"./1998.js";import{findNearestAncestor as eY,normalizeType as eQ,pruneGroupNodes as e0,findNodeByLabel as e1,resolveRefLabel as e2}from"./940.js";import{snapshotPresentationOptionsFromFlags as e3,normalizeRef as e4,findNodeByRef as e5,buildSnapshotPresentationKey as e8,centerOfRect as e6,attachRefs as e9}from"./4057.js";import{isScrollableType as e7}from"./4778.js";import{readVersion as te,findProjectRoot as tt}from"./9671.js";import{resolveAndroidAdbProvider as tr,resolveAndroidAdbExecutor as tn}from"./9639.js";import{parseUiHierarchy as ti,ensureAndroidSnapshotHelper as ta,parseUiHierarchyTree as to,captureAndroidSnapshotWithHelper as ts,captureAndroidSnapshotWithHelperSession as tl,parseAndroidSnapshotHelperManifest as tc,forgetAndroidSnapshotHelperInstall as td,buildUiHierarchySnapshot as tu,stopAndroidSnapshotHelperSession as tp}from"./221.js";import{applyCommandDefaults as tf}from"./1352.js";var tm={};e.r(tm),e.d(tm,{IH:()=>uF,ug:()=>uU,sE:()=>uk,Bx:()=>uP,WX:()=>u$,Co:()=>uR,wg:()=>uL,withAppLogProvider:()=>uM});var th={};e.r(th),e.d(th,{IO:()=>iY,LB:()=>iZ,xY:()=>i0,eN:()=>iQ,runMacOsPressAction:()=>i3,runMacOsReadTextAction:()=>i2,rR:()=>i4,r5:()=>i1});var tw={};e.r(tw),e.d(tw,{bu:()=>cb,abortAllIosRunnerSessions:()=>dm,hv:()=>dd,Nr:()=>dJ,gE:()=>dz,FS:()=>c_,runIosRunnerCommand:()=>dW,stopAllIosRunnerSessions:()=>dh,yA:()=>df});var tg={};e.r(tg),e.d(tg,{v:()=>dE,M:()=>dD,withAppleRunnerProvider:()=>dk});var tv={};e.r(tv),e.d(tv,{ensureBootedSimulator:()=>uV,SA:()=>uB,EB:()=>uG,N3:()=>uj});var ty={};e.r(ty),e.d(ty,{qx:()=>iC,Ly:()=>iT,Gr:()=>ik,vT:()=>iR,Cc:()=>iO,withAppleToolProvider:()=>iP});var tS={};e.r(tS),e.d(tS,{readLinuxTextAtPoint:()=>am,r:()=>af});var t_={};function tI(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}e.r(t_),e.d(t_,{uK:()=>i9,nE:()=>ae,withLinuxToolProvider:()=>i7});let tb=["platform","device","udid","serial","out","verbose","metroHost","metroPort","bundleUrl","launchUrl","snapshotInteractiveOnly","snapshotCompact","snapshotDepth","snapshotScope","snapshotRaw",..._,"relaunch","saveScript","noRecord","fps","quality","hideTouches","count","intervalMs","delayMs","holdMs","jitterPx","doubleTap","clickButton","pauseMs","pattern"];function tA(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 tx(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}let tN=/^-?\d+(\.\d+)?$/,tM=/^[^\s"\\]+$/,tE=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),tD=new Map([["--count","count"],["--pause-ms","pauseMs"]]),tk=new Map([["--delay-ms","delayMs"]]);function tP(e){return"click"===e||"press"===e}function tC(e){return tP(e)||"longpress"===e}function tR(e){return"type"===e||"fill"===e}function tO(e){return tL(e,t$)}function tT(e){return JSON.stringify(e)}function tL(e,t){return t(e)?e:tT(e)}function t$(e){return tF(e)&&e.startsWith("@")||tN.test(e)}function tF(e){return tM.test(e)}function tU(e){let t=(e.positionals??[]).map(e=>tO(e));return[e.command,...t].join(" ")}function tG(e,t){let r=t.flags??{};if(tP(t.command)){"number"==typeof r.count&&e.push("--count",String(r.count)),"number"==typeof r.intervalMs&&e.push("--interval-ms",String(r.intervalMs)),"number"==typeof r.holdMs&&e.push("--hold-ms",String(r.holdMs)),"number"==typeof r.jitterPx&&e.push("--jitter-px",String(r.jitterPx)),!0===r.doubleTap&&e.push("--double-tap");let t=r.clickButton;t&&"primary"!==t&&e.push("--button",t);return}if("swipe"===t.command){"number"==typeof r.count&&e.push("--count",String(r.count)),"number"==typeof r.pauseMs&&e.push("--pause-ms",String(r.pauseMs)),("one-way"===r.pattern||"ping-pong"===r.pattern)&&e.push("--pattern",r.pattern);return}tR(t.command)&&"number"==typeof r.delayMs&&e.push("--delay-ms",String(r.delayMs))}function tq(e,t){t&&(("ios"===t.platform||"android"===t.platform)&&e.push("--platform",t.platform),"string"==typeof t.metroHost&&t.metroHost.length>0&&e.push("--metro-host",tL(t.metroHost,tF)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",tL(t.bundleUrl,tF)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",tL(t.launchUrl,tF)))}function tV(e,t){let r=[],n={},i=tP(e)?tE:"swipe"===e?tD:tR(e)?tk:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(tP(e)&&"--double-tap"===o){n.doubleTap=!0;continue}let s=t[a+1];if(tP(e)&&"--button"===o&&void 0!==s){("primary"===s||"secondary"===s||"middle"===s)&&(n.clickButton=s),a+=1;continue}let l=i?.get(o);if(l&&void 0!==s){let e=tB(s);if(null!==e){n[l]=e,a+=1;continue}}if("swipe"===e&&"--pattern"===o&&void 0!==s){("one-way"===s||"ping-pong"===s)&&(n.pattern=s),a+=1;continue}r.push(o)}return{positionals:r,flags:n}}function tj(e){let t=[],r={};for(let n=0;n<e.length;n+=1){let i=e[n],a=e[n+1];if("--platform"===i&&void 0!==a){("ios"===a||"android"===a)&&(r.platform=a),n+=1;continue}if("--metro-host"===i&&void 0!==a){r.metroHost=a,n+=1;continue}if("--metro-port"===i&&void 0!==a){let e=tB(a);null!==e&&(r.metroPort=e),n+=1;continue}if("--bundle-url"===i&&void 0!==a){r.bundleUrl=a,n+=1;continue}if("--launch-url"===i&&void 0!==a){r.launchUrl=a,n+=1;continue}t.push(i)}return{positionals:t,flags:r}}function tB(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function tH(e){var t;let r=[],n={};for(let t of e){if("--relaunch"===t){n.relaunch=!0;continue}r.push(t)}let i=tj(r);return{positionals:i.positionals,flags:n,runtime:(t=i.flags).platform||t.metroHost||void 0!==t.metroPort||t.bundleUrl||t.launchUrl?i.flags:void 0}}function tK(e,t={}){let r=[e.command];if("snapshot"===e.command)e.flags?.snapshotInteractiveOnly&&r.push("-i"),e.flags?.snapshotCompact&&r.push("-c"),"number"==typeof e.flags?.snapshotDepth&&r.push("-d",String(e.flags.snapshotDepth)),e.flags?.snapshotScope&&r.push("-s",tO(e.flags.snapshotScope)),e.flags?.snapshotRaw&&r.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])r.push(tO(t));e.flags?.relaunch&&r.push("--relaunch"),tq(r,e.runtime)}else if("runtime"===e.command)!function(e,t,r={}){let n=t.positionals??[];for(let t of r.includeAllPositionals?n:n.slice(0,1))e.push(tL(t,tF));tq(e,t.flags)}(r,e,{includeAllPositionals:t.runtimeIncludeAllPositionals});else if("record"===e.command)!function(e,t){let[r,...n]=t.positionals??[];for(let t of(r&&e.push(tL(r,tF)),n))e.push(tO(t));"number"==typeof t.flags?.fps&&e.push("--fps",String(t.flags.fps)),"number"==typeof t.flags?.quality&&e.push("--quality",String(t.flags.quality)),t.flags?.hideTouches&&e.push("--hide-touches")}(r,e);else if("screenshot"===e.command){for(let t of e.positionals??[])r.push(tO(t));v(r,e.flags)}else{for(let t of e.positionals??[])r.push(tO(t));tG(r,e)}return r.join(" ")}class tW{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let r=n.dirname(t);i.existsSync(r)||i.mkdirSync(r,{recursive:!0});let a=function(e){var t=e,r=function(e){let t=[];for(let r of e.actions){if("snapshot"===r.command)continue;let n=function(e){let t=function(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>"string"==typeof e)?e.result.selectorChain:[];return t.length>0?t.join(" || "):void 0}(e);if(t&&tz(e.command))return tP(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=tA(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(!tz(t.command))return;let r=t.result?.refLabel;if("string"!=typeof r||0===r.trim().length)return;let n=r.trim();return{ts:t.ts,command:"snapshot",positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotCompact:!0,snapshotScope:n},result:{scope:n}}}(e,r);i&&t.push(i),t.push(r)}return t}(e);let n=[],i=t.device.kind?` kind=${t.device.kind}`:"";for(let e of(n.push(`context platform=${t.device.platform} device=${tT(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,tP(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(tO(r)),tJ(e,t),tG(e,t),e.join(" ");if(1===t.positionals.length)return e.push(tO(r)),tG(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(tO(r)),tJ(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(tO(n)),tG(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(tO(r)),e.push(tO(n)),n.startsWith("@")&&tJ(e,t),e.join(" ")}(t,r):void 0);return n||tK(e)}(e));return`${n.join("\n")}
2
+ `}(e);return i.writeFileSync(t,a),{written:!0,path:t}}catch(r){return M({level:"warn",phase:"session_script_write_failed",data:{session:e.name,path:t,error:r instanceof Error?r.message:String(r)}}),{written:!1}}}resolveScriptPath(e){if(e.saveScriptPath)return g(e.saveScriptPath,{cwd:void 0});i.existsSync(this.sessionsDir)||i.mkdirSync(this.sessionsDir,{recursive:!0});let t=tI(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return n.join(this.sessionsDir,`${t}-${r}.ad`)}}function tz(e){return tC(e)||"fill"===e||"get"===e}function tJ(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(tO(r))}class tX{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new tW(e)}get(e){return this.sessions.get(e)}set(e,t){this.sessions.set(e,t)}delete(e){return this.runtimeHints.delete(e),this.sessions.delete(e)}values(){return this.sessions.values()}toArray(){return Array.from(this.sessions.values())}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){this.runtimeHints.set(e,t)}clearRuntimeHints(e){return this.runtimeHints.delete(e)}recordAction(e,t){t.flags?.noRecord||(t.flags?.saveScript&&(e.recordSession=!0,"string"==typeof t.flags.saveScript&&(e.saveScriptPath=g(t.flags.saveScript,{cwd:void 0}))),e.actions.push({ts:Date.now(),command:t.command,positionals:t.positionals,runtime:t.runtime,flags:function(e){if(!e)return{};let t={};for(let r of tb)void 0!==e[r]&&(t[r]=e[r]);return t}(t.flags),result:t.result}),M({level:"debug",phase:"record_action",data:{command:t.command,session:e.name}}))}writeSessionLog(e){let t=this.scriptWriter.write(e);t.written&&M({level:"info",phase:"session_script_written",data:{session:e.name,path:t.path}})}defaultTracePath(e){let t=tI(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return n.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return n.join(this.sessionsDir,tI(e))}ensureSessionDir(e){let t=this.resolveSessionDir(e);return i.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return n.join(this.resolveSessionDir(e),"app.log")}resolveAppLogPidPath(e){return n.join(this.resolveSessionDir(e),"app-log.pid")}static expandHome(e,t){return g(e,{cwd:t})}}function tZ(e){return n.join(e,"runner.log")}function tY(e,t){let r=tI(t&&t.length>0?t:"unknown");return n.join(e,"requests",`${r}.ndjson`)}let tQ="app-log.pid";function t0(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 t1(e,t){if(!e)return;let r=n.dirname(e);i.existsSync(r)||i.mkdirSync(r,{recursive:!0});let a={pid:t,startTime:E(t)??void 0,command:D(t)??void 0};i.writeFileSync(e,`${JSON.stringify(a)}
3
+ `)}function t2(e){if(e&&i.existsSync(e))try{i.unlinkSync(e)}catch{}}let t3=new Set,t4=new Map,t5="request_canceled",t8="request canceled";function t6(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 t9(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++}}(t4);let t=new AbortController;t4.set(e,t),t3.has(e)&&t.abort()}function t7(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++}}(t3),t3.add(e),t4.get(e)?.abort())}function re(e){e&&(t3.delete(e),t4.delete(e))}function rt(e){return!!e&&t3.has(e)}function rr(e){if(e)return t4.get(e)?.signal}function rn(){return new $("COMMAND_FAILED",t8,{reason:t5})}function ri(e){if(rt(e))throw rn()}function ra(e){return e instanceof $&&"COMMAND_FAILED"===e.code&&(e.details?.reason===t5||e.message===t8)}let ro=new Map;function rs(e){let r=t.randomUUID(),n=setTimeout(()=>{rl(r)},9e5);return n.unref(),ro.set(r,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),r}function rl(e){let t=ro.get(e);if(t&&(clearTimeout(t.timer),ro.delete(e),t.deleteAfterDownload))try{i.rmSync(t.artifactPath,{force:!0})}catch{}}let rc=new Map;function rd(e,t){let r=rc.get(e);if(!r)throw new $("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new $("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function ru(e){let t=rc.get(e);t&&(clearTimeout(t.timer),rc.delete(e),i.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function rp(e){let t=await rf(e);await G("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=n.join(e.tempDir,t);if(!i.existsSync(r))throw new $("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function rf(e){let t=await G("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new $("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 $("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(rm),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 $("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new $("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 $("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 $("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 $("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await G("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new $("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rm(e){if(e.includes("\0"))throw new $("INVALID_ARGS",`Invalid archive entry: ${e}`);if(n.posix.isAbsolute(e))throw new $("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=n.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new $("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function rh(e,t){return new Promise((r,n)=>{let a,o=!1,s=0,l=i.createWriteStream(t),c=e=>{if(!o){if(o=!0,a&&clearTimeout(a),e)return void rw(l,t).finally(()=>n(e));r()}},d=()=>{a&&clearTimeout(a),a=setTimeout(()=>{let t=new $("COMMAND_FAILED","Artifact transfer timed out due to inactivity",{timeoutMs:6e4});"destroy"in e&&"function"==typeof e.destroy&&e.destroy(t),u.destroy(t),c(t)},6e4)},u=new p({transform(e,t,r){d();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new $("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{c(new $("COMMAND_FAILED","Artifact transfer was interrupted"))}),d(),f(e,u,l).then(()=>c(),e=>c(e))})}async function rw(e,t){if(e.destroy(),!e.closed)try{await u(e,"close")}catch{}await i.promises.rm(t,{force:!0}).catch(()=>{})}async function rg(e){let t,r=e.headers["x-artifact-type"],a=e.headers["x-artifact-filename"];if(!r||!a)throw new $("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new $("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 $("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let o=function(e){let t=e.trim(),r=n.basename(t);if(!r||"."===r||".."===r)throw new $("INVALID_ARGS",`Invalid artifact filename: ${e}`);return r}(a),s=(t=function(e){let t=e?.trim();if(!t)return"request";let r=t.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return r.length>0?r.slice(0,48):"request"}("upload"),i.mkdtempSync(n.join(d.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===r){let t=n.join(s,o);return await rh(e,t),{artifactPath:t,tempDir:s}}let t=n.join(s,"artifact.tar");await rh(e,t);let a=await rp({archivePath:t,tempDir:s,platform:"ios",expectedRootName:o});return i.rmSync(t,{force:!0}),{artifactPath:a,tempDir:s}}catch(e){throw i.rmSync(s,{recursive:!0,force:!0}),e}}let rv=new m;async function ry(e,t){return await rv.run(e,t)}function rS(e){rv.getStore()?.(e)}let r_=new Set(["agent_device.command","agent-device.command"]),rI=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"]),rA={"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"},rx=new Set([...r_,...rI,...rb,...Object.keys(rA)]);function rN(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rM(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function rE(e,t){e.destroyed||(e.write(ee(t)),e.end())}function rD(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rk(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 rP(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rC(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rR(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new $("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function rO(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new $("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function rT(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=L(new $("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rN(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=L(new $(O(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rN(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=K(r.tenantId);if(!e){let e=L(new $("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rN(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rL(){let e,t=process.env.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let r=process.env.AGENT_DEVICE_HTTP_AUTH_EXPORT||"default",i=n.isAbsolute(t)?t:n.resolve(t);try{e=await import(c(i).href)}catch(e){throw new $("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:i,error:e instanceof Error?e.message:String(e)})}let a=e[r];if("function"!=typeof a)throw new $("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:i,exportName:r});return a}async function r$(e){let t=await rL(),{handleRequest:r,token:n}=e;return s.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!0}));return}if("POST"===e.method&&"/upload"===e.url)return void rF(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void rU(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||rM(i,rN(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rM(i,rN(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rM(i,rN(n.id??null,-32600,"Invalid Request"),400);if(!rx.has(n.method))return void rM(i,rN(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rM(i,rN(n.id??null,-32602,"Invalid params"),400);try{var s;let a=n.params,l=function(e,t,r){if(r_.has(e))return{token:rk(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(rI.has(e)){let e,n=rP(t,"platform");if("ios"!==n&&"android"!==n)throw new $("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:rk(t,r),session:rP(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rP(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new $("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new $("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 $("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 $("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 $("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=rR(e,"owner"),n=rR(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new $("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new $("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new $("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:rO(e,"artifactId")}:(a&&(t=rO(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rR(e,"artifactName")})}(t);throw new $("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:rC(t,"retentionMs")}}}if(rb.has(e)){let e=rP(t,"materializationId")?.trim();if(!e)throw new $("INVALID_ARGS","Invalid params: materializationId is required");return{token:rk(t,r),session:rP(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rP(t,"requestId"),materializationId:e}}}let n=rA[e];if(n)return{token:rk(t,r),session:rP(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rP(t,"tenantId")??rP(t,"tenant"),runId:rP(t,"runId"),leaseId:rP(t,"leaseId"),leaseTtlMs:rC(t,"ttlMs"),leaseBackend:rP(t,"backend")}};throw new $("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(s=n.method,r_.has(s)&&("string"!=typeof l.command||0===l.command.length))return void rM(i,rN(n.id??null,-32602,"Invalid params: command is required"),400);o=t6(l.meta?.requestId,n.id),l.meta={...l.meta,requestId:o},t9(o);let c=()=>{i.writableFinished||t7(o)};e.on("aborted",c),i.on("close",c);let d=await rT(t,{headers:e.headers,rpcRequest:n,daemonRequest:l});if(!d.ok)return void rM(i,d.response,d.statusCode);if(d.tenantId&&(l.meta={...l.meta,tenantId:d.tenantId,sessionIsolation:l.meta?.sessionIsolation??l.flags?.sessionIsolation??"tenant"}),W(l)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await ry(e=>{!i.destroyed&&i.write(Q(e))},async()=>await r(l)),t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rN(n.id??null,-32e3,e.error.message,e.error);rE(i,t);return}let u=await r(l);if(u.ok)return void rM(i,{jsonrpc:"2.0",id:n.id??null,result:u});rM(i,rN(n.id??null,-32e3,u.error.message,u.error),rD(u.error.code))}catch(t){let e=L(t);if(i.headersSent)return void rE(i,rN(n.id??null,-32e3,e.message,e));rM(i,rN(n.id??null,-32e3,e.message,e),rD(e.code))}finally{re(o)}})})}async function rF(e,r,n,i){try{var a;let o,s,l=await rG({req:e,res:r,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let c=await rg(e),d=(a={artifactPath:c.artifactPath,tempDir:c.tempDir,tenantId:l.tenantId},o=t.randomUUID(),(s=setTimeout(()=>{ru(o)},3e5)).unref(),rc.set(o,{artifactPath:a.artifactPath,tempDir:a.tempDir,tenantId:a.tenantId,timer:s}),o);r.statusCode=200,r.setHeader("content-type","application/json"),r.end(JSON.stringify({ok:!0,uploadId:d}))}catch(e){rq(r,L(e))}}async function rU(e,t,r,n){let a=e.url?.slice("/artifacts/".length)??"";if(!a){t.statusCode=400,t.end("Missing artifact id");return}try{let o=await rG({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[a]}});if(!o)return;let s=function(e,t){let r=ro.get(e);if(!r)throw new $("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new $("UNAUTHORIZED","Artifact belongs to a different tenant");if(!i.existsSync(r.artifactPath))throw rl(e),new $("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(a,o.tenantId),l=i.createReadStream(s.artifactPath);t.statusCode=200,t.setHeader("content-type","application/octet-stream"),s.fileName&&t.setHeader("content-disposition",`attachment; filename="${s.fileName.replace(/"/g,"")}"`),l.on("error",e=>{if(t.headersSent)t.destroy(e);else{let r=L(e);t.statusCode=rD(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rl(a)}),l.pipe(t)}catch(e){rq(t,L(e))}}async function rG(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=rk({},n.headers),c=(t=l,(r=o)&&t!==r?L(new $("UNAUTHORIZED","Invalid token")):null);if(c)return rq(i,c),null;let d=await rT(a,{headers:n.headers,rpcRequest:{jsonrpc:"2.0",id:null,method:"agent_device.command"},daemonRequest:{token:l,session:"default",command:s.command,positionals:s.positionals}});return d.ok?{tenantId:d.tenantId}:(i.statusCode=d.statusCode,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!1,error:d.response.error?.data?.message??d.response.error?.message??"Unauthorized"})),null)}function rq(e,t){e.statusCode=rD(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function rV(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function rj(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function rB(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 $("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class rH{leases=new Map;runBindings=new Map;maxActiveSimulatorLeases;defaultLeaseTtlMs;minLeaseTtlMs;maxLeaseTtlMs;now;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.defaultLeaseTtlMs=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,this.minLeaseTtlMs=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):5e3,this.maxLeaseTtlMs=Number.isInteger(e.maxLeaseTtlMs)?Math.max(this.minLeaseTtlMs,Number(e.maxLeaseTtlMs)):6e5,this.now=e.now??(()=>Date.now())}allocateLease(e){let r=rB(e.backend),n=K(e.tenantId);if(!n)throw new $("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=rV(e.runId);if(!i)throw new $("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");this.cleanupExpiredLeases();let a=this.resolveLeaseTtlMs(e.ttlMs),o=this.bindingKey(n,i,r),s=this.runBindings.get(o);if(s){let e=this.leases.get(s);if(e)return this.refreshLease(e,a);this.runBindings.delete(o)}this.enforceCapacity(r);let l=this.now(),c={leaseId:t.randomBytes(16).toString("hex"),tenantId:n,runId:i,backend:r,createdAt:l,heartbeatAt:l,expiresAt:l+a};return this.leases.set(c.leaseId,c),this.runBindings.set(o,c.leaseId),{...c}}heartbeatLease(e){let t=rj(e.leaseId);if(!t)throw new $("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);if(!r)throw new $("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=rj(e.leaseId);if(!t)throw new $("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=rB(e.backend),r=K(e.tenantId);if(!r)throw new $("INVALID_ARGS","tenant isolation requires tenant id.");let n=rV(e.runId);if(!n)throw new $("INVALID_ARGS","tenant isolation requires run id.");let i=rj(e.leaseId);if(!i)throw new $("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new $("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==r||a.runId!==n)throw new $("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 $("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 $("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=K(t),i=rV(r);if(t&&!n)throw new $("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&!i)throw new $("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 $("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}function rK(e){return e}function rW(e){return"apple"===e||"ios"===e||"macos"===e}function rz(e,t){return!t||("apple"===t?rW(e):e===t)}function rJ(e){let{simulatorSetPath:t,platform:r,target:n}=e;if(t&&"macos"!==r&&"desktop"!==n)return t}async function rX(e,t,r={}){let n=e,i=e=>e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim();if(t.platform&&(n=n.filter(e=>rz(e.platform,t.platform))),t.target&&(n=n.filter(e=>(e.target??"mobile")===t.target)),t.udid){let e=n.find(e=>e.id===t.udid&&rW(e.platform));if(!e)throw new $("DEVICE_NOT_FOUND",`No Apple device with UDID ${t.udid}`);return e}if(t.serial){let e=n.find(e=>e.id===t.serial&&"android"===e.platform);if(!e)throw new $("DEVICE_NOT_FOUND",`No Android device with serial ${t.serial}`);return e}if(t.deviceName){let e=i(t.deviceName),r=n.find(t=>i(t.name)===e);if(!r)throw new $("DEVICE_NOT_FOUND",`No device named ${t.deviceName}`);return r}let a=n[0];if(void 0!==a&&1===n.length)return a;if(0===n.length){var o;let e=r.simulatorSetPath;if(e&&(!(o=t.platform)||"apple"===o||"ios"===o))throw new $("DEVICE_NOT_FOUND","No devices found in the scoped simulator set",{simulatorSetPath:e,hint:`The simulator set at "${e}" appears to be empty. Create a simulator first:
4
+ xcrun simctl --set "${e}" create "iPhone 16" com.apple.CoreSimulator.SimDeviceType.iPhone-16 com.apple.CoreSimulator.SimRuntime.iOS-18-0`,selector:t});throw new $("DEVICE_NOT_FOUND","No devices found",{selector:t})}let s=n.filter(e=>"device"!==e.kind);s.length>0&&(n=s);let l=n.filter(e=>e.booted),c=l[0];if(void 0!==c&&1===l.length)return c;let d=l[0]??n[0];if(void 0===d)throw new $("DEVICE_NOT_FOUND","No devices found",{selector:t});return d}async function rZ(e){var t;if("macos"===(t=e).platform||"apple"===t.platform&&"desktop"===t.target){let{listMacosDevices:e}=await import("./devices~2.js");return await e()}if("linux"===e.platform){let{listLinuxDevices:e}=await import("./devices~1.js");return await e()}if("android"===e.platform){let{listAndroidDevices:t}=await import("./8806.js");return await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0})}if(e.platform){let{listAppleDevices:t}=await import("./devices.js");return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}let r=[];try{let{listAndroidDevices:t}=await import("./8806.js");r.push(...await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0}))}catch{}try{let{listAppleDevices:t}=await import("./devices.js");r.push(...await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid}))}catch{}try{let{listLinuxDevices:e}=await import("./devices~1.js");r.push(...await e())}catch{}return r}let rY=new m,rQ=new m;async function r0(e,t,r){var n,i;let a=await r1(e,t,r);if(n=t,i=a,!r2(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 $("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function r1(e,t,r){try{return await rX(e,t,r)}catch(e){var n;if(n=e,!r2(t)&&n instanceof $&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function r2(e){return!!(e.udid||e.serial||e.deviceName)}async function r3(e){let t=rK(e.platform),r=rJ({simulatorSetPath:er(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=eg(e.androidDeviceAllowlist),i=function(e){let{flags:t,normalizedPlatform:r,iosSimulatorSetPath:n,androidSerialAllowlist:i}=e;return JSON.stringify({platform:r,target:t.target,device:t.device,udid:t.udid,serial:t.serial,iosSimulatorSetPath:n,androidSerialAllowlist:i?Array.from(i).sort():void 0})}({flags:e,normalizedPlatform:t,iosSimulatorSetPath:r,androidSerialAllowlist:n}),a={platform:t,target:e.target,cacheHit:!1};return await x("resolve_target_device",async()=>{let o=function(e){let t=rY.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 $("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await r9({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return r7(s)?ne(i,await r0(l,s,{simulatorSetPath:r})):ne(i,await rX(l,s,{simulatorSetPath:r}));let c=await rZ({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return r7(s)?ne(i,await r0(c,s,{simulatorSetPath:r})):ne(i,await rX(c,s,{simulatorSetPath:r}))},a)}async function r4(e){return rY.getStore()?await e():await rY.run(new Map,e)}async function r5(e,t){return e?await rQ.run(e,t):await t()}async function r8(e,t){return await r5(e,async()=>await r4(t))}async function r6(e){return await r9(e)??await rZ(e)}async function r9(e){let t=rQ.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function r7(e){return!!e.platform&&"android"!==e.platform&&"linux"!==e.platform}function ne(e,t){return rY.getStore()?.set(e,{...t}),t}let nt=["platform","target","device","udid","serial"],nr=[...nt,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function nn(e){return"string"==typeof e&&e.trim().length>0}function ni(e,t){return!!e&&t.some(t=>nn(e[t]))}let na={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},no=function(e){let t=new Map,r=new Map;for(let n of e){if(t.has(n.command))throw Error(`Duplicate daemon command descriptor: ${n.command}`);if(t.set(n.command,n),"generic"!==n.route){let e=r.get(n.route)??[];e.push(n.command),r.set(n.route,e)}}return{descriptorsByCommand:t,handlerCommandsByRoute:r}}([...nc("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},e_.leaseAllocate,e_.leaseHeartbeat,e_.leaseRelease),nl(e_.sessionList,"session",{sessionKind:"inventory",...na}),nl(eS.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...na}),nl(eS.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...nc("session",{sessionKind:"state"},eS.boot,eS.appState),...nc("session",{sessionKind:"observability"},eS.perf,eS.logs,eS.network),...nc("session",{sessionKind:"replay"},eS.replay,eS.test),nl(e_.runtime,"session"),nl(eS.clipboard,"session",{replayScopedAction:!0}),nl(eS.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...nc("session",{},eS.install,eS.reinstall,e_.installSource),nl(e_.releaseMaterializedPaths,"session",na),...nc("session",{},eS.push,eS.triggerAppEvent),nl(eS.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...nc("session",{},eS.prepare,eS.batch),nl(eS.close,"session",{allowInvalidRecording:!0}),...nc("snapshot",{replayScopedAction:!0},eS.snapshot,eS.diff,eS.wait,eS.alert,eS.settings),nl(eS.reactNative,"reactNative",{replayScopedAction:!0}),nl(eS.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),nl(eS.trace,"recordTrace"),nl(eS.find,"find",{replayScopedAction:!0}),...nc("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},eS.click,eS.fill,eS.longPress,eS.press,eS.type),...nc("interaction",{replayScopedAction:!0},eS.get,eS.is),...nc("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},eS.back,eS.gesture,eS.home,eS.rotate,eS.scroll,eS.swipe,"pinch"),nl(eS.focus,"generic",{androidBlockingDialogGuard:!0}),nl(eS.screenshot,"generic",{replayScopedAction:!0}),...nc("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function ns(e){return nd(e)?.sessionKind}function nl(e,t,r={}){return{command:e,route:t,...r}}function nc(e,t,...r){return r.map(r=>nl(r,e,t))}function nd(e){return no.descriptorsByCommand.get(e)}let nu=[{resolverKey:"androidAdbProvider",resolve(e,t){let r=e.androidAdbProvider;if(!r||"android"!==t.device.platform)return{};let n=r(t),i="function"==typeof n?n:n?.exec;return{androidAdb:{provider:n,executor:i,serial:t.device.id}}},async appendWrapper(e,t){if(!e.androidAdb?.provider)return;let{withAndroidAdbProvider:r}=await import("./9639.js");ng(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&rW(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(tg);ng(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&&rW(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(ty);ng(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(t_);ng(t,e.linuxTool,r)}},{resolverKey:"appLogProvider",resolve(e,t){let r=e.appLogProvider;return r?{appLog:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appLog?.provider)return;let{withAppLogProvider:r}=await Promise.resolve(tm);ng(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");ng(t,e.recording,r)}}];async function np(e,t){let r=await nf(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await nw(r);return await nv(i,async()=>await t(n))}async function nf(e){var t,r,n;if(t=e.providers,!nu.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 nu.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function nm(e,t){return t?await nh(e,t):!function(e){var t;let r;return"test"===(t=e).command&&("number"==typeof t.flags?.shardAll||"number"==typeof t.flags?.shardSplit)||!ni(e.flags,nt)&&!("function"==typeof(r=nd(e.command)?.allowSessionlessDefaultDevice)&&r(e))}(e)?await r3(e.flags??{}):void 0}async function nh(e,t){return!function(e){return nd(e.command)?.preferExplicitDeviceOverExistingSession===!0&&ni(e.flags,nt)}(e)?t.device:await r3(e.flags??{})}async function nw(e){let t=[];for(let r of nu)await r.appendWrapper(e,t);return t}function ng(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function nv(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function ny(e,t){switch(e.platform){case"android":{let{createAndroidInteractor:t}=await import("./android.js");return t(e)}case"linux":{let{createLinuxInteractor:e}=await import("./linux.js");return e()}case"ios":case"macos":{let{createAppleInteractor:r}=await import("./apple.js");return r(e,t)}default:throw new $("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let nS=/^[A-Za-z0-9_.:-]{1,64}$/,n_="--launch-console is supported only for iOS simulator app launches",nI="--launch-console requires a direct app launch and cannot be used with URL opens";function nb(e){return e?.clickButton??"primary"}function nA(e){return"primary"===e.button?null:"click"!==e.commandLabel?new $("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new $("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new $("UNSUPPORTED_OPERATION","click --button middle is not supported by the macOS runner yet"):"number"==typeof e.count||"number"==typeof e.intervalMs||"number"==typeof e.holdMs||"number"==typeof e.jitterPx||!0===e.doubleTap?new $("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function nx(e){return"primary"===e?{}:{button:e}}let nN=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function nM(e){return"ios"===e.platform&&"tv"!==e.target}async function nE(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await eW(t)}async function nD(e,t){let{x:r,y:n}=nL(t,"longpress requires x y [durationMs]",{hint:"Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i -c, use the target rect center as x y, then retry longpress x y durationMs."}),i=t[2]?Number(t[2]):void 0;return await e.longPress(r,n,i),{x:r,y:n,durationMs:i,...eJ(`Long pressed (${r}, ${n})`)}}async function nk(e,t){let{x:r,y:n}=nL(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...eJ(`Focused (${r}, ${n})`)}}async function nP(e,t,r){let n=eb(t[0]);if(n)throw new $("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 $("INVALID_ARGS","type requires text");let a=eq(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...eJ(n3("Typed",i))}}async function nC(e,t,r){if(r?.directElementSelector)return await nR(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 $("INVALID_ARGS","fill requires x y text");let o=eq(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...eJ(n3("Filled",a))}}async function nR(e,t,r,n){if(!e.fillElementSelector)throw new $("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new $("INVALID_ARGS","fill requires text");let a=eq(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...eJ(n3("Filled",i))}}async function nO(e,t,r,n){var i,a,o,s;if(n?.directElementSelector&&"ios"===e.platform)return await nT(t,n.directElementSelector);let{x:l,y:c}=nL(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await n$(l,c,n);let d=nb(n);if("primary"!==d)return await nF(e,l,c,d,n);let u=(s=n,{count:nG(s?.count,1,"count",1,200),intervalMs:nG(s?.intervalMs,0,"interval-ms",0,1e4),holdMs:nG(s?.holdMs,0,"hold-ms",0,1e4),jitterPx:nG(s?.jitterPx,0,"jitter-px",0,100),doubleTap:!!s?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new $("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new $("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(u),i=u.count,a=u.holdMs,o=u.jitterPx,rW(e.platform)&&i>1&&0===a&&0===o)?await nq(e,l,c,u,n):await nV(t,l,c,u)}async function nT(e,t){if(!e.tapElementSelector)throw new $("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...eJ(`Tapped ${t.raw}`)}}function nL(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new $("INVALID_ARGS",t,r);return{x:n,y:i}}async function n$(e,t,r){let n=nb(r);if("primary"!==n)throw new $("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(th);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...eJ(n1({x:e,y:t}))}}async function nF(e,t,r,n,i){if(function(e,t,r){let n=nA({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 nU(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(tw);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},nj(i)),{x:t,y:r,button:n,...eJ(n1({x:t,y:r,button:n}))}}async function nU(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,...eJ(n1({x:e,y:t,button:r}))}}function nG(e,t,r,n,i){return eq(void 0===e?t:e,r,n,i)}async function nq(e,t,r,n,i){let{runIosRunnerCommand:a}=await Promise.resolve(tw),o=await a(e,{command:"tapSeries",x:t,y:r,count:n.count,intervalMs:n.intervalMs,doubleTap:n.doubleTap,appBundleId:i?.appBundleId},nj(i));return{x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,timingMode:"runner-series",...o,...eJ(n1({x:t,y:r}))}}async function nV(e,t,r,n){let i;return await nE(n.count,n.intervalMs,async a=>{let[o,s]=function(e,t){if(t<=0)return[0,0];let[r,n]=nN[e%nN.length];return[r*t,n*t]}(a,n.jitterPx),l=t+o,c=r+s;if(n.doubleTap){i??=await e.doubleTap(l,c)??void 0;return}n.holdMs>0?i??=await e.longPress(l,c,n.holdMs)??void 0:i??=await e.tap(l,c)??void 0}),eX({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},n1({x:t,y:r}))}function nj(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId}}async function nB(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 $("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await nK({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function nH(e,t,r,n){let i=eK(r[0]),a=r[1]?Number(r[1]):300,o=eV((await t.snapshot({appBundleId:n?.appBundleId,compact:!0})).nodes??[]);if(!o)throw new $("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=eA(i,o,{platform:e.platform});return await nK({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function nK(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:c}=e,d=eq(l,"durationMs",16,1e4),u=eq(n?.count??1,"count",1,200),p=eq(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if("one-way"!==f&&"ping-pong"!==f)throw new $("INVALID_ARGS",`Invalid pattern: ${f}`);if(rW(t.platform)&&u>1){let{runIosRunnerCommand:e}=await Promise.resolve(tw),r=await e(t,{command:"dragSeries",x:i,y:a,x2:o,y2:s,durationMs:d,count:u,pauseMs:p,pattern:f,...nM(t)?{synthesized:!0}:{},appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId});return{x1:i,y1:a,x2:o,y2:s,...c?{preset:c}:{},durationMs:d,effectiveDurationMs:d,timingMode:"runner-series",count:u,pauseMs:p,pattern:f,...r,...eJ(n2(u,f))}}return await nE(u,p,async e=>{"ping-pong"===f&&e%2==1?await r.swipe(o,s,i,a,d):await r.swipe(i,a,o,s,d)}),eX({x1:i,y1:a,x2:o,y2:s,...c?{preset:c}:{},durationMs:d,effectiveDurationMs:d,timingMode:"direct",count:u,pauseMs:p,pattern:f},c?`Swiped ${c}`:n2(u,f))}async function nW(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 $("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=eq(t[4]?Number(t[4]):500,"durationMs",16,1e4),s=r+i,l=n+a,c=await e.pan(r,n,s,l,o);return{x:r,y:n,dx:i,dy:a,x2:s,y2:l,durationMs:o,...c??{},...eJ(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function nz(e,t){let r=function(e,t){if("up"===e||"down"===e||"left"===e||"right"===e)return e;throw new $("INVALID_ARGS",`${t} must be up, down, left, or right`)}(t[0],"fling direction"),n=Number(t[1]),i=Number(t[2]);if(![n,i].every(Number.isFinite))throw new $("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new $("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=eq(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,...eJ(`Flung ${r}`)}}async function nJ(e,t,r){var n;let i=t[0],a=t[1]?Number(t[1]):void 0,o=r?.pixels;if(!i)throw new $("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new $("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==o)throw new $("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:eN(n)},l={},c=0;if(s.edge){let t=s.edge,n=await eG({edge:t,captureState:async n=>await nX(e,r,t,n),scroll:async()=>await e.scroll(s.direction,{amount:a,pixels:o})});l=n.result??{},c=n.passes}else l=await e.scroll(s.direction,{amount:a,pixels:o}),c=1;return eX({direction:s.direction,...s.edge?{edge:s.edge,passes:c}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},ek(s.direction,s.edge,c,a,o))}async function nX(e,t,r,n){if("function"!=typeof e.snapshot)throw new $("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await eT({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,compact:!0,scope:e})).nodes??[]})}async function nZ(e,t,r,n){if("tv"===e.target)throw new $("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new $("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 $("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...eJ(`Pinched to scale ${i}`)}}async function nY(e,t,r){if("tv"===e.target)throw new $("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new $("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 $("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 $("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 $("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 $("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,...eJ(`Rotated gesture ${n} degrees`)}}async function nQ(e,t,r){if("tv"===e.target)throw new $("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new $("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 $("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new $("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:eq(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...eJ(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function n0(e,t,r){let{x:n,y:i}=nL(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(tS);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(th);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(tw),o=await a(e,{command:"readText",x:n,y:i,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function n1(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function n2(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function n3(e,t){return`${e} ${Array.from(t).length} chars`}function n4(e,t){let r,n=t?.subject??"Payload",a=e.trim();if(!a)throw new $("INVALID_ARGS",`${n} cannot be empty`);let o=t?.expandPath?t.expandPath(a,t.cwd):a;try{if(!i.statSync(o).isFile())throw new $("INVALID_ARGS",`${n} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof $)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new $("INVALID_ARGS",`${n} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new $("COMMAND_FAILED",`Unable to read ${n} file: ${o}`,{cause:String(t)})}if((r=a.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:a};throw new $("INVALID_ARGS",`${n} file not found: ${o}`)}async function n5(e){let t=n4(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await n8(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new $("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof $)throw t;throw new $("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function n8(e){try{return await o.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new $("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new $("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new $("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new $("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function n6(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},o=await ny(e,a);return M({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await x("platform_command",async()=>await n9(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function n9(e,t,r,n,i,a,o){switch(r){case"open":return await n7(e,t,n,a);case"close":{let e=n[0];if(!e)return{closed:"session",...eJ("Closed session")};return await t.close(e),{app:e,...eJ(`Closed: ${e}`)}}case"press":return await nO(e,t,n,a);case"swipe":return await nB(e,t,n,a);case"swipe-preset":return await nH(e,t,n,a);case"pan":return await nW(t,n);case"fling":return await nz(t,n);case"longpress":return await nD(t,n);case"focus":return await nk(t,n);case"type":return await nP(t,n,a);case"fill":return await nC(t,n,a);case"scroll":return await nJ(t,n,a);case"pinch":return await nZ(e,t,n,a);case"rotate-gesture":return await nY(e,t,n);case"transform-gesture":return await nQ(e,t,n);case"trigger-app-event":return await ie(e,t,n,a);case"screenshot":return await it(t,n,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...eJ("Back")};case"home":return await t.home(),{action:"home",...eJ("Home")};case"rotate":{let e=eZ(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...eJ(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...eJ("Opened app switcher")};case"clipboard":return await ir(t,n);case"keyboard":return await ii(e,n,a,o);case"settings":return await is(e,t,n,a);case"push":return await il(e,n,a);case"snapshot":return await ic(t,a);case"read":return await n0(e,n,a);default:throw new $("INVALID_ARGS",`Unknown command: ${r}`)}}async function n7(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new $("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new $("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new $("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...eJ("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new $("UNSUPPORTED_OPERATION",n_);if("linux"===e.platform&&s&&s.length>0)throw new $("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(ev(i))throw new $("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!ev(a))throw new $("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new $("INVALID_ARGS",nI);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...eJ(`Opened: ${i}`)}}if(o&&ev(i))throw new $("INVALID_ARGS",nI);if(n?.clearAppState){if(ev(i))throw new $("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}:{},...eJ(`Opened: ${i}`)}}async function ie(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new $("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!nS.test(t))throw new $("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 $("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 $("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 $("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof $)throw t;throw new $("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 $("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 $("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",...eJ(`Triggered app event: ${i}`)}}async function it(e,t,r,i){let a=t[0]??r??`./screenshot-${Date.now()}.png`;await o.mkdir(n.dirname(a),{recursive:!0});let s=y(i);return await e.screenshot(a,{appBundleId:i?.appBundleId,fullscreen:s.fullscreen,stabilize:s.stabilize,surface:i?.surface}),{path:a,...eJ(`Saved screenshot: ${a}`)}}async function ir(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new $("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new $("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new $("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,...eJ("Clipboard updated")}}async function ii(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!eM(i))throw new $("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new $("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await ia(e,i);if("ios"===e.platform)return await io(e,i,r,n);throw new $("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function ia(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...eJ("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./8133.js"),r=await t(e);return{platform:"android",action:"dismiss",attempts:r.attempts,wasVisible:r.wasVisible,dismissed:r.dismissed,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}let{getAndroidKeyboardState:r}=await import("./8133.js"),n=await r(e);return{platform:"android",action:"status",visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function io(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new $("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(tw),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...eJ("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(tw),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...eJ(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function is(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new $("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new $("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");M({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?eX({setting:i,state:"clear",...s},id(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...eJ(`Cleared user data for ${r}`)}}if(!a)throw new $("INVALID_ARGS","settings requires setting state");let l="location"===i&&"set"===a,c=("permission"===i||l?r[4]:r[2])??n?.appBundleId,d="permission"===i?{permissionTarget:o,permissionMode:s}:l?{latitude:ez(o,"latitude"),longitude:ez(s,"longitude")}:void 0;M({level:"debug",phase:"settings_apply",data:l?{setting:i,state:a,latitude:o,longitude:s,platform:e.platform}:"permission"===i?{setting:i,state:a,permissionTarget:o,permissionMode:s,platform:e.platform}:{setting:i,state:a,appBundleId:c,platform:e.platform}});let u=await t.setSetting(i,a,c,d);return u&&"object"==typeof u?eX({setting:i,state:a,...u},id(u)??`Updated setting: ${i}`):{setting:i,state:a,...eJ(`Updated setting: ${i}`)}}async function il(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new $("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await n5(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...eJ(`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,...eJ(`Pushed notification to ${n}`)}}async function ic(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,compact:t?.snapshotCompact,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,surface:t?.surface})}function id(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let iu=e=>"macos"!==e.platform,ip=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,im=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,ih={device:!0},iw={},ig={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ih},iv={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw,supports:iu},iy={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw,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:iw,supports:e=>"android"===e.platform||ip(e),unsupportedHint:im},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw,supports:e=>"android"===e.platform||ip(e),unsupportedHint:im},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw,supports:e=>"android"===e.platform||ip(e),unsupportedHint:im},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw,supports:iu},open:ig,close:ig,reinstall:iv,install:iv,"install-from-source":iv,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ih},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw,supports:iu},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ih},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ih,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:iw,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:ih},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},snapshot:ig,diff:ig,screenshot:ig,wait:ig,get:ig,find:ig,is:ig,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ih},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ih,supports:iu},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ih},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ih},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ih},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw,supports:iu},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw,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:ih},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ih},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw,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:iw},type:ig};function iS(e,t){let r=iy[e];if(!r)return!0;let n=rW(t.platform)?r.apple:"linux"===t.platform?r.linux:r.android;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}function i_(e,t=e=>e){let r=new m;return{resolve:n=>n?t(n):r.getStore()??e,run:async(e,n)=>e?await r.run(t(e),n):await n(),hasScope:()=>!!r.getStore()}}function iI(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function ib(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 $("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 $("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 $("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 $("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 $("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await iA(e,t,r)}}async function iA(e,t,r){let i=["/Applications","/System/Applications",n.join(d.homedir(),"Applications")],a=new Set;for(let t of i){let r=await o.stat(t).catch(()=>null);if(!r?.isDirectory())continue;let n=await e("find",[t,"-maxdepth","4","-type","d","-name","*.app"],{allowFailure:!0});if(0===n.exitCode)for(let e of n.stdout.split("\n")){let t=e.trim();t&&a.add(t)}}return iI((await Promise.all(Array.from(a).map(async e=>{let r=await ix(e,t).catch(()=>({})),i=r.bundleId;return i?{bundleId:i,name:r.appName??n.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function ix(e,t){for(let r of[n.join(e,"Contents","Info.plist"),n.join(e,"Info.plist")]){let e=await t(r),n=iN(e,"CFBundleIdentifier"),i=iN(e,"CFBundleDisplayName"),a=iN(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function iN(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let iM={runCommand:G,simctl:{run:async(e,t)=>await G("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await G("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await iL(G,e)},macosHost:ib(G,async e=>await iL(G,e)),whichCommand:j},iE=i_(iM,function(e){return"function"==typeof e?iD({runCommand:e}):iD(e)});function iD(e={}){let t={...iM,...e},r=e.plist??{readJson:async e=>await iL(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??ib(t.runCommand,async e=>await r.readJson(e))}}function ik(e){return iE.resolve(e)}async function iP(e,t){return await iE.run(e,t)}function iC(){return iE.hasScope()}async function iR(e,t,r){return await ik().runCommand(e,t,r)}async function iO(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 iR("xcrun",e,t)}async function iT(e){return await ik().plist?.readJson(e)??null}async function iL(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 i$="agent-device-macos-helper",iF="AGENT_DEVICE_MACOS_HELPER_BIN",iU=n.join(d.homedir(),".agent-device","macos-helper","current"),iG=n.join(iU,"manifest.json"),iq=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function iV(e){let t=e.trim();if(!iq.test(t))throw new $("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function ij(e,t){t.bundleId&&e.push("--bundle-id",iV(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iB(){return function(e){let t=n.dirname(e);for(;;){let e=n.join(t,"macos-helper");if(a(n.join(e,"Package.swift")))return e;let r=n.dirname(t);if(r===t)break;t=r}throw new $("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(l(import.meta.url))}async function iH(e){let t=await o.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=n.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await iH(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function iK(e){let t=await iH(e),i=r("sha256");for(let r of t)i.update(n.relative(e,r)),i.update("\0"),i.update(await o.readFile(r)),i.update("\0");let a=await iR("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return i.update("swift-version"),i.update("\0"),i.update(a.stdout||a.stderr||`exit:${a.exitCode}`),i.update("\0"),i.digest("hex")}async function iW(){try{let e=JSON.parse(await o.readFile(iG,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function iz(){let e=await V(process.env[iF],iF);if(e)return e;let t=iB(),r=await iK(t),i=n.join(iU,i$);try{if(await iW()===r)return await o.access(i),i}catch{}let a=n.join(iB(),".build","release",i$);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await iR("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await o.mkdir(iU,{recursive:!0});let s=`${i}.tmp`;return await o.copyFile(a,s),await o.rename(s,i),await o.chmod(i,493),await o.writeFile(iG,`${JSON.stringify({fingerprint:r},null,2)}
5
+ `,"utf8"),i}async function iJ(){let e=process.env[iF]?.trim();if(e){let t=await V(e,iF);if(t)return t}if(iC())return i$;if("darwin"!==process.platform)throw new $("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await iz()}async function iX(e){let t={allowFailure:!0,timeoutMs:3e4},r=ik().macosHelper,n=r?i$:await iJ(),i=r?await r.run(e,t):await iR(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 $("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 iZ(){return await iX(["app","frontmost"])}async function iY(e){return await iX(["app","quit","--bundle-id",iV(e)])}async function iQ(e,t){return await iX(["permission",e,t])}async function i0(e,t={}){let r=["alert",e];return ij(r,t),await iX(r)}async function i1(e,t={}){let r=["snapshot","--surface",e];return ij(r,t),await iX(r)}async function i2(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return ij(n,r),await iX(n)}async function i3(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return ij(n,r),await iX(n)}async function i4(e,t={}){let r=["screenshot","--out",e];return ij(r,t),t.fullscreen&&r.push("--fullscreen"),await iX(r)}let i5={"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"},i8={runCommand:G,whichCommand:j,desktop:at(G,j),clipboard:ar(G,j),screenshot:an(G,j)},i6=i_(i8,function(e={}){let t={...i8,...e};return{...t,desktop:e.desktop??at(t.runCommand,t.whichCommand),clipboard:e.clipboard??ar(t.runCommand,t.whichCommand),screenshot:e.screenshot??an(t.runCommand,t.whichCommand)}});function i9(e){return i6.resolve(e)}async function i7(e,t){return await i6.run(e,t)}async function ae(e,t,r){return await i9().runCommand(e,t,r)}function at(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=>{M({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await eW(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 ar(e,t){return{async readText(){let r=ao[await ac(t,ai)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=as[await ac(t,ai)](r);await e(n.cmd,n.args,n.options)}}}function an(e,t){return{async capture(r){let n=al[await ac(t,aa)](r);await e(n.cmd,n.args,n.options)}}}let ai={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."},aa={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."},ao={"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}}},as={"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}})},al={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 ac(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 $("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let ad="atspi-dump.py",au=null;async function ap(e,t={}){let r,a=i9().accessibility;if(a)return await a.captureTree(e,t);if("linux"!==process.platform)throw new $("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await i9().whichCommand("python3"))throw new $("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let o=t.maxNodes??1500,s=t.maxDepth??12,c=t.maxApps??24,d=[function(){if(au)return au;let e=n.dirname(l(import.meta.url));for(let t=0;t<5;t++){let r=n.join(e,"src","platforms","linux",ad);if(i.existsSync(r))return au=r,r;if(0===t){let t=n.join(e,ad);if(i.existsSync(t))return au=t,t}e=n.dirname(e)}throw new $("TOOL_MISSING",`Cannot find ${ad}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(c)],u=await ae("python3",d,{allowFailure:!0,timeoutMs:3e4});if(0!==u.exitCode){let e=u.stderr.trim();if(e.includes("No module named")||e.includes("gi.require_version"))throw new $("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new $("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new $("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new $("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=i5[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&&M({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await ap(t);return{nodes:r.nodes,truncated:r.truncated}}async function am(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:ah(e.rect)-ah(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 ah(e){return(e?.width??0)*(e?.height??0)}let aw=[250,400,600];function ag(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 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 ay(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function aS(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 aI(e,t,r,n,i){return{requestId:i??b().requestId,appBundleId:r,activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotCompact:t?.snapshotCompact,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...S(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:nb(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function ab(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=aM(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:aN(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function aA(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function ax(e){let{session:t,pending:r,snapshot:n}=e,i=aE(r.preSignature,aM(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await n6(t.device,r.command,r.positionals,r.flags?.out,{...aI(e.logPath,r.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),M({level:"info",phase:"interaction_no_change_retry",data:{action:r.action,attemptsRemaining:r.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function aN(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function aM(e){let t=new Map,r=[];for(let n of e){let e=function(e,t){var r,n;if(!e.rect||!([(r=e.rect).x,r.y,r.width,r.height].every(e=>Number.isFinite(e))&&r.width>0&&r.height>0)||(n=e,`${n.label??""} ${n.identifier??""}`.toLowerCase().includes("scroll bar")))return;let i=function(e){let t=[e.identifier,e.label,e.value,e.type,e.role,!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].map(e=>"string"==typeof e?e.trim():"").join("|");return t.replaceAll("|","")?t:void 0}(e);if(!i)return;let a=t.get(i)??0;return t.set(i,a+1),{key:`${i}|#${a}`,x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height)}}(n,t);e&&r.push(e)}return r}function aE(e,t){return 0===e.length||0===t.length?"ambiguous":aD(e,t)?"unchanged":"changed"}function aD(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 aP(e,t,r=[],n){var i,a,o;aO(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 aC(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function aR(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!aO(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=aM(e.readSnapshot(o).nodes);for(;Date.now()-i<1500;){await eW(200),a+=1;let l=await r(),c=aM(e.readSnapshot(l).nodes);if(aD(s,c))return aC(t),M({level:a>2?"info":"debug",phase:"post_gesture_snapshot_stabilized",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),l;o=l,s=c}return aC(t),M({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function aO(e){return"ios"===e||"android"===e}function aT(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let aL=new WeakMap;function a$(e,t){if(!e[t])return[];let r=aG(e)[t]??t+1;return e.slice(t+1,r)}function aF(e,t,r){let n=aG(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function aU(e,t,r){let n=aG(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function aG(e){let t=aL.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 aL.set(e,r),r}function aq(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 aV(e,t){let r=eQ(e.type??""),n=e.label?.trim();return!!(aj(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function aj(e){return"button"===eQ(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function aB(e){let t=eQ(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function aH(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function aK(e){let t;for(let i of e){var r,n;let e=eQ(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||aW(r)>aW(n)))&&(t=i.rect)}return t}function aW(e){return e?e.width*e.height:0}function az(e){let t=eQ(e.type??"");return"scrollview"===t||"scrollarea"===t}function aJ(e,t){return!0===e||!!t||void 0}function aX(e,t,r,n){aU(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=eQ(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function aZ(e,t,r,n){aU(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=eQ((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function aY(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===eQ(n.type??"")&&t(n,i,r)}}function aQ(e,t,r,n){for(let i of e)(aV(i,t)||n&&a1(i,n))&&r.add(i.index)}function a0(e,t,r){if("button"!==eQ(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&eE(e.rect,t.rect)}function a1(e,t){return"button"===eQ(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&eE(e.rect,t.rect)}let a2=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=aK(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"===eQ(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),aU(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==eQ(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&&eD(t))})(r)&&function(e,t,r){var n,i,a,o;aB(e.type)||r.suppressedIndexes.add(e.index);let s=eO(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&aB(e.type)?e:null)??aq(e,t,e=>aB(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,aH(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:aJ(i.hiddenContentAbove,o.above),hiddenContentBelow:aJ(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"!==eQ(n.type??""))continue;if("Search"===n.label){aZ(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=aF(e,r,e=>"searchfield"===eQ(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),aZ(e,r,i.index,t))}})(e,o),r=e,n=o,aY(r,(e,t,i)=>{aF(r,i,r=>{let n;return("button"===(n=eQ(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(eE(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=eQ(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,aY(i,(e,t,r)=>{let n;e$(e)&&eP(e,(n=[],aU(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=eQ(r.type??"");if("statictext"===a||"link"===a)return aX(e,t,n,i);if("other"===a){if(function(e,t,r){return!!aF(e,t,e=>{let t=eQ(e.type??"");return("link"===t||"searchfield"===t||aB(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);aX(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=aK(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==eQ(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)||!aq(e,t,az)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=aW(e),i=aW(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&aH(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=eQ(r.type??"");if("button"===a)return aQ(a$(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=a$(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==eQ(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=>a0(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&aH(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&&(a0(a,t,r)||a1(a,t)||function(e,t){if("switch"!==eQ(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||aV(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=>a0(e,t,r));if(!i){e.some(aj)&&aQ(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&aH(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),aQ(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function a3(e){let t=await a4(e);if(t)return t;let r=await a6(e);return ay(e.session),{snapshot:oa(r,on(e)),analysis:r.analysis,androidSnapshot:r.androidSnapshot}}async function a4(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!ak(e)||Date.now()-t.markedAt>3e4?void aA(e):t}(e.session);if(t&&e.session)return await a5({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await oe({...e,session:e.session});let r=av(e.session);if(r&&"android"===e.device.platform)return await a9(e,r)}async function a5(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await a8(e,t,await ot(e)),l=await ax({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await a8(e,t,await ot(e)),l=await ax({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(aA(i),s=await aR({session:i,initial:s,capture:async()=>await ot(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.freshness?.staleAfterRetries!==!0&&ay(i),"unchanged"===l.change)?M({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}}):M({level:(n={pending:t,change:l.change,attempts:o,startedAt:a}).attempts>0?"info":"debug",phase:"interaction_settled",data:{action:n.pending.action,change:n.change,attempts:n.attempts,durationMs:Date.now()-n.startedAt}}),{snapshot:s.snapshot,analysis:s.data.analysis,androidSnapshot:s.data.androidSnapshot,freshness:s.freshness}}async function a8(e,t,r){let n=r;return"unchanged"!==aE(t.preSignature,aM(n.snapshot.nodes))?n:(await eW(500),n=await ot(e))}async function a6(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 oo({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?oo(await i1(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await n6(t,"snapshot",[],i,{...aI(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath)})}async function a9(e,t){let r=await a7(e,t);return{snapshot:r.snapshot,analysis:r.data.analysis,androidSnapshot:r.data.androidSnapshot,freshness:r.freshness}}async function a7(e,t){let r=await or(e),n=oi(r,t,e),i=0,a=t.markedAt+1500;for(let o of aw){if(!n)break;let s=a-Date.now();if(s<=0)break;await eW(Math.min(o,s)),r=await or(e),i+=1,n=oi(r,t,e)}return n||ay(e.session),{...r,freshness:i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0}}async function oe(e){let t=await aR({session:e.session,capture:async()=>await ot(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,analysis:t.data.analysis,androidSnapshot:t.data.androidSnapshot,freshness:t.freshness}}async function ot(e){let t=av(e.session);return t&&"android"===e.device.platform?await a7(e,t):await or(e)}async function or(e){let t=await a6(e);return{data:t,snapshot:oa(t,on(e))}}function on(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function oi(e,t,r){var n,i;let a=r.flags?.snapshotInteractiveOnly===!0,o=e.data.analysis;if(a&&0===e.snapshot.nodes.length&&o&&o.rawNodeCount>=12)return"empty-interactive";if("ref-refresh"===r.androidFreshnessMode)return null;return(n=t.baselineCount,i=e.snapshot.nodes.length,!(n<12)&&i<=Math.floor(.2*n))?e.snapshot.nodes.some(e=>!0===e.hittable||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())?null:"sharp-drop":t.routeComparable&&aS(t.action)&&function(e,t){if(!e||0===e.length)return!1;let r=Math.max(e.length,t.length);if(r<12)return!1;let n=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 oa(e,t){var r,n,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=eL(s?o:e0(o)),c=t?.snapshotScope&&e?.backend!=="macos-helper"?os(l,t.snapshotScope):l,d=(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 a2)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}})}(c):c;return{nodes:e9(s?d:ej(d)),truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,presentationKey:e8(e3(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&a?.snapshotCompact!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function oo(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=os(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:ol(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=ol(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function os(e,t){let r=e1(e9(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 ol(a,i)}function ol(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 oc(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return aT("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=e4(e.trim());if(!n)return aT("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=e5(e.nodes,n);if(r=t?e2(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:aT("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function od(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function ou(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?M({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function op(e){let{session:t,sessionName:r,outPath:i,outputPlacement:a,dispatchContext:s}=e,l=eU({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...n,...S(a),surface:a?.surface};return"out"===r?of(await n6(t.device,"screenshot",[],i,o)):of(await n6(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:s}),artifacts:{resolveInput:async()=>{throw new $("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await o.mkdtemp(n.join(d.tmpdir(),"agent-device-screenshot-")),r=n.join(t,"screenshot.png")),await o.mkdir(n.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await o.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await o.mkdtemp(n.join(d.tmpdir(),`${e.prefix}-`));return{path:n.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await o.rm(t,{recursive:!0,force:!0})}}}},sessions:ou({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eB()});return await l.capture.screenshot({session:r,requestId:s.requestId,appBundleId:t.appBundleId,...y(s),surface:t.surface,...i?{out:{kind:"path",path:i}}:{}})}function of(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function om(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function oh(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 ow(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let og=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function ov(e,t={}){let r=tr(e,t.helperAdb).exec;return(await ob(e,t,r)).xml}async function oy(e,t={}){let r=tr(e,t.helperAdb).exec,n=await ob(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=ti(i,void 0,t),s=oS(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 oR(e,o.nodes,i,r),o.nodes),{...o,...o_(s),androidSnapshot:n.metadata}}let o=to(i),s=tu(o,void 0,t),l=oS(s.truncated,n.metadata);a&&await oI({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:c,...d}=s;return{...d,...o_(l),androidSnapshot:n.metadata}}function oS(e,t){return!0===e||!0===t.helperTruncated||e}function o_(e){return!0===e?{truncated:!0}:{}}async function oI(e){if(oT(e.interactiveSnapshot.nodes).size>0||oO(e.xml))return;let t=tu(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await oR(e.device,t.nodes,e.xml,e.adb);oq(r,t,e.interactiveSnapshot),0===r.size&&oq(eC(e9(t.nodes)),t,e.interactiveSnapshot)}async function ob(e,t,r){let n=await x("android_snapshot_helper_artifact_resolution",async()=>await oP(t.helperArtifact));return n.artifact?await oA(e,t,r,n.artifact):(M({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await oC(e,n.fallbackReason,r))}async function oA(e,t,r,n){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),c=tr(e,t.helperAdb);try{let e=await ox(t,r,c,n,l);return e.installed&&await tp(l),a=await oN(t,r,c,n,l),o=n,s=e.reason,{xml:a.xml,metadata:{backend:"android-helper",helperVersion:o.manifest.version,helperApiVersion:a.metadata.helperApiVersion,helperTransport:a.metadata.transport,helperSessionReused:a.metadata.sessionReused,installReason:s,waitForIdleTimeoutMs:a.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:a.metadata.waitForIdleQuietMs,timeoutMs:a.metadata.timeoutMs,maxDepth:a.metadata.maxDepth,maxNodes:a.metadata.maxNodes,rootPresent:a.metadata.rootPresent,captureMode:a.metadata.captureMode,windowCount:a.metadata.windowCount,nodeCount:a.metadata.nodeCount,helperTruncated:a.metadata.truncated,elapsedMs:a.metadata.elapsedMs}}}catch(t){return await oM({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function ox(e,t,r,n,i){let a=await x("android_snapshot_helper_install",async()=>await ta({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 M({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 oN(e,t,r,n,i){let a={adb:t,adbProvider:r,deviceKey:i,helperVersion:n.manifest.version,helperVersionCode:n.manifest.versionCode,packageName:n.manifest.packageName,instrumentationRunner:n.manifest.instrumentationRunner,waitForIdleTimeoutMs:e.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await x("android_snapshot_helper_session_capture",async()=>await tl(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){M({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:L(e).message}}),await oE(t,n.manifest.packageName)}return await x("android_snapshot_helper_capture",async()=>await ts(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function oM(e){let t=function(e){var t;let r=L(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=ok(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=oD(e);return new $(O(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=oD(e.error);return M({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tp(e.helperDeviceKey),await oE(e.adb,e.artifact.manifest.packageName),td({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oC(e.device,r,e.adb)}async function oE(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await eW(150),M({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){M({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:L(e).message}})}}function oD(e){let t=L(e),r=ok(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 ok(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 oP(e){if(e)return{artifact:e};let t=te(),r=n.join(tt(),"android-snapshot-helper","dist"),i=n.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await h.access(i)}catch{return{}}try{let e=tc(JSON.parse(await h.readFile(i,"utf8"))),t=n.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await h.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:L(e).message}}}async function oC(e,t,r){let n;try{n=await x("android_snapshot_stock_capture",async()=>await oL(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new $(O((r=L(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 oR(e,t,r,n){if(!t.some(e=>e7(e.type)))return new Map;let i=oT(t);if(i.size>0||oO(r))return i;let a=await oG(e,n);return a?function(e,t){let r=function(e){let t={className:"root",rect:{x:0,y:0,width:0,height:0},children:[]},r=[{indent:-1,node:t}],n=/^(\s*)([\w.$]+)\{[^}]* (-?\d+),(-?\d+)-(-?\d+),(-?\d+) #/;for(let t of e.split("\n")){let e=n.exec(t);if(!e)continue;let[i,a,o,s,l,c]=e.slice(1);if(void 0===i||void 0===a||void 0===o||void 0===s||void 0===l||void 0===c)continue;let d=i.length,u=Number(o),p=Number(s),f={className:a,rect:{x:u,y:p,width:Math.max(0,Number(l)-u),height:Math.max(0,Number(c)-p)},children:[]};for(;r.length>1&&d<=r[r.length-1].indent;)r.pop();r[r.length-1].node.children.push(f),r.push({indent:d,node:f})}return t.children.length>0?t:null}(t);if(!r)return new Map;let n=function(e){let t=[],r=[e];for(;r.length>0;){let e=r.pop();if(e7(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=>ow(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||!e7(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=>ow(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=om(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(!oh(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(!oh(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?om(o):a.length>0?om(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 oO(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function oT(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 oL(e,t=tn(e)){try{return await ei(()=>o$(t),{shouldRetry:oU})}catch(t){var r,n;let e;if((r=t)instanceof $&&"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 $("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 o$(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=oF(a.stdout,a.stderr);if(o)return o;let s="/sdcard/window_dump.xml",l=await e(["shell","uiautomator","dump",s],{allowFailure:!0,timeoutMs:8e3}),c=(t=l.stdout,r=l.stderr,n=`${t}
6
+ ${r}`,i=/dumped to:\s*(\S+)/i.exec(n),i?.[1]);if(0!==l.exitCode&&!c)throw new $("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode,reason:"missing_fresh_dump"});let d=await e(["shell","cat",c??s]),u=oF(d.stdout,d.stderr);if(!u)throw new $("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:d.stdout,stderr:d.stderr});return u}function oF(e,t){let r=`${e}
7
+ ${t}`,n=r.indexOf("<?xml"),i=n>=0?n:r.indexOf("<hierarchy");if(i<0)return null;let a=r.lastIndexOf("</hierarchy>");if(a<0||a<i)return null;let o=r.slice(i,a+12).trim();return o.length>0?o:null}function oU(e){if(!(e instanceof $)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return og.some(e=>r.includes(e))}async function oG(e,t=tn(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),r=`${e.stdout}
8
+ ${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function oq(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 oV=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,oj=/^close app$/i,oB="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function oH(e){let{session:t}=e;if("android"!==t.device.platform||!t.recording)return"absent";try{let e=await oZ(t),r=oQ(e);if(!r?.rect)return"absent";let n=await oY(t,r);if(!n.ok)return M({level:"warn",phase:"android_blocking_dialog_tap_failed",data:{session:t.name,deviceId:t.device.id,exitCode:n.exitCode,stdout:n.stdout.trim(),stderr:n.stderr.trim()}}),"failed";if(!await o0(t))return M({level:"warn",phase:"android_blocking_dialog_still_present",data:{session:t.name,deviceId:t.device.id}}),"failed";if(t.appBundleId&&(await es(t.device,t.appBundleId),!await o1(t,t.appBundleId)))return M({level:"warn",phase:"android_blocking_dialog_relaunch_unfocused",data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId}}),"failed";return M({level:"warn",phase:"android_blocking_dialog_recovered",data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId,x:n.x,y:n.y}}),"recovered"}catch(e){return M({level:"warn",phase:"android_blocking_dialog_recovery_failed",data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),"failed"}}async function oK(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await en(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await oW(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 oJ({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 oJ({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${oX(a)}. Automatic recovery failed.`,hint:oB})}throw oJ({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${oX(a)}.`,hint:oB})}async function oW(e){try{return await oz(e)}catch(t){return M({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 oz(e){if(!e.appBundleId)return!1;let t=oQ(await oZ(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await oY(e,t);if(!r.ok)return!1;await es(e.device,e.appBundleId);let n=await o1(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&M({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 oJ(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new $("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function oX(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function oZ(e){return e9(e0((await oy(e.device,{interactiveOnly:!1,compact:!1})).nodes))}async function oY(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=e6(t.rect),i=await et(e.device,["shell","input","tap",String(Math.round(r)),String(Math.round(n))],{allowFailure:!0});return 0!==i.exitCode?{ok:!1,exitCode:i.exitCode,stdout:i.stdout.trim(),stderr:i.stderr.trim()}:{ok:!0,x:r,y:n}}function oQ(e,t={}){if(!1===t.requireDialogSignal||o4(e))return e.find(e=>o3(e).some(e=>oj.test(e))&&e.rect)}async function o0(e){for(let t=0;t<12;t+=1){if(!o4(await oZ(e)))return!0;await eW(500)}return!o4(await oZ(e))}async function o1(e,t,r={}){for(let n=0;n<12;n+=1){if(await o2(e,t,r))return!0;await eW(500)}return await o2(e,t,r)}async function o2(e,t,r){return!(r.requireNoBlockingDialog&&await en(e.device))&&(await em(e.device)).package===t}function o3(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 o4(e){return e.some(e=>{let t=o3(e).join(" ").trim();return t.length>0&&oV.test(t)})}function o5(e){return!!(e&&e.width>0&&e.height>0)}function o8(e){return e.width*e.height}function o6(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 o9=[255,59,48,255],o7=[255,214,10,255],se=[0,0,0,255],st=["scroll","list","recyclerview","edittext","textfield"],sr=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],sn={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 si(e){let t=eR(await o.readFile(e.screenshotPath),"screenshot"),r=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)ss(r)&&o5(r.rect)&&(!t||o8(r.rect)>o8(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&&o5(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 o5(e.rect)&&!("image"===eQ((t=e).type??"")&&!sc(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(sd)||su(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!o5(r.rect)||ss(r))return!1;let n=eQ(r.type??"");return!(st.some(e=>n.includes(e))||t&&o8(r.rect)>.25*o8(t))}(e,t,r)||(so(r)?n:n&&function(e){let t=eQ(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)&&!ss(e)}(s=n)?s:null,eY(o,s,e=>(function(e){return so(e)&&!ss(e)})(e)),s.hittable?s:null,eY(o,s,e=>!0===e.hittable)].find(sl)??null);if(!l?.rect||!o5(l.rect))continue;let c=function(e,t,r){let n=sp(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=sp(n);if(!i)continue;let a=function(e){let t=0;return eQ(e.type??"").includes("text")&&(t+=2),sd(e.label)&&(t+=2),sd(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||sp(t)}(n,l,e.nodes),d=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),sc(t.value)&&(n+=1),n}(n,l,c),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=so,i=e=>!!sp(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=eQ(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&o5(t.rect)&&o6(n,t.rect)).map(e=>e.rect);return a.length<2?null:function(e){let t=e[0];if(void 0===t)throw Error("unionRects requires at least one rect");let r=t.x,n=t.y,i=t.x+t.width,a=t.y+t.height;for(let t of e.slice(1))r=Math.min(r,t.x),n=Math.min(n,t.y),i=Math.max(i,t.x+t.width),a=Math.max(a,t.y+t.height);return{x:r,y:n,width:i-r,height:a-n}}(a)}(e,t,r);if(!i)return null;let a=i.y-n.y,o=n.y+n.height-(i.y+i.height);if(a<0||o<0||16>Math.abs(o-a))return null;let s=Math.min(a,o),l=Math.round(i.y-s),c=Math.round(i.height+2*s);return c<=0||c>=n.height?null:{x:n.x,y:l,width:n.width,height:c}}(t,r,i))??t.rect)}(e,l,e.nodes),p=sa(e,i,u,t,r);if(!o5(p))continue;let f=a.get(l.ref);(!f||d>f.score)&&a.set(l.ref,{ref:l.ref,label:c,rect:l.rect,overlayRect:p,score:d})}return function(e,t,r,n,i){let a=ex(e.nodes).primaryAction;if(!a?.ref||!a.rect||!o5(a.rect))return;let o=sa(e,t,a.rect,n,i);if(!o5(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)=>o8(e.overlayRect)-o8(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(o6(e.overlayRect,r.overlayRect)||o6(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}o8(r.overlayRect)<o8(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(sy).slice(0,n.maxRefs??24).sort(sv).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:e6(e.overlayRect)}))}(e.snapshot,t.width,t.height,{maxRefs:e.maxRefs});for(let e of r){var n,i;(function(e,t,r){for(let n=0;n<2;n+=1)sh(e,t.x,t.x+t.width-1,t.y+n,r),sh(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),sw(e,t.x+n,t.y,t.y+t.height-1,r),sw(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(n=t,(i=e).overlayRect,o9),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=sm(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:sm(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)sg(e,t+o,r+a,i)})(e,i,o,n,o7),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=sn[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]&&sg(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,se)}(n,i.overlayRect,i.ref)}return await o.writeFile(e.screenshotPath,eF.sync.write(t)),r}function sa(e,t,r,n,i){if("android"===e.backend||!t)return sf(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 sf({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=>eQ(e??"")).join(" ");return sr.some(e=>t.includes(e))}function ss(e){let t=[e.type,e.role,e.subrole].map(e=>eQ(e??"")).join(" ");return t.includes("application")||t.includes("window")}function sl(e){return!!(e?.rect&&o5(e.rect)&&!ss(e))}function sc(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function sd(e){var t;let r;return!!sc(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&&!!sd(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function sp(e){let t=[e.label,e.value].find(sd);return t?t.trim():su(e.identifier)?e.identifier.trim():void 0}function sf(e,t,r){let n=sm(e.x,0,Math.max(0,t-1)),i=sm(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:sm(e.width,1,a),height:sm(e.height,1,o)}}function sm(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function sh(e,t,r,n,i){for(let a=t;a<=r;a+=1)sg(e,a,n,i)}function sw(e,t,r,n,i){for(let a=r;a<=n;a+=1)sg(e,t,a,i)}function sg(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 sv(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 sy(e,t){return t.score!==e.score?t.score-e.score:sv(e,t)}function sS(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 s_=new WeakMap;function sI(e){if(!e)return;let t=s_.get(e);if(t)return t;let r=sb(e.nodes??[]);if(r)return s_.set(e,r),r}let sb=eV,sA={referenceWidth:1e3,referenceHeight:1e3};function sx(e,t,r,n,i={},a=Date.now(),o=Date.now()){var s,l,c,d,u,p,f,m,h;let w,g,v,y=e.recording;if(!y)return;let S={...i,...n??{}},_=sR(S.effectiveDurationMs)??sR(S.durationMs),I={recordingStartedAt:y.startedAt,gestureClockOriginAtMs:y.gestureClockOriginAtMs,gestureClockOriginUptimeMs:y.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===y.platform?y.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:sR(S.gestureStartUptimeMs),gestureEndUptimeMs:sR(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},b="number"==typeof(s={gestureStartUptimeMs:sR(S.gestureStartUptimeMs),gestureEndUptimeMs:sR(S.gestureEndUptimeMs),reportedDurationMs:_,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}).gestureStartUptimeMs&&"number"==typeof s.gestureEndUptimeMs?Math.max(0,s.gestureEndUptimeMs-s.gestureStartUptimeMs):"number"==typeof s.reportedDurationMs?Math.max(0,s.reportedDurationMs):Math.max(0,s.fallbackFinishedAtMs-s.fallbackStartedAtMs),A="ios"===e.device.platform&&void 0===sR(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sO(sR(t.count),1)??1,r=!0===t.doubleTap,n=sO(sR(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 sS(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...I,gestureDurationMs:b}):sS(I),x=(l=e.snapshot,w=sR((c=S).referenceWidth),g=sR(c.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:sI(l)),N=(d=t,u=r,p=S,f=A,m=b,h=x,v=sN[d],v?.(u,p,f,m,h)??[]);0!==N.length&&(y.gestureEvents.push(...N),M({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:N.length,tMs:A,gestureDurationMs:b,kinds:N.map(e=>e.kind)}}))}let sN={click:(e,t,r,n,i)=>sM(e,t,r,i),press:(e,t,r,n,i)=>sM(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?sM(e,t,r,i):[],fill:(e,t,r,n,i)=>sE(e,t,r,i),focus:(e,t,r,n,i)=>sE(e,t,r,i),longpress:function(e,t,r,n,i){let a=sT(t,e);if(!a)return[];let{x:o,y:s}=a;return[sP(r,o,s,sF(n,[sR(t.durationMs),sR(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sL(t,e),o=sC(t.contentDirection)??sC(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:c,y2:d}=a,u=sF(n,[],250),p=sR(t.amount)??sR(e[1]),f=sR(t.pixels);return[{kind:"scroll",tMs:r,x:s,y:l,x2:c,y2:d,...i,durationMs:u,contentDirection:o,...void 0!==p?{amount:p}:{},...void 0!==f?{pixels:f}:{}}]},pan:sD,fling:sD,swipe:sD,pinch:function(e,t,r,n,i){let a=sT(t,e,1),o=sR(t.scale)??sR(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:sF(n,[],280)}]}};function sM(e,t,r,n){let i=sT(t,e);if(!i)return[];let{x:a,y:o}=i,s=sO(sR(t.count),1)??1,l=sO(sR(t.intervalMs),0)??0,c=!0===t.doubleTap,d=sO(sR(t.holdMs),1),u=[];for(let e=0;e<s;e+=1){let t=r+e*l;if(void 0!==d&&d>0){u.push(sP(t,a,o,d,n));continue}u.push(sk(t,a,o,n)),c&&u.push(sk(t+90,a,o,n))}return u}function sE(e,t,r,n){let i=sT(t,e);if(!i)return[];let{x:a,y:o}=i;return[sk(r,a,o,n)]}function sD(e,t,r,n,i){let a=sL(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:c}=a,d=sF(n,[sR(t.effectiveDurationMs),sR(t.durationMs),sR(e[4])],250),u=sO(sR(t.count),1)??1,p=sO(sR(t.pauseMs),0)??0,f="ping-pong"===t.pattern?"ping-pong":"one-way";return Array.from({length:u},(e,t)=>{var n,a,u,m,h,w,g,v,y,S,_,I,b;let A,{startX:x,startY:N,endX:M,endY:E}=(n=t,a=f,u=o,m=s,h=l,w=c,"ping-pong"===a&&n%2==1?{startX:h,startY:w,endX:u,endY:m}:{startX:u,startY:m,endX:h,endY:w});return g=r+t*(d+p),v=x,y=N,S=M,_=E,I=d,"back-swipe"===(A=function(e,t,r,n,i){if(!i||Math.abs(r-e)<=1.25*Math.abs(n-t))return"swipe";let a=.08*i.referenceWidth;return e<=a&&r>e||e>=i.referenceWidth-a&&r<e?"back-swipe":"swipe"}(v,y,S,_,b=i))?{kind:A,tMs:g,x:v,y,x2:S,y2:_,...b,durationMs:I,edge:function(e,t,r){if(r){let t=.08*r.referenceWidth;if(e<=t)return"left";if(e>=r.referenceWidth-t)return"right"}return t>=e?"left":"right"}(v,S,b)}:{kind:A,tMs:g,x:v,y,x2:S,y2:_,...b,durationMs:I}})}function sk(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sP(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sC(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 sR(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 sO(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sT(e,t,r=0){let n=sR(e.x)??sR(t[r]),i=sR(e.y)??sR(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function sL(e,t){let r=s$(e.x1,e.x,t[0]),n=s$(e.y1,e.y,t[1]),i=s$(e.x2,t[2]),a=s$(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 s$(...e){return e.map(sR).find(e=>void 0!==e)}function sF(e,t,r){return sO(e,1)??t.map(e=>sO(e,1)).find(e=>void 0!==e)??r}let sU={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sG(e){var t,r,n,i,a,o,s;let l,c,d,u,p,{req:f,session:m,logPath:h,sessionStore:w,contextFromFlags:g}=e,v=function(e){if("pan"===e.command||"fling"===e.command||"rotate-gesture"===e.command||"transform-gesture"===e.command)return{ok:!1,message:"Use gesture pan, gesture fling, gesture swipe, gesture rotate, or gesture transform."};if("gesture"!==e.command)return{ok:!0,platformCommand:e.command,dispatchRequest:e,recordedCommand:e.command};let[t,...r]=e.positionals??[],n=t?sU[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:eI}}(f);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:y,dispatchRequest:S,recordedCommand:_}=v,I=await sV(m,y);if(I)return I;let b=await sq(m,y);if("response"in b)return b.response;let{resolvedPositionals:A,resolvedOut:x,recordedPositionals:N,recordedFlags:M}="screenshot"===(t=S).command?(c=(n=(r=t).positionals??[],i=r.meta?.cwd,(l=n[0])?[tX.expandHome(l,i),...n.slice(1)]:n),u=(d=(a=r.flags?.out,o=r.meta?.cwd,a?tX.expandHome(a,o):a))?{...r.flags??{},out:d}:r.flags??{},{resolvedPositionals:c,resolvedOut:d,recordedPositionals:c,recordedFlags:u}):{resolvedPositionals:p=(s=t).positionals??[],resolvedOut:s.flags?.out,recordedPositionals:p,recordedFlags:s.flags??{}},E=Date.now(),D={...g(f.flags,m.appBundleId,m.trace?.outPath),surface:m.surface},k=await sj({session:m,sessionName:e.sessionName,logPath:h,command:y,request:S,positionals:A,out:x,dispatchContext:D}),P=await sq(m,y,"after-command");if("response"in P)return P.response;"status"in b&&"recovered"===b.status&&(!k||"object"==typeof k)&&((k??={}).warning=b.warning);let C=Date.now(),R=_===y?N:f.positionals??[],O=_===y?M:f.flags??{};return function(e){let{session:t,sessionStore:r,command:n,recordedCommand:i,resolvedPositionals:a,recordedPositionals:o,recordedFlags:s,data:l,actionStartedAt:c,actionFinishedAt:d,flags:u}=e,p=function(e,t,r,n){if("scroll"!==t)return n;let i=sI(e.snapshot),a={...n??{}},o=sC(a.direction)??sC(r[0]);if(!o)return n;let s=sR(a.amount)??sR(r[1]),l=sR(a.pixels),c=sL(a,[]),d=sR(a.referenceWidth),u=sR(a.referenceHeight),p=void 0!==d&&d>0&&void 0!==u&&u>0?{referenceWidth:d,referenceHeight:u}:i??sA;if(c&&(c.x1!==c.x2||c.y1!==c.y2))return{...a,x1:c.x1,y1:c.y1,x2:c.x2,y2:c.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==l?{pixels:l}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250};let f=eH({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);sx(t,n,a,p,u,c,d),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:y,recordedCommand:_,resolvedPositionals:A,recordedPositionals:R,recordedFlags:O,data:k,actionStartedAt:E,actionFinishedAt:C,flags:f.flags??{}}),aS(y)&&ag(m,y),aP(m,y,A,f.flags),{ok:!0,data:k??{}}}async function sq(e,t,r="before-command"){if("android"!==e.device.platform||nd(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await oK({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:L(e)}}}}async function sV(e,t){if(!iS(t,e.device)){var r;let n=(r=e.device,iy[t]?.unsupportedHint?.(r));return{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:`${t} is not supported on this device`,...n?{hint:n}:{}}}}return"android"===e.device.platform&&e.recording&&"record"!==t&&await oH({session:e})==="failed"?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function sj(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await n6(r.device,n,a,o,{...s});let l=await op({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 sB(r,l,e.logPath),l}async function sB(e,t,r){let n={snapshotInteractiveOnly:!0,snapshotCompact:!0},i=oa(await a6({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);od(e,i);let a=await si({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let sH=s8(()=>import("./lease.js")),sK=s8(()=>import("./session.js").then(e=>e.session_namespaceObject)),sW=s8(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),sz=s8(()=>import("./react-native.js")),sJ=s8(()=>import("./record-trace.js").then(e=>e.record_trace_namespaceObject)),sX=s8(()=>import("./find.js")),sZ=s8(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function sY(e){var t;switch(t=e.req.command,nd(t)?.route??"generic"){case"lease":return await sQ(e);case"session":return await s0(e);case"snapshot":return await s1(e);case"reactNative":return await s2(e);case"recordTrace":return await s3(e);case"find":return await s4(e);case"interaction":return await s5(e);case"generic":return null}}async function sQ(e){let{handleLeaseCommands:t}=await sH();return s6(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function s0(e){let{handleSessionCommands:t}=await sK();return s6(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 s1(e){let{handleSnapshotCommands:t}=await sW();return s6(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function s2(e){let{handleReactNativeCommands:t}=await sz();return s6(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function s3(e){let{handleRecordTraceCommands:t}=await sJ();return s6(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function s4(e){let{handleFindCommands:t}=await sX();return s6(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function s5(e){let{handleInteractionCommands:t}=await sZ();return s6(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function s8(e){let t;return()=>t??=e()}function s6(e,t,r){if(r)return r;throw new $("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let s9=new m;async function s7(e,t,r){let n=s9.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>s9.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function le(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function lt(e,t){var r,n,i,a;let o,s,l,c,d,u;return e.recording?(r=e,n=t,o=X(r.name),s=`agent-device close --session ${o}`,l=`agent-device record stop --session ${o}`,c="selector-conflict"===n?`To keep using this device, rerun the command with --session ${o} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${o} for commands that should attach to the recording session.`,`Recording session "${r.name}" owns this device. Run ${l}; if the session still appears in agent-device session list, run ${s}. ${c} Run agent-device session list to inspect active sessions.`):(i=e,a=t,d=X(i.name),u=`agent-device close --session ${d}`,"selector-conflict"===a?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${d} and remove conflicting device selectors. To switch devices, first run ${u}, then open the desired device with a different --session name.`:`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${d}. To open a new session on this device, first run ${u}.`)}function lr(e,t){if(!t)return[];let r=[],n=e.device,i=rK(t.platform);if(i&&!rz(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=ep(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function ln(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 li="default";function la(e){return e.session||li}function lo(e){if(e.meta?.sessionExplicit===!0||(e.session||li)!==li||e.meta?.sessionIsolation==="tenant"||e.flags?.sessionIsolation==="tenant")return;let r=function(e){if(!e||0===e.trim().length)return;let t=function(e){let t=n.resolve(e);try{return i.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(i.existsSync(n.join(t,".git")))return t;let e=n.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(r){var a;return{kind:"cwd",id:(a=r,t.createHash("sha256").update(a).digest("hex").slice(0,16))}}}function ls(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&&!ls(t,r)}function lc(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 ld(e,t){var r,n,i,a,o,s,l,c,d,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?lr(t,g):(n=g,i=e.meta?.lockPlatform,f=[],m=rK(i),void 0!==n.platform&&m&&(a=rK(n.platform),o=m,a&&o&&a!==o&&("apple"===a?!rW(o):"apple"!==o||!rW(a)))&&f.push({key:"platform",value:n.platform}),m&&(s=f,l=n,c=m,(h=l.target)&&function(e,t){switch(t){case"android":case"ios":return"desktop"===e;case"macos":case"linux":return"desktop"!==e;case"apple":return!1;default:return lp(t)}}(h,c)&&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"===rK(r.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return lp(e)}}(r,t)){let r=t[n];nn(r)&&e.push({key:n,value:r})}}(f,n,m)),f),S=e.meta?.lockPlatform;if(0===y.length){return d=v,u=t,p=g,!S||u||void 0!==p.platform||d&&ni(p,nr)||(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 $("INVALID_ARGS",function(e,t,r){let n=t.map(ln).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${le(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(ln),hint:function(e,t){if(t)return lt(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${X(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 lp(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function lf(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[lm(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return ld(e)}catch{return e}}(n);if("open"===(r=l).command||ni(r.flags,nt))try{let e=await r3(l.flags??{});s.add(lm(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=lh(e)-lh(t);return 0!==r?r:e.localeCompare(t)})}function lm(e){return`device:${e}`}function lh(e){return+!e.startsWith("session:")}function lw(e,t={}){let r=er(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function lg(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:lw(t,{simulatorSetPath:e.simulatorSetPath})}function lv(e,t,r){return iO(lg(e,t),r)}let ly="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 lS(e){if(!(e instanceof $)||"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 l_(e){return!(e instanceof $)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lI(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new $("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:el({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:ed("IOS_RUNNER_CONNECT_TIMEOUT")})}async function lb(e){var t,r;let n,{session:i,port:a,logPath:o}=e,s=await i.testPromise,l="Runner did not accept connection (xcodebuild exited early)",c=el({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new $("COMMAND_FAILED",l,{port:a,logPath:o,xcodebuild:{exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr},reason:c,hint:(t=s.stdout,r=s.stderr,(n=`${l}
9
9
  ${t}
10
- ${r}`.toLowerCase()).includes("device is busy")&&n.includes("connecting")?"Target iOS device is still connecting. Keep it unlocked, wait for device trust/connection to settle, then retry.":`${ec("IOS_RUNNER_CONNECT_TIMEOUT")} ${lf}`)})}function lv(e){return"interactionFrame"===e||"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function ly(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${t.randomUUID()}`}}function lS(e){if(t8(e))throw t9()}let l_=new Map;async function lI(e,t,r,n,i=45e3,a,o){let s=ei.fromTimeoutMs(i),{getEndpoints:l}=lA(e,t),{endpoints:c}=await l(s.remainingMs()),d=null,u=Math.max(1,Math.ceil(i/250));try{return await ep(async({deadline:s})=>{if(s?.isExpired())throw new L("COMMAND_FAILED","Runner connection deadline exceeded",{port:t,timeoutMs:i});if(a&&null!==a.child.exitCode&&void 0!==a.child.exitCode)throw await lg({session:a,port:t,logPath:n});let u=!1;if("device"===e.kind){let e=await l(s?.remainingMs());c=e.endpoints,u=e.cached}let p=u?c[0]:null,f=await lx(c,{command:r,port:t,timeoutMs:i,signal:o,attemptDeadline:s,onError:(t,r)=>{var n;d=r,"device"===e.kind&&t===p&&(n=e.id,l_.delete(n))}});if(f)return f;if("device"===e.kind&&u){var m;m=e.id,l_.delete(m),c=(await l(s?.remainingMs(),!0)).endpoints;let n=await lx(c,{command:r,port:t,timeoutMs:i,signal:o,attemptDeadline:s,onError:(e,t)=>{d=t}});if(n)return n}if(o?.aborted)throw t9();throw new L("COMMAND_FAILED","Runner endpoint probe failed",{port:t,endpoints:c,lastError:d?String(d):void 0})},{maxAttempts:u,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:lh},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||re(e))throw t9();d||(d=e)}if(o?.aborted)throw t9();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw lw({port:t,endpoints:c,logPath:n,lastError:d});let a=await lE(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw lw({port:t,endpoints:c,logPath:n,lastError:d})}async function lb(e,t,r,n=45e3,i){if(i?.aborted)throw t9();let a=ei.fromTimeoutMs(n),{getEndpoints:o}=lA(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new L("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let c=a.remainingMs();if(c<=0)throw new L("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await lM(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},c,i)}function lA(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,c=await lN({device:e,timeoutBudgetMs:n,forceRefresh:i,requestTunnelIp:r,setRequestTunnelIp:e=>{r=e}});return{endpoints:(a=e,o=t,s=c.ip,l=[`http://127.0.0.1:${o}/command`],"device"!==a.kind||s&&l.unshift(`http://[${s}]:${o}/command`),l),cached:c.sharedCacheHit}}}}async function lx(e,t){let{command:r,port:n,timeoutMs:i,signal:a,attemptDeadline:o,onError:s}=t;for(let t of e)try{let e=o?.remainingMs()??i;if(e<=0)throw new L("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await lM(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||re(e))throw t9();s(t,e)}return null}async function lN(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=l_.get(t))?e.expiresAt<=Date.now()?(l_.delete(t),null):e.ip:null);if(r)return{ip:r,sharedCacheHit:!0};if(void 0!==s)return{ip:s,sharedCacheHit:!1}}let c=await lD(i.id,a);return l(c),c&&(r=i.id,n=c,l_.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:c,sharedCacheHit:!1}}async function lM(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 lD(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,a=n.join(d.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),n=await iD(["devicectl","device","info","details","--device",e,"--json-output",a,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==n.exitCode||!i.existsSync(a))return null;let o=JSON.parse(i.readFileSync(a,"utf8"));if(o.info?.outcome&&"success"!==o.info.outcome)return null;let s=(o.result?.connectionProperties?.tunnelIPAddress??o.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{lO(a)}}async function lE(e,t,r,n,i){let a=JSON.stringify(r),o=lu(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 iD(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=es({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new L("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:ec(e)})}return{status:200,body:l}}async function lk(){return await new Promise((e,t)=>{let r=w.createServer();r.listen(0,"127.0.0.1",()=>{let n=r.address();if("object"==typeof n&&n?.port){let t=n.port;r.close(()=>e(t))}else r.close(()=>t(new L("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function lP(e,t,r,n){t&&lR(t,e),r&&lR(r,e),n&&process.stderr.write(e)}let lC=new Map;function lR(e,t){let r=(lC.get(e)??Promise.resolve()).catch(()=>{}).then(()=>i.promises.appendFile(e,t)).catch(()=>{}).finally(()=>{lC.get(e)===r&&lC.delete(e)});lC.set(e,r)}function lO(e){try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}let lT=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function lL(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new L("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",xctestrunPath:r});let n=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of n)if(!i.existsSync(e))throw new L("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await l$(e)){await iM("codesign",["--remove-signature",e],{allowFailure:!0});try{await iM("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof L?n:new L("COMMAND_FAILED",String(n));throw new L("COMMAND_FAILED","Failed to repair macOS runner product signature",{reason:"RUNNER_PRODUCT_REPAIR_FAILED",productPath:e,xctestrunPath:r,error:t.message,details:t.details})}}}async function l$(e){return 0===(await iM("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let lF=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),lU=new Set([" "," ","\n","\r"]),lG=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function lq(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new lj(e).parse()}function lV(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)}lV(r.children,t)}}class lj{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(lG.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?lB(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])&&lF.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,lB(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])&&lU.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function lB(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 lH=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function lK(e){var t;let r=await lW(e);if(!r||0===r.length)return null;let a=n.dirname(e),o=new Set,s=function(e,t){let r=[],i=new Set,a=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){a.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);r.push(n.join(t,e));let s=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(e);s&&i.add(n.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(i),hostRelativePaths:a}}(r,a);for(let e of s.testRootPaths){if(!i.existsSync(e))return null;o.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>i.existsSync(n.join(t,e)));return r?n.join(r,e):null})){if(!e)return null;o.add(e)}return Array.from(o)}async function lW(e){let t=await iE(e);if(t){var r,n,a,o=t;let e=new Set;for(let t of[a=o,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!lz(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(lz))}return r}(a),...Object.values(a).filter(e=>lz(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(lH.has(r)){if("string"==typeof n){t.add(n);continue}if(Array.isArray(n))for(let e of n)"string"==typeof e&&t.add(e)}return Array.from(t)}(t))e.add(r);return Array.from(e)}if("darwin"===process.platform)return null;try{let t;return r=i.readFileSync(e,"utf8"),n=lq(r),t=new Set,lV(n,(e,r)=>{if(lH.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 lz(e){return!!e&&"object"==typeof e}let lJ=["CFBundleIcons","CFBundleIcons~ipad"];async function lX(e){let t=e.filter(l1);if(0===t.length)return;let r=e.filter(e=>l3(e)&&!l2(e));for(let e of t){let t=function(e,t){let r=n.dirname(e);return t.find(e=>n.dirname(e)===r&&"AgentDeviceRunner.app"===n.basename(e))??t.find(t=>n.dirname(t)===r&&t!==e)??null}(e,r);t&&await lZ(t,e)}}async function lZ(e,t){var r;let a,o=function(e,t){let r=!1;for(let o of i.readdirSync(e,{withFileTypes:!0})){var a;if(o.isFile()&&(a=o.name,/^AppIcon.*\.png$/.test(a)||"Assets.car"===a))(function(e,t){if(i.existsSync(t)){let r=i.readFileSync(e),n=i.readFileSync(t);return!r.equals(n)&&(i.copyFileSync(e,t),!0)}return i.copyFileSync(e,t),!0})(n.join(e,o.name),n.join(t,o.name))&&(r=!0)}return r}(e,t),s=await lY(e,t);(o||s)&&(await l0(t),r=t,a=new Date,i.utimesSync(r,a,a))}async function lY(e,t){var r,i;let a=n.join(e,"Info.plist"),o=n.join(t,"Info.plist"),s=await iE(a),l=await iE(o);if(!s||!l)return!1;let c=(r=s,i=l,lJ.flatMap(e=>{let t=r[e];return void 0===t||JSON.stringify(i[e])===JSON.stringify(t)?[]:[{key:e,value:t,shouldInsert:void 0===i[e]}]}));if(0===c.length)return!1;for(let e of c)await lQ(o,e.key,e.value,e.shouldInsert);return!0}async function lQ(e,t,r,n){let i=await iM("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new L("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function l0(e){let t=await iM("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new L("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function l1(e){return l3(e)&&l2(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function l2(e){return n.basename(e).endsWith("-Runner.app")}function l3(e){return n.basename(e).endsWith(".app")}let l4={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 l5(e){var t;if("ios"!==e.platform&&"macos"!==e.platform)throw new L("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":"macos"===(t=e.target)||"desktop"===t?"macOS":"tv"===t?"tvOS":"iOS"}function l8(e){return"simulator"===e?"simulator":"device"}function l6(){return"arm64"===process.arch?"arm64":"x86_64"}let l9="XCTestDevices",l7=".agent-device-backup",ce=".agent-device-xctestdevices-backup-",ct=n.join(d.homedir(),".agent-device","ios-runner"),cr=".agent-device-runner-cache.json",cn={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},ci=new Map,ca=new Set,co=new Map,cs=new Set;function cl(e){return e?.trim()??""}function cc(e=process.env){return cl(e.AGENT_DEVICE_IOS_BUNDLE_ID)||cl(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function cd(e=process.env){let t=cl(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${cc(e)}.uitests`}let cu=function(e=process.env){let t=cc(e),r=cd(e);return Array.from(new Set([cl(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function cp(e=d.homedir()){return n.join(e,"Library","Developer","XCTestDevices")}async function cf(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=et(e.simulatorSetPath);if(!r)return null;let a=n.resolve(r),o=n.resolve(t.xctestDeviceSetPath??cp()),s=n.resolve(t.backupPath??function(e=cp()){return`${e}${l7}`}(o)),l=n.resolve(t.lockDirPath??function(e=d.homedir()){return n.join(e,".agent-device","xctest-device-set.lock")}()),c=t.ownerStartTime??M(process.pid),u=await cw({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:c,acquiredAtMs:t.nowMs??Date.now()}});try{if(cm({xctestDeviceSetPath:o,backupPath:s}),function(e,t){if(n.resolve(e)===n.resolve(t))return!0;try{return i.realpathSync.native(e)===i.realpathSync.native(t)}catch{return!1}}(a,o))return await u(),null;i.mkdirSync(a,{recursive:!0}),i.existsSync(o)&&i.renameSync(o,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,a=n.dirname(r),o=n.join(a,`${l9}.agent-device-link-${process.pid}-${Date.now()}`);i.mkdirSync(a,{recursive:!0});try{i.symlinkSync(t,o,"dir"),i.renameSync(o,r)}catch(e){throw i.existsSync(o)&&ch(o),e}}({requestedSetPath:a,xctestDeviceSetPath:o})}catch(e){throw cm({xctestDeviceSetPath:o,backupPath:s}),await u(),new L("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:a,xctestDeviceSetPath:o,backupPath:s,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{cm({xctestDeviceSetPath:o,backupPath:s})}finally{await u()}}}}}function cm(e){let{xctestDeviceSetPath:t,backupPath:r}=e,a=[r,...function(e){let t=n.dirname(e),r=n.basename(e).replace(l7,""),a=r===l9?ce:`${r}${ce}`;try{return i.readdirSync(t).filter(e=>e.startsWith(a)).sort().map(e=>n.join(t,e))}catch{return[]}}(r)],o=a.find(e=>i.existsSync(e)),s=i.existsSync(t)&&i.lstatSync(t).isSymbolicLink();if(o){if(s&&ch(t),i.existsSync(t))if(!s)return void N({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:o}});else o!==r?i.rmSync(o,{recursive:!0,force:!0}):i.rmSync(r,{recursive:!0,force:!0});else i.mkdirSync(n.dirname(t),{recursive:!0}),i.renameSync(o,t);for(let e of a)e!==o&&i.existsSync(e)&&i.rmSync(e,{recursive:!0,force:!0});return}s&&(N({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),ch(t))}function ch(e){!i.existsSync(e)||i.lstatSync(e).isSymbolicLink()&&i.unlinkSync(e)}async function cw(e){let{lockDirPath:t,owner:r}=e,a=n.join(t,"owner.json"),o=Date.now()+(e.timeoutMs??3e4),s=e.pollMs??100,l=e.description??"XCTest device set lock";for(i.mkdirSync(n.dirname(t),{recursive:!0});Date.now()<o;)try{i.mkdirSync(t),function(e,t){let r=`${e}.${process.pid}.${Date.now()}.tmp`;i.writeFileSync(r,JSON.stringify(t),"utf8"),i.renameSync(r,e)}(a,r);let e=!1;return async()=>{e||(e=!0,i.rmSync(t,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,t){let r=null;try{r=i.statSync(e)}catch{return!0}let n=cv(t);if(n){var a;return!(Number.isInteger((a=n).pid)&&!(a.pid<=0)&&C(a.pid)&&(!a.startTime||M(a.pid)===a.startTime))&&(i.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-r.mtimeMs<5e3)&&(i.rmSync(e,{recursive:!0,force:!0}),!0)}(t,a))continue;await eB(s)}throw new L("COMMAND_FAILED",`Timed out waiting for ${l}`,{lockDirPath:t,...function(e,t){let r,n=Date.now(),a=cv(t);try{r=Math.max(0,Math.round(n-i.statSync(e).mtimeMs))}catch{}return{...void 0!==r?{lockAgeMs:r}:{},...a?{ownerPid:a.pid,ownerStartTime:a.startTime,ownerAgeMs:Math.max(0,Math.round(n-a.acquiredAtMs))}:{}}}(t,a)})}async function cg(e){var t;return await cw({lockDirPath:(t=e,n.join(n.dirname(t),`${n.basename(t)}.lock`)),owner:{pid:process.pid,startTime:M(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}function cv(e){try{return JSON.parse(i.readFileSync(e,"utf8"))}catch{return null}}async function cy(e,r){let a=e9(),o=function(e,r=e9()){let a,o=l5(e);return{schemaVersion:2,packageVersion:e6(),runnerSourceFingerprint:function(e){let r=n.join(e,"ios-runner","AgentDeviceRunner"),a=function(e){if(!i.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of i.readdirSync(e,{withFileTypes:!0})){var a,o;let i=n.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(i);continue}s.isFile()&&(a=s.name,o=i,"project.pbxproj"===a?o.includes(`${n.sep}.xcodeproj${n.sep}`):[".jpg",".json",".png",".swift",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(n.extname(a)))&&t.push(i)}}return t.sort((e,t)=>e.localeCompare(t))}(r),o=function(e,r){let a=t.createHash("sha256");for(let t of r){let r=n.relative(e,t),o=i.statSync(t);a.update(r),a.update("\0"),a.update(String(o.size)),a.update("\0"),a.update(String(Math.trunc(o.mtimeMs))),a.update("\0")}return a.digest("hex")}(r,a),s=cL.get(r);if(s?.fileStatsFingerprint===o)return s.sourceFingerprint;let l=t.createHash("sha256");for(let e of a){let t=n.relative(r,e);l.update(t),l.update("\0"),l.update(i.readFileSync(e)),l.update("\0")}let c=l.digest("hex");return cL.set(r,{fileStatsFingerprint:o,sourceFingerprint:c}),c}(r),...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=l4[e].sdkName[l8(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"===(a=l5(e))?`platform=macOS,arch=${l6()}`:"simulator"===e.kind?`generic/platform=${a} Simulator`:`generic/platform=${a}`,runnerBundleBuildSettings:cz(process.env),runnerSigningBuildSettings:cW(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:cJ()}}(e,a),s=function(e,r){let i,a=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(a)return n.resolve(a);let o=(i=t.createHash("sha256").update(ck(cE(r))).digest("hex"),`cache-${i.slice(0,16)}`),s=function(e){return n.join(ct,"derived",l4[l5(e)].derivedBaseName[l8(e.kind)])}(e);return n.join(s,o)}(e,o);return await s3(ci,s,async()=>{let t=await cg(s);try{return await cS({device:e,options:r,projectRoot:a,expectedCacheMetadata:o,derived:s,forceRebuild:!0===r.forceRunnerXctestrunRebuild})}finally{await t()}})}async function cS(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(ea(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||ca.has(t))&&(cY("clean",r?"forced_rebuild":"forced_clean",{derived:t}),cX(t),cA(t),ca.delete(t));let l=await cZ({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>c$(e,n),xctestrunReferencesProjectRoot:cU,resolveExistingXctestrunProductPaths:lK}),c="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&cY("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let d=await c_({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:c});return d||(l.xctestrunPath&&(cX(s),cA(s)),await cI({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:c,reason:l.reason}))}async function c_(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await cb(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function cI(e){let{device:t,options:r,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:l,reason:c}=e,d=n.join(a,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!i.existsSync(d))throw new L("COMMAND_FAILED","iOS runner project not found",{projectPath:d});let u=Date.now();await cH(t,d,s,r);let p=Math.max(0,Date.now()-u),f=c$(s,t);if(!f)throw new L("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await lK(f);if(!m)throw new L("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await lL(t,m,f),await lX(m),cM(s,cP(o,f,m)),cY("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:c}}async function cb(e,t,r,n){try{var i,a,o,s;return await lL(e,n.productPaths,n.xctestrunPath),cY("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,cM(i,cP(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof L))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&lT.has(t)}(e))throw e;return cY("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function cA(e){try{if(!i.existsSync(e))return;if("derived"!==n.basename(e))return void i.rmSync(e,{recursive:!0,force:!0});for(let r of i.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,cx.has(t)&&i.rmSync(n.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let cx=new Set([cr,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function cN(e,t){let r=JSON.stringify([e,t]),n=co.get(r);if(void 0!==n)return n;try{let n=G(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return co.set(r,i),i}catch{return co.set(r,"unknown"),"unknown"}}function cM(e,t){i.mkdirSync(e,{recursive:!0}),i.writeFileSync(n.join(e,cr),`${JSON.stringify(t,null,2)}
11
- `)}async function cD(e,t){ca.add(e.derived);let r=await cg(e.derived);try{cY("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),cX(e.derived),cA(e.derived)}finally{await r()}}function cE(e){let{artifacts:t,...r}=e;return r}function ck(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 cP(e,t,r){let n=function(e,t){let r=cR(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=cR(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 cC(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function cR(e){try{let t=i.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function cO(e,t){let r=cR(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function cT(e,t){let r=n.relative(n.resolve(t),n.resolve(e));return""!==r&&!r.startsWith("..")&&!n.isAbsolute(r)}let cL=new Map;function c$(e,t){if(!i.existsSync(e))return null;let r=[],a=[e];for(;a.length>0;){let e=a.pop();for(let t of i.readdirSync(e,{withFileTypes:!0})){let o=n.join(e,t.name);if(t.isDirectory()){a.push(o);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=i.statSync(o);r.push({path:o,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,r)=>{if(t){let n=cF(r.path,t)-cF(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function cF(e,t){let r=0,i=e.toLowerCase();n.basename(i).startsWith("agentdevicerunner.env.")&&(r-=1e3),i.includes(`${n.sep}macos${n.sep}`)&&(r-=5e3);let a=l4[l5(t)].xctestrunHints[l8(t.kind)];return a.preferred.length>0&&(a.preferred.some(e=>i.includes(e))?r+=2e3:r-=500),a.disallowed.some(e=>i.includes(e))&&(r-=2500),r}function cU(e,t){try{let r=i.readFileSync(e,"utf8"),n=new Set([t]);try{n.add(i.realpathSync(t))}catch{}for(let e of n)if(r.includes(e))return!0;return!1}catch{return!1}}async function cG(e,t,r){let i=n.dirname(e),a=r.replace(/[^a-zA-Z0-9._-]/g,"_"),o=n.join(i,`AgentDeviceRunner.env.${a}.json`),s=n.join(i,`AgentDeviceRunner.env.${a}.xctestrun`),l=await cq(e);return cj(l,e=>{var r,n;return r=e,n=t,void(r.EnvironmentVariables={...r.EnvironmentVariables??{},...n},r.UITestEnvironmentVariables={...r.UITestEnvironmentVariables??{},...n},r.UITargetAppEnvironmentVariables={...r.UITargetAppEnvironmentVariables??{},...n},r.TestingEnvironmentVariables={...r.TestingEnvironmentVariables??{},...n})}),cj(l,e=>Object.assign(e,cn),{requireTestBundlePath:!0}),await cV(l,o,s),{xctestrunPath:s,jsonPath:o}}async function cq(e){let t=await iM("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new L("COMMAND_FAILED","Failed to read xctestrun plist",{xctestrunPath:e,stderr:t.stderr});try{let e=JSON.parse(t.stdout);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Root must be an object");return e}catch(t){throw new L("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function cV(e,t,r){i.writeFileSync(t,JSON.stringify(e,null,2));let n=await iM("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new L("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:r,stderr:n.stderr})}function cj(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 cH(e,t,r,n){let i=cz(process.env),a=cW(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=cJ(),l=await cf(e);try{let l;await F("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",cK(e),"1","-destination",(l=l5(e),"macOS"===l?`platform=macOS,arch=${l6()}`:"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=>{cs.add(e),e.on("close",()=>{cs.delete(e)})},onStdoutChunk:e=>{lP(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{lP(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof L?a:new L("COMMAND_FAILED",String(a)),i=(e=r.details?JSON.stringify(r.details):"",((t=`${r.message}
12
- ${e}`.toLowerCase()).includes("failed registering bundle identifier")||t.includes("app identifier")&&t.includes("not available")?"Set AGENT_DEVICE_IOS_BUNDLE_ID to a unique reverse-DNS value (for example, com.yourname.agentdevice.runner), then retry.":t.includes("requires a development team")?"Configure signing in Xcode or set AGENT_DEVICE_IOS_TEAM_ID for physical-device runs.":t.includes("no profiles for")||t.includes("provisioning profile")?"Install/select a valid iOS provisioning profile, or set AGENT_DEVICE_IOS_PROVISIONING_PROFILE.":t.includes("code signing")?"Enable Automatic Signing in Xcode or provide AGENT_DEVICE_IOS_TEAM_ID and optional AGENT_DEVICE_IOS_SIGNING_IDENTITY.":void 0)??lf);throw new L("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await l?.release()}}function cK(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function cW(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 cz(e=process.env){let t=cc(e),r=cd(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function cJ(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function cX(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,i;if(r=e,t=n.resolve(e9(),".tmp"),""===(i=n.relative(t,n.resolve(r)))||i.startsWith("..")||n.isAbsolute(i))throw new L("COMMAND_FAILED","Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically",{derivedPath:e,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${n.join(e9(),".tmp")}.`})}}async function cZ(e){var t,r;let a,o=(t=e.derived,r=e.expectedCacheMetadata,(a=function(e){try{let t=JSON.parse(i.readFileSync(n.join(e,cr),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?ck(cE(a))!==ck(cE(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:a}:{ok:!1,reason:"cache_metadata_missing"}),s=o.ok?function(e,t){var r;let n=t?.artifacts;if(!(!(!(r=n)||"object"!=typeof r||Array.isArray(r))&&"string"==typeof r.xctestrunPath&&Number.isInteger(r.xctestrunMtimeMs)&&Number.isInteger(r.xctestrunSize)&&Array.isArray(r.productPaths)&&r.productPaths.length>0&&r.productPaths.every(cC))||!cT(n.xctestrunPath,e)||!cO(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!cT(t.path,e)||!cO(t.path,t))return null;i.push(t.path)}return{xctestrunPath:n.xctestrunPath,productPaths:i}}(e.derived,o.metadata):null,l=s?.xctestrunPath??e.findXctestrun(e.derived);if(!l)return{reason:"missing_xctestrun",xctestrunPath:null};let c=s?.xctestrunPath===l,d=c?"manifest":"scan",u=c?s.productPaths:await e.resolveExistingXctestrunProductPaths(l);return u?e.xctestrunReferencesProjectRoot(l,e.projectRoot)||c?o.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:u,source:d}:{reason:o.reason,xctestrunPath:l,productPaths:u,source:d}:{reason:"project_root_mismatch",xctestrunPath:l,productPaths:u,source:d}:{reason:"missing_products",xctestrunPath:l,productPaths:[],source:d}}function cY(e,t,r){N({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let cQ=new Map,c0=new Map;async function c1(e,t){return await s3(c0,e.id,async()=>{var r;let n,i,a=cQ.get(e.id);if(a){if(de(a.child.pid))return N({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:a.sessionId,ready:a.ready}}),a;await dc({},"stop_stale_session",async()=>{await c8(e.id,a)})}let o={};await dc(o,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(N({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):dr(t))}),t.cleanStaleBundles?await dc(o,"cleanup_stale_bundles",async()=>{await c2(e)}):(o.cleanup_stale_bundles=0,N({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let s=await dc(o,"ensure_xctestrun",async()=>await cy(e,t));o.build_xctestrun=s.buildMs;let l=await dc(o,"allocate_port",async()=>await lk()),{xctestrunPath:c,jsonPath:d}=await dc(o,"prepare_xctestrun_env",async()=>await cG(s.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(l)},`session-${e.id}-${l}`)),u=await dc(o,"simulator_set_redirect",async()=>await cf(e));try{({child:n,wait:i}=await dc(o,"launch_xcodebuild",()=>{let t;return $("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",cK(e),"1","-destination-timeout",String(20),"-xctestrun",c,"-destination",(t=l5(e),"macOS"===t?`platform=macOS,arch=${l6()}`:"simulator"===e.kind?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(l)},detached:!0})}))}catch(e){throw await u?.release(),e}n.stdout?.on("data",e=>{lP(e,t.logPath,t.traceLogPath,t.verbose)}),n.stderr?.on("data",e=>{lP(e,t.logPath,t.traceLogPath,t.verbose)});let p={sessionId:`${e.id}:${l}:${Date.now()}`,device:e,deviceId:e.id,port:l,xctestrunPath:c,xctestrunArtifact:s,jsonPath:d,testPromise:i,child:n,ready:!1,startupTimeoutMs:"number"==typeof(r=t.startupTimeoutMs)&&Number.isFinite(r)&&r>0?Math.floor(r):void 0,startupTimings:o,simulatorSetRedirect:u??void 0};return cQ.set(e.id,p),p})}async function c2(e){if("simulator"===e.kind)for(let t of cu){let r=await c3(e,t);if(!r||function(e){if(0===e.exitCode)return!0;let t=`${e.stdout}
13
- ${e.stderr}`.toLowerCase();return t.includes("not installed")||t.includes("found nothing")||t.includes("no such file")||t.includes("invalid device")||t.includes("could not find")}(r))continue}}async function c3(e,t){try{return await iD(lu(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(r){N({level:"warn",phase:"ios_runner_startup_cleanup_stale_bundle_failed",data:{deviceId:e.id,bundleId:t,timeoutMs:1e4,error:r instanceof Error?r.message:String(r)}});return}}function c4(e){let t=cQ.get(e);return t?{sessionId:t.sessionId,alive:de(t.child.pid)}:null}async function c5(e,t){await s3(c0,e.deviceId,async()=>{cQ.get(e.deviceId)===e&&(N({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await c8(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function c8(e,t,r={}){let n=t??cQ.get(e);if(n){var i;if(!1!==r.graceful)try{await lI(n.device,n.port,ly({command:"shutdown"}),void 0,15e3)}catch{await dt(n.child.pid,"SIGTERM")}else await dt(n.child.pid,"SIGTERM");try{await Promise.race([n.testPromise,new Promise(e=>setTimeout(e,r.waitTimeoutMs??1e4))])}catch{}(i=n.child.pid)&&(de(i)||k(i))&&await dt(n.child.pid,"SIGKILL"),lO(n.xctestrunPath),lO(n.jsonPath),await n.simulatorSetRedirect?.release(),cQ.get(e)===n&&cQ.delete(e)}}async function c6(e){await s3(c0,e,async()=>{await c8(e)})}async function c9(){let e=Array.from(cQ.values()),t=Array.from(cs);await Promise.allSettled(e.map(async e=>{await dt(e.child.pid,"SIGINT")})),await Promise.allSettled(t.map(async e=>{await dt(e.pid,"SIGINT")})),await Promise.allSettled(e.map(async e=>{await dt(e.child.pid,"SIGTERM")})),await Promise.allSettled(t.map(async e=>{await dt(e.pid,"SIGTERM")})),await Promise.allSettled(e.map(async e=>{await dt(e.child.pid,"SIGKILL")})),await Promise.allSettled(t.map(async e=>{await dt(e.pid,"SIGKILL"),cs.delete(e)})),await Promise.allSettled(e.map(async e=>{await e.simulatorSetRedirect?.release()}))}async function c7(){await c9();let e=Array.from(cQ.keys());await Promise.allSettled(e.map(async e=>{await c6(e)}));let t=Array.from(cs);await Promise.allSettled(t.map(async e=>{try{await dt(e.pid,"SIGTERM"),await dt(e.pid,"SIGKILL")}finally{cs.delete(e)}}))}function de(e){return!!e&&C(e)}async function dt(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 iM("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function dr(e){await iD(lu(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}function dn(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new L("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new L("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function di(e,t,r,n,i,a){var o,s;o=t,s=r.command,o.startupTimingsReported||!o.startupTimings||(o.startupTimingsReported=!0,N({level:"info",phase:"ios_runner_session_startup_timings",durationMs:Object.values(o.startupTimings).reduce((e,t)=>e+t,0),data:{command:s,sessionId:o.sessionId,ready:o.ready,timings:o.startupTimings}}));let l=ly(r);if(lv(l.command)){let r=await x("ios_runner_command_send",async()=>await lI(e,t.port,l,n,i,t,a),{command:l.command,commandId:l.commandId,readOnly:!0,sessionReady:t.ready,timeoutMs:i});return await da(r,t,n)}let c=ei.fromTimeoutMs(i),d=function(e,t){if(!e.ready)return{action:"run",reason:"startup"};if("tap"!==t.command&&"tapSeries"!==t.command)return{action:"run",reason:"conservative_command"};let r=e.lastSuccessfulRunnerResponseAtMs;if(void 0===r)return{action:"run",reason:"no_successful_response"};let n=Date.now()-r;return n>1e4?{action:"run",reason:"successful_response_stale",lastSuccessfulRunnerResponseAgeMs:n}:{action:"skip",reason:"recent_successful_response",lastSuccessfulRunnerResponseAgeMs:n}}(t,l);if("run"===d.action){let r=t.ready?Math.min(5e3,c.remainingMs()):Math.min(dl(t),c.remainingMs());try{let i=await x("ios_runner_readiness_preflight",async()=>await lI(e,t.port,ly({command:"uptime"}),n,r,t,a),{command:l.command,commandId:l.commandId,lastSuccessfulRunnerResponseAgeMs:d.lastSuccessfulRunnerResponseAgeMs,reason:d.reason,sessionReady:t.ready,timeoutMs:r});await da(i,t,n)}catch(e){throw ds(e,{runnerReadinessPreflightFailed:!0})}}else N({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:r.command,commandId:l.commandId,lastSuccessfulRunnerResponseAgeMs:d.lastSuccessfulRunnerResponseAgeMs,reason:d.reason,sessionReady:t.ready}});let u=c.remainingMs();if(u<=0)throw new L("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:i});let p=await x("ios_runner_command_send",async()=>await lb(e,t.port,l,u,a),{command:l.command,commandId:l.commandId}).catch(e=>{if("skip"===d.action){var t;throw ds(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:(t=d).reason,runnerReadinessPreflightSkippedAgeMs:t.lastSuccessfulRunnerResponseAgeMs})}throw e});return await da(p,t,n)}async function da(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new L("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?R(e):"COMMAND_FAILED",i="string"==typeof n.error?.message?n.error.message:void 0,a="string"==typeof n.error?.hint?n.error.hint:void 0;throw new L(t,i??"Runner error",{runner:n,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,logPath:r})}if(t.ready=!0,t.lastSuccessfulRunnerResponseAtMs=Date.now(),n.data&&"object"==typeof n.data&&!Array.isArray(n.data)){var a;let e,t=n.data;return"string"==typeof(e=(a=t).gestureFallback)&&0!==e.length&&N({level:"debug",phase:"ios_runner_gesture_fallback",data:{fallback:e,message:"string"==typeof a.gestureFallbackMessage?a.gestureFallbackMessage:void 0,hint:"string"==typeof a.gestureFallbackHint?a.gestureFallbackHint:void 0}}),t}return{}}function ds(e,t){let r=e instanceof L?e:new L("COMMAND_FAILED",e instanceof Error?e.message:String(e),void 0,e);return new L(r.code,r.message,{...r.details??{},...t},r.cause??e)}function dl(e){return e.startupTimeoutMs??45e3}async function dc(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,N({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}let dd=new m;function du(e,t={}){return{runCommand:e,...t}}function dp(e,t,r,n={}){if(r)return dm(r);let i=function(e,t={}){let r=dd.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?dm(i.provider):dm(t)}async function df(e,t,r){if(!e)return await r();let n={provider:dm(e),deviceId:t.deviceId,requestId:t.requestId};return await dd.run(n,r)}function dm(e){return"function"==typeof e?{runCommand:e}:e}async function dh(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await dv(t,r,n,i,a,o);return await dw(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function dw(e,t){var r,n,i,a;if(!e)return await dg(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,dS({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,dS({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await dg(t,e.reason,e.lifecycleState,e.error)}async function dg(e,t,r,n){throw dS({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 dv(e,t,r,n,i,a){var o,s,l,c,d,u,p,f,m,h;let w,g,v,y,S;if("status"===r.command||!r.commandId?.trim())return;let _=d_(n);try{w=await di(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return N({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:r.command,commandId:r.commandId,error:e instanceof Error?e.message:String(e),..._}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let I="string"==typeof w.lifecycleState?w.lifecycleState:"";return N({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:I,..._}}),o=w,s=I,l=r,c=n,d=i,"completed"===s?function(e,t,r,n){let i=function(e){if("string"!=typeof e||0===e.trim().length)return;let t=function(e){try{let t=JSON.parse(e);if(t&&"object"==typeof t)return t}catch{}return{}}(e);if(t.ok)return t.data&&"object"==typeof t.data&&!Array.isArray(t.data)?t.data:{}}(e.lifecycleResponseJson);if(i)return{type:"recovered",data:i,reason:"completed_with_retained_response",lifecycleState:"completed"};if(lv(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let a=d_(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new L("COMMAND_FAILED",`Runner command "${t.command}" completed after the transport response was lost, but no recoverable response was retained.`,{command:t.command,commandId:t.commandId,lifecycleState:"completed",recovery:"completed_without_retained_response",...a,hint:function(e,t={}){return`${dy(t)}The runner is still reachable and reports "${e}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`}(t.command,a),logPath:n.logPath,transportError:r.message},r)}}(o,l,c,d):"failed"===s?{type:"skipInvalidation",reason:"runner_reported_failure",lifecycleState:s,error:(u=o,p=l,f=c,m=d,g="string"==typeof u.lifecycleErrorCode?u.lifecycleErrorCode:void 0,v="string"==typeof u.lifecycleErrorMessage?u.lifecycleErrorMessage:"Runner command failed",y="string"==typeof u.lifecycleErrorHint?u.lifecycleErrorHint:void 0,S=d_(f),new L(R(g),v,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...S,hint:y??function(e,t={}){return`${dy(t)}The runner is still reachable and reports "${e}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`}(p.command,S),logPath:m.logPath,transportError:f.message},f))}:"accepted"===s||"started"===s?{type:"skipInvalidation",reason:"command_still_in_flight",lifecycleState:s,error:function(e,t,r,n){if(lv(t.command))return r;let i=d_(r);return new L("COMMAND_FAILED",`Runner command "${t.command}" is still ${e} after the transport response was lost.`,{command:t.command,commandId:t.commandId,lifecycleState:e,recovery:"command_still_in_flight",...i,hint:function(e,t,r={}){return`${dy(r)}The runner is still reachable and reports "${e}" is ${t}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`}(t.command,e,i),logPath:n.logPath,transportError:r.message},r)}(s,l,c,d)}:{type:"retainInvalidation",reason:s?"unknown_lifecycle_state":"missing_lifecycle_state",lifecycleState:s,error:new L("COMMAND_FAILED",`Runner command "${l.command}" lost its transport response and lifecycle status was ${s?`"${s}"`:"missing"}, so agent-device invalidated the runner session instead of replaying the command.`,{command:l.command,commandId:l.commandId,lifecycleState:s,recovery:"lifecycle_state_not_recoverable",hint:(h=l.command,`The runner did not confirm that "${h}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`),logPath:d.logPath,transportError:c.message},c)}}function dy(e){return!0!==e.readinessPreflightSkipped?"":"This hot command skipped the uptime preflight because the runner had just responded; status recovery confirmed the runner still observed it. "}function dS(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;N({level:"retained"===i?"warn":"debug",phase:"ios_runner_command_invalidation_decision",data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:void 0!==o,sessionId:r.sessionId,transportError:n.message}})}function d_(e){let t,r,n,i={},a="boolean"==typeof(t=e.details?.runnerReadinessPreflightSkipped)?t:void 0;void 0!==a&&(i.readinessPreflightSkipped=a);let o="string"==typeof(r=e.details?.runnerReadinessPreflightSkipReason)?r:void 0;void 0!==o&&(i.readinessPreflightSkipReason=o);let s="number"==typeof(n=e.details?.runnerReadinessPreflightSkippedAgeMs)?n:void 0;return void 0!==s&&(i.readinessPreflightSkippedAgeMs=s),i}async function dI(e,t){let r;lS(t.requestId);let n=t6(t.requestId),i=ly({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await db({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new L("COMMAND_FAILED","iOS runner prepare failed")}async function db(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await c1(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles}),c=Date.now()-s;try{var d,u;let e=await dk(t,l,r,n,i,c,{recoveryReason:o});return{kind:"prepared",result:(d=t,u=e,dP(d,u),u)}}catch(e){return await dA({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function dA(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:c}=e,d=c instanceof L?c:new L("COMMAND_FAILED",String(c));if(1===l&&(t=d,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&dM(t)))return{kind:"prepared",result:await dx({device:n,session:i,command:a,options:o,signal:s,error:d})};if(!dM(d))throw c;let u=d.message||"runner_health_failed";if(l>=2)throw await dN(i,"prepare_runner_health_failed"),c;return lS(o.requestId),await c5(i,"prepare_runner_health_retry"),N({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 dx(e){var t,r,n,i,a;let{device:o,session:s,command:l,options:c,signal:d,error:u}=e,p=u.message||"runner_health_failed";await c5(s,"prepare_cached_runner_health_failed"),await cD(s.xctestrunArtifact,p);let f=Date.now(),m=await c1(o,{...c,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await dk(o,m,l,c,d,h,{recoveryReason:p});return N({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,dP(t,r),r}catch(r){let e;await dN(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof L?n:new L("COMMAND_FAILED",String(n)),new L(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 dP(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 dN(e,t){try{await c5(e,t)}catch{}}function dM(e){let t;return!re(e)&&(lm(e)||lh(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function dD(e,t,r){let n;lS(r.requestId);let i=t6(r.requestId);try{let a=(n=await c1(e,r)).ready?45e3:dl(n);return await di(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof L?o:new L("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&lh(a)&&n)return lS(r.requestId),await dE({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&&(lm(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return lS(r.requestId),await dE({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&&lm(a))return await dh({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:c5});throw o}}async function dE(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await c5(e.session,a);let o=await c1(t,{...n,cleanStaleBundles:!0});try{let a=await di(t,o,r,n.logPath,45e3,i);return e.recoveredDiagnosticPhase&&N({level:"debug",phase:e.recoveredDiagnosticPhase,data:{command:r.command,commandId:r.commandId,recovery:"session_restarted",sessionId:o.sessionId}}),a}catch(a){let e=a instanceof L?a:new L("COMMAND_FAILED",String(a));if(lm(e))return await dh({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 dk(e,t,r,n,i,a,o){var s,l,c,d,u;let p,f,m=Date.now();return s=await di(e,t,r,n.logPath,n.healthTimeoutMs,i),l=t,c=a,d=Date.now()-m,u=o,p=l.xctestrunArtifact,f={...u?.recoveryReason?{recoveryReason:u.recoveryReason}:{},...u?.failureReason?{failureReason:u.failureReason}:{}},p?{runner:s,cache:p.cache,artifact:p.artifact,buildMs:p.buildMs,connectMs:Math.max(0,c),healthCheckMs:Math.max(0,d),xctestrunPath:p.xctestrunPath,...f}:{runner:s,connectMs:Math.max(0,c),healthCheckMs:Math.max(0,d),...f}}function dP(e,t){N({level:t.failureReason?"warn":"info",phase:"apple_runner_prepare",data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}async function dC(e,t,r={}){dn(e),lS(r.requestId);let n=ly(t),i=dT(e,r);return lv(n.command)?en(()=>(lS(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(lS(r.requestId),lm(e))}):i.runCommand(e,n,r)}function dR(e,t={}){if("ios"!==e.platform)return;let r=dT(e,t);return r.prewarm?r.prewarm(e,t).then(()=>{}).catch(t=>{N({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}})}):void N({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function dO(e,t){dn(e),lS(t.requestId);let r=ly({command:"uptime"}),n=dT(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 dT(e,t){return dp(e,dL,void 0,{requestId:t.requestId})}let dL=du(dD,{prepare:dI,prewarm:async(e,t)=>{await c1(e,t)}}),d$=new WeakMap;async function dF(e){var t,r;let n,i,{sessionStore:a,leaseRegistry:o}=e,s=(n={...(t=function(e){let t=z(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=H(r);if(r&&!n)throw new L("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new L("INVALID_ARGS","session isolation mode tenant requires --tenant (or meta.tenantId).");let i=e.session||"default";return i.startsWith(`${n}:`)?{...e,meta:{...e.meta,tenantId:n,sessionIsolation:t}}:{...e,session:`${n}:${i}`,meta:{...e.meta,tenantId:n,sessionIsolation:t}}}(e.req)).flags??{}},td(t.command,n)?{...t,flags:n}:t);N({level:"info",phase:"request_start",data:{session:s.session,command:s.command,tenant:s.meta?.tenantId,isolation:s.meta?.sessionIsolation}});let l=s.command;!function(e,t){var r;if(r=e.command,na(r)?.leaseAdmissionExempt===!0||e.meta?.sessionIsolation!=="tenant")return;let n=ln(e);t.assertLeaseAdmission({tenantId:n.tenantId,runId:n.runId,leaseId:n.leaseId,backend:n.leaseBackend})}(s,o);let c=function(e){var t,r;let n=e.session||s9;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=le(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(s),d=na(l)?.sessionExecutionLockExempt!==!0?await ls({req:s,sessionName:c,sessionStore:a}):[],u=(r=o,(i=d$.get(r))||(i=new Map,d$.set(r,i)),i);return{req:s,command:l,sessionName:c,throwIfCanceled:()=>t7(s.meta?.requestId),runLocked:async e=>(t7(s.meta?.requestId),0===d.length)?await e():await dU(u,d,async()=>(t7(s.meta?.requestId),await e()))}}async function dU(e,t,r){let[n,...i]=t;return n?await s3(e,n,async()=>await dU(e,i,r)):await r()}function dG(){return{ok:!1,error:T(new L("UNAUTHORIZED","Invalid token"))}}async function dq(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 sO({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function dV(e){N({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=b(),r=A({force:!0})??void 0;return{ok:!1,error:T(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function dj(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function dB(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 dH(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 dK(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new L("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function dW(e,t){let r=(await te(ed(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function dz(e,t){var r,n;let i;dK(t);let a=await dW(e,t),o=te(ed(e)),s=await eh(o,{lines:4e3,timeoutMs:3e3}).catch(()=>"");if(0===s.trim().length)return null;let l=function(e,t,r){let n=new Set;for(let i of(r&&n.add(r),e.split("\n")))if(i.includes(t))for(let e of function(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=[RegExp(`\\bStart proc\\s+(\\d+):${r}(?:\\b|/)`,"i"),RegExp(`\\b(\\d+):${r}(?:\\b|/)`,"i"),RegExp(`${r}.*?\\bpid\\s*[=:]?\\s*(\\d+)\\b`,"i"),RegExp(`\\bpid\\s*[=:]?\\s*(\\d+)\\b.*${r}`,"i")],i=[];for(let t of n){let r=t.exec(e),n=r?.[1];n&&/^\d+$/.test(n)&&i.push(n)}return i}(i,t))n.add(e);return[...n]}(s,t,a);if(0===l.length)return null;let c=(r=s,n=t,i=new Set(l),r.split("\n").filter(e=>{var t;let r;if(!e.trim())return!1;if(e.includes(n))return!0;let a=(t=e,r=/\(\s*(\d+)\)\s*:/.exec(t),r?.[1]??null);return!!a&&i.has(a)}).join("\n"));return 0===c.trim().length?null:{pid:a,text:c,recoveredPids:l}}async function dJ(e,t,r,n,i){let a,o,s="recovering",l=!1,c=(async()=>{try{for(;!l;){let c=await dW(e,t);if(!c){s="recovering",await eB(1e3);continue}let d=e7(ed(e)),u=el(d,{pid:c});a=u;let p=dB(r,{redactionPatterns:n});if(o=dH(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&tX(i,u.pid),s="active",await o,tZ(i),a=void 0,o=void 0,l)break;s="recovering",await eB(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),tZ(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:c,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await dj(o),a&&!a.killed&&a.kill("SIGKILL"),await dj(c),tZ(i)}}}function dX(e,t){let r=dQ(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=dQ(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 dZ(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=ld(["spawn",t,"log","show","--style","compact","--info","--predicate",dX(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 iD(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 dY(e,t,r,n,i,a){let o=await d0({deviceId:e,appBundleId:t,simulatorSetPath:i});return d3({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return ld(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",dX(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function dQ(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function d0(e){let{deviceId:t,appBundleId:r,simulatorSetPath:i}=e,a=await iD(ld(["get_app_container",t,r,"app"],{simulatorSetPath:i}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=n.join(o,"Info.plist"),l=await U("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function d1(e,t,r,n){return d3({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",dX(e)],stream:t,redactionPatterns:r,pidPath:n})}async function d2(e,t,r,n){return d3({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function d3(e){let t="active",r=$(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=dB(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&tX(e.pidPath,n.pid);let a=dH(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),tZ(e.pidPath),r),r=>{throw t="failed",tZ(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await dj(a),n.killed||n.kill("SIGKILL"),await dj(a),tZ(e.pidPath)}}}let d4=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),d5=/https?:\/\/[^\s"'<>\])]+/i,d8=[/\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 d6(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>d7(e)));for(let e of t.entries){let t=d7(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function d9(e,t){let r=uc(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=uc(t?.maxPayloadChars,2048,64,16384),o=uc(t?.maxScanLines,4e3,100,2e4),s=e.split("\n"),l=Math.max(0,s.length-o),c=s.slice(l),d=[];for(let e=c.length-1;e>=0&&d.length<r;e-=1){let t=c[e];if(!t?.trim())continue;let r=function(e,t,r,n,i,a){let o=e[t]?.trim();if(!o)return null;let s=function(e){let t=e.indexOf("{");if(t<0)return null;let r=e.lastIndexOf("}");if(r<=t)return null;let n=e.slice(t,r+1);try{let e=JSON.parse(n);return e&&"object"==typeof e?e:null}catch{return null}}(o),l=ua(s,["method","httpMethod"]),c=ua(s,["url","requestUrl"]),d=function(e,t){if(!e)return null;for(let r of t){let t=e[r];if("number"==typeof t&&Number.isInteger(t))return t;if("string"==typeof t&&/^\d{3}$/.test(t.trim()))return Number.parseInt(t.trim(),10)}return null}(s,["status","statusCode","responseCode"]),u=d4.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=d5.exec(o),h=c??m?.[0];if(!h)return null;let w=d??ut(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:ur(o),packetId:un(o)??void 0,durationMs:ui(o)??void 0,raw:ul(o,a),line:r};if("android"===n&&function(e,t,r){let n=ue(t,r,5),i=e.packetId??n.map(e=>un(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?ue(t,r,12).filter(e=>un(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>ur(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>ut(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>ui(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 us(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=ul(e,a))}if("body"===i||"all"===i){let e=uo(o,s,["requestBody","body","payload","request"]),t=uo(o,s,["responseBody","response"]);e&&(g.requestBody=ul(e,a)),t&&(g.responseBody=ul(t,a))}return g}(c,e,l+e+1,n,i,a);r&&d.push(r)}return{path:t?.path??"<memory>",exists:!0,scannedLines:c.length,matchedLines:d.length,entries:d,include:i,limits:{maxEntries:r,maxPayloadChars:a,maxScanLines:o}}}function d7(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function ue(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 ut(e){for(let t of d8){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function ur(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 un(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function ui(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 ua(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 uo(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return us(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 us(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function ul(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function uc(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let ud={start:async e=>await uy(e)},uu=ih(ud,function(e={}){return{...ud,...e}});async function up(e,t){return await uu.run(e,t)}function uf(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 um(e){let t=n.dirname(e);i.existsSync(t)||i.mkdirSync(t,{recursive:!0}),function(e,t){if(i.existsSync(e)&&!(i.statSync(e).size<t.maxBytes))for(let r=t.maxRotatedFiles;r>=1;r-=1){let t=1===r?e:`${e}.${r-1}`,n=`${e}.${r}`;i.existsSync(t)&&(i.existsSync(n)&&i.unlinkSync(n),i.renameSync(t,n))}}(e,{maxBytes:uf("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:uf("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function uh(e){if(!i.existsSync(e))return{exists:!1,sizeBytes:0};let t=i.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}async function uw(e){var t,r,n,a;let o,s,l,c,{device:d,appBundleId:u,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v}=e,y="macos"===d.platform?"macos":"ios"===d.platform?"device"===d.kind?"ios-device":"ios-simulator":"android",S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},o=uc(t?.maxEntries,25,1,200),s=t?.include??"summary",l=uc(t?.maxPayloadChars,2048,64,16384),c=uc(t?.maxScanLines,4e3,100,2e4),i.existsSync(m)?d9(i.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:o,maxPayloadChars:l,maxScanLines:c}}),_=[],I=await ug({device:d,appBundleId:u,appLogPath:m,appLogState:p});if(I){let e=await dz(d.id,u);if(e){let t=d9(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=d6(t,S,h),_.push((r=I,n=e.recoveredPids,"stale-active"===r.reason?`Session app log stream was still bound to prior Android PID ${r.trackedPid}. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`:`Session app log stream was inactive. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`)))}}if("ios"===d.platform&&"simulator"===d.kind&&u&&0===S.entries.length){let e=await uS({deviceId:d.id,appBundleId:u,startedAt:f,simulatorSetPath:d.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});e&&(e.dump.entries.length>0?(S=d6(e.dump,S,h),_.push(`Recovered ${e.dump.entries.length} iOS simulator HTTP entr${1===e.dump.entries.length?"y":"ies"} from simctl log show (${e.recoveredLineCount} app log lines scanned).`)):e.recoveredLineCount>0&&_.push(`Recovered ${e.recoveredLineCount} recent iOS simulator app log lines from simctl log show, but none looked like HTTP traffic. This app may not emit request URLs, status, or timing into Unified Logging for this repro window.`))}return void 0===p?_.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===_.length&&("ios"===d.platform&&"simulator"===d.kind?_.push("Session app log stream is inactive. The iOS simulator recovery path scanned recent simctl log history, but a fresh logs clear --restart window is still the most reliable repro loop."):_.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===S.entries.length&&_.push("ios"===(a=d).platform&&"simulator"===a.kind?"No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.":"ios"===a.platform?"No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.":"No HTTP(s) entries were found in recent session app logs."),{backend:y,dump:S,notes:_}}async function ug(e){let{device:t,appBundleId:r,appLogPath:a,appLogState:o}=e;if("android"!==t.platform||!r)return null;if(void 0!==o&&"active"!==o)return{reason:"inactive"};if("active"!==o)return null;let s=function(e){let t=function(e){if(!e||!i.existsSync(e))return null;try{return tJ(i.readFileSync(e,"utf8"))}catch{return null}}(e)?.command;if(!t)return null;let r=/(?:^|\s)--pid\s+(\d+)(?:\s|$)/.exec(t);return r?.[1]??null}(n.join(n.dirname(a),tz));if(!s)return null;let l=await dW(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function uv(e,t,r,n){return await uu.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function uy({device:e,appBundleId:t,outPath:r,pidPath:n}){um(r);let a=i.createWriteStream(r,{flags:"a"}),o=function(){let e=process.env.AGENT_DEVICE_APP_LOG_REDACT_PATTERNS;if(!e)return[];let t=e.split(",").map(e=>e.trim()).filter(e=>e.length>0),r=[];for(let e of t)try{r.push(RegExp(e,"gi"))}catch{}return r}();if("ios"===e.platform)return"device"===e.kind?await d2(e.id,a,o,n):await dY(e.id,t,a,o,e.simulatorSetPath,n);if("android"===e.platform)return dK(t),await dJ(e.id,t,a,o,n);if("macos"===e.platform)return await d1(t,a,o,n);throw a.end(),new L("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function uS(e){let t=await dZ({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:d9(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 u_(e){await e.stop(),await dj(e.wait)}async function uI(e,t){let r={},n=[];if(t||n.push("No app bundle is tracked in this session. Run open <app> first for app-scoped logs."),"android"===e.platform){try{let t=await ee(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await ee(e,["shell","pidof",t],{allowFailure:!0,timeoutMs:1e3})).stdout.trim().length>0}catch{r.androidPidVisible=!1}}if("ios"===e.platform&&"simulator"===e.kind)try{let e=await iD(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await iD(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await U("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function ub(e,t){um(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
16
- `;i.appendFileSync(e,r,"utf8")}function uA(e){let t=n.dirname(e),r=n.basename(e);i.existsSync(t)||i.mkdirSync(t,{recursive:!0}),i.existsSync(e)?i.truncateSync(e,0):i.writeFileSync(e,"","utf8");let a=0;for(let e of i.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let o=e.slice(r.length+1);if(/^\d+$/.test(o))try{i.unlinkSync(n.join(t,e)),a+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:a}}function ux(e,t){if("simulator"!==e.kind)throw new L("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function uN(){await iM("open",["-a","Simulator"],{allowFailure:!0,timeoutMs:1e4})}async function uM(e){let t,r;if("simulator"!==e.kind||"Booted"===await uE(e))return;let n=ei.fromTimeoutMs(18e4);try{await ep(async({deadline:n})=>{if(n?.isExpired())throw new L("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:18e4});let i=Math.max(1e3,n?.remainingMs()??18e4),a=await iD(lu(e,["boot",e.id]),{allowFailure:!0,timeoutMs:i});t={stdout:String(a.stdout??""),stderr:String(a.stderr??""),exitCode:a.exitCode};let o=`${t.stdout}
17
- ${t.stderr}`.toLowerCase(),s=o.includes("already booted")||o.includes("current state: booted");if(0!==t.exitCode&&!s)throw new L("COMMAND_FAILED","simctl boot failed",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let l=await iD(lu(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:i});if(r={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==r.exitCode)throw new L("COMMAND_FAILED","simctl bootstatus failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let c=await uE(e);if("Booted"!==c)throw new L("COMMAND_FAILED","Simulator is still booting",{state:c})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let n=es({error:e,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});return"IOS_BOOT_TIMEOUT"!==n&&"CI_RESOURCE_STARVATION_SUSPECTED"!==n}},{deadline:n,phase:"boot",classifyReason:e=>es({error:e,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(a){let i=es({error:a,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});throw new L("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:18e4,elapsedMs:n.elapsedMs(),reason:i,hint:ec(i),boot:t,bootstatus:r})}await uN()}async function uD(e){let t=lu(e,["shutdown",e.id]),r=await iD(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===r.exitCode,exitCode:r.exitCode,stdout:String(r.stdout??""),stderr:String(r.stderr??"")}}async function uE(e){let t="string"==typeof e?e:e.id,r="string"==typeof e?ld(["list","devices","-j"]):lu(e,["list","devices","-j"]),n=await iD(r,{allowFailure:!0,timeoutMs:6e4});if(0!==n.exitCode)return null;try{let e=JSON.parse(String(n.stdout??""));for(let r of Object.values(e.devices??{})){let e=r.find(e=>e.udid===t);if(e)return e.state}return null}catch{return null}}let uk="shared_prefs/ReactNativeDevPrefs.xml",uP="debug_http_host",uC="dev_server_https",uR="RCT_jsLocation",uO="RCT_packager_scheme",uT="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.",uL='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function u$(e){return void 0!==E(e)}async function uF(e){let{device:t,appId:r,runtime:n}=e;if(!r)return;let i=E(n);if(i){if("android"===t.platform)return void await uG(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await uB(t,r,i)}}async function uU(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await uq(t,r);"ios"===t.platform&&"simulator"===t.kind&&await uH(t,r)}}async function uG(e,t,r){var n,i,a,o,s,l;let c,d;uJ(t);let u=(n=await uV(e,t),i=uP,a=`${r.host}:${r.port}`,c=` <string name="${uX(i)}">${uX(a)}</string>`,uW(uz(n,i),c));o=u,s=uC,l="https"===r.scheme,d=` <boolean name="${uX(s)}" value="${l?"true":"false"}" />`,u=uW(uz(o,s),d),await uj(e,t,u)}async function uq(e,t){uJ(t);let r=await uV(e,t),n=uz(r,uP),i=uz(n,uC);i!==r&&await uj(e,t,i)}async function uV(e,t){let r=await ee(e,["shell","run-as",t,"cat",uk],{allowFailure:!0});return 0!==r.exitCode?uL:uK(r.stdout)}async function uj(e,t,r){let n=["shell","run-as",t,"id"],i=await ee(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=uZ(i.stdout,i.stderr);throw new L("COMMAND_FAILED",e?`Failed to access Android app sandbox for ${t}`:`Failed to probe Android app sandbox for ${t}`,{package:t,cmd:"adb",args:n,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,hint:e?uT:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await ee(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await ee(e,["shell","run-as",t,"tee",uk],{stdin:r.trimEnd()})}catch(n){let e=O(n);if("TOOL_MISSING"===e.code)throw e;let r=uZ("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new L("COMMAND_FAILED",r?`Failed to access Android app sandbox for ${t}`:`Failed to write Android runtime hints for ${t}`,{...e.details??{},package:t,cmd:"adb",phase:"write-runtime-hints",hint:r?uT:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function uB(e,t,r){await iD(lu(e,["spawn",e.id,"defaults","write",t,uR,"-string",`${r.host}:${r.port}`])),await iD(lu(e,["spawn",e.id,"defaults","write",t,uO,"-string",r.scheme]))}async function uH(e,t){await iD(lu(e,["spawn",e.id,"defaults","delete",t,uR]),{allowFailure:!0}),await iD(lu(e,["spawn",e.id,"defaults","delete",t,uO]),{allowFailure:!0})}function uK(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
18
- `:uL}function uW(e,t){return uK(e).replace("</map>",`${t}
19
- </map>`)}function uz(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return uK(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 uJ(e){if("binary"!==em(e))return;let t=ev(e);throw new L("INVALID_ARGS",t,{package:e,hint:t})}function uX(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function uZ(e,t){let r=`${e}
20
- ${t}`.toLowerCase();return["run-as: package not debuggable","run-as: permission denied","run-as: package is unknown","run-as: unknown package","is unknown","is not an application","could not set capabilities"].some(e=>r.includes(e))}let uY=new Map;async function uQ(e){let r=await h.mkdtemp(n.join(d.tmpdir(),"agent-device-materialized-"));try{let i=await u2(e.installablePath,n.join(r,"installable")),a=e.archivePath?await u2(e.archivePath,n.join(r,"archive")):void 0,o=t.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,c=setTimeout(()=>{u0(o)},s);return uY.set(o,{rootPath:r,installablePath:i,archivePath:a,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:c}),{materializationId:o,installablePath:i,...a?{archivePath:a}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await h.rm(r,{recursive:!0,force:!0}),e}}async function u0(e,t){let r=uY.get(e);if(!r)throw new L("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new L("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),uY.delete(e),await h.rm(r.rootPath,{recursive:!0,force:!0})}async function u1(e){let t=Array.from(uY.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await u0(e)}))}async function u2(e,t){let r=await h.stat(e);await h.mkdir(t,{recursive:!0});let i=n.join(t,n.basename(e));return r.isDirectory()?await h.cp(e,i,{recursive:!0}):await h.copyFile(e,i),i}async function u3(e,t){let r=["devicectl",...e],n=await iD(r,{allowFailure:!0,timeoutMs:2e4});if(0===n.exitCode)return;let i=String(n.stdout??""),a=String(n.stderr??"");throw new L("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:r,exitCode:n.exitCode,stdout:i,stderr:a,deviceId:t.deviceId,hint:u9(i,a)??u6})}async function u4(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 u8(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 u5(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 u8(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 u8(e,t){let r=n.join(d.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),i=[...t.args,"--json-output",r],a=await iD(i,{allowFailure:!0,timeoutMs:2e4});try{if(0!==a.exitCode){let r=String(a.stdout??""),n=String(a.stderr??"");throw new L("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:i,exitCode:a.exitCode,stdout:r,stderr:n,deviceId:e.id,hint:u9(r,n)??u6})}return JSON.parse(await o.readFile(r,"utf8"))}catch(r){if(r instanceof L)throw r;throw new L("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await o.unlink(r).catch(()=>{})}}let u6="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function u9(e,t){let r=`${e}
21
- ${t}`.toLowerCase();return r.includes("device is busy")&&r.includes("connecting")?"iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.":r.includes("coredeviceservice")&&r.includes("timed out")?"CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.":null}let u7=new Map;async function pe(e){var t;let r,n=(r="simulator"===(t=e).kind?t.simulatorSetPath??"":"",JSON.stringify([t.platform,t.kind,t.id,t.target??"",r])),i=u7.get(n);if(void 0!==i){if(i>Date.now())return;u7.delete(n)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:t}=await Promise.resolve(th);await t(e),pt(n);return}if("device"===e.kind){await pr(e.id),pt(n);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./8806.js");await t(e.id),pt(n)}}function pt(e){u7.set(e,Date.now()+5e3)}async function pr(e){let t=n.join(d.tmpdir(),`agent-device-ready-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),r=Math.max(1,Math.ceil(15));try{let n=await iD(["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 pn(t);if(0===n.exitCode){if(!o.parsed)throw new L("COMMAND_FAILED","iOS device readiness probe failed",{kind:"probe_inconclusive",deviceId:e,stdout:i,stderr:a,hint:"CoreDevice returned success but readiness JSON output was missing or invalid. Retry; if it persists restart Xcode and the iOS device."});let t=o?.tunnelState?.toLowerCase();if("connecting"===t)throw new L("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:e,tunnelState:t,hint:"Device tunnel is still connecting. Keep the device unlocked and connected by cable until it is fully available in Xcode Devices, then retry."});return}throw new L("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:e,stdout:i,stderr:a,exitCode:n.exitCode,tunnelState:o?.tunnelState,hint:pi(i,a)})}catch(t){if(t instanceof L&&"COMMAND_FAILED"===t.code){if("not_ready"===("string"==typeof t.details?.kind?t.details.kind:""))throw t;let r=t.details??{},n=String(r.stdout??""),i=String(r.stderr??""),a=Number(r.timeoutMs??15e3),o=`CoreDevice did not respond within ${a}ms. Keep the device unlocked and trusted, then retry; if it persists restart Xcode and the iOS device.`;throw new L("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:a,stdout:n,stderr:i,hint:n||i?pi(n,i):o},t)}throw new L("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,hint:"Reconnect the device, keep it unlocked, and retry."},t instanceof Error?t:void 0)}finally{await o.rm(t,{force:!0}).catch(()=>{})}}async function pn(e){try{let t=await o.readFile(e,"utf8"),r=JSON.parse(t),n=function(e){let t=e?.result;if(!t||"object"!=typeof t)return{};let r=t.connectionProperties?.tunnelState,n=t.device?.connectionProperties?.tunnelState,i="string"==typeof r?r:"string"==typeof n?n:void 0;return i?{tunnelState:i}:{}}(r);return{parsed:!0,tunnelState:n.tunnelState}}catch{return{parsed:!1}}}function pi(e,t){let r=u9(e,t);return r||(`${e}
22
- ${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":u6)}let pa=300,po=300;function ps(e,t,r){return t||r7(r,r8)?null:aE("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function pl(e){return"string"==typeof e?.session&&e.session.trim().length>0}function pc(e){return"ios"===e.platform&&"simulator"===e.kind}async function pd(e,t){pc(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function pu(e){let t=r7(e.flags,r8)||!e.session?await rY(e.flags??{}):await pp(e.session.device);return!1!==e.ensureReady&&await pe(t),t}async function pp(e){if("ios"!==e.platform||"simulator"!==e.kind||"darwin"!==process.platform)return e;let t={platform:"ios",target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await rY(t)}catch(e){if(!(e instanceof L)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await rY({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function pf(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 pm(e,t){return!!t&&0===s8(t,e).length}async function ph(e){let t=await ee(e,["emu","kill"],{allowFailure:!0,timeoutMs:15e3});return{success:0===t.exitCode,exitCode:t.exitCode,stdout:String(t.stdout??""),stderr:String(t.stderr??"")}}async function pw(e){let{device:t,shutdownRequested:r}=e;if(r&&(pc(t)||"android"===t.platform&&"emulator"===t.kind))try{return pc(t)?await uD(t):await ph(t)}catch(t){let e=T(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function pg(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 iz("dismiss",t).catch(t=>{N({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function pv(e,t){e.appLog&&await u_(e.appLog),rV(e.device.platform)&&await pg(e),await u1(t).catch(()=>{})}async function py(e){let t,{req:r,sessionName:n,logPath:i,sessionStore:a}=e,o=a.get(n);if(!o)return await pS(r,i);o.appLog&&await u_(o.appLog),r.positionals&&r.positionals.length>0&&(rV(o.device.platform)&&await pg(o),await n1(o.device,"close",r.positionals,r.flags?.out,{...aw(i,r.flags,o.appBundleId,o.trace?.outPath)}),await pd(o.device,pa)),rV(o.device.platform)&&(t=(r.positionals?.length??0)>0,!pc(o.device)||t||r.flags?.shutdown||o.recording)?await pg(o):rV(o.device.platform)&&N({level:"debug",phase:"ios_runner_retained_after_close",data:{session:o.name,deviceId:o.device.id}}),u$(a.getRuntimeHints(n))&&o.appBundleId&&await uU({device:o.device,appId:o.appBundleId}).catch(()=>{}),a.recordAction(o,{command:"close",positionals:r.positionals??[],flags:r.flags??{},result:{session:o.name,...eK(`Closed: ${o.name}`)}}),r.flags?.saveScript&&(o.recordSession=!0),a.writeSessionLog(o),await u1(n).catch(()=>{}),a.delete(n);let s=await pw({device:o.device,shutdownRequested:r.flags?.shutdown});return s?{ok:!0,data:eW({session:o.name,shutdown:s},`Closed: ${o.name}`)}:{ok:!0,data:{session:o.name,...eK(`Closed: ${o.name}`)}}}async function pS(e,t){if(!e.positionals||0===e.positionals.length)return aE("SESSION_NOT_FOUND","No active session");let r=await pu({session:void 0,flags:e.flags,ensureReady:!0});return await n1(r,"close",e.positionals,e.flags?.out,{...aw(t,e.flags)}),await pd(r,pa),{ok:!0,data:{app:e.positionals[0],...eK(`Closed: ${e.positionals[0]}`)}}}async function p_(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 pI(e){i.existsSync(e)&&i.unlinkSync(e)}function pb(e){if(!i.existsSync(e))return null;try{let t=JSON.parse(i.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function pA(e){let t=pb(e);if(!t||t.pid===process.pid)try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}function px(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function pN(e,t){return new Promise((r,n)=>{e.once("error",n),e.listen(0,"127.0.0.1",()=>{e.off("error",n);let i=e.address();"object"==typeof i&&i?.port?r(i.port):n(new L("COMMAND_FAILED",t))})})}(async function(e={}){let r,a,o=e.env??process.env,s=e.stdout??process.stdout,l=e.stderr??process.stderr,c=e.exit??(e=>process.exit(e)),{baseDir:d,infoPath:u,lockPath:p,logPath:f,sessionsDir:m}=W(o.AGENT_DEVICE_STATE_DIR),h=X(o.AGENT_DEVICE_DAEMON_SERVER_MODE);var g,v,y,S=m;if(i.existsSync(S))for(let e of i.readdirSync(S,{withFileTypes:!0})){if(!e.isDirectory())continue;let t=n.join(S,e.name,tz);if(i.existsSync(t))try{let e=tJ(i.readFileSync(t,"utf8"));if(e&&function(e){let t,r=M(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=D(e.pid);return!!n&&!!((t=n.toLowerCase().replaceAll("\\","/")).includes("log stream")||t.includes("logcat")||t.includes("devicectl device log stream"))&&(!e.command||n===e.command)}(e))try{process.kill(e.pid,"SIGTERM")}catch{}}catch{}finally{tZ(t)}}let _=new tW(m),x=new rG({maxActiveSimulatorLeases:px(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:px(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:px(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:px(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),E=e6(),k=t.randomBytes(24).toString("hex"),C=M(process.pid)??void 0,$=Z(),F=function(e){let{logPath:t,token:r,androidAdbProvider:i,appleRunnerProvider:a,appleToolProvider:o,linuxToolProvider:s,appLogProvider:l,recordingProvider:c,deviceInventoryProvider:d,trackDownloadableArtifact:u}=e,{sessionStore:p,leaseRegistry:f}=e;async function m(e){let n=!!(e.meta?.debug||e.flags?.verbose);return await I({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:n,logPath:t},async()=>{if(e.token!==r)return dG();try{return await r1(d,async()=>{let t=await dF({req:e,sessionStore:p,leaseRegistry:f});return await h(t)})}catch(e){return dV(e)}})}async function h(e,r){let d=async()=>{let d=function(e){var t,r,i;let a,{scope:o,logPath:s,sessionStore:l,trackDownloadableArtifact:c}=e;o.throwIfCanceled();let d=l.get(o.sessionName);d&&(!function(e){var t;let r;if(!((r=(t=e).recording)&&"ios"===t.device.platform&&"ios"!==r.platform&&!1!==r.showTouches))return;let n=e.recording,i=c4(e.device.id);if(!n.runnerSessionId){i?.alive&&(n.runnerSessionId=i.sessionId);return}if(!i?.alive){n.invalidatedReason??="iOS runner session exited during recording";return}i.sessionId!==n.runnerSessionId&&(n.invalidatedReason??="iOS runner session restarted during recording")}(d),l.set(o.sessionName,d));let u=(a=(t={req:o.req,sessionName:o.sessionName,sessionStore:l}).sessionStore.get(t.sessionName),{req:li(t.req,a),existingSession:a}),p=u.req;d=u.existingSession;let f=e=>(function(e,t,r){let i=b();if(!t.ok){N({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=A({force:!0})??void 0;return{ok:!1,error:T(new L(R(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??("string"==typeof t.error.details?.hint?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath}),{diagnosticId:i.diagnosticId,logPath:e})}}return N({level:"info",phase:"request_success"}),A(),{ok:!0,data:function(e,t,r){var i,a;let o;if(!t)return t;let s=(i=e,o=Array.isArray((a=t).artifacts)?[...a.artifacts]:[],"screenshot"!==i.command||o.some(e=>e?.field==="path")||"string"!=typeof a.path||o.push({field:"path",path:a.path,localPath:i.meta?.clientArtifactPaths?.path,fileName:n.basename(i.meta?.clientArtifactPaths?.path??a.path)}),o.filter(e=>!!(e&&"string"==typeof e.field&&"string"==typeof e.path&&"string"==typeof e.localPath&&e.localPath.length>0)));return 0===s.length?t:{...t,artifacts:s.map(t=>{let n=t.path;return{field:t.field,artifactId:r({artifactPath:n,tenantId:e.meta?.tenantId,fileName:t.fileName}),fileName:t.fileName,localPath:t.localPath}})}}(e,t.data,r)}})(p,e,c);if(d?.recording?.invalidatedReason&&(r=o.command,na(r)?.allowInvalidRecording!==!0))return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:d.recording.invalidatedReason}})};d&&!p.meta?.lockPolicy&&(i=o.command,na(i)?.selectorValidationExempt!==!0)&&function(e,t){let r=s8(e,t);if(0!==r.length)throw new L("INVALID_ARGS",`Session "${e.name}" is already bound to ${s4(e)}, but this request selected ${r.map(s6).join(", ")}.`,{session:e.name,conflicts:r.map(s6),hint:s5(e,"selector-conflict")})}(d,p.flags);let m=(e,t,r)=>{let n;return{...aw(s,e,t,r,n=b().requestId),requestId:n}};return{type:"scope",scope:{req:p,sessionName:o.sessionName,existingSession:d,finalize:f,contextFromFlags:m,handlerContextFromFlags:(e,t,r)=>({...m(e,t,r),surface:l.get(o.sessionName)?.surface})}}}({scope:e,logPath:t,sessionStore:p,trackDownloadableArtifact:u});if("response"===d.type)return d.response;let f=d.scope,m=async e=>await w({lockedScope:f,providerScope:e,allowReplayActions:void 0===r});return r?await m(r):await ns({req:f.req,existingSession:f.existingSession,providers:{androidAdbProvider:i,appleRunnerProvider:a,appleToolProvider:o,linuxToolProvider:s,appLogProvider:l,recordingProvider:c}},m)};return r?await d():await e.runLocked(d)}async function w(e){var n,i;let{lockedScope:a,providerScope:o,allowReplayActions:s}=e,l=await sK({req:a.req,sessionName:a.sessionName,logPath:t,sessionStore:p,leaseRegistry:f,invoke:m,invokeReplayAction:s?(n=a,i=o,async e=>{var t,a,o;if(t=e,a=n,t.session!==a.sessionName||(o=t.command,na(o)?.replayScopedAction!==!0))return await m(e);if(e.token!==r)return dG();try{let t=await dF({req:e,sessionStore:p,leaseRegistry:f});return t.sessionName===n.sessionName?await h(t,i):await m(e)}catch(e){return dV(e)}}):void 0,androidAdbExecutor:o.androidAdbExecutor,contextFromFlags:a.handlerContextFromFlags});return l?a.finalize(l):await dq({lockedScope:a,logPath:t,sessionStore:p})}return m}({logPath:f,token:k,sessionStore:_,leaseRegistry:x,trackDownloadableArtifact:rr}),U=async e=>{await I({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{N({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),A({force:!0})})},G=async e=>{let t=pv(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
23
- `)});await Promise.race([t,eB(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
24
- `)})]),_.writeSessionLog(e),_.delete(e.name)},q=async()=>{let e=_.toArray();await Promise.all(e.map(G))},V=async()=>{let e,t,r=[];if("http"!==h){let t,n,i=(t=new Set,(n=w.createServer(e=>{t.add(e),e.on("close",()=>t.delete(e));let r="",n=0,i=new Set,a=!1,o=()=>{if(!a&&0!==n){for(let e of(a=!0,i))t4(e);N({level:"warn",phase:"request_client_disconnected",data:{inFlightRequests:n}}),(async()=>{try{let e=Date.now()+15e3;for(;n>0&&Date.now()<e;){let{abortAllIosRunnerSessions:e}=await Promise.resolve(tf);if(await e(),n<=0)break;await eB(200)}}catch(e){N({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e),inFlightRequests:n}})}})()}};e.setEncoding("utf8"),e.on("close",o),e.on("error",o),e.on("data",async t=>{let a=j(r,t);for(let t of(r=a.buffer,a.lines)){let r,a;n+=1;let o=!1;try{let n=JSON.parse(t);if(o=K(n),a=t2(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),t3(a),t8(a))throw t9();r=await rm(o?t=>{e.destroyed||e.write(Y(t))}:void 0,async()=>await F(n))}catch(e){r={ok:!1,error:T(e)}}finally{n-=1,a&&(i.delete(a),t5(a))}e.destroyed||e.write(o?B(r):`${JSON.stringify(r)}
25
- `)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await pN(i,"Failed to bind socket server")}if("socket"!==h){let e=await rC({handleRequest:F,token:k});r.push(e),t=await pN(e,"Failed to bind HTTP server")}return{servers:r,socketPort:e,httpPort:t}};if(!function(e,t,r){i.existsSync(e)||i.mkdirSync(e,{recursive:!0});let n=JSON.stringify(r,null,2),a=()=>{try{return i.writeFileSync(t,n,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(a())return!0;let o=pb(t);if(o?.pid&&o.pid!==process.pid&&P(o.pid,o.processStartTime))return!1;try{i.unlinkSync(t)}catch{}return a()}(d,p,{pid:process.pid,version:E,startedAt:Date.now(),processStartTime:C}))return l.write("Daemon lock is held by another process; exiting.\n"),c(0),null;let H=[];try{let e,t=await V();H=t.servers,r=t.socketPort,a=t.httpPort,g=r,v=a,y={socketPort:g,httpPort:v,token:k,version:E,codeSignature:$,processStartTime:C},i.existsSync(d)||i.mkdirSync(d,{recursive:!0}),i.writeFileSync(f,""),e=y.socketPort&&y.httpPort?"dual":y.httpPort?"http":"socket",i.writeFileSync(u,JSON.stringify({port:y.socketPort,httpPort:y.httpPort,transport:e,token:y.token,pid:process.pid,version:y.version,codeSignature:y.codeSignature,processStartTime:y.processStartTime,stateDir:d},null,2),{mode:384}),g&&s.write(`AGENT_DEVICE_DAEMON_PORT=${g}
10
+ ${r}`.toLowerCase()).includes("device is busy")&&n.includes("connecting")?"Target iOS device is still connecting. Keep it unlocked, wait for device trust/connection to settle, then retry.":`${ed("IOS_RUNNER_CONNECT_TIMEOUT")} ${ly}`)})}function lA(e){return"interactionFrame"===e||"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function lx(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${t.randomUUID()}`}}function lN(e){if(rt(e))throw rn()}let lM=new Map;async function lE(e,t,r,n,i=45e3,a,o){let s=ea.fromTimeoutMs(i),{getEndpoints:l}=lT(e,t),{endpoints:c}=await l(s.remainingMs()),d=null,u=Math.max(1,Math.ceil(i/250));try{return await ef(async({deadline:s})=>{let u=await lD({device:e,port:t,command:r,timeoutMs:i,logPath:n,session:a,endpoints:c,getEndpoints:l,signal:o,attemptDeadline:s,setEndpoints:e=>{c=e},setLastError:e=>{d=e}});if(u)return u;throw function(e){if(e.signal?.aborted)throw rn();return new $("COMMAND_FAILED","Runner endpoint probe failed",{port:e.port,endpoints:e.endpoints,lastError:e.lastError?String(e.lastError):void 0})}({port:t,endpoints:c,lastError:d,signal:o})},{maxAttempts:u,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:l_},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||ra(e))throw rn();d||(d=e)}if(o?.aborted)throw rn();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw lI({port:t,endpoints:c,logPath:n,lastError:d});let a=await lq(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw lI({port:t,endpoints:c,logPath:n,lastError:d})}async function lD(e){await lk(e);let t=await lP(e);if(t.response)return t.response;let r=await lC(e);return r||await lR(e,t.usedCachedTunnelIp)}async function lk(e){if(e.attemptDeadline?.isExpired())throw new $("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 lb({session:e.session,port:e.port,logPath:e.logPath})}async function lP(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 lL(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,lM.delete(i))}}),usedCachedTunnelIp:r}}async function lC(e){return"simulator"===e.device.kind&&e.session?.ready?await l$(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function lR(e,t){var r;if("device"!==e.device.kind||!t)return null;r=e.device.id,lM.delete(r);let n=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(n.endpoints),await lL(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 lO(e,t,r,n=45e3,i){if(i?.aborted)throw rn();let a=ea.fromTimeoutMs(n),{getEndpoints:o}=lT(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new $("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let c=a.remainingMs();if(c<=0)throw new $("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await lU(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},c,i)}function lT(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,c=await lF({device:e,timeoutBudgetMs:n,forceRefresh:i,requestTunnelIp:r,setRequestTunnelIp:e=>{r=e}});return{endpoints:(a=e,o=t,s=c.ip,l=[`http://127.0.0.1:${o}/command`],"device"!==a.kind||s&&l.unshift(`http://[${s}]:${o}/command`),l),cached:c.sharedCacheHit}}}}async function lL(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 $("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await lU(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 rn();s(t,e)}return null}async function l$(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 lq(e,t,r,s,i);return new Response(n.body,{status:n.status})}catch(e){if(i?.aborted||ra(e))throw rn();return o(e),null}}async function lF(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=lM.get(t))?e.expiresAt<=Date.now()?(lM.delete(t),null):e.ip:null);if(r)return{ip:r,sharedCacheHit:!0};if(void 0!==s)return{ip:s,sharedCacheHit:!1}}let c=await lG(i.id,a);return l(c),c&&(r=i.id,n=c,lM.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:c,sharedCacheHit:!1}}async function lU(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 lG(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,a=n.join(d.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),n=await iO(["devicectl","device","info","details","--device",e,"--json-output",a,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==n.exitCode||!i.existsSync(a))return null;let o=JSON.parse(i.readFileSync(a,"utf8"));if(o.info?.outcome&&"success"!==o.info.outcome)return null;let s=(o.result?.connectionProperties?.tunnelIPAddress??o.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{lK(a)}}async function lq(e,t,r,n,i){let a=JSON.stringify(r),o=lg(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 iO(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=el({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new $("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:ed(e)})}return{status:200,body:l}}async function lV(){return await new Promise((e,t)=>{let r=w.createServer();r.listen(0,"127.0.0.1",()=>{let n=r.address();if("object"==typeof n&&n?.port){let t=n.port;r.close(()=>e(t))}else r.close(()=>t(new $("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function lj(e,t,r,n){t&&lH(t,e),r&&lH(r,e),n&&process.stderr.write(e)}let lB=new Map;function lH(e,t){let r=(lB.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await i.promises.mkdir(n.dirname(e),{recursive:!0}),await i.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{lB.get(e)===r&&lB.delete(e)});lB.set(e,r)}function lK(e){try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}let lW=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function lz(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new $("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",xctestrunPath:r});let n=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of n)if(!i.existsSync(e))throw new $("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await lJ(e)){await iR("codesign",["--remove-signature",e],{allowFailure:!0});try{await iR("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof $?n:new $("COMMAND_FAILED",String(n));throw new $("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 lJ(e){return 0===(await iR("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let lX=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),lZ=new Set([" "," ","\n","\r"]),lY=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function lQ(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new l1(e).parse()}function l0(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)}l0(r.children,t)}}class l1{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(lY.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?l2(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])&&lX.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,l2(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])&&lZ.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function l2(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 l3=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function l4(e){var t;let r=await l5(e);if(!r||0===r.length)return null;let a=n.dirname(e),o=new Set,s=function(e,t){let r=[],i=new Set,a=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){a.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);r.push(n.join(t,e));let s=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(e);s&&i.add(n.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(i),hostRelativePaths:a}}(r,a);for(let e of s.testRootPaths){if(!i.existsSync(e))return null;o.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>i.existsSync(n.join(t,e)));return r?n.join(r,e):null})){if(!e)return null;o.add(e)}return Array.from(o)}async function l5(e){let t=await iT(e);if(t){var r,n,a,o=t;let e=new Set;for(let t of[a=o,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!l8(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(l8))}return r}(a),...Object.values(a).filter(e=>l8(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(l3.has(r)){if("string"==typeof n){t.add(n);continue}if(Array.isArray(n))for(let e of n)"string"==typeof e&&t.add(e)}return Array.from(t)}(t))e.add(r);return Array.from(e)}if("darwin"===process.platform)return null;try{let t;return r=i.readFileSync(e,"utf8"),n=lQ(r),t=new Set,l0(n,(e,r)=>{if(l3.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 l8(e){return!!e&&"object"==typeof e}let l6=["CFBundleIcons","CFBundleIcons~ipad"];async function l9(e){let t=e.filter(cn);if(0===t.length)return;let r=e.filter(e=>ca(e)&&!ci(e));for(let e of t){let t=function(e,t){let r=n.dirname(e);return t.find(e=>n.dirname(e)===r&&"AgentDeviceRunner.app"===n.basename(e))??t.find(t=>n.dirname(t)===r&&t!==e)??null}(e,r);t&&await l7(t,e)}}async function l7(e,t){var r;let a,o=function(e,t){let r=!1;for(let o of i.readdirSync(e,{withFileTypes:!0})){var a;if(o.isFile()&&(a=o.name,/^AppIcon.*\.png$/.test(a)||"Assets.car"===a))(function(e,t){if(i.existsSync(t)){let r=i.readFileSync(e),n=i.readFileSync(t);return!r.equals(n)&&(i.copyFileSync(e,t),!0)}return i.copyFileSync(e,t),!0})(n.join(e,o.name),n.join(t,o.name))&&(r=!0)}return r}(e,t),s=await ce(e,t);(o||s)&&(await cr(t),r=t,a=new Date,i.utimesSync(r,a,a))}async function ce(e,t){var r,i;let a=n.join(e,"Info.plist"),o=n.join(t,"Info.plist"),s=await iT(a),l=await iT(o);if(!s||!l)return!1;let c=(r=s,i=l,l6.flatMap(e=>{let t=r[e];return void 0===t||JSON.stringify(i[e])===JSON.stringify(t)?[]:[{key:e,value:t,shouldInsert:void 0===i[e]}]}));if(0===c.length)return!1;for(let e of c)await ct(o,e.key,e.value,e.shouldInsert);return!0}async function ct(e,t,r,n){let i=await iR("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new $("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function cr(e){let t=await iR("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new $("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function cn(e){return ca(e)&&ci(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function ci(e){return n.basename(e).endsWith("-Runner.app")}function ca(e){return n.basename(e).endsWith(".app")}let co={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 cs(e){var t;if("ios"!==e.platform&&"macos"!==e.platform)throw new $("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":"macos"===(t=e.target)||"desktop"===t?"macOS":"tv"===t?"tvOS":"iOS"}function cl(e){return"simulator"===e?"simulator":"device"}function cc(){return"arm64"===process.arch?"arm64":"x86_64"}let cd="XCTestDevices",cu=".agent-device-backup",cp=".agent-device-xctestdevices-backup-",cf=n.join(d.homedir(),".agent-device","ios-runner"),cm=".agent-device-runner-cache.json",ch={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},cw=new Map,cg=new Set,cv=new Map,cy=new Set;function cS(e){return e?.trim()??""}function c_(e=process.env){return cS(e.AGENT_DEVICE_IOS_BUNDLE_ID)||cS(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function cI(e=process.env){let t=cS(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${c_(e)}.uitests`}let cb=function(e=process.env){let t=c_(e),r=cI(e);return Array.from(new Set([cS(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function cA(e=d.homedir()){return n.join(e,"Library","Developer","XCTestDevices")}async function cx(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=er(e.simulatorSetPath);if(!r)return null;let a=n.resolve(r),o=n.resolve(t.xctestDeviceSetPath??cA()),s=n.resolve(t.backupPath??function(e=cA()){return`${e}${cu}`}(o)),l=n.resolve(t.lockDirPath??function(e=d.homedir()){return n.join(e,".agent-device","xctest-device-set.lock")}()),c=t.ownerStartTime??E(process.pid),u=await cE({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:c,acquiredAtMs:t.nowMs??Date.now()}});try{if(cN({xctestDeviceSetPath:o,backupPath:s}),function(e,t){if(n.resolve(e)===n.resolve(t))return!0;try{return i.realpathSync.native(e)===i.realpathSync.native(t)}catch{return!1}}(a,o))return await u(),null;i.mkdirSync(a,{recursive:!0}),i.existsSync(o)&&i.renameSync(o,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,a=n.dirname(r),o=n.join(a,`${cd}.agent-device-link-${process.pid}-${Date.now()}`);i.mkdirSync(a,{recursive:!0});try{i.symlinkSync(t,o,"dir"),i.renameSync(o,r)}catch(e){throw i.existsSync(o)&&cM(o),e}}({requestedSetPath:a,xctestDeviceSetPath:o})}catch(e){throw cN({xctestDeviceSetPath:o,backupPath:s}),await u(),new $("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:a,xctestDeviceSetPath:o,backupPath:s,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{cN({xctestDeviceSetPath:o,backupPath:s})}finally{await u()}}}}}function cN(e){let{xctestDeviceSetPath:t,backupPath:r}=e,a=[r,...function(e){let t=n.dirname(e),r=n.basename(e).replace(cu,""),a=r===cd?cp:`${r}${cp}`;try{return i.readdirSync(t).filter(e=>e.startsWith(a)).sort().map(e=>n.join(t,e))}catch{return[]}}(r)],o=a.find(e=>i.existsSync(e)),s=i.existsSync(t)&&i.lstatSync(t).isSymbolicLink();if(o){if(s&&cM(t),i.existsSync(t))if(!s)return void M({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:o}});else o!==r?i.rmSync(o,{recursive:!0,force:!0}):i.rmSync(r,{recursive:!0,force:!0});else i.mkdirSync(n.dirname(t),{recursive:!0}),i.renameSync(o,t);for(let e of a)e!==o&&i.existsSync(e)&&i.rmSync(e,{recursive:!0,force:!0});return}s&&(M({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),cM(t))}function cM(e){!i.existsSync(e)||i.lstatSync(e).isSymbolicLink()&&i.unlinkSync(e)}async function cE(e){let{lockDirPath:t,owner:r}=e,a=n.join(t,"owner.json"),o=Date.now()+(e.timeoutMs??3e4),s=e.pollMs??100,l=e.description??"XCTest device set lock";for(i.mkdirSync(n.dirname(t),{recursive:!0});Date.now()<o;)try{i.mkdirSync(t),function(e,t){let r=`${e}.${process.pid}.${Date.now()}.tmp`;i.writeFileSync(r,JSON.stringify(t),"utf8"),i.renameSync(r,e)}(a,r);let e=!1;return async()=>{e||(e=!0,i.rmSync(t,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,t){let r=null;try{r=i.statSync(e)}catch{return!0}let n=ck(t);if(n){var a;return!(Number.isInteger((a=n).pid)&&!(a.pid<=0)&&R(a.pid)&&(!a.startTime||E(a.pid)===a.startTime))&&(i.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-r.mtimeMs<5e3)&&(i.rmSync(e,{recursive:!0,force:!0}),!0)}(t,a))continue;await eW(s)}throw new $("COMMAND_FAILED",`Timed out waiting for ${l}`,{lockDirPath:t,...function(e,t){let r,n=Date.now(),a=ck(t);try{r=Math.max(0,Math.round(n-i.statSync(e).mtimeMs))}catch{}return{...void 0!==r?{lockAgeMs:r}:{},...a?{ownerPid:a.pid,ownerStartTime:a.startTime,ownerAgeMs:Math.max(0,Math.round(n-a.acquiredAtMs))}:{}}}(t,a)})}async function cD(e){var t;return await cE({lockDirPath:(t=e,n.join(n.dirname(t),`${n.basename(t)}.lock`)),owner:{pid:process.pid,startTime:E(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}function ck(e){try{return JSON.parse(i.readFileSync(e,"utf8"))}catch{return null}}async function cP(e,t){let r=tt(),n=cF(e,r),i=c5(e,n);return await s7(cw,i,async()=>{let a=await cD(i);try{return await cC({device:e,options:t,projectRoot:r,expectedCacheMetadata:n,derived:i,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await a()}})}async function cC(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(eo(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||cg.has(t))&&(dr("clean",r?"forced_rebuild":"forced_clean",{derived:t}),de(t),cL(t),cg.delete(t));let l=await dt({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>cX(e,n),xctestrunReferencesProjectRoot:cY,resolveExistingXctestrunProductPaths:l4}),c="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&dr("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let d=await cR({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:c});return d||(l.xctestrunPath&&(de(s),cL(s)),await cO({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:c,reason:l.reason}))}async function cR(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await cT(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function cO(e){let{device:t,options:r,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:l,reason:c}=e,d=n.join(a,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!i.existsSync(d))throw new $("COMMAND_FAILED","iOS runner project not found",{projectPath:d});let u=Date.now();await c4(t,d,s,r);let p=Math.max(0,Date.now()-u),f=cX(s,t);if(!f)throw new $("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await l4(f);if(!m)throw new $("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await lz(t,m,f),await l9(m),cG(s,cB(o,f,m)),dr("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:c}}async function cT(e,t,r,n){try{var i,a,o,s;return await lz(e,n.productPaths,n.xctestrunPath),dr("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,cG(i,cB(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof $))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&lW.has(t)}(e))throw e;return dr("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function cL(e){try{if(!i.existsSync(e))return;if("derived"!==n.basename(e))return void i.rmSync(e,{recursive:!0,force:!0});for(let r of i.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,c$.has(t)&&i.rmSync(n.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let c$=new Set([cm,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function cF(e,r=tt()){let a,o=cs(e);return{schemaVersion:2,packageVersion:te(),runnerSourceFingerprint:function(e){let r=n.join(e,"ios-runner","AgentDeviceRunner"),a=function(e){if(!i.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of i.readdirSync(e,{withFileTypes:!0})){var a,o;let i=n.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(i);continue}s.isFile()&&(a=s.name,o=i,"project.pbxproj"===a?o.includes(`${n.sep}.xcodeproj${n.sep}`):[".jpg",".json",".png",".swift",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(n.extname(a)))&&t.push(i)}}return t.sort((e,t)=>e.localeCompare(t))}(r),o=function(e,r){let a=t.createHash("sha256");for(let t of r){let r=n.relative(e,t),o=i.statSync(t);a.update(r),a.update("\0"),a.update(String(o.size)),a.update("\0"),a.update(String(Math.trunc(o.mtimeMs))),a.update("\0")}return a.digest("hex")}(r,a),s=cJ.get(r);if(s?.fileStatsFingerprint===o)return s.sourceFingerprint;let l=t.createHash("sha256");for(let e of a){let t=n.relative(r,e);l.update(t),l.update("\0"),l.update(i.readFileSync(e)),l.update("\0")}let c=l.digest("hex");return cJ.set(r,{fileStatsFingerprint:o,sourceFingerprint:c}),c}(r),...function(e,t){var r;let n=(r=cU("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=co[e].sdkName[cl(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:cU("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:cU("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(o,e.kind),platformName:o,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(a=cs(e))?`platform=macOS,arch=${cc()}`:"simulator"===e.kind?`generic/platform=${a} Simulator`:`generic/platform=${a}`,runnerBundleBuildSettings:c9(process.env),runnerSigningBuildSettings:c6(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:c7()}}function cU(e,t){let r=JSON.stringify([e,t]),n=cv.get(r);if(void 0!==n)return n;try{let n=q(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return cv.set(r,i),i}catch{return cv.set(r,"unknown"),"unknown"}}function cG(e,t){i.mkdirSync(e,{recursive:!0}),i.writeFileSync(n.join(e,cm),`${JSON.stringify(t,null,2)}
11
+ `)}async function cq(e,t){cg.add(e.derived);let r=await cD(e.derived);try{dr("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),de(e.derived),cL(e.derived)}finally{await r()}}function cV(e){let{artifacts:t,...r}=e;return r}function cj(e){return JSON.stringify(function e(t){return Array.isArray(t)?t.map(t=>e(t)):t&&"object"==typeof t?Object.fromEntries(Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([t,r])=>[t,e(r)])):t}(e))}function cB(e,t,r){let n=function(e,t){let r=cK(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=cK(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 cH(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function cK(e){try{let t=i.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function cW(e,t){let r=cK(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function cz(e,t){let r=n.relative(n.resolve(t),n.resolve(e));return""!==r&&!r.startsWith("..")&&!n.isAbsolute(r)}let cJ=new Map;function cX(e,t){if(!i.existsSync(e))return null;let r=[],a=[e];for(;a.length>0;){let e=a.pop();for(let t of i.readdirSync(e,{withFileTypes:!0})){let o=n.join(e,t.name);if(t.isDirectory()){a.push(o);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=i.statSync(o);r.push({path:o,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,r)=>{if(t){let n=cZ(r.path,t)-cZ(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function cZ(e,t){let r=0,i=e.toLowerCase();n.basename(i).startsWith("agentdevicerunner.env.")&&(r-=1e3),i.includes(`${n.sep}macos${n.sep}`)&&(r-=5e3);let a=co[cs(t)].xctestrunHints[cl(t.kind)];return a.preferred.length>0&&(a.preferred.some(e=>i.includes(e))?r+=2e3:r-=500),a.disallowed.some(e=>i.includes(e))&&(r-=2500),r}function cY(e,t){try{let r=i.readFileSync(e,"utf8"),n=new Set([t]);try{n.add(i.realpathSync(t))}catch{}for(let e of n)if(r.includes(e))return!0;return!1}catch{return!1}}async function cQ(e,t,r){let i=n.dirname(e),a=r.replace(/[^a-zA-Z0-9._-]/g,"_"),o=n.join(i,`AgentDeviceRunner.env.${a}.json`),s=n.join(i,`AgentDeviceRunner.env.${a}.xctestrun`),l=await c0(e);return c2(l,e=>{var r,n;return r=e,n=t,void(r.EnvironmentVariables={...r.EnvironmentVariables??{},...n},r.UITestEnvironmentVariables={...r.UITestEnvironmentVariables??{},...n},r.UITargetAppEnvironmentVariables={...r.UITargetAppEnvironmentVariables??{},...n},r.TestingEnvironmentVariables={...r.TestingEnvironmentVariables??{},...n})}),c2(l,e=>Object.assign(e,ch),{requireTestBundlePath:!0}),await c1(l,o,s),{xctestrunPath:s,jsonPath:o}}async function c0(e){let t=await iR("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new $("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 $("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function c1(e,t,r){i.writeFileSync(t,JSON.stringify(e,null,2));let n=await iR("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new $("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:r,stderr:n.stderr})}function c2(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=c3(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=c3(r,{requireTestBundlePath:!0});e&&t(e)}}function c3(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function c4(e,t,r,n){let i=c9(process.env),a=c6(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=c7(),l=await cx(e);try{let l;await U("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",c8(e),"1","-destination",(l=cs(e),"macOS"===l?`platform=macOS,arch=${cc()}`:"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=>{cy.add(e),e.on("close",()=>{cy.delete(e)})},onStdoutChunk:e=>{lj(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{lj(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof $?a:new $("COMMAND_FAILED",String(a)),i=(e=r.details?JSON.stringify(r.details):"",((t=`${r.message}
12
+ ${e}`.toLowerCase()).includes("failed registering bundle identifier")||t.includes("app identifier")&&t.includes("not available")?"Set AGENT_DEVICE_IOS_BUNDLE_ID to a unique reverse-DNS value (for example, com.yourname.agentdevice.runner), then retry.":t.includes("requires a development team")?"Configure signing in Xcode or set AGENT_DEVICE_IOS_TEAM_ID for physical-device runs.":t.includes("no profiles for")||t.includes("provisioning profile")?"Install/select a valid iOS provisioning profile, or set AGENT_DEVICE_IOS_PROVISIONING_PROFILE.":t.includes("code signing")?"Enable Automatic Signing in Xcode or provide AGENT_DEVICE_IOS_TEAM_ID and optional AGENT_DEVICE_IOS_SIGNING_IDENTITY.":void 0)??ly);throw new $("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await l?.release()}}function c5(e,r){let i,a=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(a)return n.resolve(a);let o=(i=t.createHash("sha256").update(cj(cV(r))).digest("hex"),`cache-${i.slice(0,16)}`),s=function(e){return n.join(cf,"derived",co[cs(e)].derivedBaseName[cl(e.kind)])}(e);return n.join(s,o)}function c8(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function c6(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 c9(e=process.env){let t=c_(e),r=cI(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function c7(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function de(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,i;if(r=e,t=n.resolve(tt(),".tmp"),""===(i=n.relative(t,n.resolve(r)))||i.startsWith("..")||n.isAbsolute(i))throw new $("COMMAND_FAILED","Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically",{derivedPath:e,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${n.join(tt(),".tmp")}.`})}}async function dt(e){var t,r;let a,o=(t=e.derived,r=e.expectedCacheMetadata,(a=function(e){try{let t=JSON.parse(i.readFileSync(n.join(e,cm),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?cj(cV(a))!==cj(cV(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:a}:{ok:!1,reason:"cache_metadata_missing"}),s=o.ok?function(e,t){var r;let n=t?.artifacts;if(!(!(!(r=n)||"object"!=typeof r||Array.isArray(r))&&"string"==typeof r.xctestrunPath&&Number.isInteger(r.xctestrunMtimeMs)&&Number.isInteger(r.xctestrunSize)&&Array.isArray(r.productPaths)&&r.productPaths.length>0&&r.productPaths.every(cH))||!cz(n.xctestrunPath,e)||!cW(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!cz(t.path,e)||!cW(t.path,t))return null;i.push(t.path)}return{xctestrunPath:n.xctestrunPath,productPaths:i}}(e.derived,o.metadata):null,l=s?.xctestrunPath??e.findXctestrun(e.derived);if(!l)return{reason:"missing_xctestrun",xctestrunPath:null};let c=s?.xctestrunPath===l,d=c?"manifest":"scan",u=c?s.productPaths:await e.resolveExistingXctestrunProductPaths(l);return u?e.xctestrunReferencesProjectRoot(l,e.projectRoot)||c?o.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:u,source:d}:{reason:o.reason,xctestrunPath:l,productPaths:u,source:d}:{reason:"project_root_mismatch",xctestrunPath:l,productPaths:u,source:d}:{reason:"missing_products",xctestrunPath:l,productPaths:[],source:d}}function dr(e,t,r){M({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let dn=new Map,di=new Map;async function da(e,t){return await s7(di,e.id,async()=>{var r;let n,i,a=dn.get(e.id);if(a){let t=await ds(e,a);if(t)return t}let o={};await dN(o,"cleanup_stale_xcodebuild",async()=>{await dv(e.id)}),await dN(o,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(M({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):dy(t))}),t.cleanStaleBundles?await dN(o,"cleanup_stale_bundles",async()=>{await dl(e)}):(o.cleanup_stale_bundles=0,M({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let s=await dN(o,"ensure_xctestrun",async()=>await cP(e,t));o.build_xctestrun=s.buildMs;let l=await dN(o,"allocate_port",async()=>await lV()),{xctestrunPath:c,jsonPath:d}=await dN(o,"prepare_xctestrun_env",async()=>await cQ(s.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(l)},`session-${e.id}-${l}`)),u=await dN(o,"simulator_set_redirect",async()=>await cx(e));try{({child:n,wait:i}=await dN(o,"launch_xcodebuild",()=>{let t;return F("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",c8(e),"1","-destination-timeout",String(20),"-xctestrun",c,"-destination",(t=cs(e),"macOS"===t?`platform=macOS,arch=${cc()}`:"simulator"===e.kind?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(l)},detached:!0})}))}catch(e){throw await u?.release(),e}n.stdout?.on("data",e=>{lj(e,t.logPath,t.traceLogPath,t.verbose)}),n.stderr?.on("data",e=>{lj(e,t.logPath,t.traceLogPath,t.verbose)});let p={sessionId:`${e.id}:${l}:${Date.now()}`,device:e,deviceId:e.id,port:l,xctestrunPath:c,xctestrunArtifact:s,jsonPath:d,testPromise:i,child:n,ready:!1,startupTimeoutMs:"number"==typeof(r=t.startupTimeoutMs)&&Number.isFinite(r)&&r>0?Math.floor(r):void 0,startupTimings:o,simulatorSetRedirect:u??void 0};return dn.set(e.id,p),p})}async function ds(e,t){if(!dw(t.child.pid))return await dN({},"stop_stale_session",async()=>{await dp(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=c5(e,cF(e));return t.xctestrunArtifact?.derived!==r?(M({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:t.xctestrunArtifact?.derived,expectedDerived:r}}),await dN({},"stop_stale_artifact_session",async()=>{await dp(e.id,t)}),null):(M({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready}}),t)}async function dl(e){if("simulator"===e.kind)for(let t of cb){let r=await dc(e,t);if(!r||function(e){if(0===e.exitCode)return!0;let t=`${e.stdout}
13
+ ${e.stderr}`.toLowerCase();return t.includes("not installed")||t.includes("found nothing")||t.includes("no such file")||t.includes("invalid device")||t.includes("could not find")}(r))continue}}async function dc(e,t){try{return await iO(lg(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(r){M({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 dd(e){let t=dn.get(e);return t?{sessionId:t.sessionId,alive:dw(t.child.pid)}:null}async function du(e,t){await s7(di,e.deviceId,async()=>{dn.get(e.deviceId)===e&&(M({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await dp(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function dp(e,t,r={}){let n=t??dn.get(e);if(n){var i;if(!1!==r.graceful)try{await lE(n.device,n.port,lx({command:"shutdown"}),void 0,15e3)}catch{await dg(n.child.pid,"SIGTERM")}else await dg(n.child.pid,"SIGTERM");try{await Promise.race([n.testPromise,new Promise(e=>setTimeout(e,r.waitTimeoutMs??1e4))])}catch{}(i=n.child.pid)&&(dw(i)||P(i))&&await dg(n.child.pid,"SIGKILL"),lK(n.xctestrunPath),lK(n.jsonPath),await n.simulatorSetRedirect?.release(),dn.get(e)===n&&dn.delete(e)}}async function df(e){await s7(di,e,async()=>{await dp(e),await dv(e)})}async function dm(){let e=Array.from(dn.values()),t=Array.from(cy);await Promise.allSettled(e.map(async e=>{await dg(e.child.pid,"SIGINT")})),await Promise.allSettled(t.map(async e=>{await dg(e.pid,"SIGINT")})),await Promise.allSettled(e.map(async e=>{await dg(e.child.pid,"SIGTERM")})),await Promise.allSettled(t.map(async e=>{await dg(e.pid,"SIGTERM")})),await Promise.allSettled(e.map(async e=>{await dg(e.child.pid,"SIGKILL")})),await Promise.allSettled(t.map(async e=>{await dg(e.pid,"SIGKILL"),cy.delete(e)})),await Promise.allSettled(e.map(async e=>{await e.simulatorSetRedirect?.release()}))}async function dh(){await dm();let e=Array.from(dn.keys());await Promise.allSettled(e.map(async e=>{await df(e)}));let t=Array.from(cy);await Promise.allSettled(t.map(async e=>{try{await dg(e.pid,"SIGTERM"),await dg(e.pid,"SIGKILL")}finally{cy.delete(e)}}))}function dw(e){return!!e&&R(e)}async function dg(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 iR("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function dv(e){let t=`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}-`;for(let r of["TERM","KILL"])try{await iR("pkill",[`-${r}`,"-f",t],{allowFailure:!0,timeoutMs:2e3})}catch(t){M({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:r,error:t instanceof Error?t.message:String(t)}})}}async function dy(e){await iO(lg(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}function dS(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new $("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new $("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function d_(e,t,r,n,i,a){var o,s,l,c,d;o=t,s=r.command,o.startupTimingsReported||!o.startupTimings||(o.startupTimingsReported=!0,M({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 u=lx(r),p=lA(u.command),f=ea.fromTimeoutMs(i),m=function(e,t){var r;let n=lA(t.command);if(!e.ready)return n?{action:"skip",reason:"read_only_startup_command"}:{action:"run",reason:"startup"};return"uptime"===(r=t.command)||"status"===r?{action:"skip",reason:"readiness_probe_command"}:{action:"run",reason:"ready_session"}}(t,u);"run"===m.action?await db({device:e,session:t,runnerCommand:u,logPath:n,deadline:f,signal:a,decision:m}):(l=u,c=t,d=m,M({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:l.command,commandId:l.commandId,reason:d.reason,sessionReady:c.ready}}));let h=await dI({device:e,session:t,runnerCommand:u,logPath:n,deadline:f,timeoutMs:i,signal:a,readOnlyCommand:p});try{let e=await dA(h,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&&await du(t,r),e}catch(r){let e=function(e){if(e instanceof $){if("IOS_AX_SNAPSHOT_FAILED"===e.code)return"ax_snapshot_failure";if("XCTEST_RECORDED_FAILURE"===e.code)return"xctest_recorded_failure"}}(r);throw e&&await du(t,e),r}}async function dI(e){let{device:t,session:r,runnerCommand:n,logPath:i,deadline:a,timeoutMs:o,signal:s,readOnlyCommand:l}=e,c=a.remainingMs();if(c<=0)throw new $("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:o});let d=l?{command:n.command,commandId:n.commandId,readOnly:!0,sessionReady:r.ready,timeoutMs:c}:{command:n.command,commandId:n.commandId};return await x("ios_runner_command_send",async()=>l?await lE(t,r.port,n,i,c,r,s):await lO(t,r.port,n,c,s),d)}async function db(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(dx(r),a.remainingMs());try{let e=await x("ios_runner_readiness_preflight",async()=>await lE(t,r.port,lx({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,sessionReady:r.ready,timeoutMs:l});await dA(e,r,i)}catch(t){var c,d;let e;throw d={runnerReadinessPreflightFailed:!0},e=(c=t)instanceof $?c:new $("COMMAND_FAILED",c instanceof Error?c.message:String(c),void 0,c),new $(e.code,e.message,{...e.details??{},...d},e.cause??c)}}async function dA(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new $("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?O(e):"COMMAND_FAILED",i="string"==typeof n.error?.message?n.error.message:void 0,a="string"==typeof n.error?.hint?n.error.hint:void 0;throw new $(t,i??"Runner error",{runner:n,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,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&&M({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 dx(e){return e.startupTimeoutMs??45e3}async function dN(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,M({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}let dM=new m;function dE(e,t={}){return{runCommand:e,...t}}function dD(e,t,r,n={}){if(r)return dP(r);let i=function(e,t={}){let r=dM.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?dP(i.provider):dP(t)}async function dk(e,t,r){if(!e)return await r();let n={provider:dP(e),deviceId:t.deviceId,requestId:t.requestId};return await dM.run(n,r)}function dP(e){return"function"==typeof e?{runCommand:e}:e}async function dC(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await dT(t,r,n,i,a,o);return await dR(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function dR(e,t){var r,n,i,a;if(!e)return await dO(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,dL({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,dL({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await dO(t,e.reason,e.lifecycleState,e.error)}async function dO(e,t,r,n){throw dL({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 dT(e,t,r,n,i,a){var o,s,l,c,d,u,p,f,m,h,w,g,v,y,S,_,I,b,A,x,N,E;let D,k,P,C,R;if("status"===r.command||!r.commandId?.trim())return;try{D=await d_(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return M({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:r.command,commandId:r.commandId,error:e instanceof Error?e.message:String(e)}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let T="string"==typeof D.lifecycleState?D.lifecycleState:"";return M({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:T}}),o=D,s=T,l=r,c=n,d=i,"completed"===s?(u=o,p=l,f=c,m=d,(k=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:{}}(u.lifecycleResponseJson))?{type:"recovered",data:k,reason:"completed_with_retained_response",lifecycleState:"completed"}:lA(p.command)?{type:"skipInvalidation",error:f,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"}:{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new $("COMMAND_FAILED",`Runner command "${p.command}" completed after the transport response was lost, but no recoverable response was retained.`,{command:p.command,commandId:p.commandId,lifecycleState:"completed",recovery:"completed_without_retained_response",hint:(h=p.command,`The runner is still reachable and reports "${h}" 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:m.logPath,transportError:f.message},f)}):"failed"===s?{type:"skipInvalidation",reason:"runner_reported_failure",lifecycleState:s,error:(w=o,g=l,v=c,y=d,P="string"==typeof w.lifecycleErrorCode?w.lifecycleErrorCode:void 0,C="string"==typeof w.lifecycleErrorMessage?w.lifecycleErrorMessage:"Runner command failed",R="string"==typeof w.lifecycleErrorHint?w.lifecycleErrorHint:void 0,new $(O(P),C,{command:g.command,commandId:g.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",hint:R??(S=g.command,`The runner is still reachable and reports "${S}" 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:y.logPath,transportError:v.message},v))}:"accepted"===s||"started"===s?{type:"skipInvalidation",reason:"command_still_in_flight",lifecycleState:s,error:(_=s,I=l,b=c,A=d,lA(I.command)?b:new $("COMMAND_FAILED",`Runner command "${I.command}" is still ${_} after the transport response was lost.`,{command:I.command,commandId:I.commandId,lifecycleState:_,recovery:"command_still_in_flight",hint:(x=I.command,N=_,`The runner is still reachable and reports "${x}" is ${N}, 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:A.logPath,transportError:b.message},b))}:{type:"retainInvalidation",reason:s?"unknown_lifecycle_state":"missing_lifecycle_state",lifecycleState:s,error:new $("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:(E=l.command,`The runner did not confirm that "${E}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`),logPath:d.logPath,transportError:c.message},c)}}function dL(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;M({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 d$(e,t){let r;lN(t.requestId);let n=rr(t.requestId),i=lx({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await dF({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new $("COMMAND_FAILED","iOS runner prepare failed")}async function dF(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await da(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles}),c=Date.now()-s;try{var d,u;let e=await dH(t,l,r,n,i,c,{recoveryReason:o});return{kind:"prepared",result:(d=t,u=e,dK(d,u),u)}}catch(e){return await dU({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function dU(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:c}=e,d=c instanceof $?c:new $("COMMAND_FAILED",String(c));if(1===l&&(t=d,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&dV(t)))return{kind:"prepared",result:await dG({device:n,session:i,command:a,options:o,signal:s,error:d})};if(!dV(d))throw c;let u=d.message||"runner_health_failed";if(l>=2)throw await dq(i,"prepare_runner_health_failed"),c;return lN(o.requestId),await du(i,"prepare_runner_health_retry"),M({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 dG(e){var t,r,n,i,a;let{device:o,session:s,command:l,options:c,signal:d,error:u}=e,p=u.message||"runner_health_failed";await du(s,"prepare_cached_runner_health_failed"),await cq(s.xctestrunArtifact,p);let f=Date.now(),m=await da(o,{...c,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await dH(o,m,l,c,d,h,{recoveryReason:p});return M({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,dK(t,r),r}catch(r){let e;await dq(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof $?n:new $("COMMAND_FAILED",String(n)),new $(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 dK(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 dq(e,t){try{await du(e,t)}catch{}}function dV(e){let t;return!ra(e)&&(lS(e)||l_(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function dj(e,t,r){let n;lN(r.requestId);let i=rr(r.requestId);try{let a=(n=await da(e,r)).ready?45e3:dx(n);return await d_(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof $?o:new $("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&l_(a)&&n)return lN(r.requestId),await dB({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&&(lS(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return lN(r.requestId),await dB({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&&lS(a))return await dC({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:du});throw o}}async function dB(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await du(e.session,a);let o=await da(t,{...n,cleanStaleBundles:!0});try{let a=await d_(t,o,r,n.logPath,45e3,i);return e.recoveredDiagnosticPhase&&M({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 $?a:new $("COMMAND_FAILED",String(a));if(lS(e))return await dC({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:du});throw a}}async function dH(e,t,r,n,i,a,o){var s,l,c,d,u;let p,f,m=Date.now();return s=await d_(e,t,r,n.logPath,n.healthTimeoutMs,i),l=t,c=a,d=Date.now()-m,u=o,p=l.xctestrunArtifact,f={...u?.recoveryReason?{recoveryReason:u.recoveryReason}:{},...u?.failureReason?{failureReason:u.failureReason}:{}},p?{runner:s,cache:p.cache,artifact:p.artifact,buildMs:p.buildMs,connectMs:Math.max(0,c),healthCheckMs:Math.max(0,d),xctestrunPath:p.xctestrunPath,...f}:{runner:s,connectMs:Math.max(0,c),healthCheckMs:Math.max(0,d),...f}}function dK(e,t){M({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 dW(e,t,r={}){dS(e),lN(r.requestId);let n=lx(t),i=dX(e,r);return lA(n.command)?ei(()=>(lN(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(lN(r.requestId),lS(e))}):i.runCommand(e,n,r)}function dz(e,t={}){if("ios"!==e.platform)return;let r=dX(e,t);return r.prewarm?r.prewarm(e,t).then(()=>{}).catch(t=>{M({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}})}):void M({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function dJ(e,t){dS(e),lN(t.requestId);let r=lx({command:"uptime"}),n=dX(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 dX(e,t){return dD(e,dZ,void 0,{requestId:t.requestId})}let dZ=dE(dj,{prepare:d$,prewarm:async(e,t)=>{await d$(e,{...t,healthTimeoutMs:45e3})}}),dY=new WeakMap;async function dQ(e){var t,r;let n,i,{sessionStore:a,leaseRegistry:o}=e,s=(n={...(t=function(e){let t=J(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=K(r);if(r&&!n)throw new $("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new $("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??{}},tf(t.command,n)?{...t,flags:n}:t),l=s.command,c=function(e){var t,r;let n=e.session||li;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),d=b(),u=a.resolveSessionDir(c),p=tY(u,s.meta?.requestId??d.requestId),f=tZ(u);N({session:c,logPath:p}),M({level:"info",phase:"request_start",data:{publicSession:s.session,effectiveSession:c,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=lc(e);t.assertLeaseAdmission({tenantId:n.tenantId,runId:n.runId,leaseId:n.leaseId,backend:n.leaseBackend})}(s,o);let m=nd(l)?.sessionExecutionLockExempt!==!0?await lf({req:s,sessionName:c,sessionStore:a}):[],h=(r=o,(i=dY.get(r))||(i=new Map,dY.set(r,i)),i);return{req:s,command:l,sessionName:c,requestLogPath:p,runnerLogPath:f,throwIfCanceled:()=>ri(s.meta?.requestId),runLocked:async e=>(ri(s.meta?.requestId),0===m.length)?await e():await d0(h,m,async()=>(ri(s.meta?.requestId),await e()))}}async function d0(e,t,r){let[n,...i]=t;return n?await s7(e,n,async()=>await d0(e,i,r)):await r()}function d1(){return{ok:!1,error:L(new $("UNAUTHORIZED","Invalid token"))}}async function d2(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 sG({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function d3(e){M({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=b(),r=A({force:!0})??void 0;return{ok:!1,error:L(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function d4(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function d5(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 d8(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 d6(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new $("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function d9(e,t){let r=(await tn(eu(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function d7(e,t){var r,n;let i;d6(t);let a=await d9(e,t),o=tn(eu(e)),s=await ew(o,{lines:4e3,timeoutMs:3e3}).catch(()=>"");if(0===s.trim().length)return null;let l=function(e,t,r){let n=new Set;for(let i of(r&&n.add(r),e.split("\n")))if(i.includes(t))for(let e of function(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=[RegExp(`\\bStart proc\\s+(\\d+):${r}(?:\\b|/)`,"i"),RegExp(`\\b(\\d+):${r}(?:\\b|/)`,"i"),RegExp(`${r}.*?\\bpid\\s*[=:]?\\s*(\\d+)\\b`,"i"),RegExp(`\\bpid\\s*[=:]?\\s*(\\d+)\\b.*${r}`,"i")],i=[];for(let t of n){let r=t.exec(e),n=r?.[1];n&&/^\d+$/.test(n)&&i.push(n)}return i}(i,t))n.add(e);return[...n]}(s,t,a);if(0===l.length)return null;let c=(r=s,n=t,i=new Set(l),r.split("\n").filter(e=>{var t;let r;if(!e.trim())return!1;if(e.includes(n))return!0;let a=(t=e,r=/\(\s*(\d+)\)\s*:/.exec(t),r?.[1]??null);return!!a&&i.has(a)}).join("\n"));return 0===c.trim().length?null:{pid:a,text:c,recoveredPids:l}}async function ue(e,t,r,n,i){let a,o,s="recovering",l=!1,c=(async()=>{try{for(;!l;){let c=await d9(e,t);if(!c){s="recovering",await eW(1e3);continue}let d=tr(eu(e)),u=ec(d,{pid:c});a=u;let p=d5(r,{redactionPatterns:n});if(o=d8(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&t1(i,u.pid),s="active",await o,t2(i),a=void 0,o=void 0,l)break;s="recovering",await eW(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),t2(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:c,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await d4(o),a&&!a.killed&&a.kill("SIGKILL"),await d4(c),t2(i)}}}function ut(e,t){let r=ui(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=ui(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 ur(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=lw(["spawn",t,"log","show","--style","compact","--info","--predicate",ut(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 iO(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 un(e,t,r,n,i,a){let o=await ua({deviceId:e,appBundleId:t,simulatorSetPath:i});return ul({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return lw(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",ut(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function ui(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function ua(e){let{deviceId:t,appBundleId:r,simulatorSetPath:i}=e,a=await iO(lw(["get_app_container",t,r,"app"],{simulatorSetPath:i}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=n.join(o,"Info.plist"),l=await G("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function uo(e,t,r,n){return ul({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",ut(e)],stream:t,redactionPatterns:r,pidPath:n})}async function us(e,t,r,n){return ul({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function ul(e){let t="active",r=F(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=d5(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&t1(e.pidPath,n.pid);let a=d8(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),t2(e.pidPath),r),r=>{throw t="failed",t2(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await d4(a),n.killed||n.kill("SIGKILL"),await d4(a),t2(e.pidPath)}}}let uc=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),ud=/https?:\/\/[^\s"'<>\])]+/i,uu=[/\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 up(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>um(e)));for(let e of t.entries){let t=um(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function uf(e,t){let r=uA(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=uA(t?.maxPayloadChars,2048,64,16384),o=uA(t?.maxScanLines,4e3,100,2e4),s=e.split("\n"),l=Math.max(0,s.length-o),c=s.slice(l),d=[];for(let e=c.length-1;e>=0&&d.length<r;e-=1){let t=c[e];if(!t?.trim())continue;let r=function(e,t,r,n,i,a){let o=e[t]?.trim();if(!o)return null;let s=function(e){let t=e.indexOf("{");if(t<0)return null;let r=e.lastIndexOf("}");if(r<=t)return null;let n=e.slice(t,r+1);try{let e=JSON.parse(n);return e&&"object"==typeof e?e:null}catch{return null}}(o),l=uS(s,["method","httpMethod"]),c=uS(s,["url","requestUrl"]),d=function(e,t){if(!e)return null;for(let r of t){let t=e[r];if("number"==typeof t&&Number.isInteger(t))return t;if("string"==typeof t&&/^\d{3}$/.test(t.trim()))return Number.parseInt(t.trim(),10)}return null}(s,["status","statusCode","responseCode"]),u=uc.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=ud.exec(o),h=c??m?.[0];if(!h)return null;let w=d??uw(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:ug(o),packetId:uv(o)??void 0,durationMs:uy(o)??void 0,raw:ub(o,a),line:r};if("android"===n&&function(e,t,r){let n=uh(t,r,5),i=e.packetId??n.map(e=>uv(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?uh(t,r,12).filter(e=>uv(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>ug(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>uw(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>uy(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 uI(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=ub(e,a))}if("body"===i||"all"===i){let e=u_(o,s,["requestBody","body","payload","request"]),t=u_(o,s,["responseBody","response"]);e&&(g.requestBody=ub(e,a)),t&&(g.responseBody=ub(t,a))}return g}(c,e,l+e+1,n,i,a);r&&d.push(r)}return{path:t?.path??"<memory>",exists:!0,scannedLines:c.length,matchedLines:d.length,entries:d,include:i,limits:{maxEntries:r,maxPayloadChars:a,maxScanLines:o}}}function um(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function uh(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 uw(e){for(let t of uu){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function ug(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 uv(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function uy(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 uS(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 u_(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return uI(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 uI(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function ub(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function uA(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let ux={start:async e=>await uO(e)},uN=i_(ux,function(e={}){return{...ux,...e}});async function uM(e,t){return await uN.run(e,t)}function uE(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 uD(e){let t=n.dirname(e);i.existsSync(t)||i.mkdirSync(t,{recursive:!0}),function(e,t){if(i.existsSync(e)&&!(i.statSync(e).size<t.maxBytes))for(let r=t.maxRotatedFiles;r>=1;r-=1){let t=1===r?e:`${e}.${r-1}`,n=`${e}.${r}`;i.existsSync(t)&&(i.existsSync(n)&&i.unlinkSync(n),i.renameSync(t,n))}}(e,{maxBytes:uE("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:uE("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function uk(e){if(!i.existsSync(e))return{exists:!1,sizeBytes:0};let t=i.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}async function uP(e){var t,r,n,a;let o,s,l,c,{device:d,appBundleId:u,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v}=e,y="macos"===d.platform?"macos":"ios"===d.platform?"device"===d.kind?"ios-device":"ios-simulator":"android",S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},o=uA(t?.maxEntries,25,1,200),s=t?.include??"summary",l=uA(t?.maxPayloadChars,2048,64,16384),c=uA(t?.maxScanLines,4e3,100,2e4),i.existsSync(m)?uf(i.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:o,maxPayloadChars:l,maxScanLines:c}}),_=[],I=await uC({device:d,appBundleId:u,appLogPath:m,appLogState:p});if(I){let e=await d7(d.id,u);if(e){let t=uf(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=up(t,S,h),_.push((r=I,n=e.recoveredPids,"stale-active"===r.reason?`Session app log stream was still bound to prior Android PID ${r.trackedPid}. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`:`Session app log stream was inactive. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`)))}}if("ios"===d.platform&&"simulator"===d.kind&&u&&0===S.entries.length){let e=await uT({deviceId:d.id,appBundleId:u,startedAt:f,simulatorSetPath:d.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});e&&(e.dump.entries.length>0?(S=up(e.dump,S,h),_.push(`Recovered ${e.dump.entries.length} iOS simulator HTTP entr${1===e.dump.entries.length?"y":"ies"} from simctl log show (${e.recoveredLineCount} app log lines scanned).`)):e.recoveredLineCount>0&&_.push(`Recovered ${e.recoveredLineCount} recent iOS simulator app log lines from simctl log show, but none looked like HTTP traffic. This app may not emit request URLs, status, or timing into Unified Logging for this repro window.`))}return void 0===p?_.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===_.length&&("ios"===d.platform&&"simulator"===d.kind?_.push("Session app log stream is inactive. The iOS simulator recovery path scanned recent simctl log history, but a fresh logs clear --restart window is still the most reliable repro loop."):_.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===S.entries.length&&_.push("ios"===(a=d).platform&&"simulator"===a.kind?"No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.":"ios"===a.platform?"No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.":"No HTTP(s) entries were found in recent session app logs."),{backend:y,dump:S,notes:_}}async function uC(e){let{device:t,appBundleId:r,appLogPath:a,appLogState:o}=e;if("android"!==t.platform||!r)return null;if(void 0!==o&&"active"!==o)return{reason:"inactive"};if("active"!==o)return null;let s=function(e){let t=function(e){if(!e||!i.existsSync(e))return null;try{return t0(i.readFileSync(e,"utf8"))}catch{return null}}(e)?.command;if(!t)return null;let r=/(?:^|\s)--pid\s+(\d+)(?:\s|$)/.exec(t);return r?.[1]??null}(n.join(n.dirname(a),tQ));if(!s)return null;let l=await d9(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function uR(e,t,r,n){return await uN.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function uO({device:e,appBundleId:t,outPath:r,pidPath:n}){uD(r);let a=i.createWriteStream(r,{flags:"a"}),o=function(){let e=process.env.AGENT_DEVICE_APP_LOG_REDACT_PATTERNS;if(!e)return[];let t=e.split(",").map(e=>e.trim()).filter(e=>e.length>0),r=[];for(let e of t)try{r.push(RegExp(e,"gi"))}catch{}return r}();if("ios"===e.platform)return"device"===e.kind?await us(e.id,a,o,n):await un(e.id,t,a,o,e.simulatorSetPath,n);if("android"===e.platform)return d6(t),await ue(e.id,t,a,o,n);if("macos"===e.platform)return await uo(t,a,o,n);throw a.end(),new $("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function uT(e){let t=await ur({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:uf(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 uL(e){await e.stop(),await d4(e.wait)}async function u$(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 et(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await et(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 iO(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await iO(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await G("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function uF(e,t){uD(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
16
+ `;i.appendFileSync(e,r,"utf8")}function uU(e){let t=n.dirname(e),r=n.basename(e);i.existsSync(t)||i.mkdirSync(t,{recursive:!0}),i.existsSync(e)?i.truncateSync(e,0):i.writeFileSync(e,"","utf8");let a=0;for(let e of i.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let o=e.slice(r.length+1);if(/^\d+$/.test(o))try{i.unlinkSync(n.join(t,e)),a+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:a}}function uG(e,t){if("simulator"!==e.kind)throw new $("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function uq(){await iR("open",["-a","Simulator"],{allowFailure:!0,timeoutMs:1e4})}async function uV(e){let t,r;if("simulator"!==e.kind||"Booted"===await uB(e))return;let n=ea.fromTimeoutMs(18e4);try{await ef(async({deadline:n})=>{if(n?.isExpired())throw new $("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:18e4});let i=Math.max(1e3,n?.remainingMs()??18e4),a=await iO(lg(e,["boot",e.id]),{allowFailure:!0,timeoutMs:i});t={stdout:String(a.stdout??""),stderr:String(a.stderr??""),exitCode:a.exitCode};let o=`${t.stdout}
17
+ ${t.stderr}`.toLowerCase(),s=o.includes("already booted")||o.includes("current state: booted");if(0!==t.exitCode&&!s)throw new $("COMMAND_FAILED","simctl boot failed",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let l=await iO(lg(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:i});if(r={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==r.exitCode)throw new $("COMMAND_FAILED","simctl bootstatus failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let c=await uB(e);if("Booted"!==c)throw new $("COMMAND_FAILED","Simulator is still booting",{state:c})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let n=el({error:e,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});return"IOS_BOOT_TIMEOUT"!==n&&"CI_RESOURCE_STARVATION_SUSPECTED"!==n}},{deadline:n,phase:"boot",classifyReason:e=>el({error:e,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(a){let i=el({error:a,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});throw new $("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:18e4,elapsedMs:n.elapsedMs(),reason:i,hint:ed(i),boot:t,bootstatus:r})}await uq()}async function uj(e){let t=lg(e,["shutdown",e.id]),r=await iO(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===r.exitCode,exitCode:r.exitCode,stdout:String(r.stdout??""),stderr:String(r.stderr??"")}}async function uB(e){let t="string"==typeof e?e:e.id,r="string"==typeof e?lw(["list","devices","-j"]):lg(e,["list","devices","-j"]),n=await iO(r,{allowFailure:!0,timeoutMs:6e4});if(0!==n.exitCode)return null;try{let e=JSON.parse(String(n.stdout??""));for(let r of Object.values(e.devices??{})){let e=r.find(e=>e.udid===t);if(e)return e.state}return null}catch{return null}}let uH="shared_prefs/ReactNativeDevPrefs.xml",uK="debug_http_host",uW="dev_server_https",uz="RCT_jsLocation",uJ="RCT_packager_scheme",uX="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.",uZ='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function uY(e){return void 0!==k(e)}async function uQ(e){let{device:t,appId:r,runtime:n}=e;if(!r)return;let i=k(n);if(i){if("android"===t.platform)return void await u1(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await u5(t,r,i)}}async function u0(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await u2(t,r);"ios"===t.platform&&"simulator"===t.kind&&await u8(t,r)}}async function u1(e,t,r){var n,i,a,o,s,l;let c,d;pe(t);let u=(n=await u3(e,t),i=uK,a=`${r.host}:${r.port}`,c=` <string name="${pt(i)}">${pt(a)}</string>`,u9(u7(n,i),c));o=u,s=uW,l="https"===r.scheme,d=` <boolean name="${pt(s)}" value="${l?"true":"false"}" />`,u=u9(u7(o,s),d),await u4(e,t,u)}async function u2(e,t){pe(t);let r=await u3(e,t),n=u7(r,uK),i=u7(n,uW);i!==r&&await u4(e,t,i)}async function u3(e,t){let r=await et(e,["shell","run-as",t,"cat",uH],{allowFailure:!0});return 0!==r.exitCode?uZ:u6(r.stdout)}async function u4(e,t,r){let n=["shell","run-as",t,"id"],i=await et(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=pr(i.stdout,i.stderr);throw new $("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?uX:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await et(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await et(e,["shell","run-as",t,"tee",uH],{stdin:r.trimEnd()})}catch(n){let e=T(n);if("TOOL_MISSING"===e.code)throw e;let r=pr("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new $("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?uX:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function u5(e,t,r){await iO(lg(e,["spawn",e.id,"defaults","write",t,uz,"-string",`${r.host}:${r.port}`])),await iO(lg(e,["spawn",e.id,"defaults","write",t,uJ,"-string",r.scheme]))}async function u8(e,t){await iO(lg(e,["spawn",e.id,"defaults","delete",t,uz]),{allowFailure:!0}),await iO(lg(e,["spawn",e.id,"defaults","delete",t,uJ]),{allowFailure:!0})}function u6(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
18
+ `:uZ}function u9(e,t){return u6(e).replace("</map>",`${t}
19
+ </map>`)}function u7(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return u6(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 pe(e){if("binary"!==eh(e))return;let t=ey(e);throw new $("INVALID_ARGS",t,{package:e,hint:t})}function pt(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function pr(e,t){let r=`${e}
20
+ ${t}`.toLowerCase();return["run-as: package not debuggable","run-as: permission denied","run-as: package is unknown","run-as: unknown package","is unknown","is not an application","could not set capabilities"].some(e=>r.includes(e))}let pn=new Map;async function pi(e){let r=await h.mkdtemp(n.join(d.tmpdir(),"agent-device-materialized-"));try{let i=await ps(e.installablePath,n.join(r,"installable")),a=e.archivePath?await ps(e.archivePath,n.join(r,"archive")):void 0,o=t.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,c=setTimeout(()=>{pa(o)},s);return pn.set(o,{rootPath:r,installablePath:i,archivePath:a,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:c}),{materializationId:o,installablePath:i,...a?{archivePath:a}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await h.rm(r,{recursive:!0,force:!0}),e}}async function pa(e,t){let r=pn.get(e);if(!r)throw new $("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new $("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),pn.delete(e),await h.rm(r.rootPath,{recursive:!0,force:!0})}async function po(e){let t=Array.from(pn.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await pa(e)}))}async function ps(e,t){let r=await h.stat(e);await h.mkdir(t,{recursive:!0});let i=n.join(t,n.basename(e));return r.isDirectory()?await h.cp(e,i,{recursive:!0}):await h.copyFile(e,i),i}async function pl(e,t){let r=["devicectl",...e],n=await iO(r,{allowFailure:!0,timeoutMs:2e4});if(0===n.exitCode)return;let i=String(n.stdout??""),a=String(n.stderr??"");throw new $("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:r,exitCode:n.exitCode,stdout:i,stderr:a,deviceId:t.deviceId,hint:pf(i,a)??pp})}async function pc(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 pu(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"})),iI(r,t)}async function pd(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 pu(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 pu(e,t){let r=n.join(d.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),i=[...t.args,"--json-output",r],a=await iO(i,{allowFailure:!0,timeoutMs:2e4});try{if(0!==a.exitCode){let r=String(a.stdout??""),n=String(a.stderr??"");throw new $("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:i,exitCode:a.exitCode,stdout:r,stderr:n,deviceId:e.id,hint:pf(r,n)??pp})}return JSON.parse(await o.readFile(r,"utf8"))}catch(r){if(r instanceof $)throw r;throw new $("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await o.unlink(r).catch(()=>{})}}let pp="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function pf(e,t){let r=`${e}
21
+ ${t}`.toLowerCase();return r.includes("device is busy")&&r.includes("connecting")?"iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.":r.includes("coredeviceservice")&&r.includes("timed out")?"CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.":null}let pm=new Map;async function ph(e){var t;let r,n=(r="simulator"===(t=e).kind?t.simulatorSetPath??"":"",JSON.stringify([t.platform,t.kind,t.id,t.target??"",r])),i=pm.get(n);if(void 0!==i){if(i>Date.now())return;pm.delete(n)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:t}=await Promise.resolve(tv);await t(e),pw(n);return}if("device"===e.kind){await pg(e.id),pw(n);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./8806.js");await t(e.id),pw(n)}}function pw(e){pm.set(e,Date.now()+5e3)}async function pg(e){let t=n.join(d.tmpdir(),`agent-device-ready-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),r=Math.max(1,Math.ceil(15));try{let n=await iO(["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 pv(t);if(0===n.exitCode){if(!o.parsed)throw new $("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 $("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 $("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:py(i,a)})}catch(t){if(t instanceof $&&"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 $("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:a,stdout:n,stderr:i,hint:n||i?py(n,i):o},t)}throw new $("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,hint:"Reconnect the device, keep it unlocked, and retry."},t instanceof Error?t:void 0)}finally{await o.rm(t,{force:!0}).catch(()=>{})}}async function pv(e){try{let t=await o.readFile(e,"utf8"),r=JSON.parse(t),n=function(e){let t=e?.result;if(!t||"object"!=typeof t)return{};let r=t.connectionProperties?.tunnelState,n=t.device?.connectionProperties?.tunnelState,i="string"==typeof r?r:"string"==typeof n?n:void 0;return i?{tunnelState:i}:{}}(r);return{parsed:!0,tunnelState:n.tunnelState}}catch{return{parsed:!1}}}function py(e,t){let r=pf(e,t);return r||(`${e}
22
+ ${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":pp)}let pS=300,p_=300;function pI(e,t,r){return t||ni(r,nt)?null:aT("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function pb(e){return"string"==typeof e?.session&&e.session.trim().length>0}function pA(e){return"ios"===e.platform&&"simulator"===e.kind}async function px(e,t){pA(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function pN(e){let t=ni(e.flags,nt)||!e.session?await r3(e.flags??{}):await pM(e.session.device);return!1!==e.ensureReady&&await ph(t),t}async function pM(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 r3(t)}catch(e){if(!(e instanceof $)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await r3({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function pE(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 pD(e,t){return!!t&&0===lr(t,e).length}async function pk(e){let t=await et(e,["emu","kill"],{allowFailure:!0,timeoutMs:15e3});return{success:0===t.exitCode,exitCode:t.exitCode,stdout:String(t.stdout??""),stderr:String(t.stderr??"")}}async function pP(e){let{device:t,shutdownRequested:r}=e;if(r&&(pA(t)||"android"===t.platform&&"emulator"===t.kind))try{return pA(t)?await uj(t):await pk(t)}catch(t){let e=L(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function pC(e){if(await df(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await i0("dismiss",t).catch(t=>{M({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function pR(e,t){e.appLog&&await uL(e.appLog),rW(e.device.platform)&&await pC(e),await po(t).catch(()=>{})}async function pO(e){let{req:t,sessionName:r,logPath:n,sessionStore:i}=e,a=i.get(r);if(!a)return await pT(t,n);a.appLog&&await uL(a.appLog),t.positionals&&t.positionals.length>0&&(rW(a.device.platform)&&!pA(a.device)&&await pC(a),await n6(a.device,"close",t.positionals,t.flags?.out,{...aI(n,t.flags,a.appBundleId,a.trace?.outPath)}),await px(a.device,pS)),rW(a.device.platform)&&(!pA(a.device)||t.flags?.shutdown||a.recording)?await pC(a):rW(a.device.platform)&&M({level:"debug",phase:"ios_runner_retained_after_close",data:{session:a.name,deviceId:a.device.id}}),uY(i.getRuntimeHints(r))&&a.appBundleId&&await u0({device:a.device,appId:a.appBundleId}).catch(()=>{}),i.recordAction(a,{command:"close",positionals:t.positionals??[],flags:t.flags??{},result:{session:a.name,...eJ(`Closed: ${a.name}`)}}),t.flags?.saveScript&&(a.recordSession=!0),i.writeSessionLog(a),await po(r).catch(()=>{}),i.delete(r);let o=await pP({device:a.device,shutdownRequested:t.flags?.shutdown});return o?{ok:!0,data:eX({session:a.name,shutdown:o},`Closed: ${a.name}`)}:{ok:!0,data:{session:a.name,...eJ(`Closed: ${a.name}`)}}}async function pT(e,t){if(!e.positionals||0===e.positionals.length)return aT("SESSION_NOT_FOUND","No active session");let r=await pN({session:void 0,flags:e.flags,ensureReady:!0});return await n6(r,"close",e.positionals,e.flags?.out,{...aI(t,e.flags)}),await px(r,pS),{ok:!0,data:{app:e.positionals[0],...eJ(`Closed: ${e.positionals[0]}`)}}}async function pL(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 p$(e){i.existsSync(e)&&i.unlinkSync(e)}function pF(e){if(!i.existsSync(e))return null;try{let t=JSON.parse(i.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function pU(e){let t=pF(e);if(!t||t.pid===process.pid)try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}function pG(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function pq(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 $("COMMAND_FAILED",t))})})}(async function(e={}){let r,a,o=e.env??process.env,s=e.stdout??process.stdout,l=e.stderr??process.stderr,c=e.exit??(e=>process.exit(e)),{baseDir:d,infoPath:u,lockPath:p,logPath:f,sessionsDir:m}=z(o.AGENT_DEVICE_STATE_DIR),h=Z(o.AGENT_DEVICE_DAEMON_SERVER_MODE);var g,v,y,S=m;if(i.existsSync(S))for(let e of i.readdirSync(S,{withFileTypes:!0})){if(!e.isDirectory())continue;let t=n.join(S,e.name,tQ);if(i.existsSync(t))try{let e=t0(i.readFileSync(t,"utf8"));if(e&&function(e){let t,r=E(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=D(e.pid);return!!n&&!!((t=n.toLowerCase().replaceAll("\\","/")).includes("log stream")||t.includes("logcat")||t.includes("devicectl device log stream"))&&(!e.command||n===e.command)}(e))try{process.kill(e.pid,"SIGTERM")}catch{}}catch{}finally{t2(t)}}let _=new tX(m),x=new rH({maxActiveSimulatorLeases:pG(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:pG(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:pG(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:pG(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),N=te(),k=t.randomBytes(24).toString("hex"),P=E(process.pid)??void 0,R=Y(),F=function(e){let{logPath:t,token:r,androidAdbProvider:i,appleRunnerProvider:a,appleToolProvider:o,linuxToolProvider:s,appLogProvider:l,recordingProvider:c,deviceInventoryProvider:d,trackDownloadableArtifact:u}=e,{sessionStore:p,leaseRegistry:f}=e;async function m(e){let n=!!(e.meta?.debug||e.flags?.verbose);return await I({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:n,logPath:t},async()=>{if(e.token!==r)return d1();try{return await r8(d,async()=>{let t=await dQ({req:e,sessionStore:p,leaseRegistry:f});return await h(t)})}catch(e){return d3(e)}})}async function h(e,t){let r=async()=>{let r=function(e){var t,r,i;let a,{scope:o,sessionStore:s,trackDownloadableArtifact:l}=e,c=o.runnerLogPath;o.throwIfCanceled();let d=s.get(o.sessionName);d&&(!function(e){var t;let r;if(!((r=(t=e).recording)&&"ios"===t.device.platform&&"ios"!==r.platform&&!1!==r.showTouches))return;let n=e.recording,i=dd(e.device.id);if(!n.runnerSessionId){i?.alive&&(n.runnerSessionId=i.sessionId);return}if(!i?.alive){n.invalidatedReason??="iOS runner session exited during recording";return}i.sessionId!==n.runnerSessionId&&(n.invalidatedReason??="iOS runner session restarted during recording")}(d),s.set(o.sessionName,d));let u=(a=(t={req:o.req,sessionName:o.sessionName,sessionStore:s}).sessionStore.get(t.sessionName),{req:ld(t.req,a),existingSession:a}),p=u.req;d=u.existingSession;let f=e=>(function(e,t,r){let i=b();if(!t.ok){M({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=A({force:!0})??void 0;return{ok:!1,error:L(new $(O(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??("string"==typeof t.error.details?.hint?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath}),{diagnosticId:i.diagnosticId,logPath:e})}}return M({level:"info",phase:"request_success"}),A(),{ok:!0,data:function(e,t,r){var i,a;let o;if(!t)return t;let s=(i=e,o=Array.isArray((a=t).artifacts)?[...a.artifacts]:[],"screenshot"!==i.command||o.some(e=>e?.field==="path")||"string"!=typeof a.path||o.push({field:"path",path:a.path,localPath:i.meta?.clientArtifactPaths?.path,fileName:n.basename(i.meta?.clientArtifactPaths?.path??a.path)}),o.filter(e=>!!(e&&"string"==typeof e.field&&"string"==typeof e.path&&"string"==typeof e.localPath&&e.localPath.length>0)));return 0===s.length?t:{...t,artifacts:s.map(t=>{let n=t.path;return{field:t.field,artifactId:r({artifactPath:n,tenantId:e.meta?.tenantId,fileName:t.fileName}),fileName:t.fileName,localPath:t.localPath}})}}(e,t.data,r)}})(p,e,l);if(d?.recording?.invalidatedReason&&(r=o.command,nd(r)?.allowInvalidRecording!==!0))return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:d.recording.invalidatedReason}})};d&&!p.meta?.lockPolicy&&(i=o.command,nd(i)?.selectorValidationExempt!==!0)&&function(e,t){let r=lr(e,t);if(0!==r.length)throw new $("INVALID_ARGS",`Session "${e.name}" is already bound to ${le(e)}, but this request selected ${r.map(ln).join(", ")}.`,{session:e.name,conflicts:r.map(ln),hint:lt(e,"selector-conflict")})}(d,p.flags);let m=(e,t,r)=>{let n;return{...aI(c,e,t,r,n=b().requestId),requestId:n}};return{type:"scope",scope:{req:p,sessionName:o.sessionName,logPath:c,existingSession:d,finalize:f,contextFromFlags:m,handlerContextFromFlags:(e,t,r)=>({...m(e,t,r),surface:s.get(o.sessionName)?.surface})}}}({scope:e,sessionStore:p,trackDownloadableArtifact:u});if("response"===r.type)return r.response;let d=r.scope,f=async e=>await w({lockedScope:d,providerScope:e,allowReplayActions:void 0===t});return t?await f(t):await np({req:d.req,existingSession:d.existingSession,providers:{androidAdbProvider:i,appleRunnerProvider:a,appleToolProvider:o,linuxToolProvider:s,appLogProvider:l,recordingProvider:c}},f)};return t?await r():await e.runLocked(r)}async function w(e){var t,n;let{lockedScope:i,providerScope:a,allowReplayActions:o}=e,s=await sY({req:i.req,sessionName:i.sessionName,logPath:i.logPath,sessionStore:p,leaseRegistry:f,invoke:m,invokeReplayAction:o?(t=i,n=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 m(e);if(e.token!==r)return d1();try{let r=await dQ({req:e,sessionStore:p,leaseRegistry:f});return r.sessionName===t.sessionName?await h(r,n):await m(e)}catch(e){return d3(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await d2({lockedScope:i,logPath:i.logPath,sessionStore:p})}return m}({logPath:f,token:k,sessionStore:_,leaseRegistry:x,trackDownloadableArtifact:rs}),U=async e=>{await I({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{M({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),A({force:!0})})},G=async e=>{let t=pR(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
23
+ `)});await Promise.race([t,eW(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
24
+ `)})]),_.writeSessionLog(e),_.delete(e.name)},q=async()=>{let e=_.toArray();await Promise.all(e.map(G))},V=async()=>{let e,t,r=[];if("http"!==h){let t,n,i=(t=new Set,(n=w.createServer(e=>{t.add(e),e.on("close",()=>t.delete(e));let r="",n=0,i=new Set,a=!1,o=()=>{if(!a&&0!==n){for(let e of(a=!0,i))t7(e);M({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(tw);if(await e(),n<=0)break;await eW(200)}}catch(e){M({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=B(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=W(n),a=t6(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),t9(a),rt(a))throw rn();r=await ry(o?t=>{e.destroyed||e.write(Q(t))}:void 0,async()=>await F(n))}catch(e){r={ok:!1,error:L(e)}}finally{n-=1,a&&(i.delete(a),re(a))}e.destroyed||e.write(o?H(r):`${JSON.stringify(r)}
25
+ `)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await pq(i,"Failed to bind socket server")}if("socket"!==h){let e=await r$({handleRequest:F,token:k});r.push(e),t=await pq(e,"Failed to bind HTTP server")}return{servers:r,socketPort:e,httpPort:t}};if(!function(e,t,r){i.existsSync(e)||i.mkdirSync(e,{recursive:!0});let n=JSON.stringify(r,null,2),a=()=>{try{return i.writeFileSync(t,n,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(a())return!0;let o=pF(t);if(o?.pid&&o.pid!==process.pid&&C(o.pid,o.processStartTime))return!1;try{i.unlinkSync(t)}catch{}return a()}(d,p,{pid:process.pid,version:N,startedAt:Date.now(),processStartTime:P}))return l.write("Daemon lock is held by another process; exiting.\n"),c(0),null;let j=[];try{let e,t=await V();j=t.servers,r=t.socketPort,a=t.httpPort,g=r,v=a,y={socketPort:g,httpPort:v,token:k,version:N,codeSignature:R,processStartTime:P},i.existsSync(d)||i.mkdirSync(d,{recursive:!0}),i.writeFileSync(f,""),e=y.socketPort&&y.httpPort?"dual":y.httpPort?"http":"socket",i.writeFileSync(u,JSON.stringify({port:y.socketPort,httpPort:y.httpPort,transport:e,token:y.token,pid:process.pid,version:y.version,codeSignature:y.codeSignature,processStartTime:y.processStartTime,stateDir:d},null,2),{mode:384}),g&&s.write(`AGENT_DEVICE_DAEMON_PORT=${g}
26
26
  `),v&&s.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${v}
27
- `)}catch(t){let e=O(t);for(let t of(l.write(`Daemon error: ${e.message}
28
- `),H))try{t.close(()=>{})}catch{}return pI(u),pA(p),c(1),null}let z=!1,J=async(e={})=>{if(z)return;z=!0,e.cause&&await U(e.cause),await p_(H),await q();let{stopAllIosRunnerSessions:t}=await Promise.resolve(tf);await t(),pI(u),pA(p),c(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{J()}),process.on("SIGTERM",()=>{J()}),process.on("SIGHUP",()=>{J()}),process.on("uncaughtException",e=>{let t=e instanceof L?e:O(e);l.write(`Daemon error: ${t.message}
29
- `),J({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof L?t:O(t);l.write(`Daemon error: ${r.message}
30
- `),J({exitCode:1,cause:t})})),{httpPort:a,shutdown:J,socketPort:r,token:k}})().catch(e=>{let t=O(e);process.stderr.write(`Daemon error: ${t.message}
31
- `),process.exit(1)});export{u6 as IOS_DEVICECTL_DEFAULT_HINT,cu as IOS_RUNNER_CONTAINER_BUNDLE_IDS,pa as IOS_SIMULATOR_POST_CLOSE_SETTLE_MS,po as IOS_SIMULATOR_POST_OPEN_SETTLE_MS,nw as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,nh as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,tW as SessionStore,o9 as annotateScreenshotWithRefs,up as withAppLogProvider,ub as appendAppLogMarker,uF as applyRuntimeHintsToApp,s5 as buildSessionRecoveryHint,ld as buildSimctlArgs,lu as buildSimctlArgsForDevice,ot as buildSnapshotState,ny as buttonTag,om as captureAndroidUiHierarchyXml,aQ as captureSnapshot,u0 as cleanupRetainedMaterializedPaths,ro as cleanupUploadedArtifact,uA as clearAppLogFiles,t5 as clearRequestCanceled,uU as clearRuntimeHintsFromApp,aw as context_contextFromFlags,os as createDaemonRuntimeSessionStore,du as createLocalAppleRunnerProvider,t9 as createRequestCanceledError,ih as createScopedProvider,n1 as dispatchCommand,rh as emitRequestProgress,oG as ensureAndroidBlockingSystemDialogReady,pe as ensureDeviceReady,aE as errorResponse,iw as filterAppleAppsByBundlePrefix,tj as formatPortableActionLine,tL as formatScriptActionSummary,tC as formatScriptStringLiteral,ap as getActiveAndroidSnapshotFreshness,uh as getAppLogPathMetadata,nv as getClickButtonValidationError,t6 as getRequestSignal,c4 as getRunnerSessionSnapshot,nr as getSessionCommandKind,uE as getSimulatorState,sw as getSnapshotReferenceFrame,py as handleCloseCommand,u$ as hasRuntimeTransportHints,iN as hasScopedAppleToolProvider,t_ as inferFillText,rV as isApplePlatform,tD as isClickLikeCommand,im as isCommandSupportedOnDevice,lr as isImplicitSessionScopeConflict,am as isNavigationSensitiveAction,t8 as isRequestCanceled,tE as isTouchTargetCommand,r2 as listDeviceInventory,u4 as listIosDeviceApps,u5 as listIosDeviceProcesses,iZ as runMacOsPressAction,iX as runMacOsReadTextAction,au as markAndroidSnapshotFreshness,ag as markPendingInteractionOutcome,ax as markPostGestureStabilization,t4 as markRequestCanceled,rq as normalizePlatformSelector,tV as parseReplayOpenFlags,tG as parseReplayRuntimeFlags,tU as parseReplaySeriesFlags,lq as parseXmlDocumentSync,dO as prepareIosRunner,ra as prepareUploadedArtifact,dR as prewarmIosRunnerSession,iK as quitMacOsApp,iE as readApplePlistJson,uw as readSessionNetworkCapture,sy as recordTouchVisualizationEvent,oU as recoverAndroidBlockingSystemDialog,pp as refreshSessionDeviceIfNeeded,t3 as registerRequestAbort,ps as requireSessionOrExplicitSelector,ux as requireSimulatorDevice,pf as resolveAndroidEmulatorAvdName,dp as resolveAppleRunnerProvider,rB as resolveAppleSimulatorSetPathForSelector,iA as resolveAppleToolProvider,ng as resolveClickButton,pu as resolveCommandDevice,iH as resolveFrontmostMacOsApp,le as resolveImplicitSessionScope,u9 as resolveIosDevicectlHint,ln as resolveLeaseScope,i2 as resolveLinuxToolProvider,nY as resolvePayloadInput,s7 as resolvePublicSessionName,t2 as resolveRequestTrackingId,cc as resolveRunnerAppBundleId,oa as resolveSnapshotScope,rY as resolveTargetDevice,uQ as retainMaterializedPaths,uI as runAppLogDoctor,iM as runAppleToolCommand,u3 as runIosDevicectl,i4 as runLinuxToolCommand,iz as runMacOsAlertAction,iW as runMacOsPermissionAction,iY as runMacOsScreenshotAction,iJ as runMacOsSnapshotAction,lp as runSimctlForDevice,iD as runXcrun,dC as runIosRunnerCommand,df as withAppleRunnerProvider,c9 as abortAllIosRunnerSessions,c7 as stopAllIosRunnerSessions,pm as selectorTargetsSessionDevice,lt as sessionMatchesScope,pl as session_device_utils_hasExplicitSessionFlag,oo as setSessionSnapshot,pd as settleIosSimulator,n_ as shouldUseSynthesizedIosDrag,uD as shutdownSimulator,uM as ensureBootedSimulator,oh as snapshotAndroid,as as snapshotLinux,al as readLinuxTextAtPoint,uv as startAppLog,u_ as stopAppLog,c6 as stopIosRunnerSession,aS as stripInternalInteractionFlags,ix as withAppleToolProvider,i3 as withLinuxToolProvider,tI as uniqueStrings,lV as visitXmlPlistEntries,s3 as withKeyedLock};
27
+ `)}catch(t){let e=T(t);for(let t of(l.write(`Daemon error: ${e.message}
28
+ `),j))try{t.close(()=>{})}catch{}return p$(u),pU(p),c(1),null}let K=!1,J=async(e={})=>{if(K)return;K=!0,e.cause&&await U(e.cause),await pL(j),await q();let{stopAllIosRunnerSessions:t}=await Promise.resolve(tw);await t(),p$(u),pU(p),c(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{J()}),process.on("SIGTERM",()=>{J()}),process.on("SIGHUP",()=>{J()}),process.on("uncaughtException",e=>{let t=e instanceof $?e:T(e);l.write(`Daemon error: ${t.message}
29
+ `),J({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof $?t:T(t);l.write(`Daemon error: ${r.message}
30
+ `),J({exitCode:1,cause:t})})),{httpPort:a,shutdown:J,socketPort:r,token:k}})().catch(e=>{let t=T(e);process.stderr.write(`Daemon error: ${t.message}
31
+ `),process.exit(1)});export{pp as IOS_DEVICECTL_DEFAULT_HINT,cb as IOS_RUNNER_CONTAINER_BUNDLE_IDS,pS as IOS_SIMULATOR_POST_CLOSE_SETTLE_MS,p_ as IOS_SIMULATOR_POST_OPEN_SETTLE_MS,nI as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,n_ as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,tX as SessionStore,si as annotateScreenshotWithRefs,uM as withAppLogProvider,uF as appendAppLogMarker,uQ as applyRuntimeHintsToApp,lt as buildSessionRecoveryHint,lw as buildSimctlArgs,lg as buildSimctlArgsForDevice,oa as buildSnapshotState,nx as buttonTag,ov as captureAndroidUiHierarchyXml,a3 as captureSnapshot,pa as cleanupRetainedMaterializedPaths,ru as cleanupUploadedArtifact,uU as clearAppLogFiles,re as clearRequestCanceled,u0 as clearRuntimeHintsFromApp,aI as context_contextFromFlags,ou as createDaemonRuntimeSessionStore,dE as createLocalAppleRunnerProvider,rn as createRequestCanceledError,i_ as createScopedProvider,n6 as dispatchCommand,rS as emitRequestProgress,oK as ensureAndroidBlockingSystemDialogReady,ph as ensureDeviceReady,aT as errorResponse,iI as filterAppleAppsByBundlePrefix,tK as formatPortableActionLine,tU as formatScriptActionSummary,tT as formatScriptStringLiteral,av as getActiveAndroidSnapshotFreshness,uk as getAppLogPathMetadata,nA as getClickButtonValidationError,rr as getRequestSignal,dd as getRunnerSessionSnapshot,ns as getSessionCommandKind,uB as getSimulatorState,sI as getSnapshotReferenceFrame,pO as handleCloseCommand,uY as hasRuntimeTransportHints,iC as hasScopedAppleToolProvider,tA as inferFillText,rW as isApplePlatform,tP as isClickLikeCommand,iS as isCommandSupportedOnDevice,ll as isImplicitSessionScopeConflict,aS as isNavigationSensitiveAction,rt as isRequestCanceled,tC as isTouchTargetCommand,r6 as listDeviceInventory,pc as listIosDeviceApps,pd as listIosDeviceProcesses,i3 as runMacOsPressAction,i2 as runMacOsReadTextAction,ag as markAndroidSnapshotFreshness,ab as markPendingInteractionOutcome,aP as markPostGestureStabilization,t7 as markRequestCanceled,rz as matchesPlatformSelector,rK as normalizePlatformSelector,tH as parseReplayOpenFlags,tj as parseReplayRuntimeFlags,tV as parseReplaySeriesFlags,lQ as parseXmlDocumentSync,dJ as prepareIosRunner,rd as prepareUploadedArtifact,dz as prewarmIosRunnerSession,iY as quitMacOsApp,iT as readApplePlistJson,uP as readSessionNetworkCapture,sx as recordTouchVisualizationEvent,oH as recoverAndroidBlockingSystemDialog,pM as refreshSessionDeviceIfNeeded,t9 as registerRequestAbort,pI as requireSessionOrExplicitSelector,uG as requireSimulatorDevice,pE as resolveAndroidEmulatorAvdName,dD as resolveAppleRunnerProvider,rJ as resolveAppleSimulatorSetPathForSelector,ik as resolveAppleToolProvider,nb as resolveClickButton,pN as resolveCommandDevice,iZ as resolveFrontmostMacOsApp,lo as resolveImplicitSessionScope,pf as resolveIosDevicectlHint,lc as resolveLeaseScope,i9 as resolveLinuxToolProvider,n4 as resolvePayloadInput,la as resolvePublicSessionName,t6 as resolveRequestTrackingId,c_ as resolveRunnerAppBundleId,tY as resolveSessionRequestLogPath,tZ as resolveSessionRunnerLogPath,oc as resolveSnapshotScope,r3 as resolveTargetDevice,pi as retainMaterializedPaths,u$ as runAppLogDoctor,iR as runAppleToolCommand,pl as runIosDevicectl,ae as runLinuxToolCommand,i0 as runMacOsAlertAction,iQ as runMacOsPermissionAction,i4 as runMacOsScreenshotAction,i1 as runMacOsSnapshotAction,lv as runSimctlForDevice,iO as runXcrun,dW as runIosRunnerCommand,dk as withAppleRunnerProvider,dm as abortAllIosRunnerSessions,dh as stopAllIosRunnerSessions,pD as selectorTargetsSessionDevice,ls as sessionMatchesScope,pb as session_device_utils_hasExplicitSessionFlag,od as setSessionSnapshot,px as settleIosSimulator,nM as shouldUseSynthesizedIosDrag,uj as shutdownSimulator,uV as ensureBootedSimulator,oy as snapshotAndroid,af as snapshotLinux,am as readLinuxTextAtPoint,uR as startAppLog,uL as stopAppLog,df as stopIosRunnerSession,aN as stripInternalInteractionFlags,iP as withAppleToolProvider,i7 as withLinuxToolProvider,tx as uniqueStrings,l0 as visitXmlPlistEntries,s7 as withKeyedLock};