agent-device 0.17.1 → 0.17.2

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 (81) hide show
  1. package/README.md +1 -1
  2. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.1.apk → agent-device-android-multitouch-helper-0.17.2.apk} +0 -0
  3. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.2.apk.sha256 +1 -0
  4. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.1.manifest.json → agent-device-android-multitouch-helper-0.17.2.manifest.json} +4 -4
  5. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.1.apk → agent-device-android-snapshot-helper-0.17.2.apk} +0 -0
  6. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.2.apk.sha256 +1 -0
  7. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.1.manifest.json → agent-device-android-snapshot-helper-0.17.2.manifest.json} +6 -6
  8. package/dist/src/123.js +1 -0
  9. package/dist/src/1352.js +1 -1
  10. package/dist/src/1534.js +1 -0
  11. package/dist/src/1620.js +1 -0
  12. package/dist/src/1644.js +2 -0
  13. package/dist/src/2284.js +1 -0
  14. package/dist/src/2403.js +3 -0
  15. package/dist/src/2415.js +28 -29
  16. package/dist/src/2474.js +1 -0
  17. package/dist/src/2672.js +1 -0
  18. package/dist/src/3393.js +1 -0
  19. package/dist/src/4778.js +1 -1
  20. package/dist/src/5898.js +1 -0
  21. package/dist/src/7556.js +1 -1
  22. package/dist/src/7847.js +1 -1
  23. package/dist/src/8173.js +27 -0
  24. package/dist/src/8407.js +1 -0
  25. package/dist/src/8699.js +1 -1
  26. package/dist/src/8806.js +3 -3
  27. package/dist/src/9010.js +1 -0
  28. package/dist/src/9238.js +3 -3
  29. package/dist/src/9471.js +1 -1
  30. package/dist/src/9542.js +3 -3
  31. package/dist/src/9616.js +1 -0
  32. package/dist/src/9673.js +1 -0
  33. package/dist/src/9974.js +1 -0
  34. package/dist/src/android-adb.d.ts +12 -6
  35. package/dist/src/android-adb.js +1 -1
  36. package/dist/src/android-snapshot-helper.d.ts +15 -7
  37. package/dist/src/android.js +1 -1
  38. package/dist/src/apple.js +1 -1
  39. package/dist/src/apps.js +1 -1
  40. package/dist/src/args.js +1 -1
  41. package/dist/src/batch.d.ts +16 -4
  42. package/dist/src/cli.js +18 -42
  43. package/dist/src/command-surface.js +1 -1
  44. package/dist/src/contracts.d.ts +28 -4
  45. package/dist/src/contracts.js +1 -1
  46. package/dist/src/find.js +1 -1
  47. package/dist/src/finders.d.ts +3 -1
  48. package/dist/src/generic.js +5 -5
  49. package/dist/src/index.d.ts +141 -73
  50. package/dist/src/index.js +1 -1
  51. package/dist/src/input-actions.js +1 -1
  52. package/dist/src/interaction.js +1 -1
  53. package/dist/src/internal/png-worker.d.ts +26 -0
  54. package/dist/src/internal/png-worker.js +1 -0
  55. package/dist/src/metro.d.ts +3 -1
  56. package/dist/src/react-native.js +1 -1
  57. package/dist/src/remote-config.d.ts +33 -7
  58. package/dist/src/selector-runtime.js +1 -1
  59. package/dist/src/selectors.d.ts +3 -3
  60. package/dist/src/selectors.js +1 -1
  61. package/dist/src/server.js +2 -2
  62. package/dist/src/session.js +10 -11
  63. package/dist/src/snapshot.js +1 -1
  64. package/package.json +6 -3
  65. package/server.json +2 -2
  66. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.1.apk.sha256 +0 -1
  67. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.1.apk.sha256 +0 -1
  68. package/dist/src/1998.js +0 -1
  69. package/dist/src/2805.js +0 -1
  70. package/dist/src/4057.js +0 -1
  71. package/dist/src/5792.js +0 -1
  72. package/dist/src/6085.js +0 -1
  73. package/dist/src/6232.js +0 -1
  74. package/dist/src/8020.js +0 -1
  75. package/dist/src/8502.js +0 -1
  76. package/dist/src/940.js +0 -1
  77. package/dist/src/9404.js +0 -1
  78. package/dist/src/9533.js +0 -1
  79. package/dist/src/command-metadata.js +0 -1
  80. /package/dist/src/{1393.js → 3675.js} +0 -0
  81. /package/dist/src/{5310.js → 695.js} +0 -0
package/dist/src/2415.js CHANGED
@@ -1,31 +1,30 @@
1
- let e;import{__webpack_require__ as t}from"./rslib-runtime.js";import n,{createHash as r}from"node:crypto";import i from"node:path";import a,{existsSync as o,promises as s}from"node:fs";import l from"node:http";import{fileURLToPath as c,pathToFileURL as d}from"node:url";import"node:https";import u from"node:os";import{once as p}from"node:events";import{Transform as f}from"node:stream";import{pipeline as m}from"node:stream/promises";import{AsyncLocalStorage as h}from"node:async_hooks";import w from"node:fs/promises";import g from"node:net";import{resolveUserPath as v}from"./3267.js";import{appendScreenshotScriptFlags as y,screenshotOptionsFromFlags as S,screenshotFlagsFromOptions as _,SCREENSHOT_ACTION_FLAG_KEYS as I}from"./5310.js";import{withDiagnosticsScope as b,getDiagnosticsMeta as A,flushDiagnosticsToSessionFile as x,withDiagnosticTimer as N,updateDiagnosticsScope as M,emitDiagnostic as E}from"./7599.js";import{readProcessStartTime as D,readProcessCommand as k,resolveRuntimeTransportHints as P,isProcessGroupAlive as C,isAgentDeviceDaemonProcess as R,isProcessAlive as T}from"./8656.js";import{toAppErrorCode as O,asAppError as L,normalizeError as $,AppError as F}from"./9152.js";import{runCmdBackground as U,runCmdStreaming as G,runCmd as q,runCmdSync as j,resolveExecutableOverridePath as V,whichCmd as B}from"./9818.js";import{consumeTextLines as H,serializeDaemonResponseEnvelope as K,normalizeTenantId as W,shouldStreamRequestProgress as z,resolveDaemonPaths as J,resolveSessionIsolationMode as X,shellQuoteIfNeeded as Z,resolveDaemonServerMode as Y,resolveDaemonCodeSignature as Q,serializeDaemonProgressEnvelope as ee,serializeDaemonRpcResponseEnvelope as et}from"./9238.js";import{runAndroidAdb as en,resolveIosSimulatorDeviceSetPath as er,getAndroidBlockingDialogFocus as ei,withRetry as ea,Deadline as eo,isEnvTruthy as es,openAndroidApp as el,classifyBootFailure as ec,streamAndroidLogcatWithAdb as ed,bootFailureHint as eu,androidDeviceForSerial as ep,parseSerialAllowlist as ef,retryWithPolicy as em,getAndroidAppState as eh,classifyAndroidAppTarget as ew,captureAndroidLogcatWithAdb as eg,resolveAndroidSerialAllowlist as ev,isDeepLinkTarget as ey,formatAndroidInstalledPackageRequiredMessage as eS}from"./8806.js";import{PUBLIC_COMMANDS as e_,INTERNAL_COMMANDS as eI,GESTURE_SUBCOMMAND_ERROR as eb}from"./5792.js";import{findMistargetedTypeRefToken as eA,buildSwipePresetGesturePlan as ex,analyzeReactNativeOverlay as eN,parseScrollDirection as eM,isKeyboardAction as eE,areRectsApproximatelyEqual as eD,isSystemScrollIndicatorLabel as ek,formatScrollEdgeMessage as eP,isReactNativeCollapsedWarningWrapperWithVisibleBanner as eC,deriveMobileSnapshotHiddenContentHints as eR,decodePng as eT,inferVerticalScrollIndicatorDirections as eO,captureScrollEdgeState as eL,normalizeSnapshotTree as e$,isReactNativeCollapsedWarningWrapperCandidate as eF,PNG as eU,createAgentDevice as eG,runScrollEdgePasses as eq,requireIntInRange as ej,inferGestureReferenceFrame as eV,annotateCoveredSnapshotNodes as eB,localCommandPolicy as eH,buildScrollGesturePlan as eK,parseSwipePreset as eW}from"./9533.js";import{sleep as ez}from"./4829.js";import{readLocationCoordinate as eJ,successText as eX,withSuccessText as eZ,parseDeviceRotation as eY}from"./1998.js";import{findNearestAncestor as eQ,normalizeType as e0,pruneGroupNodes as e1,findNodeByLabel as e2,resolveRefLabel as e3}from"./940.js";import{snapshotPresentationOptionsFromFlags as e4,normalizeRef as e5,findNodeByRef as e8,buildSnapshotPresentationKey as e6,centerOfRect as e9,attachRefs as e7}from"./4057.js";import{isScrollableType as te}from"./4778.js";import{readVersion as tt,findProjectRoot as tn}from"./9671.js";import{resolveAndroidAdbProvider as tr,resolveAndroidAdbExecutor as ti}from"./9639.js";import{parseUiHierarchy as ta,ensureAndroidSnapshotHelper as to,parseUiHierarchyTree as ts,captureAndroidSnapshotWithHelper as tl,captureAndroidSnapshotWithHelperSession as tc,parseAndroidSnapshotHelperManifest as td,forgetAndroidSnapshotHelperInstall as tu,buildUiHierarchySnapshot as tp,stopAndroidSnapshotHelperSession as tf}from"./221.js";import{applyCommandDefaults as tm}from"./1352.js";var th,tw,tg={};t.r(tg),t.d(tg,{IH:()=>pt,ug:()=>pn,sE:()=>u3,Bx:()=>u4,WX:()=>pe,Co:()=>u8,wg:()=>u7,withAppLogProvider:()=>u0});var tv={};t.r(tv),t.d(tv,{IO:()=>iQ,LB:()=>iY,xY:()=>i1,eN:()=>i0,runMacOsPressAction:()=>i4,runMacOsReadTextAction:()=>i3,rR:()=>i5,r5:()=>i2});var ty={};t.r(ty),t.d(ty,{bu:()=>cN,abortAllIosRunnerSessions:()=>dB,hv:()=>dG,Nr:()=>up,gE:()=>uu,FS:()=>cA,runIosRunnerCommand:()=>ud,stopAllIosRunnerSessions:()=>dH,yA:()=>dV});var tS={};t.r(tS),t.d(tS,{v:()=>d1,M:()=>d2,withAppleRunnerProvider:()=>d3});var t_={};t.r(t_),t.d(t_,{ensureBootedSimulator:()=>pa,SA:()=>ps,EB:()=>pr,N3:()=>po});var tI={};t.r(tI),t.d(tI,{qx:()=>iR,Ly:()=>iL,Gr:()=>iP,vT:()=>iT,Cc:()=>iO,withAppleToolProvider:()=>iC});var tb={};t.r(tb),t.d(tb,{readLinuxTextAtPoint:()=>ah,r:()=>am});var tA={};function tx(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}t.r(tA),t.d(tA,{uK:()=>i7,nE:()=>at,withLinuxToolProvider:()=>ae});let tN=["platform","device","udid","serial","out","verbose","metroHost","metroPort","bundleUrl","launchUrl","snapshotInteractiveOnly","snapshotCompact","snapshotDepth","snapshotScope","snapshotRaw",...I,"relaunch","saveScript","noRecord","fps","quality","hideTouches","count","intervalMs","delayMs","holdMs","jitterPx","doubleTap","clickButton","pauseMs","pattern"];function tM(e){let t=e.result?.text;if("string"==typeof t&&t.trim().length>0)return t;let n=e.positionals??[];if(0===n.length)return"";let r=n[0];return r?.startsWith("@")?n.length>=3?n.slice(2).join(" ").trim():n.slice(1).join(" ").trim():!(n.length>=3)||Number.isNaN(Number(n[0]))||Number.isNaN(Number(n[1]))?n.slice(1).join(" ").trim():n.slice(2).join(" ").trim()}function tE(e){let t=new Set,n=[];for(let r of e)t.has(r)||(t.add(r),n.push(r));return n}let tD=/^-?\d+(\.\d+)?$/,tk=/^[^\s"\\]+$/,tP=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),tC=new Map([["--count","count"],["--pause-ms","pauseMs"]]),tR=new Map([["--delay-ms","delayMs"]]);function tT(e){return"click"===e||"press"===e}function tO(e){return tT(e)||"longpress"===e}function tL(e){return"type"===e||"fill"===e}function t$(e){return tU(e,tG)}function tF(e){return JSON.stringify(e)}function tU(e,t){return t(e)?e:tF(e)}function tG(e){return tq(e)&&e.startsWith("@")||tD.test(e)}function tq(e){return tk.test(e)}function tj(e){let t=(e.positionals??[]).map(e=>t$(e));return[e.command,...t].join(" ")}function tV(e,t){let n=t.flags??{};if(tT(t.command)){"number"==typeof n.count&&e.push("--count",String(n.count)),"number"==typeof n.intervalMs&&e.push("--interval-ms",String(n.intervalMs)),"number"==typeof n.holdMs&&e.push("--hold-ms",String(n.holdMs)),"number"==typeof n.jitterPx&&e.push("--jitter-px",String(n.jitterPx)),!0===n.doubleTap&&e.push("--double-tap");let t=n.clickButton;t&&"primary"!==t&&e.push("--button",t);return}if("swipe"===t.command){"number"==typeof n.count&&e.push("--count",String(n.count)),"number"==typeof n.pauseMs&&e.push("--pause-ms",String(n.pauseMs)),("one-way"===n.pattern||"ping-pong"===n.pattern)&&e.push("--pattern",n.pattern);return}tL(t.command)&&"number"==typeof n.delayMs&&e.push("--delay-ms",String(n.delayMs))}function tB(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",tU(t.metroHost,tq)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",tU(t.bundleUrl,tq)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",tU(t.launchUrl,tq)))}function tH(e,t){let n=[],r={},i=tT(e)?tP:"swipe"===e?tC:tL(e)?tR:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(tT(e)&&"--double-tap"===o){r.doubleTap=!0;continue}let s=t[a+1];if(tT(e)&&"--button"===o&&void 0!==s){("primary"===s||"secondary"===s||"middle"===s)&&(r.clickButton=s),a+=1;continue}let l=i?.get(o);if(l&&void 0!==s){let e=tW(s);if(null!==e){r[l]=e,a+=1;continue}}if("swipe"===e&&"--pattern"===o&&void 0!==s){("one-way"===s||"ping-pong"===s)&&(r.pattern=s),a+=1;continue}n.push(o)}return{positionals:n,flags:r}}function tK(e){let t=[],n={};for(let r=0;r<e.length;r+=1){let i=e[r],a=e[r+1];if("--platform"===i&&void 0!==a){("ios"===a||"android"===a)&&(n.platform=a),r+=1;continue}if("--metro-host"===i&&void 0!==a){n.metroHost=a,r+=1;continue}if("--metro-port"===i&&void 0!==a){let e=tW(a);null!==e&&(n.metroPort=e),r+=1;continue}if("--bundle-url"===i&&void 0!==a){n.bundleUrl=a,r+=1;continue}if("--launch-url"===i&&void 0!==a){n.launchUrl=a,r+=1;continue}t.push(i)}return{positionals:t,flags:n}}function tW(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function tz(e){var t;let n=[],r={};for(let t of e){if("--relaunch"===t){r.relaunch=!0;continue}n.push(t)}let i=tK(n);return{positionals:i.positionals,flags:r,runtime:(t=i.flags).platform||t.metroHost||void 0!==t.metroPort||t.bundleUrl||t.launchUrl?i.flags:void 0}}function tJ(e,t={}){let n=[e.command];if("snapshot"===e.command)e.flags?.snapshotInteractiveOnly&&n.push("-i"),e.flags?.snapshotCompact&&n.push("-c"),"number"==typeof e.flags?.snapshotDepth&&n.push("-d",String(e.flags.snapshotDepth)),e.flags?.snapshotScope&&n.push("-s",t$(e.flags.snapshotScope)),e.flags?.snapshotRaw&&n.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])n.push(t$(t));e.flags?.relaunch&&n.push("--relaunch"),tB(n,e.runtime)}else if("runtime"===e.command)!function(e,t,n={}){let r=t.positionals??[];for(let t of n.includeAllPositionals?r:r.slice(0,1))e.push(tU(t,tq));tB(e,t.flags)}(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals});else if("record"===e.command)!function(e,t){let[n,...r]=t.positionals??[];for(let t of(n&&e.push(tU(n,tq)),r))e.push(t$(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")}(n,e);else if("screenshot"===e.command){for(let t of e.positionals??[])n.push(t$(t));y(n,e.flags)}else{for(let t of e.positionals??[])n.push(t$(t));tV(n,e)}return n.join(" ")}class tX{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let n=i.dirname(t);a.existsSync(n)||a.mkdirSync(n,{recursive:!0});let r=function(e){var t=e,n=function(e){let t=[];for(let n of e.actions){if("snapshot"===n.command)continue;let r=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 tT(e.command)?{...e,positionals:[t]}:"longpress"===e.command?function(e,t){let n="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:n?[t,n]:[t]}}(e,t):"fill"===e.command?function(e,t){let n=tM(e);return n.length>0?{...e,positionals:[t,n]}:void 0}(e,t):function(e,t){let n=e.positionals?.[0];return"text"===n||"attrs"===n?{...e,positionals:[n,t]}:void 0}(e,t)}(n);if(r){t.push(r);continue}let i=function(e,t){if(!tZ(t.command))return;let n=t.result?.refLabel;if("string"!=typeof n||0===n.trim().length)return;let r=n.trim();return{ts:t.ts,command:"snapshot",positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotCompact:!0,snapshotScope:r},result:{scope:r}}}(e,n);i&&t.push(i),t.push(n)}return t}(e);let r=[],i=t.device.kind?` kind=${t.device.kind}`:"";for(let e of(r.push(`context platform=${t.device.platform} device=${tF(t.device.name)}${i} theme=unknown`),n))e.flags?.noRecord||r.push(function(e){var t,n;let r=(t=[e.command],n=e,tT(n.command)?function(e,t){let n=t.positionals?.[0];if(n){if(n.startsWith("@"))return e.push(t$(n)),tY(e,t),tV(e,t),e.join(" ");if(1===t.positionals.length)return e.push(t$(n)),tV(e,t),e.join(" ")}}(t,n):"fill"===n.command?function(e,t){let n=t.positionals?.[0];if(!n?.startsWith("@"))return;e.push(t$(n)),tY(e,t);let r=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(t$(r)),tV(e,t),e.join(" ")}(t,n):"get"===n.command?function(e,t){let n=t.positionals?.[0],r=t.positionals?.[1];if(n&&r)return e.push(t$(n)),e.push(t$(r)),r.startsWith("@")&&tY(e,t),e.join(" ")}(t,n):void 0);return r||tJ(e)}(e));return`${r.join("\n")}
2
- `}(e);return a.writeFileSync(t,r),{written:!0,path:t}}catch(n){return E({level:"warn",phase:"session_script_write_failed",data:{session:e.name,path:t,error:n instanceof Error?n.message:String(n)}}),{written:!1}}}resolveScriptPath(e){if(e.saveScriptPath)return v(e.saveScriptPath,{cwd:void 0});a.existsSync(this.sessionsDir)||a.mkdirSync(this.sessionsDir,{recursive:!0});let t=tx(e.name),n=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${n}.ad`)}}function tZ(e){return tO(e)||"fill"===e||"get"===e}function tY(e,t){let n=t.result?.refLabel;"string"==typeof n&&n.trim().length>0&&e.push(t$(n))}class tQ{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new tX(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=v(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 n of tN)void 0!==e[n]&&(t[n]=e[n]);return t}(t.flags),result:t.result}),E({level:"debug",phase:"record_action",data:{command:t.command,session:e.name}}))}writeSessionLog(e){let t=this.scriptWriter.write(e);t.written&&E({level:"info",phase:"session_script_written",data:{session:e.name,path:t.path}})}defaultTracePath(e){let t=tx(e.name),n=new Date().toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${n}.trace.log`)}resolveSessionDir(e){return i.join(this.sessionsDir,tx(e))}ensureSessionDir(e){let t=this.resolveSessionDir(e);return a.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return i.join(this.resolveSessionDir(e),"app.log")}resolveAppLogPidPath(e){return i.join(this.resolveSessionDir(e),"app-log.pid")}static expandHome(e,t){return v(e,{cwd:t})}}function t0(e){return i.join(e,"runner.log")}function t1(e,t){let n=tx(t&&t.length>0?t:"unknown");return i.join(e,"requests",`${n}.ndjson`)}let t2="app-log.pid";function t3(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 t4(e,t){if(!e)return;let n=i.dirname(e);a.existsSync(n)||a.mkdirSync(n,{recursive:!0});let r={pid:t,startTime:D(t)??void 0,command:k(t)??void 0};a.writeFileSync(e,`${JSON.stringify(r)}
3
- `)}function t5(e){if(e&&a.existsSync(e))try{a.unlinkSync(e)}catch{}}let t8=new Set,t6=new Map,t9="request_canceled",t7="request canceled";function ne(e,t){if("string"==typeof e&&e.length>0)return e;let n=("string"==typeof t?t:"number"==typeof t&&Number.isFinite(t)?String(t):"generated").trim().replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,32)||"generated",r=Math.random().toString(36).slice(2,10);return`req:${n}:${process.pid}:${Date.now()}:${r}`}function nt(e){if(!e)return;!function(e){if(e.size<=5e4)return;let t=0;for(let n of e.keys()){if(t>=1e4)break;e.delete(n),t++}}(t6);let t=new AbortController;t6.set(e,t),t8.has(e)&&t.abort()}function nn(e){e&&(!function(e){if(e.size<=5e4)return;let t=0;for(let n of e){if(t>=1e4)break;e.delete(n),t++}}(t8),t8.add(e),t6.get(e)?.abort())}function nr(e){e&&(t8.delete(e),t6.delete(e))}function ni(e){return!!e&&t8.has(e)}function na(e){if(e)return t6.get(e)?.signal}function no(){return new F("COMMAND_FAILED",t7,{reason:t9})}function ns(e){if(ni(e))throw no()}function nl(e){return e instanceof F&&"COMMAND_FAILED"===e.code&&(e.details?.reason===t9||e.message===t7)}let nc=new Map;function nd(e){let t=n.randomUUID(),r=setTimeout(()=>{nu(t)},9e5);return r.unref(),nc.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:r}),t}function nu(e){let t=nc.get(e);if(t&&(clearTimeout(t.timer),nc.delete(e),t.deleteAfterDownload))try{a.rmSync(t.artifactPath,{force:!0})}catch{}}let np=new Map;function nf(e,t){let n=np.get(e);if(!n)throw new F("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(n.tenantId&&n.tenantId!==t)throw new F("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(n.timer),n.artifactPath}function nm(e){let t=np.get(e);t&&(clearTimeout(t.timer),np.delete(e),a.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function nh(e){let t=await nw(e);await q("tar",["xf",e.archivePath,"-C",e.tempDir]);let n=i.join(e.tempDir,t);if(!a.existsSync(n))throw new F("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return n}async function nw(e){let t=await q("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new F("INVALID_ARGS","Artifact is not a valid tar archive",{archivePath:e.archivePath,stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let n=t.stdout.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(0===n.length)throw new F("INVALID_ARGS","Uploaded app bundle archive is empty");let r=n.map(ng),i=e.expectedRootName??function(e,t){let n=new Set;for(let t of e){let[e]=t.split("/");e&&n.add(e)}let r=[...n];if("ios"===t){let e=r.filter(e=>e.toLowerCase().endsWith(".app")),t=e[0];if(void 0!==t&&1===e.length)return t;if(0===e.length)throw new F("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new F("INVALID_ARGS",`iOS app bundle archives must contain exactly one top-level .app directory, found: ${e.join(", ")}`)}let i=r[0];if(void 0!==i&&1===r.length)return i;throw new F("INVALID_ARGS",`Archive must contain a single top-level bundle, found: ${r.join(", ")}`)}(r,e.platform);if(!r.some(e=>e===i||e.startsWith(`${i}/`)))throw new F("INVALID_ARGS",`Uploaded archive must contain a top-level "${i}" bundle`);for(let e of r){var a=e,o=i;if(a!==o&&!a.startsWith(`${o}/`))throw new F("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await q("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new F("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function ng(e){if(e.includes("\0"))throw new F("INVALID_ARGS",`Invalid archive entry: ${e}`);if(i.posix.isAbsolute(e))throw new F("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=i.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new F("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function nv(e,t){return new Promise((n,r)=>{let i,o=!1,s=0,l=a.createWriteStream(t),c=e=>{if(!o){if(o=!0,i&&clearTimeout(i),e)return void ny(l,t).finally(()=>r(e));n()}},d=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new F("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 f({transform(e,t,n){d();let r=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=r)>0x80000000?n(new F("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):n(null,e)}});e.on("aborted",()=>{c(new F("COMMAND_FAILED","Artifact transfer was interrupted"))}),d(),m(e,u,l).then(()=>c(),e=>c(e))})}async function ny(e,t){if(e.destroy(),!e.closed)try{await p(e,"close")}catch{}await a.promises.rm(t,{force:!0}).catch(()=>{})}async function nS(e){let t,n=e.headers["x-artifact-type"],r=e.headers["x-artifact-filename"];if(!n||!r)throw new F("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==n&&"app-bundle"!==n)throw new F("INVALID_ARGS",`Invalid x-artifact-type: ${n}. 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 F("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let o=function(e){let t=e.trim(),n=i.basename(t);if(!n||"."===n||".."===n)throw new F("INVALID_ARGS",`Invalid artifact filename: ${e}`);return n}(r),s=(t=function(e){let t=e?.trim();if(!t)return"request";let n=t.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return n.length>0?n.slice(0,48):"request"}("upload"),a.mkdtempSync(i.join(u.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===n){let t=i.join(s,o);return await nv(e,t),{artifactPath:t,tempDir:s}}let t=i.join(s,"artifact.tar");await nv(e,t);let r=await nh({archivePath:t,tempDir:s,platform:"ios",expectedRootName:o});return a.rmSync(t,{force:!0}),{artifactPath:r,tempDir:s}}catch(e){throw a.rmSync(s,{recursive:!0,force:!0}),e}}let n_=new h;async function nI(e,t){return await n_.run(e,t)}function nb(e){n_.getStore()?.(e)}let nA=new Set(["agent_device.command","agent-device.command"]),nx=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),nN=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),nM={"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"},nE=new Set([...nA,...nx,...nN,...Object.keys(nM)]);function nD(e,t,n,r){return{jsonrpc:"2.0",id:e,error:{code:t,message:n,data:r}}}function nk(e,t,n=200){e.statusCode=n,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function nP(e,t){e.destroyed||(e.write(et(t)),e.end())}function nC(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function nR(e,t){let n="string"==typeof t.authorization?t.authorization:"",r=n.toLowerCase().startsWith("bearer ")?n.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??r??""}function nT(e,t){let n=e[t];return"string"==typeof n?n:void 0}function nO(e,t){let n=e[t];return Number.isInteger(n)?Number(n):void 0}function nL(e,t){let n="string"==typeof e[t]?e[t].trim():"";if(!n)throw new F("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return n}function n$(e,t){let n=e[t],r="number"==typeof n?n:"string"==typeof n?Number(n):NaN;if(!Number.isInteger(r))throw new F("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return r}async function nF(e,t){if(!e)return{ok:!0};let n=await e(t);if(void 0===n||!0===n)return{ok:!0};if(!1===n){let e=$(new F("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:nD(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===n.ok){let e=$(new F(O(n.code,"UNAUTHORIZED"),n.message??"Request rejected by auth hook",n.details));return{ok:!1,statusCode:401,response:nD(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof n.tenantId&&n.tenantId.length>0){let e=W(n.tenantId);if(!e){let e=$(new F("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:nD(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function nU(){let e,t=process.env.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let n=process.env.AGENT_DEVICE_HTTP_AUTH_EXPORT||"default",r=i.isAbsolute(t)?t:i.resolve(t);try{e=await import(d(r).href)}catch(e){throw new F("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:r,error:e instanceof Error?e.message:String(e)})}let a=e[n];if("function"!=typeof a)throw new F("INVALID_ARGS",`Auth hook export ${n} is not a function`,{hookPath:r,exportName:n});return a}async function nG(e){let t=await nU(),{handleRequest:n,token:r}=e;return l.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!0}));return}if("POST"===e.method&&"/upload"===e.url)return void nq(e,i,t,r);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void nj(e,i,t,r);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||nk(i,nD(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let r,o;try{r=JSON.parse(a)}catch{nk(i,nD(null,-32700,"Parse error"),400);return}if("2.0"!==r.jsonrpc||"string"!=typeof r.method)return void nk(i,nD(r.id??null,-32600,"Invalid Request"),400);if(!nE.has(r.method))return void nk(i,nD(r.id??null,-32601,`Method not found: ${r.method}`),404);if(!r.params||"object"!=typeof r.params)return void nk(i,nD(r.id??null,-32602,"Invalid params"),400);try{var s;let a=r.params,l=function(e,t,n){if(nA.has(e))return{token:nR(t,n),session:t.session??"default",command:t.command??"",positionals:Array.isArray(t.positionals)?t.positionals:[],flags:t.flags,runtime:t.runtime,meta:t.meta};if(nx.has(e)){let e,r=nT(t,"platform");if("ios"!==r&&"android"!==r)throw new F("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:nR(t,n),session:nT(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:r},meta:{requestId:nT(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new F("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new F("INVALID_ARGS","Invalid params: source.url is required for url sources");let n=t.headers,r={};if(void 0!==n){if(!n||"object"!=typeof n||Array.isArray(n))throw new F("INVALID_ARGS","Invalid params: source.headers must be a string map");for(let[e,t]of Object.entries(n)){if("string"!=typeof t)throw new F("INVALID_ARGS","Invalid params: source.headers values must be strings");r[e]=t}}return Object.keys(r).length>0?{kind:"url",url:e,headers:r}:{kind:"url",url:e}}if("path"===t.kind){let e="string"==typeof t.path?t.path.trim():"";if(!e)throw new F("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,n=nL(e,"owner"),r=nL(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new F("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new F("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new F("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:n,repo:r,artifactId:n$(e,"artifactId")}:(a&&(t=n$(e,"runId")),{kind:"github-actions-artifact",owner:n,repo:r,...a?{runId:t}:{},artifactName:nL(e,"artifactName")})}(t);throw new F("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:nO(t,"retentionMs")}}}if(nN.has(e)){let e=nT(t,"materializationId")?.trim();if(!e)throw new F("INVALID_ARGS","Invalid params: materializationId is required");return{token:nR(t,n),session:nT(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:nT(t,"requestId"),materializationId:e}}}let r=nM[e];if(r)return{token:nR(t,n),session:nT(t,"session")??"default",command:r,positionals:[],meta:{tenantId:nT(t,"tenantId")??nT(t,"tenant"),runId:nT(t,"runId"),leaseId:nT(t,"leaseId"),leaseTtlMs:nO(t,"ttlMs"),leaseBackend:nT(t,"backend")}};throw new F("INVALID_ARGS",`Method not found: ${e}`)}(r.method,a,e.headers);if(s=r.method,nA.has(s)&&("string"!=typeof l.command||0===l.command.length))return void nk(i,nD(r.id??null,-32602,"Invalid params: command is required"),400);o=ne(l.meta?.requestId,r.id),l.meta={...l.meta,requestId:o},nt(o);let c=()=>{i.writableFinished||nn(o)};e.on("aborted",c),i.on("close",c);let d=await nF(t,{headers:e.headers,rpcRequest:r,daemonRequest:l});if(!d.ok)return void nk(i,d.response,d.statusCode);if(d.tenantId&&(l.meta={...l.meta,tenantId:d.tenantId,sessionIsolation:l.meta?.sessionIsolation??l.flags?.sessionIsolation??"tenant"}),z(l)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await nI(e=>{!i.destroyed&&i.write(ee(e))},async()=>await n(l)),t=e.ok?{jsonrpc:"2.0",id:r.id??null,result:e}:nD(r.id??null,-32e3,e.error.message,e.error);nP(i,t);return}let u=await n(l);if(u.ok)return void nk(i,{jsonrpc:"2.0",id:r.id??null,result:u});nk(i,nD(r.id??null,-32e3,u.error.message,u.error),nC(u.error.code))}catch(t){let e=$(t);if(i.headersSent)return void nP(i,nD(r.id??null,-32e3,e.message,e));nk(i,nD(r.id??null,-32e3,e.message,e),nC(e.code))}finally{nr(o)}})})}async function nq(e,t,r,i){try{var a;let o,s,l=await nV({req:e,res:t,authHook:r,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let c=await nS(e),d=(a={artifactPath:c.artifactPath,tempDir:c.tempDir,tenantId:l.tenantId},o=n.randomUUID(),(s=setTimeout(()=>{nm(o)},3e5)).unref(),np.set(o,{artifactPath:a.artifactPath,tempDir:a.tempDir,tenantId:a.tenantId,timer:s}),o);t.statusCode=200,t.setHeader("content-type","application/json"),t.end(JSON.stringify({ok:!0,uploadId:d}))}catch(e){nB(t,$(e))}}async function nj(e,t,n,r){let i=e.url?.slice("/artifacts/".length)??"";if(!i){t.statusCode=400,t.end("Missing artifact id");return}try{let o=await nV({req:e,res:t,authHook:n,expectedToken:r,daemonRequest:{command:"download_artifact",positionals:[i]}});if(!o)return;let s=function(e,t){let n=nc.get(e);if(!n)throw new F("INVALID_ARGS",`Artifact not found: ${e}`);if(n.tenantId&&n.tenantId!==t)throw new F("UNAUTHORIZED","Artifact belongs to a different tenant");if(!a.existsSync(n.artifactPath))throw nu(e),new F("COMMAND_FAILED",`Artifact file is missing: ${n.artifactPath}`);return{artifactPath:n.artifactPath,fileName:n.fileName,deleteAfterDownload:n.deleteAfterDownload}}(i,o.tenantId),l=a.createReadStream(s.artifactPath);t.statusCode=200,t.setHeader("content-type","application/octet-stream"),s.fileName&&t.setHeader("content-disposition",`attachment; filename="${s.fileName.replace(/"/g,"")}"`),l.on("error",e=>{if(t.headersSent)t.destroy(e);else{let n=$(e);t.statusCode=nC(n.code),t.end(n.message)}}),t.on("close",()=>{t.writableFinished&&nu(i)}),l.pipe(t)}catch(e){nB(t,$(e))}}async function nV(e){var t,n;let{req:r,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=nR({},r.headers),c=(t=l,(n=o)&&t!==n?$(new F("UNAUTHORIZED","Invalid token")):null);if(c)return nB(i,c),null;let d=await nF(a,{headers:r.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 nB(e,t){e.statusCode=nC(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function nH(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function nK(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function nW(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 F("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class nz{leases=new Map;runBindings=new Map;maxActiveSimulatorLeases;defaultLeaseTtlMs;minLeaseTtlMs;maxLeaseTtlMs;now;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.defaultLeaseTtlMs=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,this.minLeaseTtlMs=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):5e3,this.maxLeaseTtlMs=Number.isInteger(e.maxLeaseTtlMs)?Math.max(this.minLeaseTtlMs,Number(e.maxLeaseTtlMs)):6e5,this.now=e.now??(()=>Date.now())}allocateLease(e){let t=nW(e.backend),r=W(e.tenantId);if(!r)throw new F("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=nH(e.runId);if(!i)throw new F("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(r,i,t),s=this.runBindings.get(o);if(s){let e=this.leases.get(s);if(e)return this.refreshLease(e,a);this.runBindings.delete(o)}this.enforceCapacity(t);let l=this.now(),c={leaseId:n.randomBytes(16).toString("hex"),tenantId:r,runId:i,backend:t,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=nK(e.leaseId);if(!t)throw new F("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let n=this.leases.get(t);if(!n)throw new F("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});this.assertOptionalScopeMatch(n,e.tenantId,e.runId);let r=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(n,r)}releaseLease(e){let t=nK(e.leaseId);if(!t)throw new F("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let n=this.leases.get(t);return n?(this.assertOptionalScopeMatch(n,e.tenantId,e.runId),this.leases.delete(t),this.runBindings.delete(this.bindingKey(n.tenantId,n.runId,n.backend)),{released:!0}):{released:!1}}assertLeaseAdmission(e){let t=nW(e.backend),n=W(e.tenantId);if(!n)throw new F("INVALID_ARGS","tenant isolation requires tenant id.");let r=nH(e.runId);if(!r)throw new F("INVALID_ARGS","tenant isolation requires run id.");let i=nK(e.leaseId);if(!i)throw new F("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new F("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==n||a.runId!==r)throw new F("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 F("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 F("INVALID_ARGS",`Lease ttlMs must be between ${this.minLeaseTtlMs} and ${this.maxLeaseTtlMs}.`);return t}refreshLease(e,t){let n=this.now(),r={...e,heartbeatAt:n,expiresAt:n+t};return this.leases.set(r.leaseId,r),this.runBindings.set(this.bindingKey(r.tenantId,r.runId,r.backend),r.leaseId),{...r}}bindingKey(e,t,n){return`${e}:${t}:${n}`}assertOptionalScopeMatch(e,t,n){let r=W(t),i=nH(n);if(t&&!r)throw new F("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(n&&!i)throw new F("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&e.tenantId!==r||i&&e.runId!==i)throw new F("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}function nJ(e){return e}function nX(e){return"apple"===e||"ios"===e||"macos"===e}function nZ(e,t){return!t||("apple"===t?nX(e):e===t)}function nY(e){let{simulatorSetPath:t,platform:n,target:r}=e;if(t&&"macos"!==n&&"desktop"!==r)return t}async function nQ(e,t,n={}){let r=e,i=e=>e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim();if(t.platform&&(r=r.filter(e=>nZ(e.platform,t.platform))),t.target&&(r=r.filter(e=>(e.target??"mobile")===t.target)),t.udid){let e=r.find(e=>e.id===t.udid&&nX(e.platform));if(!e)throw new F("DEVICE_NOT_FOUND",`No Apple device with UDID ${t.udid}`);return e}if(t.serial){let e=r.find(e=>e.id===t.serial&&"android"===e.platform);if(!e)throw new F("DEVICE_NOT_FOUND",`No Android device with serial ${t.serial}`);return e}if(t.deviceName){let e=i(t.deviceName),n=r.find(t=>i(t.name)===e);if(!n)throw new F("DEVICE_NOT_FOUND",`No device named ${t.deviceName}`);return n}let a=r[0];if(void 0!==a&&1===r.length)return a;if(0===r.length){var o;let e=n.simulatorSetPath;if(e&&(!(o=t.platform)||"apple"===o||"ios"===o))throw new F("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 F("DEVICE_NOT_FOUND","No devices found",{selector:t})}let s=r.filter(e=>"device"!==e.kind);s.length>0&&(r=s);let l=r.filter(e=>e.booted),c=l[0];if(void 0!==c&&1===l.length)return c;let d=l[0]??r[0];if(void 0===d)throw new F("DEVICE_NOT_FOUND","No devices found",{selector:t});return d}async function n0(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 n=[];try{let{listAndroidDevices:t}=await import("./8806.js");n.push(...await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0}))}catch{}try{let{listAppleDevices:t}=await import("./devices.js");n.push(...await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid}))}catch{}try{let{listLinuxDevices:e}=await import("./devices~1.js");n.push(...await e())}catch{}return n}let n1=new h,n2=new h;async function n3(e,t,n){var r,i;let a=await n4(e,t,n);if(r=t,i=a,!n5(r)&&(!r.platform||"apple"===r.platform||"ios"===r.platform)&&"desktop"!==r.target&&(!i||"device"===i.kind)){let{findBootableIosSimulator:e}=await import("./devices.js"),r=await e({simulatorSetPath:n.simulatorSetPath,target:t.target});if(r)return r}if(a)return a;throw new F("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function n4(e,t,n){try{return await nQ(e,t,n)}catch(e){var r;if(r=e,!n5(t)&&r instanceof F&&"DEVICE_NOT_FOUND"===r.code)return;throw e}}function n5(e){return!!(e.udid||e.serial||e.deviceName)}async function n8(e){let t=nJ(e.platform),n=nY({simulatorSetPath:er(e.iosSimulatorDeviceSet),platform:t,target:e.target}),r=ev(e.androidDeviceAllowlist),i=function(e){let{flags:t,normalizedPlatform:n,iosSimulatorSetPath:r,androidSerialAllowlist:i}=e;return JSON.stringify({platform:n,target:t.target,device:t.device,udid:t.udid,serial:t.serial,iosSimulatorSetPath:r,androidSerialAllowlist:i?Array.from(i).sort():void 0})}({flags:e,normalizedPlatform:t,iosSimulatorSetPath:n,androidSerialAllowlist:r}),a={platform:t,target:e.target,cacheHit:!1};return await N("resolve_target_device",async()=>{let o=function(e){let t=n1.getStore(),n=t?.get(e);if(n)return{...n}}(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 F("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await rt({...s,iosSimulatorSetPath:n,androidSerialAllowlist:r?Array.from(r).sort():void 0});if(l)return rn(s)?rr(i,await n3(l,s,{simulatorSetPath:n})):rr(i,await nQ(l,s,{simulatorSetPath:n}));let c=await n0({...s,iosSimulatorSetPath:n,androidSerialAllowlist:r?Array.from(r).sort():void 0});return rn(s)?rr(i,await n3(c,s,{simulatorSetPath:n})):rr(i,await nQ(c,s,{simulatorSetPath:n}))},a)}async function n6(e){return n1.getStore()?await e():await n1.run(new Map,e)}async function n9(e,t){return e?await n2.run(e,t):await t()}async function n7(e,t){return await n9(e,async()=>await n6(t))}async function re(e){return await rt(e)??await n0(e)}async function rt(e){let t=n2.getStore();if(!t)return null;let n=await t(e);return null==n?null:n.map(e=>({...e}))}function rn(e){return!!e.platform&&"android"!==e.platform&&"linux"!==e.platform}function rr(e,t){return n1.getStore()?.set(e,{...t}),t}let ri=["platform","target","device","udid","serial"],ra=[...ri,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function ro(e){return"string"==typeof e&&e.trim().length>0}function rs(e,t){return!!e&&t.some(t=>ro(e[t]))}let rl={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},rc=function(e){let t=new Map,n=new Map;for(let r of e){if(t.has(r.command))throw Error(`Duplicate daemon command descriptor: ${r.command}`);if(t.set(r.command,r),"generic"!==r.route){let e=n.get(r.route)??[];e.push(r.command),n.set(r.route,e)}}return{descriptorsByCommand:t,handlerCommandsByRoute:n}}([...rp("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},eI.leaseAllocate,eI.leaseHeartbeat,eI.leaseRelease),ru(eI.sessionList,"session",{sessionKind:"inventory",...rl}),ru(e_.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...rl}),ru(e_.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...rp("session",{sessionKind:"state"},e_.boot,e_.appState),...rp("session",{sessionKind:"observability"},e_.perf,e_.logs,e_.network),...rp("session",{sessionKind:"replay",skipSessionlessProviderDevice:function(e){return e.command===e_.test&&("number"==typeof e.flags?.shardAll||"number"==typeof e.flags?.shardSplit)}},e_.replay,e_.test),ru(eI.runtime,"session"),ru(e_.clipboard,"session",{replayScopedAction:!0}),ru(e_.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...rp("session",{},e_.install,e_.reinstall,eI.installSource),ru(eI.releaseMaterializedPaths,"session",rl),...rp("session",{},e_.push,e_.triggerAppEvent),ru(e_.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...rp("session",{},e_.prepare,e_.batch),ru(e_.close,"session",{allowInvalidRecording:!0}),...rp("snapshot",{replayScopedAction:!0},e_.snapshot,e_.diff,e_.wait,e_.alert,e_.settings),ru(e_.reactNative,"reactNative",{replayScopedAction:!0}),ru(e_.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),ru(e_.trace,"recordTrace"),ru(e_.find,"find",{replayScopedAction:!0}),...rp("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},e_.click,e_.fill,e_.longPress,e_.press,e_.type),...rp("interaction",{replayScopedAction:!0},e_.get,e_.is),...rp("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},e_.back,e_.gesture,e_.home,e_.rotate,e_.scroll,e_.swipe,"pinch"),ru(e_.focus,"generic",{androidBlockingDialogGuard:!0}),ru(e_.screenshot,"generic",{replayScopedAction:!0}),...rp("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function rd(e){return rf(e)?.sessionKind}function ru(e,t,n={}){return{command:e,route:t,...n}}function rp(e,t,...n){return n.map(n=>ru(n,e,t))}function rf(e){return rc.descriptorsByCommand.get(e)}let rm=[{resolverKey:"androidAdbProvider",resolve(e,t){let n=e.androidAdbProvider;if(!n||"android"!==t.device.platform)return{};let r=n(t),i="function"==typeof r?r:r?.exec;return{androidAdb:{provider:r,executor:i,serial:t.device.id}}},async appendWrapper(e,t){if(!e.androidAdb?.provider)return;let{withAndroidAdbProvider:n}=await import("./9639.js");ry(t,e.androidAdb,(t,r)=>n(t,{serial:e.androidAdb?.serial??""},r))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let n=e.appleRunnerProvider;return n&&nX(t.device.platform)?{appleRunner:{provider:n(t),deviceId:t.device.id,requestId:t.req.meta?.requestId}}:{}},async appendWrapper(e,t){if(!e.appleRunner?.provider)return;let{withAppleRunnerProvider:n}=await Promise.resolve(tS);ry(t,e.appleRunner,(t,r)=>n(t,{deviceId:e.appleRunner?.deviceId??"",requestId:e.appleRunner?.requestId},r))}},{resolverKey:"appleToolProvider",resolve(e,t){let n=e.appleToolProvider;return n&&nX(t.device.platform)?{appleTool:{provider:n(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:n}=await Promise.resolve(tI);ry(t,e.appleTool,n)}},{resolverKey:"linuxToolProvider",resolve(e,t){let n=e.linuxToolProvider;return n&&"linux"===t.device.platform?{linuxTool:{provider:n(t)}}:{}},async appendWrapper(e,t){if(!e.linuxTool?.provider)return;let{withLinuxToolProvider:n}=await Promise.resolve(tA);ry(t,e.linuxTool,n)}},{resolverKey:"appLogProvider",resolve(e,t){let n=e.appLogProvider;return n?{appLog:{provider:n(t)}}:{}},async appendWrapper(e,t){if(!e.appLog?.provider)return;let{withAppLogProvider:n}=await Promise.resolve(tg);ry(t,e.appLog,n)}},{resolverKey:"recordingProvider",resolve(e,t){let n=e.recordingProvider;return n?{recording:{provider:n(t)}}:{}},async appendWrapper(e,t){if(!e.recording?.provider)return;let{withRecordingProvider:n}=await import("./recording-provider.js");ry(t,e.recording,n)}}];async function rh(e,t){let n=await rw(e),r={androidAdbExecutor:n.androidAdb?.executor},i=await rv(n);return await rS(i,async()=>await t(r))}async function rw(e){var t,n,r;if(t=e.providers,!rm.some(e=>!!t[e.resolverKey]))return{};let i=await rg(e.req,e.existingSession);if(!i)return{};let a=(n=e,r=i,{req:n.req,device:r,session:n.existingSession});return rm.reduce((t,n)=>({...t,...n.resolve(e.providers,a)}),{})}async function rg(e,t){switch(function(e,t){var n;let r,i;if(t.hasExistingSession)return rf(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(n=e,"function"==typeof(i=rf(n.command)?.skipSessionlessProviderDevice)&&i(n))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(r=rf(e.command)?.allowSessionlessDefaultDevice)&&r(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:rs(e.flags,ri)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await n8(e.flags??{});case"skip":return}}async function rv(e){let t=[];for(let n of rm)await n.appendWrapper(e,t);return t}function ry(e,t,n){let r=t?.provider;r&&e.push(async e=>await n(r,e))}async function rS(e,t){let n=t;for(let t of[...e].reverse()){let e=n;n=async()=>await t(e)}return await n()}async function r_(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:n}=await import("./apple.js");return n(e,t)}default:throw new F("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let rI=/^[A-Za-z0-9_.:-]{1,64}$/,rb="--launch-console is supported only for iOS simulator app launches",rA="--launch-console requires a direct app launch and cannot be used with URL opens";function rx(e){return e?.clickButton??"primary"}function rN(e){return"primary"===e.button?null:"click"!==e.commandLabel?new F("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new F("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new F("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 F("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function rM(e){return"primary"===e?{}:{button:e}}let rE=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];async function rD(e,t,n){for(let r=0;r<e;r+=1)await n(r),r<e-1&&t>0&&await ez(t)}async function rk(e,t){let{x:n,y:r}=r$(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(n,r,i),{x:n,y:r,durationMs:i,...eX(`Long pressed (${n}, ${r})`)}}async function rP(e,t){let{x:n,y:r}=r$(t,"focus requires x y");return await e.focus(n,r),{x:n,y:r,...eX(`Focused (${n}, ${r})`)}}async function rC(e,t,n){let r=eA(t[0]);if(r)throw new F("INVALID_ARGS",`type does not accept a target ref like "${r}"`,{hint:`Use fill ${r} "text" to target that field, or press ${r} then type "text" to append.`});let i=t.join(" ");if(!i)throw new F("INVALID_ARGS","type requires text");let a=ej(n?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...eX(r4("Typed",i))}}async function rR(e,t,n){if(n?.directElementSelector)return await rT(e,n.directElementSelector,t,n);let r=Number(t[0]),i=Number(t[1]),a=t.slice(2).join(" ");if(Number.isNaN(r)||Number.isNaN(i)||!a)throw new F("INVALID_ARGS","fill requires x y text");let o=ej(n?.delayMs??0,"delay-ms",0,1e4);return await e.fill(r,i,a,o),{x:r,y:i,text:a,delayMs:o,...eX(r4("Filled",a))}}async function rT(e,t,n,r){if(!e.fillElementSelector)throw new F("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=n.join(" ");if(!i)throw new F("INVALID_ARGS","fill requires text");let a=ej(r.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...eX(r4("Filled",i))}}async function rO(e,t,n,r){var i,a,o,s;if(r?.directElementSelector&&"ios"===e.platform)return await rL(t,r.directElementSelector);let{x:l,y:c}=r$(n,"press requires x y");if("macos"===e.platform&&r?.surface&&"app"!==r.surface)return await rF(l,c,r);let d=rx(r);if("primary"!==d)return await rU(e,l,c,d,r);let u=(s=r,{count:rq(s?.count,1,"count",1,200),intervalMs:rq(s?.intervalMs,0,"interval-ms",0,1e4),holdMs:rq(s?.holdMs,0,"hold-ms",0,1e4),jitterPx:rq(s?.jitterPx,0,"jitter-px",0,100),doubleTap:!!s?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:n}){if(e&&t>0)throw new F("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&n>0)throw new F("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(u),i=u.count,a=u.holdMs,o=u.jitterPx,nX(e.platform)&&i>1&&0===a&&0===o)?await rj(e,l,c,u,r):await rV(t,l,c,u)}async function rL(e,t){if(!e.tapElementSelector)throw new F("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let n=await e.tapElementSelector(t);return{selector:t.raw,...n??{},...eX(`Tapped ${t.raw}`)}}function r$(e,t,n){let r=Number(e[0]),i=Number(e[1]);if(Number.isNaN(r)||Number.isNaN(i))throw new F("INVALID_ARGS",t,n);return{x:r,y:i}}async function rF(e,t,n){let r=rx(n);if("primary"!==r)throw new F("UNSUPPORTED_OPERATION",`${r} click is not supported on macOS ${n.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(tv);return await i(e,t,{bundleId:n.appBundleId,surface:n.surface}),{x:e,y:t,...eX(r2({x:e,y:t}))}}async function rU(e,t,n,r,i){if(function(e,t,n){let r=rN({commandLabel:"click",platform:e.platform,button:t,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap});if(r)throw r}(e,r,i),"linux"===e.platform)return await rG(t,n,r);let{runIosRunnerCommand:a}=await Promise.resolve(ty);return await a(e,{command:"mouseClick",x:t,y:n,button:r,appBundleId:i?.appBundleId},rB(i)),{x:t,y:n,button:r,...eX(r2({x:t,y:n,button:r}))}}async function rG(e,t,n){if("secondary"===n){let{rightClickLinux:n}=await import("./input-actions~1.js");await n(e,t)}else{let{middleClickLinux:n}=await import("./input-actions~1.js");await n(e,t)}return{x:e,y:t,button:n,...eX(r2({x:e,y:t,button:n}))}}function rq(e,t,n,r,i){return ej(void 0===e?t:e,n,r,i)}async function rj(e,t,n,r,i){let{runIosRunnerCommand:a}=await Promise.resolve(ty),o=await a(e,{command:"tapSeries",x:t,y:n,count:r.count,intervalMs:r.intervalMs,doubleTap:r.doubleTap,appBundleId:i?.appBundleId},rB(i));return{x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,timingMode:"runner-series",...o,...eX(r2({x:t,y:n}))}}async function rV(e,t,n,r){let i;return await rD(r.count,r.intervalMs,async a=>{let[o,s]=function(e,t){if(t<=0)return[0,0];let[n,r]=rE[e%rE.length];return[n*t,r*t]}(a,r.jitterPx),l=t+o,c=n+s;if(r.doubleTap){i??=await e.doubleTap(l,c)??void 0;return}r.holdMs>0?i??=await e.longPress(l,c,r.holdMs)??void 0:i??=await e.tap(l,c)??void 0}),eZ({x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,...i},r2({x:t,y:n}))}function rB(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId}}async function rH(e,t,n,r){let i=Number(n[0]),a=Number(n[1]),o=Number(n[2]),s=Number(n[3]);if([i,a,o,s].some(Number.isNaN))throw new F("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=n[4]?Number(n[4]):250;return await rW({device:e,interactor:t,context:r,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function rK(e,t,n,r){let i=eW(n[0]),a=n[1]?Number(n[1]):300,o=eV((await t.snapshot({appBundleId:r?.appBundleId,compact:!0})).nodes??[]);if(!o)throw new F("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=ex(i,o,{platform:e.platform});return await rW({device:e,interactor:t,context:r,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function rW(e){let{device:t,interactor:n,context:r,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:c}=e,d=ej(l,"durationMs",16,1e4),u=ej(r?.count??1,"count",1,200),p=ej(r?.pauseMs??0,"pause-ms",0,1e4),f=r?.pattern??"one-way";if("one-way"!==f&&"ping-pong"!==f)throw new F("INVALID_ARGS",`Invalid pattern: ${f}`);if(nX(t.platform)&&u>1){let{runIosRunnerCommand:e}=await Promise.resolve(ty),n=await e(t,{command:"dragSeries",x:i,y:a,x2:o,y2:s,durationMs:d,count:u,pauseMs:p,pattern:f,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.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,...n,...eX(r3(u,f))}}return await rD(u,p,async e=>{"ping-pong"===f&&e%2==1?await n.swipe(o,s,i,a,d):await n.swipe(i,a,o,s,d)}),eZ({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}`:r3(u,f))}async function rz(e,t){let n=Number(t[0]),r=Number(t[1]),i=Number(t[2]),a=Number(t[3]);if([n,r,i,a].some(e=>!Number.isFinite(e)))throw new F("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=ej(t[4]?Number(t[4]):500,"durationMs",16,1e4),s=n+i,l=r+a,c=await e.pan(n,r,s,l,o);return{x:n,y:r,dx:i,dy:a,x2:s,y2:l,durationMs:o,...c??{},...eX(`Panned (${n}, ${r}) by (${i}, ${a})`)}}async function rJ(e,t){let n=function(e,t){if("up"===e||"down"===e||"left"===e||"right"===e)return e;throw new F("INVALID_ARGS",`${t} must be up, down, left, or right`)}(t[0],"fling direction"),r=Number(t[1]),i=Number(t[2]);if(![r,i].every(Number.isFinite))throw new F("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new F("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=ej(t[4]?Number(t[4]):50,"durationMs",16,1e3),{x2:s,y2:l}=function(e,t,n,r){switch(n){case"up":return{x2:e,y2:t-r};case"down":return{x2:e,y2:t+r};case"left":return{x2:e-r,y2:t};case"right":return{x2:e+r,y2:t}}}(r,i,n,a);return await e.fling(r,i,s,l,o),{direction:n,x:r,y:i,x2:s,y2:l,distance:a,durationMs:o,...eX(`Flung ${n}`)}}async function rX(e,t,n){var r;let i=t[0],a=t[1]?Number(t[1]):void 0,o=n?.pixels;if(!i)throw new F("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new F("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==o)throw new F("INVALID_ARGS","scroll accepts either a relative amount or --pixels, not both");let s="bottom"===(r=i)?{direction:"down",edge:"bottom"}:"top"===r?{direction:"up",edge:"top"}:{direction:eM(r)},l={},c=0;if(s.edge){let t=s.edge,r=await eq({edge:t,captureState:async r=>await rZ(e,n,t,r),scroll:async()=>await e.scroll(s.direction,{amount:a,pixels:o})});l=r.result??{},c=r.passes}else l=await e.scroll(s.direction,{amount:a,pixels:o}),c=1;return eZ({direction:s.direction,...s.edge?{edge:s.edge,passes:c}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},eP(s.direction,s.edge,c,a,o))}async function rZ(e,t,n,r){if("function"!=typeof e.snapshot)throw new F("UNSUPPORTED_OPERATION",`scroll ${n} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await eL({edge:n,scope:r,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,compact:!0,scope:e})).nodes??[]})}async function rY(e,t,n,r){if("tv"===e.target)throw new F("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&r?.surface&&"app"!==r.surface)throw new F("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(n[0]),a=n[1]?Number(n[1]):void 0,o=n[2]?Number(n[2]):void 0;if(Number.isNaN(i)||i<=0)throw new F("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...eX(`Pinched to scale ${i}`)}}async function rQ(e,t,n){if("tv"===e.target)throw new F("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new F("UNSUPPORTED_OPERATION","gesture rotate is not supported on macOS; XCTest rotation gestures are available only for iOS app sessions.");let{degrees:r,x:i,y:a,velocity:o}=function(e){let t=Number(e[0]);if(!Number.isFinite(t))throw new F("INVALID_ARGS","gesture rotate requires degrees [x] [y] [velocity]");let n=function(e,t){if(void 0===e&&void 0===t)return{};if(void 0===e||void 0===t)throw new F("INVALID_ARGS","gesture rotate center requires both x and y");let n=Number(e),r=Number(t);if(!Number.isFinite(n)||!Number.isFinite(r))throw new F("INVALID_ARGS","gesture rotate center requires finite x and y");return{x:n,y:r}}(e[1],e[2]),r=Number(e[3]??(t>=0?1:-1));if(!Number.isFinite(r)||0===r)throw new F("INVALID_ARGS","gesture rotate velocity must be a non-zero number");return{degrees:t,...n,velocity:Math.abs(r)*(t>=0?1:-1)}}(n),s=await t.rotateGesture(r,i,a,o);return{degrees:r,...void 0!==i&&void 0!==a?{x:i,y:a}:{},velocity:o,...s,...eX(`Rotated gesture ${r} degrees`)}}async function r0(e,t,n){if("tv"===e.target)throw new F("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let r="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!r)throw new F("UNSUPPORTED_OPERATION","gesture transform is currently supported on Android and iOS simulators");let i=function(e){let t=Number(e[0]),n=Number(e[1]),r=Number(e[2]),i=Number(e[3]),a=Number(e[4]),o=Number(e[5]);if(![t,n,r,i,a,o].every(Number.isFinite))throw new F("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new F("INVALID_ARGS","gesture transform scale must be > 0");return{x:t,y:n,dx:r,dy:i,scale:a,degrees:o,durationMs:void 0===e[6]?void 0:ej(Number(e[6]),"durationMs",16,1e4)}}(n),a=await t.transformGesture(i);return{...i,...a,...eX(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function r1(e,t,n){let{x:r,y:i}=r$(t,"read requires x y");if("android"===e.platform){let{readAndroidTextAtPoint:t}=await import("./input-actions.js");return{action:"read",text:await t(e,r,i)??""}}if("linux"===e.platform){let{readLinuxTextAtPoint:e}=await Promise.resolve(tb);return{action:"read",text:await e(r,i,n?.surface)}}if("macos"===e.platform&&n?.surface&&"app"!==n.surface){let{runMacOsReadTextAction:e}=await Promise.resolve(tv);return{action:"read",text:(await e(r,i,{bundleId:n.appBundleId,surface:n.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(ty),o=await a(e,{command:"readText",x:r,y:i,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function r2(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function r3(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function r4(e,t){return`${e} ${Array.from(t).length} chars`}function r5(e,t){let n,r=t?.subject??"Payload",i=e.trim();if(!i)throw new F("INVALID_ARGS",`${r} cannot be empty`);let o=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!a.statSync(o).isFile())throw new F("INVALID_ARGS",`${r} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof F)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new F("INVALID_ARGS",`${r} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new F("COMMAND_FAILED",`Unable to read ${r} file: ${o}`,{cause:String(t)})}if((n=i.trim()).startsWith("{")&&n.endsWith("}")||n.startsWith("[")&&n.endsWith("]"))return{kind:"inline",text:i};throw new F("INVALID_ARGS",`${r} file not found: ${o}`)}async function r8(e){let t=r5(e,{subject:"Push payload"}),n="inline"===t.kind?t.text:await r6(t.path);try{let e=JSON.parse(n);if(!e||"object"!=typeof e||Array.isArray(e))throw new F("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof F)throw t;throw new F("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function r6(e){try{return await s.readFile(e,"utf8")}catch(n){let t=n.code;if("ENOENT"===t)throw new F("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new F("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new F("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new F("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(n)})}}async function r9(e,t,n,r,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},o=await r_(e,a);return E({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await N("platform_command",async()=>await r7(e,o,t,n,r,i,a),{command:t,platform:e.platform})}async function r7(e,t,n,r,i,a,o){switch(n){case"open":return await ie(e,t,r,a);case"close":{let e=r[0];if(!e)return{closed:"session",...eX("Closed session")};return await t.close(e),{app:e,...eX(`Closed: ${e}`)}}case"press":return await rO(e,t,r,a);case"swipe":return await rH(e,t,r,a);case"swipe-preset":return await rK(e,t,r,a);case"pan":return await rz(t,r);case"fling":return await rJ(t,r);case"longpress":return await rk(t,r);case"focus":return await rP(t,r);case"type":return await rC(t,r,a);case"fill":return await rR(t,r,a);case"scroll":return await rX(t,r,a);case"pinch":return await rY(e,t,r,a);case"rotate-gesture":return await rQ(e,t,r);case"transform-gesture":return await r0(e,t,r);case"trigger-app-event":return await it(e,t,r,a);case"screenshot":return await ir(t,r,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...eX("Back")};case"home":return await t.home(),{action:"home",...eX("Home")};case"rotate":{let e=eY(r[0]);return await t.rotate(e),{action:"rotate",orientation:e,...eX(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...eX("Opened app switcher")};case"clipboard":return await ii(t,r);case"keyboard":return await ia(e,r,a,o);case"settings":return await il(e,t,r,a);case"push":return await ic(e,r,a);case"snapshot":return await id(t,a);case"read":return await r1(e,r,a);default:throw new F("INVALID_ARGS",`Unknown command: ${n}`)}}async function ie(e,t,n,r){let i=n[0],a=n[1],o=r?.launchConsole,s=r?.launchArgs;if(n.length>2)throw new F("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new F("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new F("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...eX("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new F("UNSUPPORTED_OPERATION",rb);if("linux"===e.platform&&s&&s.length>0)throw new F("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(ey(i))throw new F("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!ey(a))throw new F("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new F("INVALID_ARGS",rA);return await t.open(i,{activity:r?.activity,appBundleId:r?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...eX(`Opened: ${i}`)}}if(o&&ey(i))throw new F("INVALID_ARGS",rA);if(r?.clearAppState){if(ey(i))throw new F("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:r?.activity,appBundleId:r?.appBundleId,launchConsole:o,launchArgs:s}),{app:i,...o?{launchConsole:o}:{},...eX(`Opened: ${i}`)}}async function it(e,t,n,r){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),n=e[1]?.trim();if(!t)throw new F("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!rI.test(t))throw new F("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 F("INVALID_ARGS","trigger-app-event accepts at most two arguments: <event> [payloadJson]");let r=function(e,t){if(e)try{let n=JSON.parse(e);if(!n||"object"!=typeof n||Array.isArray(n))throw new F("INVALID_ARGS",`trigger-app-event payload for "${t}" must be a JSON object`);let r=JSON.stringify(n);if(Buffer.byteLength(r,"utf8")>8192)throw new F("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return n}catch(t){if(t instanceof F)throw t;throw new F("INVALID_ARGS",`Invalid trigger-app-event payload JSON: ${e}`)}}(n,t);return{eventName:t,payload:r}}(n),o=function(e,t,n){var r;let i,a=(i=("ios"===(r=e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:"macos"===r?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE,i?.trim()||void 0);if(!a)throw new F("UNSUPPORTED_OPERATION",`No app event URL template configured for ${e}.`,{hint:`Set AGENT_DEVICE_${e.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=n?JSON.stringify(n):"",s=a.replaceAll("{event}",encodeURIComponent(t)).replaceAll("{payload}",encodeURIComponent(o)).replaceAll("{platform}",encodeURIComponent(e));if(s.length>4096)throw new F("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:r?.appBundleId}),{event:i,eventUrl:o,transport:"deep-link",...eX(`Triggered app event: ${i}`)}}async function ir(e,t,n,r){let a=t[0]??n??`./screenshot-${Date.now()}.png`;await s.mkdir(i.dirname(a),{recursive:!0});let o=S(r);return await e.screenshot(a,{appBundleId:r?.appBundleId,fullscreen:o.fullscreen,stabilize:o.stabilize,surface:r?.surface}),{path:a,...eX(`Saved screenshot: ${a}`)}}async function ii(e,t){let n=(t[0]??"").toLowerCase();if("read"!==n&&"write"!==n)throw new F("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===n){if(1!==t.length)throw new F("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:n,text:await e.readClipboard()}}if(t.length<2)throw new F("INVALID_ARGS",'clipboard write requires text (use "" to clear clipboard)');let r=t.slice(1).join(" ");return await e.writeClipboard(r),{action:n,textLength:Array.from(r).length,...eX("Clipboard updated")}}async function ia(e,t,n,r){let i=(t[0]??"status").toLowerCase();if(!eE(i))throw new F("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new F("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await io(e,i);if("ios"===e.platform)return await is(e,i,n,r);throw new F("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function io(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...eX("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./8133.js"),n=await t(e);return{platform:"android",action:"dismiss",attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}let{getAndroidKeyboardState:n}=await import("./8133.js"),r=await n(e);return{platform:"android",action:"status",visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}async function is(e,t,n,r){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new F("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(ty),i=await t(e,{command:"keyboardReturn",appBundleId:n?.appBundleId},r);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...eX("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(ty),a=await i(e,{command:"keyboardDismiss",appBundleId:n?.appBundleId},r);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...eX(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function il(e,t,n,r){let[i,a,o,s]=n;if(!i||!a&&"clear-app-state"!==i)throw new F("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let n=("clear"===a?o:a)??r?.appBundleId;if(!n)throw new F("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");E({level:"debug",phase:"settings_apply",data:{setting:i,state:"clear",appBundleId:n,platform:e.platform}});let s=await t.setSetting(i,"clear",n);return s&&"object"==typeof s?eZ({setting:i,state:"clear",...s},iu(s)??`Cleared user data for ${n}`):{setting:i,state:"clear",...eX(`Cleared user data for ${n}`)}}if(!a)throw new F("INVALID_ARGS","settings requires setting state");let l="location"===i&&"set"===a,c=("permission"===i||l?n[4]:n[2])??r?.appBundleId,d="permission"===i?{permissionTarget:o,permissionMode:s}:l?{latitude:eJ(o,"latitude"),longitude:eJ(s,"longitude")}:void 0;E({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?eZ({setting:i,state:a,...u},iu(u)??`Updated setting: ${i}`):{setting:i,state:a,...eX(`Updated setting: ${i}`)}}async function ic(e,t,n){let r=t[0]?.trim(),i=t[1]?.trim();if(!r||!i)throw new F("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await r8(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,r,a),{platform:"ios",bundleId:r,...eX(`Pushed notification to ${r}`)}}let{pushAndroidNotification:o}=await import("./notifications.js"),s=await o(e,r,a);return{platform:"android",package:r,action:s.action,extrasCount:s.extrasCount,...eX(`Pushed notification to ${r}`)}}async function id(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 iu(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let ip=e=>"macos"!==e.platform,im=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,ih=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,iw={device:!0},ig={},iv={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},iy={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:ip},iS={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,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:ig,supports:e=>"android"===e.platform||im(e),unsupportedHint:ih},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:e=>"android"===e.platform||im(e),unsupportedHint:ih},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:e=>"android"===e.platform||im(e),unsupportedHint:ih},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:ip},open:iv,close:iv,reinstall:iy,install:iy,"install-from-source":iy,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:ip},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw,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:ig,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:iw},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},snapshot:iv,diff:iv,screenshot:iv,wait:iv,get:iv,find:iv,is:iv,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw,supports:ip},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:ip},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,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:iw},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,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:ig},type:iv};function i_(e,t){let n=iS[e];if(!n)return!0;let r=nX(t.platform)?n.apple:"linux"===t.platform?n.linux:n.android;return!!r&&(!n.supports||!!n.supports(t))&&!0===r[t.kind??"unknown"]}function iI(e,t=e=>e){let n=new h;return{resolve:r=>r?t(r):n.getStore()??e,run:async(e,r)=>e?await n.run(t(e),r):await r(),hasScope:()=>!!n.getStore()}}function ib(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function iA(e,t){return{openBundle:async(t,n)=>{var r,i;let a;await e("open",(r=t,i=n,a=["-b",r],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 F("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 n=await e("pbcopy",[],{allowFailure:!0,stdin:t});if(0!==n.exitCode)throw new F("COMMAND_FAILED","Failed to write macOS clipboard",{stdout:n.stdout,stderr:n.stderr,exitCode:n.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 F("COMMAND_FAILED","Failed to read macOS appearance",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let n=t.stdout.trim().toLowerCase();if("true"===n)return!0;if("false"===n)return!1;throw new F("COMMAND_FAILED",`Unable to determine current macOS appearance from osascript output: ${t.stdout.trim()}`)},setDarkMode:async t=>{let n=`tell application "System Events" to tell appearance preferences to set dark mode to ${t?"true":"false"}`,r=await e("osascript",["-e",n],{allowFailure:!0});if(0!==r.exitCode)throw new F("COMMAND_FAILED","Failed to set macOS appearance",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode})},listApps:async n=>await ix(e,t,n)}}async function ix(e,t,n){let r=["/Applications","/System/Applications",i.join(u.homedir(),"Applications")],a=new Set;for(let t of r){let n=await s.stat(t).catch(()=>null);if(!n?.isDirectory())continue;let r=await e("find",[t,"-maxdepth","4","-type","d","-name","*.app"],{allowFailure:!0});if(0===r.exitCode)for(let e of r.stdout.split("\n")){let t=e.trim();t&&a.add(t)}}return ib((await Promise.all(Array.from(a).map(async e=>{let n=await iN(e,t).catch(()=>({})),r=n.bundleId;return r?{bundleId:r,name:n.appName??i.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),n)}async function iN(e,t){for(let n of[i.join(e,"Contents","Info.plist"),i.join(e,"Info.plist")]){let e=await t(n),r=iM(e,"CFBundleIdentifier"),i=iM(e,"CFBundleDisplayName"),a=iM(e,"CFBundleName");if(r||i||a)return{bundleId:r,appName:i??a}}return{}}function iM(e,t){let n=e?.[t];return"string"==typeof n&&n.trim()?n.trim():void 0}let iE={runCommand:q,simctl:{run:async(e,t)=>await q("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await q("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await i$(q,e)},macosHost:iA(q,async e=>await i$(q,e)),whichCommand:B},iD=iI(iE,function(e){return"function"==typeof e?ik({runCommand:e}):ik(e)});function ik(e={}){let t={...iE,...e},n=e.plist??{readJson:async e=>await i$(t.runCommand,e)};return{...t,simctl:e.simctl??{run:async(e,n)=>await t.runCommand("xcrun",["simctl",...e],n)},devicectl:e.devicectl??{run:async(e,n)=>await t.runCommand("xcrun",["devicectl",...e],n)},plist:n,macosHost:e.macosHost??iA(t.runCommand,async e=>await n.readJson(e))}}function iP(e){return iD.resolve(e)}async function iC(e,t){return await iD.run(e,t)}function iR(){return iD.hasScope()}async function iT(e,t,n){return await iP().runCommand(e,t,n)}async function iO(e,t){let n=iP(),[r,...i]=e;return"simctl"===r?await (n.simctl?.run(i,t)??n.runCommand("xcrun",e,t)):"devicectl"===r?await (n.devicectl?.run(i,t)??n.runCommand("xcrun",e,t)):await iT("xcrun",e,t)}async function iL(e){return await iP().plist?.readJson(e)??null}async function i$(e,t){try{let n=await e("plutil",["-convert","json","-o","-",t],{allowFailure:!0});if(0!==n.exitCode||!n.stdout.trim())return null;return JSON.parse(n.stdout)}catch{return null}}let iF="agent-device-macos-helper",iU="AGENT_DEVICE_MACOS_HELPER_BIN",iG=i.join(u.homedir(),".agent-device","macos-helper","current"),iq=i.join(iG,"manifest.json"),ij=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function iV(e){let t=e.trim();if(!ij.test(t))throw new F("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function iB(e,t){t.bundleId&&e.push("--bundle-id",iV(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iH(){return function(e){let t=i.dirname(e);for(;;){let e=i.join(t,"macos-helper");if(o(i.join(e,"Package.swift")))return e;let n=i.dirname(t);if(n===t)break;t=n}throw new F("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(c(import.meta.url))}async function iK(e){let t=await s.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=i.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await iK(n):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[n]:[]}))).flat().sort()}async function iW(e){let t=await iK(e),n=r("sha256");for(let r of t)n.update(i.relative(e,r)),n.update("\0"),n.update(await s.readFile(r)),n.update("\0");let a=await iT("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return n.update("swift-version"),n.update("\0"),n.update(a.stdout||a.stderr||`exit:${a.exitCode}`),n.update("\0"),n.digest("hex")}async function iz(){try{let e=JSON.parse(await s.readFile(iq,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function iJ(){let e=await V(process.env[iU],iU);if(e)return e;let t=iH(),n=await iW(t),r=i.join(iG,iF);try{if(await iz()===n)return await s.access(r),r}catch{}let a=i.join(iH(),".build","release",iF);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await iT("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await s.mkdir(iG,{recursive:!0});let o=`${r}.tmp`;return await s.copyFile(a,o),await s.rename(o,r),await s.chmod(r,493),await s.writeFile(iq,`${JSON.stringify({fingerprint:n},null,2)}
5
- `,"utf8"),r}async function iX(){let e=process.env[iU]?.trim();if(e){let t=await V(e,iU);if(t)return t}if(iR())return iF;if("darwin"!==process.platform)throw new F("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await iJ()}async function iZ(e){let t={allowFailure:!0,timeoutMs:3e4},n=iP().macosHelper,r=n?iF:await iX(),i=n?await n.run(e,t):await iT(r,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 F("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:r,args:e,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,...o&&!o.ok?o.error?.details:{}})}async function iY(){return await iZ(["app","frontmost"])}async function iQ(e){return await iZ(["app","quit","--bundle-id",iV(e)])}async function i0(e,t){return await iZ(["permission",e,t])}async function i1(e,t={}){let n=["alert",e];return iB(n,t),await iZ(n)}async function i2(e,t={}){let n=["snapshot","--surface",e];return iB(n,t),await iZ(n)}async function i3(e,t,n={}){let r=["read","--x",String(e),"--y",String(t)];return iB(r,n),await iZ(r)}async function i4(e,t,n={}){let r=["press","--x",String(e),"--y",String(t)];return iB(r,n),await iZ(r)}async function i5(e,t={}){let n=["screenshot","--out",e];return iB(n,t),t.fullscreen&&n.push("--fullscreen"),await iZ(n)}let i8={"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"},i6={runCommand:q,whichCommand:B,desktop:an(q,B),clipboard:ar(q,B),screenshot:ai(q,B)},i9=iI(i6,function(e={}){let t={...i6,...e};return{...t,desktop:e.desktop??an(t.runCommand,t.whichCommand),clipboard:e.clipboard??ar(t.runCommand,t.whichCommand),screenshot:e.screenshot??ai(t.runCommand,t.whichCommand)}});function i7(e){return i9.resolve(e)}async function ae(e,t){return await i9.run(e,t)}async function at(e,t,n){return await i7().runCommand(e,t,n)}function an(e,t){return{async openTarget(n){if(n.includes("://")||n.startsWith("/"))return void await e("xdg-open",[n]);if(await t(n)){e(n,[],{allowFailure:!0}).catch(e=>{E({level:"warn",phase:"linux_app_launch",data:{app:n,error:String(e)}})}),await ez(500);return}await e("xdg-open",[n],{allowFailure:!0})},async closeApp(n){await t("wmctrl")?await e("wmctrl",["-c",n],{allowFailure:!0}):await e("pkill",["-x",n],{allowFailure:!0})}}}function ar(e,t){return{async readText(){let n=as[await ad(t,aa)];return(await e(n.cmd,n.args,n.options)).stdout},async writeText(n){let r=al[await ad(t,aa)](n);await e(r.cmd,r.args,r.options)}}}function ai(e,t){return{async capture(n){let r=ac[await ad(t,ao)](n);await e(r.cmd,r.args,r.options)}}}let aa={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."},ao={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."},as={"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}}},al={"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}})},ac={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 ad(e,t){let n=process.env.WAYLAND_DISPLAY||"wayland"===process.env.XDG_SESSION_TYPE?"wayland":"x11";for(let r of t[n])if(await e(r.command))return r.tool;throw new F("TOOL_MISSING","wayland"===n?t.waylandError:t.x11Error)}let au="atspi-dump.py",ap=null;async function af(e,t={}){let n,r=i7().accessibility;if(r)return await r.captureTree(e,t);if("linux"!==process.platform)throw new F("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await i7().whichCommand("python3"))throw new F("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let o=t.maxNodes??1500,s=t.maxDepth??12,l=t.maxApps??24,d=[function(){if(ap)return ap;let e=i.dirname(c(import.meta.url));for(let t=0;t<5;t++){let n=i.join(e,"src","platforms","linux",au);if(a.existsSync(n))return ap=n,n;if(0===t){let t=i.join(e,au);if(a.existsSync(t))return ap=t,t}e=i.dirname(e)}throw new F("TOOL_MISSING",`Cannot find ${au}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(l)],u=await at("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 F("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new F("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{n=JSON.parse(u.stdout)}catch{throw new F("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(n.error)throw new F("COMMAND_FAILED",`AT-SPI2: ${n.error}`);return{nodes:(n.nodes??[]).map(e=>{let t,n;return{index:e.index,type:(n=i8[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:n.truncated,surface:e}}async function am(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&E({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),n=await af(t);return{nodes:n.nodes,truncated:n.truncated}}async function ah(e,t,n){let{nodes:r}=await am(n);for(let n of r.filter(n=>{let r=n.rect;return!!r&&e>=r.x&&t>=r.y&&e<=r.x+r.width&&t<=r.y+r.height}).sort((e,t)=>{let n=e.depth??0,r=t.depth??0;return n!==r?r-n:aw(e.rect)-aw(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""}(n);if(e.trim())return e}return""}function aw(e){return(e?.width??0)*(e?.height??0)}let ag=[250,400,600];function av(e,t,n=e.snapshot){if("android"!==e.device.platform)return;let r=function(e,t){if(t?.comparisonSafe===!0)return t;let n=e.lastComparisonSafeSnapshot;return n&&!0===n.comparisonSafe&&Date.now()-n.createdAt<=5e3?n:t}(e,n),i=r?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(r??n)?.nodes.length??0,baselineSignatures:i?aI(r?.nodes??[]):void 0,routeComparable:i}}function ay(e){if(!e||"android"!==e.device.platform)return;let t=e.androidSnapshotFreshness;if(t)return Date.now()-t.markedAt>2500?void delete e.androidSnapshotFreshness:t}function aS(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function a_(e){return"press"===e||"click"===e||"back"===e||"open"===e}function aI(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 ab(e,t,n,r,i){return{requestId:i??A().requestId,appBundleId:n,activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:r,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotCompact:t?.snapshotCompact,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,..._(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:rx(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function aA(e){var t;let{session:n,command:r,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!aP(n))return;let s=function(e){if("click"===e||"press"===e)return"press"}(r);if(!s||!(2===(t=i).length&&t.every(e=>Number.isFinite(Number(e)))))return;let l=aE(o?.nodes??[]);0!==l.length&&(n.pendingInteractionOutcome={action:r,command:s,positionals:i,flags:aM(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function ax(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function aN(e){let{session:t,pending:n,snapshot:r}=e,i=aD(n.preSignature,aE(r.nodes));if("unchanged"!==i||n.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return n.attemptsRemaining-=1,await r9(t.device,n.command,n.positionals,n.flags?.out,{...ab(e.logPath,n.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),E({level:"info",phase:"interaction_no_change_retry",data:{action:n.action,attemptsRemaining:n.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function aM(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:n,...r}=e;return r}function aE(e){let t=new Map,n=[];for(let r of e){let e=function(e,t){var n,r;if(!e.rect||!([(n=e.rect).x,n.y,n.width,n.height].every(e=>Number.isFinite(e))&&n.width>0&&n.height>0)||(r=e,`${r.label??""} ${r.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)}}(r,t);e&&n.push(e)}return n}function aD(e,t){return 0===e.length||0===t.length?"ambiguous":ak(e,t)?"unchanged":"changed"}function ak(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1){let r=e[n],i=t[n];if(!r||!i||r.key!==i.key||Math.abs(r.x-i.x)>1||Math.abs(r.y-i.y)>1||Math.abs(r.width-i.width)>1||Math.abs(r.height-i.height)>1)return!1}return!0}function aP(e){return"ios"===e.device.platform||"android"===e.device.platform}function aC(e,t,n=[],r){var i,a,o;aO(e.device.platform)&&(i=t,a=n,o=r,(o?.postGestureStabilization===!0||"swipe"===i||"scroll"===i||"gesture"===i&&"swipe"===a[0])&&(e.postGestureStabilization={action:t,markedAt:Date.now()}))}function aR(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function aT(e){let{session:t,capture:n}=e,r=t?.postGestureStabilization;if(!t||!aO(t.device.platform)||!r)return e.initial??await n();let i=Date.now(),a=1,o=e.initial??await n(),s=aE(e.readSnapshot(o).nodes);for(;Date.now()-i<1500;){await ez(200),a+=1;let l=await n(),c=aE(e.readSnapshot(l).nodes);if(ak(s,c))return aR(t),E({level:a>2?"info":"debug",phase:"post_gesture_snapshot_stabilized",data:{action:r.action,attempts:a,durationMs:Date.now()-i}}),l;o=l,s=c}return aR(t),E({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:r.action,attempts:a,durationMs:Date.now()-i}}),o}function aO(e){return"ios"===e||"android"===e}function aL(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}let a$=new WeakMap;function aF(e,t){if(!e[t])return[];let n=aq(e)[t]??t+1;return e.slice(t+1,n)}function aU(e,t,n){let r=aq(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];if(t&&n(t))return t}}function aG(e,t,n){let r=aq(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];t&&n(t)}}function aq(e){let t=a$.get(e);if(t)return t;let n=Array(e.length),r=[];for(let[t,i]of e.entries()){let e=i?.depth??0;for(;r.length>0&&e<=r[r.length-1].depth;)n[r.pop().position]=t;r.push({depth:e,position:t})}for(let t of r)n[t.position]=e.length;return a$.set(e,n),n}function aj(e,t,n){for(let r of function(e,t){let n=[],r="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),n.push(r),r="number"==typeof r.parentIndex?t.get(r.parentIndex):void 0;return n}(e,t))if(n(r))return r;return null}function aV(e,t){let n=e0(e.type??""),r=e.label?.trim();return!!(aB(e)||"other"===n&&!r&&!e.value||("other"===n||"statictext"===n)&&r&&t.includes(r))||"image"===n}function aB(e){return"button"===e0(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function aH(e){let t=e0(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function aK(e,t,n){e.set(t.index,{...t,...e.get(t.index),...n})}function aW(e){let t;for(let i of e){var n,r;let e=e0(i.type??"");("application"===e||"window"===e)&&(n=i.rect,r=t,n&&(!r||az(n)>az(r)))&&(t=i.rect)}return t}function az(e){return e?e.width*e.height:0}function aJ(e){let t=e0(e.type??"");return"scrollview"===t||"scrollarea"===t}function aX(e,t){return!0===e||!!t||void 0}function aZ(e,t,n,r){aG(e,t,e=>{(function(e,t){let n=e.label?.trim();if(!n||n!==t)return!1;let r=e0(e.type??"");return"other"===r||"statictext"===r||"link"===r})(e,n)&&r.add(e.index)})}function aY(e,t,n,r){aG(e,t,e=>{var t;let i;e.index!==n&&"button"!==(i=e0((t=e).type??""))&&("image"===i||"Search"===t.label)&&r.add(e.index)})}function aQ(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?.label?.trim();r&&i&&"other"===e0(r.type??"")&&t(r,i,n)}}function a0(e,t,n,r){for(let i of e)(aV(i,t)||r&&a2(i,r))&&n.add(i.index)}function a1(e,t,n){if("button"!==e0(e.type??""))return!1;let r=t.identifier?.trim(),i=e.identifier?.trim();return!!r&&!!i&&r===i||e.label?.trim()===n&&eD(e.rect,t.rect)}function a2(e,t){return"button"===e0(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&eD(e.rect,t.rect)}let a3=[function(e,t){var n,r,i,a;let{suppressedIndexes:o}=t;(function(e,t){let n=aW(e),r=n?n.y+n.height:null;if(null!==r)for(let n=0;n<e.length;n+=1){var i,a;let o=e[n];o&&(i=o,a=r,i.rect&&"keyboard"===e0(i.type??"")&&i.rect.y>=a)&&(t.add(o.index),function(e,t,n,r){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>=r;)n.add(a.index),a="number"==typeof a.parentIndex?i.get(a.parentIndex):void 0}(o,e,t,r),aG(e,n,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let n of e)!("other"!==e0(n.type??"")||!0===n.hittable||n.label?.trim()||n.value?.trim())&&n.identifier?.trim()&&t.add(n.index)}(e,o);let s=new Map(e.map(e=>[e.index,e]));for(let n of e)(function(e){let t=e.label?.trim();return!!(t&&ek(t))})(n)&&function(e,t,n){var r,i,a,o;aH(e.type)||n.suppressedIndexes.add(e.index);let s=eO(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,n={}){return(!0===n.includeSelf&&aH(e.type)?e:null)??aj(e,t,e=>aH(e.type))}(e,t,{includeSelf:!0});l&&(r=n,i=l,a=e,o=s,aK(r.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:aX(i.hiddenContentAbove,o.above),hiddenContentBelow:aX(i.hiddenContentBelow,o.below)}))}(n,s,t);(function(e,t){for(let n=0;n<e.length;n+=1){let r=e[n];if(!r||"searchfield"!==e0(r.type??""))continue;if("Search"===r.label){aY(e,n,null,t);continue}if("Toolbar"!==r.label)continue;let i=aU(e,n,e=>"searchfield"===e0(e.type??"")&&"Search"===e.label);i&&(t.add(r.index),function(e,t,n){let r=new Map(t.map(e=>[e.index,e])),i=e;for(;"number"==typeof i.parentIndex;){let e=r.get(i.parentIndex);if(!e||"Toolbar"!==e.label)return;n.add(e.index),i=e}}(r,e,t),aY(e,n,i.index,t))}})(e,o),n=e,r=o,aQ(n,(e,t,i)=>{aU(n,i,n=>{let r;return("button"===(r=e0(n.type??""))||"link"===r||"switch"===r||"searchfield"===r||"textfield"===r)&&n.label?.trim()===t&&(eD(n.rect,e.rect)||function(e,t){var n,r,i,a,o;let s;if(t.label?.trim()!==e.label?.trim())return!1;let l=e0(t.type??"");return n=e,r=l,s=n.label?.trim(),"button"===r&&("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,n))})&&r.add(e.index)}),i=e,a=o,aQ(i,(e,t,n)=>{let r;eF(e)&&eC(e,(r=[],aG(i,n,e=>{r.push(e)}),r))&&a.add(e.index)}),function(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?.label?.trim();!(!r||t.has(r.index))&&i&&function(e,t,n,r,i){let a=e0(n.type??"");if("statictext"===a||"link"===a)return aZ(e,t,r,i);if("other"===a){if(function(e,t,n){return!!aU(e,t,e=>{let t=e0(e.type??"");return("link"===t||"searchfield"===t||aH(e.type))&&e.label?.trim()===n})}(e,t,r))return i.add(n.index);aZ(e,t,r,i)}}(e,n,r,i,t)}}(e,o)},function(e,t){let n=new Map(e.map(e=>[e.index,e])),r=aW(n.values());for(let i of e)(function(e,t,n){var r;return!("other"!==e0(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)||!aj(e,t,aJ)||!((r=e).rect&&r.rect.height>=44&&r.rect.height<=160&&r.rect.width>=120)||function(e,t,n=.8){let r=az(e),i=az(t);return r>0&&i>0&&r/i>=n}(e.rect,n))})(i,n,r)&&aK(t.replacements,i,{type:"Cell"})},function(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?.label?.trim();r?.rect&&i&&function(e,t,n,r,i){let a=e0(n.type??"");if("button"===a)return a0(aF(e,t),r,i.suppressedIndexes,n);if("cell"!==a)return;let o=aF(e,t);!function(e,t,n,r){let i=e.find(e=>(function(e,t,n){if("switch"!==e0(e.type??""))return!1;let r=t.identifier?.trim(),i=e.identifier?.trim();return!!r&&!!i&&r===i||e.label?.trim()===n})(e,t,n));if(!i)return!1;let a=e.find(e=>a1(e,t,n)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&aK(r.replacements,i,{identifier:o}),r.suppressedIndexes.add(t.index),function(e,t,n,r,i){for(let a of e)a.index!==r.index&&(a1(a,t,n)||a2(a,t)||function(e,t){if("switch"!==e0(e.type??"")||e.index===t.index)return!1;let n=e.label?.trim();return n===t.value?.trim()||"0"===n||"1"===n}(a,r)||aV(a,n))&&i.add(a.index)}(e,t,n,i,r.suppressedIndexes),!0}(o,n,r,i)&&function(e,t,n,r){let i=e.find(e=>a1(e,t,n));if(!i){e.some(aB)&&a0(e,n,r.suppressedIndexes,t);return}!t.identifier&&i.identifier&&aK(r.replacements,t,{identifier:i.identifier}),r.suppressedIndexes.add(i.index),a0(e.filter(e=>e.index!==i.index),n,r.suppressedIndexes,t)}(o,n,r,i)}(e,n,r,i,t)}}];async function a4(e){let t=await a5(e);if(t)return t;let n=await a9(e);return aS(e.session),{snapshot:oo(n,oi(e)),analysis:n.analysis,androidSnapshot:n.androidSnapshot}}async function a5(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!aP(e)||Date.now()-t.markedAt>3e4?void ax(e):t}(e.session);if(t&&e.session)return await a8({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await ot({...e,session:e.session});let n=ay(e.session);if(n&&"android"===e.device.platform)return await a7(e,n)}async function a8(e,t){var n,r;let i=e.session,a=Date.now(),o=0,s=await a6(e,t,await on(e)),l=await aN({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await a6(e,t,await on(e)),l=await aN({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(ax(i),s=await aT({session:i,initial:s,capture:async()=>await on(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.freshness?.staleAfterRetries!==!0&&aS(i),"unchanged"===l.change)?E({level:"warn",phase:"interaction_settle_timeout",data:{action:(n={pending:t,attempts:o,startedAt:a}).pending.action,attempts:n.attempts,durationMs:Date.now()-n.startedAt}}):E({level:(r={pending:t,change:l.change,attempts:o,startedAt:a}).attempts>0?"info":"debug",phase:"interaction_settled",data:{action:r.pending.action,change:r.change,attempts:r.attempts,durationMs:Date.now()-r.startedAt}}),{snapshot:s.snapshot,analysis:s.data.analysis,androidSnapshot:s.data.androidSnapshot,freshness:s.freshness}}async function a6(e,t,n){let r=n;return"unchanged"!==aD(t.preSignature,aE(r.snapshot.nodes))?r:(await ez(500),r=await on(e))}async function a9(e){let{device:t,session:n,flags:r,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await am(n?.surface);return os({nodes:e.nodes,truncated:e.truncated,backend:"linux-atspi"},{snapshotDepth:r?.snapshotDepth,snapshotInteractiveOnly:r?.snapshotInteractiveOnly,snapshotScope:o})}return"macos"===t.platform&&n?.surface&&"app"!==n.surface?os(await i2(n.surface,{bundleId:"menubar"===n.surface?n.appBundleId:void 0}),{snapshotDepth:r?.snapshotDepth,snapshotInteractiveOnly:r?.snapshotInteractiveOnly,snapshotScope:o}):await r9(t,"snapshot",[],i,{...ab(a,{...r,snapshotScope:o},n?.appBundleId,n?.trace?.outPath)})}async function a7(e,t){let n=await oe(e,t);return{snapshot:n.snapshot,analysis:n.data.analysis,androidSnapshot:n.data.androidSnapshot,freshness:n.freshness}}async function oe(e,t){let n=await or(e),r=oa(n,t,e),i=0,a=t.markedAt+1500;for(let o of ag){if(!r)break;let s=a-Date.now();if(s<=0)break;await ez(Math.min(o,s)),n=await or(e),i+=1,r=oa(n,t,e)}return r||aS(e.session),{...n,freshness:i>0||r?{action:t.action,retryCount:i,staleAfterRetries:!!r,reason:r??void 0}:void 0}}async function ot(e){let t=await aT({session:e.session,capture:async()=>await on(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,analysis:t.data.analysis,androidSnapshot:t.data.androidSnapshot,freshness:t.freshness}}async function on(e){let t=ay(e.session);return t&&"android"===e.device.platform?await oe(e,t):await or(e)}async function or(e){let t=await a9(e);return{data:t,snapshot:oo(t,oi(e))}}function oi(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function oa(e,t,n){var r,i;let a=n.flags?.snapshotInteractiveOnly===!0,o=e.data.analysis;if(a&&0===e.snapshot.nodes.length&&o&&o.rawNodeCount>=12)return"empty-interactive";if("ref-refresh"===n.androidFreshnessMode)return null;return(r=t.baselineCount,i=e.snapshot.nodes.length,!(r<12)&&i<=Math.floor(.2*r))?e.snapshot.nodes.some(e=>!0===e.hittable||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())?null:"sharp-drop":t.routeComparable&&a_(t.action)&&function(e,t){if(!e||0===e.length)return!1;let n=Math.max(e.length,t.length);if(n<12)return!1;let r=aI(t),i=Math.min(e.length,r.length),a=0;for(let t=0;t<i;t+=1)e[t]===r[t]&&(a+=1);let o=Math.max(0,r.length-e.length),s=Math.max(0,e.length-r.length),l=Math.max(3,Math.floor(.15*n));return a>=Math.floor(.9*n)&&o<=l&&s<=l}(t.baselineSignatures,e.snapshot.nodes)?"stuck-route":null}function oo(e,t){var n,r,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=e$(s?o:e1(o)),c=t?.snapshotScope&&e?.backend!=="macos-helper"?ol(l,t.snapshotScope):l,d=(n=e?.backend,r=t,"xctest"===n&&r?.snapshotInteractiveOnly===!0&&!0!==r.snapshotRaw)?function(e){if(0===e.length)return e;let t=new Map,n=new Set;for(let r of a3)r(e,{replacements:t,suppressedIndexes:n});if(0===n.size&&0===t.size)return e;var r=e.filter(e=>!n.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 r.entries())a.set(t.index,e);return r.map((e,t)=>{let r="number"==typeof e.parentIndex?a.get(e.parentIndex):void 0;return void 0===r&&"number"==typeof e.parentIndex&&(r=function(e,t,n,r){let i=e,a=new Set;for(;"number"==typeof i&&!a.has(i);){if(a.add(i),!t.has(i))return r.get(i);i=n.get(i)?.parentIndex}}(e.parentIndex,n,i,a)),{...e,index:t,parentIndex:r}})}(c):c;return{nodes:e7(s?d:eB(d)),truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,presentationKey:e6(e4(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&a?.snapshotCompact!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function os(e,t){var n,r;let i=e.nodes??[];return t.snapshotScope&&(i=ol(i,t.snapshotScope)),t.snapshotInteractiveOnly&&(i=function(e){if(0===e.length)return e;let t=new Map;for(let n of e)t.set(n.index,n);let n=new Set;for(let r of e){if(!function(e){if(e.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")}(r))continue;let e=r;for(;e&&!n.has(e.index);)n.add(e.index),e="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0}return 0===n.size?e:oc(e.filter(e=>n.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(n=i,r=t.snapshotDepth,i=oc(n.filter(e=>(e.depth??0)<=r))),{...e,nodes:i}}function ol(e,t){let n=e2(e7(e),t);if(!n)return[];let r=e.findIndex(e=>e.index===n.index);if(-1===r)return[];let i=e[r]?.depth??0,a=[];for(let t=r;t<e.length;t+=1){let n=e[t];if(!n)continue;let o=n.depth??0;if(t>r&&o<=i)break;a.push(n)}return oc(a,i)}function oc(e,t=0){let n=new Map;for(let[t,r]of e.entries())n.set(r.index,t);return e.map((e,r)=>({...e,index:r,depth:Math.max(0,(e.depth??0)-t),parentIndex:"number"==typeof e.parentIndex?n.get(e.parentIndex):void 0}))}function od(e,t){let n;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return aL("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let r=e5(e.trim());if(!r)return aL("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=e8(e.nodes,r);if(n=t?e3(t,e.nodes):void 0)break}return n?{ok:!0,scope:n}:aL("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function ou(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function op(e){return{get:t=>t===e.sessionName?function(e,t,n={}){if(e)return{name:t,appBundleId:e.appBundleId,appName:e.appName,...!0===n.includeSnapshot?{snapshot:e.snapshot}:{},metadata:{surface:e.surface,...n.metadata??{}}}}(e.getSession(),e.sessionName,e.recordOptions):void 0,set:t=>{t.name!==e.sessionName?E({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function of(e){let{session:t,sessionName:n,outPath:r,outputPlacement:a,dispatchContext:o}=e,l=eG({backend:function(e){let{session:t,outputPlacement:n,dispatchContext:r}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...r,..._(a),surface:a?.surface};return"out"===n?om(await r9(t.device,"screenshot",[],i,o)):om(await r9(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:o}),artifacts:{resolveInput:async()=>{throw new F("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,n;return e?.kind==="path"?n=e.path:(t=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-screenshot-")),n=i.join(t,"screenshot.png")),await s.mkdir(i.dirname(n),{recursive:!0}),{path:n,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await s.mkdtemp(i.join(u.tmpdir(),`${e.prefix}-`));return{path:i.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}}},sessions:op({sessionName:n,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eH()});return await l.capture.screenshot({session:n,requestId:o.requestId,appBundleId:t.appBundleId,...S(o),surface:t.surface,...r?{out:{kind:"path",path:r}}:{}})}function om(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function oh(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function ow(e,t){let n=Math.max(24,Math.round(.2*Math.min(e.size,t.size))),r=Math.max(48,Math.round(.15*Math.min(e.crossSize,t.crossSize)));return Math.abs(e.size-t.size)<=n&&Math.abs(e.crossSize-t.crossSize)<=r}function og(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let ov=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function oy(e,t={}){let n=tr(e,t.helperAdb).exec;return(await oA(e,t,n)).xml}async function oS(e,t={}){let n=tr(e,t.helperAdb).exec,r=await oA(e,t,n),i=r.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=ta(i,void 0,t),s=o_(o.truncated,r.metadata);return a&&function(e,t){for(let[n,r]of e){let e=t[n];e&&(r.hiddenContentAbove&&(e.hiddenContentAbove=!0),r.hiddenContentBelow&&(e.hiddenContentBelow=!0))}}(await oT(e,o.nodes,i,n),o.nodes),{...o,...oI(s),androidSnapshot:r.metadata}}let o=ts(i),s=tp(o,void 0,t),l=o_(s.truncated,r.metadata);a&&await ob({device:e,options:t,tree:o,xml:i,adb:n,interactiveSnapshot:s});let{sourceNodes:c,...d}=s;return{...d,...oI(l),androidSnapshot:r.metadata}}function o_(e,t){return!0===e||!0===t.helperTruncated||e}function oI(e){return!0===e?{truncated:!0}:{}}async function ob(e){if(oL(e.interactiveSnapshot.nodes).size>0||oO(e.xml))return;let t=tp(e.tree,void 0,{...e.options,interactiveOnly:!1}),n=await oT(e.device,t.nodes,e.xml,e.adb);oj(n,t,e.interactiveSnapshot),0===n.size&&oj(eR(e7(t.nodes)),t,e.interactiveSnapshot)}async function oA(e,t,n){let r=await N("android_snapshot_helper_artifact_resolution",async()=>await oC(t.helperArtifact));return r.artifact?await ox(e,t,n,r.artifact):(E({level:r.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:r.fallbackReason??"artifact_not_found"}}),await oR(e,r.fallbackReason,n))}async function ox(e,t,n,r){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),c=tr(e,t.helperAdb);try{let e=await oN(t,n,c,r,l);return e.installed&&await tf(l),a=await oM(t,n,c,r,l),o=r,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 oE({error:t,helperDeviceKey:l,artifact:r,device:e,adb:n})}}async function oN(e,t,n,r,i){let a=await N("android_snapshot_helper_install",async()=>await to({adb:t,adbProvider:n,artifact:r,deviceKey:i,installPolicy:e.helperInstallPolicy,timeoutMs:3e4}),{packageName:r.manifest.packageName,versionCode:r.manifest.versionCode,installPolicy:e.helperInstallPolicy??"missing-or-outdated"});return E({phase:"android_snapshot_helper_install_decision",data:{packageName:a.packageName,versionCode:a.versionCode,installedVersionCode:a.installedVersionCode,installed:a.installed,reason:a.reason}}),a}async function oM(e,t,n,r,i){let a={adb:t,adbProvider:n,deviceKey:i,helperVersion:r.manifest.version,helperVersionCode:r.manifest.versionCode,packageName:r.manifest.packageName,instrumentationRunner:r.manifest.instrumentationRunner,waitForIdleTimeoutMs:e.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await N("android_snapshot_helper_session_capture",async()=>await tc(a),{packageName:r.manifest.packageName,version:r.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){E({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:$(e).message}}),await oD(t,r.manifest.packageName)}return await N("android_snapshot_helper_capture",async()=>await tl(a),{packageName:r.manifest.packageName,version:r.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function oE(e){let t=function(e){var t;let n=$(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let n="errorType"in e?String(e.errorType):"",r=oP(e)??t;return/TimeoutException/.test(n)||/timed out/i.test(r)}(n.details?.helper,n.message)&&(t=n,!(t.details?.exitCode===137&&/Android snapshot helper (failed before returning parseable output|output could not be parsed)/.test(t.message))))return;let r=ok(e);return new F(O(n.code),`${r}. Stock UIAutomator fallback was skipped because this usually means the Android accessibility tree is busy or stalled.`,{...n.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 n=ok(e.error);return E({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:n}}),await tf(e.helperDeviceKey),await oD(e.adb,e.artifact.manifest.packageName),tu({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oR(e.device,n,e.adb)}async function oD(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await ez(150),E({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){E({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:$(e).message}})}}function ok(e){let t=$(e),n=oP(t.details?.helper);if(n&&n!==t.message)return`${t.message}: ${n}`;if(n)return n;let r=("string"==typeof t.details?.stderr?t.details.stderr.trim():"").split(/\r?\n/).find(e=>e.trim());return r?`${t.message}: ${r}`:t.message}function oP(e){if(!e||"object"!=typeof e||!("message"in e))return;let t=String(e.message).trim();return t&&"null"!==t?t:void 0}async function oC(e){if(e)return{artifact:e};let t=tt(),n=i.join(tn(),"android-snapshot-helper","dist"),r=i.join(n,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await w.access(r)}catch{return{}}try{let e=td(JSON.parse(await w.readFile(r,"utf8"))),t=i.join(n,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await w.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:$(e).message}}}async function oR(e,t,n){let r;try{r=await N("android_snapshot_stock_capture",async()=>await o$(e,n),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let n;throw i=e,a=t,new F(O((n=$(i)).code),`${n.message} Android snapshot helper failed before stock fallback: ${a}`,{...n.details,androidSnapshotHelperFallbackReason:a,...n.hint?{hint:n.hint}:{}},i)}throw e}return{xml:r,metadata:{backend:"uiautomator-dump",...t?{fallbackReason:t}:{}}}}async function oT(e,t,n,r){if(!t.some(e=>te(e.type)))return new Map;let i=oL(t);if(i.size>0||oO(n))return i;let a=await oq(e,r);return a?function(e,t){let n=function(e){let t={className:"root",rect:{x:0,y:0,width:0,height:0},children:[]},n=[{indent:-1,node:t}],r=/^(\s*)([\w.$]+)\{[^}]* (-?\d+),(-?\d+)-(-?\d+),(-?\d+) #/;for(let t of e.split("\n")){let e=r.exec(t);if(!e)continue;let[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(;n.length>1&&d<=n[n.length-1].indent;)n.pop();n[n.length-1].node.children.push(f),n.push({indent:d,node:f})}return t.children.length>0?t:null}(t);if(!n)return new Map;let r=function(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();if(te(e.className)){let n=function(e){let t=e.children[0];if(!t)return null;let n=Math.max(t.rect.height,...t.children.map(e=>e.rect.y+e.rect.height)),r=t.children.filter(e=>e.rect.height>0).map(t=>og(t.rect,e.rect)).sort((e,t)=>e.start-t.start);return 0===r.length?null:{rect:e.rect,contentExtent:n,contentBlocks:r}}(e);n&&t.push(n)}n.push(...e.children)}return t}(n);if(0===r.length)return new Map;let i=new Map;for(let t of e){if(!t.rect||!te(t.type))continue;let n=function(e,t){let n=null,r=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<r&&(n=i,r=a)}return n}(t.rect,r);if(!n)continue;let a=function(e,t){let n=function(e,t){let n=t,r=new Set;for(;!r.has(n.index);){var i,a;r.add(n.index);let o=e.filter(e=>e.parentIndex===n.index&&e.rect);if(1!==o.length)return n;let s=o[0];if(i=s.rect,a=t.rect,i.x!==a.x||i.y!==a.y||i.width!==a.width||i.height!==a.height)return n;n=s}return t}(e,t);return e.filter(e=>e.parentIndex===n.index&&e.rect).map(e=>e.rect).filter(e=>e.height>0).sort((e,t)=>e.y-t.y).map(e=>og(e,t.rect))}(e,t),o=function(e){let{viewportRect:t,visibleBlocks:n,nativeScrollView:r}=e;if(0===n.length||0===r.contentBlocks.length)return null;let i=function(e){if(0===e.contentBlocks.length)return null;let t=e.contentBlocks[0],n=e.contentBlocks[e.contentBlocks.length-1];if(!t||!n)return null;let r=oh(e.contentBlocks.map(e=>e.size))??e.rect.height,i=Math.max(48,Math.round(.5*r)),a=Math.max(24,Math.round(.25*r)),o=t.start>=i,s=e.contentExtent-(n.start+n.size)>=a;return o||s?{above:o,below:s}:null}(r),a=function(e,t){let n=new Map;for(let r of e)for(let e of t){if(!ow(r,e))continue;let t=r.start-e.start,i=8*Math.round(t/8),a=n.get(i)??[];a.push(t),n.set(i,a)}let r=null;for(let e of n.values())(!r||e.length>r.length)&&(r=e);if(!r||r.length<2)return null;let i=[...r].sort((e,t)=>e-t);return i[Math.floor(i.length/2)]??null}(r.contentBlocks,n)??function(e){let{nativeBlocks:t,visibleBlocks:n,viewportExtent:r,contentExtent:i}=e,a=[],o=[];for(let e of t)for(let t of n){if(!ow(e,t))continue;let n=e.start-t.start;16>=Math.abs(n)&&a.push(n),16>=Math.abs(n+r-i)&&o.push(n)}return o.length>0?oh(o):a.length>0?oh(a):null}({nativeBlocks:r.contentBlocks,visibleBlocks:n,viewportExtent:t.height,contentExtent:r.contentExtent});if(null===a)return i;let o=t.height;return{above:(i?.above??!1)||a>16,below:(i?.below??!1)||a+o<r.contentExtent-16}}({viewportRect:t.rect,visibleBlocks:a,nativeScrollView:n});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 oL(e){let t=new Map;for(let n of e){let e={};n.hiddenContentAbove&&(e.hiddenContentAbove=!0),n.hiddenContentBelow&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n.index,e)}return t}async function o$(e,t=ti(e)){try{return await ea(()=>oF(t),{shouldRetry:oG})}catch(t){var n,r;let e;if((n=t)instanceof F&&"COMMAND_FAILED"===n.code&&"number"==typeof n.details?.timeoutMs&&n.details?.cmd==="adb"&&(e=Array.isArray(r=n.details?.args)?r.map(String):"string"==typeof r?r.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 F("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 oF(e){var t,n;let r,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=oU(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,n=l.stderr,r=`${t}
6
- ${n}`,i=/dumped to:\s*(\S+)/i.exec(r),i?.[1]);if(0!==l.exitCode&&!c)throw new F("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=oU(d.stdout,d.stderr);if(!u)throw new F("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:d.stdout,stderr:d.stderr});return u}function oU(e,t){let n=`${e}
7
- ${t}`,r=n.indexOf("<?xml"),i=r>=0?r:n.indexOf("<hierarchy");if(i<0)return null;let a=n.lastIndexOf("</hierarchy>");if(a<0||a<i)return null;let o=n.slice(i,a+12).trim();return o.length>0?o:null}function oG(e){if(!(e instanceof F)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,n=("string"==typeof t?t:"").toLowerCase();return ov.some(e=>n.includes(e))}async function oq(e,t=ti(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),n=`${e.stdout}
8
- ${e.stderr}`.trim();return n.length>0?n:null}catch{return null}}function oj(e,t,n){if(0===e.size)return;let r=new Map;for(let[e,t]of n.sourceNodes.entries()){let i=n.nodes[e];i&&r.set(t,i)}for(let[n,i]of e){let e=t.sourceNodes[n];if(!e)continue;let a=r.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,oB=/^close app$/i,oH="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function oK(e){let t,{session:n}=e;if("android"!==n.device.platform||!n.recording)return{status:"absent"};try{t=await oY(n)}catch(e){return E({level:"warn",phase:"android_blocking_dialog_inspection_failed",data:{session:n.name,deviceId:n.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"unknown",reason:"inspection-failed"}}let r=o0(t);if(!r?.rect)return{status:"absent"};try{let e=await oQ(n,r);if(!e.ok)return E({level:"warn",phase:"android_blocking_dialog_tap_failed",data:{session:n.name,deviceId:n.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:"failed",reason:"tap-failed"};if(!await o1(n))return E({level:"warn",phase:"android_blocking_dialog_still_present",data:{session:n.name,deviceId:n.device.id}}),{status:"failed",reason:"dismiss-failed"};if(n.appBundleId&&(await el(n.device,n.appBundleId),!await o2(n,n.appBundleId)))return E({level:"warn",phase:"android_blocking_dialog_relaunch_unfocused",data:{session:n.name,deviceId:n.device.id,appBundleId:n.appBundleId}}),{status:"failed",reason:"relaunch-failed"};return E({level:"warn",phase:"android_blocking_dialog_recovered",data:{session:n.name,deviceId:n.device.id,appBundleId:n.appBundleId,x:e.x,y:e.y}}),{status:"recovered"}}catch(e){return E({level:"warn",phase:"android_blocking_dialog_recovery_failed",data:{session:n.name,deviceId:n.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"failed",reason:"error"}}}async function oW(e){var t,n;let{session:r,command:i}=e;if("android"!==r.device.platform)return{status:"clear"};let a=await ei(r.device);if(!a)return{status:"clear"};if(t=r,n=a,t.appBundleId&&n.package===t.appBundleId){if(await oz(r)){let t=`Recovered Android app ANR before ${i}: closed and relaunched ${r.appBundleId}.`;if("before-command"===e.phase)return{status:"recovered",warning:t};throw oX({session:r,command:i,focus:a,message:`Android app ANR appeared after ${i}; ${r.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 oX({session:r,command:i,focus:a,message:`Android app ANR blocked ${i}: ${oZ(a)}. Automatic recovery failed.`,hint:oH})}throw oX({session:r,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${oZ(a)}.`,hint:oH})}async function oz(e){try{return await oJ(e)}catch(t){return E({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 oJ(e){if(!e.appBundleId)return!1;let t=o0(await oY(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let n=await oQ(e,t);if(!n.ok)return!1;await el(e.device,e.appBundleId);let r=await o2(e,e.appBundleId,{requireNoBlockingDialog:!0});return r&&E({level:"warn",phase:"android_app_anr_recovered",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:n.x,y:n.y}}),r}function oX(e){let{session:t,command:n,focus:r,message:i,hint:a}=e;return new F("COMMAND_FAILED",i,{command:n,expectedPackage:t.appBundleId,focusedPackage:r.package,focusedWindow:r.focusedWindow,rawFocus:r.raw,hint:a})}function oZ(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function oY(e){return e7(e1((await oS(e.device,{interactiveOnly:!1,compact:!1})).nodes))}async function oQ(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:n,y:r}=e9(t.rect),i=await en(e.device,["shell","input","tap",String(Math.round(n)),String(Math.round(r))],{allowFailure:!0});return 0!==i.exitCode?{ok:!1,exitCode:i.exitCode,stdout:i.stdout.trim(),stderr:i.stderr.trim()}:{ok:!0,x:n,y:r}}function o0(e,t={}){if(!1===t.requireDialogSignal||o5(e))return e.find(e=>o4(e).some(e=>oB.test(e))&&e.rect)}async function o1(e){for(let t=0;t<12;t+=1){if(!o5(await oY(e)))return!0;await ez(500)}return!o5(await oY(e))}async function o2(e,t,n={}){for(let r=0;r<12;r+=1){if(await o3(e,t,n))return!0;await ez(500)}return await o3(e,t,n)}async function o3(e,t,n){return!(n.requireNoBlockingDialog&&await ei(e.device))&&(await eh(e.device)).package===t}function o4(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 o5(e){return e.some(e=>{let t=o4(e).join(" ").trim();return t.length>0&&oV.test(t)})}function o8(e){return!!(e&&e.width>0&&e.height>0)}function o6(e){return e.width*e.height}function o9(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 o7=[255,59,48,255],se=[255,214,10,255],st=[0,0,0,255],sn=["scroll","list","recyclerview","edittext","textfield"],sr=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],si={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 sa(e){let t=eT(await s.readFile(e.screenshotPath),"screenshot"),n=function(e,t,n,r={}){let i=function(e){let t=null;for(let n of e)sl(n)&&o8(n.rect)&&(!t||o6(n.rect)>o6(t))&&(t=n.rect);return t||function(e){let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)a.rect&&o8(a.rect)&&(t=Math.min(t,a.rect.x),n=Math.min(n,a.rect.y),r=Math.max(r,a.rect.x+a.rect.width),i=Math.max(i,a.rect.y+a.rect.height));return!Number.isFinite(t)||!Number.isFinite(n)||r<=t||i<=n?null:{x:t,y:n,width:r-t,height:i-n}}(e.filter(e=>{var t;return o8(e.rect)&&!("image"===e0((t=e).type??"")&&!sd(t.label))}))}(e.nodes),a=new Map;for(let r of e.nodes){var o,s;if(!function(e,t,n){let r=[n.label,n.value].some(su)||sp(n.identifier);return!!function(e,t,n){if("android"!==e.backend||!n.hittable||!o8(n.rect)||sl(n))return!1;let r=e0(n.type??"");return!(sn.some(e=>r.includes(e))||t&&o6(n.rect)>.25*o6(t))}(e,t,n)||(ss(n)?r:r&&function(e){let t=e0(e.type??"");return t.includes("statictext")||t.includes("image")||t.includes("text")||t.includes("other")}(n))}(e,i,r))continue;let l=(o=e.nodes,[function(e){return ss(e)&&!sl(e)}(s=r)?s:null,eQ(o,s,e=>(function(e){return ss(e)&&!sl(e)})(e)),s.hittable?s:null,eQ(o,s,e=>!0===e.hittable)].find(sc)??null);if(!l?.rect||!o8(l.rect))continue;let c=function(e,t,n){let r=sf(e);if(e.ref!==t.ref&&r)return r;let i=function(e,t){let n=null;for(let r of t){if(r.ref===e.ref||!function(e,t,n){let r=e;for(;void 0!==r.parentIndex;){let e=n[r.parentIndex];if(!e)break;if(e.ref===t.ref)return!0;r=e}return!1}(r,e,t))continue;let i=sf(r);if(!i)continue;let a=function(e){let t=0;return e0(e.type??"").includes("text")&&(t+=2),su(e.label)&&(t+=2),su(e.value)&&(t+=1),t}(r);(!n||a>n.score)&&(n={label:i,score:a})}return n?.label}(t,n);return i||sf(t)}(r,l,e.nodes),d=function(e,t,n){let r=0;return e.ref===t.ref&&(r+=4),t.hittable&&(r+=3),ss(t)&&(r+=3),ss(e)&&(r+=2),n&&(r+=2),sp(t.identifier)&&(r+=1),sd(t.value)&&(r+=1),r}(r,l,c),u=function(e,t,n){var r,i;return"android"!==e.backend?t.rect:(r=ss,i=e=>!!sf(e),(!t.rect||!0!==t.hittable||r(t)||i(t)?null:function(e,t,n){let r=e.rect,i=function(e,t,n){let r=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&function(e,t,n){let r=e;for(;void 0!==r.parentIndex;){let e=n.get(r.parentIndex);if(!e)break;if(e.ref===t.ref)return!0;r=e}return!1}(t,e,i)&&function(e,t){let n=e0(e.type??"");return n.includes("text")||n.includes("image")&&t(e)}(t,n)&&o8(t.rect)&&o9(r,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 n=t.x,r=t.y,i=t.x+t.width,a=t.y+t.height;for(let t of e.slice(1))n=Math.min(n,t.x),r=Math.min(r,t.y),i=Math.max(i,t.x+t.width),a=Math.max(a,t.y+t.height);return{x:n,y:r,width:i-n,height:a-r}}(a)}(e,t,n);if(!i)return null;let a=i.y-r.y,o=r.y+r.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>=r.height?null:{x:r.x,y:l,width:r.width,height:c}}(t,n,i))??t.rect)}(e,l,e.nodes),p=so(e,i,u,t,n);if(!o8(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,n,r,i){let a=eN(e.nodes).primaryAction;if(!a?.ref||!a.rect||!o8(a.rect))return;let o=so(e,t,a.rect,r,i);if(!o8(o))return;let s={ref:a.ref,label:a.label,rect:a.rect,overlayRect:o,score:100},l=n.get(a.ref);n.set(a.ref,l?{...l,score:Math.max(l.score,s.score)}:s)}(e,i,a,t,n),(function(e){let t=[];for(let n of e.sort((e,t)=>o6(e.overlayRect)-o6(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===n.label&&(o9(e.overlayRect,n.overlayRect)||o9(n.overlayRect,e.overlayRect)));if(-1===e){t.push(n);continue}o6(n.overlayRect)<o6(t[e].overlayRect)&&(t[e]=n)}return t})([...a.values()]).sort(sS).slice(0,r.maxRefs??24).sort(sy).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:e9(e.overlayRect)}))}(e.snapshot,t.width,t.height,{maxRefs:e.maxRefs});for(let e of n){var r,i;(function(e,t,n){for(let r=0;r<2;r+=1)sw(e,t.x,t.x+t.width-1,t.y+r,n),sw(e,t.x,t.x+t.width-1,t.y+t.height-1-r,n),sg(e,t.x+r,t.y,t.y+t.height-1,n),sg(e,t.x+t.width-1-r,t.y,t.y+t.height-1,n)})(r=t,(i=e).overlayRect,o7),function(e,t,n){let r=6+5*n.length+ +Math.max(0,n.length-1),i=sh(t.x,0,Math.max(0,e.width-r)),a=t.y-11-2,o=a>=0?a:sh(t.y+2,0,Math.max(0,e.height-11));(function(e,t,n,r,i){for(let a=0;a<11;a+=1)for(let o=0;o<r;o+=1)sv(e,t+o,n+a,i)})(e,i,o,r,se),function(e,t,n,r,i){let a=t;for(let t of r.toLowerCase()){let r=si[t];if(r)for(let t=0;t<r.length;t+=1)for(let o=0;o<r[t].length;o+=1)"1"===r[t][o]&&sv(e,a+o,n+t,i);a+=6}}(e,i+3,o+2,n,st)}(r,i.overlayRect,i.ref)}return await s.writeFile(e.screenshotPath,eU.sync.write(t)),n}function so(e,t,n,r,i){if("android"===e.backend||!t)return sm(function(e){return{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}(n),r,i);let a=r/t.width,o=i/t.height;return sm({x:Math.round((n.x-t.x)*a),y:Math.round((n.y-t.y)*o),width:Math.max(1,Math.round(n.width*a)),height:Math.max(1,Math.round(n.height*o))},r,i)}function ss(e){let t=[e.type,e.role,e.subrole].map(e=>e0(e??"")).join(" ");return sr.some(e=>t.includes(e))}function sl(e){let t=[e.type,e.role,e.subrole].map(e=>e0(e??"")).join(" ");return t.includes("application")||t.includes("window")}function sc(e){return!!(e?.rect&&o8(e.rect)&&!sl(e))}function sd(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function su(e){var t;let n;return!!sd(e)&&(t=e,"toolbar"!==(n=t?.trim().toLowerCase())&&"window"!==n&&"application"!==n&&n?.startsWith("vertical scroll bar")!==!0)}function sp(e){var t;return"string"==typeof e&&!!su(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function sf(e){let t=[e.label,e.value].find(su);return t?t.trim():sp(e.identifier)?e.identifier.trim():void 0}function sm(e,t,n){let r=sh(e.x,0,Math.max(0,t-1)),i=sh(e.y,0,Math.max(0,n-1)),a=Math.max(1,t-r),o=Math.max(1,n-i);return{x:r,y:i,width:sh(e.width,1,a),height:sh(e.height,1,o)}}function sh(e,t,n){return Number.isFinite(e)?Math.max(t,Math.min(n,e)):t}function sw(e,t,n,r,i){for(let a=t;a<=n;a+=1)sv(e,a,r,i)}function sg(e,t,n,r,i){for(let a=n;a<=r;a+=1)sv(e,t,a,i)}function sv(e,t,n,r){if(t<0||n<0||t>=e.width||n>=e.height)return;let i=(e.width*n+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}function sy(e,t){var n,r;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:(n=e.ref,r=t.ref,Number.parseInt(n.replace(/^\D+/,""),10)-Number.parseInt(r.replace(/^\D+/,""),10))}function sS(e,t){return t.score!==e.score?t.score-e.score:sy(e,t)}function s_(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 sI=new WeakMap;function sb(e){if(!e)return;let t=sI.get(e);if(t)return t;let n=sA(e.nodes??[]);if(n)return sI.set(e,n),n}let sA=eV,sx={referenceWidth:1e3,referenceHeight:1e3};function sN(e,t,n,r,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,...r??{}},_=sT(S.effectiveDurationMs)??sT(S.durationMs),I={recordingStartedAt:y.startedAt,gestureClockOriginAtMs:y.gestureClockOriginAtMs,gestureClockOriginUptimeMs:y.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===y.platform?y.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:sT(S.gestureStartUptimeMs),gestureEndUptimeMs:sT(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},b="number"==typeof(s={gestureStartUptimeMs:sT(S.gestureStartUptimeMs),gestureEndUptimeMs:sT(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===sT(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sO(sT(t.count),1)??1,n=!0===t.doubleTap,r=sO(sT(t.holdMs),1);return 1===e&&!n&&void 0===r}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 s_(e);let n=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-n-e.recordingStartedAt)}({...I,gestureDurationMs:b}):s_(I),x=(l=e.snapshot,w=sT((c=S).referenceWidth),g=sT(c.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:sb(l)),N=(d=t,u=n,p=S,f=A,m=b,h=x,v=sM[d],v?.(u,p,f,m,h)??[]);0!==N.length&&(y.gestureEvents.push(...N),E({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 sM={click:(e,t,n,r,i)=>sE(e,t,n,i),press:(e,t,n,r,i)=>sE(e,t,n,i),"react-native":(e,t,n,r,i)=>"dismiss-overlay"===e[0]?sE(e,t,n,i):[],fill:(e,t,n,r,i)=>sD(e,t,n,i),focus:(e,t,n,r,i)=>sD(e,t,n,i),longpress:function(e,t,n,r,i){let a=sL(t,e);if(!a)return[];let{x:o,y:s}=a;return[sC(n,o,s,sU(r,[sT(t.durationMs),sT(e[2])],800),i)]},scroll:function(e,t,n,r,i){let a=s$(t,e),o=sR(t.contentDirection)??sR(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:c,y2:d}=a,u=sU(r,[],250),p=sT(t.amount)??sT(e[1]),f=sT(t.pixels);return[{kind:"scroll",tMs:n,x:s,y:l,x2:c,y2:d,...i,durationMs:u,contentDirection:o,...void 0!==p?{amount:p}:{},...void 0!==f?{pixels:f}:{}}]},pan:sk,fling:sk,swipe:sk,pinch:function(e,t,n,r,i){let a=sL(t,e,1),o=sT(t.scale)??sT(e[0]);if(!a||void 0===o||o<=0)return[];let{x:s,y:l}=a;return[{kind:"pinch",tMs:n,x:s,y:l,...i,scale:o,durationMs:sU(r,[],280)}]}};function sE(e,t,n,r){let i=sL(t,e);if(!i)return[];let{x:a,y:o}=i,s=sO(sT(t.count),1)??1,l=sO(sT(t.intervalMs),0)??0,c=!0===t.doubleTap,d=sO(sT(t.holdMs),1),u=[];for(let e=0;e<s;e+=1){let t=n+e*l;if(void 0!==d&&d>0){u.push(sC(t,a,o,d,r));continue}u.push(sP(t,a,o,r)),c&&u.push(sP(t+90,a,o,r))}return u}function sD(e,t,n,r){let i=sL(t,e);if(!i)return[];let{x:a,y:o}=i;return[sP(n,a,o,r)]}function sk(e,t,n,r,i){let a=s$(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:c}=a,d=sU(r,[sT(t.effectiveDurationMs),sT(t.durationMs),sT(e[4])],250),u=sO(sT(t.count),1)??1,p=sO(sT(t.pauseMs),0)??0,f="ping-pong"===t.pattern?"ping-pong":"one-way";return Array.from({length:u},(e,t)=>{var r,a,u,m,h,w,g,v,y,S,_,I,b;let A,{startX:x,startY:N,endX:M,endY:E}=(r=t,a=f,u=o,m=s,h=l,w=c,"ping-pong"===a&&r%2==1?{startX:h,startY:w,endX:u,endY:m}:{startX:u,startY:m,endX:h,endY:w});return g=n+t*(d+p),v=x,y=N,S=M,_=E,I=d,"back-swipe"===(A=function(e,t,n,r,i){if(!i||Math.abs(n-e)<=1.25*Math.abs(r-t))return"swipe";let a=.08*i.referenceWidth;return e<=a&&n>e||e>=i.referenceWidth-a&&n<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,n){if(n){let t=.08*n.referenceWidth;if(e<=t)return"left";if(e>=n.referenceWidth-t)return"right"}return t>=e?"left":"right"}(v,S,b)}:{kind:A,tMs:g,x:v,y,x2:S,y2:_,...b,durationMs:I}})}function sP(e,t,n,r){return{kind:"tap",tMs:e,x:t,y:n,...r}}function sC(e,t,n,r,i){return{kind:"longpress",tMs:e,x:t,y:n,...i,durationMs:r}}function sR(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 sT(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 n=Math.floor(e);return n>=t?n:void 0}function sL(e,t,n=0){let r=sT(e.x)??sT(t[n]),i=sT(e.y)??sT(t[n+1]);if(void 0!==r&&void 0!==i)return{x:r,y:i}}function s$(e,t){let n=sF(e.x1,e.x,t[0]),r=sF(e.y1,e.y,t[1]),i=sF(e.x2,t[2]),a=sF(e.y2,t[3]);if(void 0!==n&&void 0!==r&&void 0!==i&&void 0!==a)return{x1:n,y1:r,x2:i,y2:a}}function sF(...e){return e.map(sT).find(e=>void 0!==e)}function sU(e,t,n){return sO(e,1)??t.map(e=>sO(e,1)).find(e=>void 0!==e)??n}let sG={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sq(e){var t,n,r,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,...n]=e.positionals??[],r=t?sG[t]:void 0;return r?{ok:!0,platformCommand:r,dispatchRequest:{...e,command:r,positionals:n},recordedCommand:e.command}:{ok:!1,message:eb}}(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 sj(m,y);if("response"in b)return b.response;let{resolvedPositionals:A,resolvedOut:x,recordedPositionals:N,recordedFlags:M}="screenshot"===(t=S).command?(c=(r=(n=t).positionals??[],i=n.meta?.cwd,(l=r[0])?[tQ.expandHome(l,i),...r.slice(1)]:r),u=(d=(a=n.flags?.out,o=n.meta?.cwd,a?tQ.expandHome(a,o):a))?{...n.flags??{},out:d}:n.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 sB({session:m,sessionName:e.sessionName,logPath:h,command:y,request:S,positionals:A,out:x,dispatchContext:D}),P=await sj(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??[],T=_===y?M:f.flags??{};return function(e){let{session:t,sessionStore:n,command:r,recordedCommand:i,resolvedPositionals:a,recordedPositionals:o,recordedFlags:s,data:l,actionStartedAt:c,actionFinishedAt:d,flags:u}=e,p=function(e,t,n,r){if("scroll"!==t)return r;let i=sb(e.snapshot),a={...r??{}},o=sR(a.direction)??sR(n[0]);if(!o)return r;let s=sT(a.amount)??sT(n[1]),l=sT(a.pixels),c=s$(a,[]),d=sT(a.referenceWidth),u=sT(a.referenceHeight),p=void 0!==d&&d>0&&void 0!==u&&u>0?{referenceWidth:d,referenceHeight:u}:i??sx;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=eK({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,r,a,l);sN(t,r,a,p,u,c,d),n.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:y,recordedCommand:_,resolvedPositionals:A,recordedPositionals:R,recordedFlags:T,data:k,actionStartedAt:E,actionFinishedAt:C,flags:f.flags??{}}),a_(y)&&av(m,y),aC(m,y,A,f.flags),{ok:!0,data:k??{}}}async function sj(e,t,n="before-command"){if("android"!==e.device.platform||rf(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await oW({session:e,command:t,phase:n})}catch(e){return{response:{ok:!1,error:$(e)}}}}async function sV(e,t){if(!i_(t,e.device)){var n;let r=(n=e.device,iS[t]?.unsupportedHint?.(n));return{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:`${t} is not supported on this device`,...r?{hint:r}:{}}}}return"android"===e.device.platform&&e.recording&&"record"!==t&&"failed"===(await oK({session:e})).status?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function sB(e){var t;let{session:n,command:r,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==r)return await r9(n.device,r,a,o,{...s});let l=await of({session:n,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 sH(n,l,e.logPath),l}async function sH(e,t,n){let r={snapshotInteractiveOnly:!0,snapshotCompact:!0},i=oo(await a9({device:e.device,session:e,flags:r,logPath:n,snapshotScope:void 0}),r);ou(e,i);let a=await sa({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let sK=s6(()=>import("./lease.js")),sW=s6(()=>import("./session.js").then(e=>e.session_namespaceObject)),sz=s6(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),sJ=s6(()=>import("./react-native.js")),sX=s6(()=>import("./record-trace.js")),sZ=s6(()=>import("./find.js")),sY=s6(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function sQ(e){var t;switch(t=e.req.command,rf(t)?.route??"generic"){case"lease":return await s0(e);case"session":return await s1(e);case"snapshot":return await s2(e);case"reactNative":return await s3(e);case"recordTrace":return await s4(e);case"find":return await s5(e);case"interaction":return await s8(e);case"generic":return null}}async function s0(e){let{handleLeaseCommands:t}=await sK();return s9(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function s1(e){let{handleSessionCommands:t}=await sW();return s9(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 s2(e){let{handleSnapshotCommands:t}=await sz();return s9(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function s3(e){let{handleReactNativeCommands:t}=await sJ();return s9(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function s4(e){let{handleRecordTraceCommands:t}=await sX();return s9(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function s5(e){let{handleFindCommands:t}=await sZ();return s9(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function s8(e){let{handleInteractionCommands:t}=await sY();return s9(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function s6(e){let t;return()=>t??=e()}function s9(e,t,n){if(n)return n;throw new F("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let s7=new h;async function le(e,t,n){let r=s7.getStore()??[];if(r.some(n=>n.locks===e&&n.key===t))return await n();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>s7.run([...r,{locks:e,key:t}],n));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function lt(e){let t=e.device.platform,n=e.device.name.trim(),r=e.device.id;return`${t} device "${n}" (${r})`}function ln(e,t){var n,r,i,a;let o,s,l,c,d,u;return e.recording?(n=e,r=t,o=Z(n.name),s=`agent-device close --session ${o}`,l=`agent-device record stop --session ${o}`,c="selector-conflict"===r?`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 "${n.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=Z(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 n=[],r=e.device,i=nJ(t.platform);if(i&&!nZ(r.platform,i)&&n.push({key:"platform",value:t.platform}),t.target&&t.target!==(r.target??"mobile")&&n.push({key:"target",value:t.target}),t.udid&&("ios"!==r.platform||t.udid!==r.id)&&n.push({key:"udid",value:t.udid}),t.serial&&("android"!==r.platform||t.serial!==r.id)&&n.push({key:"serial",value:t.serial}),t.device&&t.device.trim().toLowerCase()!==r.name.trim().toLowerCase()&&n.push({key:"device",value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=r.simulatorSetPath?.trim();("ios"!==r.platform||"simulator"!==r.kind||e!==i)&&n.push({key:"iosSimulatorDeviceSet",value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=ef(t.androidDeviceAllowlist);"android"===r.platform&&e.has(r.id)||n.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return n}function li(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 la="default";function lo(e){return e.session||la}function ls(e){if(e.meta?.sessionExplicit===!0||(e.session||la)!==la||e.meta?.sessionIsolation==="tenant"||e.flags?.sessionIsolation==="tenant")return;let t=function(e){if(!e||0===e.trim().length)return;let t=function(e){let t=i.resolve(e);try{return a.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(a.existsSync(i.join(t,".git")))return t;let e=i.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(t){var r;return{kind:"cwd",id:(r=t,n.createHash("sha256").update(r).digest("hex").slice(0,16))}}}function ll(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function lc(e,t){let n=ls(e);return!!n&&!!t.sessionScope&&!ll(t,n)}function ld(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 lu(e,t){var n,r,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=(n=e.command,rf(n)?.lockPolicySelectorOverride===!0),y=v?[]:t?lr(t,g):(r=g,i=e.meta?.lockPlatform,f=[],m=nJ(i),void 0!==r.platform&&m&&(a=nJ(r.platform),o=m,a&&o&&a!==o&&("apple"===a?!nX(o):"apple"!==o||!nX(a)))&&f.push({key:"platform",value:r.platform}),m&&(s=f,l=r,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 lf(t)}}(h,c)&&s.push({key:"target",value:h}),function(e,t,n){for(let r of function(e,t){switch(e){case"android":return["udid","iosSimulatorDeviceSet"];case"ios":return["serial","androidDeviceAllowlist"];case"apple":var n;return"desktop"===(n=t).target||"macos"===nJ(n.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return lf(e)}}(n,t)){let n=t[r];ro(n)&&e.push({key:r,value:n})}}(f,r,m)),f),S=e.meta?.lockPlatform;if(0===y.length){return d=v,u=t,p=g,!S||u||void 0!==p.platform||d&&rs(p,ra)||(g.platform=S),{...e,flags:g}}if("strip"===w)return function(e,t,n,r){if(r){lp(e,t),e.platform=r.device.platform;return}lp(e,t),n&&void 0===e.platform&&(e.platform=n)}(g,y,S,t),{...e,flags:g};throw new F("INVALID_ARGS",function(e,t,n){let r=t.map(li).join(", ");if(n)return`${e.command} is already bound to session "${n.name}" on ${lt(n)}, but this request selected ${r}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:"";return`${e.command} is using a bound-session lock${a}, but this request selected ${r}.`}(e,y,t),{session:e.session,conflicts:y.map(li),hint:function(e,t){if(t)return ln(t,"selector-conflict");let n=e.meta?.lockPlatform,r=e.session?` --session ${Z(e.session)}`:"";return"Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. "+(n?`Run agent-device open <app>${r} --platform ${n} first if no session is active. `:`Run agent-device open <app>${r} first if no session is active. `)+"Run agent-device session list to inspect active sessions."}(e,t)})}function lp(e,t){for(let n of t)delete e[n.key]}function lf(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function lm(e){var t,n;let{req:r,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[lh(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return lu(e)}catch{return e}}(r);if("open"===(n=l).command||rs(n.flags,ri))try{let e=await n8(l.flags??{});s.add(lh(e.id))}catch{}return Array.from(s).sort((e,t)=>{let n=lw(e)-lw(t);return 0!==n?n:e.localeCompare(t)})}function lh(e){return`device:${e}`}function lw(e){return+!e.startsWith("session:")}function lg(e,t={}){let n=er(t.simulatorSetPath);return n?["simctl","--set",n,...e]:["simctl",...e]}function lv(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:lg(t,{simulatorSetPath:e.simulatorSetPath})}function ly(e,t,n){return iO(lv(e,t),n)}let lS="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 l_(e){if(!(e instanceof F)||"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 lI(e){return!(e instanceof F)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lb(e){let{port:t,endpoints:n,logPath:r,lastError:i}=e,a="Runner did not accept connection";return new F("COMMAND_FAILED",a,{port:t,endpoints:n,logPath:r,lastError:i?String(i):void 0,reason:ec({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:eu("IOS_RUNNER_CONNECT_TIMEOUT")})}async function lA(e){var t,n;let r,{session:i,port:a,logPath:o}=e,s=await i.testPromise,l="Runner did not accept connection (xcodebuild exited early)",c=ec({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new F("COMMAND_FAILED",l,{port:a,logPath:o,xcodebuild:{exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr},reason:c,hint:(t=s.stdout,n=s.stderr,(r=`${l}
1
+ let e;import{__webpack_require__ as t}from"./rslib-runtime.js";import r,{createHash as n}from"node:crypto";import i from"node:path";import a,{existsSync as o,promises as s}from"node:fs";import l from"node:http";import{fileURLToPath as c,pathToFileURL as d}from"node:url";import"node:https";import u from"node:os";import{once as p}from"node:events";import{Transform as f}from"node:stream";import{pipeline as m}from"node:stream/promises";import{AsyncLocalStorage as h}from"node:async_hooks";import w from"node:fs/promises";import g from"node:net";import{resolveUserPath as v}from"./3267.js";import{screenshotOptionsFromFlags as y,screenshotFlagsFromOptions as S,SCREENSHOT_ACTION_FLAG_KEYS as _}from"./695.js";import{withDiagnosticsScope as I,getDiagnosticsMeta as b,flushDiagnosticsToSessionFile as A,withDiagnosticTimer as x,updateDiagnosticsScope as M,emitDiagnostic as N}from"./7599.js";import{prewarmPngWorker as E,analyzeReactNativeOverlay as D,isKeyboardAction as k,formatScriptArg as P,isReactNativeCollapsedWarningWrapperWithVisibleBanner as C,encodePngAsync as R,appendScriptSeriesFlags as T,decodePngAsync as O,terminatePngWorker as L,formatScriptStringLiteral as $,isReactNativeCollapsedWarningWrapperCandidate as F,formatPortableActionLine as U,createAgentDevice as G,localCommandPolicy as q,isTouchTargetCommand as j,isClickLikeCommand as V,findMistargetedTypeRefToken as B}from"./123.js";import{readProcessStartTime as H,readProcessCommand as K,resolveRuntimeTransportHints as W,isProcessGroupAlive as z,isAgentDeviceDaemonProcess as J,isProcessAlive as X}from"./8656.js";import{toAppErrorCode as Z,asAppError as Y,normalizeError as Q,AppError as ee}from"./9152.js";import{runCmdBackground as et,runCmdStreaming as er,runCmd as en,runCmdSync as ei,resolveExecutableOverridePath as ea,whichCmd as eo}from"./9818.js";import{consumeTextLines as es,serializeDaemonResponseEnvelope as el,normalizeTenantId as ec,shouldStreamRequestProgress as ed,resolveDaemonPaths as eu,resolveSessionIsolationMode as ep,shellQuoteIfNeeded as ef,resolveDaemonServerMode as em,resolveDaemonCodeSignature as eh,serializeDaemonProgressEnvelope as ew,serializeDaemonRpcResponseEnvelope as eg}from"./9238.js";import{resolveAppleSimulatorSetPathForSelector as ev,normalizeRef as ey,resolveApplePlatformName as eS,matchesPlatformSelector as e_,snapshotPresentationOptionsFromFlags as eI,isApplePlatform as eb,findNodeByRef as eA,normalizePlatformSelector as ex,resolveDevice as eM,buildSnapshotPresentationKey as eN,centerOfRect as eE,attachRefs as eD}from"./1644.js";import{runAndroidAdb as ek,resolveIosSimulatorDeviceSetPath as eP,getAndroidBlockingDialogFocus as eC,withRetry as eR,Deadline as eT,isEnvTruthy as eO,openAndroidApp as eL,classifyBootFailure as e$,streamAndroidLogcatWithAdb as eF,bootFailureHint as eU,androidDeviceForSerial as eG,parseSerialAllowlist as eq,retryWithPolicy as ej,getAndroidAppState as eV,classifyAndroidAppTarget as eB,captureAndroidLogcatWithAdb as eH,resolveAndroidSerialAllowlist as eK,isDeepLinkTarget as eW,formatAndroidInstalledPackageRequiredMessage as ez}from"./8806.js";import{INTERNAL_COMMANDS as eJ,parseStringMember as eX,PUBLIC_COMMANDS as eZ,GESTURE_SUBCOMMAND_ERROR as eY,isStringMember as eQ}from"./5898.js";import{parseSwipePreset as e0,SCROLL_DIRECTIONS as e1,parseScrollDirection as e2,getClickButtonValidationError as e3,areRectsApproximatelyEqual as e4,isSystemScrollIndicatorLabel as e5,formatScrollEdgeMessage as e8,deriveMobileSnapshotHiddenContentHints as e6,resolveClickButton as e9,SWIPE_PATTERNS as e7,inferVerticalScrollIndicatorDirections as te,captureScrollEdgeState as tt,normalizeSnapshotTree as tr,runScrollEdgePasses as tn,requireIntInRange as ti,inferGestureReferenceFrame as ta,annotateCoveredSnapshotNodes as to,buildScrollGesturePlan as ts,buildSwipePresetGesturePlan as tl}from"./1620.js";import{sleep as tc}from"./4829.js";import{parseDeviceRotation as td,withSuccessText as tu,successText as tp}from"./1534.js";import{readLocationCoordinate as tf}from"./9673.js";import{findNearestAncestor as tm,normalizeType as th,pruneGroupNodes as tw,findNodeByLabel as tg,resolveRefLabel as tv}from"./7847.js";import{isScrollableType as ty}from"./4778.js";import{readVersion as tS,findProjectRoot as t_}from"./9671.js";import{resolveAndroidAdbProvider as tI,resolveAndroidAdbExecutor as tb}from"./9639.js";import{parseUiHierarchy as tA,ensureAndroidSnapshotHelper as tx,parseUiHierarchyTree as tM,captureAndroidSnapshotWithHelper as tN,captureAndroidSnapshotWithHelperSession as tE,parseAndroidSnapshotHelperManifest as tD,forgetAndroidSnapshotHelperInstall as tk,buildUiHierarchySnapshot as tP,stopAndroidSnapshotHelperSession as tC}from"./221.js";import{applyCommandDefaults as tR}from"./1352.js";var tT,tO,tL={};t.r(tL),t.d(tL,{IH:()=>u3,ug:()=>u4,sE:()=>uz,Bx:()=>uX,hQ:()=>uJ,WX:()=>u2,Co:()=>uY,wg:()=>u1,withAppLogProvider:()=>uH});var t$={};t.r(t$),t.d(t$,{IO:()=>iB,LB:()=>iV,xY:()=>iK,eN:()=>iH,runMacOsPressAction:()=>iJ,runMacOsReadTextAction:()=>iz,rR:()=>iX,r5:()=>iW});var tF={};t.r(tF),t.d(tF,{bu:()=>cg,abortAllIosRunnerSessions:()=>dO,hv:()=>dP,Nr:()=>un,gE:()=>ur,FS:()=>ch,runIosRunnerCommand:()=>ut,stopAllIosRunnerSessions:()=>dL,yA:()=>dT});var tU={};t.r(tU),t.d(tU,{v:()=>dK,M:()=>dW,withAppleRunnerProvider:()=>dz});var tG={};t.r(tG),t.d(tG,{ensureBootedSimulator:()=>pM,SA:()=>pE,EB:()=>pA,N3:()=>pN});var tq={};t.r(tq),t.d(tq,{qx:()=>iA,Ly:()=>iN,Gr:()=>iI,vT:()=>ix,Cc:()=>iM,withAppleToolProvider:()=>ib});var tj={};t.r(tj),t.d(tj,{readLinuxTextAtPoint:()=>ao,r:()=>aa});var tV={};function tB(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}t.r(tV),t.d(tV,{uK:()=>i0,nE:()=>i2,withLinuxToolProvider:()=>i1});let tH=["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 tK(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 tW(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}class tz{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let r=i.dirname(t);a.existsSync(r)||a.mkdirSync(r,{recursive:!0});let n=function(e){var t=e,r=function(e){let t=[];for(let r of e.actions){if("snapshot"===r.command)continue;let n=function(e){let t=function(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>"string"==typeof e)?e.result.selectorChain:[];return t.length>0?t.join(" || "):void 0}(e);if(t&&tJ(e.command))return V(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=tK(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(!tJ(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=${$(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,V(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(P(r)),tX(e,t),T(e,t),e.join(" ");if(1===t.positionals.length)return e.push(P(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(P(r)),tX(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(P(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(P(r)),e.push(P(n)),n.startsWith("@")&&tX(e,t),e.join(" ")}(t,r):void 0);return n||U(e)}(e));return`${n.join("\n")}
2
+ `}(e);return a.writeFileSync(t,n),{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 v(e.saveScriptPath,{cwd:void 0});a.existsSync(this.sessionsDir)||a.mkdirSync(this.sessionsDir,{recursive:!0});let t=tB(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${r}.ad`)}}function tJ(e){return j(e)||"fill"===e||"get"===e}function tX(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(P(r))}class tZ{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new tz(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=v(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 tH)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=tB(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return i.join(this.sessionsDir,tB(e))}ensureSessionDir(e){let t=this.resolveSessionDir(e);return a.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return i.join(this.resolveSessionDir(e),"app.log")}resolveAppLogPidPath(e){return i.join(this.resolveSessionDir(e),"app-log.pid")}static expandHome(e,t){return v(e,{cwd:t})}}function tY(e){return i.join(e,"runner.log")}function tQ(e,t){let r=tB(t&&t.length>0?t:"unknown");return i.join(e,"requests",`${r}.ndjson`)}let t0="app-log.pid";function t1(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 t2(e,t){if(!e)return;let r=i.dirname(e);a.existsSync(r)||a.mkdirSync(r,{recursive:!0});let n={pid:t,startTime:H(t)??void 0,command:K(t)??void 0};a.writeFileSync(e,`${JSON.stringify(n)}
3
+ `)}function t3(e){if(e&&a.existsSync(e))try{a.unlinkSync(e)}catch{}}function t4(e,t){let n=r.createHash("sha256").update(e).digest(),i=r.createHash("sha256").update(t).digest();return r.timingSafeEqual(n,i)}let t5=new Set,t8=new Map,t6="request_canceled",t9="request canceled";function t7(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 re(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++}}(t8);let t=new AbortController;t8.set(e,t),t5.has(e)&&t.abort()}function rt(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++}}(t5),t5.add(e),t8.get(e)?.abort())}function rr(e){e&&(t5.delete(e),t8.delete(e))}function rn(e){return!!e&&t5.has(e)}function ri(e){if(e)return t8.get(e)?.signal}function ra(){return new ee("COMMAND_FAILED",t9,{reason:t6})}function ro(e){if(rn(e))throw ra()}function rs(e){return e instanceof ee&&"COMMAND_FAILED"===e.code&&(e.details?.reason===t6||e.message===t9)}let rl=new Map;function rc(e){let t=r.randomUUID(),n=setTimeout(()=>{rd(t)},9e5);return n.unref(),rl.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),t}function rd(e){let t=rl.get(e);if(t&&(clearTimeout(t.timer),rl.delete(e),t.deleteAfterDownload))try{a.rmSync(t.artifactPath,{force:!0})}catch{}}let ru=new Map;function rp(e,t){let r=ru.get(e);if(!r)throw new ee("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new ee("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function rf(e){let t=ru.get(e);t&&(clearTimeout(t.timer),ru.delete(e),a.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function rm(e){let t=await rh(e);await en("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=i.join(e.tempDir,t);if(!a.existsSync(r))throw new ee("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function rh(e){let t=await en("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new ee("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 ee("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(rw),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 ee("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new ee("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 ee("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 ee("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 ee("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await en("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new ee("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rw(e){if(e.includes("\0"))throw new ee("INVALID_ARGS",`Invalid archive entry: ${e}`);if(i.posix.isAbsolute(e))throw new ee("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=i.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new ee("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function rg(e,t){return new Promise((r,n)=>{let i,o=!1,s=0,l=a.createWriteStream(t),c=e=>{if(!o){if(o=!0,i&&clearTimeout(i),e)return void rv(l,t).finally(()=>n(e));r()}},d=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new ee("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 f({transform(e,t,r){d();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new ee("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{c(new ee("COMMAND_FAILED","Artifact transfer was interrupted"))}),d(),m(e,u,l).then(()=>c(),e=>c(e))})}async function rv(e,t){if(e.destroy(),!e.closed)try{await p(e,"close")}catch{}await a.promises.rm(t,{force:!0}).catch(()=>{})}async function ry(e){let t,r=e.headers["x-artifact-type"],n=e.headers["x-artifact-filename"];if(!r||!n)throw new ee("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new ee("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 ee("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let o=function(e){let t=e.trim(),r=i.basename(t);if(!r||"."===r||".."===r)throw new ee("INVALID_ARGS",`Invalid artifact filename: ${e}`);return r}(n),s=(t=function(e){let t=e?.trim();if(!t)return"request";let r=t.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return r.length>0?r.slice(0,48):"request"}("upload"),a.mkdtempSync(i.join(u.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===r){let t=i.join(s,o);return await rg(e,t),{artifactPath:t,tempDir:s}}let t=i.join(s,"artifact.tar");await rg(e,t);let n=await rm({archivePath:t,tempDir:s,platform:"ios",expectedRootName:o});return a.rmSync(t,{force:!0}),{artifactPath:n,tempDir:s}}catch(e){throw a.rmSync(s,{recursive:!0,force:!0}),e}}let rS=new h;async function r_(e,t){return await rS.run(e,t)}function rI(e){rS.getStore()?.(e)}let rb=new Set(["agent_device.command","agent-device.command"]),rA=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rx=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rM={"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"},rN=new Set([...rb,...rA,...rx,...Object.keys(rM)]);function rE(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rD(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function rk(e,t){e.destroyed||(e.write(eg(t)),e.end())}function rP(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rC(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 rR(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rT(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rO(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new ee("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function rL(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new ee("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function r$(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=Q(new ee("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rE(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=Q(new ee(Z(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rE(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=ec(r.tenantId);if(!e){let e=Q(new ee("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rE(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rF(){let e,t=process.env.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let r=process.env.AGENT_DEVICE_HTTP_AUTH_EXPORT||"default",n=i.isAbsolute(t)?t:i.resolve(t);try{e=await import(d(n).href)}catch(e){throw new ee("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:n,error:e instanceof Error?e.message:String(e)})}let a=e[r];if("function"!=typeof a)throw new ee("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:n,exportName:r});return a}async function rU(e){let t=await rF(),{handleRequest:r,token:n}=e;return l.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!0}));return}if("POST"===e.method&&"/upload"===e.url)return void rG(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void rq(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||rD(i,rE(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rD(i,rE(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rD(i,rE(n.id??null,-32600,"Invalid Request"),400);if(!rN.has(n.method))return void rD(i,rE(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rD(i,rE(n.id??null,-32602,"Invalid params"),400);try{var s;let a=n.params,l=function(e,t,r){if(rb.has(e))return{token:rC(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(rA.has(e)){let e,n=rR(t,"platform");if("ios"!==n&&"android"!==n)throw new ee("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:rC(t,r),session:rR(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rR(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new ee("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new ee("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 ee("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 ee("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 ee("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=rO(e,"owner"),n=rO(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new ee("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new ee("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new ee("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:rL(e,"artifactId")}:(a&&(t=rL(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rO(e,"artifactName")})}(t);throw new ee("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:rT(t,"retentionMs")}}}if(rx.has(e)){let e=rR(t,"materializationId")?.trim();if(!e)throw new ee("INVALID_ARGS","Invalid params: materializationId is required");return{token:rC(t,r),session:rR(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rR(t,"requestId"),materializationId:e}}}let n=rM[e];if(n)return{token:rC(t,r),session:rR(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rR(t,"tenantId")??rR(t,"tenant"),runId:rR(t,"runId"),leaseId:rR(t,"leaseId"),leaseTtlMs:rT(t,"ttlMs"),leaseBackend:rR(t,"backend")}};throw new ee("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(s=n.method,rb.has(s)&&("string"!=typeof l.command||0===l.command.length))return void rD(i,rE(n.id??null,-32602,"Invalid params: command is required"),400);o=t7(l.meta?.requestId,n.id),l.meta={...l.meta,requestId:o},re(o);let c=()=>{i.writableFinished||rt(o)};e.on("aborted",c),i.on("close",c);let d=await r$(t,{headers:e.headers,rpcRequest:n,daemonRequest:l});if(!d.ok)return void rD(i,d.response,d.statusCode);if(d.tenantId&&(l.meta={...l.meta,tenantId:d.tenantId,sessionIsolation:l.meta?.sessionIsolation??l.flags?.sessionIsolation??"tenant"}),ed(l)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await r_(e=>{!i.destroyed&&i.write(ew(e))},async()=>await r(l)),t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rE(n.id??null,-32e3,e.error.message,e.error);rk(i,t);return}let u=await r(l);if(u.ok)return void rD(i,{jsonrpc:"2.0",id:n.id??null,result:u});rD(i,rE(n.id??null,-32e3,u.error.message,u.error),rP(u.error.code))}catch(t){let e=Q(t);if(i.headersSent)return void rk(i,rE(n.id??null,-32e3,e.message,e));rD(i,rE(n.id??null,-32e3,e.message,e),rP(e.code))}finally{rr(o)}})})}async function rG(e,t,n,i){try{var a;let o,s,l=await rj({req:e,res:t,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let c=await ry(e),d=(a={artifactPath:c.artifactPath,tempDir:c.tempDir,tenantId:l.tenantId},o=r.randomUUID(),(s=setTimeout(()=>{rf(o)},3e5)).unref(),ru.set(o,{artifactPath:a.artifactPath,tempDir:a.tempDir,tenantId:a.tenantId,timer:s}),o);t.statusCode=200,t.setHeader("content-type","application/json"),t.end(JSON.stringify({ok:!0,uploadId:d}))}catch(e){rV(t,Q(e))}}async function rq(e,t,r,n){let i=e.url?.slice("/artifacts/".length)??"";if(!i){t.statusCode=400,t.end("Missing artifact id");return}try{let o=await rj({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[i]}});if(!o)return;let s=function(e,t){let r=rl.get(e);if(!r)throw new ee("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new ee("UNAUTHORIZED","Artifact belongs to a different tenant");if(!a.existsSync(r.artifactPath))throw rd(e),new ee("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(i,o.tenantId),l=a.createReadStream(s.artifactPath);t.statusCode=200,t.setHeader("content-type","application/octet-stream"),s.fileName&&t.setHeader("content-disposition",`attachment; filename="${s.fileName.replace(/"/g,"")}"`),l.on("error",e=>{if(t.headersSent)t.destroy(e);else{let r=Q(e);t.statusCode=rP(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rd(i)}),l.pipe(t)}catch(e){rV(t,Q(e))}}async function rj(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=rC({},n.headers),c=(t=l,!(r=o)||t4(t,r)?null:Q(new ee("UNAUTHORIZED","Invalid token")));if(c)return rV(i,c),null;let d=await r$(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 rV(e,t){e.statusCode=rP(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function rB(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function rH(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function rK(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 ee("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class rW{leases=new Map;runBindings=new Map;maxActiveSimulatorLeases;defaultLeaseTtlMs;minLeaseTtlMs;maxLeaseTtlMs;now;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.defaultLeaseTtlMs=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,this.minLeaseTtlMs=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):5e3,this.maxLeaseTtlMs=Number.isInteger(e.maxLeaseTtlMs)?Math.max(this.minLeaseTtlMs,Number(e.maxLeaseTtlMs)):6e5,this.now=e.now??(()=>Date.now())}allocateLease(e){let t=rK(e.backend),n=ec(e.tenantId);if(!n)throw new ee("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=rB(e.runId);if(!i)throw new ee("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");this.cleanupExpiredLeases();let a=this.resolveLeaseTtlMs(e.ttlMs),o=this.bindingKey(n,i,t),s=this.runBindings.get(o);if(s){let e=this.leases.get(s);if(e)return this.refreshLease(e,a);this.runBindings.delete(o)}this.enforceCapacity(t);let l=this.now(),c={leaseId:r.randomBytes(16).toString("hex"),tenantId:n,runId:i,backend:t,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=rH(e.leaseId);if(!t)throw new ee("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);if(!r)throw new ee("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=rH(e.leaseId);if(!t)throw new ee("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=rK(e.backend),r=ec(e.tenantId);if(!r)throw new ee("INVALID_ARGS","tenant isolation requires tenant id.");let n=rB(e.runId);if(!n)throw new ee("INVALID_ARGS","tenant isolation requires run id.");let i=rH(e.leaseId);if(!i)throw new ee("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new ee("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==r||a.runId!==n)throw new ee("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 ee("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 ee("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=ec(t),i=rB(r);if(t&&!n)throw new ee("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&!i)throw new ee("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 ee("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}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 rJ=new h,rX=new h;async function rZ(e,t,r){var n,i;let a=await rY(e,t,r);if(n=t,i=a,!rQ(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 ee("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function rY(e,t,r){try{return await eM(e,t,r)}catch(e){var n;if(n=e,!rQ(t)&&n instanceof ee&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function rQ(e){return!!(e.udid||e.serial||e.deviceName)}async function r0(e){let t=ex(e.platform),r=ev({simulatorSetPath:eP(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=eK(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=rJ.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 ee("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await r5({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return r8(s)?r6(i,await rZ(l,s,{simulatorSetPath:r})):r6(i,await eM(l,s,{simulatorSetPath:r}));let c=await rz({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return r8(s)?r6(i,await rZ(c,s,{simulatorSetPath:r})):r6(i,await eM(c,s,{simulatorSetPath:r}))},a)}async function r1(e){return rJ.getStore()?await e():await rJ.run(new Map,e)}async function r2(e,t){return e?await rX.run(e,t):await t()}async function r3(e,t){return await r2(e,async()=>await r1(t))}async function r4(e){return await r5(e)??await rz(e)}async function r5(e){let t=rX.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function r8(e){return!!e.platform&&"android"!==e.platform&&"linux"!==e.platform}function r6(e,t){return rJ.getStore()?.set(e,{...t}),t}let r9=["platform","target","device","udid","serial"],r7=[...r9,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function ne(e){return"string"==typeof e&&e.trim().length>0}function nt(e,t){return!!e&&t.some(t=>ne(e[t]))}let nr={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},nn=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}}([...no("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},eJ.leaseAllocate,eJ.leaseHeartbeat,eJ.leaseRelease),na(eJ.sessionList,"session",{sessionKind:"inventory",...nr}),na(eZ.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...nr}),na(eZ.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...no("session",{sessionKind:"state"},eZ.boot,eZ.shutdown,eZ.appState),...no("session",{sessionKind:"observability"},eZ.perf,eZ.logs,eZ.network),...no("session",{sessionKind:"replay",skipSessionlessProviderDevice:function(e){return e.command===eZ.test&&("number"==typeof e.flags?.shardAll||"number"==typeof e.flags?.shardSplit)}},eZ.replay,eZ.test),na(eJ.runtime,"session"),na(eZ.clipboard,"session",{replayScopedAction:!0}),na(eZ.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...no("session",{},eZ.install,eZ.reinstall,eJ.installSource),na(eJ.releaseMaterializedPaths,"session",nr),...no("session",{},eZ.push,eZ.triggerAppEvent),na(eZ.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...no("session",{},eZ.prepare,eZ.batch),na(eZ.close,"session",{allowInvalidRecording:!0}),...no("snapshot",{replayScopedAction:!0},eZ.snapshot,eZ.diff,eZ.wait,eZ.alert,eZ.settings),na(eZ.reactNative,"reactNative",{replayScopedAction:!0}),na(eZ.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),na(eZ.trace,"recordTrace"),na(eZ.find,"find",{replayScopedAction:!0}),...no("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},eZ.click,eZ.fill,eZ.longPress,eZ.press,eZ.type),...no("interaction",{replayScopedAction:!0},eZ.get,eZ.is),...no("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},eZ.back,eZ.gesture,eZ.home,eZ.rotate,eZ.scroll,eZ.swipe,"pinch"),na(eZ.focus,"generic",{androidBlockingDialogGuard:!0}),na(eZ.screenshot,"generic",{replayScopedAction:!0}),...no("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function ni(e){return ns(e)?.sessionKind}function na(e,t,r={}){return{command:e,route:t,...r}}function no(e,t,...r){return r.map(r=>na(r,e,t))}function ns(e){return nn.descriptorsByCommand.get(e)}let nl=[{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");nf(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&eb(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(tU);nf(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&&eb(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(tq);nf(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);nf(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(tL);nf(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");nf(t,e.recording,r)}}];async function nc(e,t){let r=await nd(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await np(r);return await nm(i,async()=>await t(n))}async function nd(e){var t,r,n;if(t=e.providers,!nl.some(e=>!!t[e.resolverKey]))return{};let i=await nu(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return nl.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function nu(e,t){switch(function(e,t){var r;let n,i;if(t.hasExistingSession)return ns(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(r=e,"function"==typeof(i=ns(r.command)?.skipSessionlessProviderDevice)&&i(r))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(n=ns(e.command)?.allowSessionlessDefaultDevice)&&n(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:nt(e.flags,r9)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await r0(e.flags??{});case"skip":return}}async function np(e){let t=[];for(let r of nl)await r.appendWrapper(e,t);return t}function nf(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function nm(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function nh(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 ee("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let nw=/^[A-Za-z0-9_.:-]{1,64}$/,ng="--launch-console is supported only for iOS simulator app launches",nv="--launch-console requires a direct app launch and cannot be used with URL opens",ny=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];async function nS(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await tc(t)}async function n_(e,t){let{x:r,y:n}=nE(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,...tp(`Long pressed (${r}, ${n})`)}}async function nI(e,t){let{x:r,y:n}=nE(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...tp(`Focused (${r}, ${n})`)}}async function nb(e,t,r){let n=B(t[0]);if(n)throw new ee("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 ee("INVALID_ARGS","type requires text");let a=ti(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...tp(nJ("Typed",i))}}async function nA(e,t,r){if(r?.directElementSelector)return await nx(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 ee("INVALID_ARGS","fill requires x y text");let o=ti(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...tp(nJ("Filled",a))}}async function nx(e,t,r,n){if(!e.fillElementSelector)throw new ee("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new ee("INVALID_ARGS","fill requires text");let a=ti(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...tp(nJ("Filled",i))}}async function nM(e,t,r,n){var i,a,o,s;if(n?.directElementSelector&&"ios"===e.platform)return await nN(t,n.directElementSelector);let{x:l,y:c}=nE(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await nD(l,c,n);let d=e9(n);if("primary"!==d)return await nk(e,l,c,d,n);let u=(s=n,{count:nC(s?.count,1,"count",1,200),intervalMs:nC(s?.intervalMs,0,"interval-ms",0,1e4),holdMs:nC(s?.holdMs,0,"hold-ms",0,1e4),jitterPx:nC(s?.jitterPx,0,"jitter-px",0,100),doubleTap:!!s?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new ee("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new ee("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(u),i=u.count,a=u.holdMs,o=u.jitterPx,eb(e.platform)&&i>1&&0===a&&0===o)?await nR(e,l,c,u,n):await nT(t,l,c,u)}async function nN(e,t){if(!e.tapElementSelector)throw new ee("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...tp(`Tapped ${t.raw}`)}}function nE(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new ee("INVALID_ARGS",t,r);return{x:n,y:i}}async function nD(e,t,r){let n=e9(r);if("primary"!==n)throw new ee("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(t$);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...tp(nW({x:e,y:t}))}}async function nk(e,t,r,n,i){if(function(e,t,r){let n=e3({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 nP(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},nO(i)),{x:t,y:r,button:n,...tp(nW({x:t,y:r,button:n}))}}async function nP(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,...tp(nW({x:e,y:t,button:r}))}}function nC(e,t,r,n,i){return ti(void 0===e?t:e,r,n,i)}async function nR(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},nO(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,...tp(nW({x:t,y:r}))}}async function nT(e,t,r,n){let i;return await nS(n.count,n.intervalMs,async a=>{let[o,s]=function(e,t){if(t<=0)return[0,0];let[r,n]=ny[e%ny.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}),tu({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},nW({x:t,y:r}))}function nO(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId}}async function nL(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 ee("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await nF({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function n$(e,t,r,n){let i=e0(r[0]),a=r[1]?Number(r[1]):300,o=ta((await t.snapshot({appBundleId:n?.appBundleId,compact:!0})).nodes??[]);if(!o)throw new ee("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=tl(i,o,{platform:e.platform});return await nF({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function nF(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:c}=e,d=ti(l,"durationMs",16,1e4),u=ti(n?.count??1,"count",1,200),p=ti(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if(!eQ(e7,f))throw new ee("INVALID_ARGS",`Invalid pattern: ${f}`);if(eb(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,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,...tp(nz(u,f))}}return await nS(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)}),tu({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}`:nz(u,f))}async function nU(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 ee("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=ti(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??{},...tp(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function nG(e,t){let r=eX(e1,t[0],{message:"fling direction must be up, down, left, or right"}),n=Number(t[1]),i=Number(t[2]);if(![n,i].every(Number.isFinite))throw new ee("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new ee("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=ti(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,...tp(`Flung ${r}`)}}async function nq(e,t,r){var n;let i=t[0],a=t[1]?Number(t[1]):void 0,o=r?.pixels;if(!i)throw new ee("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new ee("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==o)throw new ee("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:e2(n)},l={},c=0;if(s.edge){let t=s.edge,n=await tn({edge:t,captureState:async n=>await nj(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 tu({direction:s.direction,...s.edge?{edge:s.edge,passes:c}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},e8(s.direction,s.edge,c,a,o))}async function nj(e,t,r,n){if("function"!=typeof e.snapshot)throw new ee("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await tt({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,compact:!0,scope:e})).nodes??[]})}async function nV(e,t,r,n){if("tv"===e.target)throw new ee("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new ee("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 ee("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...tp(`Pinched to scale ${i}`)}}async function nB(e,t,r){if("tv"===e.target)throw new ee("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new ee("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 ee("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 ee("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 ee("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 ee("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,...tp(`Rotated gesture ${n} degrees`)}}async function nH(e,t,r){if("tv"===e.target)throw new ee("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new ee("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 ee("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new ee("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:ti(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...tp(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function nK(e,t,r){let{x:n,y:i}=nE(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(tj);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(t$);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 nW(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function nz(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function nJ(e,t){return`${e} ${Array.from(t).length} chars`}function nX(e,t){let r,n=t?.subject??"Payload",i=e.trim();if(!i)throw new ee("INVALID_ARGS",`${n} cannot be empty`);let o=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!a.statSync(o).isFile())throw new ee("INVALID_ARGS",`${n} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof ee)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new ee("INVALID_ARGS",`${n} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new ee("COMMAND_FAILED",`Unable to read ${n} file: ${o}`,{cause:String(t)})}if((r=i.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:i};throw new ee("INVALID_ARGS",`${n} file not found: ${o}`)}async function nZ(e){let t=nX(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await nY(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new ee("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof ee)throw t;throw new ee("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function nY(e){try{return await s.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new ee("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new ee("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new ee("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new ee("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function nQ(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},o=await nh(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 n0(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function n0(e,t,r,n,i,a,o){switch(r){case"open":return await n1(e,t,n,a);case"close":{let e=n[0];if(!e)return{closed:"session",...tp("Closed session")};return await t.close(e),{app:e,...tp(`Closed: ${e}`)}}case"press":return await nM(e,t,n,a);case"swipe":return await nL(e,t,n,a);case"swipe-preset":return await n$(e,t,n,a);case"pan":return await nU(t,n);case"fling":return await nG(t,n);case"longpress":return await n_(t,n);case"focus":return await nI(t,n);case"type":return await nb(t,n,a);case"fill":return await nA(t,n,a);case"scroll":return await nq(t,n,a);case"pinch":return await nV(e,t,n,a);case"rotate-gesture":return await nB(e,t,n);case"transform-gesture":return await nH(e,t,n);case"trigger-app-event":return await n2(e,t,n,a);case"screenshot":return await n3(t,n,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...tp("Back")};case"home":return await t.home(),{action:"home",...tp("Home")};case"rotate":{let e=td(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...tp(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...tp("Opened app switcher")};case"clipboard":return await n4(t,n);case"keyboard":return await n5(e,n,a,o);case"settings":return await n9(e,t,n,a);case"push":return await n7(e,n,a);case"snapshot":return await ie(t,a);case"read":return await nK(e,n,a);default:throw new ee("INVALID_ARGS",`Unknown command: ${r}`)}}async function n1(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new ee("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new ee("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new ee("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...tp("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new ee("UNSUPPORTED_OPERATION",ng);if("linux"===e.platform&&s&&s.length>0)throw new ee("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(eW(i))throw new ee("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!eW(a))throw new ee("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new ee("INVALID_ARGS",nv);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...tp(`Opened: ${i}`)}}if(o&&eW(i))throw new ee("INVALID_ARGS",nv);if(n?.clearAppState){if(eW(i))throw new ee("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}:{},...tp(`Opened: ${i}`)}}async function n2(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new ee("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!nw.test(t))throw new ee("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 ee("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 ee("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 ee("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof ee)throw t;throw new ee("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 ee("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 ee("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",...tp(`Triggered app event: ${i}`)}}async function n3(e,t,r,n){let a=t[0]??r??`./screenshot-${Date.now()}.png`;await s.mkdir(i.dirname(a),{recursive:!0});let o=y(n);return await e.screenshot(a,{appBundleId:n?.appBundleId,fullscreen:o.fullscreen,stabilize:o.stabilize,surface:n?.surface}),{path:a,...tp(`Saved screenshot: ${a}`)}}async function n4(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new ee("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new ee("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new ee("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,...tp("Clipboard updated")}}async function n5(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!k(i))throw new ee("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new ee("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await n8(e,i);if("ios"===e.platform)return await n6(e,i,r,n);throw new ee("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function n8(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...tp("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 n6(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new ee("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,...tp("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,...tp(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function n9(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new ee("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new ee("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?tu({setting:i,state:"clear",...s},it(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...tp(`Cleared user data for ${r}`)}}if(!a)throw new ee("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:tf(o,"latitude"),longitude:tf(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?tu({setting:i,state:a,...u},it(u)??`Updated setting: ${i}`):{setting:i,state:a,...tp(`Updated setting: ${i}`)}}async function n7(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new ee("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await nZ(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...tp(`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,...tp(`Pushed notification to ${n}`)}}async function ie(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 it(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let ir=e=>"macos"!==e.platform,ii=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,ia=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,io={device:!0},is={},il={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},ic={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,supports:ir},id={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,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:is,supports:e=>"android"===e.platform||ii(e),unsupportedHint:ia},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,supports:e=>"android"===e.platform||ii(e),unsupportedHint:ia},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,supports:e=>"android"===e.platform||ii(e),unsupportedHint:ia},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,supports:ir},open:il,close:il,reinstall:ic,install:ic,"install-from-source":ic,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,supports:ir},shutdown:{apple:{simulator:!0},android:{emulator:!0},linux:is},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io,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:is,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:io},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},snapshot:il,diff:il,screenshot:il,wait:il,get:il,find:il,is:il,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io,supports:ir},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,supports:ir},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,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:io},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,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:is},type:il};function iu(e,t){let r=id[e];if(!r)return!0;let n=eb(t.platform)?r.apple:"linux"===t.platform?r.linux:r.android;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}function ip(e,t=e=>e){let r=new h;return{resolve:n=>n?t(n):r.getStore()??e,run:async(e,n)=>e?await r.run(t(e),n):await n(),hasScope:()=>!!r.getStore()}}function im(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function ih(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 ee("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 ee("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 ee("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 ee("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 ee("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await iw(e,t,r)}}async function iw(e,t,r){let n=["/Applications","/System/Applications",i.join(u.homedir(),"Applications")],a=new Set;for(let t of n){let r=await s.stat(t).catch(()=>null);if(!r?.isDirectory())continue;let n=await e("find",[t,"-maxdepth","4","-type","d","-name","*.app"],{allowFailure:!0});if(0===n.exitCode)for(let e of n.stdout.split("\n")){let t=e.trim();t&&a.add(t)}}return im((await Promise.all(Array.from(a).map(async e=>{let r=await ig(e,t).catch(()=>({})),n=r.bundleId;return n?{bundleId:n,name:r.appName??i.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function ig(e,t){for(let r of[i.join(e,"Contents","Info.plist"),i.join(e,"Info.plist")]){let e=await t(r),n=iv(e,"CFBundleIdentifier"),i=iv(e,"CFBundleDisplayName"),a=iv(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function iv(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let iy={runCommand:en,simctl:{run:async(e,t)=>await en("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await en("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await iE(en,e)},macosHost:ih(en,async e=>await iE(en,e)),whichCommand:eo},iS=ip(iy,function(e){return"function"==typeof e?i_({runCommand:e}):i_(e)});function i_(e={}){let t={...iy,...e},r=e.plist??{readJson:async e=>await iE(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??ih(t.runCommand,async e=>await r.readJson(e))}}function iI(e){return iS.resolve(e)}async function ib(e,t){return await iS.run(e,t)}function iA(){return iS.hasScope()}async function ix(e,t,r){return await iI().runCommand(e,t,r)}async function iM(e,t){let r=iI(),[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 ix("xcrun",e,t)}async function iN(e){return await iI().plist?.readJson(e)??null}async function iE(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 iD="agent-device-macos-helper",ik="AGENT_DEVICE_MACOS_HELPER_BIN",iP=i.join(u.homedir(),".agent-device","macos-helper","current"),iC=i.join(iP,"manifest.json"),iR=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function iT(e){let t=e.trim();if(!iR.test(t))throw new ee("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function iO(e,t){t.bundleId&&e.push("--bundle-id",iT(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iL(){return function(e){let t=i.dirname(e);for(;;){let e=i.join(t,"macos-helper");if(o(i.join(e,"Package.swift")))return e;let r=i.dirname(t);if(r===t)break;t=r}throw new ee("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(c(import.meta.url))}async function i$(e){let t=await s.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=i.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await i$(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function iF(e){let t=await i$(e),r=n("sha256");for(let n of t)r.update(i.relative(e,n)),r.update("\0"),r.update(await s.readFile(n)),r.update("\0");let a=await ix("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return r.update("swift-version"),r.update("\0"),r.update(a.stdout||a.stderr||`exit:${a.exitCode}`),r.update("\0"),r.digest("hex")}async function iU(){try{let e=JSON.parse(await s.readFile(iC,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function iG(){let e=await ea(process.env[ik],ik);if(e)return e;let t=iL(),r=await iF(t),n=i.join(iP,iD);try{if(await iU()===r)return await s.access(n),n}catch{}let a=i.join(iL(),".build","release",iD);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await ix("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await s.mkdir(iP,{recursive:!0});let o=`${n}.tmp`;return await s.copyFile(a,o),await s.rename(o,n),await s.chmod(n,493),await s.writeFile(iC,`${JSON.stringify({fingerprint:r},null,2)}
4
+ `,"utf8"),n}async function iq(){let e=process.env[ik]?.trim();if(e){let t=await ea(e,ik);if(t)return t}if(iA())return iD;if("darwin"!==process.platform)throw new ee("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await iG()}async function ij(e){let t={allowFailure:!0,timeoutMs:3e4},r=iI().macosHelper,n=r?iD:await iq(),i=r?await r.run(e,t):await ix(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 ee("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 iV(){return await ij(["app","frontmost"])}async function iB(e){return await ij(["app","quit","--bundle-id",iT(e)])}async function iH(e,t){return await ij(["permission",e,t])}async function iK(e,t={}){let r=["alert",e];return iO(r,t),await ij(r)}async function iW(e,t={}){let r=["snapshot","--surface",e];return iO(r,t),await ij(r)}async function iz(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return iO(n,r),await ij(n)}async function iJ(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return iO(n,r),await ij(n)}async function iX(e,t={}){let r=["screenshot","--out",e];return iO(r,t),t.fullscreen&&r.push("--fullscreen"),await ij(r)}let iZ={"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"},iY={runCommand:en,whichCommand:eo,desktop:i3(en,eo),clipboard:i4(en,eo),screenshot:i5(en,eo)},iQ=ip(iY,function(e={}){let t={...iY,...e};return{...t,desktop:e.desktop??i3(t.runCommand,t.whichCommand),clipboard:e.clipboard??i4(t.runCommand,t.whichCommand),screenshot:e.screenshot??i5(t.runCommand,t.whichCommand)}});function i0(e){return iQ.resolve(e)}async function i1(e,t){return await iQ.run(e,t)}async function i2(e,t,r){return await i0().runCommand(e,t,r)}function i3(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 tc(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 i4(e,t){return{async readText(){let r=i9[await at(t,i8)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=i7[await at(t,i8)](r);await e(n.cmd,n.args,n.options)}}}function i5(e,t){return{async capture(r){let n=ae[await at(t,i6)](r);await e(n.cmd,n.args,n.options)}}}let i8={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."},i6={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."},i9={"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}}},i7={"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}})},ae={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 at(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 ee("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let ar="atspi-dump.py",an=null;async function ai(e,t={}){let r,n=i0().accessibility;if(n)return await n.captureTree(e,t);if("linux"!==process.platform)throw new ee("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await i0().whichCommand("python3"))throw new ee("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let o=t.maxNodes??1500,s=t.maxDepth??12,l=t.maxApps??24,d=[function(){if(an)return an;let e=i.dirname(c(import.meta.url));for(let t=0;t<5;t++){let r=i.join(e,"src","platforms","linux",ar);if(a.existsSync(r))return an=r,r;if(0===t){let t=i.join(e,ar);if(a.existsSync(t))return an=t,t}e=i.dirname(e)}throw new ee("TOOL_MISSING",`Cannot find ${ar}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(l)],u=await i2("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 ee("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new ee("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new ee("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new ee("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=iZ[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 aa(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 ai(t);return{nodes:r.nodes,truncated:r.truncated}}async function ao(e,t,r){let{nodes:n}=await aa(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:as(e.rect)-as(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 as(e){return(e?.width??0)*(e?.height??0)}let al=[250,400,600];function ac(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?af(n?.nodes??[]):void 0,routeComparable:i}}function ad(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 au(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function ap(e){return"press"===e||"click"===e||"back"===e||"open"===e}function af(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 am(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:e9(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function ah(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!aI(r))return;let s=function(e){if("click"===e||"press"===e)return"press"}(n);if(!s||!(2===(t=i).length&&t.every(e=>Number.isFinite(Number(e)))))return;let l=ay(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:av(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function aw(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function ag(e){let{session:t,pending:r,snapshot:n}=e,i=aS(r.preSignature,ay(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await nQ(t.device,r.command,r.positionals,r.flags?.out,{...am(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 av(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function ay(e){let t=new Map,r=[];for(let n of e){let e=function(e,t){var r,n;if(!e.rect||!([(r=e.rect).x,r.y,r.width,r.height].every(e=>Number.isFinite(e))&&r.width>0&&r.height>0)||(n=e,`${n.label??""} ${n.identifier??""}`.toLowerCase().includes("scroll bar")))return;let i=function(e){let t=[e.identifier,e.label,e.value,e.type,e.role,!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].map(e=>"string"==typeof e?e.trim():"").join("|");return t.replaceAll("|","")?t:void 0}(e);if(!i)return;let a=t.get(i)??0;return t.set(i,a+1),{key:`${i}|#${a}`,x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height)}}(n,t);e&&r.push(e)}return r}function aS(e,t){return 0===e.length||0===t.length?"ambiguous":a_(e,t)?"unchanged":"changed"}function a_(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 aI(e){return"ios"===e.device.platform||"android"===e.device.platform}function ab(e,t,r=[],n){var i,a,o;aM(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 aA(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function ax(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!aM(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=ay(e.readSnapshot(o).nodes);for(;Date.now()-i<1500;){await tc(200),a+=1;let l=await r(),c=ay(e.readSnapshot(l).nodes);if(a_(s,c))return aA(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 aA(t),N({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function aM(e){return"ios"===e||"android"===e}function aN(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let aE=new WeakMap;function aD(e,t){if(!e[t])return[];let r=aC(e)[t]??t+1;return e.slice(t+1,r)}function ak(e,t,r){let n=aC(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function aP(e,t,r){let n=aC(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function aC(e){let t=aE.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 aE.set(e,r),r}function aR(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 aT(e,t){let r=th(e.type??""),n=e.label?.trim();return!!(aO(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function aO(e){return"button"===th(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function aL(e){let t=th(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function a$(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function aF(e){let t;for(let i of e){var r,n;let e=th(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||aU(r)>aU(n)))&&(t=i.rect)}return t}function aU(e){return e?e.width*e.height:0}function aG(e){let t=th(e.type??"");return"scrollview"===t||"scrollarea"===t}function aq(e,t){return!0===e||!!t||void 0}function aj(e,t,r,n){aP(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=th(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function aV(e,t,r,n){aP(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=th((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function aB(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===th(n.type??"")&&t(n,i,r)}}function aH(e,t,r,n){for(let i of e)(aT(i,t)||n&&aW(i,n))&&r.add(i.index)}function aK(e,t,r){if("button"!==th(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&e4(e.rect,t.rect)}function aW(e,t){return"button"===th(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&e4(e.rect,t.rect)}let az=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=aF(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"===th(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),aP(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==th(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&&e5(t))})(r)&&function(e,t,r){var n,i,a,o;aL(e.type)||r.suppressedIndexes.add(e.index);let s=te(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&aL(e.type)?e:null)??aR(e,t,e=>aL(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,a$(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:aq(i.hiddenContentAbove,o.above),hiddenContentBelow:aq(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"!==th(n.type??""))continue;if("Search"===n.label){aV(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=ak(e,r,e=>"searchfield"===th(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),aV(e,r,i.index,t))}})(e,o),r=e,n=o,aB(r,(e,t,i)=>{ak(r,i,r=>{let n;return("button"===(n=th(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(e4(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=th(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,aB(i,(e,t,r)=>{let n;F(e)&&C(e,(n=[],aP(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=th(r.type??"");if("statictext"===a||"link"===a)return aj(e,t,n,i);if("other"===a){if(function(e,t,r){return!!ak(e,t,e=>{let t=th(e.type??"");return("link"===t||"searchfield"===t||aL(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);aj(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=aF(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==th(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)||!aR(e,t,aG)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=aU(e),i=aU(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&a$(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=th(r.type??"");if("button"===a)return aH(aD(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=aD(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==th(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=>aK(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&a$(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&&(aK(a,t,r)||aW(a,t)||function(e,t){if("switch"!==th(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||aT(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=>aK(e,t,r));if(!i){e.some(aO)&&aH(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&a$(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),aH(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function aJ(e){let t=await aX(e);if(t)return t;let r=await aQ(e);return au(e.session),{snapshot:a6(r,a5(e)),analysis:r.analysis,androidSnapshot:r.androidSnapshot}}async function aX(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!aI(e)||Date.now()-t.markedAt>3e4?void aw(e):t}(e.session);if(t&&e.session)return await aZ({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await a2({...e,session:e.session});let r=ad(e.session);if(r&&"android"===e.device.platform)return await a0(e,r)}async function aZ(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await aY(e,t,await a3(e)),l=await ag({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await aY(e,t,await a3(e)),l=await ag({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(aw(i),s=await ax({session:i,initial:s,capture:async()=>await a3(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.freshness?.staleAfterRetries!==!0&&au(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 aY(e,t,r){let n=r;return"unchanged"!==aS(t.preSignature,ay(n.snapshot.nodes))?n:(await tc(500),n=await a3(e))}async function aQ(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await aa(r?.surface);return a9({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?a9(await iW(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await nQ(t,"snapshot",[],i,{...am(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath)})}async function a0(e,t){let r=await a1(e,t);return{snapshot:r.snapshot,analysis:r.data.analysis,androidSnapshot:r.data.androidSnapshot,freshness:r.freshness}}async function a1(e,t){let r=await a4(e),n=a8(r,t,e),i=0,a=t.markedAt+1500;for(let o of al){if(!n)break;let s=a-Date.now();if(s<=0)break;await tc(Math.min(o,s)),r=await a4(e),i+=1,n=a8(r,t,e)}return n||au(e.session),{...r,freshness:i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0}}async function a2(e){let t=await ax({session:e.session,capture:async()=>await a3(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,analysis:t.data.analysis,androidSnapshot:t.data.androidSnapshot,freshness:t.freshness}}async function a3(e){let t=ad(e.session);return t&&"android"===e.device.platform?await a1(e,t):await a4(e)}async function a4(e){let t=await aQ(e);return{data:t,snapshot:a6(t,a5(e))}}function a5(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function a8(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&&ap(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=af(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 a6(e,t){var r,n,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=tr(s?o:tw(o)),c=t?.snapshotScope&&e?.backend!=="macos-helper"?a7(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 az)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:eD(s?d:to(d)),truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,presentationKey:eN(eI(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&a?.snapshotCompact!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function a9(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=a7(i,t.snapshotScope)),t.snapshotInteractiveOnly&&(i=function(e){if(0===e.length)return e;let t=new Map;for(let r of e)t.set(r.index,r);let r=new Set;for(let n of e){if(!function(e){if(e.focused||e.hittable||e.rect)return!0;let t=`${e.type??""} ${e.role??""} ${e.subrole??""}`.toLowerCase();return t.includes("button")||t.includes("menu")||t.includes("textfield")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")}(n))continue;let e=n;for(;e&&!r.has(e.index);)r.add(e.index),e="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0}return 0===r.size?e:oe(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=oe(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function a7(e,t){let r=tg(eD(e),t);if(!r)return[];let n=e.findIndex(e=>e.index===r.index);if(-1===n)return[];let i=e[n]?.depth??0,a=[];for(let t=n;t<e.length;t+=1){let r=e[t];if(!r)continue;let o=r.depth??0;if(t>n&&o<=i)break;a.push(r)}return oe(a,i)}function oe(e,t=0){let r=new Map;for(let[t,n]of e.entries())r.set(n.index,t);return e.map((e,n)=>({...e,index:n,depth:Math.max(0,(e.depth??0)-t),parentIndex:"number"==typeof e.parentIndex?r.get(e.parentIndex):void 0}))}function ot(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return aN("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=ey(e.trim());if(!n)return aN("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=eA(e.nodes,n);if(r=t?tv(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:aN("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function or(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function on(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 oi(e){let{session:t,sessionName:r,outPath:n,outputPlacement:a,dispatchContext:o}=e,l=G({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?oa(await nQ(t.device,"screenshot",[],i,o)):oa(await nQ(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:o}),artifacts:{resolveInput:async()=>{throw new ee("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-screenshot-")),r=i.join(t,"screenshot.png")),await s.mkdir(i.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await s.mkdtemp(i.join(u.tmpdir(),`${e.prefix}-`));return{path:i.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}}},sessions:on({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:q()});return await l.capture.screenshot({session:r,requestId:o.requestId,appBundleId:t.appBundleId,...y(o),surface:t.surface,...n?{out:{kind:"path",path:n}}:{}})}function oa(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function oo(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function os(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 ol(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let oc=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function od(e,t={}){let r=tI(e,t.helperAdb).exec;return(await oh(e,t,r)).xml}async function ou(e,t={}){let r=tI(e,t.helperAdb).exec,n=await oh(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=tA(i,void 0,t),s=op(o.truncated,n.metadata);return a&&function(e,t){for(let[r,n]of e){let e=t[r];e&&(n.hiddenContentAbove&&(e.hiddenContentAbove=!0),n.hiddenContentBelow&&(e.hiddenContentBelow=!0))}}(await ox(e,o.nodes,i,r),o.nodes),{...o,...of(s),androidSnapshot:n.metadata}}let o=tM(i),s=tP(o,void 0,t),l=op(s.truncated,n.metadata);a&&await om({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:c,...d}=s;return{...d,...of(l),androidSnapshot:n.metadata}}function op(e,t){return!0===e||!0===t.helperTruncated||e}function of(e){return!0===e?{truncated:!0}:{}}async function om(e){if(oN(e.interactiveSnapshot.nodes).size>0||oM(e.xml))return;let t=tP(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await ox(e.device,t.nodes,e.xml,e.adb);oR(r,t,e.interactiveSnapshot),0===r.size&&oR(e6(eD(t.nodes)),t,e.interactiveSnapshot)}async function oh(e,t,r){let n=await x("android_snapshot_helper_artifact_resolution",async()=>await ob(t.helperArtifact));return n.artifact?await ow(e,t,r,n.artifact):(N({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await oA(e,n.fallbackReason,r))}async function ow(e,t,r,n){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),c=tI(e,t.helperAdb);try{let e=await og(t,r,c,n,l);return e.installed&&await tC(l),a=await ov(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 oy({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function og(e,t,r,n,i){let a=await x("android_snapshot_helper_install",async()=>await tx({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 ov(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 tE(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:Q(e).message}}),await oS(t,n.manifest.packageName)}return await x("android_snapshot_helper_capture",async()=>await tN(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function oy(e){let t=function(e){var t;let r=Q(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=oI(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=o_(e);return new ee(Z(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=o_(e.error);return N({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tC(e.helperDeviceKey),await oS(e.adb,e.artifact.manifest.packageName),tk({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oA(e.device,r,e.adb)}async function oS(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await tc(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:Q(e).message}})}}function o_(e){let t=Q(e),r=oI(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 oI(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 ob(e){if(e)return{artifact:e};let t=tS(),r=i.join(t_(),"android-snapshot-helper","dist"),n=i.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await w.access(n)}catch{return{}}try{let e=tD(JSON.parse(await w.readFile(n,"utf8"))),t=i.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await w.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:Q(e).message}}}async function oA(e,t,r){let n;try{n=await x("android_snapshot_stock_capture",async()=>await oE(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new ee(Z((r=Q(i)).code),`${r.message} Android snapshot helper failed before stock fallback: ${a}`,{...r.details,androidSnapshotHelperFallbackReason:a,...r.hint?{hint:r.hint}:{}},i)}throw e}return{xml:n,metadata:{backend:"uiautomator-dump",...t?{fallbackReason:t}:{}}}}async function ox(e,t,r,n){if(!t.some(e=>ty(e.type)))return new Map;let i=oN(t);if(i.size>0||oM(r))return i;let a=await oC(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(ty(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=>ol(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||!ty(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=>ol(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=oo(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(!os(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(!os(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?oo(o):a.length>0?oo(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 oM(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function oN(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 oE(e,t=tb(e)){try{return await eR(()=>oD(t),{shouldRetry:oP})}catch(t){var r,n;let e;if((r=t)instanceof ee&&"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 ee("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 oD(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=ok(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}
5
+ ${r}`,i=/dumped to:\s*(\S+)/i.exec(n),i?.[1]);if(0!==l.exitCode&&!c)throw new ee("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=ok(d.stdout,d.stderr);if(!u)throw new ee("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:d.stdout,stderr:d.stderr});return u}function ok(e,t){let r=`${e}
6
+ ${t}`,n=r.indexOf("<?xml"),i=n>=0?n:r.indexOf("<hierarchy");if(i<0)return null;let a=r.lastIndexOf("</hierarchy>");if(a<0||a<i)return null;let o=r.slice(i,a+12).trim();return o.length>0?o:null}function oP(e){if(!(e instanceof ee)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return oc.some(e=>r.includes(e))}async function oC(e,t=tb(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),r=`${e.stdout}
7
+ ${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function oR(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 oT=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,oO=/^close app$/i,oL="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function o$(e){let t,{session:r}=e;if("android"!==r.device.platform||!r.recording)return{status:"absent"};try{t=await oV(r)}catch(e){return N({level:"warn",phase:"android_blocking_dialog_inspection_failed",data:{session:r.name,deviceId:r.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"unknown",reason:"inspection-failed"}}let n=oH(t);if(!n?.rect)return{status:"absent"};try{let e=await oB(r,n);if(!e.ok)return N({level:"warn",phase:"android_blocking_dialog_tap_failed",data:{session:r.name,deviceId:r.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:"failed",reason:"tap-failed"};if(!await oK(r))return N({level:"warn",phase:"android_blocking_dialog_still_present",data:{session:r.name,deviceId:r.device.id}}),{status:"failed",reason:"dismiss-failed"};if(r.appBundleId&&(await eL(r.device,r.appBundleId),!await oW(r,r.appBundleId)))return N({level:"warn",phase:"android_blocking_dialog_relaunch_unfocused",data:{session:r.name,deviceId:r.device.id,appBundleId:r.appBundleId}}),{status:"failed",reason:"relaunch-failed"};return N({level:"warn",phase:"android_blocking_dialog_recovered",data:{session:r.name,deviceId:r.device.id,appBundleId:r.appBundleId,x:e.x,y:e.y}}),{status:"recovered"}}catch(e){return N({level:"warn",phase:"android_blocking_dialog_recovery_failed",data:{session:r.name,deviceId:r.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"failed",reason:"error"}}}async function oF(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await eC(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await oU(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 oq({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 oq({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${oj(a)}. Automatic recovery failed.`,hint:oL})}throw oq({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${oj(a)}.`,hint:oL})}async function oU(e){try{return await oG(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 oG(e){if(!e.appBundleId)return!1;let t=oH(await oV(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await oB(e,t);if(!r.ok)return!1;await eL(e.device,e.appBundleId);let n=await oW(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 oq(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new ee("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function oj(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function oV(e){return eD(tw((await ou(e.device,{interactiveOnly:!1,compact:!1})).nodes))}async function oB(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=eE(t.rect),i=await ek(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 oH(e,t={}){if(!1===t.requireDialogSignal||oX(e))return e.find(e=>oJ(e).some(e=>oO.test(e))&&e.rect)}async function oK(e){for(let t=0;t<12;t+=1){if(!oX(await oV(e)))return!0;await tc(500)}return!oX(await oV(e))}async function oW(e,t,r={}){for(let n=0;n<12;n+=1){if(await oz(e,t,r))return!0;await tc(500)}return await oz(e,t,r)}async function oz(e,t,r){return!(r.requireNoBlockingDialog&&await eC(e.device))&&(await eV(e.device)).package===t}function oJ(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 oX(e){return e.some(e=>{let t=oJ(e).join(" ").trim();return t.length>0&&oT.test(t)})}function oZ(e){return!!(e&&e.width>0&&e.height>0)}function oY(e){return e.width*e.height}function oQ(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 o0=[255,59,48,255],o1=[255,214,10,255],o2=[0,0,0,255],o3=["scroll","list","recyclerview","edittext","textfield"],o4=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],o5={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 o8(e){let t=await s.readFile(e.screenshotPath),r=await O(t,"screenshot"),n=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)o7(r)&&oZ(r.rect)&&(!t||oY(r.rect)>oY(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&&oZ(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 oZ(e.rect)&&!("image"===th((t=e).type??"")&&!st(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(sr)||sn(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!oZ(r.rect)||o7(r))return!1;let n=th(r.type??"");return!(o3.some(e=>n.includes(e))||t&&oY(r.rect)>.25*oY(t))}(e,t,r)||(o9(r)?n:n&&function(e){let t=th(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 o9(e)&&!o7(e)}(s=n)?s:null,tm(o,s,e=>(function(e){return o9(e)&&!o7(e)})(e)),s.hittable?s:null,tm(o,s,e=>!0===e.hittable)].find(se)??null);if(!l?.rect||!oZ(l.rect))continue;let c=function(e,t,r){let n=si(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=si(n);if(!i)continue;let a=function(e){let t=0;return th(e.type??"").includes("text")&&(t+=2),sr(e.label)&&(t+=2),sr(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||si(t)}(n,l,e.nodes),d=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),o9(t)&&(n+=3),o9(e)&&(n+=2),r&&(n+=2),sn(t.identifier)&&(n+=1),st(t.value)&&(n+=1),n}(n,l,c),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=o9,i=e=>!!si(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=th(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&oZ(t.rect)&&oQ(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=o6(e,i,u,t,r);if(!oZ(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=D(e.nodes).primaryAction;if(!a?.ref||!a.rect||!oZ(a.rect))return;let o=o6(e,t,a.rect,n,i);if(!oZ(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)=>oY(e.overlayRect)-oY(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(oQ(e.overlayRect,r.overlayRect)||oQ(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}oY(r.overlayRect)<oY(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(su).slice(0,n.maxRefs??24).sort(sd).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:eE(e.overlayRect)}))}(e.snapshot,r.width,r.height,{maxRefs:e.maxRefs});for(let e of n){var i,a;(function(e,t,r){for(let n=0;n<2;n+=1)ss(e,t.x,t.x+t.width-1,t.y+n,r),ss(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),sl(e,t.x+n,t.y,t.y+t.height-1,r),sl(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(i=r,(a=e).overlayRect,o0),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=so(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:so(t.y+2,0,Math.max(0,e.height-11));(function(e,t,r,n,i){for(let a=0;a<11;a+=1)for(let o=0;o<n;o+=1)sc(e,t+o,r+a,i)})(e,i,o,n,o1),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=o5[t];if(n)for(let t=0;t<n.length;t+=1)for(let o=0;o<n[t].length;o+=1)"1"===n[t][o]&&sc(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,o2)}(i,a.overlayRect,a.ref)}return await s.writeFile(e.screenshotPath,await R(r)),n}function o6(e,t,r,n,i){if("android"===e.backend||!t)return sa(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 sa({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 o9(e){let t=[e.type,e.role,e.subrole].map(e=>th(e??"")).join(" ");return o4.some(e=>t.includes(e))}function o7(e){let t=[e.type,e.role,e.subrole].map(e=>th(e??"")).join(" ");return t.includes("application")||t.includes("window")}function se(e){return!!(e?.rect&&oZ(e.rect)&&!o7(e))}function st(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function sr(e){var t;let r;return!!st(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function sn(e){var t;return"string"==typeof e&&!!sr(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function si(e){let t=[e.label,e.value].find(sr);return t?t.trim():sn(e.identifier)?e.identifier.trim():void 0}function sa(e,t,r){let n=so(e.x,0,Math.max(0,t-1)),i=so(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:so(e.width,1,a),height:so(e.height,1,o)}}function so(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function ss(e,t,r,n,i){for(let a=t;a<=r;a+=1)sc(e,a,n,i)}function sl(e,t,r,n,i){for(let a=r;a<=n;a+=1)sc(e,t,a,i)}function sc(e,t,r,n){if(t<0||r<0||t>=e.width||r>=e.height)return;let i=(e.width*r+t)*4;e.data[i]=n[0],e.data[i+1]=n[1],e.data[i+2]=n[2],e.data[i+3]=n[3]}function sd(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 su(e,t){return t.score!==e.score?t.score-e.score:sd(e,t)}function sp(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 sf=new WeakMap;function sm(e){if(!e)return;let t=sf.get(e);if(t)return t;let r=sh(e.nodes??[]);if(r)return sf.set(e,r),r}let sh=ta,sw={referenceWidth:1e3,referenceHeight:1e3};function sg(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??{}},_=sx(S.effectiveDurationMs)??sx(S.durationMs),I={recordingStartedAt:y.startedAt,gestureClockOriginAtMs:y.gestureClockOriginAtMs,gestureClockOriginUptimeMs:y.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===y.platform?y.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:sx(S.gestureStartUptimeMs),gestureEndUptimeMs:sx(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},b="number"==typeof(s={gestureStartUptimeMs:sx(S.gestureStartUptimeMs),gestureEndUptimeMs:sx(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===sx(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sM(sx(t.count),1)??1,r=!0===t.doubleTap,n=sM(sx(t.holdMs),1);return 1===e&&!r&&void 0===n}case"react-native":return"dismiss-overlay"===t.action;default:return!1}}(t,S)?function(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return sp(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...I,gestureDurationMs:b}):sp(I),x=(l=e.snapshot,w=sx((c=S).referenceWidth),g=sx(c.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:sm(l)),M=(d=t,u=r,p=S,f=A,m=b,h=x,v=sv[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 sv={click:(e,t,r,n,i)=>sy(e,t,r,i),press:(e,t,r,n,i)=>sy(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?sy(e,t,r,i):[],fill:(e,t,r,n,i)=>sS(e,t,r,i),focus:(e,t,r,n,i)=>sS(e,t,r,i),longpress:function(e,t,r,n,i){let a=sN(t,e);if(!a)return[];let{x:o,y:s}=a;return[sb(r,o,s,sk(n,[sx(t.durationMs),sx(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sE(t,e),o=sA(t.contentDirection)??sA(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:c,y2:d}=a,u=sk(n,[],250),p=sx(t.amount)??sx(e[1]),f=sx(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:s_,fling:s_,swipe:s_,pinch:function(e,t,r,n,i){let a=sN(t,e,1),o=sx(t.scale)??sx(e[0]);if(!a||void 0===o||o<=0)return[];let{x:s,y:l}=a;return[{kind:"pinch",tMs:r,x:s,y:l,...i,scale:o,durationMs:sk(n,[],280)}]}};function sy(e,t,r,n){let i=sN(t,e);if(!i)return[];let{x:a,y:o}=i,s=sM(sx(t.count),1)??1,l=sM(sx(t.intervalMs),0)??0,c=!0===t.doubleTap,d=sM(sx(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(sb(t,a,o,d,n));continue}u.push(sI(t,a,o,n)),c&&u.push(sI(t+90,a,o,n))}return u}function sS(e,t,r,n){let i=sN(t,e);if(!i)return[];let{x:a,y:o}=i;return[sI(r,a,o,n)]}function s_(e,t,r,n,i){let a=sE(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:c}=a,d=sk(n,[sx(t.effectiveDurationMs),sx(t.durationMs),sx(e[4])],250),u=sM(sx(t.count),1)??1,p=sM(sx(t.pauseMs),0)??0,f="ping-pong"===t.pattern?"ping-pong":"one-way";return Array.from({length:u},(e,t)=>{var n,a,u,m,h,w,g,v,y,S,_,I,b;let A,{startX:x,startY:M,endX:N,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=M,S=N,_=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 sI(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sb(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sA(e){if("string"!=typeof e)return;let t=e.trim().toLowerCase();switch(t){case"up":case"down":case"left":case"right":return t;default:return}}function sx(e){if("number"==typeof e&&Number.isFinite(e))return e;if("string"!=typeof e||0===e.trim().length)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function sM(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sN(e,t,r=0){let n=sx(e.x)??sx(t[r]),i=sx(e.y)??sx(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function sE(e,t){let r=sD(e.x1,e.x,t[0]),n=sD(e.y1,e.y,t[1]),i=sD(e.x2,t[2]),a=sD(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 sD(...e){return e.map(sx).find(e=>void 0!==e)}function sk(e,t,r){return sM(e,1)??t.map(e=>sM(e,1)).find(e=>void 0!==e)??r}let sP={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sC(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?sP[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:eY}}(f);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:y,dispatchRequest:S,recordedCommand:_}=v,I=await sT(m,y);if(I)return I;let b=await sR(m,y);if("response"in b)return b.response;let{resolvedPositionals:A,resolvedOut:x,recordedPositionals:M,recordedFlags:N}="screenshot"===(t=S).command?(c=(n=(r=t).positionals??[],i=r.meta?.cwd,(l=n[0])?[tZ.expandHome(l,i),...n.slice(1)]:n),u=(d=(a=r.flags?.out,o=r.meta?.cwd,a?tZ.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 sO({session:m,sessionName:e.sessionName,logPath:h,command:y,request:S,positionals:A,out:x,dispatchContext:D}),P=await sR(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?M:f.positionals??[],T=_===y?N:f.flags??{};return function(e){let{session:t,sessionStore:r,command:n,recordedCommand:i,resolvedPositionals:a,recordedPositionals:o,recordedFlags:s,data:l,actionStartedAt:c,actionFinishedAt:d,flags:u}=e,p=function(e,t,r,n){if("scroll"!==t)return n;let i=sm(e.snapshot),a={...n??{}},o=sA(a.direction)??sA(r[0]);if(!o)return n;let s=sx(a.amount)??sx(r[1]),l=sx(a.pixels),c=sE(a,[]),d=sx(a.referenceWidth),u=sx(a.referenceHeight),p=void 0!==d&&d>0&&void 0!==u&&u>0?{referenceWidth:d,referenceHeight:u}:i??sw;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=ts({direction:o,amount:s,pixels:l,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:f.x1,y1:f.y1,x2:f.x2,y2:f.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==f.pixels?{pixels:f.pixels}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250}}(t,n,a,l);sg(t,n,a,p,u,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:T,data:k,actionStartedAt:E,actionFinishedAt:C,flags:f.flags??{}}),ap(y)&&ac(m,y),ab(m,y,A,f.flags),{ok:!0,data:k??{}}}async function sR(e,t,r="before-command"){if("android"!==e.device.platform||ns(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await oF({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:Q(e)}}}}async function sT(e,t){if(!iu(t,e.device)){var r;let n=(r=e.device,id[t]?.unsupportedHint?.(r));return{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:`${t} is not supported on this device`,...n?{hint:n}:{}}}}return"android"===e.device.platform&&e.recording&&"record"!==t&&"failed"===(await o$({session:e})).status?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function sO(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await nQ(r.device,n,a,o,{...s});let l=await oi({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 sL(r,l,e.logPath),l}async function sL(e,t,r){let n={snapshotInteractiveOnly:!0,snapshotCompact:!0},i=a6(await aQ({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);or(e,i);let a=await o8({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let s$=sY(()=>import("./lease.js")),sF=sY(()=>import("./session.js").then(e=>e.session_namespaceObject)),sU=sY(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),sG=sY(()=>import("./react-native.js")),sq=sY(()=>import("./record-trace.js")),sj=sY(()=>import("./find.js")),sV=sY(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function sB(e){var t;switch(t=e.req.command,ns(t)?.route??"generic"){case"lease":return await sH(e);case"session":return await sK(e);case"snapshot":return await sW(e);case"reactNative":return await sz(e);case"recordTrace":return await sJ(e);case"find":return await sX(e);case"interaction":return await sZ(e);case"generic":return null}}async function sH(e){let{handleLeaseCommands:t}=await s$();return sQ(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function sK(e){let{handleSessionCommands:t}=await sF();return sQ(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 sW(e){let{handleSnapshotCommands:t}=await sU();return sQ(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function sz(e){let{handleReactNativeCommands:t}=await sG();return sQ(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function sJ(e){let{handleRecordTraceCommands:t}=await sq();return sQ(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function sX(e){let{handleFindCommands:t}=await sj();return sQ(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function sZ(e){let{handleInteractionCommands:t}=await sV();return sQ(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function sY(e){let t;return()=>t??=e()}function sQ(e,t,r){if(r)return r;throw new ee("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let s0=new h;async function s1(e,t,r){let n=s0.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>s0.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function s2(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function s3(e,t){var r,n,i,a;let o,s,l,c,d,u;return e.recording?(r=e,n=t,o=ef(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=ef(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 s4(e,t){if(!t)return[];let r=[],n=e.device,i=ex(t.platform);if(i&&!e_(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=eq(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function s5(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 s8="default";function s6(e){return e.session||s8}function s9(e){if(e.meta?.sessionExplicit===!0||(e.session||s8)!==s8||e.meta?.sessionIsolation==="tenant"||e.flags?.sessionIsolation==="tenant")return;let t=function(e){if(!e||0===e.trim().length)return;let t=function(e){let t=i.resolve(e);try{return a.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(a.existsSync(i.join(t,".git")))return t;let e=i.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(t){var n;return{kind:"cwd",id:(n=t,r.createHash("sha256").update(n).digest("hex").slice(0,16))}}}function s7(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function le(e,t){let r=s9(e);return!!r&&!!t.sessionScope&&!s7(t,r)}function lt(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 lr(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,ns(r)?.lockPolicySelectorOverride===!0),y=v?[]:t?s4(t,g):(n=g,i=e.meta?.lockPlatform,f=[],m=ex(i),void 0!==n.platform&&m&&(a=ex(n.platform),o=m,a&&o&&a!==o&&("apple"===a?!eb(o):"apple"!==o||!eb(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 li(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"===ex(r.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return li(e)}}(r,t)){let r=t[n];ne(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&&nt(p,r7)||(g.platform=S),{...e,flags:g}}if("strip"===w)return function(e,t,r,n){if(n){ln(e,t),e.platform=n.device.platform;return}ln(e,t),r&&void 0===e.platform&&(e.platform=r)}(g,y,S,t),{...e,flags:g};throw new ee("INVALID_ARGS",function(e,t,r){let n=t.map(s5).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${s2(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(s5),hint:function(e,t){if(t)return s3(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${ef(e.session)}`:"";return"Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. "+(r?`Run agent-device open <app>${n} --platform ${r} first if no session is active. `:`Run agent-device open <app>${n} first if no session is active. `)+"Run agent-device session list to inspect active sessions."}(e,t)})}function ln(e,t){for(let r of t)delete e[r.key]}function li(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function la(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[lo(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return lr(e)}catch{return e}}(n);if("open"===(r=l).command||nt(r.flags,r9))try{let e=await r0(l.flags??{});s.add(lo(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=ls(e)-ls(t);return 0!==r?r:e.localeCompare(t)})}function lo(e){return`device:${e}`}function ls(e){return+!e.startsWith("session:")}function ll(e,t={}){let r=eP(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function lc(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:ll(t,{simulatorSetPath:e.simulatorSetPath})}function ld(e,t,r){return iM(lc(e,t),r)}let lu="If runner build products look stale or corrupted, run `pnpm clean:xcuitest` in a local checkout, or remove ~/.agent-device/ios-runner/derived, then retry.";function lp(e){if(!(e instanceof ee)||"COMMAND_FAILED"!==e.code)return!1;let t=`${e.message??""}`.toLowerCase();return!(t.includes("xcodebuild exited early")||t.includes("device is busy")&&t.includes("connecting"))&&!!(t.includes("runner did not accept connection")||t.includes("fetch failed")||t.includes("econnrefused")||t.includes("socket hang up"))}function lf(e){return!(e instanceof ee)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lm(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new ee("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:e$({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:eU("IOS_RUNNER_CONNECT_TIMEOUT")})}async function lh(e){var t,r;let n,{session:i,port:a,logPath:o}=e,s=await i.testPromise,l="Runner did not accept connection (xcodebuild exited early)",c=e$({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new ee("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
8
  ${t}
10
- ${n}`.toLowerCase()).includes("device is busy")&&r.includes("connecting")?"Target iOS device is still connecting. Keep it unlocked, wait for device trust/connection to settle, then retry.":`${eu("IOS_RUNNER_CONNECT_TIMEOUT")} ${lS}`)})}function lx(e){return"interactionFrame"===e||"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function lN(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${n.randomUUID()}`}}function lM(e){if(ni(e))throw no()}let lE=new Map;async function lD(e,t,n,r,i=45e3,a,o){let s=eo.fromTimeoutMs(i),{getEndpoints:l}=lL(e,t),{endpoints:c}=await l(s.remainingMs()),d=null,u=Math.max(1,Math.ceil(i/250));try{return await em(async({deadline:s})=>{let u=await lk({device:e,port:t,command:n,timeoutMs:i,logPath:r,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 no();return new F("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:lI},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||nl(e))throw no();d||(d=e)}if(o?.aborted)throw no();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw lb({port:t,endpoints:c,logPath:r,lastError:d});let a=await lj(e,t,n,i,o);return new Response(a.body,{status:a.status})}throw lb({port:t,endpoints:c,logPath:r,lastError:d})}async function lk(e){await lP(e);let t=await lC(e);if(t.response)return t.response;let n=await lR(e);return n||await lT(e,t.usedCachedTunnelIp)}async function lP(e){if(e.attemptDeadline?.isExpired())throw new F("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 lA({session:e.session,port:e.port,logPath:e.logPath})}async function lC(e){let t=e.endpoints,n=!1;if("device"===e.device.kind){let r=await e.getEndpoints(e.attemptDeadline?.remainingMs());t=r.endpoints,n=r.cached,e.setEndpoints(t)}let r=n?t[0]:null;return{response:await l$(t,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,n)=>{var i;e.setLastError(n),"device"===e.device.kind&&t===r&&(i=e.device.id,lE.delete(i))}}),usedCachedTunnelIp:n}}async function lR(e){return"simulator"===e.device.kind&&e.session?.ready?await lF(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function lT(e,t){var n;if("device"!==e.device.kind||!t)return null;n=e.device.id,lE.delete(n);let r=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(r.endpoints),await l$(r.endpoints,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,n)=>{e.setLastError(n)}})}async function lO(e,t,n,r=45e3,i){if(i?.aborted)throw no();let a=eo.fromTimeoutMs(r),{getEndpoints:o}=lL(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new F("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let c=a.remainingMs();if(c<=0)throw new F("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:r});return await lG(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)},c,i)}function lL(e,t){let n;return{getEndpoints:async(r,i=!1)=>{var a,o,s;let l,c=await lU({device:e,timeoutBudgetMs:r,forceRefresh:i,requestTunnelIp:n,setRequestTunnelIp:e=>{n=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 l$(e,t){let{command:n,port:r,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 F("COMMAND_FAILED","Runner connection deadline exceeded",{port:r,timeoutMs:i});return await lG(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||nl(e))throw no();s(t,e)}return null}async function lF(e,t,n,r){let{signal:i,attemptDeadline:a,onError:o}=r,s=a?.remainingMs()??45e3;if(s<=0)return null;try{let r=await lj(e,t,n,s,i);return new Response(r.body,{status:r.status})}catch(e){if(i?.aborted||nl(e))throw no();return o(e),null}}async function lU(e){var t,n,r;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,n=(t=i.id,(e=lE.get(t))?e.expiresAt<=Date.now()?(lE.delete(t),null):e.ip:null);if(n)return{ip:n,sharedCacheHit:!0};if(void 0!==s)return{ip:s,sharedCacheHit:!1}}let c=await lq(i.id,a);return l(c),c&&(n=i.id,r=c,lE.set(n,{ip:r,expiresAt:Date.now()+3e4})),{ip:c,sharedCacheHit:!1}}async function lG(e,t,n,r){let i=AbortSignal.timeout(n),a=r?AbortSignal.any([r,i]):i;return await fetch(e,{...t,signal:a})}async function lq(e,t){if("number"==typeof t&&t<=0)return null;let n="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,r=i.join(u.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(n/1e3)),i=await iO(["devicectl","device","info","details","--device",e,"--json-output",r,"--timeout",String(t)],{allowFailure:!0,timeoutMs:n});if(0!==i.exitCode||!a.existsSync(r))return null;let o=JSON.parse(a.readFileSync(r,"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{lW(r)}}async function lj(e,t,n,r,i){let a=JSON.stringify(n),o=lv(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:r,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=ec({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new F("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:eu(e)})}return{status:200,body:l}}async function lV(){return await new Promise((e,t)=>{let n=g.createServer();n.listen(0,"127.0.0.1",()=>{let r=n.address();if("object"==typeof r&&r?.port){let t=r.port;n.close(()=>e(t))}else n.close(()=>t(new F("COMMAND_FAILED","Failed to allocate port")))}),n.on("error",t)})}function lB(e,t,n,r){t&&lK(t,e),n&&lK(n,e),r&&process.stderr.write(e)}let lH=new Map;function lK(e,t){let n=(lH.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await a.promises.mkdir(i.dirname(e),{recursive:!0}),await a.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{lH.get(e)===n&&lH.delete(e)});lH.set(e,n)}function lW(e){try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}async function lz(e){let{lockDirPath:t,owner:n}=e,r=i.join(t,"owner.json"),o=Date.now()+(e.timeoutMs??3e4),s=e.pollMs??100,l=e.ownerGraceMs??5e3,c=e.description??"process lock";for(a.mkdirSync(i.dirname(t),{recursive:!0});Date.now()<o;)try{a.mkdirSync(t),function(e,t){let n=`${e}.${process.pid}.${Date.now()}.tmp`;a.writeFileSync(n,JSON.stringify(t),"utf8"),a.renameSync(n,e)}(r,n);let e=!1;return async()=>{e||(e=!0,a.rmSync(t,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,t,n){let r=null;try{r=a.statSync(e)}catch{return!0}let i=lJ(t);if(i){var o;return!(Number.isInteger((o=i).pid)&&!(o.pid<=0)&&T(o.pid)&&(!o.startTime||D(o.pid)===o.startTime))&&(a.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-r.mtimeMs<n)&&(a.rmSync(e,{recursive:!0,force:!0}),!0)}(t,r,l))continue;await ez(s)}throw new F("COMMAND_FAILED",`Timed out waiting for ${c}`,{lockDirPath:t,...function(e,t){let n,r=Date.now(),i=lJ(t);try{n=Math.max(0,Math.round(r-a.statSync(e).mtimeMs))}catch{}return{...void 0!==n?{lockAgeMs:n}:{},...i?{ownerPid:i.pid,ownerStartTime:i.startTime,ownerAgeMs:Math.max(0,Math.round(r-i.acquiredAtMs))}:{}}}(t,r)})}function lJ(e){try{return JSON.parse(a.readFileSync(e,"utf8"))}catch{return null}}let lX=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function lZ(e,t,n){if("macos"!==e.platform)return;if(0===t.length)throw new F("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",xctestrunPath:n});let r=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of r)if(!a.existsSync(e))throw new F("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:n});for(let e of r)if(!await lY(e)){await iT("codesign",["--remove-signature",e],{allowFailure:!0});try{await iT("codesign",["--force","--sign","-",e])}catch(r){let t=r instanceof F?r:new F("COMMAND_FAILED",String(r));throw new F("COMMAND_FAILED","Failed to repair macOS runner product signature",{reason:"RUNNER_PRODUCT_REPAIR_FAILED",productPath:e,xctestrunPath:n,error:t.message,details:t.details})}}}async function lY(e){return 0===(await iT("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let lQ=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),l0=new Set([" "," ","\n","\r"]),l1=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function l2(e,t={}){let n=t.maxDocumentChars??0x8000000;if(e.length>n)throw Error(`XML document exceeds maximum supported size of ${n} characters.`);return new l4(e).parse()}function l3(e,t){for(let n of e){if("dict"===n.name)for(let e=0;e<n.children.length-1;e+=1){let r=n.children[e],i=n.children[e+1];r?.name==="key"&&r.text&&i&&t(r.text,i)}l3(n.children,t)}}class l4{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:n}=this.readOpeningTagBody(),r={name:e,attributes:t,text:null,children:[]};this.addNode(r),n||this.pushOpenNode(r)}readOpeningTagBody(){let e={};for(;;){this.skipWhitespace();let t=this.readOpeningTagEnd();if(t)return{attributes:e,selfClosing:"self-closing"===t};let n=this.readAttribute();e[n.name]=n.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(l1.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 n=e.trim();if(!n)return;let r=this.stack[this.stack.length-1];r&&(r.text=`${r.text??""}${t?l5(n):n}`)}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])&&lQ.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 n=this.index,r=this.xml.indexOf(t,n);if(-1===r)throw Error(`XML attribute "${e}" is not closed.`);return this.index=r+1,l5(this.xml.slice(n,r).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 n,r,i;return!(void 0===t||(n=e,r=t,n.quote?(r===n.quote&&(n.quote=null),!0):('"'===r||"'"===r)&&(n.quote=r,!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 n=this.xml.indexOf(e,this.index+e.length);if(-1===n)throw Error(t);this.index=n+e.length}skipWhitespace(){for(var e;this.index<this.xml.length&&void 0!==(e=this.xml[this.index])&&l0.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function l5(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 n=e,r=t;let i=r.startsWith("#x")?Number.parseInt(r.slice(2),16):Number(r.slice(1));if(!Number.isInteger(i)||i<0||i>1114111)return n;try{return String.fromCodePoint(i)}catch{return n}}})}let l8=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function l6(e){var t;let n=await l9(e);if(!n||0===n.length)return null;let r=i.dirname(e),o=new Set,s=function(e,t){let n=[],r=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);n.push(i.join(t,e));let s=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(e);s&&r.add(i.join(t,s))}return{testRootPaths:n,hostRoots:Array.from(r),hostRelativePaths:a}}(n,r);for(let e of s.testRootPaths){if(!a.existsSync(e))return null;o.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let n=t.hostRoots.find(t=>a.existsSync(i.join(t,e)));return n?i.join(n,e):null})){if(!e)return null;o.add(e)}return Array.from(o)}async function l9(e){let t=await iL(e);if(t){var n,r,i,o=t;let e=new Set;for(let t of[i=o,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!l7(e))continue;let t=e.TestTargets;Array.isArray(t)&&n.push(...t.filter(l7))}return n}(i),...Object.values(i).filter(e=>l7(e)&&"TestBundlePath"in e)])for(let n of function(e){let t=new Set;for(let[n,r]of Object.entries(e))if(l8.has(n)){if("string"==typeof r){t.add(r);continue}if(Array.isArray(r))for(let e of r)"string"==typeof e&&t.add(e)}return Array.from(t)}(t))e.add(n);return Array.from(e)}if("darwin"===process.platform)return null;try{let t;return n=a.readFileSync(e,"utf8"),r=l2(n),t=new Set,l3(r,(e,n)=>{if(l8.has(e)){if("string"===n.name&&n.text)return void t.add(n.text);if("array"===n.name)for(let e of n.children)"string"===e.name&&e.text&&t.add(e.text)}}),Array.from(t)}catch{return null}}function l7(e){return!!e&&"object"==typeof e}let ce=["CFBundleIcons","CFBundleIcons~ipad"];async function ct(e){let t=e.filter(co);if(0===t.length)return;let n=e.filter(e=>cl(e)&&!cs(e));for(let e of t){let t=function(e,t){let n=i.dirname(e);return t.find(e=>i.dirname(e)===n&&"AgentDeviceRunner.app"===i.basename(e))??t.find(t=>i.dirname(t)===n&&t!==e)??null}(e,n);t&&await cn(t,e)}}async function cn(e,t){var n;let r,o=function(e,t){let n=!1;for(let o of a.readdirSync(e,{withFileTypes:!0})){var r;if(o.isFile()&&(r=o.name,/^AppIcon.*\.png$/.test(r)||"Assets.car"===r))(function(e,t){if(a.existsSync(t)){let n=a.readFileSync(e),r=a.readFileSync(t);return!n.equals(r)&&(a.copyFileSync(e,t),!0)}return a.copyFileSync(e,t),!0})(i.join(e,o.name),i.join(t,o.name))&&(n=!0)}return n}(e,t),s=await cr(e,t);(o||s)&&(await ca(t),n=t,r=new Date,a.utimesSync(n,r,r))}async function cr(e,t){var n,r;let a=i.join(e,"Info.plist"),o=i.join(t,"Info.plist"),s=await iL(a),l=await iL(o);if(!s||!l)return!1;let c=(n=s,r=l,ce.flatMap(e=>{let t=n[e];return void 0===t||JSON.stringify(r[e])===JSON.stringify(t)?[]:[{key:e,value:t,shouldInsert:void 0===r[e]}]}));if(0===c.length)return!1;for(let e of c)await ci(o,e.key,e.value,e.shouldInsert);return!0}async function ci(e,t,n,r){let i=await iT("plutil",[r?"-insert":"-replace",t,"-json",JSON.stringify(n),e],{allowFailure:!0});if(0!==i.exitCode)throw new F("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function ca(e){let t=await iT("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new F("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function co(e){return cl(e)&&cs(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function cs(e){return i.basename(e).endsWith("-Runner.app")}function cl(e){return i.basename(e).endsWith(".app")}let cc={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 cd(e){var t;if("ios"!==e.platform&&"macos"!==e.platform)throw new F("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 cu(e){return"simulator"===e?"simulator":"device"}function cp(){return"arm64"===process.arch?"arm64":"x86_64"}let cf="XCTestDevices",cm=".agent-device-backup",ch=".agent-device-xctestdevices-backup-",cw=i.join(u.homedir(),".agent-device","ios-runner"),cg=".agent-device-runner-cache.json",cv={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},cy=new Map,cS=new Set,c_=new Map,cI=new Set;function cb(e){return e?.trim()??""}function cA(e=process.env){return cb(e.AGENT_DEVICE_IOS_BUNDLE_ID)||cb(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function cx(e=process.env){let t=cb(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${cA(e)}.uitests`}let cN=function(e=process.env){let t=cA(e),n=cx(e);return Array.from(new Set([cb(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${n}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function cM(e=u.homedir()){return i.join(e,"Library","Developer","XCTestDevices")}async function cE(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let n=er(e.simulatorSetPath);if(!n)return null;let r=i.resolve(n),o=i.resolve(t.xctestDeviceSetPath??cM()),s=i.resolve(t.backupPath??function(e=cM()){return`${e}${cm}`}(o)),l=i.resolve(t.lockDirPath??function(e=u.homedir()){return i.join(e,".agent-device","xctest-device-set.lock")}()),c=t.ownerStartTime??D(process.pid),d=await cP({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:c,acquiredAtMs:t.nowMs??Date.now()}});try{if(cD({xctestDeviceSetPath:o,backupPath:s}),function(e,t){if(i.resolve(e)===i.resolve(t))return!0;try{return a.realpathSync.native(e)===a.realpathSync.native(t)}catch{return!1}}(r,o))return await d(),null;a.mkdirSync(r,{recursive:!0}),a.existsSync(o)&&a.renameSync(o,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:n}=e,r=i.dirname(n),o=i.join(r,`${cf}.agent-device-link-${process.pid}-${Date.now()}`);a.mkdirSync(r,{recursive:!0});try{a.symlinkSync(t,o,"dir"),a.renameSync(o,n)}catch(e){throw a.existsSync(o)&&ck(o),e}}({requestedSetPath:r,xctestDeviceSetPath:o})}catch(e){throw cD({xctestDeviceSetPath:o,backupPath:s}),await d(),new F("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:r,xctestDeviceSetPath:o,backupPath:s,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{cD({xctestDeviceSetPath:o,backupPath:s})}finally{await d()}}}}}function cD(e){let{xctestDeviceSetPath:t,backupPath:n}=e,r=[n,...function(e){let t=i.dirname(e),n=i.basename(e).replace(cm,""),r=n===cf?ch:`${n}${ch}`;try{return a.readdirSync(t).filter(e=>e.startsWith(r)).sort().map(e=>i.join(t,e))}catch{return[]}}(n)],o=r.find(e=>a.existsSync(e)),s=a.existsSync(t)&&a.lstatSync(t).isSymbolicLink();if(o){if(s&&ck(t),a.existsSync(t))if(!s)return void E({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:o}});else o!==n?a.rmSync(o,{recursive:!0,force:!0}):a.rmSync(n,{recursive:!0,force:!0});else a.mkdirSync(i.dirname(t),{recursive:!0}),a.renameSync(o,t);for(let e of r)e!==o&&a.existsSync(e)&&a.rmSync(e,{recursive:!0,force:!0});return}s&&(E({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),ck(t))}function ck(e){!a.existsSync(e)||a.lstatSync(e).isSymbolicLink()&&a.unlinkSync(e)}async function cP(e){return await lz({lockDirPath:e.lockDirPath,owner:e.owner,timeoutMs:e.timeoutMs??3e4,pollMs:e.pollMs??100,ownerGraceMs:5e3,description:e.description??"XCTest device set lock"})}async function cC(e){var t;return await cP({lockDirPath:(t=e,i.join(i.dirname(t),`${i.basename(t)}.lock`)),owner:{pid:process.pid,startTime:D(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function cR(e,t){let n=tn(),r=cG(e,n),i=c6(e,r);return await le(cy,i,async()=>{let a=await cC(i);try{return await cT({device:e,options:t,projectRoot:n,expectedCacheMetadata:r,derived:i,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await a()}})}async function cT(e){var t,n;let{device:r,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,n=e.forceRebuild,(es(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||n||cS.has(t))&&(di("clean",n?"forced_rebuild":"forced_clean",{derived:t}),dn(t),cF(t),cS.delete(t));let l=await dr({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>cY(e,r),xctestrunReferencesProjectRoot:c0,resolveExistingXctestrunProductPaths:l6}),c="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&di("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let d=await cO({device:r,derived:s,expectedCacheMetadata:o,existing:l,cache:c});return d||(l.xctestrunPath&&(dn(s),cF(s)),await cL({device:r,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:c,reason:l.reason}))}async function cO(e){let{device:t,derived:n,expectedCacheMetadata:r,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await c$(t,n,r,i);return o?{xctestrunPath:o,derived:n,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function cL(e){let{device:t,options:n,projectRoot:r,expectedCacheMetadata:o,derived:s,cache:l,reason:c}=e,d=i.join(r,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!a.existsSync(d))throw new F("COMMAND_FAILED","iOS runner project not found",{projectPath:d});let u=Date.now();await c8(t,d,s,n);let p=Math.max(0,Date.now()-u),f=cY(s,t);if(!f)throw new F("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await l6(f);if(!m)throw new F("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await lZ(t,m,f),await ct(m),cj(s,cK(o,f,m)),di("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:c}}async function c$(e,t,n,r){try{var i,a,o,s;return await lZ(e,r.productPaths,r.xctestrunPath),di("reuse","reuse_ready",{derived:t,xctestrunPath:r.xctestrunPath}),i=t,a=n,o=r.xctestrunPath,s=r.productPaths,cj(i,cK(a,o,s)),r.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof F))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&lX.has(t)}(e))throw e;return di("rebuild","repair_failed",{derived:t,xctestrunPath:r.xctestrunPath}),null}}function cF(e){try{if(!a.existsSync(e))return;if("derived"!==i.basename(e))return void a.rmSync(e,{recursive:!0,force:!0});for(let n of a.readdirSync(e,{withFileTypes:!0})){var t;t=n.name,cU.has(t)&&a.rmSync(i.join(e,n.name),{recursive:!0,force:!0})}}catch{}}let cU=new Set([cg,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function cG(e,t=tn()){let r,o=cd(e);return{schemaVersion:2,packageVersion:tt(),runnerSourceFingerprint:function(e){let t=i.join(e,"ios-runner","AgentDeviceRunner"),r=function(e){if(!a.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop();for(let s of a.readdirSync(e,{withFileTypes:!0})){var r,o;let a=i.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;n.push(a);continue}s.isFile()&&(r=s.name,o=a,"project.pbxproj"===r?o.includes(`${i.sep}.xcodeproj${i.sep}`):[".jpg",".json",".png",".swift",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(i.extname(r)))&&t.push(a)}}return t.sort((e,t)=>e.localeCompare(t))}(t),o=function(e,t){let r=n.createHash("sha256");for(let n of t){let t=i.relative(e,n),o=a.statSync(n);r.update(t),r.update("\0"),r.update(String(o.size)),r.update("\0"),r.update(String(Math.trunc(o.mtimeMs))),r.update("\0")}return r.digest("hex")}(t,r),s=cZ.get(t);if(s?.fileStatsFingerprint===o)return s.sourceFingerprint;let l=n.createHash("sha256");for(let e of r){let n=i.relative(t,e);l.update(n),l.update("\0"),l.update(a.readFileSync(e)),l.update("\0")}let c=l.digest("hex");return cZ.set(t,{fileStatsFingerprint:o,sourceFingerprint:c}),c}(t),...function(e,t){var n;let r=(n=cq("xcodebuild",["-version"]),{version:n.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:n.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=cc[e].sdkName[cu(t)];return{xcodeVersion:r.version,xcodeBuildVersion:r.buildVersion,sdkName:i,sdkVersion:cq("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:cq("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(o,e.kind),platformName:o,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(r=cd(e))?`platform=macOS,arch=${cp()}`:"simulator"===e.kind?`generic/platform=${r} Simulator`:`generic/platform=${r}`,runnerBundleBuildSettings:de(process.env),runnerSigningBuildSettings:c7(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:dt()}}function cq(e,t){let n=JSON.stringify([e,t]),r=c_.get(n);if(void 0!==r)return r;try{let r=j(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===r.exitCode&&r.stdout.trim()||"unknown";return c_.set(n,i),i}catch{return c_.set(n,"unknown"),"unknown"}}function cj(e,t){a.mkdirSync(e,{recursive:!0}),a.writeFileSync(i.join(e,cg),`${JSON.stringify(t,null,2)}
11
- `)}async function cV(e,t){cS.add(e.derived);let n=await cC(e.derived);try{di("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),dn(e.derived),cF(e.derived)}finally{await n()}}function cB(e){let{artifacts:t,...n}=e;return n}function cH(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,n])=>[t,e(n)])):t}(e))}function cK(e,t,n){let r=function(e,t){let n=cz(e);if(null===n||0===t.length)return null;let r=[];for(let e of t){let t=cz(e);if(null===t)return null;r.push({path:e,...t})}return{xctestrunPath:e,xctestrunMtimeMs:n.mtimeMs,xctestrunSize:n.size,productPaths:r}}(t,n);return r?{...e,artifacts:r}:e}function cW(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function cz(e){try{let t=a.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function cJ(e,t){let n=cz(e);return n?.mtimeMs===t.mtimeMs&&n.size===t.size}function cX(e,t){let n=i.relative(i.resolve(t),i.resolve(e));return""!==n&&!n.startsWith("..")&&!i.isAbsolute(n)}let cZ=new Map;function cY(e,t){if(!a.existsSync(e))return null;let n=[],r=[e];for(;r.length>0;){let e=r.pop();for(let t of a.readdirSync(e,{withFileTypes:!0})){let o=i.join(e,t.name);if(t.isDirectory()){r.push(o);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=a.statSync(o);n.push({path:o,mtimeMs:e.mtimeMs})}catch{}}}return 0===n.length?null:(n.sort((e,n)=>{if(t){let r=cQ(n.path,t)-cQ(e.path,t);if(0!==r)return r}return n.mtimeMs-e.mtimeMs||e.path.localeCompare(n.path)}),n[0]?.path??null)}function cQ(e,t){let n=0,r=e.toLowerCase();i.basename(r).startsWith("agentdevicerunner.env.")&&(n-=1e3),r.includes(`${i.sep}macos${i.sep}`)&&(n-=5e3);let a=cc[cd(t)].xctestrunHints[cu(t.kind)];return a.preferred.length>0&&(a.preferred.some(e=>r.includes(e))?n+=2e3:n-=500),a.disallowed.some(e=>r.includes(e))&&(n-=2500),n}function c0(e,t){try{let n=a.readFileSync(e,"utf8"),r=new Set([t]);try{r.add(a.realpathSync(t))}catch{}for(let e of r)if(n.includes(e))return!0;return!1}catch{return!1}}async function c1(e,t,n){let r=i.dirname(e),a=n.replace(/[^a-zA-Z0-9._-]/g,"_"),o=i.join(r,`AgentDeviceRunner.env.${a}.json`),s=i.join(r,`AgentDeviceRunner.env.${a}.xctestrun`),l=await c2(e);return c4(l,e=>{var n,r;return n=e,r=t,void(n.EnvironmentVariables={...n.EnvironmentVariables??{},...r},n.UITestEnvironmentVariables={...n.UITestEnvironmentVariables??{},...r},n.UITargetAppEnvironmentVariables={...n.UITargetAppEnvironmentVariables??{},...r},n.TestingEnvironmentVariables={...n.TestingEnvironmentVariables??{},...r})}),c4(l,e=>Object.assign(e,cv),{requireTestBundlePath:!0}),await c3(l,o,s),{xctestrunPath:s,jsonPath:o}}async function c2(e){let t=await iT("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new F("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 F("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function c3(e,t,n){a.writeFileSync(t,JSON.stringify(e,null,2));let r=await iT("plutil",["-convert","xml1","-o",n,t],{allowFailure:!0});if(0!==r.exitCode)throw new F("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:n,stderr:r.stderr})}function c4(e,t,n={}){let r=e.TestConfigurations;if(Array.isArray(r))for(let e of r)e&&"object"==typeof e&&function(e,t,n){if(Array.isArray(e))for(let r of e){let e=c5(r,n);e&&t(e)}}(e.TestTargets,t,n);for(let n of Object.values(e)){let e=c5(n,{requireTestBundlePath:!0});e&&t(e)}}function c5(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function c8(e,t,n,r){let i=de(process.env),a=c7(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=dt(),l=await cE(e);try{let l;await G("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",c9(e),"1","-destination",(l=cd(e),"macOS"===l?`platform=macOS,arch=${cp()}`:"simulator"===e.kind?`platform=${l} Simulator,id=${e.id}`:`generic/platform=${l}`),"-derivedDataPath",n,...s,...i,...o,...a],{detached:!0,timeoutMs:r.buildTimeoutMs,onSpawn:e=>{cI.add(e),e.on("close",()=>{cI.delete(e)})},onStdoutChunk:e=>{lB(e,r.logPath,r.traceLogPath,r.verbose)},onStderrChunk:e=>{lB(e,r.logPath,r.traceLogPath,r.verbose)}})}catch(a){let e,t,n=a instanceof F?a:new F("COMMAND_FAILED",String(a)),i=(e=n.details?JSON.stringify(n.details):"",((t=`${n.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)??lS);throw new F("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:n.message,details:n.details,logPath:r.logPath,hint:i})}finally{await l?.release()}}function c6(e,t){let r,a=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(a)return i.resolve(a);let o=(r=n.createHash("sha256").update(cH(cB(t))).digest("hex"),`cache-${r.slice(0,16)}`),s=function(e){return i.join(cw,"derived",cc[cd(e)].derivedBaseName[cu(e.kind)])}(e);return i.join(s,o)}function c9(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function c7(e=process.env,t=!1,n="ios"){if("macos"===n)return["CODE_SIGNING_ALLOWED=NO","CODE_SIGNING_REQUIRED=NO","CODE_SIGN_IDENTITY=","DEVELOPMENT_TEAM="];if(!t)return[];let r=e.AGENT_DEVICE_IOS_TEAM_ID?.trim()||"",i=e.AGENT_DEVICE_IOS_SIGNING_IDENTITY?.trim()||"",a=e.AGENT_DEVICE_IOS_PROVISIONING_PROFILE?.trim()||"",o=["CODE_SIGN_STYLE=Automatic"];return r&&o.push(`DEVELOPMENT_TEAM=${r}`),i&&o.push(`CODE_SIGN_IDENTITY=${i}`),a&&o.push(`PROVISIONING_PROFILE_SPECIFIER=${a}`),o}function de(e=process.env){let t=cA(e),n=cx(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${n}`]}function dt(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function dn(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var n;let t,r;if(n=e,t=i.resolve(tn(),".tmp"),""===(r=i.relative(t,i.resolve(n)))||r.startsWith("..")||i.isAbsolute(r))throw new F("COMMAND_FAILED","Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically",{derivedPath:e,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${i.join(tn(),".tmp")}.`})}}async function dr(e){var t,n;let r,o=(t=e.derived,n=e.expectedCacheMetadata,(r=function(e){try{let t=JSON.parse(a.readFileSync(i.join(e,cg),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?cH(cB(r))!==cH(cB(n))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:r}:{ok:!1,reason:"cache_metadata_missing"}),s=o.ok?function(e,t){var n;let r=t?.artifacts;if(!(!(!(n=r)||"object"!=typeof n||Array.isArray(n))&&"string"==typeof n.xctestrunPath&&Number.isInteger(n.xctestrunMtimeMs)&&Number.isInteger(n.xctestrunSize)&&Array.isArray(n.productPaths)&&n.productPaths.length>0&&n.productPaths.every(cW))||!cX(r.xctestrunPath,e)||!cJ(r.xctestrunPath,{mtimeMs:r.xctestrunMtimeMs,size:r.xctestrunSize}))return null;let i=[];for(let t of r.productPaths){if(!cX(t.path,e)||!cJ(t.path,t))return null;i.push(t.path)}return{xctestrunPath:r.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 di(e,t,n){E({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...n}})}let da=process.pid,ds=D(process.pid),dl=(th=da,tw=ds,(e=n.createHash("sha256")).update(String(th)),e.update("\0"),e.update(tw??"unknown-start"),`owner-${th}-${e.digest("hex").slice(0,8)}`);async function dc(e,t){let n=await lz({lockDirPath:`${dh(e)}.lock`,owner:{pid:da,startTime:ds,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await n()}}function dd(e){try{let t=JSON.parse(a.readFileSync(dh(e),"utf8"));return function(e,t){var n,r,i;let a;if(!e||"object"!=typeof e||Array.isArray(e)||1!==e.schemaVersion||e.deviceId!==t)return null;let o=(n=e,a={ownerToken:dw(n.ownerToken),ownerPid:dg(n.ownerPid),sessionId:dw(n.sessionId),port:dg(n.port),xctestrunPath:dw(n.xctestrunPath),jsonPath:dw(n.jsonPath),createdAtMs:(r=n.createdAtMs,"number"==typeof r&&Number.isFinite(r)?r:null)},Object.values(a).some(e=>null===e)?null:a);return o?{schemaVersion:1,deviceId:t,...o,ownerStartTime:(i=e.ownerStartTime,"string"==typeof i?i:null),runnerPid:dg(e.runnerPid)}:null}(t,e)}catch{return null}}function du(e){var t;return e?e.ownerToken===dl?{type:"owned",lease:e}:T((t=e).ownerPid)&&(!t.ownerStartTime||D(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function dp(e,t){let n=du(dd(e));if("empty"===n.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===n.type)throw new F("COMMAND_FAILED",`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,ownerPid:n.lease.ownerPid,ownerStartTime:n.lease.ownerStartTime,ownerToken:n.lease.ownerToken,sessionId:n.lease.sessionId,hint:"Use a different simulator/session, wait for the other run to finish, or stop the owning daemon before retrying."});await dv(n.lease,n.type,t)}async function df(e,t){let n=du(dd(e));"owned"===n.type&&await dv(n.lease,"owned",t)}function dm(e){e&&function(e){let t=dd(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{a.unlinkSync(dh(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function dh(e){let t;return i.join((t=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim())?i.resolve(t):i.join(u.homedir(),".agent-device","ios-runner","leases"),`${e.replaceAll(/[^A-Za-z0-9._-]/g,"-")||"unknown-device"}.json`)}function dw(e){return"string"==typeof e&&e.length>0?e:null}function dg(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function dv(e,t,n){E({level:"stale"===t?"warn":"debug",phase:"ios_runner_lease_cleanup",data:{deviceId:e.deviceId,ownerPid:e.ownerPid,ownerToken:e.ownerToken,runnerPid:e.runnerPid,sessionId:e.sessionId,reason:t}}),await n.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGTERM"),await n.cleanupRunnerXcodebuildProcesses(e.deviceId,e.ownerToken),await n.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGKILL"),n.cleanupTempFile(e.xctestrunPath),n.cleanupTempFile(e.jsonPath),dm(e)}let dy={cleanupRunnerProcessTree:dk,cleanupRunnerXcodebuildProcesses:dP,cleanupTempFile:lW};async function dS(e,t={}){var n;!1!==t.graceful?await dA(e):await dk(e.child.pid,"SIGTERM"),await dx(e,t.waitTimeoutMs??1e4),(n=e.child.pid)&&(dM(n)||C(n))&&await dk(e.child.pid,"SIGKILL"),await dN(e)}async function d_(e){await df(e,dy)}async function dI(e){let t=Array.from(cI);await dE(e,"SIGINT"),await dD(t,"SIGINT"),await dE(e,"SIGTERM"),await dD(t,"SIGTERM"),await dE(e,"SIGKILL"),await dD(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await dN(e)}))}async function db(){let e=Array.from(cI);await Promise.allSettled(e.map(async e=>{try{await dk(e.pid,"SIGTERM"),await dk(e.pid,"SIGKILL")}finally{cI.delete(e)}}))}async function dA(e){try{await lD(e.device,e.port,lN({command:"shutdown"}),void 0,15e3)}catch{await dk(e.child.pid,"SIGTERM")}}async function dx(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function dN(e){lW(e.xctestrunPath),lW(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{dm(e.lease)}}function dM(e){return!!e&&T(e)}async function dE(e,t){await Promise.allSettled(e.map(async e=>{await dk(e.child.pid,t)}))}async function dD(e,t){await Promise.allSettled(e.map(async e=>{await dk(e.pid,t),"SIGKILL"===t&&cI.delete(e)}))}async function dk(e,t){if(!e||e<=0)return;try{process.kill(-e,t)}catch{}try{process.kill(e,t)}catch{}let n="SIGINT"===t?"INT":"SIGTERM"===t?"TERM":"KILL";try{await iT("pkill",[`-${n}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function dP(e,t){let n=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${dC(e)}-${dC(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${dC(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await iT("pkill",[`-${t}`,"-f",n],{allowFailure:!0,timeoutMs:2e3})}catch(n){E({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:t,error:n instanceof Error?n.message:String(n)}})}}function dC(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}let dR=new Map,dT=new Map;async function dO(e,t){return await le(dT,e.id,async()=>{let n=dR.get(e.id);if(n){let t=await d$(e,n);if(t)return t}return await dc(e.id,async()=>await dL(e,t))})}async function dL(e,t){var n,r;let o,s,l={};await dQ(l,"cleanup_stale_xcodebuild",async()=>{await dp(e.id,dy)}),await dQ(l,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(E({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):dK(t))}),t.cleanStaleBundles?await dQ(l,"cleanup_stale_bundles",async()=>{await dF(e)}):(l.cleanup_stale_bundles=0,E({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let c=await dQ(l,"ensure_xctestrun",async()=>await cR(e,t));l.build_xctestrun=c.buildMs;let d=await dQ(l,"allocate_port",async()=>await lV()),{xctestrunPath:u,jsonPath:p}=await dQ(l,"prepare_xctestrun_env",async()=>await c1(c.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(d)},`session-${e.id}-${dl}-${d}`)),f=await dQ(l,"simulator_set_redirect",async()=>await cE(e));try{({child:o,wait:s}=await dQ(l,"launch_xcodebuild",()=>{let t;return U("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",c9(e),"1","-destination-timeout",String(20),"-xctestrun",u,"-destination",(t=cd(e),"macOS"===t?`platform=macOS,arch=${cp()}`:"simulator"===e.kind?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(d)},detached:!0})}))}catch(e){throw await f?.release(),e}o.stdout?.on("data",e=>{lB(e,t.logPath,t.traceLogPath,t.verbose)}),o.stderr?.on("data",e=>{lB(e,t.logPath,t.traceLogPath,t.verbose)});let m=`${e.id}:${d}:${Date.now()}`,h={schemaVersion:1,deviceId:(n={deviceId:e.id,sessionId:m,runnerPid:o.pid,port:d,xctestrunPath:u,jsonPath:p}).deviceId,ownerToken:dl,ownerPid:da,ownerStartTime:ds,sessionId:n.sessionId,runnerPid:n.runnerPid??null,port:n.port,xctestrunPath:n.xctestrunPath,jsonPath:n.jsonPath,createdAtMs:Date.now()},w={sessionId:m,device:e,deviceId:e.id,port:d,xctestrunPath:u,xctestrunArtifact:c,jsonPath:p,testPromise:s,child:o,ready:!1,startupTimeoutMs:"number"==typeof(r=t.startupTimeoutMs)&&Number.isFinite(r)&&r>0?Math.floor(r):void 0,startupTimings:l,simulatorSetRedirect:f??void 0,lease:h};try{let e,t;e=dh(h.deviceId),a.mkdirSync(i.dirname(e),{recursive:!0}),t=`${e}.${process.pid}.${Date.now()}.tmp`,a.writeFileSync(t,JSON.stringify(h,null,2),"utf8"),a.renameSync(t,e)}catch(t){throw await dj(e.id,w,{graceful:!1,waitTimeoutMs:1e3}),t}return dR.set(e.id,w),w}async function d$(e,t){if(!dM(t.child.pid))return await dQ({},"stop_stale_session",async()=>{await dj(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let n=c6(e,cG(e));return t.xctestrunArtifact?.derived!==n?(E({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:t.xctestrunArtifact?.derived,expectedDerived:n}}),await dQ({},"stop_stale_artifact_session",async()=>{await dj(e.id,t)}),null):(E({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready}}),t)}async function dF(e){if("simulator"===e.kind)for(let t of cN){let n=await dU(e,t);if(!n||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")}(n))continue}}async function dU(e,t){try{return await iO(lv(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(n){E({level:"warn",phase:"ios_runner_startup_cleanup_stale_bundle_failed",data:{deviceId:e.id,bundleId:t,timeoutMs:1e4,error:n instanceof Error?n.message:String(n)}});return}}function dG(e){let t=dR.get(e);return t?{sessionId:t.sessionId,alive:dM(t.child.pid)}:null}async function dq(e,t){await le(dT,e.deviceId,async()=>{dR.get(e.deviceId)===e&&(E({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await dj(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function dj(e,t,n={}){let r=t??dR.get(e);r&&(await dS(r,n),dR.get(e)===r&&dR.delete(e))}async function dV(e){await le(dT,e,async()=>{await dc(e,async()=>{await dj(e),await d_(e)})})}async function dB(){let e=Array.from(dR.values());for(let t of(await dI(e),e))dR.get(t.deviceId)===t&&dR.delete(t.deviceId)}async function dH(){await dB();let e=Array.from(dR.keys());await Promise.allSettled(e.map(async e=>{await dV(e)})),await db()}async function dK(e){await iO(lv(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}function dW(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new F("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new F("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function dz(e,t,n,r,i,a){var o,s,l,c,d;o=t,s=n.command,o.startupTimingsReported||!o.startupTimings||(o.startupTimingsReported=!0,E({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=lN(n),p=lx(u.command),f=eo.fromTimeoutMs(i),m=function(e,t){var n;let r=lx(t.command);if(!e.ready)return r?{action:"skip",reason:"read_only_startup_command"}:{action:"run",reason:"startup"};return"uptime"===(n=t.command)||"status"===n?{action:"skip",reason:"readiness_probe_command"}:{action:"run",reason:"ready_session"}}(t,u);"run"===m.action?await dX({device:e,session:t,runnerCommand:u,logPath:r,deadline:f,signal:a,decision:m}):(l=u,c=t,d=m,E({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:l.command,commandId:l.commandId,reason:d.reason,sessionReady:c.ready}}));let h=await dJ({device:e,session:t,runnerCommand:u,logPath:r,deadline:f,timeoutMs:i,signal:a,readOnlyCommand:p});try{let e=await dZ(h,t,r),n=function(e){if(!0===e.runnerFatal)return"string"==typeof e.runnerFatalReason&&e.runnerFatalReason.trim().length>0?e.runnerFatalReason:"runner_reported_fatal_response"}(e);return n&&await dq(t,n),e}catch(n){let e=function(e){if(e instanceof F){if("IOS_AX_SNAPSHOT_FAILED"===e.code)return"ax_snapshot_failure";if("XCTEST_RECORDED_FAILURE"===e.code)return"xctest_recorded_failure"}}(n);throw e&&await dq(t,e),n}}async function dJ(e){let{device:t,session:n,runnerCommand:r,logPath:i,deadline:a,timeoutMs:o,signal:s,readOnlyCommand:l}=e,c=a.remainingMs();if(c<=0)throw new F("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:o});let d=l?{command:r.command,commandId:r.commandId,readOnly:!0,sessionReady:n.ready,timeoutMs:c}:{command:r.command,commandId:r.commandId};return await N("ios_runner_command_send",async()=>l?await lD(t,n.port,r,i,c,n,s):await lO(t,n.port,r,c,s),d)}async function dX(e){let{device:t,session:n,runnerCommand:r,logPath:i,deadline:a,signal:o,decision:s}=e,l=n.ready?Math.min(1e3,a.remainingMs()):Math.min(dY(n),a.remainingMs());try{let e=await N("ios_runner_readiness_preflight",async()=>await lD(t,n.port,lN({command:"uptime"}),i,l,n,o),{command:r.command,commandId:r.commandId,reason:s.reason,sessionReady:n.ready,timeoutMs:l});await dZ(e,n,i)}catch(t){var c,d;let e;throw d={runnerReadinessPreflightFailed:!0},e=(c=t)instanceof F?c:new F("COMMAND_FAILED",c instanceof Error?c.message:String(c),void 0,c),new F(e.code,e.message,{...e.details??{},...d},e.cause??c)}}async function dZ(e,t,n){let r,i=await e.text();try{let e=JSON.parse(i);r=e&&"object"==typeof e?e:{}}catch{throw new F("COMMAND_FAILED","Invalid runner response",{text:i})}if(!r.ok){let e=r.error?.code,t="string"==typeof e&&e.trim().length>0?O(e):"COMMAND_FAILED",i="string"==typeof r.error?.message?r.error.message:void 0,a="string"==typeof r.error?.hint?r.error.hint:void 0;throw new F(t,i??"Runner error",{runner:r,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,logPath:n})}if(t.ready=!0,r.data&&"object"==typeof r.data&&!Array.isArray(r.data)){var a;let e,t=r.data;return"string"==typeof(e=(a=t).gestureFallback)&&0!==e.length&&E({level:"debug",phase:"ios_runner_gesture_fallback",data:{fallback:e,message:"string"==typeof a.gestureFallbackMessage?a.gestureFallbackMessage:void 0,hint:"string"==typeof a.gestureFallbackHint?a.gestureFallbackHint:void 0}}),t}return{}}function dY(e){return e.startupTimeoutMs??45e3}async function dQ(e,t,n){let r=Date.now();try{return await n()}finally{let n=Date.now()-r;e[t]=n,E({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:n})}}let d0=new h;function d1(e,t={}){return{runCommand:e,...t}}function d2(e,t,n,r={}){if(n)return d4(n);let i=function(e,t={}){let n=d0.getStore();return n&&n.deviceId===e.id&&(n.requestId?n.requestId===t.requestId:!t.requestId)?n:void 0}(e,r);return i?d4(i.provider):d4(t)}async function d3(e,t,n){if(!e)return await n();let r={provider:d4(e),deviceId:t.deviceId,requestId:t.requestId};return await d0.run(r,n)}function d4(e){return"function"==typeof e?{runCommand:e}:e}async function d5(e){let{device:t,session:n,command:r,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await d9(t,n,r,i,a,o);return await d8(l,{command:r,session:n,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function d8(e,t){var n,r,i,a;if(!e)return await d6(t,"status_recovery_unavailable");if("recovered"===e.type){return n=e,d7({command:(r=t).command,session:r.session,transportError:r.transportError,decision:"skipped",reason:n.reason,lifecycleState:n.lifecycleState}),n.data}if("skipInvalidation"===e.type){throw i=e,d7({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await d6(t,e.reason,e.lifecycleState,e.error)}async function d6(e,t,n,r){throw d7({command:e.command,session:e.session,transportError:e.transportError,decision:"retained",reason:t,lifecycleState:n}),await e.invalidateSession(e.session,e.invalidationReason),r??e.transportError}async function d9(e,t,n,r,i,a){var o,s,l,c,d,u,p,f,m,h,w,g,v,y,S,_,I,b,A,x,N,M;let D,k,P,C,R;if("status"===n.command||!n.commandId?.trim())return;try{D=await dz(e,t,{command:"status",statusCommandId:n.commandId},i.logPath,3e3,a)}catch(e){return E({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:n.command,commandId:n.commandId,error:e instanceof Error?e.message:String(e)}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let T="string"==typeof D.lifecycleState?D.lifecycleState:"";return E({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:n.command,commandId:n.commandId,lifecycleState:T}}),o=D,s=T,l=n,c=r,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"}:lx(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 F("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 F(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,lx(I.command)?b:new F("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 F("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:(M=l.command,`The runner did not confirm that "${M}" 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 d7(e){let{command:t,session:n,transportError:r,decision:i,reason:a,lifecycleState:o}=e;E({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:n.sessionId,transportError:r.message}})}async function ue(e,t){let n;lM(t.requestId);let r=na(t.requestId),i=lN({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await ut({device:e,command:i,options:t,signal:r,attempt:a,recoveryReason:n});if("prepared"===o.kind)return o.result;n=o.recoveryReason}throw new F("COMMAND_FAILED","iOS runner prepare failed")}async function ut(e){let{device:t,command:n,options:r,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await dO(t,{...r,cleanStaleBundles:a>1||r.cleanStaleBundles}),c=Date.now()-s;try{var d,u;let e=await ul(t,l,n,r,i,c,{recoveryReason:o});return{kind:"prepared",result:(d=t,u=e,uc(d,u),u)}}catch(e){return await un({device:t,session:l,command:n,options:r,signal:i,attempt:a,error:e})}}async function un(e){var t;let n,{device:r,session:i,command:a,options:o,signal:s,attempt:l,error:c}=e,d=c instanceof F?c:new F("COMMAND_FAILED",String(c));if(1===l&&(t=d,(n=i.xctestrunArtifact)&&"miss"!==n.cache&&ua(t)))return{kind:"prepared",result:await ur({device:r,session:i,command:a,options:o,signal:s,error:d})};if(!ua(d))throw c;let u=d.message||"runner_health_failed";if(l>=2)throw await ui(i,"prepare_runner_health_failed"),c;return lM(o.requestId),await dq(i,"prepare_runner_health_retry"),E({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 ur(e){var t,n,r,i,a;let{device:o,session:s,command:l,options:c,signal:d,error:u}=e,p=u.message||"runner_health_failed";await dq(s,"prepare_cached_runner_health_failed"),await cV(s.xctestrunArtifact,p);let f=Date.now(),m=await dO(o,{...c,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await ul(o,m,l,c,d,h,{recoveryReason:p});return E({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,n=e,uc(t,n),n}catch(n){let e;await ui(m,"prepare_rebuilt_runner_health_failed");let t=(r=n,i=m,a=p,e=r instanceof F?r:new F("COMMAND_FAILED",String(r)),new F(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 uc(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 ui(e,t){try{await dq(e,t)}catch{}}function ua(e){let t;return!nl(e)&&(l_(e)||lI(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function uo(e,t,n){let r;lM(n.requestId);let i=na(n.requestId);try{let a=(r=await dO(e,n)).ready?45e3:dY(r);return await dz(e,r,t,n.logPath,a,i)}catch(o){let a=o instanceof F?o:new F("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&lI(a)&&r)return lM(n.requestId),await us({device:e,session:r,command:t,options:n,signal:i,restartReason:"runner_connect_failed_before_command_send"});if(r&&function(e){let t;return e.details?.runnerReadinessPreflightFailed===!0&&(l_(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return lM(n.requestId),await us({device:e,session:r,command:t,options:n,signal:i,restartReason:"runner_readiness_preflight_failed_before_command_send",recoveredDiagnosticPhase:"ios_runner_readiness_preflight_recovered"});if(r&&l_(a))return await d5({device:e,session:r,command:t,transportError:a,options:n,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:dq});throw o}}async function us(e){let{device:t,command:n,options:r,signal:i,restartReason:a}=e;await dq(e.session,a);let o=await dO(t,{...r,cleanStaleBundles:!0});try{let a=await dz(t,o,n,r.logPath,45e3,i);return e.recoveredDiagnosticPhase&&E({level:"debug",phase:e.recoveredDiagnosticPhase,data:{command:n.command,commandId:n.commandId,recovery:"session_restarted",sessionId:o.sessionId}}),a}catch(a){let e=a instanceof F?a:new F("COMMAND_FAILED",String(a));if(l_(e))return await d5({device:t,session:o,command:n,transportError:e,options:r,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:dq});throw a}}async function ul(e,t,n,r,i,a,o){var s,l,c,d,u;let p,f,m=Date.now();return s=await dz(e,t,n,r.logPath,r.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 uc(e,t){E({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 ud(e,t,n={}){dW(e),lM(n.requestId);let r=lN(t),i=uf(e,n);return lx(r.command)?ea(()=>(lM(n.requestId),i.runCommand(e,r,n)),{shouldRetry:e=>(lM(n.requestId),l_(e))}):i.runCommand(e,r,n)}function uu(e,t={}){if("ios"!==e.platform)return;let n=uf(e,t);return n.prewarm?n.prewarm(e,t).then(()=>{}).catch(t=>{E({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}})}):void E({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function up(e,t){dW(e),lM(t.requestId);let n=lN({command:"uptime"}),r=uf(e,t);if(r.prepare)return await r.prepare(e,t);let i=Date.now();return{runner:await r.runCommand(e,n,t),connectMs:0,healthCheckMs:Math.max(0,Date.now()-i)}}function uf(e,t){return d2(e,um,void 0,{requestId:t.requestId})}let um=d1(uo,{prepare:ue,prewarm:async(e,t)=>{await ue(e,{...t,healthTimeoutMs:45e3})}}),uh=new WeakMap;async function uw(e){var t,n;let r,i,{sessionStore:a,leaseRegistry:o}=e,s=(r={...(t=function(e){let t=X(e.meta?.sessionIsolation??e.flags?.sessionIsolation),n=e.meta?.tenantId??e.flags?.tenant,r=W(n);if(n&&!r)throw new F("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!r)throw new F("INVALID_ARGS","session isolation mode tenant requires --tenant (or meta.tenantId).");let i=e.session||"default";return i.startsWith(`${r}:`)?{...e,meta:{...e.meta,tenantId:r,sessionIsolation:t}}:{...e,session:`${r}:${i}`,meta:{...e.meta,tenantId:r,sessionIsolation:t}}}(e.req)).flags??{}},tm(t.command,r)?{...t,flags:r}:t),l=s.command,c=function(e){var t,n;let r=e.session||la;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 r;let i=ls(e);return i?(t=i.id,n=r,`cwd:${t}:${n}`):r}(s),d=A(),u=a.resolveSessionDir(c),p=t1(u,s.meta?.requestId??d.requestId),f=t0(u);M({session:c,logPath:p}),E({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 n;if(n=e.command,rf(n)?.leaseAdmissionExempt===!0||e.meta?.sessionIsolation!=="tenant")return;let r=ld(e);t.assertLeaseAdmission({tenantId:r.tenantId,runId:r.runId,leaseId:r.leaseId,backend:r.leaseBackend})}(s,o);let m=rf(l)?.sessionExecutionLockExempt!==!0?await lm({req:s,sessionName:c,sessionStore:a}):[],h=(n=o,(i=uh.get(n))||(i=new Map,uh.set(n,i)),i);return{req:s,command:l,sessionName:c,requestLogPath:p,runnerLogPath:f,throwIfCanceled:()=>ns(s.meta?.requestId),runLocked:async e=>(ns(s.meta?.requestId),0===m.length)?await e():await ug(h,m,async()=>(ns(s.meta?.requestId),await e()))}}async function ug(e,t,n){let[r,...i]=t;return r?await le(e,r,async()=>await ug(e,i,n)):await n()}function uv(){return{ok:!1,error:$(new F("UNAUTHORIZED","Invalid token"))}}async function uy(e){let{lockedScope:t,logPath:n,sessionStore:r}=e,i=r.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 sq({req:t.req,session:i,sessionName:t.sessionName,logPath:n,sessionStore:r,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function uS(e){E({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=A(),n=x({force:!0})??void 0;return{ok:!1,error:$(e,{diagnosticId:t.diagnosticId,logPath:n})}}async function u_(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function uI(e,t){let n=t.includeTokens?.filter(e=>e.length>0)??[],r="",i=r=>{(!(n.length>0)||n.some(e=>r.includes(e)))&&e.write(function(e,t){if(0===t.length)return e;let n=e;for(let e of t)n=n.replace(e,"[REDACTED]");return n}(r,t.redactionPatterns))};return{onChunk:e=>{let t=`${r}${e}`.split("\n");for(let e of(r=t.pop()??"",t))i(`${e}
14
- `)},flush:()=>{r&&(i(r),r="")}}}function ub(e,t,n){let r=e.stdout,i=e.stderr;return r&&i?(r.setEncoding("utf8"),i.setEncoding("utf8"),r.on("data",n.writer.onChunk),i.on("data",n.writer.onChunk),t.on("error",()=>{e.killed||e.kill("SIGKILL")}),e.on("error",()=>t.destroy()),new Promise(r=>{e.on("close",e=>{n.writer.flush(),n.endStreamOnClose&&t.end(),r({stdout:"",stderr:"",exitCode:e??1})})})):Promise.resolve({stdout:"",stderr:"missing stdio pipes",exitCode:1})}function uA(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new F("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function ux(e,t){let n=(await ti(ep(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return n&&/^\d+$/.test(n)?n:null}async function uN(e,t){var n,r;let i;uA(t);let a=await ux(e,t),o=ti(ep(e)),s=await eg(o,{lines:4e3,timeoutMs:3e3}).catch(()=>"");if(0===s.trim().length)return null;let l=function(e,t,n){let r=new Set;for(let i of(n&&r.add(n),e.split("\n")))if(i.includes(t))for(let e of function(e,t){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=[RegExp(`\\bStart proc\\s+(\\d+):${n}(?:\\b|/)`,"i"),RegExp(`\\b(\\d+):${n}(?:\\b|/)`,"i"),RegExp(`${n}.*?\\bpid\\s*[=:]?\\s*(\\d+)\\b`,"i"),RegExp(`\\bpid\\s*[=:]?\\s*(\\d+)\\b.*${n}`,"i")],i=[];for(let t of r){let n=t.exec(e),r=n?.[1];r&&/^\d+$/.test(r)&&i.push(r)}return i}(i,t))r.add(e);return[...r]}(s,t,a);if(0===l.length)return null;let c=(n=s,r=t,i=new Set(l),n.split("\n").filter(e=>{var t;let n;if(!e.trim())return!1;if(e.includes(r))return!0;let a=(t=e,n=/\(\s*(\d+)\)\s*:/.exec(t),n?.[1]??null);return!!a&&i.has(a)}).join("\n"));return 0===c.trim().length?null:{pid:a,text:c,recoveredPids:l}}async function uM(e,t,n,r,i){let a,o,s="recovering",l=!1,c=(async()=>{try{for(;!l;){let c=await ux(e,t);if(!c){s="recovering",await ez(1e3);continue}let d=tr(ep(e)),u=ed(d,{pid:c});a=u;let p=uI(n,{redactionPatterns:r});if(o=ub(u,n,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&t4(i,u.pid),s="active",await o,t5(i),a=void 0,o=void 0,l)break;s="recovering",await ez(500)}return{stdout:"",stderr:"",exitCode:0}}finally{n.end(),t5(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:c,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await u_(o),a&&!a.killed&&a.kill("SIGKILL"),await u_(c),t5(i)}}}function uE(e,t){let n=uP(e),r=[`subsystem == "${n}"`,`subsystem CONTAINS "${n}"`,`processImagePath ENDSWITH[c] "/${n}"`,`senderImagePath ENDSWITH[c] "/${n}"`];if(t){let e=uP(t);r.push(`process == "${e}"`,`processImagePath ENDSWITH[c] "/${e}"`,`senderImagePath ENDSWITH[c] "/${e}"`,`processImagePath CONTAINS[c] "/${e}.app/"`,`senderImagePath CONTAINS[c] "/${e}.app/"`)}return r.join(" OR ")}async function uD(e){let{deviceId:t,appBundleId:n,executableName:r,startedAt:i,simulatorSetPath:a}=e,o=lg(["spawn",t,"log","show","--style","compact","--info","--predicate",uE(n,r)],{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 uk(e,t,n,r,i,a){let o=await uC({deviceId:e,appBundleId:t,simulatorSetPath:i});return uO({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:n,executableName:r,simulatorSetPath:i}=e;return lg(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",uE(n,r)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:n,redactionPatterns:r,pidPath:a})}function uP(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function uC(e){let{deviceId:t,appBundleId:n,simulatorSetPath:r}=e,a=await iO(lg(["get_app_container",t,n,"app"],{simulatorSetPath:r}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=i.join(o,"Info.plist"),l=await q("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function uR(e,t,n,r){return uO({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",uE(e)],stream:t,redactionPatterns:n,pidPath:r})}async function uT(e,t,n,r){return uO({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:n,pidPath:r})}function uO(e){let t="active",n=U(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});n.wait.catch(()=>{});let r=n.child,i=uI(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof r.pid&&t4(e.pidPath,r.pid);let a=ub(r,e.stream,{endStreamOnClose:!0,writer:i}).then(n=>(0!==n.exitCode&&(t="failed"),t5(e.pidPath),n),n=>{throw t="failed",t5(e.pidPath),n});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{r.killed||r.kill("SIGINT"),await u_(a),r.killed||r.kill("SIGKILL"),await u_(a),t5(e.pidPath)}}}let uL=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),u$=/https?:\/\/[^\s"'<>\])]+/i,uF=[/\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 uU(e,t,n=e.limits.maxEntries){let r=[...e.entries],i=new Set(r.map(e=>uq(e)));for(let e of t.entries){let t=uq(e);if(!i.has(t)&&(i.add(t),r.push(e),r.length>=n))break}return{...e,matchedLines:r.length,entries:r}}function uG(e,t){let n=uZ(t?.maxEntries,25,1,200),r=t?.backend,i=t?.include??"summary",a=uZ(t?.maxPayloadChars,2048,64,16384),o=uZ(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<n;e-=1){let t=c[e];if(!t?.trim())continue;let n=function(e,t,n,r,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 n=e.lastIndexOf("}");if(n<=t)return null;let r=e.slice(t,n+1);try{let e=JSON.parse(r);return e&&"object"==typeof e?e:null}catch{return null}}(o),l=uW(s,["method","httpMethod"]),c=uW(s,["url","requestUrl"]),d=function(e,t){if(!e)return null;for(let n of t){let t=e[n];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=uL.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=u$.exec(o),h=c??m?.[0];if(!h)return null;let w=d??uV(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:uB(o),packetId:uH(o)??void 0,durationMs:uK(o)??void 0,raw:uX(o,a),line:n};if("android"===r&&function(e,t,n){let r=uj(t,n,5),i=e.packetId??r.map(e=>uH(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?uj(t,n,12).filter(e=>uH(e)===i):r;e.timestamp||(e.timestamp=a.map(e=>uB(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>uV(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>uK(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 uJ(e)}let n=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return n?.[1]?.trim()}(o,s);e&&(g.headers=uX(e,a))}if("body"===i||"all"===i){let e=uz(o,s,["requestBody","body","payload","request"]),t=uz(o,s,["responseBody","response"]);e&&(g.requestBody=uX(e,a)),t&&(g.responseBody=uX(t,a))}return g}(c,e,l+e+1,r,i,a);n&&d.push(n)}return{path:t?.path??"<memory>",exists:!0,scannedLines:c.length,matchedLines:d.length,entries:d,include:i,limits:{maxEntries:n,maxPayloadChars:a,maxScanLines:o}}}function uq(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function uj(e,t,n){let r=[],i=Math.max(0,t-n),a=Math.min(e.length-1,t+n);for(let t=i;t<=a;t+=1){let n=e[t]?.trim();n&&r.push(n)}return r}function uV(e){for(let t of uF){let n=t.exec(e);if(!n)continue;let r=Number.parseInt(n[1]??"",10);if(Number.isInteger(r))return r}return null}function uB(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 n=/\b\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\b/.exec(e);return n?.[0]}function uH(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function uK(e){let t=/\b(?:duration|elapsed request\/response time, ms)[:= ]+(\d+)\b/i.exec(e);if(!t)return null;let n=Number.parseInt(t[1]??"",10);return Number.isInteger(n)?n:null}function uW(e,t){if(e)for(let n of t){let t=e[n];if("string"==typeof t&&t.trim().length>0)return t.trim()}}function uz(e,t,n){if(t){for(let e of n)if(void 0!==t[e])return uJ(t[e])}for(let t of n){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=RegExp(`\\b${n}["'=: ]+(.+)$`,"i").exec(e);if(r?.[1])return r[1].trim()}}function uJ(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function uX(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function uZ(e,t,n,r){return void 0!==e&&Number.isInteger(e)?Math.max(n,Math.min(r,e)):t}let uY={start:async e=>await u6(e)},uQ=iI(uY,function(e={}){return{...uY,...e}});async function u0(e,t){return await uQ.run(e,t)}function u1(e,t){let n=process.env[e];if(!n)return t;let r=Number.parseInt(n,10);return Number.isInteger(r)&&r>0?r:t}function u2(e){let t=i.dirname(e);a.existsSync(t)||a.mkdirSync(t,{recursive:!0}),function(e,t){if(a.existsSync(e)&&!(a.statSync(e).size<t.maxBytes))for(let n=t.maxRotatedFiles;n>=1;n-=1){let t=1===n?e:`${e}.${n-1}`,r=`${e}.${n}`;a.existsSync(t)&&(a.existsSync(r)&&a.unlinkSync(r),a.renameSync(t,r))}}(e,{maxBytes:u1("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:u1("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function u3(e){if(!a.existsSync(e))return{exists:!1,sizeBytes:0};let t=a.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}async function u4(e){var t,n,r,i;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=uZ(t?.maxEntries,25,1,200),s=t?.include??"summary",l=uZ(t?.maxPayloadChars,2048,64,16384),c=uZ(t?.maxScanLines,4e3,100,2e4),a.existsSync(m)?uG(a.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 u5({device:d,appBundleId:u,appLogPath:m,appLogState:p});if(I){let e=await uN(d.id,u);if(e){let t=uG(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=uU(t,S,h),_.push((n=I,r=e.recoveredPids,"stale-active"===n.reason?`Session app log stream was still bound to prior Android PID ${n.trackedPid}. Recovered recent Android HTTP entries from adb logcat for PID set ${r.join(", ")}.`:`Session app log stream was inactive. Recovered recent Android HTTP entries from adb logcat for PID set ${r.join(", ")}.`)))}}if("ios"===d.platform&&"simulator"===d.kind&&u&&0===S.entries.length){let e=await u9({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=uU(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"===(i=d).platform&&"simulator"===i.kind?"No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.":"ios"===i.platform?"No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.":"No HTTP(s) entries were found in recent session app logs."),{backend:y,dump:S,notes:_}}async function u5(e){let{device:t,appBundleId:n,appLogPath:r,appLogState:o}=e;if("android"!==t.platform||!n)return null;if(void 0!==o&&"active"!==o)return{reason:"inactive"};if("active"!==o)return null;let s=function(e){let t=function(e){if(!e||!a.existsSync(e))return null;try{return t3(a.readFileSync(e,"utf8"))}catch{return null}}(e)?.command;if(!t)return null;let n=/(?:^|\s)--pid\s+(\d+)(?:\s|$)/.exec(t);return n?.[1]??null}(i.join(i.dirname(r),t2));if(!s)return null;let l=await ux(t.id,n);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function u8(e,t,n,r){return await uQ.resolve(void 0).start({device:e,appBundleId:t,outPath:n,pidPath:r})}async function u6({device:e,appBundleId:t,outPath:n,pidPath:r}){u2(n);let i=a.createWriteStream(n,{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),n=[];for(let e of t)try{n.push(RegExp(e,"gi"))}catch{}return n}();if("ios"===e.platform)return"device"===e.kind?await uT(e.id,i,o,r):await uk(e.id,t,i,o,e.simulatorSetPath,r);if("android"===e.platform)return uA(t),await uM(e.id,t,i,o,r);if("macos"===e.platform)return await uR(t,i,o,r);throw i.end(),new F("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function u9(e){let t=await uD({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:uG(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 u7(e){await e.stop(),await u_(e.wait)}async function pe(e,t){let n={},r=[];if(t||r.push("No app bundle is tracked in this session. Run open <app> first for app-scoped logs."),"android"===e.platform){try{let t=await en(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});n.adbAvailable=0===t.exitCode}catch{n.adbAvailable=!1}if(t)try{n.androidPidVisible=(await en(e,["shell","pidof",t],{allowFailure:!0,timeoutMs:1e3})).stdout.trim().length>0}catch{n.androidPidVisible=!1}}if("ios"===e.platform&&"simulator"===e.kind)try{let e=await iO(["simctl","help"],{allowFailure:!0});n.simctlAvailable=0===e.exitCode}catch{n.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await iO(["devicectl","--version"],{allowFailure:!0});n.devicectlAvailable=0===e.exitCode}catch{n.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await q("log",["help"],{allowFailure:!0});n.logAvailable=0===e.exitCode}catch{n.logAvailable=!1}return{checks:n,notes:r}}function pt(e,t){u2(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
16
- `;a.appendFileSync(e,n,"utf8")}function pn(e){let t=i.dirname(e),n=i.basename(e);a.existsSync(t)||a.mkdirSync(t,{recursive:!0}),a.existsSync(e)?a.truncateSync(e,0):a.writeFileSync(e,"","utf8");let r=0;for(let e of a.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let o=e.slice(n.length+1);if(/^\d+$/.test(o))try{a.unlinkSync(i.join(t,e)),r+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:r}}function pr(e,t){if("simulator"!==e.kind)throw new F("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function pi(){await iT("open",["-a","Simulator"],{allowFailure:!0,timeoutMs:1e4})}async function pa(e){let t,n;if("simulator"!==e.kind||"Booted"===await ps(e))return;let r=eo.fromTimeoutMs(18e4);try{await em(async({deadline:r})=>{if(r?.isExpired())throw new F("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:18e4});let i=Math.max(1e3,r?.remainingMs()??18e4),a=await iO(lv(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 F("COMMAND_FAILED","simctl boot failed",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let l=await iO(lv(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:i});if(n={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==n.exitCode)throw new F("COMMAND_FAILED","simctl bootstatus failed",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode});let c=await ps(e);if("Booted"!==c)throw new F("COMMAND_FAILED","Simulator is still booting",{state:c})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let r=ec({error:e,stdout:n?.stdout??t?.stdout,stderr:n?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});return"IOS_BOOT_TIMEOUT"!==r&&"CI_RESOURCE_STARVATION_SUSPECTED"!==r}},{deadline:r,phase:"boot",classifyReason:e=>ec({error:e,stdout:n?.stdout??t?.stdout,stderr:n?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(a){let i=ec({error:a,stdout:n?.stdout??t?.stdout,stderr:n?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});throw new F("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:18e4,elapsedMs:r.elapsedMs(),reason:i,hint:eu(i),boot:t,bootstatus:n})}await pi()}async function po(e){let t=lv(e,["shutdown",e.id]),n=await iO(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===n.exitCode,exitCode:n.exitCode,stdout:String(n.stdout??""),stderr:String(n.stderr??"")}}async function ps(e){let t="string"==typeof e?e:e.id,n="string"==typeof e?lg(["list","devices","-j"]):lv(e,["list","devices","-j"]),r=await iO(n,{allowFailure:!0,timeoutMs:6e4});if(0!==r.exitCode)return null;try{let e=JSON.parse(String(r.stdout??""));for(let n of Object.values(e.devices??{})){let e=n.find(e=>e.udid===t);if(e)return e.state}return null}catch{return null}}let pl="shared_prefs/ReactNativeDevPrefs.xml",pc="debug_http_host",pd="dev_server_https",pu="RCT_jsLocation",pp="RCT_packager_scheme",pf="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.",pm='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function ph(e){return void 0!==P(e)}async function pw(e){let{device:t,appId:n,runtime:r}=e;if(!n)return;let i=P(r);if(i){if("android"===t.platform)return void await pv(t,n,i);"ios"===t.platform&&"simulator"===t.kind&&await pI(t,n,i)}}async function pg(e){let{device:t,appId:n}=e;if(n){if("android"===t.platform)return void await py(t,n);"ios"===t.platform&&"simulator"===t.kind&&await pb(t,n)}}async function pv(e,t,n){var r,i,a,o,s,l;let c,d;pM(t);let u=(r=await pS(e,t),i=pc,a=`${n.host}:${n.port}`,c=` <string name="${pE(i)}">${pE(a)}</string>`,px(pN(r,i),c));o=u,s=pd,l="https"===n.scheme,d=` <boolean name="${pE(s)}" value="${l?"true":"false"}" />`,u=px(pN(o,s),d),await p_(e,t,u)}async function py(e,t){pM(t);let n=await pS(e,t),r=pN(n,pc),i=pN(r,pd);i!==n&&await p_(e,t,i)}async function pS(e,t){let n=await en(e,["shell","run-as",t,"cat",pl],{allowFailure:!0});return 0!==n.exitCode?pm:pA(n.stdout)}async function p_(e,t,n){let r=["shell","run-as",t,"id"],i=await en(e,r,{allowFailure:!0});if(0!==i.exitCode){let e=pD(i.stdout,i.stderr);throw new F("COMMAND_FAILED",e?`Failed to access Android app sandbox for ${t}`:`Failed to probe Android app sandbox for ${t}`,{package:t,cmd:"adb",args:r,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,hint:e?pf:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await en(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await en(e,["shell","run-as",t,"tee",pl],{stdin:n.trimEnd()})}catch(r){let e=L(r);if("TOOL_MISSING"===e.code)throw e;let n=pD("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new F("COMMAND_FAILED",n?`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:n?pf:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function pI(e,t,n){await iO(lv(e,["spawn",e.id,"defaults","write",t,pu,"-string",`${n.host}:${n.port}`])),await iO(lv(e,["spawn",e.id,"defaults","write",t,pp,"-string",n.scheme]))}async function pb(e,t){await iO(lv(e,["spawn",e.id,"defaults","delete",t,pu]),{allowFailure:!0}),await iO(lv(e,["spawn",e.id,"defaults","delete",t,pp]),{allowFailure:!0})}function pA(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
18
- `:pm}function px(e,t){return pA(e).replace("</map>",`${t}
19
- </map>`)}function pN(e,t){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return pA(e).replace(RegExp(`^\\s*<string name="${n}">[\\s\\S]*?<\\/string>\\n?`,"m"),"").replace(RegExp(`^\\s*<boolean name="${n}" value="(?:true|false)"\\s*\\/?>\\n?`,"m"),"")}function pM(e){if("binary"!==ew(e))return;let t=eS(e);throw new F("INVALID_ARGS",t,{package:e,hint:t})}function pE(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function pD(e,t){let n=`${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=>n.includes(e))}let pk=new Map;async function pP(e){let t=await w.mkdtemp(i.join(u.tmpdir(),"agent-device-materialized-"));try{let r=await pT(e.installablePath,i.join(t,"installable")),a=e.archivePath?await pT(e.archivePath,i.join(t,"archive")):void 0,o=n.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,c=setTimeout(()=>{pC(o)},s);return pk.set(o,{rootPath:t,installablePath:r,archivePath:a,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:c}),{materializationId:o,installablePath:r,...a?{archivePath:a}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await w.rm(t,{recursive:!0,force:!0}),e}}async function pC(e,t){let n=pk.get(e);if(!n)throw new F("INVALID_ARGS",`Materialized paths not found: ${e}`);if(n.tenantId&&n.tenantId!==t)throw new F("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(n.timer),pk.delete(e),await w.rm(n.rootPath,{recursive:!0,force:!0})}async function pR(e){let t=Array.from(pk.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await pC(e)}))}async function pT(e,t){let n=await w.stat(e);await w.mkdir(t,{recursive:!0});let r=i.join(t,i.basename(e));return n.isDirectory()?await w.cp(e,r,{recursive:!0}):await w.copyFile(e,r),r}async function pO(e,t){let n=["devicectl",...e],r=await iO(n,{allowFailure:!0,timeoutMs:2e4});if(0===r.exitCode)return;let i=String(r.stdout??""),a=String(r.stderr??"");throw new F("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:n,exitCode:r.exitCode,stdout:i,stderr:a,deviceId:t.deviceId,hint:pG(i,a)??pU})}async function pL(e,t){var n;return n=function(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.bundleIdentifier?e.bundleIdentifier.trim():"";if(!t)continue;let r="string"==typeof e.name&&e.name.trim().length>0?e.name.trim():t,i="string"==typeof e.url&&e.url.trim().length>0?e.url.trim():void 0;n.push({bundleId:t,name:r,url:i})}return n}(await pF(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"})),ib(n,t)}async function p$(e){return function(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.executable?e.executable.trim():"",r="number"==typeof e.processIdentifier&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;t&&Number.isFinite(r)&&n.push({executable:t,pid:r})}return n}(await pF(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 pF(e,t){let n=i.join(u.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),r=[...t.args,"--json-output",n],a=await iO(r,{allowFailure:!0,timeoutMs:2e4});try{if(0!==a.exitCode){let n=String(a.stdout??""),i=String(a.stderr??"");throw new F("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:r,exitCode:a.exitCode,stdout:n,stderr:i,deviceId:e.id,hint:pG(n,i)??pU})}return JSON.parse(await s.readFile(n,"utf8"))}catch(n){if(n instanceof F)throw n;throw new F("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(n)})}finally{await s.unlink(n).catch(()=>{})}}let pU="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function pG(e,t){let n=`${e}
21
- ${t}`.toLowerCase();return n.includes("device is busy")&&n.includes("connecting")?"iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.":n.includes("coredeviceservice")&&n.includes("timed out")?"CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.":null}let pq=new Map;async function pj(e){var t;let n,r=(n="simulator"===(t=e).kind?t.simulatorSetPath??"":"",JSON.stringify([t.platform,t.kind,t.id,t.target??"",n])),i=pq.get(r);if(void 0!==i){if(i>Date.now())return;pq.delete(r)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:t}=await Promise.resolve(t_);await t(e),pV(r);return}if("device"===e.kind){await pB(e.id),pV(r);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./8806.js");await t(e.id),pV(r)}}function pV(e){pq.set(e,Date.now()+5e3)}async function pB(e){let t=i.join(u.tmpdir(),`agent-device-ready-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=Math.max(1,Math.ceil(15));try{let r=await iO(["devicectl","device","info","details","--device",e,"--json-output",t,"--timeout",String(n)],{allowFailure:!0,timeoutMs:18e3}),i=String(r.stdout??""),a=String(r.stderr??""),o=await pH(t);if(0===r.exitCode){if(!o.parsed)throw new F("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 F("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 F("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:e,stdout:i,stderr:a,exitCode:r.exitCode,tunnelState:o?.tunnelState,hint:pK(i,a)})}catch(t){if(t instanceof F&&"COMMAND_FAILED"===t.code){if("not_ready"===("string"==typeof t.details?.kind?t.details.kind:""))throw t;let n=t.details??{},r=String(n.stdout??""),i=String(n.stderr??""),a=Number(n.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 F("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:a,stdout:r,stderr:i,hint:r||i?pK(r,i):o},t)}throw new F("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,hint:"Reconnect the device, keep it unlocked, and retry."},t instanceof Error?t:void 0)}finally{await s.rm(t,{force:!0}).catch(()=>{})}}async function pH(e){try{let t=await s.readFile(e,"utf8"),n=JSON.parse(t),r=function(e){let t=e?.result;if(!t||"object"!=typeof t)return{};let n=t.connectionProperties?.tunnelState,r=t.device?.connectionProperties?.tunnelState,i="string"==typeof n?n:"string"==typeof r?r:void 0;return i?{tunnelState:i}:{}}(n);return{parsed:!0,tunnelState:r.tunnelState}}catch{return{parsed:!1}}}function pK(e,t){let n=pG(e,t);return n||(`${e}
22
- ${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":pU)}let pW=300,pz=300;function pJ(e,t,n){return t||rs(n,ri)?null:aL("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function pX(e){return"string"==typeof e?.session&&e.session.trim().length>0}function pZ(e){return"ios"===e.platform&&"simulator"===e.kind}async function pY(e,t){pZ(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function pQ(e){let t=rs(e.flags,ri)||!e.session?await n8(e.flags??{}):await p0(e.session.device);return!1!==e.ensureReady&&await pj(t),t}async function p0(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 n8(t)}catch(e){if(!(e instanceof F)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await n8({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function p1(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 p2(e,t){return!!t&&0===lr(t,e).length}async function p3(e){let t=await en(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 p4(e){let{device:t,shutdownRequested:n}=e;if(n&&(pZ(t)||"android"===t.platform&&"emulator"===t.kind))try{return pZ(t)?await po(t):await p3(t)}catch(t){let e=$(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function p5(e){if(await dV(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await i1("dismiss",t).catch(t=>{E({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function p8(e,t){e.appLog&&await u7(e.appLog),nX(e.device.platform)&&await p5(e),await pR(t).catch(()=>{})}async function p6(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n);if(!a)return await p9(t,r);a.appLog&&await u7(a.appLog),t.positionals&&t.positionals.length>0&&(nX(a.device.platform)&&!pZ(a.device)&&await p5(a),await r9(a.device,"close",t.positionals,t.flags?.out,{...ab(r,t.flags,a.appBundleId,a.trace?.outPath)}),await pY(a.device,pW)),nX(a.device.platform)&&(!pZ(a.device)||t.flags?.shutdown||a.recording)?await p5(a):nX(a.device.platform)&&E({level:"debug",phase:"ios_runner_retained_after_close",data:{session:a.name,deviceId:a.device.id}}),ph(i.getRuntimeHints(n))&&a.appBundleId&&await pg({device:a.device,appId:a.appBundleId}).catch(()=>{}),i.recordAction(a,{command:"close",positionals:t.positionals??[],flags:t.flags??{},result:{session:a.name,...eX(`Closed: ${a.name}`)}}),t.flags?.saveScript&&(a.recordSession=!0),i.writeSessionLog(a),await pR(n).catch(()=>{}),i.delete(n);let o=await p4({device:a.device,shutdownRequested:t.flags?.shutdown});return o?{ok:!0,data:eZ({session:a.name,shutdown:o},`Closed: ${a.name}`)}:{ok:!0,data:{session:a.name,...eX(`Closed: ${a.name}`)}}}async function p9(e,t){if(!e.positionals||0===e.positionals.length)return aL("SESSION_NOT_FOUND","No active session");let n=await pQ({session:void 0,flags:e.flags,ensureReady:!0});return await r9(n,"close",e.positionals,e.flags?.out,{...ab(t,e.flags)}),await pY(n,pW),{ok:!0,data:{app:e.positionals[0],...eX(`Closed: ${e.positionals[0]}`)}}}async function p7(e,t=5e3){await Promise.all(e.map(async e=>{let n;await new Promise(r=>{n=setTimeout(()=>{!function(e){e.destroyConnections?.();let t="closeAllConnections"in e?e.closeAllConnections:void 0;if("function"==typeof t)return t.call(e);let n="closeIdleConnections"in e?e.closeIdleConnections:void 0;"function"==typeof n&&n.call(e)}(e),r()},t);try{e.close(()=>r())}catch{r()}}),n&&clearTimeout(n)}))}function fe(e){a.existsSync(e)&&a.unlinkSync(e)}function ft(e){if(!a.existsSync(e))return null;try{let t=JSON.parse(a.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function fn(e){let t=ft(e);if(!t||t.pid===process.pid)try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}function fr(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function fi(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(0,"127.0.0.1",()=>{e.off("error",r);let i=e.address();"object"==typeof i&&i?.port?n(i.port):r(new F("COMMAND_FAILED",t))})})}(async function(e={}){let t,r,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}=J(o.AGENT_DEVICE_STATE_DIR),h=Y(o.AGENT_DEVICE_DAEMON_SERVER_MODE);var w,v,y,S=m;if(a.existsSync(S))for(let e of a.readdirSync(S,{withFileTypes:!0})){if(!e.isDirectory())continue;let t=i.join(S,e.name,t2);if(a.existsSync(t))try{let e=t3(a.readFileSync(t,"utf8"));if(e&&function(e){let t,n=D(e.pid);if(!n||e.startTime&&n!==e.startTime)return!1;let r=k(e.pid);return!!r&&!!((t=r.toLowerCase().replaceAll("\\","/")).includes("log stream")||t.includes("logcat")||t.includes("devicectl device log stream"))&&(!e.command||r===e.command)}(e))try{process.kill(e.pid,"SIGTERM")}catch{}}catch{}finally{t5(t)}}let _=new tQ(m),I=new nz({maxActiveSimulatorLeases:fr(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:fr(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:fr(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:fr(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),N=tt(),M=n.randomBytes(24).toString("hex"),P=D(process.pid)??void 0,C=Q(),T=function(e){let{logPath:t,token:n,androidAdbProvider:r,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 r=!!(e.meta?.debug||e.flags?.verbose);return await b({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:r,logPath:t},async()=>{if(e.token!==n)return uv();try{return await n7(d,async()=>{let t=await uw({req:e,sessionStore:p,leaseRegistry:f});return await h(t)})}catch(e){return uS(e)}})}async function h(e,t){let n=async()=>{let n=function(e){var t,n,r;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 n;if(!((n=(t=e).recording)&&"ios"===t.device.platform&&"ios"!==n.platform&&!1!==n.showTouches))return;let r=e.recording,i=dG(e.device.id);if(!r.runnerSessionId){i?.alive&&(r.runnerSessionId=i.sessionId);return}if(!i?.alive){r.invalidatedReason??="iOS runner session exited during recording";return}i.sessionId!==r.runnerSessionId&&(r.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:lu(t.req,a),existingSession:a}),p=u.req;d=u.existingSession;let f=e=>(function(e,t,n){let r=A();if(!t.ok){E({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=x({force:!0})??void 0;return{ok:!1,error:$(new F(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:r.diagnosticId,logPath:e})}}return E({level:"info",phase:"request_success"}),x(),{ok:!0,data:function(e,t,n){var r,a;let o;if(!t)return t;let s=(r=e,o=Array.isArray((a=t).artifacts)?[...a.artifacts]:[],"screenshot"!==r.command||o.some(e=>e?.field==="path")||"string"!=typeof a.path||o.push({field:"path",path:a.path,localPath:r.meta?.clientArtifactPaths?.path,fileName:i.basename(r.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 r=t.path;return{field:t.field,artifactId:n({artifactPath:r,tenantId:e.meta?.tenantId,fileName:t.fileName}),fileName:t.fileName,localPath:t.localPath}})}}(e,t.data,n)}})(p,e,l);if(d?.recording?.invalidatedReason&&(n=o.command,rf(n)?.allowInvalidRecording!==!0))return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:d.recording.invalidatedReason}})};d&&!p.meta?.lockPolicy&&(r=o.command,rf(r)?.selectorValidationExempt!==!0)&&function(e,t){let n=lr(e,t);if(0!==n.length)throw new F("INVALID_ARGS",`Session "${e.name}" is already bound to ${lt(e)}, but this request selected ${n.map(li).join(", ")}.`,{session:e.name,conflicts:n.map(li),hint:ln(e,"selector-conflict")})}(d,p.flags);let m=(e,t,n)=>{let r;return{...ab(c,e,t,n,r=A().requestId),requestId:r}};return{type:"scope",scope:{req:p,sessionName:o.sessionName,logPath:c,existingSession:d,finalize:f,contextFromFlags:m,handlerContextFromFlags:(e,t,n)=>({...m(e,t,n),surface:s.get(o.sessionName)?.surface})}}}({scope:e,sessionStore:p,trackDownloadableArtifact:u});if("response"===n.type)return n.response;let d=n.scope,f=async e=>await w({lockedScope:d,providerScope:e,allowReplayActions:void 0===t});return t?await f(t):await rh({req:d.req,existingSession:d.existingSession,providers:{androidAdbProvider:r,appleRunnerProvider:a,appleToolProvider:o,linuxToolProvider:s,appLogProvider:l,recordingProvider:c}},f)};return t?await n():await e.runLocked(n)}async function w(e){var t,r;let{lockedScope:i,providerScope:a,allowReplayActions:o}=e,s=await sQ({req:i.req,sessionName:i.sessionName,logPath:i.logPath,sessionStore:p,leaseRegistry:f,invoke:m,invokeReplayAction:o?(t=i,r=a,async e=>{var i,a,o;if(i=e,a=t,i.session!==a.sessionName||(o=i.command,rf(o)?.replayScopedAction!==!0))return await m(e);if(e.token!==n)return uv();try{let n=await uw({req:e,sessionStore:p,leaseRegistry:f});return n.sessionName===t.sessionName?await h(n,r):await m(e)}catch(e){return uS(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await uy({lockedScope:i,logPath:i.logPath,sessionStore:p})}return m}({logPath:f,token:M,sessionStore:_,leaseRegistry:I,trackDownloadableArtifact:nd}),U=async e=>{await b({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{E({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),x({force:!0})})},G=async e=>{let t=p8(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,ez(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))},j=async()=>{let e,t,n=[];if("http"!==h){let t,r,i=(t=new Set,(r=g.createServer(e=>{t.add(e),e.on("close",()=>t.delete(e));let n="",r=0,i=new Set,a=!1,o=()=>{if(!a&&0!==r){for(let e of(a=!0,i))nn(e);E({level:"warn",phase:"request_client_disconnected",data:{inFlightRequests:r}}),(async()=>{try{let e=Date.now()+15e3;for(;r>0&&Date.now()<e;){let{abortAllIosRunnerSessions:e}=await Promise.resolve(ty);if(await e(),r<=0)break;await ez(200)}}catch(e){E({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e),inFlightRequests:r}})}})()}};e.setEncoding("utf8"),e.on("close",o),e.on("error",o),e.on("data",async t=>{let a=H(n,t);for(let t of(n=a.buffer,a.lines)){let n,a;r+=1;let o=!1;try{let r=JSON.parse(t);if(o=z(r),a=ne(r.meta?.requestId,"socket"),r.meta={...r.meta,requestId:a},i.add(a),nt(a),ni(a))throw no();n=await nI(o?t=>{e.destroyed||e.write(ee(t))}:void 0,async()=>await T(r))}catch(e){n={ok:!1,error:$(e)}}finally{r-=1,a&&(i.delete(a),nr(a))}e.destroyed||e.write(o?K(n):`${JSON.stringify(n)}
25
- `)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},r);n.push(i),e=await fi(i,"Failed to bind socket server")}if("socket"!==h){let e=await nG({handleRequest:T,token:M});n.push(e),t=await fi(e,"Failed to bind HTTP server")}return{servers:n,socketPort:e,httpPort:t}};if(!function(e,t,n){a.existsSync(e)||a.mkdirSync(e,{recursive:!0});let r=JSON.stringify(n,null,2),i=()=>{try{return a.writeFileSync(t,r,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(i())return!0;let o=ft(t);if(o?.pid&&o.pid!==process.pid&&R(o.pid,o.processStartTime))return!1;try{a.unlinkSync(t)}catch{}return i()}(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 V=[];try{let e,n=await j();V=n.servers,t=n.socketPort,r=n.httpPort,w=t,v=r,y={socketPort:w,httpPort:v,token:M,version:N,codeSignature:C,processStartTime:P},a.existsSync(d)||a.mkdirSync(d,{recursive:!0}),a.writeFileSync(f,""),e=y.socketPort&&y.httpPort?"dual":y.httpPort?"http":"socket",a.writeFileSync(u,JSON.stringify({port:y.socketPort,httpPort:y.httpPort,transport:e,token:y.token,pid:process.pid,version:y.version,codeSignature:y.codeSignature,processStartTime:y.processStartTime,stateDir:d},null,2),{mode:384}),w&&s.write(`AGENT_DEVICE_DAEMON_PORT=${w}
9
+ ${r}`.toLowerCase()).includes("device is busy")&&n.includes("connecting")?"Target iOS device is still connecting. Keep it unlocked, wait for device trust/connection to settle, then retry.":`${eU("IOS_RUNNER_CONNECT_TIMEOUT")} ${lu}`)})}function lw(e){return"interactionFrame"===e||"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function lg(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${r.randomUUID()}`}}function lv(e){if(rn(e))throw ra()}let ly=new Map;async function lS(e,t,r,n,i=45e3,a,o){let s=eT.fromTimeoutMs(i),{getEndpoints:l}=lN(e,t),{endpoints:c}=await l(s.remainingMs()),d=null,u=Math.max(1,Math.ceil(i/250));try{return await ej(async({deadline:s})=>{let u=await l_({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 ra();return new ee("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:lf},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||rs(e))throw ra();d||(d=e)}if(o?.aborted)throw ra();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw lm({port:t,endpoints:c,logPath:n,lastError:d});let a=await lR(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw lm({port:t,endpoints:c,logPath:n,lastError:d})}async function l_(e){await lI(e);let t=await lb(e);if(t.response)return t.response;let r=await lA(e);return r||await lx(e,t.usedCachedTunnelIp)}async function lI(e){if(e.attemptDeadline?.isExpired())throw new ee("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 lh({session:e.session,port:e.port,logPath:e.logPath})}async function lb(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 lE(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,ly.delete(i))}}),usedCachedTunnelIp:r}}async function lA(e){return"simulator"===e.device.kind&&e.session?.ready?await lD(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function lx(e,t){var r;if("device"!==e.device.kind||!t)return null;r=e.device.id,ly.delete(r);let n=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(n.endpoints),await lE(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 lM(e,t,r,n=45e3,i){if(i?.aborted)throw ra();let a=eT.fromTimeoutMs(n),{getEndpoints:o}=lN(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new ee("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let c=a.remainingMs();if(c<=0)throw new ee("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await lP(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},c,i)}function lN(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,c=await lk({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 lE(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 ee("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await lP(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||rs(e))throw ra();s(t,e)}return null}async function lD(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 lR(e,t,r,s,i);return new Response(n.body,{status:n.status})}catch(e){if(i?.aborted||rs(e))throw ra();return o(e),null}}async function lk(e){var t,r,n;let{device:i,timeoutBudgetMs:a,forceRefresh:o,requestTunnelIp:s,setRequestTunnelIp:l}=e;if("device"!==i.kind)return{ip:null,sharedCacheHit:!1};if(!o){let e,r=(t=i.id,(e=ly.get(t))?e.expiresAt<=Date.now()?(ly.delete(t),null):e.ip:null);if(r)return{ip:r,sharedCacheHit:!0};if(void 0!==s)return{ip:s,sharedCacheHit:!1}}let c=await lC(i.id,a);return l(c),c&&(r=i.id,n=c,ly.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:c,sharedCacheHit:!1}}async function lP(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 lC(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,n=i.join(u.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),i=await iM(["devicectl","device","info","details","--device",e,"--json-output",n,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==i.exitCode||!a.existsSync(n))return null;let o=JSON.parse(a.readFileSync(n,"utf8"));if(o.info?.outcome&&"success"!==o.info.outcome)return null;let s=(o.result?.connectionProperties?.tunnelIPAddress??o.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{lF(n)}}async function lR(e,t,r,n,i){let a=JSON.stringify(r),o=lc(e,["spawn",e.id,"/usr/bin/curl","-s","-X","POST","-H","Content-Type: application/json","--data",a,`http://127.0.0.1:${t}/command`]),s=await iM(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=e$({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new ee("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:eU(e)})}return{status:200,body:l}}async function lT(){return await new Promise((e,t)=>{let r=g.createServer();r.listen(0,"127.0.0.1",()=>{let n=r.address();if("object"==typeof n&&n?.port){let t=n.port;r.close(()=>e(t))}else r.close(()=>t(new ee("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function lO(e,t,r,n){t&&l$(t,e),r&&l$(r,e),n&&process.stderr.write(e)}let lL=new Map;function l$(e,t){let r=(lL.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await a.promises.mkdir(i.dirname(e),{recursive:!0}),await a.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{lL.get(e)===r&&lL.delete(e)});lL.set(e,r)}function lF(e){try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}async function lU(e){let{lockDirPath:t,owner:r}=e,n=i.join(t,"owner.json"),o=Date.now()+(e.timeoutMs??3e4),s=e.pollMs??100,l=e.ownerGraceMs??5e3,c=e.description??"process lock";for(a.mkdirSync(i.dirname(t),{recursive:!0});Date.now()<o;)try{a.mkdirSync(t),function(e,t){let r=`${e}.${process.pid}.${Date.now()}.tmp`;a.writeFileSync(r,JSON.stringify(t),"utf8"),a.renameSync(r,e)}(n,r);let e=!1;return async()=>{e||(e=!0,a.rmSync(t,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,t,r){let n=null;try{n=a.statSync(e)}catch{return!0}let i=lG(t);if(i){var o;return!(Number.isInteger((o=i).pid)&&!(o.pid<=0)&&X(o.pid)&&(!o.startTime||H(o.pid)===o.startTime))&&(a.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-n.mtimeMs<r)&&(a.rmSync(e,{recursive:!0,force:!0}),!0)}(t,n,l))continue;await tc(s)}throw new ee("COMMAND_FAILED",`Timed out waiting for ${c}`,{lockDirPath:t,...function(e,t){let r,n=Date.now(),i=lG(t);try{r=Math.max(0,Math.round(n-a.statSync(e).mtimeMs))}catch{}return{...void 0!==r?{lockAgeMs:r}:{},...i?{ownerPid:i.pid,ownerStartTime:i.startTime,ownerAgeMs:Math.max(0,Math.round(n-i.acquiredAtMs))}:{}}}(t,n)})}function lG(e){try{return JSON.parse(a.readFileSync(e,"utf8"))}catch{return null}}let lq=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function lj(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new ee("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",xctestrunPath:r});let n=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of n)if(!a.existsSync(e))throw new ee("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await lV(e)){await ix("codesign",["--remove-signature",e],{allowFailure:!0});try{await ix("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof ee?n:new ee("COMMAND_FAILED",String(n));throw new ee("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 lV(e){return 0===(await ix("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let lB=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),lH=new Set([" "," ","\n","\r"]),lK=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function lW(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 lz(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)}lz(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(lK.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?lX(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])&&lB.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,lX(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])&&lH.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function lX(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 lZ=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function lY(e){var t;let r=await lQ(e);if(!r||0===r.length)return null;let n=i.dirname(e),o=new Set,s=function(e,t){let r=[],n=new Set,a=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){a.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);r.push(i.join(t,e));let s=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(e);s&&n.add(i.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(n),hostRelativePaths:a}}(r,n);for(let e of s.testRootPaths){if(!a.existsSync(e))return null;o.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>a.existsSync(i.join(t,e)));return r?i.join(r,e):null})){if(!e)return null;o.add(e)}return Array.from(o)}async function lQ(e){let t=await iN(e);if(t){var r,n,i,o=t;let e=new Set;for(let t of[i=o,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!l0(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(l0))}return r}(i),...Object.values(i).filter(e=>l0(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(lZ.has(r)){if("string"==typeof n){t.add(n);continue}if(Array.isArray(n))for(let e of n)"string"==typeof e&&t.add(e)}return Array.from(t)}(t))e.add(r);return Array.from(e)}if("darwin"===process.platform)return null;try{let t;return r=a.readFileSync(e,"utf8"),n=lW(r),t=new Set,lz(n,(e,r)=>{if(lZ.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 l0(e){return!!e&&"object"==typeof e}let l1=["CFBundleIcons","CFBundleIcons~ipad"];async function l2(e){let t=e.filter(l6);if(0===t.length)return;let r=e.filter(e=>l7(e)&&!l9(e));for(let e of t){let t=function(e,t){let r=i.dirname(e);return t.find(e=>i.dirname(e)===r&&"AgentDeviceRunner.app"===i.basename(e))??t.find(t=>i.dirname(t)===r&&t!==e)??null}(e,r);t&&await l3(t,e)}}async function l3(e,t){var r;let n,o=function(e,t){let r=!1;for(let o of a.readdirSync(e,{withFileTypes:!0})){var n;if(o.isFile()&&(n=o.name,/^AppIcon.*\.png$/.test(n)||"Assets.car"===n))(function(e,t){if(a.existsSync(t)){let r=a.readFileSync(e),n=a.readFileSync(t);return!r.equals(n)&&(a.copyFileSync(e,t),!0)}return a.copyFileSync(e,t),!0})(i.join(e,o.name),i.join(t,o.name))&&(r=!0)}return r}(e,t),s=await l4(e,t);(o||s)&&(await l8(t),r=t,n=new Date,a.utimesSync(r,n,n))}async function l4(e,t){var r,n;let a=i.join(e,"Info.plist"),o=i.join(t,"Info.plist"),s=await iN(a),l=await iN(o);if(!s||!l)return!1;let c=(r=s,n=l,l1.flatMap(e=>{let t=r[e];return void 0===t||JSON.stringify(n[e])===JSON.stringify(t)?[]:[{key:e,value:t,shouldInsert:void 0===n[e]}]}));if(0===c.length)return!1;for(let e of c)await l5(o,e.key,e.value,e.shouldInsert);return!0}async function l5(e,t,r,n){let i=await ix("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new ee("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function l8(e){let t=await ix("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new ee("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function l6(e){return l7(e)&&l9(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function l9(e){return i.basename(e).endsWith("-Runner.app")}function l7(e){return i.basename(e).endsWith(".app")}let ce={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 ct(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new ee("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":eS(e.target)}function cr(e){return"simulator"===e?"simulator":"device"}function cn(){return"arm64"===process.arch?"arm64":"x86_64"}let ci="XCTestDevices",ca=".agent-device-backup",co=".agent-device-xctestdevices-backup-",cs=i.join(u.homedir(),".agent-device","ios-runner"),cl=".agent-device-runner-cache.json",cc={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},cd=new Map,cu=new Set,cp=new Map,cf=new Set;function cm(e){return e?.trim()??""}function ch(e=process.env){return cm(e.AGENT_DEVICE_IOS_BUNDLE_ID)||cm(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function cw(e=process.env){let t=cm(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${ch(e)}.uitests`}let cg=function(e=process.env){let t=ch(e),r=cw(e);return Array.from(new Set([cm(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function cv(e=u.homedir()){return i.join(e,"Library","Developer","XCTestDevices")}async function cy(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=eP(e.simulatorSetPath);if(!r)return null;let n=i.resolve(r),o=i.resolve(t.xctestDeviceSetPath??cv()),s=i.resolve(t.backupPath??function(e=cv()){return`${e}${ca}`}(o)),l=i.resolve(t.lockDirPath??function(e=u.homedir()){return i.join(e,".agent-device","xctest-device-set.lock")}()),c=t.ownerStartTime??H(process.pid),d=await cI({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:c,acquiredAtMs:t.nowMs??Date.now()}});try{if(cS({xctestDeviceSetPath:o,backupPath:s}),function(e,t){if(i.resolve(e)===i.resolve(t))return!0;try{return a.realpathSync.native(e)===a.realpathSync.native(t)}catch{return!1}}(n,o))return await d(),null;a.mkdirSync(n,{recursive:!0}),a.existsSync(o)&&a.renameSync(o,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,n=i.dirname(r),o=i.join(n,`${ci}.agent-device-link-${process.pid}-${Date.now()}`);a.mkdirSync(n,{recursive:!0});try{a.symlinkSync(t,o,"dir"),a.renameSync(o,r)}catch(e){throw a.existsSync(o)&&c_(o),e}}({requestedSetPath:n,xctestDeviceSetPath:o})}catch(e){throw cS({xctestDeviceSetPath:o,backupPath:s}),await d(),new ee("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:n,xctestDeviceSetPath:o,backupPath:s,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{cS({xctestDeviceSetPath:o,backupPath:s})}finally{await d()}}}}}function cS(e){let{xctestDeviceSetPath:t,backupPath:r}=e,n=[r,...function(e){let t=i.dirname(e),r=i.basename(e).replace(ca,""),n=r===ci?co:`${r}${co}`;try{return a.readdirSync(t).filter(e=>e.startsWith(n)).sort().map(e=>i.join(t,e))}catch{return[]}}(r)],o=n.find(e=>a.existsSync(e)),s=a.existsSync(t)&&a.lstatSync(t).isSymbolicLink();if(o){if(s&&c_(t),a.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?a.rmSync(o,{recursive:!0,force:!0}):a.rmSync(r,{recursive:!0,force:!0});else a.mkdirSync(i.dirname(t),{recursive:!0}),a.renameSync(o,t);for(let e of n)e!==o&&a.existsSync(e)&&a.rmSync(e,{recursive:!0,force:!0});return}s&&(N({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),c_(t))}function c_(e){!a.existsSync(e)||a.lstatSync(e).isSymbolicLink()&&a.unlinkSync(e)}async function cI(e){return await lU({lockDirPath:e.lockDirPath,owner:e.owner,timeoutMs:e.timeoutMs??3e4,pollMs:e.pollMs??100,ownerGraceMs:5e3,description:e.description??"XCTest device set lock"})}async function cb(e){var t;return await cI({lockDirPath:(t=e,i.join(i.dirname(t),`${i.basename(t)}.lock`)),owner:{pid:process.pid,startTime:H(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function cA(e,t){let r=t_(),n=cP(e,r),i=cY(e,n);return await s1(cd,i,async()=>{let a=await cb(i);try{return await cx({device:e,options:t,projectRoot:r,expectedCacheMetadata:n,derived:i,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await a()}})}async function cx(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||cu.has(t))&&(c5("clean",r?"forced_rebuild":"forced_clean",{derived:t}),c3(t),cD(t),cu.delete(t));let l=await c4({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>cV(e,n),xctestrunReferencesProjectRoot:cH,resolveExistingXctestrunProductPaths:lY}),c="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&c5("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let d=await cM({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:c});return d||(l.xctestrunPath&&(c3(s),cD(s)),await cN({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:c,reason:l.reason}))}async function cM(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await cE(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function cN(e){let{device:t,options:r,projectRoot:n,expectedCacheMetadata:o,derived:s,cache:l,reason:c}=e,d=i.join(n,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!a.existsSync(d))throw new ee("COMMAND_FAILED","iOS runner project not found",{projectPath:d});let u=Date.now();await cZ(t,d,s,r);let p=Math.max(0,Date.now()-u),f=cV(s,t);if(!f)throw new ee("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await lY(f);if(!m)throw new ee("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await lj(t,m,f),await l2(m),cR(s,c$(o,f,m)),c5("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:c}}async function cE(e,t,r,n){try{var i,a,o,s;return await lj(e,n.productPaths,n.xctestrunPath),c5("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,cR(i,c$(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof ee))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&lq.has(t)}(e))throw e;return c5("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function cD(e){try{if(!a.existsSync(e))return;if("derived"!==i.basename(e))return void a.rmSync(e,{recursive:!0,force:!0});for(let r of a.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,ck.has(t)&&a.rmSync(i.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let ck=new Set([cl,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function cP(e,t=t_()){let n,o=ct(e);return{schemaVersion:2,packageVersion:tS(),runnerSourceFingerprint:function(e){let t=i.join(e,"ios-runner","AgentDeviceRunner"),n=function(e){if(!a.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of a.readdirSync(e,{withFileTypes:!0})){var n,o;let a=i.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(a);continue}s.isFile()&&(n=s.name,o=a,"project.pbxproj"===n?o.includes(`${i.sep}.xcodeproj${i.sep}`):[".jpg",".json",".png",".swift",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(i.extname(n)))&&t.push(a)}}return t.sort((e,t)=>e.localeCompare(t))}(t),o=function(e,t){let n=r.createHash("sha256");for(let r of t){let t=i.relative(e,r),o=a.statSync(r);n.update(t),n.update("\0"),n.update(String(o.size)),n.update("\0"),n.update(String(Math.trunc(o.mtimeMs))),n.update("\0")}return n.digest("hex")}(t,n),s=cj.get(t);if(s?.fileStatsFingerprint===o)return s.sourceFingerprint;let l=r.createHash("sha256");for(let e of n){let r=i.relative(t,e);l.update(r),l.update("\0"),l.update(a.readFileSync(e)),l.update("\0")}let c=l.digest("hex");return cj.set(t,{fileStatsFingerprint:o,sourceFingerprint:c}),c}(t),...function(e,t){var r;let n=(r=cC("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=ce[e].sdkName[cr(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:cC("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:cC("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(o,e.kind),platformName:o,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(n=ct(e))?`platform=macOS,arch=${cn()}`:"simulator"===e.kind?`generic/platform=${n} Simulator`:`generic/platform=${n}`,runnerBundleBuildSettings:c1(process.env),runnerSigningBuildSettings:c0(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:c2()}}function cC(e,t){let r=JSON.stringify([e,t]),n=cp.get(r);if(void 0!==n)return n;try{let n=ei(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return cp.set(r,i),i}catch{return cp.set(r,"unknown"),"unknown"}}function cR(e,t){a.mkdirSync(e,{recursive:!0}),a.writeFileSync(i.join(e,cl),`${JSON.stringify(t,null,2)}
10
+ `)}async function cT(e,t){cu.add(e.derived);let r=await cb(e.derived);try{c5("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),c3(e.derived),cD(e.derived)}finally{await r()}}function cO(e){let{artifacts:t,...r}=e;return r}function cL(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 c$(e,t,r){let n=function(e,t){let r=cU(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=cU(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 cF(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function cU(e){try{let t=a.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function cG(e,t){let r=cU(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function cq(e,t){let r=i.relative(i.resolve(t),i.resolve(e));return""!==r&&!r.startsWith("..")&&!i.isAbsolute(r)}let cj=new Map;function cV(e,t){if(!a.existsSync(e))return null;let r=[],n=[e];for(;n.length>0;){let e=n.pop();for(let t of a.readdirSync(e,{withFileTypes:!0})){let o=i.join(e,t.name);if(t.isDirectory()){n.push(o);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=a.statSync(o);r.push({path:o,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,r)=>{if(t){let n=cB(r.path,t)-cB(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function cB(e,t){let r=0,n=e.toLowerCase();i.basename(n).startsWith("agentdevicerunner.env.")&&(r-=1e3),n.includes(`${i.sep}macos${i.sep}`)&&(r-=5e3);let a=ce[ct(t)].xctestrunHints[cr(t.kind)];return a.preferred.length>0&&(a.preferred.some(e=>n.includes(e))?r+=2e3:r-=500),a.disallowed.some(e=>n.includes(e))&&(r-=2500),r}function cH(e,t){try{let r=a.readFileSync(e,"utf8"),n=new Set([t]);try{n.add(a.realpathSync(t))}catch{}for(let e of n)if(r.includes(e))return!0;return!1}catch{return!1}}async function cK(e,t,r){let n=i.dirname(e),a=r.replace(/[^a-zA-Z0-9._-]/g,"_"),o=i.join(n,`AgentDeviceRunner.env.${a}.json`),s=i.join(n,`AgentDeviceRunner.env.${a}.xctestrun`),l=await cW(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,cc),{requireTestBundlePath:!0}),await cz(l,o,s),{xctestrunPath:s,jsonPath:o}}async function cW(e){let t=await ix("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new ee("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 ee("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function cz(e,t,r){a.writeFileSync(t,JSON.stringify(e,null,2));let n=await ix("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new ee("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=cX(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=cX(r,{requireTestBundlePath:!0});e&&t(e)}}function cX(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function cZ(e,t,r,n){let i=c1(process.env),a=c0(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=c2(),l=await cy(e);try{let l;await er("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",cQ(e),"1","-destination",(l=ct(e),"macOS"===l?`platform=macOS,arch=${cn()}`:"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=>{cf.add(e),e.on("close",()=>{cf.delete(e)})},onStdoutChunk:e=>{lO(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{lO(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof ee?a:new ee("COMMAND_FAILED",String(a)),i=(e=r.details?JSON.stringify(r.details):"",((t=`${r.message}
11
+ ${e}`.toLowerCase()).includes("failed registering bundle identifier")||t.includes("app identifier")&&t.includes("not available")?"Set AGENT_DEVICE_IOS_BUNDLE_ID to a unique reverse-DNS value (for example, com.yourname.agentdevice.runner), then retry.":t.includes("requires a development team")?"Configure signing in Xcode or set AGENT_DEVICE_IOS_TEAM_ID for physical-device runs.":t.includes("no profiles for")||t.includes("provisioning profile")?"Install/select a valid iOS provisioning profile, or set AGENT_DEVICE_IOS_PROVISIONING_PROFILE.":t.includes("code signing")?"Enable Automatic Signing in Xcode or provide AGENT_DEVICE_IOS_TEAM_ID and optional AGENT_DEVICE_IOS_SIGNING_IDENTITY.":void 0)??lu);throw new ee("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await l?.release()}}function cY(e,t){let n,a=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(a)return i.resolve(a);let o=(n=r.createHash("sha256").update(cL(cO(t))).digest("hex"),`cache-${n.slice(0,16)}`),s=function(e){return i.join(cs,"derived",ce[ct(e)].derivedBaseName[cr(e.kind)])}(e);return i.join(s,o)}function cQ(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function c0(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 c1(e=process.env){let t=ch(e),r=cw(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function c2(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function c3(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,n;if(r=e,t=i.resolve(t_(),".tmp"),""===(n=i.relative(t,i.resolve(r)))||n.startsWith("..")||i.isAbsolute(n))throw new ee("COMMAND_FAILED","Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically",{derivedPath:e,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${i.join(t_(),".tmp")}.`})}}async function c4(e){var t,r;let n,o=(t=e.derived,r=e.expectedCacheMetadata,(n=function(e){try{let t=JSON.parse(a.readFileSync(i.join(e,cl),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?cL(cO(n))!==cL(cO(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:n}:{ok:!1,reason:"cache_metadata_missing"}),s=o.ok?function(e,t){var r;let n=t?.artifacts;if(!(!(!(r=n)||"object"!=typeof r||Array.isArray(r))&&"string"==typeof r.xctestrunPath&&Number.isInteger(r.xctestrunMtimeMs)&&Number.isInteger(r.xctestrunSize)&&Array.isArray(r.productPaths)&&r.productPaths.length>0&&r.productPaths.every(cF))||!cq(n.xctestrunPath,e)||!cG(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!cq(t.path,e)||!cG(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 c5(e,t,r){N({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let c8=process.pid,c6=H(process.pid),c9=(tT=c8,tO=c6,(e=r.createHash("sha256")).update(String(tT)),e.update("\0"),e.update(tO??"unknown-start"),`owner-${tT}-${e.digest("hex").slice(0,8)}`);async function c7(e,t){let r=await lU({lockDirPath:`${da(e)}.lock`,owner:{pid:c8,startTime:c6,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await r()}}function de(e){try{let t=JSON.parse(a.readFileSync(da(e),"utf8"));return function(e,t){var r,n,i;let a;if(!e||"object"!=typeof e||Array.isArray(e)||1!==e.schemaVersion||e.deviceId!==t)return null;let o=(r=e,a={ownerToken:ds(r.ownerToken),ownerPid:dl(r.ownerPid),sessionId:ds(r.sessionId),port:dl(r.port),xctestrunPath:ds(r.xctestrunPath),jsonPath:ds(r.jsonPath),createdAtMs:(n=r.createdAtMs,"number"==typeof n&&Number.isFinite(n)?n:null)},Object.values(a).some(e=>null===e)?null:a);return o?{schemaVersion:1,deviceId:t,...o,ownerStartTime:(i=e.ownerStartTime,"string"==typeof i?i:null),runnerPid:dl(e.runnerPid)}:null}(t,e)}catch{return null}}function dt(e){var t;return e?e.ownerToken===c9?{type:"owned",lease:e}:X((t=e).ownerPid)&&(!t.ownerStartTime||H(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function dr(e,t){let r=dt(de(e));if("empty"===r.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===r.type)throw new ee("COMMAND_FAILED",`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,ownerPid:r.lease.ownerPid,ownerStartTime:r.lease.ownerStartTime,ownerToken:r.lease.ownerToken,sessionId:r.lease.sessionId,hint:"Use a different simulator/session, wait for the other run to finish, or stop the owning daemon before retrying."});await dc(r.lease,r.type,t)}async function dn(e,t){let r=dt(de(e));"owned"===r.type&&await dc(r.lease,"owned",t)}function di(e){e&&function(e){let t=de(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{a.unlinkSync(da(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function da(e){let t;return i.join((t=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim())?i.resolve(t):i.join(u.homedir(),".agent-device","ios-runner","leases"),`${e.replaceAll(/[^A-Za-z0-9._-]/g,"-")||"unknown-device"}.json`)}function ds(e){return"string"==typeof e&&e.length>0?e:null}function dl(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function dc(e,t,r){N({level:"stale"===t?"warn":"debug",phase:"ios_runner_lease_cleanup",data:{deviceId:e.deviceId,ownerPid:e.ownerPid,ownerToken:e.ownerToken,runnerPid:e.runnerPid,sessionId:e.sessionId,reason:t}}),await r.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGTERM"),await r.cleanupRunnerXcodebuildProcesses(e.deviceId,e.ownerToken),await r.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGKILL"),r.cleanupTempFile(e.xctestrunPath),r.cleanupTempFile(e.jsonPath),di(e)}let dd={cleanupRunnerProcessTree:d_,cleanupRunnerXcodebuildProcesses:dI,cleanupTempFile:lF};async function du(e,t={}){var r;!1!==t.graceful?await dh(e):await d_(e.child.pid,"SIGTERM"),await dw(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(dv(r)||z(r))&&await d_(e.child.pid,"SIGKILL"),await dg(e)}async function dp(e){await dn(e,dd)}async function df(e){let t=Array.from(cf);await dy(e,"SIGINT"),await dS(t,"SIGINT"),await dy(e,"SIGTERM"),await dS(t,"SIGTERM"),await dy(e,"SIGKILL"),await dS(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await dg(e)}))}async function dm(){let e=Array.from(cf);await Promise.allSettled(e.map(async e=>{try{await d_(e.pid,"SIGTERM"),await d_(e.pid,"SIGKILL")}finally{cf.delete(e)}}))}async function dh(e){try{await lS(e.device,e.port,lg({command:"shutdown"}),void 0,15e3)}catch{await d_(e.child.pid,"SIGTERM")}}async function dw(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function dg(e){lF(e.xctestrunPath),lF(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{di(e.lease)}}function dv(e){return!!e&&X(e)}async function dy(e,t){await Promise.allSettled(e.map(async e=>{await d_(e.child.pid,t)}))}async function dS(e,t){await Promise.allSettled(e.map(async e=>{await d_(e.pid,t),"SIGKILL"===t&&cf.delete(e)}))}async function d_(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 ix("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function dI(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${db(e)}-${db(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${db(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await ix("pkill",[`-${t}`,"-f",r],{allowFailure:!0,timeoutMs:2e3})}catch(r){N({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:t,error:r instanceof Error?r.message:String(r)}})}}function db(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}let dA=new Map,dx=new Map;async function dM(e,t){return await s1(dx,e.id,async()=>{let r=dA.get(e.id);if(r){let t=await dE(e,r);if(t)return t}return await c7(e.id,async()=>await dN(e,t))})}async function dN(e,t){var r,n;let o,s,l={};await dB(l,"cleanup_stale_xcodebuild",async()=>{await dr(e.id,dd)}),await dB(l,"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()):d$(t))}),t.cleanStaleBundles?await dB(l,"cleanup_stale_bundles",async()=>{await dD(e)}):(l.cleanup_stale_bundles=0,N({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let c=await dB(l,"ensure_xctestrun",async()=>await cA(e,t));l.build_xctestrun=c.buildMs;let d=await dB(l,"allocate_port",async()=>await lT()),{xctestrunPath:u,jsonPath:p}=await dB(l,"prepare_xctestrun_env",async()=>await cK(c.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(d)},`session-${e.id}-${c9}-${d}`)),f=await dB(l,"simulator_set_redirect",async()=>await cy(e));try{({child:o,wait:s}=await dB(l,"launch_xcodebuild",()=>{let t;return et("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",cQ(e),"1","-destination-timeout",String(20),"-xctestrun",u,"-destination",(t=ct(e),"macOS"===t?`platform=macOS,arch=${cn()}`:"simulator"===e.kind?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(d)},detached:!0})}))}catch(e){throw await f?.release(),e}o.stdout?.on("data",e=>{lO(e,t.logPath,t.traceLogPath,t.verbose)}),o.stderr?.on("data",e=>{lO(e,t.logPath,t.traceLogPath,t.verbose)});let m=`${e.id}:${d}:${Date.now()}`,h={schemaVersion:1,deviceId:(r={deviceId:e.id,sessionId:m,runnerPid:o.pid,port:d,xctestrunPath:u,jsonPath:p}).deviceId,ownerToken:c9,ownerPid:c8,ownerStartTime:c6,sessionId:r.sessionId,runnerPid:r.runnerPid??null,port:r.port,xctestrunPath:r.xctestrunPath,jsonPath:r.jsonPath,createdAtMs:Date.now()},w={sessionId:m,device:e,deviceId:e.id,port:d,xctestrunPath:u,xctestrunArtifact:c,jsonPath:p,testPromise:s,child:o,ready:!1,startupTimeoutMs:"number"==typeof(n=t.startupTimeoutMs)&&Number.isFinite(n)&&n>0?Math.floor(n):void 0,startupTimings:l,simulatorSetRedirect:f??void 0,lease:h};try{let e,t;e=da(h.deviceId),a.mkdirSync(i.dirname(e),{recursive:!0}),t=`${e}.${process.pid}.${Date.now()}.tmp`,a.writeFileSync(t,JSON.stringify(h,null,2),"utf8"),a.renameSync(t,e)}catch(t){throw await dR(e.id,w,{graceful:!1,waitTimeoutMs:1e3}),t}return dA.set(e.id,w),w}async function dE(e,t){if(!dv(t.child.pid))return await dB({},"stop_stale_session",async()=>{await dR(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=cY(e,cP(e));return t.xctestrunArtifact?.derived!==r?(N({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:t.xctestrunArtifact?.derived,expectedDerived:r}}),await dB({},"stop_stale_artifact_session",async()=>{await dR(e.id,t)}),null):(N({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready}}),t)}async function dD(e){if("simulator"===e.kind)for(let t of cg){let r=await dk(e,t);if(!r||function(e){if(0===e.exitCode)return!0;let t=`${e.stdout}
12
+ ${e.stderr}`.toLowerCase();return t.includes("not installed")||t.includes("found nothing")||t.includes("no such file")||t.includes("invalid device")||t.includes("could not find")}(r))continue}}async function dk(e,t){try{return await iM(lc(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(r){N({level:"warn",phase:"ios_runner_startup_cleanup_stale_bundle_failed",data:{deviceId:e.id,bundleId:t,timeoutMs:1e4,error:r instanceof Error?r.message:String(r)}});return}}function dP(e){let t=dA.get(e);return t?{sessionId:t.sessionId,alive:dv(t.child.pid)}:null}async function dC(e,t){await s1(dx,e.deviceId,async()=>{dA.get(e.deviceId)===e&&(N({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await dR(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function dR(e,t,r={}){let n=t??dA.get(e);n&&(await du(n,r),dA.get(e)===n&&dA.delete(e))}async function dT(e){await s1(dx,e,async()=>{await c7(e,async()=>{await dR(e),await dp(e)})})}async function dO(){let e=Array.from(dA.values());for(let t of(await df(e),e))dA.get(t.deviceId)===t&&dA.delete(t.deviceId)}async function dL(){await dO();let e=Array.from(dA.keys());await Promise.allSettled(e.map(async e=>{await dT(e)})),await dm()}async function d$(e){await iM(lc(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}function dF(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new ee("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new ee("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function dU(e,t,r,n,i,a){var o,s,l,c,d;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 u=lg(r),p=lw(u.command),f=eT.fromTimeoutMs(i),m=function(e,t){var r;let n=lw(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 dq({device:e,session:t,runnerCommand:u,logPath:n,deadline:f,signal:a,decision:m}):(l=u,c=t,d=m,N({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:l.command,commandId:l.commandId,reason:d.reason,sessionReady:c.ready}}));let h=await dG({device:e,session:t,runnerCommand:u,logPath:n,deadline:f,timeoutMs:i,signal:a,readOnlyCommand:p});try{let e=await dj(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 dC(t,r),e}catch(r){let e=function(e){if(e instanceof ee){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 dC(t,e),r}}async function dG(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 ee("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 lS(t,r.port,n,i,c,r,s):await lM(t,r.port,n,c,s),d)}async function dq(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(dV(r),a.remainingMs());try{let e=await x("ios_runner_readiness_preflight",async()=>await lS(t,r.port,lg({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,sessionReady:r.ready,timeoutMs:l});await dj(e,r,i)}catch(t){var c,d;let e;throw d={runnerReadinessPreflightFailed:!0},e=(c=t)instanceof ee?c:new ee("COMMAND_FAILED",c instanceof Error?c.message:String(c),void 0,c),new ee(e.code,e.message,{...e.details??{},...d},e.cause??c)}}async function dj(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new ee("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?Z(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 ee(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&&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 dV(e){return e.startupTimeoutMs??45e3}async function dB(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 dH=new h;function dK(e,t={}){return{runCommand:e,...t}}function dW(e,t,r,n={}){if(r)return dJ(r);let i=function(e,t={}){let r=dH.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?dJ(i.provider):dJ(t)}async function dz(e,t,r){if(!e)return await r();let n={provider:dJ(e),deviceId:t.deviceId,requestId:t.requestId};return await dH.run(n,r)}function dJ(e){return"function"==typeof e?{runCommand:e}:e}async function dX(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await dQ(t,r,n,i,a,o);return await dZ(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function dZ(e,t){var r,n,i,a;if(!e)return await dY(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,d0({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,d0({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await dY(t,e.reason,e.lifecycleState,e.error)}async function dY(e,t,r,n){throw d0({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 dQ(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,M,E;let D,k,P,C,R;if("status"===r.command||!r.commandId?.trim())return;try{D=await dU(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 T="string"==typeof D.lifecycleState?D.lifecycleState:"";return N({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"}:lw(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 ee("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 ee(Z(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,lw(I.command)?b:new ee("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,M=_,`The runner is still reachable and reports "${x}" is ${M}, 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 ee("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 d0(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}})}async function d1(e,t){let r;lv(t.requestId);let n=ri(t.requestId),i=lg({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await d2({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new ee("COMMAND_FAILED","iOS runner prepare failed")}async function d2(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await dM(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles}),c=Date.now()-s;try{var d,u;let e=await d7(t,l,r,n,i,c,{recoveryReason:o});return{kind:"prepared",result:(d=t,u=e,ue(d,u),u)}}catch(e){return await d3({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function d3(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:c}=e,d=c instanceof ee?c:new ee("COMMAND_FAILED",String(c));if(1===l&&(t=d,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&d8(t)))return{kind:"prepared",result:await d4({device:n,session:i,command:a,options:o,signal:s,error:d})};if(!d8(d))throw c;let u=d.message||"runner_health_failed";if(l>=2)throw await d5(i,"prepare_runner_health_failed"),c;return lv(o.requestId),await dC(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 d4(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 dC(s,"prepare_cached_runner_health_failed"),await cT(s.xctestrunArtifact,p);let f=Date.now(),m=await dM(o,{...c,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await d7(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,ue(t,r),r}catch(r){let e;await d5(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof ee?n:new ee("COMMAND_FAILED",String(n)),new ee(e.code,"artifact restored but runner did not connect",{...e.details??{},restoredFailureReason:a,xctestrunPath:i.xctestrunArtifact?.xctestrunPath,artifact:i.xctestrunArtifact?.artifact,cache:i.xctestrunArtifact?.cache,reason:e.message},e));throw ue(o,{cache:m.xctestrunArtifact?.cache,artifact:m.xctestrunArtifact?.artifact,buildMs:m.xctestrunArtifact?.buildMs,connectMs:h,healthCheckMs:0,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,failureReason:t.message}),t}}async function d5(e,t){try{await dC(e,t)}catch{}}function d8(e){let t;return!rs(e)&&(lp(e)||lf(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function d6(e,t,r){let n;lv(r.requestId);let i=ri(r.requestId);try{let a=(n=await dM(e,r)).ready?45e3:dV(n);return await dU(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof ee?o:new ee("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&lf(a)&&n)return lv(r.requestId),await d9({device:e,session:n,command:t,options:r,signal:i,restartReason:"runner_connect_failed_before_command_send"});if(n&&function(e){let t;return e.details?.runnerReadinessPreflightFailed===!0&&(lp(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return lv(r.requestId),await d9({device:e,session:n,command:t,options:r,signal:i,restartReason:"runner_readiness_preflight_failed_before_command_send",recoveredDiagnosticPhase:"ios_runner_readiness_preflight_recovered"});if(n&&lp(a))return await dX({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:dC});throw o}}async function d9(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await dC(e.session,a);let o=await dM(t,{...n,cleanStaleBundles:!0});try{let a=await dU(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 ee?a:new ee("COMMAND_FAILED",String(a));if(lp(e))return await dX({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:dC});throw a}}async function d7(e,t,r,n,i,a,o){var s,l,c,d,u;let p,f,m=Date.now();return s=await dU(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 ue(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 ut(e,t,r={}){dF(e),lv(r.requestId);let n=lg(t),i=ui(e,r);return lw(n.command)?eR(()=>(lv(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(lv(r.requestId),lp(e))}):i.runCommand(e,n,r)}function ur(e,t={}){if("ios"!==e.platform)return;let r=ui(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 un(e,t){dF(e),lv(t.requestId);let r=lg({command:"uptime"}),n=ui(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 ui(e,t){return dW(e,ua,void 0,{requestId:t.requestId})}let ua=dK(d6,{prepare:d1,prewarm:async(e,t)=>{await d1(e,{...t,healthTimeoutMs:45e3})}}),uo=new WeakMap;async function us(e){var t,r;let n,i,{sessionStore:a,leaseRegistry:o}=e,s=(n={...(t=function(e){let t=ep(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=ec(r);if(r&&!n)throw new ee("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new ee("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??{}},tR(t.command,n)?{...t,flags:n}:t),l=s.command,c=function(e){var t,r;let n=e.session||s8;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=s9(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(s),d=b(),u=a.resolveSessionDir(c),p=tQ(u,s.meta?.requestId??d.requestId),f=tY(u);M({session:c,logPath:p}),N({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,ns(r)?.leaseAdmissionExempt===!0||e.meta?.sessionIsolation!=="tenant")return;let n=lt(e);t.assertLeaseAdmission({tenantId:n.tenantId,runId:n.runId,leaseId:n.leaseId,backend:n.leaseBackend})}(s,o);let m=ns(l)?.sessionExecutionLockExempt!==!0?await la({req:s,sessionName:c,sessionStore:a}):[],h=(r=o,(i=uo.get(r))||(i=new Map,uo.set(r,i)),i);return{req:s,command:l,sessionName:c,requestLogPath:p,runnerLogPath:f,throwIfCanceled:()=>ro(s.meta?.requestId),runLocked:async e=>(ro(s.meta?.requestId),0===m.length)?await e():await ul(h,m,async()=>(ro(s.meta?.requestId),await e()))}}async function ul(e,t,r){let[n,...i]=t;return n?await s1(e,n,async()=>await ul(e,i,r)):await r()}function uc(){return{ok:!1,error:Q(new ee("UNAUTHORIZED","Invalid token"))}}async function ud(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 sC({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function uu(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:Q(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function up(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function uf(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}
13
+ `)},flush:()=>{n&&(i(n),n="")}}}function um(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 uh(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new ee("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function uw(e,t){let r=(await tb(eG(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function ug(e,t){var r,n;let i;uh(t);let a=await uw(e,t),o=tb(eG(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 uv(e,t,r,n,i){let a,o,s="recovering",l=!1,c=(async()=>{try{for(;!l;){let c=await uw(e,t);if(!c){s="recovering",await tc(1e3);continue}let d=tI(eG(e)),u=eF(d,{pid:c});a=u;let p=uf(r,{redactionPatterns:n});if(o=um(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&t2(i,u.pid),s="active",await o,t3(i),a=void 0,o=void 0,l)break;s="recovering",await tc(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),t3(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:c,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await up(o),a&&!a.killed&&a.kill("SIGKILL"),await up(c),t3(i)}}}function uy(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 uS(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=ll(["spawn",t,"log","show","--style","compact","--info","--predicate",uy(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 iM(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")}
14
+ `,recoveredLineCount:l.length}}async function u_(e,t,r,n,i,a){let o=await ub({deviceId:e,appBundleId:t,simulatorSetPath:i});return uM({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return ll(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",uy(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 ub(e){let{deviceId:t,appBundleId:r,simulatorSetPath:n}=e,a=await iM(ll(["get_app_container",t,r,"app"],{simulatorSetPath:n}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=i.join(o,"Info.plist"),l=await en("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function uA(e,t,r,n){return uM({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",uy(e)],stream:t,redactionPatterns:r,pidPath:n})}async function ux(e,t,r,n){return uM({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function uM(e){let t="active",r=et(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=uf(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&t2(e.pidPath,n.pid);let a=um(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),t3(e.pidPath),r),r=>{throw t="failed",t3(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await up(a),n.killed||n.kill("SIGKILL"),await up(a),t3(e.pidPath)}}}let uN=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),uE=/https?:\/\/[^\s"'<>\])]+/i,uD=[/\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 uk(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>uC(e)));for(let e of t.entries){let t=uC(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function uP(e,t){let r=uj(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=uj(t?.maxPayloadChars,2048,64,16384),o=uj(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=uF(s,["method","httpMethod"]),c=uF(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=uN.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=uE.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:uO(o),packetId:uL(o)??void 0,durationMs:u$(o)??void 0,raw:uq(o,a),line:r};if("android"===n&&function(e,t,r){let n=uR(t,r,5),i=e.packetId??n.map(e=>uL(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?uR(t,r,12).filter(e=>uL(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>uO(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=>u$(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 uG(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=uq(e,a))}if("body"===i||"all"===i){let e=uU(o,s,["requestBody","body","payload","request"]),t=uU(o,s,["responseBody","response"]);e&&(g.requestBody=uq(e,a)),t&&(g.responseBody=uq(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 uC(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function uR(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 uD){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function uO(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 uL(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function u$(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 uF(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 uU(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return uG(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 uG(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function uq(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function uj(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let uV={start:async e=>await uQ(e)},uB=ip(uV,function(e={}){return{...uV,...e}});async function uH(e,t){return await uB.run(e,t)}function uK(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 uW(e){let t=i.dirname(e);a.existsSync(t)||a.mkdirSync(t,{recursive:!0}),function(e,t){if(a.existsSync(e)&&!(a.statSync(e).size<t.maxBytes))for(let r=t.maxRotatedFiles;r>=1;r-=1){let t=1===r?e:`${e}.${r-1}`,n=`${e}.${r}`;a.existsSync(t)&&(a.existsSync(n)&&a.unlinkSync(n),a.renameSync(t,n))}}(e,{maxBytes:uK("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:uK("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function uz(e){if(!a.existsSync(e))return{exists:!1,sizeBytes:0};let t=a.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}function uJ(e){return"macos"===e.platform?"macos":"ios"===e.platform?"device"===e.kind?"ios-device":"ios-simulator":"android"}async function uX(e){var t,r,n,i;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=uJ(d),S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},o=uj(t?.maxEntries,25,1,200),s=t?.include??"summary",l=uj(t?.maxPayloadChars,2048,64,16384),c=uj(t?.maxScanLines,4e3,100,2e4),a.existsSync(m)?uP(a.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 uZ({device:d,appBundleId:u,appLogPath:m,appLogState:p});if(I){let e=await ug(d.id,u);if(e){let t=uP(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=uk(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 u0({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=uk(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"===(i=d).platform&&"simulator"===i.kind?"No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.":"ios"===i.platform?"No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.":"No HTTP(s) entries were found in recent session app logs."),{backend:y,dump:S,notes:_}}async function uZ(e){let{device:t,appBundleId:r,appLogPath:n,appLogState:o}=e;if("android"!==t.platform||!r)return null;if(void 0!==o&&"active"!==o)return{reason:"inactive"};if("active"!==o)return null;let s=function(e){let t=function(e){if(!e||!a.existsSync(e))return null;try{return t1(a.readFileSync(e,"utf8"))}catch{return null}}(e)?.command;if(!t)return null;let r=/(?:^|\s)--pid\s+(\d+)(?:\s|$)/.exec(t);return r?.[1]??null}(i.join(i.dirname(n),t0));if(!s)return null;let l=await uw(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function uY(e,t,r,n){return await uB.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function uQ({device:e,appBundleId:t,outPath:r,pidPath:n}){uW(r);let i=a.createWriteStream(r,{flags:"a"}),o=function(){let e=process.env.AGENT_DEVICE_APP_LOG_REDACT_PATTERNS;if(!e)return[];let t=e.split(",").map(e=>e.trim()).filter(e=>e.length>0),r=[];for(let e of t)try{r.push(RegExp(e,"gi"))}catch{}return r}();if("ios"===e.platform)return"device"===e.kind?await ux(e.id,i,o,n):await u_(e.id,t,i,o,e.simulatorSetPath,n);if("android"===e.platform)return uh(t),await uv(e.id,t,i,o,n);if("macos"===e.platform)return await uA(t,i,o,n);throw i.end(),new ee("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function u0(e){let t=await uS({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:uP(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 u1(e){await e.stop(),await up(e.wait)}async function u2(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 ek(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await ek(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 iM(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await iM(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await en("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function u3(e,t){uW(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
15
+ `;a.appendFileSync(e,r,"utf8")}function u4(e){let t=i.dirname(e),r=i.basename(e);a.existsSync(t)||a.mkdirSync(t,{recursive:!0}),a.existsSync(e)?a.truncateSync(e,0):a.writeFileSync(e,"","utf8");let n=0;for(let e of a.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let o=e.slice(r.length+1);if(/^\d+$/.test(o))try{a.unlinkSync(i.join(t,e)),n+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:n}}let u5="shared_prefs/ReactNativeDevPrefs.xml",u8="debug_http_host",u6="dev_server_https",u9="RCT_jsLocation",u7="RCT_packager_scheme",pe="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.",pt='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function pr(e){return void 0!==W(e)}async function pn(e){let{device:t,appId:r,runtime:n}=e;if(!r)return;let i=W(n);if(i){if("android"===t.platform)return void await pa(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await pc(t,r,i)}}async function pi(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await po(t,r);"ios"===t.platform&&"simulator"===t.kind&&await pd(t,r)}}async function pa(e,t,r){var n,i,a,o,s,l;let c,d;pm(t);let u=(n=await ps(e,t),i=u8,a=`${r.host}:${r.port}`,c=` <string name="${ph(i)}">${ph(a)}</string>`,pp(pf(n,i),c));o=u,s=u6,l="https"===r.scheme,d=` <boolean name="${ph(s)}" value="${l?"true":"false"}" />`,u=pp(pf(o,s),d),await pl(e,t,u)}async function po(e,t){pm(t);let r=await ps(e,t),n=pf(r,u8),i=pf(n,u6);i!==r&&await pl(e,t,i)}async function ps(e,t){let r=await ek(e,["shell","run-as",t,"cat",u5],{allowFailure:!0});return 0!==r.exitCode?pt:pu(r.stdout)}async function pl(e,t,r){let n=["shell","run-as",t,"id"],i=await ek(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=pw(i.stdout,i.stderr);throw new ee("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?pe:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await ek(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await ek(e,["shell","run-as",t,"tee",u5],{stdin:r.trimEnd()})}catch(n){let e=Y(n);if("TOOL_MISSING"===e.code)throw e;let r=pw("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new ee("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?pe:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function pc(e,t,r){await iM(lc(e,["spawn",e.id,"defaults","write",t,u9,"-string",`${r.host}:${r.port}`])),await iM(lc(e,["spawn",e.id,"defaults","write",t,u7,"-string",r.scheme]))}async function pd(e,t){await iM(lc(e,["spawn",e.id,"defaults","delete",t,u9]),{allowFailure:!0}),await iM(lc(e,["spawn",e.id,"defaults","delete",t,u7]),{allowFailure:!0})}function pu(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
16
+ `:pt}function pp(e,t){return pu(e).replace("</map>",`${t}
17
+ </map>`)}function pf(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return pu(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 pm(e){if("binary"!==eB(e))return;let t=ez(e);throw new ee("INVALID_ARGS",t,{package:e,hint:t})}function ph(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function pw(e,t){let r=`${e}
18
+ ${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 pg=new Map;async function pv(e){let t=await w.mkdtemp(i.join(u.tmpdir(),"agent-device-materialized-"));try{let n=await p_(e.installablePath,i.join(t,"installable")),a=e.archivePath?await p_(e.archivePath,i.join(t,"archive")):void 0,o=r.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,c=setTimeout(()=>{py(o)},s);return pg.set(o,{rootPath:t,installablePath:n,archivePath:a,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:c}),{materializationId:o,installablePath:n,...a?{archivePath:a}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await w.rm(t,{recursive:!0,force:!0}),e}}async function py(e,t){let r=pg.get(e);if(!r)throw new ee("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new ee("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),pg.delete(e),await w.rm(r.rootPath,{recursive:!0,force:!0})}async function pS(e){let t=Array.from(pg.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await py(e)}))}async function p_(e,t){let r=await w.stat(e);await w.mkdir(t,{recursive:!0});let n=i.join(t,i.basename(e));return r.isDirectory()?await w.cp(e,n,{recursive:!0}):await w.copyFile(e,n),n}let pI=["Device Hub","Simulator"],pb=["Simulator"];function pA(e,t){if("simulator"!==e.kind)throw new ee("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function px(e={}){for(let t of e.preferStandalone?pb:pI)if(0===(await ix("open",["-a",t],{allowFailure:!0,timeoutMs:1e4})).exitCode)return}async function pM(e,t={}){let r,n;if("simulator"!==e.kind)return;if("Booted"===await pE(e)){t.focusExisting&&await px({preferStandalone:t.preferStandalone});return}let i=eT.fromTimeoutMs(18e4);try{await ej(async({deadline:t})=>{if(t?.isExpired())throw new ee("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:18e4});let i=Math.max(1e3,t?.remainingMs()??18e4),a=await iM(lc(e,["boot",e.id]),{allowFailure:!0,timeoutMs:i});r={stdout:String(a.stdout??""),stderr:String(a.stderr??""),exitCode:a.exitCode};let o=`${r.stdout}
19
+ ${r.stderr}`.toLowerCase(),s=o.includes("already booted")||o.includes("current state: booted");if(0!==r.exitCode&&!s)throw new ee("COMMAND_FAILED","simctl boot failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let l=await iM(lc(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:i});if(n={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==n.exitCode)throw new ee("COMMAND_FAILED","simctl bootstatus failed",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode});let c=await pE(e);if("Booted"!==c)throw new ee("COMMAND_FAILED","Simulator is still booting",{state:c})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let t=e$({error:e,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}});return"IOS_BOOT_TIMEOUT"!==t&&"CI_RESOURCE_STARVATION_SUSPECTED"!==t}},{deadline:i,phase:"boot",classifyReason:e=>e$({error:e,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(a){let t=e$({error:a,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}});throw new ee("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:18e4,elapsedMs:i.elapsedMs(),reason:t,hint:eU(t),boot:r,bootstatus:n})}await px({preferStandalone:t.preferStandalone})}async function pN(e){let t=lc(e,["shutdown",e.id]),r=await iM(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===r.exitCode,exitCode:r.exitCode,stdout:String(r.stdout??""),stderr:String(r.stderr??"")}}async function pE(e){let t="string"==typeof e?e:e.id,r="string"==typeof e?ll(["list","devices","-j"]):lc(e,["list","devices","-j"]),n=await iM(r,{allowFailure:!0,timeoutMs:6e4});if(0!==n.exitCode)return null;try{let e=JSON.parse(String(n.stdout??""));for(let r of Object.values(e.devices??{})){let e=r.find(e=>e.udid===t);if(e)return e.state}return null}catch{return null}}function pD(e){return"ios"===e.platform&&"simulator"===e.kind}async function pk(e){if(!1===e.booted)return{success:!0,exitCode:0,stdout:"",stderr:""};try{return pD(e)?await pP(e):await pR(e)}catch(t){let e=Q(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function pP(e){let t=await pN(e);return t.success?t:"Shutdown"===await pC(e)?{...t,success:!0,exitCode:0}:t}async function pC(e){try{return await pE(e)}catch{return null}}async function pR(e){let t=await ek(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 pT(e,t){let r=["devicectl",...e],n=await iM(r,{allowFailure:!0,timeoutMs:2e4});if(0===n.exitCode)return;let i=String(n.stdout??""),a=String(n.stderr??"");throw new ee("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:r,exitCode:n.exitCode,stdout:i,stderr:a,deviceId:t.deviceId,hint:pU(i,a)??pF})}async function pO(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 p$(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"})),im(r,t)}async function pL(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 p$(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 p$(e,t){let r=i.join(u.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=[...t.args,"--json-output",r],a=await iM(n,{allowFailure:!0,timeoutMs:2e4});try{if(0!==a.exitCode){let r=String(a.stdout??""),i=String(a.stderr??"");throw new ee("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:n,exitCode:a.exitCode,stdout:r,stderr:i,deviceId:e.id,hint:pU(r,i)??pF})}return JSON.parse(await s.readFile(r,"utf8"))}catch(r){if(r instanceof ee)throw r;throw new ee("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await s.unlink(r).catch(()=>{})}}let pF="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function pU(e,t){let r=`${e}
20
+ ${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 pG=new Map;async function pq(e,t={}){var r;let n,i=(n="simulator"===(r=e).kind?r.simulatorSetPath??"":"",JSON.stringify([r.platform,r.kind,r.id,r.target??"",n])),a=pG.get(i);if(void 0!==a){if(a>Date.now()&&!t.focusExisting)return;pG.delete(i)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:r}=await Promise.resolve(tG);await r(e,{focusExisting:t.focusExisting,preferStandalone:t.noDeviceHub}),pj(i);return}if("device"===e.kind){await pV(e.id),pj(i);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./8806.js");await t(e.id),pj(i)}}function pj(e){pG.set(e,Date.now()+5e3)}async function pV(e){let t=i.join(u.tmpdir(),`agent-device-ready-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),r=Math.max(1,Math.ceil(15));try{let n=await iM(["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 pB(t);if(0===n.exitCode){if(!o.parsed)throw new ee("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 ee("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 ee("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:pH(i,a)})}catch(t){if(t instanceof ee&&"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 ee("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:a,stdout:n,stderr:i,hint:n||i?pH(n,i):o},t)}throw new ee("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,hint:"Reconnect the device, keep it unlocked, and retry."},t instanceof Error?t:void 0)}finally{await s.rm(t,{force:!0}).catch(()=>{})}}async function pB(e){try{let t=await s.readFile(e,"utf8"),r=JSON.parse(t),n=function(e){let t=e?.result;if(!t||"object"!=typeof t)return{};let r=t.connectionProperties?.tunnelState,n=t.device?.connectionProperties?.tunnelState,i="string"==typeof r?r:"string"==typeof n?n:void 0;return i?{tunnelState:i}:{}}(r);return{parsed:!0,tunnelState:n.tunnelState}}catch{return{parsed:!1}}}function pH(e,t){let r=pU(e,t);return r||(`${e}
21
+ ${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":pF)}let pK=300,pW=300;function pz(e,t,r){return t||nt(r,r9)?null:aN("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function pJ(e){return"string"==typeof e?.session&&e.session.trim().length>0}async function pX(e,t){pD(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function pZ(e){let t=nt(e.flags,r9)||!e.session?await r0(e.flags??{}):await pY(e.session.device);return!1!==e.ensureReady&&await pq(t),t}async function pY(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 r0(t)}catch(e){if(!(e instanceof ee)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await r0({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function pQ(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 p0(e,t){return!!t&&0===s4(t,e).length}async function p1(e){let{device:t,shutdownRequested:r}=e;if(r&&(pD(t)||"android"===t.platform&&"emulator"===t.kind))return await pk(t)}async function p2(e){if(await dT(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await iK("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 p3(e,t){e.appLog&&await u1(e.appLog),eb(e.device.platform)&&await p2(e),await pS(t).catch(()=>{})}async function p4(e){let{req:t,sessionName:r,logPath:n,sessionStore:i}=e,a=i.get(r);if(!a)return await p5(t,n);a.appLog&&await u1(a.appLog),t.positionals&&t.positionals.length>0&&(eb(a.device.platform)&&!pD(a.device)&&await p2(a),await nQ(a.device,"close",t.positionals,t.flags?.out,{...am(n,t.flags,a.appBundleId,a.trace?.outPath)}),await pX(a.device,pK)),eb(a.device.platform)&&(!pD(a.device)||t.flags?.shutdown||a.recording)?await p2(a):eb(a.device.platform)&&N({level:"debug",phase:"ios_runner_retained_after_close",data:{session:a.name,deviceId:a.device.id}}),pr(i.getRuntimeHints(r))&&a.appBundleId&&await pi({device:a.device,appId:a.appBundleId}).catch(()=>{}),i.recordAction(a,{command:"close",positionals:t.positionals??[],flags:t.flags??{},result:{session:a.name,...tp(`Closed: ${a.name}`)}}),t.flags?.saveScript&&(a.recordSession=!0),i.writeSessionLog(a),await pS(r).catch(()=>{}),i.delete(r);let o=await p1({device:a.device,shutdownRequested:t.flags?.shutdown});return o?{ok:!0,data:tu({session:a.name,shutdown:o},`Closed: ${a.name}`)}:{ok:!0,data:{session:a.name,...tp(`Closed: ${a.name}`)}}}async function p5(e,t){if(!e.positionals||0===e.positionals.length)return aN("SESSION_NOT_FOUND","No active session");let r=await pZ({session:void 0,flags:e.flags,ensureReady:!0});return await nQ(r,"close",e.positionals,e.flags?.out,{...am(t,e.flags)}),await pX(r,pK),{ok:!0,data:{app:e.positionals[0],...tp(`Closed: ${e.positionals[0]}`)}}}async function p8(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 p6(e){a.existsSync(e)&&a.unlinkSync(e)}function p9(e){if(!a.existsSync(e))return null;try{let t=JSON.parse(a.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function p7(e){let t=p9(e);if(!t||t.pid===process.pid)try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}function fe(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function ft(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 ee("COMMAND_FAILED",t))})})}(async function(e={}){let t,n,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}=eu(o.AGENT_DEVICE_STATE_DIR),h=em(o.AGENT_DEVICE_DAEMON_SERVER_MODE);var w,v,y,S=m;if(a.existsSync(S))for(let e of a.readdirSync(S,{withFileTypes:!0})){if(!e.isDirectory())continue;let t=i.join(S,e.name,t0);if(a.existsSync(t))try{let e=t1(a.readFileSync(t,"utf8"));if(e&&function(e){let t,r=H(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=K(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{t3(t)}}let _=new tZ(m),x=new rW({maxActiveSimulatorLeases:fe(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:fe(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:fe(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:fe(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),M=tS(),D=r.randomBytes(24).toString("hex"),k=H(process.pid)??void 0,P=eh(),C=function(e){let{logPath:t,token:r,androidAdbProvider:n,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(!t4(e.token,r))return uc();try{return await r3(d,async()=>{let t=await us({req:e,sessionStore:p,leaseRegistry:f});return await h(t)})}catch(e){return uu(e)}})}async function h(e,t){let r=async()=>{let r=function(e){var t,r,n;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=dP(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:lr(t.req,a),existingSession:a}),p=u.req;d=u.existingSession;let f=e=>(function(e,t,r){let n=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:Q(new ee(Z(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??("string"==typeof t.error.details?.hint?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath}),{diagnosticId:n.diagnosticId,logPath:e})}}return N({level:"info",phase:"request_success"}),A(),{ok:!0,data:function(e,t,r){var n,a;let o;if(!t)return t;let s=(n=e,o=Array.isArray((a=t).artifacts)?[...a.artifacts]:[],"screenshot"!==n.command||o.some(e=>e?.field==="path")||"string"!=typeof a.path||o.push({field:"path",path:a.path,localPath:n.meta?.clientArtifactPaths?.path,fileName:i.basename(n.meta?.clientArtifactPaths?.path??a.path)}),o.filter(e=>!!(e&&"string"==typeof e.field&&"string"==typeof e.path&&"string"==typeof e.localPath&&e.localPath.length>0)));return 0===s.length?t:{...t,artifacts:s.map(t=>{let n=t.path;return{field:t.field,artifactId:r({artifactPath:n,tenantId:e.meta?.tenantId,fileName:t.fileName}),fileName:t.fileName,localPath:t.localPath}})}}(e,t.data,r)}})(p,e,l);if(d?.recording?.invalidatedReason&&(r=o.command,ns(r)?.allowInvalidRecording!==!0))return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:d.recording.invalidatedReason}})};d&&!p.meta?.lockPolicy&&(n=o.command,ns(n)?.selectorValidationExempt!==!0)&&function(e,t){let r=s4(e,t);if(0!==r.length)throw new ee("INVALID_ARGS",`Session "${e.name}" is already bound to ${s2(e)}, but this request selected ${r.map(s5).join(", ")}.`,{session:e.name,conflicts:r.map(s5),hint:s3(e,"selector-conflict")})}(d,p.flags);let m=(e,t,r)=>{let n;return{...am(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 nc({req:d.req,existingSession:d.existingSession,providers:{androidAdbProvider:n,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 sB({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,ns(o)?.replayScopedAction!==!0))return await m(e);if(!t4(e.token,r))return uc();try{let r=await us({req:e,sessionStore:p,leaseRegistry:f});return r.sessionName===t.sessionName?await h(r,n):await m(e)}catch(e){return uu(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await ud({lockedScope:i,logPath:i.logPath,sessionStore:p})}return m}({logPath:f,token:D,sessionStore:_,leaseRegistry:x,trackDownloadableArtifact:rc}),R=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})})},T=async e=>{let t=p3(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
22
+ `)});await Promise.race([t,tc(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
23
+ `)})]),_.writeSessionLog(e),_.delete(e.name)},O=async()=>{let e=_.toArray();await Promise.all(e.map(T))},$=async()=>{let e,t,r=[];if("http"!==h){let t,n,i=(t=new Set,(n=g.createServer(e=>{t.add(e),e.on("close",()=>t.delete(e));let r="",n=0,i=new Set,a=!1,o=()=>{if(!a&&0!==n){for(let e of(a=!0,i))rt(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 tc(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=es(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=ed(n),a=t7(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),re(a),rn(a))throw ra();r=await r_(o?t=>{e.destroyed||e.write(ew(t))}:void 0,async()=>await C(n))}catch(e){r={ok:!1,error:Q(e)}}finally{n-=1,a&&(i.delete(a),rr(a))}e.destroyed||e.write(o?el(r):`${JSON.stringify(r)}
24
+ `)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await ft(i,"Failed to bind socket server")}if("socket"!==h){let e=await rU({handleRequest:C,token:D});r.push(e),t=await ft(e,"Failed to bind HTTP server")}return{servers:r,socketPort:e,httpPort:t}};if(!function(e,t,r){a.existsSync(e)||a.mkdirSync(e,{recursive:!0});let n=JSON.stringify(r,null,2),i=()=>{try{return a.writeFileSync(t,n,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(i())return!0;let o=p9(t);if(o?.pid&&o.pid!==process.pid&&J(o.pid,o.processStartTime))return!1;try{a.unlinkSync(t)}catch{}return i()}(d,p,{pid:process.pid,version:M,startedAt:Date.now(),processStartTime:k}))return l.write("Daemon lock is held by another process; exiting.\n"),c(0),null;let F=[];try{let e,r=await $();F=r.servers,t=r.socketPort,n=r.httpPort,w=t,v=n,y={socketPort:w,httpPort:v,token:D,version:M,codeSignature:P,processStartTime:k},a.existsSync(d)||a.mkdirSync(d,{recursive:!0}),a.writeFileSync(f,""),e=y.socketPort&&y.httpPort?"dual":y.httpPort?"http":"socket",a.writeFileSync(u,JSON.stringify({port:y.socketPort,httpPort:y.httpPort,transport:e,token:y.token,pid:process.pid,version:y.version,codeSignature:y.codeSignature,processStartTime:y.processStartTime,stateDir:d},null,2),{mode:384}),a.chmodSync(u,384),w&&s.write(`AGENT_DEVICE_DAEMON_PORT=${w}
26
25
  `),v&&s.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${v}
27
- `)}catch(t){let e=L(t);for(let t of(l.write(`Daemon error: ${e.message}
28
- `),V))try{t.close(()=>{})}catch{}return fe(u),fn(p),c(1),null}let B=!1,W=async(e={})=>{if(B)return;B=!0,e.cause&&await U(e.cause),await p7(V),await q();let{stopAllIosRunnerSessions:t}=await Promise.resolve(ty);await t(),fe(u),fn(p),c(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{W()}),process.on("SIGTERM",()=>{W()}),process.on("SIGHUP",()=>{W()}),process.on("uncaughtException",e=>{let t=e instanceof F?e:L(e);l.write(`Daemon error: ${t.message}
29
- `),W({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),n=t instanceof F?t:L(t);l.write(`Daemon error: ${n.message}
30
- `),W({exitCode:1,cause:t})})),{httpPort:r,shutdown:W,socketPort:t,token:M}})().catch(e=>{let t=L(e);process.stderr.write(`Daemon error: ${t.message}
31
- `),process.exit(1)});export{pU as IOS_DEVICECTL_DEFAULT_HINT,cN as IOS_RUNNER_CONTAINER_BUNDLE_IDS,pW as IOS_SIMULATOR_POST_CLOSE_SETTLE_MS,pz as IOS_SIMULATOR_POST_OPEN_SETTLE_MS,rA as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,rb as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,tQ as SessionStore,lz as acquireProcessLock,sa as annotateScreenshotWithRefs,u0 as withAppLogProvider,pt as appendAppLogMarker,pw as applyRuntimeHintsToApp,ln as buildSessionRecoveryHint,lg as buildSimctlArgs,lv as buildSimctlArgsForDevice,oo as buildSnapshotState,rM as buttonTag,oy as captureAndroidUiHierarchyXml,a4 as captureSnapshot,pC as cleanupRetainedMaterializedPaths,nm as cleanupUploadedArtifact,pn as clearAppLogFiles,nr as clearRequestCanceled,pg as clearRuntimeHintsFromApp,ab as context_contextFromFlags,op as createDaemonRuntimeSessionStore,d1 as createLocalAppleRunnerProvider,no as createRequestCanceledError,iI as createScopedProvider,r9 as dispatchCommand,nb as emitRequestProgress,oW as ensureAndroidBlockingSystemDialogReady,pj as ensureDeviceReady,aL as errorResponse,ib as filterAppleAppsByBundlePrefix,tJ as formatPortableActionLine,tj as formatScriptActionSummary,tF as formatScriptStringLiteral,ay as getActiveAndroidSnapshotFreshness,u3 as getAppLogPathMetadata,rN as getClickButtonValidationError,na as getRequestSignal,dG as getRunnerSessionSnapshot,rd as getSessionCommandKind,ps as getSimulatorState,sb as getSnapshotReferenceFrame,p6 as handleCloseCommand,ph as hasRuntimeTransportHints,iR as hasScopedAppleToolProvider,tM as inferFillText,nX as isApplePlatform,tT as isClickLikeCommand,i_ as isCommandSupportedOnDevice,lc as isImplicitSessionScopeConflict,a_ as isNavigationSensitiveAction,ni as isRequestCanceled,tO as isTouchTargetCommand,re as listDeviceInventory,pL as listIosDeviceApps,p$ as listIosDeviceProcesses,i4 as runMacOsPressAction,i3 as runMacOsReadTextAction,av as markAndroidSnapshotFreshness,aA as markPendingInteractionOutcome,aC as markPostGestureStabilization,nn as markRequestCanceled,nZ as matchesPlatformSelector,nJ as normalizePlatformSelector,tz as parseReplayOpenFlags,tK as parseReplayRuntimeFlags,tH as parseReplaySeriesFlags,l2 as parseXmlDocumentSync,up as prepareIosRunner,nf as prepareUploadedArtifact,uu as prewarmIosRunnerSession,iQ as quitMacOsApp,iL as readApplePlistJson,u4 as readSessionNetworkCapture,sN as recordTouchVisualizationEvent,oK as recoverAndroidBlockingSystemDialog,p0 as refreshSessionDeviceIfNeeded,nt as registerRequestAbort,pJ as requireSessionOrExplicitSelector,pr as requireSimulatorDevice,p1 as resolveAndroidEmulatorAvdName,d2 as resolveAppleRunnerProvider,nY as resolveAppleSimulatorSetPathForSelector,iP as resolveAppleToolProvider,rx as resolveClickButton,pQ as resolveCommandDevice,iY as resolveFrontmostMacOsApp,ls as resolveImplicitSessionScope,pG as resolveIosDevicectlHint,ld as resolveLeaseScope,i7 as resolveLinuxToolProvider,r5 as resolvePayloadInput,lo as resolvePublicSessionName,ne as resolveRequestTrackingId,cA as resolveRunnerAppBundleId,t1 as resolveSessionRequestLogPath,t0 as resolveSessionRunnerLogPath,od as resolveSnapshotScope,n8 as resolveTargetDevice,pP as retainMaterializedPaths,pe as runAppLogDoctor,iT as runAppleToolCommand,pO as runIosDevicectl,at as runLinuxToolCommand,i1 as runMacOsAlertAction,i0 as runMacOsPermissionAction,i5 as runMacOsScreenshotAction,i2 as runMacOsSnapshotAction,ly as runSimctlForDevice,iO as runXcrun,ud as runIosRunnerCommand,d3 as withAppleRunnerProvider,dB as abortAllIosRunnerSessions,dH as stopAllIosRunnerSessions,p2 as selectorTargetsSessionDevice,ll as sessionMatchesScope,pX as session_device_utils_hasExplicitSessionFlag,ou as setSessionSnapshot,pY as settleIosSimulator,po as shutdownSimulator,pa as ensureBootedSimulator,oS as snapshotAndroid,am as snapshotLinux,ah as readLinuxTextAtPoint,u8 as startAppLog,u7 as stopAppLog,dV as stopIosRunnerSession,aM as stripInternalInteractionFlags,iC as withAppleToolProvider,ae as withLinuxToolProvider,tE as uniqueStrings,l3 as visitXmlPlistEntries,le as withKeyedLock};
26
+ `)}catch(t){let e=Y(t);for(let t of(l.write(`Daemon error: ${e.message}
27
+ `),F))try{t.close(()=>{})}catch{}return p6(u),p7(p),c(1),null}E();let U=!1,G=async(e={})=>{if(U)return;U=!0,e.cause&&await R(e.cause),await p8(F),await O();let{stopAllIosRunnerSessions:t}=await Promise.resolve(tF);await t(),await Promise.race([L().catch(()=>{}),tc(1e3)]),p6(u),p7(p),c(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{G()}),process.on("SIGTERM",()=>{G()}),process.on("SIGHUP",()=>{G()}),process.on("uncaughtException",e=>{let t=e instanceof ee?e:Y(e);l.write(`Daemon error: ${t.message}
28
+ `),G({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof ee?t:Y(t);l.write(`Daemon error: ${r.message}
29
+ `),G({exitCode:1,cause:t})})),{httpPort:n,shutdown:G,socketPort:t,token:D}})().catch(e=>{let t=Y(e);process.stderr.write(`Daemon error: ${t.message}
30
+ `),process.exit(1)});export{pF as IOS_DEVICECTL_DEFAULT_HINT,cg as IOS_RUNNER_CONTAINER_BUNDLE_IDS,pK as IOS_SIMULATOR_POST_CLOSE_SETTLE_MS,pW as IOS_SIMULATOR_POST_OPEN_SETTLE_MS,nv as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,ng as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,tZ as SessionStore,lU as acquireProcessLock,o8 as annotateScreenshotWithRefs,uH as withAppLogProvider,u3 as appendAppLogMarker,pn as applyRuntimeHintsToApp,s3 as buildSessionRecoveryHint,ll as buildSimctlArgs,lc as buildSimctlArgsForDevice,a6 as buildSnapshotState,od as captureAndroidUiHierarchyXml,aJ as captureSnapshot,py as cleanupRetainedMaterializedPaths,rf as cleanupUploadedArtifact,u4 as clearAppLogFiles,rr as clearRequestCanceled,pi as clearRuntimeHintsFromApp,am as context_contextFromFlags,on as createDaemonRuntimeSessionStore,dK as createLocalAppleRunnerProvider,ra as createRequestCanceledError,ip as createScopedProvider,nQ as dispatchCommand,rI as emitRequestProgress,oF as ensureAndroidBlockingSystemDialogReady,pq as ensureDeviceReady,aN as errorResponse,im as filterAppleAppsByBundlePrefix,ad as getActiveAndroidSnapshotFreshness,uz as getAppLogPathMetadata,ri as getRequestSignal,dP as getRunnerSessionSnapshot,ni as getSessionCommandKind,pE as getSimulatorState,sm as getSnapshotReferenceFrame,p4 as handleCloseCommand,pr as hasRuntimeTransportHints,iA as hasScopedAppleToolProvider,tK as inferFillText,iu as isCommandSupportedOnDevice,le as isImplicitSessionScopeConflict,ap as isNavigationSensitiveAction,rn as isRequestCanceled,r4 as listDeviceInventory,pO as listIosDeviceApps,pL as listIosDeviceProcesses,iJ as runMacOsPressAction,iz as runMacOsReadTextAction,ac as markAndroidSnapshotFreshness,ah as markPendingInteractionOutcome,ab as markPostGestureStabilization,rt as markRequestCanceled,lW as parseXmlDocumentSync,un as prepareIosRunner,rp as prepareUploadedArtifact,ur as prewarmIosRunnerSession,iB as quitMacOsApp,iN as readApplePlistJson,uX as readSessionNetworkCapture,sg as recordTouchVisualizationEvent,o$ as recoverAndroidBlockingSystemDialog,pY as refreshSessionDeviceIfNeeded,re as registerRequestAbort,pz as requireSessionOrExplicitSelector,pA as requireSimulatorDevice,pQ as resolveAndroidEmulatorAvdName,dW as resolveAppleRunnerProvider,iI as resolveAppleToolProvider,pZ as resolveCommandDevice,iV as resolveFrontmostMacOsApp,s9 as resolveImplicitSessionScope,pU as resolveIosDevicectlHint,lt as resolveLeaseScope,i0 as resolveLinuxToolProvider,uJ as resolveLogBackend,nX as resolvePayloadInput,s6 as resolvePublicSessionName,t7 as resolveRequestTrackingId,ch as resolveRunnerAppBundleId,tQ as resolveSessionRequestLogPath,tY as resolveSessionRunnerLogPath,ot as resolveSnapshotScope,r0 as resolveTargetDevice,pv as retainMaterializedPaths,u2 as runAppLogDoctor,ix as runAppleToolCommand,pT as runIosDevicectl,i2 as runLinuxToolCommand,iK as runMacOsAlertAction,iH as runMacOsPermissionAction,iX as runMacOsScreenshotAction,iW as runMacOsSnapshotAction,ld as runSimctlForDevice,iM as runXcrun,ut as runIosRunnerCommand,dz as withAppleRunnerProvider,dO as abortAllIosRunnerSessions,dL as stopAllIosRunnerSessions,p0 as selectorTargetsSessionDevice,s7 as sessionMatchesScope,pJ as session_device_utils_hasExplicitSessionFlag,or as setSessionSnapshot,pX as settleIosSimulator,pk as shutdownDeviceTarget,pN as shutdownSimulator,pM as ensureBootedSimulator,ou as snapshotAndroid,aa as snapshotLinux,ao as readLinuxTextAtPoint,uY as startAppLog,u1 as stopAppLog,dT as stopIosRunnerSession,av as stripInternalInteractionFlags,ib as withAppleToolProvider,i1 as withLinuxToolProvider,tW as uniqueStrings,lz as visitXmlPlistEntries,s1 as withKeyedLock};