agent-device 0.16.4 → 0.16.6
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.
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.16.4.apk → agent-device-android-multitouch-helper-0.16.6.apk} +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.6.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.16.4.manifest.json → agent-device-android-multitouch-helper-0.16.6.manifest.json} +4 -4
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.6.apk +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.6.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.16.4.manifest.json → agent-device-android-snapshot-helper-0.16.6.manifest.json} +6 -6
- package/dist/src/1010.js +1 -0
- package/dist/src/1231.js +1 -1
- package/dist/src/1352.js +1 -0
- package/dist/src/1998.js +1 -0
- package/dist/src/208.js +1 -1
- package/dist/src/221.js +6 -6
- package/dist/src/2415.js +31 -0
- package/dist/src/2805.js +1 -0
- package/dist/src/5186.js +1 -0
- package/dist/src/5310.js +1 -0
- package/dist/src/5792.js +1 -0
- package/dist/src/6085.js +1 -0
- package/dist/src/6629.js +1 -0
- package/dist/src/8114.js +4 -0
- package/dist/src/8133.js +1 -0
- package/dist/src/8502.js +1 -0
- package/dist/src/8699.js +1 -0
- package/dist/src/8806.js +7 -0
- package/dist/src/940.js +1 -1
- package/dist/src/9404.js +1 -0
- package/dist/src/9471.js +1 -0
- package/dist/src/9533.js +1 -0
- package/dist/src/9542.js +3 -3
- package/dist/src/9639.js +1 -1
- package/dist/src/9671.js +1 -0
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-snapshot-helper.d.ts +2 -1
- package/dist/src/android-snapshot-helper.js +1 -1
- package/dist/src/android.js +5 -0
- package/dist/src/apple.js +1 -0
- package/dist/src/apps.js +13 -0
- package/dist/src/args.js +449 -0
- package/dist/src/batch.js +1 -1
- package/dist/src/cli.js +36 -492
- package/dist/src/command-metadata.js +1 -0
- package/dist/src/command-surface.js +1 -0
- package/dist/src/contracts.d.ts +1 -0
- package/dist/src/devices.js +1 -0
- package/dist/src/devices~1.js +1 -0
- package/dist/src/devices~2.js +1 -0
- package/dist/src/find.js +1 -0
- package/dist/src/finders.d.ts +1 -0
- package/dist/src/generic.js +9 -0
- package/dist/src/index.d.ts +12 -0
- package/dist/src/input-actions.js +1 -0
- package/dist/src/input-actions~1.js +1 -0
- package/dist/src/interaction.js +1 -0
- package/dist/src/internal/bin.js +5 -2
- package/dist/src/internal/daemon.js +1 -100
- package/dist/src/lease.js +1 -0
- package/dist/src/linux.js +1 -0
- package/dist/src/notifications.js +1 -0
- package/dist/src/react-native.js +1 -0
- package/dist/src/record-trace.js +26 -0
- package/dist/src/recording-provider.js +1 -0
- package/dist/src/selector-runtime.js +1 -0
- package/dist/src/selectors.d.ts +1 -0
- package/dist/src/server.js +1 -1
- package/dist/src/session.js +29 -0
- package/dist/src/snapshot.js +2 -0
- package/package.json +4 -1
- package/server.json +2 -2
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.4.apk.sha256 +0 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.4.apk +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.4.apk.sha256 +0 -1
- package/dist/src/1769.js +0 -7
- package/dist/src/6277.js +0 -4
- package/dist/src/7519.js +0 -1
- package/dist/src/89.js +0 -1
package/dist/src/2415.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import{__webpack_require__ as e}from"./rslib-runtime.js";import t,{createHash as r}from"node:crypto";import n from"node:path";import i,{existsSync as a,promises as o}from"node:fs";import s from"node:http";import{fileURLToPath as l,pathToFileURL as d}from"node:url";import"node:https";import u from"node:os";import{once as c}from"node:events";import{Transform as p}from"node:stream";import{pipeline as f}from"node:stream/promises";import{AsyncLocalStorage as m}from"node:async_hooks";import h from"node:fs/promises";import w from"node:net";import{resolveUserPath as g}from"./3267.js";import{appendScreenshotScriptFlags as y,screenshotOptionsFromFlags as v,screenshotFlagsFromOptions as S,SCREENSHOT_ACTION_FLAG_KEYS as _}from"./5310.js";import{withDiagnosticsScope as I,getDiagnosticsMeta as A,flushDiagnosticsToSessionFile as b,withDiagnosticTimer as x,emitDiagnostic as N}from"./7599.js";import{readProcessStartTime as M,readProcessCommand as E,resolveRuntimeTransportHints as D,isProcessGroupAlive as C,isAgentDeviceDaemonProcess as k,isProcessAlive as P}from"./8656.js";import{toAppErrorCode as R,asAppError as T,normalizeError as O,AppError as L}from"./9152.js";import{runCmdBackground as $,runCmdStreaming as F,runCmd as U,resolveExecutableOverridePath as G,whichCmd as V}from"./9818.js";import{consumeTextLines as q,serializeDaemonResponseEnvelope as j,normalizeTenantId as B,shouldStreamRequestProgress as H,resolveDaemonPaths as K,resolveSessionIsolationMode as W,resolveDaemonServerMode as z,resolveDaemonCodeSignature as J,serializeDaemonProgressEnvelope as X,serializeDaemonRpcResponseEnvelope as Z}from"./8114.js";import{runAndroidAdb as Y,resolveIosSimulatorDeviceSetPath as Q,getAndroidBlockingDialogFocus as ee,withRetry as et,Deadline as er,isEnvTruthy as en,openAndroidApp as ei,classifyBootFailure as ea,streamAndroidLogcatWithAdb as eo,bootFailureHint as es,androidDeviceForSerial as el,parseSerialAllowlist as ed,retryWithPolicy as eu,getAndroidAppState as ec,classifyAndroidAppTarget as ep,captureAndroidLogcatWithAdb as ef,resolveAndroidSerialAllowlist as em,isDeepLinkTarget as eh,formatAndroidInstalledPackageRequiredMessage as ew}from"./8806.js";import{findMistargetedTypeRefToken as eg,buildSwipePresetGesturePlan as ey,parseScrollDirection as ev,isKeyboardAction as eS,isSystemScrollIndicatorLabel as e_,isReactNativeCollapsedWarningLabel as eI,formatScrollEdgeMessage as eA,deriveMobileSnapshotHiddenContentHints as eb,inferVerticalScrollIndicatorDirections as ex,captureScrollEdgeState as eN,normalizeSnapshotTree as eM,PNG as eE,createAgentDevice as eD,runScrollEdgePasses as eC,requireIntInRange as ek,inferGestureReferenceFrame as eP,localCommandPolicy as eR,decodePng as eT,buildScrollGesturePlan as eO,parseSwipePreset as eL}from"./9533.js";import{sleep as e$}from"./4829.js";import{readLocationCoordinate as eF,successText as eU,withSuccessText as eG,parseDeviceRotation as eV}from"./1998.js";import{PUBLIC_COMMANDS as eq,DAEMON_COMMAND_GROUPS as ej,GESTURE_SUBCOMMAND_ERROR as eB}from"./5792.js";import{findNearestAncestor as eH,normalizeType as eK,pruneGroupNodes as eW,findNodeByLabel as ez,resolveRefLabel as eJ}from"./940.js";import{snapshotPresentationOptionsFromFlags as eX,normalizeRef as eZ,findNodeByRef as eY,buildSnapshotPresentationKey as eQ,centerOfRect as e0,attachRefs as e1}from"./4057.js";import{isScrollableType as e2}from"./2842.js";import{readVersion as e3,findProjectRoot as e4}from"./9671.js";import{resolveAndroidAdbProvider as e5,resolveAndroidAdbExecutor as e8}from"./9639.js";import{parseUiHierarchy as e6,ensureAndroidSnapshotHelper as e9,parseUiHierarchyTree as e7,captureAndroidSnapshotWithHelper as te,captureAndroidSnapshotWithHelperSession as tt,parseAndroidSnapshotHelperManifest as tr,forgetAndroidSnapshotHelperInstall as tn,buildUiHierarchySnapshot as ti,stopAndroidSnapshotHelperSession as ta}from"./221.js";import{applyCommandDefaults as to}from"./1352.js";var ts={};e.r(ts),e.d(ts,{IH:()=>uk,ug:()=>uP,sE:()=>uA,Bx:()=>ub,WX:()=>uC,Co:()=>uN,wg:()=>uD,withAppLogProvider:()=>uS});var tl={};e.r(tl),e.d(tl,{IO:()=>i0,LB:()=>iQ,xY:()=>i2,eN:()=>i1,runMacOsPressAction:()=>i5,runMacOsReadTextAction:()=>i4,rR:()=>i8,r5:()=>i3});var td={};e.r(td),e.d(td,{bu:()=>lX,abortAllIosRunnerSessions:()=>dE,hv:()=>db,gE:()=>dB,runIosRunnerCommand:()=>dj,stopAllIosRunnerSessions:()=>dD,yA:()=>dM});var tu={};e.r(tu),e.d(tu,{vy:()=>d$,My:()=>dU,Ms:()=>dF,withAppleRunnerProvider:()=>dV});var tc={};e.r(tc),e.d(tc,{ensureBootedSimulator:()=>uO,SA:()=>u$,EB:()=>uR,N3:()=>uL});var tp={};e.r(tp),e.d(tp,{qx:()=>nn,Ly:()=>no,Gr:()=>nt,vT:()=>ni,Cc:()=>na,withAppleToolProvider:()=>nr});var tf={};e.r(tf),e.d(tf,{readLinuxTextAtPoint:()=>aw,r:()=>ah});var tm={};function th(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}e.r(tm),e.d(tm,{uK:()=>ae,nE:()=>ar,withLinuxToolProvider:()=>at});let tw=["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 tg(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 ty(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}let tv=/^-?\d+(\.\d+)?$/,tS=/^[^\s"\\]+$/,t_=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),tI=new Map([["--count","count"],["--pause-ms","pauseMs"]]),tA=new Map([["--delay-ms","delayMs"]]);function tb(e){return"click"===e||"press"===e}function tx(e){return tb(e)||"longpress"===e}function tN(e){return"type"===e||"fill"===e}function tM(e){return tD(e,tC)}function tE(e){return JSON.stringify(e)}function tD(e,t){return t(e)?e:tE(e)}function tC(e){return tk(e)&&e.startsWith("@")||tv.test(e)}function tk(e){return tS.test(e)}function tP(e){let t=(e.positionals??[]).map(e=>tM(e));return[e.command,...t].join(" ")}function tR(e,t){let r=t.flags??{};if(tb(t.command)){"number"==typeof r.count&&e.push("--count",String(r.count)),"number"==typeof r.intervalMs&&e.push("--interval-ms",String(r.intervalMs)),"number"==typeof r.holdMs&&e.push("--hold-ms",String(r.holdMs)),"number"==typeof r.jitterPx&&e.push("--jitter-px",String(r.jitterPx)),!0===r.doubleTap&&e.push("--double-tap");let t=r.clickButton;t&&"primary"!==t&&e.push("--button",t);return}if("swipe"===t.command){"number"==typeof r.count&&e.push("--count",String(r.count)),"number"==typeof r.pauseMs&&e.push("--pause-ms",String(r.pauseMs)),("one-way"===r.pattern||"ping-pong"===r.pattern)&&e.push("--pattern",r.pattern);return}tN(t.command)&&"number"==typeof r.delayMs&&e.push("--delay-ms",String(r.delayMs))}function tT(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",tD(t.metroHost,tk)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",tD(t.bundleUrl,tk)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",tD(t.launchUrl,tk)))}function tO(e,t){let r=[],n={},i=tb(e)?t_:"swipe"===e?tI:tN(e)?tA:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(tb(e)&&"--double-tap"===o){n.doubleTap=!0;continue}let s=t[a+1];if(tb(e)&&"--button"===o&&void 0!==s){("primary"===s||"secondary"===s||"middle"===s)&&(n.clickButton=s),a+=1;continue}let l=i?.get(o);if(l&&void 0!==s){let e=t$(s);if(null!==e){n[l]=e,a+=1;continue}}if("swipe"===e&&"--pattern"===o&&void 0!==s){("one-way"===s||"ping-pong"===s)&&(n.pattern=s),a+=1;continue}r.push(o)}return{positionals:r,flags:n}}function tL(e){let t=[],r={};for(let n=0;n<e.length;n+=1){let i=e[n],a=e[n+1];if("--platform"===i&&void 0!==a){("ios"===a||"android"===a)&&(r.platform=a),n+=1;continue}if("--metro-host"===i&&void 0!==a){r.metroHost=a,n+=1;continue}if("--metro-port"===i&&void 0!==a){let e=t$(a);null!==e&&(r.metroPort=e),n+=1;continue}if("--bundle-url"===i&&void 0!==a){r.bundleUrl=a,n+=1;continue}if("--launch-url"===i&&void 0!==a){r.launchUrl=a,n+=1;continue}t.push(i)}return{positionals:t,flags:r}}function t$(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function tF(e){var t;let r=[],n={};for(let t of e){if("--relaunch"===t){n.relaunch=!0;continue}r.push(t)}let i=tL(r);return{positionals:i.positionals,flags:n,runtime:(t=i.flags).platform||t.metroHost||void 0!==t.metroPort||t.bundleUrl||t.launchUrl?i.flags:void 0}}function tU(e,t={}){let r=[e.command];if("snapshot"===e.command)e.flags?.snapshotInteractiveOnly&&r.push("-i"),e.flags?.snapshotCompact&&r.push("-c"),"number"==typeof e.flags?.snapshotDepth&&r.push("-d",String(e.flags.snapshotDepth)),e.flags?.snapshotScope&&r.push("-s",tM(e.flags.snapshotScope)),e.flags?.snapshotRaw&&r.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])r.push(tM(t));e.flags?.relaunch&&r.push("--relaunch"),tT(r,e.runtime)}else if("runtime"===e.command)!function(e,t,r={}){let n=t.positionals??[];for(let t of r.includeAllPositionals?n:n.slice(0,1))e.push(tD(t,tk));tT(e,t.flags)}(r,e,{includeAllPositionals:t.runtimeIncludeAllPositionals});else if("record"===e.command)!function(e,t){let[r,...n]=t.positionals??[];for(let t of(r&&e.push(tD(r,tk)),n))e.push(tM(t));"number"==typeof t.flags?.fps&&e.push("--fps",String(t.flags.fps)),"number"==typeof t.flags?.quality&&e.push("--quality",String(t.flags.quality)),t.flags?.hideTouches&&e.push("--hide-touches")}(r,e);else if("screenshot"===e.command){for(let t of e.positionals??[])r.push(tM(t));y(r,e.flags)}else{for(let t of e.positionals??[])r.push(tM(t));tR(r,e)}return r.join(" ")}class tG{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let r=n.dirname(t);i.existsSync(r)||i.mkdirSync(r,{recursive:!0});let a=function(e){var t=e,r=function(e){let t=[];for(let r of e.actions){if("snapshot"===r.command)continue;let n=function(e){let t=function(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>"string"==typeof e)?e.result.selectorChain:[];return t.length>0?t.join(" || "):void 0}(e);if(t&&tV(e.command))return tb(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=tg(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(!tV(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=${tE(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,tb(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(tM(r)),tq(e,t),tR(e,t),e.join(" ");if(1===t.positionals.length)return e.push(tM(r)),tR(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(tM(r)),tq(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(tM(n)),tR(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(tM(r)),e.push(tM(n)),n.startsWith("@")&&tq(e,t),e.join(" ")}(t,r):void 0);return n||tU(e)}(e));return`${n.join("\n")}
|
|
2
|
+
`}(e);return i.writeFileSync(t,a),{written:!0,path:t}}catch(r){return N({level:"warn",phase:"session_script_write_failed",data:{session:e.name,path:t,error:r instanceof Error?r.message:String(r)}}),{written:!1}}}resolveScriptPath(e){if(e.saveScriptPath)return g(e.saveScriptPath,{cwd:void 0});i.existsSync(this.sessionsDir)||i.mkdirSync(this.sessionsDir,{recursive:!0});let t=th(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return n.join(this.sessionsDir,`${t}-${r}.ad`)}}function tV(e){return tx(e)||"fill"===e||"get"===e}function tq(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(tM(r))}class tj{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new tG(e)}get(e){return this.sessions.get(e)}has(e){return this.sessions.has(e)}set(e,t){this.sessions.set(e,t)}delete(e){return this.runtimeHints.delete(e),this.sessions.delete(e)}values(){return this.sessions.values()}toArray(){return Array.from(this.sessions.values())}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){this.runtimeHints.set(e,t)}clearRuntimeHints(e){return this.runtimeHints.delete(e)}recordAction(e,t){t.flags?.noRecord||(t.flags?.saveScript&&(e.recordSession=!0,"string"==typeof t.flags.saveScript&&(e.saveScriptPath=g(t.flags.saveScript,{cwd:void 0}))),e.actions.push({ts:Date.now(),command:t.command,positionals:t.positionals,runtime:t.runtime,flags:function(e){if(!e)return{};let t={};for(let r of tw)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=th(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return n.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveAppLogPath(e){return n.join(this.sessionsDir,th(e),"app.log")}resolveAppLogPidPath(e){return n.join(this.sessionsDir,th(e),"app-log.pid")}static expandHome(e,t){return g(e,{cwd:t})}}let tB="app-log.pid";function tH(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 tK(e,t){if(!e)return;let r=n.dirname(e);i.existsSync(r)||i.mkdirSync(r,{recursive:!0});let a={pid:t,startTime:M(t)??void 0,command:E(t)??void 0};i.writeFileSync(e,`${JSON.stringify(a)}
|
|
3
|
+
`)}function tW(e){if(e&&i.existsSync(e))try{i.unlinkSync(e)}catch{}}let tz=new Set,tJ=new Map,tX="request_canceled",tZ="request canceled";function tY(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 tQ(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++}}(tJ);let t=new AbortController;tJ.set(e,t),tz.has(e)&&t.abort()}function t0(e){e&&(!function(e){if(e.size<=5e4)return;let t=0;for(let r of e){if(t>=1e4)break;e.delete(r),t++}}(tz),tz.add(e),tJ.get(e)?.abort())}function t1(e){e&&(tz.delete(e),tJ.delete(e))}function t2(e){return!!e&&tz.has(e)}function t3(e){if(e)return tJ.get(e)?.signal}function t4(){return new L("COMMAND_FAILED",tZ,{reason:tX})}function t5(e){if(t2(e))throw t4()}function t8(e){return e instanceof L&&"COMMAND_FAILED"===e.code&&(e.details?.reason===tX||e.message===tZ)}let t6=new Map;function t9(e){let r=t.randomUUID(),n=setTimeout(()=>{t7(r)},9e5);return n.unref(),t6.set(r,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),r}function t7(e){let t=t6.get(e);if(t&&(clearTimeout(t.timer),t6.delete(e),t.deleteAfterDownload))try{i.rmSync(t.artifactPath,{force:!0})}catch{}}let re=new Map;function rt(e,t){let r=re.get(e);if(!r)throw new L("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new L("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function rr(e){let t=re.get(e);t&&(clearTimeout(t.timer),re.delete(e),i.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function rn(e){let t=await ri(e);await U("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=n.join(e.tempDir,t);if(!i.existsSync(r))throw new L("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function ri(e){let t=await U("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new L("INVALID_ARGS","Artifact is not a valid tar archive",{archivePath:e.archivePath,stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let r=t.stdout.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(0===r.length)throw new L("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(ra),i=e.expectedRootName??function(e,t){let r=new Set;for(let t of e){let[e]=t.split("/");e&&r.add(e)}let n=[...r];if("ios"===t){let e=n.filter(e=>e.toLowerCase().endsWith(".app")),t=e[0];if(void 0!==t&&1===e.length)return t;if(0===e.length)throw new L("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new L("INVALID_ARGS",`iOS app bundle archives must contain exactly one top-level .app directory, found: ${e.join(", ")}`)}let i=n[0];if(void 0!==i&&1===n.length)return i;throw new L("INVALID_ARGS",`Archive must contain a single top-level bundle, found: ${n.join(", ")}`)}(n,e.platform);if(!n.some(e=>e===i||e.startsWith(`${i}/`)))throw new L("INVALID_ARGS",`Uploaded archive must contain a top-level "${i}" bundle`);for(let e of n){var a=e,o=i;if(a!==o&&!a.startsWith(`${o}/`))throw new L("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await U("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new L("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function ra(e){if(e.includes("\0"))throw new L("INVALID_ARGS",`Invalid archive entry: ${e}`);if(n.posix.isAbsolute(e))throw new L("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=n.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new L("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function ro(e,t){return new Promise((r,n)=>{let a,o=!1,s=0,l=i.createWriteStream(t),d=e=>{if(!o){if(o=!0,a&&clearTimeout(a),e)return void rs(l,t).finally(()=>n(e));r()}},u=()=>{a&&clearTimeout(a),a=setTimeout(()=>{let t=new L("COMMAND_FAILED","Artifact transfer timed out due to inactivity",{timeoutMs:6e4});"destroy"in e&&"function"==typeof e.destroy&&e.destroy(t),c.destroy(t),d(t)},6e4)},c=new p({transform(e,t,r){u();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new L("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{d(new L("COMMAND_FAILED","Artifact transfer was interrupted"))}),u(),f(e,c,l).then(()=>d(),e=>d(e))})}async function rs(e,t){if(e.destroy(),!e.closed)try{await c(e,"close")}catch{}await i.promises.rm(t,{force:!0}).catch(()=>{})}async function rl(e){let t,r=e.headers["x-artifact-type"],a=e.headers["x-artifact-filename"];if(!r||!a)throw new L("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new L("INVALID_ARGS",`Invalid x-artifact-type: ${r}. Must be "file" or "app-bundle".`);!function(e){if(void 0===e)return;let t=Number(e);if(Number.isFinite(t)&&t>0x80000000)throw new L("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let o=function(e){let t=e.trim(),r=n.basename(t);if(!r||"."===r||".."===r)throw new L("INVALID_ARGS",`Invalid artifact filename: ${e}`);return r}(a),s=(t=function(e){let t=e?.trim();if(!t)return"request";let r=t.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return r.length>0?r.slice(0,48):"request"}("upload"),i.mkdtempSync(n.join(u.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===r){let t=n.join(s,o);return await ro(e,t),{artifactPath:t,tempDir:s}}let t=n.join(s,"artifact.tar");await ro(e,t);let a=await rn({archivePath:t,tempDir:s,platform:"ios",expectedRootName:o});return i.rmSync(t,{force:!0}),{artifactPath:a,tempDir:s}}catch(e){throw i.rmSync(s,{recursive:!0,force:!0}),e}}let rd=new m;async function ru(e,t){return await rd.run(e,t)}function rc(e){rd.getStore()?.(e)}let rp=new Set(["agent_device.command","agent-device.command"]),rf=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rm=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rh={"agent_device.lease.allocate":"lease_allocate","agent-device.lease.allocate":"lease_allocate","agent_device.lease.heartbeat":"lease_heartbeat","agent-device.lease.heartbeat":"lease_heartbeat","agent_device.lease.release":"lease_release","agent-device.lease.release":"lease_release"},rw=new Set([...rp,...rf,...rm,...Object.keys(rh)]);function rg(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function ry(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function rv(e,t){e.destroyed||(e.write(Z(t)),e.end())}function rS(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function r_(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 rI(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rA(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rb(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new L("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function rx(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new L("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function rN(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=O(new L("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rg(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=O(new L(R(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rg(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=B(r.tenantId);if(!e){let e=O(new L("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rg(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rM(){let e,t=process.env.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let r=process.env.AGENT_DEVICE_HTTP_AUTH_EXPORT||"default",i=n.isAbsolute(t)?t:n.resolve(t);try{e=await import(d(i).href)}catch(e){throw new L("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:i,error:e instanceof Error?e.message:String(e)})}let a=e[r];if("function"!=typeof a)throw new L("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:i,exportName:r});return a}async function rE(e){let t=await rM(),{handleRequest:r,token:n}=e;return s.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!0}));return}if("POST"===e.method&&"/upload"===e.url)return void rD(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void rC(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||ry(i,rg(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{ry(i,rg(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void ry(i,rg(n.id??null,-32600,"Invalid Request"),400);if(!rw.has(n.method))return void ry(i,rg(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void ry(i,rg(n.id??null,-32602,"Invalid params"),400);try{var s;let a=n.params,l=function(e,t,r){if(rp.has(e))return{token:r_(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(rf.has(e)){let e,n=rI(t,"platform");if("ios"!==n&&"android"!==n)throw new L("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:r_(t,r),session:rI(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rI(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new L("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new L("INVALID_ARGS","Invalid params: source.url is required for url sources");let r=t.headers,n={};if(void 0!==r){if(!r||"object"!=typeof r||Array.isArray(r))throw new L("INVALID_ARGS","Invalid params: source.headers must be a string map");for(let[e,t]of Object.entries(r)){if("string"!=typeof t)throw new L("INVALID_ARGS","Invalid params: source.headers values must be strings");n[e]=t}}return Object.keys(n).length>0?{kind:"url",url:e,headers:n}:{kind:"url",url:e}}if("path"===t.kind){let e="string"==typeof t.path?t.path.trim():"";if(!e)throw new L("INVALID_ARGS","Invalid params: source.path is required for path sources");return{kind:"path",path:e}}if("github-actions-artifact"===t.kind)return function(e){let t,r=rb(e,"owner"),n=rb(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new L("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new L("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new L("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:rx(e,"artifactId")}:(a&&(t=rx(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rb(e,"artifactName")})}(t);throw new L("INVALID_ARGS",'Invalid params: source.kind must be "url", "path", or "github-actions-artifact"')}(t),retainMaterializedPaths:(e=t.retainPaths,"boolean"==typeof e?e:void 0),materializedPathRetentionMs:rA(t,"retentionMs")}}}if(rm.has(e)){let e=rI(t,"materializationId")?.trim();if(!e)throw new L("INVALID_ARGS","Invalid params: materializationId is required");return{token:r_(t,r),session:rI(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rI(t,"requestId"),materializationId:e}}}let n=rh[e];if(n)return{token:r_(t,r),session:rI(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rI(t,"tenantId")??rI(t,"tenant"),runId:rI(t,"runId"),leaseId:rI(t,"leaseId"),leaseTtlMs:rA(t,"ttlMs"),leaseBackend:rI(t,"backend")}};throw new L("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(s=n.method,rp.has(s)&&("string"!=typeof l.command||0===l.command.length))return void ry(i,rg(n.id??null,-32602,"Invalid params: command is required"),400);o=tY(l.meta?.requestId,n.id),l.meta={...l.meta,requestId:o},tQ(o);let d=()=>{i.writableFinished||t0(o)};e.on("aborted",d),i.on("close",d);let u=await rN(t,{headers:e.headers,rpcRequest:n,daemonRequest:l});if(!u.ok)return void ry(i,u.response,u.statusCode);if(u.tenantId&&(l.meta={...l.meta,tenantId:u.tenantId,sessionIsolation:l.meta?.sessionIsolation??l.flags?.sessionIsolation??"tenant"}),H(l)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await ru(e=>{!i.destroyed&&i.write(X(e))},async()=>await r(l)),t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rg(n.id??null,-32e3,e.error.message,e.error);rv(i,t);return}let c=await r(l);if(c.ok)return void ry(i,{jsonrpc:"2.0",id:n.id??null,result:c});ry(i,rg(n.id??null,-32e3,c.error.message,c.error),rS(c.error.code))}catch(t){let e=O(t);if(i.headersSent)return void rv(i,rg(n.id??null,-32e3,e.message,e));ry(i,rg(n.id??null,-32e3,e.message,e),rS(e.code))}finally{t1(o)}})})}async function rD(e,r,n,i){try{var a;let o,s,l=await rk({req:e,res:r,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let d=await rl(e),u=(a={artifactPath:d.artifactPath,tempDir:d.tempDir,tenantId:l.tenantId},o=t.randomUUID(),(s=setTimeout(()=>{rr(o)},3e5)).unref(),re.set(o,{artifactPath:a.artifactPath,tempDir:a.tempDir,tenantId:a.tenantId,timer:s}),o);r.statusCode=200,r.setHeader("content-type","application/json"),r.end(JSON.stringify({ok:!0,uploadId:u}))}catch(e){rP(r,O(e))}}async function rC(e,t,r,n){let a=e.url?.slice("/artifacts/".length)??"";if(!a){t.statusCode=400,t.end("Missing artifact id");return}try{let o=await rk({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[a]}});if(!o)return;let s=function(e,t){let r=t6.get(e);if(!r)throw new L("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new L("UNAUTHORIZED","Artifact belongs to a different tenant");if(!i.existsSync(r.artifactPath))throw t7(e),new L("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(a,o.tenantId),l=i.createReadStream(s.artifactPath);t.statusCode=200,t.setHeader("content-type","application/octet-stream"),s.fileName&&t.setHeader("content-disposition",`attachment; filename="${s.fileName.replace(/"/g,"")}"`),l.on("error",e=>{if(t.headersSent)t.destroy(e);else{let r=O(e);t.statusCode=rS(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&t7(a)}),l.pipe(t)}catch(e){rP(t,O(e))}}async function rk(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=r_({},n.headers),d=(t=l,(r=o)&&t!==r?O(new L("UNAUTHORIZED","Invalid token")):null);if(d)return rP(i,d),null;let u=await rN(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 u.ok?{tenantId:u.tenantId}:(i.statusCode=u.statusCode,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!1,error:u.response.error?.data?.message??u.response.error?.message??"Unauthorized"})),null)}function rP(e,t){e.statusCode=rS(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function rR(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function rT(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function rO(e){let t=(e??"").trim().toLowerCase();if(!t||"ios-simulator"===t)return"ios-simulator";if("ios-instance"===t||"android-instance"===t)return t;throw new L("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class rL{leases=new Map;runBindings=new Map;maxActiveSimulatorLeases;defaultLeaseTtlMs;minLeaseTtlMs;maxLeaseTtlMs;now;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.defaultLeaseTtlMs=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,this.minLeaseTtlMs=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):5e3,this.maxLeaseTtlMs=Number.isInteger(e.maxLeaseTtlMs)?Math.max(this.minLeaseTtlMs,Number(e.maxLeaseTtlMs)):6e5,this.now=e.now??(()=>Date.now())}allocateLease(e){let r=rO(e.backend),n=B(e.tenantId);if(!n)throw new L("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=rR(e.runId);if(!i)throw new L("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");this.cleanupExpiredLeases();let a=this.resolveLeaseTtlMs(e.ttlMs),o=this.bindingKey(n,i,r),s=this.runBindings.get(o);if(s){let e=this.leases.get(s);if(e)return this.refreshLease(e,a);this.runBindings.delete(o)}this.enforceCapacity(r);let l=this.now(),d={leaseId:t.randomBytes(16).toString("hex"),tenantId:n,runId:i,backend:r,createdAt:l,heartbeatAt:l,expiresAt:l+a};return this.leases.set(d.leaseId,d),this.runBindings.set(o,d.leaseId),{...d}}heartbeatLease(e){let t=rT(e.leaseId);if(!t)throw new L("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);if(!r)throw new L("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});this.assertOptionalScopeMatch(r,e.tenantId,e.runId);let n=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(r,n)}releaseLease(e){let t=rT(e.leaseId);if(!t)throw new L("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);return r?(this.assertOptionalScopeMatch(r,e.tenantId,e.runId),this.leases.delete(t),this.runBindings.delete(this.bindingKey(r.tenantId,r.runId,r.backend)),{released:!0}):{released:!1}}assertLeaseAdmission(e){let t=rO(e.backend),r=B(e.tenantId);if(!r)throw new L("INVALID_ARGS","tenant isolation requires tenant id.");let n=rR(e.runId);if(!n)throw new L("INVALID_ARGS","tenant isolation requires run id.");let i=rT(e.leaseId);if(!i)throw new L("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new L("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==r||a.runId!==n)throw new L("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}cleanupExpiredLeases(){let e=this.now();for(let t of this.leases.values())t.expiresAt>e||(this.leases.delete(t.leaseId),this.runBindings.delete(this.bindingKey(t.tenantId,t.runId,t.backend)))}enforceCapacity(e){if("ios-simulator"!==e||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>"ios-simulator"===e.backend).length;if(!(t<this.maxActiveSimulatorLeases))throw new L("COMMAND_FAILED","No simulator lease capacity available",{reason:"LEASE_CAPACITY_EXCEEDED",activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:"Retry after releasing another simulator lease."})}resolveLeaseTtlMs(e){if(!Number.isInteger(e))return this.defaultLeaseTtlMs;let t=Number(e);if(t<this.minLeaseTtlMs||t>this.maxLeaseTtlMs)throw new L("INVALID_ARGS",`Lease ttlMs must be between ${this.minLeaseTtlMs} and ${this.maxLeaseTtlMs}.`);return t}refreshLease(e,t){let r=this.now(),n={...e,heartbeatAt:r,expiresAt:r+t};return this.leases.set(n.leaseId,n),this.runBindings.set(this.bindingKey(n.tenantId,n.runId,n.backend),n.leaseId),{...n}}bindingKey(e,t,r){return`${e}:${t}:${r}`}assertOptionalScopeMatch(e,t,r){let n=B(t),i=rR(r);if(t&&!n)throw new L("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&!i)throw new L("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(n&&e.tenantId!==n||i&&e.runId!==i)throw new L("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}function r$(e){return e}function rF(e){return"apple"===e||"ios"===e||"macos"===e}function rU(e,t){return!t||("apple"===t?rF(e):e===t)}function rG(e){let{simulatorSetPath:t,platform:r,target:n}=e;if(t&&"macos"!==r&&"desktop"!==n)return t}async function rV(e,t,r={}){let n=e,i=e=>e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim();if(t.platform&&(n=n.filter(e=>rU(e.platform,t.platform))),t.target&&(n=n.filter(e=>(e.target??"mobile")===t.target)),t.udid){let e=n.find(e=>e.id===t.udid&&rF(e.platform));if(!e)throw new L("DEVICE_NOT_FOUND",`No Apple device with UDID ${t.udid}`);return e}if(t.serial){let e=n.find(e=>e.id===t.serial&&"android"===e.platform);if(!e)throw new L("DEVICE_NOT_FOUND",`No Android device with serial ${t.serial}`);return e}if(t.deviceName){let e=i(t.deviceName),r=n.find(t=>i(t.name)===e);if(!r)throw new L("DEVICE_NOT_FOUND",`No device named ${t.deviceName}`);return r}let a=n[0];if(void 0!==a&&1===n.length)return a;if(0===n.length){var o;let e=r.simulatorSetPath;if(e&&(!(o=t.platform)||"apple"===o||"ios"===o))throw new L("DEVICE_NOT_FOUND","No devices found in the scoped simulator set",{simulatorSetPath:e,hint:`The simulator set at "${e}" appears to be empty. Create a simulator first:
|
|
4
|
+
xcrun simctl --set "${e}" create "iPhone 16" com.apple.CoreSimulator.SimDeviceType.iPhone-16 com.apple.CoreSimulator.SimRuntime.iOS-18-0`,selector:t});throw new L("DEVICE_NOT_FOUND","No devices found",{selector:t})}let s=n.filter(e=>"device"!==e.kind);s.length>0&&(n=s);let l=n.filter(e=>e.booted),d=l[0];if(void 0!==d&&1===l.length)return d;let u=l[0]??n[0];if(void 0===u)throw new L("DEVICE_NOT_FOUND","No devices found",{selector:t});return u}async function rq(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 m,rB=new m;async function rH(e,t,r){var n,i;let a=await rK(e,t,r);if(n=t,i=a,!rW(n)&&(!n.platform||"apple"===n.platform||"ios"===n.platform)&&"desktop"!==n.target&&(!i||"device"===i.kind)){let{findBootableIosSimulator:e}=await import("./devices.js"),n=await e({simulatorSetPath:r.simulatorSetPath,target:t.target});if(n)return n}if(a)return a;throw new L("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function rK(e,t,r){try{return await rV(e,t,r)}catch(e){var n;if(n=e,!rW(t)&&n instanceof L&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function rW(e){return!!(e.udid||e.serial||e.deviceName)}async function rz(e){let t=r$(e.platform),r=rG({simulatorSetPath:Q(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=em(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 L("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await rQ({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return r0(s)?r1(i,await rH(l,s,{simulatorSetPath:r})):r1(i,await rV(l,s,{simulatorSetPath:r}));let d=await rq({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return r0(s)?r1(i,await rH(d,s,{simulatorSetPath:r})):r1(i,await rV(d,s,{simulatorSetPath:r}))},a)}async function rJ(e){return rj.getStore()?await e():await rj.run(new Map,e)}async function rX(e,t){return e?await rB.run(e,t):await t()}async function rZ(e,t){return await rX(e,async()=>await rJ(t))}async function rY(e){return await rQ(e)??await rq(e)}async function rQ(e){let t=rB.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function r0(e){return!!e.platform&&"android"!==e.platform&&"linux"!==e.platform}function r1(e,t){return rj.getStore()?.set(e,{...t}),t}function r2(e,t=e=>e){let r=new m;return{resolve:n=>n?t(n):r.getStore()??e,run:async(e,n)=>e?await r.run(t(e),n):await n(),hasScope:()=>!!r.getStore()}}function r3(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function r4(e,t){return{openBundle:async(t,r)=>{var n,i;let a;await e("open",(n=t,i=r,a=["-b",n],i&&a.push(i),a))},openTarget:async t=>{await e("open",[t])},readClipboard:async()=>{let t=await e("pbpaste",[],{allowFailure:!0});if(0!==t.exitCode)throw new L("COMMAND_FAILED","Failed to read macOS clipboard",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});return t.stdout.replace(/\r\n/g,"\n").replace(/\n$/,"")},writeClipboard:async t=>{let r=await e("pbcopy",[],{allowFailure:!0,stdin:t});if(0!==r.exitCode)throw new L("COMMAND_FAILED","Failed to write macOS clipboard",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode})},readDarkMode:async()=>{let t=await e("osascript",["-e",'tell application "System Events" to tell appearance preferences to get dark mode'],{allowFailure:!0});if(0!==t.exitCode)throw new L("COMMAND_FAILED","Failed to read macOS appearance",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let r=t.stdout.trim().toLowerCase();if("true"===r)return!0;if("false"===r)return!1;throw new L("COMMAND_FAILED",`Unable to determine current macOS appearance from osascript output: ${t.stdout.trim()}`)},setDarkMode:async t=>{let r=`tell application "System Events" to tell appearance preferences to set dark mode to ${t?"true":"false"}`,n=await e("osascript",["-e",r],{allowFailure:!0});if(0!==n.exitCode)throw new L("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await r5(e,t,r)}}async function r5(e,t,r){let i=["/Applications","/System/Applications",n.join(u.homedir(),"Applications")],a=new Set;for(let t of i){let r=await o.stat(t).catch(()=>null);if(!r?.isDirectory())continue;let n=await e("find",[t,"-maxdepth","4","-type","d","-name","*.app"],{allowFailure:!0});if(0===n.exitCode)for(let e of n.stdout.split("\n")){let t=e.trim();t&&a.add(t)}}return r3((await Promise.all(Array.from(a).map(async e=>{let r=await r8(e,t).catch(()=>({})),i=r.bundleId;return i?{bundleId:i,name:r.appName??n.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function r8(e,t){for(let r of[n.join(e,"Contents","Info.plist"),n.join(e,"Info.plist")]){let e=await t(r),n=r6(e,"CFBundleIdentifier"),i=r6(e,"CFBundleDisplayName"),a=r6(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function r6(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let r9={runCommand:U,simctl:{run:async(e,t)=>await U("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await U("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await ns(U,e)},macosHost:r4(U,async e=>await ns(U,e)),whichCommand:V},r7=r2(r9,function(e){return"function"==typeof e?ne({runCommand:e}):ne(e)});function ne(e={}){let t={...r9,...e},r=e.plist??{readJson:async e=>await ns(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??r4(t.runCommand,async e=>await r.readJson(e))}}function nt(e){return r7.resolve(e)}async function nr(e,t){return await r7.run(e,t)}function nn(){return r7.hasScope()}async function ni(e,t,r){return await nt().runCommand(e,t,r)}async function na(e,t){let r=nt(),[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 ni("xcrun",e,t)}async function no(e){return await nt().plist?.readJson(e)??null}async function ns(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}}async function nl(e,t){let r=["devicectl",...e],n=await na(r,{allowFailure:!0,timeoutMs:2e4});if(0===n.exitCode)return;let i=String(n.stdout??""),a=String(n.stderr??"");throw new L("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:r,exitCode:n.exitCode,stdout:i,stderr:a,deviceId:t.deviceId,hint:nf(i,a)??np})}async function nd(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 nc(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"})),r3(r,t)}async function nu(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 nc(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 nc(e,t){let r=n.join(u.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),i=[...t.args,"--json-output",r],a=await na(i,{allowFailure:!0,timeoutMs:2e4});try{if(0!==a.exitCode){let r=String(a.stdout??""),n=String(a.stderr??"");throw new L("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:i,exitCode:a.exitCode,stdout:r,stderr:n,deviceId:e.id,hint:nf(r,n)??np})}return JSON.parse(await o.readFile(r,"utf8"))}catch(r){if(r instanceof L)throw r;throw new L("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await o.unlink(r).catch(()=>{})}}let np="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function nf(e,t){let r=`${e}
|
|
5
|
+
${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 nm=new Map;async function nh(e){var t;let r,n=(r="simulator"===(t=e).kind?t.simulatorSetPath??"":"",JSON.stringify([t.platform,t.kind,t.id,t.target??"",r])),i=nm.get(n);if(void 0!==i){if(i>Date.now())return;nm.delete(n)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:t}=await Promise.resolve(tc);await t(e),nw(n);return}if("device"===e.kind){await ng(e.id),nw(n);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./8806.js");await t(e.id),nw(n)}}function nw(e){nm.set(e,Date.now()+5e3)}async function ng(e){let t=n.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 na(["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 ny(t);if(0===n.exitCode){if(!o.parsed)throw new L("COMMAND_FAILED","iOS device readiness probe failed",{kind:"probe_inconclusive",deviceId:e,stdout:i,stderr:a,hint:"CoreDevice returned success but readiness JSON output was missing or invalid. Retry; if it persists restart Xcode and the iOS device."});let t=o?.tunnelState?.toLowerCase();if("connecting"===t)throw new L("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:e,tunnelState:t,hint:"Device tunnel is still connecting. Keep the device unlocked and connected by cable until it is fully available in Xcode Devices, then retry."});return}throw new L("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:e,stdout:i,stderr:a,exitCode:n.exitCode,tunnelState:o?.tunnelState,hint:nv(i,a)})}catch(t){if(t instanceof L&&"COMMAND_FAILED"===t.code){if("not_ready"===("string"==typeof t.details?.kind?t.details.kind:""))throw t;let r=t.details??{},n=String(r.stdout??""),i=String(r.stderr??""),a=Number(r.timeoutMs??15e3),o=`CoreDevice did not respond within ${a}ms. Keep the device unlocked and trusted, then retry; if it persists restart Xcode and the iOS device.`;throw new L("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:a,stdout:n,stderr:i,hint:n||i?nv(n,i):o},t)}throw new L("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,hint:"Reconnect the device, keep it unlocked, and retry."},t instanceof Error?t:void 0)}finally{await o.rm(t,{force:!0}).catch(()=>{})}}async function ny(e){try{let t=await o.readFile(e,"utf8"),r=JSON.parse(t),n=function(e){let t=e?.result;if(!t||"object"!=typeof t)return{};let r=t.connectionProperties?.tunnelState,n=t.device?.connectionProperties?.tunnelState,i="string"==typeof r?r:"string"==typeof n?n:void 0;return i?{tunnelState:i}:{}}(r);return{parsed:!0,tunnelState:n.tunnelState}}catch{return{parsed:!1}}}function nv(e,t){let r=nf(e,t);return r||(`${e}
|
|
6
|
+
${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":np)}async function nS(e,t){switch(e.platform){case"android":{let{createAndroidInteractor:t}=await import("./android.js");return t(e)}case"linux":{let{createLinuxInteractor:e}=await import("./linux.js");return e()}case"ios":case"macos":{let{createAppleInteractor:r}=await import("./apple.js");return r(e,t)}default:throw new L("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let n_=/^[A-Za-z0-9_.:-]{1,64}$/,nI="--launch-console is supported only for iOS simulator app launches",nA="--launch-console requires a direct app launch and cannot be used with URL opens";function nb(e){return e?.clickButton??"primary"}function nx(e){return"primary"===e.button?null:"click"!==e.commandLabel?new L("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new L("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new L("UNSUPPORTED_OPERATION","click --button middle is not supported by the macOS runner yet"):"number"==typeof e.count||"number"==typeof e.intervalMs||"number"==typeof e.holdMs||"number"==typeof e.jitterPx||!0===e.doubleTap?new L("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function nN(e){return"primary"===e?{}:{button:e}}let nM=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];async function nE(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await e$(t)}async function nD(e,t){let{x:r,y:n}=nL(t,"longpress requires x y [durationMs]",{hint:"Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i -c, use the target rect center as x y, then retry longpress x y durationMs."}),i=t[2]?Number(t[2]):void 0;return await e.longPress(r,n,i),{x:r,y:n,durationMs:i,...eU(`Long pressed (${r}, ${n})`)}}async function nC(e,t){let{x:r,y:n}=nL(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...eU(`Focused (${r}, ${n})`)}}async function nk(e,t,r){let n=eg(t[0]);if(n)throw new L("INVALID_ARGS",`type does not accept a target ref like "${n}"`,{hint:`Use fill ${n} "text" to target that field, or press ${n} then type "text" to append.`});let i=t.join(" ");if(!i)throw new L("INVALID_ARGS","type requires text");let a=ek(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...eU(n3("Typed",i))}}async function nP(e,t,r){if(r?.directElementSelector)return await nR(e,r.directElementSelector,t,r);let n=Number(t[0]),i=Number(t[1]),a=t.slice(2).join(" ");if(Number.isNaN(n)||Number.isNaN(i)||!a)throw new L("INVALID_ARGS","fill requires x y text");let o=ek(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...eU(n3("Filled",a))}}async function nR(e,t,r,n){if(!e.fillElementSelector)throw new L("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new L("INVALID_ARGS","fill requires text");let a=ek(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...eU(n3("Filled",i))}}async function nT(e,t,r,n){var i,a,o,s;if(n?.directElementSelector&&"ios"===e.platform)return await nO(t,n.directElementSelector);let{x:l,y:d}=nL(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await n$(l,d,n);let u=nb(n);if("primary"!==u)return await nF(e,l,d,u,n);let c=(s=n,{count:nG(s?.count,1,"count",1,200),intervalMs:nG(s?.intervalMs,0,"interval-ms",0,1e4),holdMs:nG(s?.holdMs,0,"hold-ms",0,1e4),jitterPx:nG(s?.jitterPx,0,"jitter-px",0,100),doubleTap:!!s?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new L("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new L("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(c),i=c.count,a=c.holdMs,o=c.jitterPx,rF(e.platform)&&i>1&&0===a&&0===o)?await nV(e,l,d,c,n):await nq(t,l,d,c)}async function nO(e,t){if(!e.tapElementSelector)throw new L("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...eU(`Tapped ${t.raw}`)}}function nL(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new L("INVALID_ARGS",t,r);return{x:n,y:i}}async function n$(e,t,r){let n=nb(r);if("primary"!==n)throw new L("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(tl);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...eU(n1({x:e,y:t}))}}async function nF(e,t,r,n,i){if(function(e,t,r){let n=nx({commandLabel:"click",platform:e.platform,button:t,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(n)throw n}(e,n,i),"linux"===e.platform)return await nU(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(td);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},nj(i)),{x:t,y:r,button:n,...eU(n1({x:t,y:r,button:n}))}}async function nU(e,t,r){if("secondary"===r){let{rightClickLinux:r}=await import("./input-actions~1.js");await r(e,t)}else{let{middleClickLinux:r}=await import("./input-actions~1.js");await r(e,t)}return{x:e,y:t,button:r,...eU(n1({x:e,y:t,button:r}))}}function nG(e,t,r,n,i){return ek(void 0===e?t:e,r,n,i)}async function nV(e,t,r,n,i){let{runIosRunnerCommand:a}=await Promise.resolve(td),o=await a(e,{command:"tapSeries",x:t,y:r,count:n.count,intervalMs:n.intervalMs,doubleTap:n.doubleTap,appBundleId:i?.appBundleId},nj(i));return{x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,timingMode:"runner-series",...o,...eU(n1({x:t,y:r}))}}async function nq(e,t,r,n){let i;return await nE(n.count,n.intervalMs,async a=>{let[o,s]=function(e,t){if(t<=0)return[0,0];let[r,n]=nM[e%nM.length];return[r*t,n*t]}(a,n.jitterPx),l=t+o,d=r+s;if(n.doubleTap){i??=await e.doubleTap(l,d)??void 0;return}n.holdMs>0?i??=await e.longPress(l,d,n.holdMs)??void 0:i??=await e.tap(l,d)??void 0}),eG({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},n1({x:t,y:r}))}function nj(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId}}async function nB(e,t,r,n){let i=Number(r[0]),a=Number(r[1]),o=Number(r[2]),s=Number(r[3]);if([i,a,o,s].some(Number.isNaN))throw new L("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await nK({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function nH(e,t,r,n){let i=eL(r[0]),a=r[1]?Number(r[1]):300,o=eP((await t.snapshot({appBundleId:n?.appBundleId,compact:!0})).nodes??[]);if(!o)throw new L("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=ey(i,o,{platform:e.platform});return await nK({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function nK(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:d}=e,u=ek(l,"durationMs",16,1e4),c="ios"===t.platform?Math.min(60,Math.max(16,Math.round(u))):u,p=ek(n?.count??1,"count",1,200),f=ek(n?.pauseMs??0,"pause-ms",0,1e4),m=n?.pattern??"one-way";if("one-way"!==m&&"ping-pong"!==m)throw new L("INVALID_ARGS",`Invalid pattern: ${m}`);if(rF(t.platform)&&p>1){let{runIosRunnerCommand:e}=await Promise.resolve(td),r=await e(t,{command:"dragSeries",x:i,y:a,x2:o,y2:s,durationMs:c,count:p,pauseMs:f,pattern:m,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId});return{x1:i,y1:a,x2:o,y2:s,...d?{preset:d}:{},durationMs:u,effectiveDurationMs:c,timingMode:"runner-series",count:p,pauseMs:f,pattern:m,...r,...eU(n2(p,m))}}return await nE(p,f,async e=>{"ping-pong"===m&&e%2==1?await r.swipe(o,s,i,a,c):await r.swipe(i,a,o,s,c)}),eG({x1:i,y1:a,x2:o,y2:s,...d?{preset:d}:{},durationMs:u,effectiveDurationMs:c,timingMode:"ios"===t.platform?"safe-normalized":"direct",count:p,pauseMs:f,pattern:m},d?`Swiped ${d}`:n2(p,m))}async function nW(e,t){let r=Number(t[0]),n=Number(t[1]),i=Number(t[2]),a=Number(t[3]);if([r,n,i,a].some(e=>!Number.isFinite(e)))throw new L("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=ek(t[4]?Number(t[4]):500,"durationMs",16,1e4),s=r+i,l=n+a;return await e.pan(r,n,s,l,o),{x:r,y:n,dx:i,dy:a,x2:s,y2:l,durationMs:o,...eU(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function nz(e,t){let r=function(e,t){if("up"===e||"down"===e||"left"===e||"right"===e)return e;throw new L("INVALID_ARGS",`${t} must be up, down, left, or right`)}(t[0],"fling direction"),n=Number(t[1]),i=Number(t[2]);if(![n,i].every(Number.isFinite))throw new L("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new L("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=ek(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,...eU(`Flung ${r}`)}}async function nJ(e,t,r){var n;let i=t[0],a=t[1]?Number(t[1]):void 0,o=r?.pixels;if(!i)throw new L("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new L("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==o)throw new L("INVALID_ARGS","scroll accepts either a relative amount or --pixels, not both");let s="bottom"===(n=i)?{direction:"down",edge:"bottom"}:"top"===n?{direction:"up",edge:"top"}:{direction:ev(n)},l={},d=0;if(s.edge){let t=s.edge,n=await eC({edge:t,captureState:async n=>await nX(e,r,t,n),scroll:async()=>await e.scroll(s.direction,{amount:a,pixels:o})});l=n.result??{},d=n.passes}else l=await e.scroll(s.direction,{amount:a,pixels:o}),d=1;return eG({direction:s.direction,...s.edge?{edge:s.edge,passes:d}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},eA(s.direction,s.edge,d,a,o))}async function nX(e,t,r,n){if("function"!=typeof e.snapshot)throw new L("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await eN({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,compact:!0,scope:e})).nodes??[]})}async function nZ(e,t,r,n){if("tv"===e.target)throw new L("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new L("UNSUPPORTED_OPERATION","gesture pinch is only supported in macOS app sessions. Re-open the target app without --surface desktop|menubar|frontmost-app first.");let i=Number(r[0]),a=r[1]?Number(r[1]):void 0,o=r[2]?Number(r[2]):void 0;if(Number.isNaN(i)||i<=0)throw new L("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...eU(`Pinched to scale ${i}`)}}async function nY(e,t,r){if("tv"===e.target)throw new L("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new L("UNSUPPORTED_OPERATION","gesture rotate is not supported on macOS; XCTest rotation gestures are available only for iOS app sessions.");let{degrees:n,x:i,y:a,velocity:o}=function(e){let t=Number(e[0]);if(!Number.isFinite(t))throw new L("INVALID_ARGS","gesture rotate requires degrees [x] [y] [velocity]");let r=function(e,t){if(void 0===e&&void 0===t)return{};if(void 0===e||void 0===t)throw new L("INVALID_ARGS","gesture rotate center requires both x and y");let r=Number(e),n=Number(t);if(!Number.isFinite(r)||!Number.isFinite(n))throw new L("INVALID_ARGS","gesture rotate center requires finite x and y");return{x:r,y:n}}(e[1],e[2]),n=Number(e[3]??(t>=0?1:-1));if(!Number.isFinite(n)||0===n)throw new L("INVALID_ARGS","gesture rotate velocity must be a non-zero number");return{degrees:t,...r,velocity:Math.abs(n)*(t>=0?1:-1)}}(r),s=await t.rotateGesture(n,i,a,o);return{degrees:n,...void 0!==i&&void 0!==a?{x:i,y:a}:{},velocity:o,...s,...eU(`Rotated gesture ${n} degrees`)}}async function nQ(e,t,r){if("tv"===e.target)throw new L("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new L("UNSUPPORTED_OPERATION","gesture transform is currently supported on Android and iOS simulators");let i=function(e){let t=Number(e[0]),r=Number(e[1]),n=Number(e[2]),i=Number(e[3]),a=Number(e[4]),o=Number(e[5]);if(![t,r,n,i,a,o].every(Number.isFinite))throw new L("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new L("INVALID_ARGS","gesture transform scale must be > 0");return{x:t,y:r,dx:n,dy:i,scale:a,degrees:o,durationMs:void 0===e[6]?void 0:ek(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...eU(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function n0(e,t,r){let{x:n,y:i}=nL(t,"read requires x y");if("android"===e.platform){let{readAndroidTextAtPoint:t}=await import("./input-actions.js");return{action:"read",text:await t(e,n,i)??""}}if("linux"===e.platform){let{readLinuxTextAtPoint:e}=await Promise.resolve(tf);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(tl);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(td),o=await a(e,{command:"readText",x:n,y:i,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function n1(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function n2(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function n3(e,t){return`${e} ${Array.from(t).length} chars`}function n4(e,t){let r,n=t?.subject??"Payload",a=e.trim();if(!a)throw new L("INVALID_ARGS",`${n} cannot be empty`);let o=t?.expandPath?t.expandPath(a,t.cwd):a;try{if(!i.statSync(o).isFile())throw new L("INVALID_ARGS",`${n} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof L)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new L("INVALID_ARGS",`${n} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new L("COMMAND_FAILED",`Unable to read ${n} file: ${o}`,{cause:String(t)})}if((r=a.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:a};throw new L("INVALID_ARGS",`${n} file not found: ${o}`)}async function n5(e){let t=n4(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await n8(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new L("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof L)throw t;throw new L("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function n8(e){try{return await o.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new L("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new L("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new L("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new L("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function n6(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},o=await nS(e,a);return N({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await x("platform_command",async()=>await n9(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function n9(e,t,r,n,i,a,o){switch(r){case"open":return await n7(e,t,n,a);case"close":{let e=n[0];if(!e)return{closed:"session",...eU("Closed session")};return await t.close(e),{app:e,...eU(`Closed: ${e}`)}}case"press":return await nT(e,t,n,a);case"swipe":return await nB(e,t,n,a);case"swipe-preset":return await nH(e,t,n,a);case"pan":return await nW(t,n);case"fling":return await nz(t,n);case"longpress":return await nD(t,n);case"focus":return await nC(t,n);case"type":return await nk(t,n,a);case"fill":return await nP(t,n,a);case"scroll":return await nJ(t,n,a);case"pinch":return await nZ(e,t,n,a);case"rotate-gesture":return await nY(e,t,n);case"transform-gesture":return await nQ(e,t,n);case"trigger-app-event":return await ie(e,t,n,a);case"screenshot":return await it(t,n,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...eU("Back")};case"home":return await t.home(),{action:"home",...eU("Home")};case"rotate":{let e=eV(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...eU(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...eU("Opened app switcher")};case"clipboard":return await ir(t,n);case"keyboard":return await ii(e,n,a,o);case"settings":return await is(e,t,n,a);case"push":return await il(e,n,a);case"snapshot":return await id(t,a);case"read":return await n0(e,n,a);default:throw new L("INVALID_ARGS",`Unknown command: ${r}`)}}async function n7(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new L("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new L("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new L("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...eU("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new L("UNSUPPORTED_OPERATION",nI);if("linux"===e.platform&&s&&s.length>0)throw new L("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(eh(i))throw new L("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!eh(a))throw new L("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new L("INVALID_ARGS",nA);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...eU(`Opened: ${i}`)}}if(o&&eh(i))throw new L("INVALID_ARGS",nA);if(n?.clearAppState){if(eh(i))throw new L("INVALID_ARGS","Clearing app state requires an app target, not a deep link.");await t.setSetting("clear-app-state","clear",i)}return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchConsole:o,launchArgs:s}),{app:i,...o?{launchConsole:o}:{},...eU(`Opened: ${i}`)}}async function ie(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new L("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!n_.test(t))throw new L("INVALID_ARGS",`Invalid trigger-app-event event name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});if(e.length>2)throw new L("INVALID_ARGS","trigger-app-event accepts at most two arguments: <event> [payloadJson]");let n=function(e,t){if(e)try{let r=JSON.parse(e);if(!r||"object"!=typeof r||Array.isArray(r))throw new L("INVALID_ARGS",`trigger-app-event payload for "${t}" must be a JSON object`);let n=JSON.stringify(r);if(Buffer.byteLength(n,"utf8")>8192)throw new L("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof L)throw t;throw new L("INVALID_ARGS",`Invalid trigger-app-event payload JSON: ${e}`)}}(r,t);return{eventName:t,payload:n}}(r),o=function(e,t,r){var n;let i,a=(i=("ios"===(n=e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:"macos"===n?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE,i?.trim()||void 0);if(!a)throw new L("UNSUPPORTED_OPERATION",`No app event URL template configured for ${e}.`,{hint:`Set AGENT_DEVICE_${e.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):"",s=a.replaceAll("{event}",encodeURIComponent(t)).replaceAll("{payload}",encodeURIComponent(o)).replaceAll("{platform}",encodeURIComponent(e));if(s.length>4096)throw new L("INVALID_ARGS","trigger-app-event URL exceeds maximum supported length",{hint:"Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.",length:s.length,maxLength:4096});return s}(e.platform,i,a);return await t.open(o,{appBundleId:n?.appBundleId}),{event:i,eventUrl:o,transport:"deep-link",...eU(`Triggered app event: ${i}`)}}async function it(e,t,r,i){let a=t[0]??r??`./screenshot-${Date.now()}.png`;await o.mkdir(n.dirname(a),{recursive:!0});let s=v(i);return await e.screenshot(a,{appBundleId:i?.appBundleId,fullscreen:s.fullscreen,stabilize:s.stabilize,surface:i?.surface}),{path:a,...eU(`Saved screenshot: ${a}`)}}async function ir(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new L("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new L("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new L("INVALID_ARGS",'clipboard write requires text (use "" to clear clipboard)');let n=t.slice(1).join(" ");return await e.writeClipboard(n),{action:r,textLength:Array.from(n).length,...eU("Clipboard updated")}}async function ii(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!eS(i))throw new L("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new L("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await ia(e,i);if("ios"===e.platform)return await io(e,i,r,n);throw new L("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function ia(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...eU("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./8133.js"),r=await t(e);return{platform:"android",action:"dismiss",attempts:r.attempts,wasVisible:r.wasVisible,dismissed:r.dismissed,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}let{getAndroidKeyboardState:r}=await import("./8133.js"),n=await r(e);return{platform:"android",action:"status",visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function io(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new L("UNSUPPORTED_OPERATION","keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS");if("enter"===t||"return"===t){let{runIosRunnerCommand:t}=await Promise.resolve(td),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...eU("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(td),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...eU(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function is(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new L("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new L("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");N({level:"debug",phase:"settings_apply",data:{setting:i,state:"clear",appBundleId:r,platform:e.platform}});let s=await t.setSetting(i,"clear",r);return s&&"object"==typeof s?eG({setting:i,state:"clear",...s},iu(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...eU(`Cleared user data for ${r}`)}}if(!a)throw new L("INVALID_ARGS","settings requires setting state");let l="location"===i&&"set"===a,d=("permission"===i||l?r[4]:r[2])??n?.appBundleId,u="permission"===i?{permissionTarget:o,permissionMode:s}:l?{latitude:eF(o,"latitude"),longitude:eF(s,"longitude")}:void 0;N({level:"debug",phase:"settings_apply",data:l?{setting:i,state:a,latitude:o,longitude:s,platform:e.platform}:"permission"===i?{setting:i,state:a,permissionTarget:o,permissionMode:s,platform:e.platform}:{setting:i,state:a,appBundleId:d,platform:e.platform}});let c=await t.setSetting(i,a,d,u);return c&&"object"==typeof c?eG({setting:i,state:a,...c},iu(c)??`Updated setting: ${i}`):{setting:i,state:a,...eU(`Updated setting: ${i}`)}}async function il(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new L("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await n5(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...eU(`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,...eU(`Pushed notification to ${n}`)}}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}function ic(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let ip=300,im=300;function ih(e,t,r){return t||iw(r)?null:ic("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function iw(e){return!!(e?.platform||e?.target||e?.device||e?.udid||e?.serial)}function ig(e){return"string"==typeof e?.session&&e.session.trim().length>0}function iy(e){return"ios"===e.platform&&"simulator"===e.kind}async function iv(e,t){iy(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function iS(e){let t=iw(e.flags)||!e.session?await rz(e.flags??{}):await i_(e.session.device);return!1!==e.ensureReady&&await nh(t),t}async function i_(e){if("ios"!==e.platform||"simulator"!==e.kind||"darwin"!==process.platform)return e;let t={platform:"ios",target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await rz(t)}catch(e){if(!(e instanceof L)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await rz({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function iI(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 iA(e,t){if(!t)return!1;if(!iw(e))return!0;let r=r$(e?.platform);return!(r&&!rU(t.device.platform,r)||e?.target&&e.target!==(t.device.target??"mobile")||e?.udid&&e.udid!==t.device.id||e?.serial&&e.serial!==t.device.id)&&(!e?.device||e.device.trim().toLowerCase()===t.device.name.trim().toLowerCase())}let ib=[{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");iD(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&rF(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);iD(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&&rF(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(tp);iD(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(tm);iD(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(ts);iD(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");iD(t,e.recording,r)}}];async function ix(e,t){let r=await iN(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await iE(r);return await iC(i,async()=>await t(n))}async function iN(e){var t,r,n;if(t=e.providers,!ib.some(e=>!!t[e.resolverKey]))return{};let i=await iM(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return ib.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function iM(e,t){var r;return t?e.command===eq.apps&&iw(e.flags)?await rz(e.flags??{}):t.device:e.command===eq.open||iw(e.flags)||(r=e).command===eq.record&&"start"===(r.positionals?.[0]??"").toLowerCase()?await rz(e.flags??{}):void 0}async function iE(e){let t=[];for(let r of ib)await r.appendWrapper(e,t);return t}function iD(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function iC(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}let ik=e=>"macos"!==e.platform,iP=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,iR={device:!0},iT={},iO={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iR},iL={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT,supports:ik},i$={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},pinch:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind&&"tv"!==e.target},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT,supports:e=>"android"===e.platform||iP(e)},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT,supports:e=>"android"===e.platform||iP(e)},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT,supports:ik},open:iO,close:iO,reinstall:iL,install:iL,"install-from-source":iL,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iR},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT,supports:ik},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iR},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iR,supports:e=>"android"===e.platform||"linux"===e.platform||"macos"===e.platform||"simulator"===e.kind},keyboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},fill:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iR},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT},snapshot:iO,diff:iO,screenshot:iO,wait:iO,get:iO,find:iO,is:iO,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iR},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iR,supports:ik},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iR},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iR},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iR},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT,supports:ik},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},scroll:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iR},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iR},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},"trigger-app-event":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iT},type:iO};function iF(e,t){let r=i$[e];if(!r)return!0;let n=rF(t.platform)?r.apple:"linux"===t.platform?r.linux:r.android;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}let iU="agent-device-macos-helper",iG="AGENT_DEVICE_MACOS_HELPER_BIN",iV=n.join(u.homedir(),".agent-device","macos-helper","current"),iq=n.join(iV,"manifest.json"),ij=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function iB(e){let t=e.trim();if(!ij.test(t))throw new L("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function iH(e,t){t.bundleId&&e.push("--bundle-id",iB(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iK(){return function(e){let t=n.dirname(e);for(;;){let e=n.join(t,"macos-helper");if(a(n.join(e,"Package.swift")))return e;let r=n.dirname(t);if(r===t)break;t=r}throw new L("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(l(import.meta.url))}async function iW(e){let t=await o.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=n.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await iW(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function iz(e){let t=await iW(e),i=r("sha256");for(let r of t)i.update(n.relative(e,r)),i.update("\0"),i.update(await o.readFile(r)),i.update("\0");let a=await ni("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return i.update("swift-version"),i.update("\0"),i.update(a.stdout||a.stderr||`exit:${a.exitCode}`),i.update("\0"),i.digest("hex")}async function iJ(){try{let e=JSON.parse(await o.readFile(iq,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function iX(){let e=await G(process.env[iG],iG);if(e)return e;let t=iK(),r=await iz(t),i=n.join(iV,iU);try{if(await iJ()===r)return await o.access(i),i}catch{}let a=n.join(iK(),".build","release",iU);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await ni("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await o.mkdir(iV,{recursive:!0});let s=`${i}.tmp`;return await o.copyFile(a,s),await o.rename(s,i),await o.chmod(i,493),await o.writeFile(iq,`${JSON.stringify({fingerprint:r},null,2)}
|
|
7
|
+
`,"utf8"),i}async function iZ(){let e=process.env[iG]?.trim();if(e){let t=await G(e,iG);if(t)return t}if(nn())return iU;if("darwin"!==process.platform)throw new L("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await iX()}async function iY(e){let t={allowFailure:!0,timeoutMs:3e4},r=nt().macosHelper,n=r?iU:await iZ(),i=r?await r.run(e,t):await ni(n,e,t),a=i.stdout.trim(),o=null;if(a)try{o=JSON.parse(a)}catch{o=null}if(0===i.exitCode&&o?.ok)return o.data;throw new L("COMMAND_FAILED",o&&!o.ok?o.error?.message??`macOS helper exited with code ${i.exitCode}`:a||i.stderr.trim()||`macOS helper exited with code ${i.exitCode}`,{helperPath:n,args:e,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,...o&&!o.ok?o.error?.details:{}})}async function iQ(){return await iY(["app","frontmost"])}async function i0(e){return await iY(["app","quit","--bundle-id",iB(e)])}async function i1(e,t){return await iY(["permission",e,t])}async function i2(e,t={}){let r=["alert",e];return iH(r,t),await iY(r)}async function i3(e,t={}){let r=["snapshot","--surface",e];return iH(r,t),await iY(r)}async function i4(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return iH(n,r),await iY(n)}async function i5(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return iH(n,r),await iY(n)}async function i8(e,t={}){let r=["screenshot","--out",e];return iH(r,t),t.fullscreen&&r.push("--fullscreen"),await iY(r)}let i6={"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"},i9={runCommand:U,whichCommand:V,desktop:an(U,V),clipboard:ai(U,V),screenshot:aa(U,V)},i7=r2(i9,function(e={}){let t={...i9,...e};return{...t,desktop:e.desktop??an(t.runCommand,t.whichCommand),clipboard:e.clipboard??ai(t.runCommand,t.whichCommand),screenshot:e.screenshot??aa(t.runCommand,t.whichCommand)}});function ae(e){return i7.resolve(e)}async function at(e,t){return await i7.run(e,t)}async function ar(e,t,r){return await ae().runCommand(e,t,r)}function an(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 e$(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 ai(e,t){return{async readText(){let r=al[await ac(t,ao)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=ad[await ac(t,ao)](r);await e(n.cmd,n.args,n.options)}}}function aa(e,t){return{async capture(r){let n=au[await ac(t,as)](r);await e(n.cmd,n.args,n.options)}}}let ao={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."},as={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."},al={"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}}},ad={"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}})},au={grim:e=>({cmd:"grim",args:[e]}),scrot:e=>({cmd:"scrot",args:[e]}),import:e=>({cmd:"import",args:["-window","root",e]}),"gnome-screenshot":e=>({cmd:"gnome-screenshot",args:["-f",e]})};async function ac(e,t){let r=process.env.WAYLAND_DISPLAY||"wayland"===process.env.XDG_SESSION_TYPE?"wayland":"x11";for(let n of t[r])if(await e(n.command))return n.tool;throw new L("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let ap="atspi-dump.py",af=null;async function am(e,t={}){let r,a=ae().accessibility;if(a)return await a.captureTree(e,t);if("linux"!==process.platform)throw new L("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await ae().whichCommand("python3"))throw new L("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let o=t.maxNodes??1500,s=t.maxDepth??12,d=t.maxApps??24,u=[function(){if(af)return af;let e=n.dirname(l(import.meta.url));for(let t=0;t<5;t++){let r=n.join(e,"src","platforms","linux",ap);if(i.existsSync(r))return af=r,r;if(0===t){let t=n.join(e,ap);if(i.existsSync(t))return af=t,t}e=n.dirname(e)}throw new L("TOOL_MISSING",`Cannot find ${ap}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(d)],c=await ar("python3",u,{allowFailure:!0,timeoutMs:3e4});if(0!==c.exitCode){let e=c.stderr.trim();if(e.includes("No module named")||e.includes("gi.require_version"))throw new L("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new L("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${c.exitCode}): ${e||c.stdout}`)}try{r=JSON.parse(c.stdout)}catch{throw new L("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${c.stdout.slice(0,200)}`)}if(r.error)throw new L("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=i6[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 ah(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 am(t);return{nodes:r.nodes,truncated:r.truncated}}async function aw(e,t,r){let{nodes:n}=await ah(r);for(let r of n.filter(r=>{let n=r.rect;return!!n&&e>=n.x&&t>=n.y&&e<=n.x+n.width&&t<=n.y+n.height}).sort((e,t)=>{let r=e.depth??0,n=t.depth??0;return r!==n?n-r:ag(e.rect)-ag(t.rect)})){let e=function(e){for(let t of[e.value,e.label,e.identifier])if("string"==typeof t&&t.length>0)return t;return""}(r);if(e.trim())return e}return""}function ag(e){return(e?.width??0)*(e?.height??0)}let ay=[250,400,600];function av(e,t,r=e.snapshot){if("android"!==e.device.platform)return;let n=r?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:r?.nodes.length??0,baselineSignatures:n?aA(r?.nodes??[]):void 0,routeComparable:n}}function aS(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 a_(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function aI(e){return"press"===e||"click"===e||"back"===e||"open"===e}function aA(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,r,n,i){return{requestId:i??A().requestId,appBundleId:r,activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotCompact:t?.snapshotCompact,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...S(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:nb(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function ax(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function aN(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!aM(t.device.platform)||!n)return await r();let i=Date.now(),a=1,o=await r(),s=aE(o.nodes);for(;Date.now()-i<1500;){await e$(200),a+=1;let e=await r(),l=aE(e.nodes);if(function(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}(s,l))return ax(t),N({level:a>2?"info":"debug",phase:"post_gesture_snapshot_stabilized",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),e;o=e,s=l}return ax(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 aE(e){let t=new Map,r=[];for(let a of e){var n,i;if(!a.rect||!([(n=a.rect).x,n.y,n.width,n.height].every(e=>Number.isFinite(e))&&n.width>0&&n.height>0)||(i=a,`${i.label??""} ${i.identifier??""}`.toLowerCase().includes("scroll bar")))continue;let e=[a.identifier,a.label,a.value,a.type].map(e=>"string"==typeof e?e.trim():"").join("|");if(!e.replaceAll("|",""))continue;let o=t.get(e)??0;t.set(e,o+1),r.push({key:`${e}|#${o}`,x:a.rect.x,y:a.rect.y,width:a.rect.width,height:a.rect.height})}return r}let aD=["x","y","width","height"];function aC(e,t){let r=e[t]?.depth??0,n=[];for(let i=t+1;i<e.length;i+=1){let t=e[i];if(t){if((t.depth??0)<=r)break;n.push(t)}}return n}function ak(e,t,r){for(let n of function(e,t){let r=[],n="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,i=new Set;for(;n&&!i.has(n.index);)i.add(n.index),r.push(n),n="number"==typeof n.parentIndex?t.get(n.parentIndex):void 0;return r}(e,t))if(r(n))return n;return null}function aP(e,t){let r=eK(e.type??""),n=e.label?.trim();return!!(aR(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function aR(e){return"button"===eK(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function aT(e){let t=eK(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function aO(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function aL(e,t){return!!e&&!!t&&aD.every(r=>.5>=Math.abs(e[r]-t[r]))}function a$(e){let t;for(let i of e){var r,n;let e=eK(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||aF(r)>aF(n)))&&(t=i.rect)}return t}function aF(e){return e?e.width*e.height:0}function aU(e){let t=eK(e.type??"");return"scrollview"===t||"scrollarea"===t}function aG(e,t){return!0===e||!!t||void 0}function aV(e,t,r){for(let n of e)(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=eK(e.type??"");return"other"===n||"statictext"===n||"link"===n})(n,t)&&r.add(n.index)}function aq(e,t,r,n){for(let i of aC(e,t))i.index!==r&&function(e){let t=eK(e.type??"");return"button"!==t&&("image"===t||"Search"===e.label)}(i)&&n.add(i.index)}function aj(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===eK(n.type??"")&&t(n,i,r)}}function aB(e,t,r,n){for(let i of e)(aP(i,t)||n&&aK(i,n))&&r.add(i.index)}function aH(e,t,r){if("button"!==eK(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&aL(e.rect,t.rect)}function aK(e,t){return"button"===eK(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&aL(e.rect,t.rect)}let aW=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=a$(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];if(o&&(i=o,a=n,i.rect&&"keyboard"===eK(i.type??"")&&i.rect.y>=a))for(let i of(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),aC(e,r)))t.add(i.index)}})(e,o),function(e,t){for(let r of e)!("other"!==eK(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&&e_(t))})(r)&&function(e,t,r){var n,i,a,o;aT(e.type)||r.suppressedIndexes.add(e.index);let s=ex(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&aT(e.type)?e:null)??ak(e,t,e=>aT(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,aO(n.replacements,i,{rect:function(e,t){if(e&&t&&!(t.height<=0)&&!(t.height>=e.height)&&!(t.y<e.y)&&!(t.y>e.y+e.height))return{...e,y:t.y,height:Math.min(t.height,e.y+e.height-t.y)}}(i.rect,a.rect)??i.rect,hiddenContentAbove:aG(i.hiddenContentAbove,o.above),hiddenContentBelow:aG(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"!==eK(n.type??""))continue;if("Search"===n.label){aq(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=aC(e,r).find(e=>"searchfield"===eK(e.type??"")&&"Search"===e.label);i&&(t.add(n.index),function(e,t,r){let n=new Map(t.map(e=>[e.index,e])),i=e;for(;"number"==typeof i.parentIndex;){let e=n.get(i.parentIndex);if(!e||"Toolbar"!==e.label)return;r.add(e.index),i=e}}(n,e,t),aq(e,r,i.index,t))}})(e,o),r=e,n=o,aj(r,(e,t,i)=>{aC(r,i).find(r=>{let n;return("button"===(n=eK(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(aL(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=eK(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,aj(i,(e,t,r)=>{var n;eI(t)&&(n=e.rect)&&n.x<=1&&n.y<=1&&n.width>=300&&n.height>=600&&aC(i,r).some(e=>{var r;return e.label?.trim()===t&&!!(r=e).rect&&r.rect.width>=120&&r.rect.height>=36&&r.rect.height<=180})&&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=aC(e,t),o=eK(r.type??"");if("statictext"===o||"link"===o)return aV(a,n,i);if("other"===o){if(function(e,t){return e.some(e=>{let r=eK(e.type??"");return("link"===r||"searchfield"===r||aT(e.type))&&e.label?.trim()===t})}(a,n))return i.add(r.index);aV(a,n,i)}}(e,r,n,i,t)}}(e,o)},function(e,t){let r=new Map(e.map(e=>[e.index,e])),n=a$(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==eK(e.type??"")||!1===e.enabled||!e.rect||!function(e){let t=e?.trim();return!(!t||/^(toolbar|window|application)$/i.test(t)||t.startsWith("!,")||/debugger|fast refresh/i.test(t))}(e.label)||!ak(e,t,aU)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=aF(e),i=aF(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&aO(t.replacements,i,{type:"Cell"})},function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n?.rect&&i&&function(e,t,r,n,i){let a=aC(e,t),o=eK(r.type??"");"button"===o?aB(a,n,i.suppressedIndexes,r):"cell"!==o||!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==eK(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=>aH(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&aO(n.replacements,i,{identifier:o}),n.suppressedIndexes.add(t.index),function(e,t,r,n,i){for(let a of e)a.index!==n.index&&(aH(a,t,r)||aK(a,t)||function(e,t){if("switch"!==eK(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||aP(a,r))&&i.add(a.index)}(e,t,r,i,n.suppressedIndexes),!0}(a,r,n,i)&&function(e,t,r,n){let i=e.find(e=>aH(e,t,r));if(!i){e.some(aR)&&aB(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&aO(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),aB(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(a,r,n,i)}(e,r,n,i,t)}}];async function az(e){if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return{snapshot:await aN({session:e.session,capture:async()=>(await aZ(e)).snapshot})};let t=aS(e.session);if(t&&"android"===e.device.platform)return await aX(e,t);let r=await aJ(e);return a_(e.session),{snapshot:a0(r,aY(e)),analysis:r.analysis,androidSnapshot:r.androidSnapshot}}async function aJ(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await ah(r?.surface);return a1({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?a1(await i3(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await n6(t,"snapshot",[],i,{...ab(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath)})}async function aX(e,t){let r=await aZ(e),n=aQ(r,t,e),i=0,a=t.markedAt+1500;for(let o of ay){if(!n)break;let s=a-Date.now();if(s<=0)break;await e$(Math.min(o,s)),r=await aZ(e),i+=1,n=aQ(r,t,e)}return n||a_(e.session),{snapshot:r.snapshot,analysis:r.data.analysis,androidSnapshot:r.data.androidSnapshot,freshness:i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0}}async function aZ(e){let t=await aJ(e);return{data:t,snapshot:a0(t,aY(e))}}function aY(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function aQ(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&&aI(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=aA(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 a0(e,t){var r,n,i,a;let o=e?.nodes??[],s=eM(t?.snapshotRaw?o:eW(o)),l=t?.snapshotScope&&e?.backend!=="macos-helper"?a2(s,t.snapshotScope):s;return{nodes:e1((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 aW)n(e,{replacements:t,suppressedIndexes:r});if(0===r.size&&0===t.size)return e;var n=e.filter(e=>!r.has(e.index)).map(e=>t.get(e.index)??e);let i=new Map(e.map(e=>[e.index,e])),a=new Map;for(let[e,t]of n.entries())a.set(t.index,e);return n.map((e,t)=>{let n="number"==typeof e.parentIndex?a.get(e.parentIndex):void 0;return void 0===n&&"number"==typeof e.parentIndex&&(n=function(e,t,r,n){let i=e,a=new Set;for(;"number"==typeof i&&!a.has(i);){if(a.add(i),!t.has(i))return n.get(i);i=r.get(i)?.parentIndex}}(e.parentIndex,r,i,a)),{...e,index:t,parentIndex:n}})}(l):l),truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,presentationKey:eQ(eX(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&a?.snapshotCompact!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function a1(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=a2(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:a3(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=a3(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function a2(e,t){let r=ez(e1(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 a3(a,i)}function a3(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 a4(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return ic("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=eZ(e.trim());if(!n)return ic("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=eY(e.nodes,n);if(r=t?eJ(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:ic("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function a5(e,t){e.snapshot=t,e.snapshotScopeSource=void 0}function a8(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 a6(e){let{session:t,sessionName:r,outPath:i,outputPlacement:a,dispatchContext:s}=e,l=eD({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?a9(await n6(t.device,"screenshot",[],i,o)):a9(await n6(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:s}),artifacts:{resolveInput:async()=>{throw new L("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await o.mkdtemp(n.join(u.tmpdir(),"agent-device-screenshot-")),r=n.join(t,"screenshot.png")),await o.mkdir(n.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await o.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await o.mkdtemp(n.join(u.tmpdir(),`${e.prefix}-`));return{path:n.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await o.rm(t,{recursive:!0,force:!0})}}}},sessions:a8({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eR()});return await l.capture.screenshot({session:r,requestId:s.requestId,appBundleId:t.appBundleId,...v(s),surface:t.surface,...i?{out:{kind:"path",path:i}}:{}})}function a9(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function a7(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function oe(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 ot(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let or=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function on(e,t={}){let r=e5(e,t.helperAdb).exec;return(await oo(e,t,r)).xml}async function oi(e,t={}){let r=e5(e,t.helperAdb).exec,n=await oo(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=e6(i,800,t);return a&&function(e,t){for(let[r,n]of e){let e=t[r];e&&(n.hiddenContentAbove&&(e.hiddenContentAbove=!0),n.hiddenContentBelow&&(e.hiddenContentBelow=!0))}}(await ow(e,o.nodes,i,r),o.nodes),{...o,androidSnapshot:n.metadata}}let o=e7(i),s=ti(o,800,t);a&&await oa({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:l,...d}=s;return{...d,androidSnapshot:n.metadata}}async function oa(e){if(oy(e.interactiveSnapshot.nodes).size>0||og(e.xml))return;let t=ti(e.tree,800,{...e.options,interactiveOnly:!1}),r=await ow(e.device,t.nodes,e.xml,e.adb);ob(r,t,e.interactiveSnapshot),0===r.size&&ob(eb(e1(t.nodes)),t,e.interactiveSnapshot)}async function oo(e,t,r){let n=await x("android_snapshot_helper_artifact_resolution",async()=>await om(t.helperArtifact));return n.artifact?await os(e,t,r,n.artifact):(N({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await oh(e,n.fallbackReason,r))}async function os(e,t,r,n){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),d=e5(e,t.helperAdb);try{let e=await ol(t,r,d,n,l);return e.installed&&await ta(l),a=await od(t,r,d,n,l),o=n,s=e.reason,{xml:a.xml,metadata:{backend:"android-helper",helperVersion:o.manifest.version,helperApiVersion:a.metadata.helperApiVersion,helperTransport:a.metadata.transport,helperSessionReused:a.metadata.sessionReused,installReason:s,waitForIdleTimeoutMs:a.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:a.metadata.waitForIdleQuietMs,timeoutMs:a.metadata.timeoutMs,maxDepth:a.metadata.maxDepth,maxNodes:a.metadata.maxNodes,rootPresent:a.metadata.rootPresent,captureMode:a.metadata.captureMode,windowCount:a.metadata.windowCount,nodeCount:a.metadata.nodeCount,helperTruncated:a.metadata.truncated,elapsedMs:a.metadata.elapsedMs}}}catch(t){return await ou({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function ol(e,t,r,n,i){let a=await x("android_snapshot_helper_install",async()=>await e9({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 od(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 tt(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:O(e).message}}),await oc(t,n.manifest.packageName)}return await x("android_snapshot_helper_capture",async()=>await te(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function ou(e){let t=function(e){var t;let r=O(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=of(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=op(e);return new L(R(r.code),`${n}. Stock UIAutomator fallback was skipped because this usually means the Android accessibility tree is busy or stalled.`,{...r.details,hint:"Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout and report the busy UI if it persists."},e)}(e.error);if(t)throw t;let r=op(e.error);return N({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await ta(e.helperDeviceKey),await oc(e.adb,e.artifact.manifest.packageName),tn({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oh(e.device,r,e.adb)}async function oc(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await e$(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:O(e).message}})}}function op(e){let t=O(e),r=of(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 of(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 om(e){if(e)return{artifact:e};let t=e3(),r=n.join(e4(),"android-snapshot-helper","dist"),i=n.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await h.access(i)}catch{return{}}try{let e=tr(JSON.parse(await h.readFile(i,"utf8"))),t=n.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await h.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:O(e).message}}}async function oh(e,t,r){let n;try{n=await x("android_snapshot_stock_capture",async()=>await ov(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new L(R((r=O(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 ow(e,t,r,n){if(!t.some(e=>e2(e.type)))return new Map;let i=oy(t);if(i.size>0||og(r))return i;let a=await oA(e,n);return a?function(e,t){let r=function(e){let t={className:"root",rect:{x:0,y:0,width:0,height:0},children:[]},r=[{indent:-1,node:t}],n=/^(\s*)([\w.$]+)\{[^}]* (-?\d+),(-?\d+)-(-?\d+),(-?\d+) #/;for(let t of e.split("\n")){let e=n.exec(t);if(!e)continue;let[i,a,o,s,l,d]=e.slice(1);if(void 0===i||void 0===a||void 0===o||void 0===s||void 0===l||void 0===d)continue;let u=i.length,c=Number(o),p=Number(s),f={className:a,rect:{x:c,y:p,width:Math.max(0,Number(l)-c),height:Math.max(0,Number(d)-p)},children:[]};for(;r.length>1&&u<=r[r.length-1].indent;)r.pop();r[r.length-1].node.children.push(f),r.push({indent:u,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(e2(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=>ot(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||!e2(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=>ot(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=a7(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(!oe(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(!oe(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?a7(o):a.length>0?a7(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 og(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function oy(e){let t=new Map;for(let r of e){let e={};r.hiddenContentAbove&&(e.hiddenContentAbove=!0),r.hiddenContentBelow&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(r.index,e)}return t}async function ov(e,t=e8(e)){try{return await et(()=>oS(t),{shouldRetry:oI})}catch(t){var r,n;let e;if((r=t)instanceof L&&"COMMAND_FAILED"===r.code&&"number"==typeof r.details?.timeoutMs&&r.details?.cmd==="adb"&&(e=Array.isArray(n=r.details?.args)?n.map(String):"string"==typeof n?n.split(/\s+/):[]).includes("uiautomator")&&e.includes("dump")){let e="Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout. Stock Android UIAutomator may still time out on app-owned infinite animations.";throw new L("COMMAND_FAILED",`Android UI hierarchy dump timed out while waiting for the UI to become idle. ${e}`,{...t.details??{},hint:e},t)}throw t}}async function oS(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=o_(a.stdout,a.stderr);if(o)return o;let s="/sdcard/window_dump.xml",l=await e(["shell","uiautomator","dump",s],{allowFailure:!0,timeoutMs:8e3}),d=(t=l.stdout,r=l.stderr,n=`${t}
|
|
8
|
+
${r}`,i=/dumped to:\s*(\S+)/i.exec(n),i?.[1]);if(0!==l.exitCode&&!d)throw new L("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode,reason:"missing_fresh_dump"});let u=await e(["shell","cat",d??s]),c=o_(u.stdout,u.stderr);if(!c)throw new L("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:u.stdout,stderr:u.stderr});return c}function o_(e,t){let r=`${e}
|
|
9
|
+
${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 oI(e){if(!(e instanceof L)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return or.some(e=>r.includes(e))}async function oA(e,t=e8(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),r=`${e.stdout}
|
|
10
|
+
${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function ob(e,t,r){if(0===e.size)return;let n=new Map;for(let[e,t]of r.sourceNodes.entries()){let i=r.nodes[e];i&&n.set(t,i)}for(let[r,i]of e){let e=t.sourceNodes[r];if(!e)continue;let a=n.get(e);a&&(i.hiddenContentAbove&&(a.hiddenContentAbove=!0),i.hiddenContentBelow&&(a.hiddenContentBelow=!0))}}let ox=/\bis(?:n(?:'|'|')?t| not)\s+responding\b/i,oN=/^close app$/i,oM="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function oE(e){let{session:t}=e;if("android"!==t.device.platform||!t.recording)return"absent";try{let e=await oT(t),r=oL(e);if(!r?.rect)return"absent";let n=await oO(t,r);if(!n.ok)return N({level:"warn",phase:"android_blocking_dialog_tap_failed",data:{session:t.name,deviceId:t.device.id,exitCode:n.exitCode,stdout:n.stdout.trim(),stderr:n.stderr.trim()}}),"failed";if(!await o$(t))return N({level:"warn",phase:"android_blocking_dialog_still_present",data:{session:t.name,deviceId:t.device.id}}),"failed";if(t.appBundleId&&(await ei(t.device,t.appBundleId),!await oF(t,t.appBundleId)))return N({level:"warn",phase:"android_blocking_dialog_relaunch_unfocused",data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId}}),"failed";return N({level:"warn",phase:"android_blocking_dialog_recovered",data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId,x:n.x,y:n.y}}),"recovered"}catch(e){return N({level:"warn",phase:"android_blocking_dialog_recovery_failed",data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),"failed"}}async function oD(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await ee(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await oC(n)){let t=`Recovered Android app ANR before ${i}: closed and relaunched ${n.appBundleId}.`;if("before-command"===e.phase)return{status:"recovered",warning:t};throw oP({session:n,command:i,focus:a,message:`Android app ANR appeared after ${i}; ${n.appBundleId} was closed and relaunched. Retry the command against the fresh app session.`,hint:"Retry the command. If the ANR returns, inspect app logs or restart the emulator."})}throw oP({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${oR(a)}. Automatic recovery failed.`,hint:oM})}throw oP({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${oR(a)}.`,hint:oM})}async function oC(e){try{return await ok(e)}catch(t){return N({level:"warn",phase:"android_app_anr_recovery_failed",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}async function ok(e){if(!e.appBundleId)return!1;let t=oL(await oT(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await oO(e,t);if(!r.ok)return!1;await ei(e.device,e.appBundleId);let n=await oF(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&N({level:"warn",phase:"android_app_anr_recovered",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:r.x,y:r.y}}),n}function oP(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new L("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function oR(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function oT(e){return e1(eW((await oi(e.device,{interactiveOnly:!1,compact:!1})).nodes))}async function oO(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=e0(t.rect),i=await Y(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 oL(e,t={}){if(!1===t.requireDialogSignal||oV(e))return e.find(e=>oG(e).some(e=>oN.test(e))&&e.rect)}async function o$(e){for(let t=0;t<12;t+=1){if(!oV(await oT(e)))return!0;await e$(500)}return!oV(await oT(e))}async function oF(e,t,r={}){for(let n=0;n<12;n+=1){if(await oU(e,t,r))return!0;await e$(500)}return await oU(e,t,r)}async function oU(e,t,r){return!(r.requireNoBlockingDialog&&await ee(e.device))&&(await ec(e.device)).package===t}function oG(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 oV(e){return e.some(e=>{let t=oG(e).join(" ").trim();return t.length>0&&ox.test(t)})}function oq(e){return!!(e&&e.width>0&&e.height>0)}function oj(e){return e.width*e.height}function oB(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 oH=[255,59,48,255],oK=[255,214,10,255],oW=[0,0,0,255],oz=["scroll","list","recyclerview","edittext","textfield"],oJ=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],oX={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 oZ(e){let t=eT(await o.readFile(e.screenshotPath),"screenshot"),r=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)oQ(r)&&oq(r.rect)&&(!t||oj(r.rect)>oj(t))&&(t=r.rect);return t||function(e){let t=1/0,r=1/0,n=-1/0,i=-1/0;for(let a of e)a.rect&&oq(a.rect)&&(t=Math.min(t,a.rect.x),r=Math.min(r,a.rect.y),n=Math.max(n,a.rect.x+a.rect.width),i=Math.max(i,a.rect.y+a.rect.height));return!Number.isFinite(t)||!Number.isFinite(r)||n<=t||i<=r?null:{x:t,y:r,width:n-t,height:i-r}}(e.filter(e=>{var t;return oq(e.rect)&&!("image"===eK((t=e).type??"")&&!o1(t.label))}))}(e.nodes),a=new Map;for(let n of e.nodes){var o,s;if(!function(e,t,r){let n=[r.label,r.value].some(o2)||o3(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!oq(r.rect)||oQ(r))return!1;let n=eK(r.type??"");return!(oz.some(e=>n.includes(e))||t&&oj(r.rect)>.25*oj(t))}(e,t,r)||(oY(r)?n:n&&function(e){let t=eK(e.type??"");return t.includes("statictext")||t.includes("image")||t.includes("text")||t.includes("other")}(r))}(e,i,n))continue;let l=(o=e.nodes,[function(e){return oY(e)&&!oQ(e)}(s=n)?s:null,eH(o,s,e=>(function(e){return oY(e)&&!oQ(e)})(e)),s.hittable?s:null,eH(o,s,e=>!0===e.hittable)].find(o0)??null);if(!l?.rect||!oq(l.rect))continue;let d=function(e,t,r){let n=o4(e);if(e.ref!==t.ref&&n)return n;let i=function(e,t){let r=null;for(let n of t){if(n.ref===e.ref||!function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r[n.parentIndex];if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(n,e,t))continue;let i=o4(n);if(!i)continue;let a=function(e){let t=0;return eK(e.type??"").includes("text")&&(t+=2),o2(e.label)&&(t+=2),o2(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||o4(t)}(n,l,e.nodes),u=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),oY(t)&&(n+=3),oY(e)&&(n+=2),r&&(n+=2),o3(t.identifier)&&(n+=1),o1(t.value)&&(n+=1),n}(n,l,d),c=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=oY,i=e=>!!o4(e),(!t.rect||!0!==t.hittable||n(t)||i(t)?null:function(e,t,r){let n=e.rect,i=function(e,t,r){let n=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r.get(n.parentIndex);if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(t,e,i)&&function(e,t){let r=eK(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&oq(t.rect)&&oB(n,t.rect)).map(e=>e.rect);return a.length<2?null:function(e){let t=e[0];if(void 0===t)throw Error("unionRects requires at least one rect");let r=t.x,n=t.y,i=t.x+t.width,a=t.y+t.height;for(let t of e.slice(1))r=Math.min(r,t.x),n=Math.min(n,t.y),i=Math.max(i,t.x+t.width),a=Math.max(a,t.y+t.height);return{x:r,y:n,width:i-r,height:a-n}}(a)}(e,t,r);if(!i)return null;let a=i.y-n.y,o=n.y+n.height-(i.y+i.height);if(a<0||o<0||16>Math.abs(o-a))return null;let s=Math.min(a,o),l=Math.round(i.y-s),d=Math.round(i.height+2*s);return d<=0||d>=n.height?null:{x:n.x,y:l,width:n.width,height:d}}(t,r,i))??t.rect)}(e,l,e.nodes),p=function(e,t,r,n,i){if("android"===e.backend||!t)return o5(function(e){return{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}(r),n,i);let a=n/t.width,o=i/t.height;return o5({x:Math.round((r.x-t.x)*a),y:Math.round((r.y-t.y)*o),width:Math.max(1,Math.round(r.width*a)),height:Math.max(1,Math.round(r.height*o))},n,i)}(e,i,c,t,r);if(!oq(p))continue;let f=a.get(l.ref);(!f||u>f.score)&&a.set(l.ref,{ref:l.ref,label:d,rect:l.rect,overlayRect:p,score:u})}return(function(e){let t=[];for(let r of e.sort((e,t)=>oj(e.overlayRect)-oj(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(oB(e.overlayRect,r.overlayRect)||oB(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}oj(r.overlayRect)<oj(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(st).slice(0,n.maxRefs??24).sort(se).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:e0(e.overlayRect)}))}(e.snapshot,t.width,t.height,{maxRefs:e.maxRefs});for(let e of r){var n,i;(function(e,t,r){for(let n=0;n<2;n+=1)o6(e,t.x,t.x+t.width-1,t.y+n,r),o6(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),o9(e,t.x+n,t.y,t.y+t.height-1,r),o9(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(n=t,(i=e).overlayRect,oH),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=o8(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:o8(t.y+2,0,Math.max(0,e.height-11));(function(e,t,r,n,i){for(let a=0;a<11;a+=1)for(let o=0;o<n;o+=1)o7(e,t+o,r+a,i)})(e,i,o,n,oK),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=oX[t];if(n)for(let t=0;t<n.length;t+=1)for(let o=0;o<n[t].length;o+=1)"1"===n[t][o]&&o7(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,oW)}(n,i.overlayRect,i.ref)}return await o.writeFile(e.screenshotPath,eE.sync.write(t)),r}function oY(e){let t=[e.type,e.role,e.subrole].map(e=>eK(e??"")).join(" ");return oJ.some(e=>t.includes(e))}function oQ(e){let t=[e.type,e.role,e.subrole].map(e=>eK(e??"")).join(" ");return t.includes("application")||t.includes("window")}function o0(e){return!!(e?.rect&&oq(e.rect)&&!oQ(e))}function o1(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function o2(e){var t;let r;return!!o1(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function o3(e){var t;return"string"==typeof e&&!!o2(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function o4(e){let t=[e.label,e.value].find(o2);return t?t.trim():o3(e.identifier)?e.identifier.trim():void 0}function o5(e,t,r){let n=o8(e.x,0,Math.max(0,t-1)),i=o8(e.y,0,Math.max(0,r-1)),a=Math.max(1,t-n),o=Math.max(1,r-i);return{x:n,y:i,width:o8(e.width,1,a),height:o8(e.height,1,o)}}function o8(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function o6(e,t,r,n,i){for(let a=t;a<=r;a+=1)o7(e,a,n,i)}function o9(e,t,r,n,i){for(let a=r;a<=n;a+=1)o7(e,t,a,i)}function o7(e,t,r,n){if(t<0||r<0||t>=e.width||r>=e.height)return;let i=(e.width*r+t)*4;e.data[i]=n[0],e.data[i+1]=n[1],e.data[i+2]=n[2],e.data[i+3]=n[3]}function se(e,t){var r,n;let i=e.overlayRect.y-t.overlayRect.y;if(0!==i)return i;let a=e.overlayRect.x-t.overlayRect.x;return 0!==a?a:(r=e.ref,n=t.ref,Number.parseInt(r.replace(/^\D+/,""),10)-Number.parseInt(n.replace(/^\D+/,""),10))}function st(e,t){return t.score!==e.score?t.score-e.score:se(e,t)}function sr(e){return"number"==typeof e.gestureClockOriginAtMs&&"number"==typeof e.gestureClockOriginUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureClockOriginAtMs+(e.gestureStartUptimeMs-e.gestureClockOriginUptimeMs)-e.recordingStartedAt):"number"==typeof e.runnerStartedAtUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureStartUptimeMs-e.runnerStartedAtUptimeMs):"number"==typeof e.gestureStartUptimeMs&&"number"==typeof e.gestureEndUptimeMs?Math.max(0,e.fallbackFinishedAtMs-(e.gestureEndUptimeMs-e.gestureStartUptimeMs)-e.recordingStartedAt):Math.max(0,e.fallbackStartedAtMs-e.recordingStartedAt)}let sn=new WeakMap;function si(e){if(!e)return;let t=sn.get(e);if(t)return t;let r=sa(e.nodes??[]);if(r)return sn.set(e,r),r}let sa=eP,so={referenceWidth:1e3,referenceHeight:1e3};function ss(e,t,r,n,i={},a=Date.now(),o=Date.now()){var s,l,d,u,c,p,f,m,h;let w,g,y,v=e.recording;if(!v)return;let S={...i,...n??{}},_=sh(S.effectiveDurationMs)??sh(S.durationMs),I={recordingStartedAt:v.startedAt,gestureClockOriginAtMs:v.gestureClockOriginAtMs,gestureClockOriginUptimeMs:v.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===v.platform?v.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:sh(S.gestureStartUptimeMs),gestureEndUptimeMs:sh(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},A="number"==typeof(s={gestureStartUptimeMs:sh(S.gestureStartUptimeMs),gestureEndUptimeMs:sh(S.gestureEndUptimeMs),reportedDurationMs:_,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}).gestureStartUptimeMs&&"number"==typeof s.gestureEndUptimeMs?Math.max(0,s.gestureEndUptimeMs-s.gestureStartUptimeMs):"number"==typeof s.reportedDurationMs?Math.max(0,s.reportedDurationMs):Math.max(0,s.fallbackFinishedAtMs-s.fallbackStartedAtMs),b="ios"===e.device.platform&&void 0===sh(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sw(sh(t.count),1)??1,r=!0===t.doubleTap,n=sw(sh(t.holdMs),1);return 1===e&&!r&&void 0===n}case"react-native":return"dismiss-overlay"===t.action;default:return!1}}(t,S)?function(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return sr(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...I,gestureDurationMs:A}):sr(I),x=(l=e.snapshot,w=sh((d=S).referenceWidth),g=sh(d.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:si(l)),M=(u=t,c=r,p=S,f=b,m=A,h=x,y=sl[u],y?.(c,p,f,m,h)??[]);0!==M.length&&(v.gestureEvents.push(...M),N({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:M.length,tMs:b,gestureDurationMs:A,kinds:M.map(e=>e.kind)}}))}let sl={click:(e,t,r,n,i)=>sd(e,t,r,i),press:(e,t,r,n,i)=>sd(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?sd(e,t,r,i):[],fill:(e,t,r,n,i)=>su(e,t,r,i),focus:(e,t,r,n,i)=>su(e,t,r,i),longpress:function(e,t,r,n,i){let a=sg(t,e);if(!a)return[];let{x:o,y:s}=a;return[sf(r,o,s,sS(n,[sh(t.durationMs),sh(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sy(t,e),o=sm(t.contentDirection)??sm(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:u}=a,c=sS(n,[],250),p=sh(t.amount)??sh(e[1]),f=sh(t.pixels);return[{kind:"scroll",tMs:r,x:s,y:l,x2:d,y2:u,...i,durationMs:c,contentDirection:o,...void 0!==p?{amount:p}:{},...void 0!==f?{pixels:f}:{}}]},pan:sc,fling:sc,swipe:sc,pinch:function(e,t,r,n,i){let a=sg(t,e,1),o=sh(t.scale)??sh(e[0]);if(!a||void 0===o||o<=0)return[];let{x:s,y:l}=a;return[{kind:"pinch",tMs:r,x:s,y:l,...i,scale:o,durationMs:sS(n,[],280)}]}};function sd(e,t,r,n){let i=sg(t,e);if(!i)return[];let{x:a,y:o}=i,s=sw(sh(t.count),1)??1,l=sw(sh(t.intervalMs),0)??0,d=!0===t.doubleTap,u=sw(sh(t.holdMs),1),c=[];for(let e=0;e<s;e+=1){let t=r+e*l;if(void 0!==u&&u>0){c.push(sf(t,a,o,u,n));continue}c.push(sp(t,a,o,n)),d&&c.push(sp(t+90,a,o,n))}return c}function su(e,t,r,n){let i=sg(t,e);if(!i)return[];let{x:a,y:o}=i;return[sp(r,a,o,n)]}function sc(e,t,r,n,i){let a=sy(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,u=sS(n,[sh(t.effectiveDurationMs),sh(t.durationMs),sh(e[4])],250),c=sw(sh(t.count),1)??1,p=sw(sh(t.pauseMs),0)??0,f="ping-pong"===t.pattern?"ping-pong":"one-way";return Array.from({length:c},(e,t)=>{var n,a,c,m,h,w,g,y,v,S,_,I,A;let b,{startX:x,startY:N,endX:M,endY:E}=(n=t,a=f,c=o,m=s,h=l,w=d,"ping-pong"===a&&n%2==1?{startX:h,startY:w,endX:c,endY:m}:{startX:c,startY:m,endX:h,endY:w});return g=r+t*(u+p),y=x,v=N,S=M,_=E,I=u,"back-swipe"===(b=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"}(y,v,S,_,A=i))?{kind:b,tMs:g,x:y,y:v,x2:S,y2:_,...A,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"}(y,S,A)}:{kind:b,tMs:g,x:y,y:v,x2:S,y2:_,...A,durationMs:I}})}function sp(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sf(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sm(e){if("string"!=typeof e)return;let t=e.trim().toLowerCase();switch(t){case"up":case"down":case"left":case"right":return t;default:return}}function sh(e){if("number"==typeof e&&Number.isFinite(e))return e;if("string"!=typeof e||0===e.trim().length)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function sw(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sg(e,t,r=0){let n=sh(e.x)??sh(t[r]),i=sh(e.y)??sh(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function sy(e,t){let r=sv(e.x1,e.x,t[0]),n=sv(e.y1,e.y,t[1]),i=sv(e.x2,t[2]),a=sv(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 sv(...e){return e.map(sh).find(e=>void 0!==e)}function sS(e,t,r){return sw(e,1)??t.map(e=>sw(e,1)).find(e=>void 0!==e)??r}let s_={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sI(e){var t,r,n,i,a,o,s,l;let d,u,c,p,f,{req:m,session:h,logPath:w,sessionStore:g,contextFromFlags:y}=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?s_[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:eB}}(m);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:S,dispatchRequest:_,recordedCommand:I}=v,A=await sb(h,S);if(A)return A;let b=await sA(h,S);if("response"in b)return b.response;let{resolvedPositionals:x,resolvedOut:N,recordedPositionals:M,recordedFlags:E}="screenshot"===(t=_).command?(u=(n=(r=t).positionals??[],i=r.meta?.cwd,(d=n[0])?[tj.expandHome(d,i),...n.slice(1)]:n),p=(c=(a=r.flags?.out,o=r.meta?.cwd,a?tj.expandHome(a,o):a))?{...r.flags??{},out:c}:r.flags??{},{resolvedPositionals:u,resolvedOut:c,recordedPositionals:u,recordedFlags:p}):{resolvedPositionals:f=(s=t).positionals??[],resolvedOut:s.flags?.out,recordedPositionals:f,recordedFlags:s.flags??{}},D=Date.now(),C={...y(m.flags,h.appBundleId,h.trace?.outPath),surface:h.surface},k=await sx({session:h,sessionName:e.sessionName,logPath:w,command:S,request:_,positionals:x,out:N,dispatchContext:C}),P=await sA(h,S,"after-command");if("response"in P)return P.response;"status"in b&&"recovered"===b.status&&(!k||"object"==typeof k)&&((k??={}).warning=b.warning);let R=Date.now(),T=I===S?M:m.positionals??[],O=I===S?E:m.flags??{};return function(e){let{session:t,sessionStore:r,command:n,recordedCommand:i,resolvedPositionals:a,recordedPositionals:o,recordedFlags:s,data:l,actionStartedAt:d,actionFinishedAt:u,flags:c}=e,p=function(e,t,r,n){if("scroll"!==t)return n;let i=si(e.snapshot),a={...n??{}},o=sm(a.direction)??sm(r[0]);if(!o)return n;let s=sh(a.amount)??sh(r[1]),l=sh(a.pixels),d=sy(a,[]),u=sh(a.referenceWidth),c=sh(a.referenceHeight),p=void 0!==u&&u>0&&void 0!==c&&c>0?{referenceWidth:u,referenceHeight:c}:i??so;if(d&&(d.x1!==d.x2||d.y1!==d.y2))return{...a,x1:d.x1,y1:d.y1,x2:d.x2,y2:d.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==l?{pixels:l}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250};let f=eO({direction:o,amount:s,pixels:l,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:f.x1,y1:f.y1,x2:f.x2,y2:f.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==f.pixels?{pixels:f.pixels}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250}}(t,n,a,l);ss(t,n,a,p,c,d,u),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:h,sessionStore:g,command:S,recordedCommand:I,resolvedPositionals:x,recordedPositionals:T,recordedFlags:O,data:k,actionStartedAt:D,actionFinishedAt:R,flags:m.flags??{}}),aI(S)&&av(h,S),aM(h.device.platform)&&("swipe"===(l=S)||"scroll"===l)&&(h.postGestureStabilization={action:S,markedAt:Date.now()}),{ok:!0,data:k??{}}}async function sA(e,t,r="before-command"){if("android"!==e.device.platform||!ej.androidBlockingDialogGuardedAction.has(t))return{status:"clear"};try{return await oD({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:O(e)}}}}async function sb(e,t){return iF(t,e.device)?"android"===e.device.platform&&e.recording&&"record"!==t&&await oE({session:e})==="failed"?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null:{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:`${t} is not supported on this device`}}}async function sx(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await n6(r.device,n,a,o,{...s});let l=await a6({session:r,sessionName:e.sessionName,outPath:a[0]??o,outputPlacement:"screenshot"!==(t=i).command?"default":(t.positionals??[])[0]?"positional":t.flags?.out?"out":"default",dispatchContext:s});return i.flags?.overlayRefs&&"string"==typeof l?.path&&await sN(r,l,e.logPath),l}async function sN(e,t,r){let n={snapshotInteractiveOnly:!0,snapshotCompact:!0},i=a0(await aJ({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);a5(e,i);let a=await oZ({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let sM=sq(()=>import("./lease.js")),sE=sq(()=>import("./session.js").then(e=>e.session_namespaceObject)),sD=sq(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),sC=sq(()=>import("./react-native.js")),sk=sq(()=>import("./record-trace.js").then(e=>e.record_trace_namespaceObject)),sP=sq(()=>import("./find.js")),sR=sq(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function sT(e){let{command:t}=e.req;return ej.leaseHandler.has(t)?await sO(e):ej.sessionHandler.has(t)?await sL(e):ej.snapshot.has(t)?await s$(e):ej.reactNativeHandler.has(t)?await sF(e):ej.recordTraceHandler.has(t)?await sU(e):ej.findHandler.has(t)?await sG(e):ej.interactionHandler.has(t)?await sV(e):null}async function sO(e){let{handleLeaseCommands:t}=await sM();return sj(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function sL(e){let{handleSessionCommands:t}=await sE();return sj(e.req.command,"session",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke,invokeReplayAction:e.invokeReplayAction,androidAdbExecutor:e.androidAdbExecutor}))}async function s$(e){let{handleSnapshotCommands:t}=await sD();return sj(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function sF(e){let{handleReactNativeCommands:t}=await sC();return sj(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function sU(e){let{handleRecordTraceCommands:t}=await sk();return sj(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function sG(e){let{handleFindCommands:t}=await sP();return sj(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function sV(e){let{handleInteractionCommands:t}=await sR();return sj(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function sq(e){let t;return()=>t??=e()}function sj(e,t,r){if(r)return r;throw new L("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let sB=new m;async function sH(e,t,r){let n=sB.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>sB.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function sK(e,t){if(!t)return[];let r=[],n=e.device,i=r$(t.platform);if(i&&!rU(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=ed(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function sW(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 sz=["target","device","udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"],sJ=new Set([eq.apps,eq.devices]);function sX(e){return"string"==typeof e&&e.trim().length>0}function sZ(e){return{tenantId:e.meta?.tenantId??e.flags?.tenant,runId:e.meta?.runId??e.flags?.runId,leaseId:e.meta?.leaseId??e.flags?.leaseId,leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend}}let sY=ej.selectorValidationExempt,sQ=ej.leaseAdmissionExempt,s0=new Set(sQ);async function s1(e){let{req:t,sessionName:r,sessionStore:n}=e,i=n.get(r);if(i)return`device:${i.device.id}`;if("open"===t.command||iw(t.flags))try{let e=await rz(t.flags??{});return`device:${e.id}`}catch{}return`session:${r}`}function s2(e,t={}){let r=Q(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function s3(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:s2(t,{simulatorSetPath:e.simulatorSetPath})}function s4(e,t,r){return na(s3(e,t),r)}let s5="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 s8(e){if(!(e instanceof L)||"COMMAND_FAILED"!==e.code)return!1;let t=`${e.message??""}`.toLowerCase();return!(t.includes("xcodebuild exited early")||t.includes("device is busy")&&t.includes("connecting"))&&!!(t.includes("runner did not accept connection")||t.includes("fetch failed")||t.includes("econnrefused")||t.includes("socket hang up"))}function s6(e){return!(e instanceof L)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function s9(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new L("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:ea({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:es("IOS_RUNNER_CONNECT_TIMEOUT")})}async function s7(e){var t,r;let n,{session:i,port:a,logPath:o}=e,s=await i.testPromise,l="Runner did not accept connection (xcodebuild exited early)",d=ea({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new L("COMMAND_FAILED",l,{port:a,logPath:o,xcodebuild:{exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr},reason:d,hint:(t=s.stdout,r=s.stderr,(n=`${l}
|
|
11
|
+
${t}
|
|
12
|
+
${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.":`${es("IOS_RUNNER_CONNECT_TIMEOUT")} ${s5}`)})}function le(e){return"interactionFrame"===e||"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"uptime"===e}function lt(e){if(t2(e))throw t4()}let lr=new Map;async function ln(e,t,r,n,i=45e3,a,o){let s=er.fromTimeoutMs(i),{getEndpoints:l}=la(e,t),{endpoints:d}=await l(s.remainingMs()),u=null,c=Math.max(1,Math.ceil(i/250));try{return await eu(async({deadline:s})=>{if(s?.isExpired())throw new L("COMMAND_FAILED","Runner connection deadline exceeded",{port:t,timeoutMs:i});if(a&&null!==a.child.exitCode&&void 0!==a.child.exitCode)throw await s7({session:a,port:t,logPath:n});let c=!1;if("device"===e.kind){let e=await l(s?.remainingMs());d=e.endpoints,c=e.cached}let p=c?d[0]:null,f=await lo(d,{command:r,port:t,timeoutMs:i,signal:o,attemptDeadline:s,onError:(t,r)=>{var n;u=r,"device"===e.kind&&t===p&&(n=e.id,lr.delete(n))}});if(f)return f;if("device"===e.kind&&c){var m;m=e.id,lr.delete(m),d=(await l(s?.remainingMs(),!0)).endpoints;let n=await lo(d,{command:r,port:t,timeoutMs:i,signal:o,attemptDeadline:s,onError:(e,t)=>{u=t}});if(n)return n}if(o?.aborted)throw t4();throw new L("COMMAND_FAILED","Runner endpoint probe failed",{port:t,endpoints:d,lastError:u?String(u):void 0})},{maxAttempts:c,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:s6},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||t8(e))throw t4();u||(u=e)}if(o?.aborted)throw t4();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw s9({port:t,endpoints:d,logPath:n,lastError:u});let a=await lu(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw s9({port:t,endpoints:d,logPath:n,lastError:u})}async function li(e,t,r,n=45e3,i){if(i?.aborted)throw t4();let a=er.fromTimeoutMs(n),{getEndpoints:o}=la(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new L("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let d=a.remainingMs();if(d<=0)throw new L("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await ll(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function la(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await ls({device:e,timeoutBudgetMs:n,forceRefresh:i,requestTunnelIp:r,setRequestTunnelIp:e=>{r=e}});return{endpoints:(a=e,o=t,s=d.ip,l=[`http://127.0.0.1:${o}/command`],"device"!==a.kind||s&&l.unshift(`http://[${s}]:${o}/command`),l),cached:d.sharedCacheHit}}}}async function lo(e,t){let{command:r,port:n,timeoutMs:i,signal:a,attemptDeadline:o,onError:s}=t;for(let t of e)try{let e=o?.remainingMs()??i;if(e<=0)throw new L("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await ll(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||t8(e))throw t4();s(t,e)}return null}async function ls(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=lr.get(t))?e.expiresAt<=Date.now()?(lr.delete(t),null):e.ip:null);if(r)return{ip:r,sharedCacheHit:!0};if(void 0!==s)return{ip:s,sharedCacheHit:!1}}let d=await ld(i.id,a);return l(d),d&&(r=i.id,n=d,lr.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function ll(e,t,r,n){let i=AbortSignal.timeout(r),a=n?AbortSignal.any([n,i]):i;return await fetch(e,{...t,signal:a})}async function ld(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,a=n.join(u.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),n=await na(["devicectl","device","info","details","--device",e,"--json-output",a,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==n.exitCode||!i.existsSync(a))return null;let o=JSON.parse(i.readFileSync(a,"utf8"));if(o.info?.outcome&&"success"!==o.info.outcome)return null;let s=(o.result?.connectionProperties?.tunnelIPAddress??o.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{lh(a)}}async function lu(e,t,r,n,i){let a=JSON.stringify(r),o=s3(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 na(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=ea({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new L("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:es(e)})}return{status:200,body:l}}async function lc(){return await new Promise((e,t)=>{let r=w.createServer();r.listen(0,"127.0.0.1",()=>{let n=r.address();if("object"==typeof n&&n?.port){let t=n.port;r.close(()=>e(t))}else r.close(()=>t(new L("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function lp(e,t,r,n){t&&lm(t,e),r&&lm(r,e),n&&process.stderr.write(e)}let lf=new Map;function lm(e,t){let r=(lf.get(e)??Promise.resolve()).catch(()=>{}).then(()=>i.promises.appendFile(e,t)).catch(()=>{}).finally(()=>{lf.get(e)===r&&lf.delete(e)});lf.set(e,r)}function lh(e){try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}let lw=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function lg(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new L("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",xctestrunPath:r});let n=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of n)if(!i.existsSync(e))throw new L("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await ly(e)){await ni("codesign",["--remove-signature",e],{allowFailure:!0});try{await ni("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof L?n:new L("COMMAND_FAILED",String(n));throw new L("COMMAND_FAILED","Failed to repair macOS runner product signature",{reason:"RUNNER_PRODUCT_REPAIR_FAILED",productPath:e,xctestrunPath:r,error:t.message,details:t.details})}}}async function ly(e){return 0===(await ni("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let lv=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),lS=new Set([" "," ","\n","\r"]),l_=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function lI(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new lb(e).parse()}function lA(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)}lA(r.children,t)}}class lb{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(l_.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])&&lv.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])&&lS.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 lN=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function lM(e){var t;let r=await lE(e);if(!r||0===r.length)return null;let a=n.dirname(e),o=new Set,s=function(e,t){let r=[],i=new Set,a=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){a.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);r.push(n.join(t,e));let s=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(e);s&&i.add(n.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(i),hostRelativePaths:a}}(r,a);for(let e of s.testRootPaths){if(!i.existsSync(e))return null;o.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>i.existsSync(n.join(t,e)));return r?n.join(r,e):null})){if(!e)return null;o.add(e)}return Array.from(o)}async function lE(e){let t=await no(e);if(t){var r,n,a,o=t;let e=new Set;for(let t of[a=o,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!lD(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(lD))}return r}(a),...Object.values(a).filter(e=>lD(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(lN.has(r)){if("string"==typeof n){t.add(n);continue}if(Array.isArray(n))for(let e of n)"string"==typeof e&&t.add(e)}return Array.from(t)}(t))e.add(r);return Array.from(e)}if("darwin"===process.platform)return null;try{let t;return r=i.readFileSync(e,"utf8"),n=lI(r),t=new Set,lA(n,(e,r)=>{if(lN.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 lD(e){return!!e&&"object"==typeof e}let lC=["CFBundleIcons","CFBundleIcons~ipad"];async function lk(e){let t=e.filter(lL);if(0===t.length)return;let r=e.filter(e=>lF(e)&&!l$(e));for(let e of t){let t=function(e,t){let r=n.dirname(e);return t.find(e=>n.dirname(e)===r&&"AgentDeviceRunner.app"===n.basename(e))??t.find(t=>n.dirname(t)===r&&t!==e)??null}(e,r);t&&await lP(t,e)}}async function lP(e,t){var r;let a,o=function(e,t){let r=!1;for(let o of i.readdirSync(e,{withFileTypes:!0})){var a;if(o.isFile()&&(a=o.name,/^AppIcon.*\.png$/.test(a)||"Assets.car"===a))(function(e,t){if(i.existsSync(t)){let r=i.readFileSync(e),n=i.readFileSync(t);return!r.equals(n)&&(i.copyFileSync(e,t),!0)}return i.copyFileSync(e,t),!0})(n.join(e,o.name),n.join(t,o.name))&&(r=!0)}return r}(e,t),s=await lR(e,t);(o||s)&&(await lO(t),r=t,a=new Date,i.utimesSync(r,a,a))}async function lR(e,t){var r,i;let a=n.join(e,"Info.plist"),o=n.join(t,"Info.plist"),s=await no(a),l=await no(o);if(!s||!l)return!1;let d=(r=s,i=l,lC.flatMap(e=>{let t=r[e];return void 0===t||JSON.stringify(i[e])===JSON.stringify(t)?[]:[{key:e,value:t,shouldInsert:void 0===i[e]}]}));if(0===d.length)return!1;for(let e of d)await lT(o,e.key,e.value,e.shouldInsert);return!0}async function lT(e,t,r,n){let i=await ni("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new L("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function lO(e){let t=await ni("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new L("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function lL(e){return lF(e)&&l$(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function l$(e){return n.basename(e).endsWith("-Runner.app")}function lF(e){return n.basename(e).endsWith(".app")}let lU="XCTestDevices",lG=".agent-device-backup",lV=".agent-device-xctestdevices-backup-",lq=n.join(u.homedir(),".agent-device","ios-runner"),lj=".agent-device-runner-cache.json",lB={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},lH=new Map,lK=new Set;function lW(e){return e?.trim()??""}function lz(e=process.env){return lW(e.AGENT_DEVICE_IOS_BUNDLE_ID)||lW(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function lJ(e=process.env){let t=lW(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${lz(e)}.uitests`}let lX=function(e=process.env){let t=lz(e),r=lJ(e);return Array.from(new Set([lW(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function lZ(e=u.homedir()){return n.join(e,"Library","Developer","XCTestDevices")}async function lY(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=Q(e.simulatorSetPath);if(!r)return null;let a=n.resolve(r),o=n.resolve(t.xctestDeviceSetPath??lZ()),s=n.resolve(t.backupPath??function(e=lZ()){return`${e}${lG}`}(o)),l=n.resolve(t.lockDirPath??function(e=u.homedir()){return n.join(e,".agent-device","xctest-device-set.lock")}()),d=t.ownerStartTime??M(process.pid),c=await l1({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(lQ({xctestDeviceSetPath:o,backupPath:s}),function(e,t){if(n.resolve(e)===n.resolve(t))return!0;try{return i.realpathSync.native(e)===i.realpathSync.native(t)}catch{return!1}}(a,o))return await c(),null;i.mkdirSync(a,{recursive:!0}),i.existsSync(o)&&i.renameSync(o,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,a=n.dirname(r),o=n.join(a,`${lU}.agent-device-link-${process.pid}-${Date.now()}`);i.mkdirSync(a,{recursive:!0});try{i.symlinkSync(t,o,"dir"),i.renameSync(o,r)}catch(e){throw i.existsSync(o)&&l0(o),e}}({requestedSetPath:a,xctestDeviceSetPath:o})}catch(e){throw lQ({xctestDeviceSetPath:o,backupPath:s}),await c(),new L("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:a,xctestDeviceSetPath:o,backupPath:s,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{lQ({xctestDeviceSetPath:o,backupPath:s})}finally{await c()}}}}}function lQ(e){let{xctestDeviceSetPath:t,backupPath:r}=e,a=[r,...function(e){let t=n.dirname(e),r=n.basename(e).replace(lG,""),a=r===lU?lV:`${r}${lV}`;try{return i.readdirSync(t).filter(e=>e.startsWith(a)).sort().map(e=>n.join(t,e))}catch{return[]}}(r)],o=a.find(e=>i.existsSync(e)),s=i.existsSync(t)&&i.lstatSync(t).isSymbolicLink();if(o){if(s&&l0(t),i.existsSync(t))if(!s)return void N({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:o}});else o!==r?i.rmSync(o,{recursive:!0,force:!0}):i.rmSync(r,{recursive:!0,force:!0});else i.mkdirSync(n.dirname(t),{recursive:!0}),i.renameSync(o,t);for(let e of a)e!==o&&i.existsSync(e)&&i.rmSync(e,{recursive:!0,force:!0});return}s&&(N({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),l0(t))}function l0(e){!i.existsSync(e)||i.lstatSync(e).isSymbolicLink()&&i.unlinkSync(e)}async function l1(e){let{lockDirPath:t,owner:r}=e,a=n.join(t,"owner.json"),o=Date.now()+3e4;for(i.mkdirSync(n.dirname(t),{recursive:!0});Date.now()<o;)try{i.mkdirSync(t),function(e,t){let r=`${e}.${process.pid}.${Date.now()}.tmp`;i.writeFileSync(r,JSON.stringify(t),"utf8"),i.renameSync(r,e)}(a,r);let e=!1;return async()=>{e||(e=!0,i.rmSync(t,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,t){let r=null;try{r=i.statSync(e)}catch{return!0}let n=function(e){try{return JSON.parse(i.readFileSync(e,"utf8"))}catch{return null}}(t);if(n){var a;return!(Number.isInteger((a=n).pid)&&!(a.pid<=0)&&P(a.pid)&&(!a.startTime||M(a.pid)===a.startTime))&&(i.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-r.mtimeMs<5e3)&&(i.rmSync(e,{recursive:!0,force:!0}),!0)}(t,a))continue;await e$(100)}throw new L("COMMAND_FAILED","Timed out waiting for XCTest device set lock",{lockDirPath:t})}async function l2(e,r){var a;let o,s=(a=e,(o=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim())?n.resolve(o):"macos"===a.platform?n.join(lq,"derived","macos"):"simulator"===a.kind?n.join(lq,"derived"):n.join(lq,"derived",a.kind)),l=e4();return await sH(lH,s,async()=>{let a=function(e,r=e4()){var a;let o;return{schemaVersion:1,packageVersion:e3(),runnerSourceFingerprint:function(e){let r=n.join(e,"ios-runner","AgentDeviceRunner"),a=function(e){if(!i.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of i.readdirSync(e,{withFileTypes:!0})){var a,o;let i=n.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(i);continue}s.isFile()&&(a=s.name,o=i,"project.pbxproj"===a?o.includes(`${n.sep}.xcodeproj${n.sep}`):[".jpg",".json",".png",".swift",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(n.extname(a)))&&t.push(i)}}return t.sort((e,t)=>e.localeCompare(t))}(r),o=function(e,r){let a=t.createHash("sha256");for(let t of r){let r=n.relative(e,t),o=i.statSync(t);a.update(r),a.update("\0"),a.update(String(o.size)),a.update("\0"),a.update(String(Math.trunc(o.mtimeMs))),a.update("\0")}return a.digest("hex")}(r,a),s=de.get(r);if(s?.fileStatsFingerprint===o)return s.sourceFingerprint;let l=t.createHash("sha256");for(let e of a){let t=n.relative(r,e);l.update(t),l.update("\0"),l.update(i.readFileSync(e)),l.update("\0")}let d=l.digest("hex");return de.set(r,{fileStatsFingerprint:o,sourceFingerprint:d}),d}(r),platformName:dc(e),deviceKind:e.kind,target:e.target??"phone",buildDestinationFamily:"macOS"===(o=dc(a=e))?`platform=macOS,arch=${dp()}`:"simulator"===a.kind?`generic/platform=${o} Simulator`:`generic/platform=${o}`,runnerBundleBuildSettings:dh(process.env),runnerSigningBuildSettings:dm(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:dw()}}(e,l);en(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)&&(dv("clean","forced_clean",{derived:s}),dg(s),l3(s));let o=await dy({derived:s,projectRoot:l,expectedCacheMetadata:a,findXctestrun:t=>dt(t,e),xctestrunReferencesProjectRoot:dn,resolveExistingXctestrunProductPaths:lM});if("reuse_ready"!==o.reason&&dv("rebuild",o.reason,{derived:s,xctestrunPath:o.xctestrunPath}),"reuse_ready"===o.reason)try{return await lg(e,o.productPaths,o.xctestrunPath),dv("reuse","reuse_ready",{derived:s,xctestrunPath:o.xctestrunPath}),l5(s,l6(a,o.xctestrunPath,o.productPaths)),o.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof L))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&lw.has(t)}(e))throw e;dv("rebuild","repair_failed",{derived:s,xctestrunPath:o.xctestrunPath})}o.xctestrunPath&&(dg(s),l3(s));let d=n.join(l,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!i.existsSync(d))throw new L("COMMAND_FAILED","iOS runner project not found",{projectPath:d});await du(e,d,s,r);let u=dt(s,e);if(!u)throw new L("COMMAND_FAILED","Failed to locate .xctestrun after build");let c=await lM(u);if(!c)throw new L("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:u});return await lg(e,c,u),await lk(c),l5(s,l6(a,u,c)),dv("build","built_new",{derived:s,xctestrunPath:u}),u})}function l3(e){try{if(!i.existsSync(e))return;if("derived"!==n.basename(e))return void i.rmSync(e,{recursive:!0,force:!0});for(let r of i.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,l4.has(t)&&i.rmSync(n.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let l4=new Set([lj,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function l5(e,t){i.mkdirSync(e,{recursive:!0}),i.writeFileSync(n.join(e,lj),`${JSON.stringify(t,null,2)}
|
|
13
|
+
`)}function l8(e){let{artifacts:t,...r}=e;return r}function l6(e,t,r){let n=function(e,t){let r=l7(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=l7(e);if(null===t)return null;n.push({path:e,mtimeMs:t})}return{xctestrunPath:e,xctestrunMtimeMs:r,productPaths:n}}(t,r);return n?{...e,artifacts:n}:e}function l9(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)}function l7(e){try{return Math.trunc(i.statSync(e).mtimeMs)}catch{return null}}let de=new Map;function dt(e,t){if(!i.existsSync(e))return null;let r=[],a=[e];for(;a.length>0;){let e=a.pop();for(let t of i.readdirSync(e,{withFileTypes:!0})){let o=n.join(e,t.name);if(t.isDirectory()){a.push(o);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=i.statSync(o);r.push({path:o,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,r)=>{if(t){let n=dr(r.path,t)-dr(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function dr(e,t){var r;let i=0,a=e.toLowerCase();n.basename(a).startsWith("agentdevicerunner.env.")&&(i-=1e3),a.includes(`${n.sep}macos${n.sep}`)&&(i-=5e3);let o="macos"===(r=t).platform?{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]}:"tv"===r.target?"simulator"===r.kind?{preferred:["appletvsimulator"],disallowed:["appletvos","iphoneos","iphonesimulator","macos"]}:{preferred:["appletvos"],disallowed:["appletvsimulator","iphoneos","iphonesimulator","macos"]}:"simulator"===r.kind?{preferred:["iphonesimulator"],disallowed:["iphoneos","appletvos","appletvsimulator","macos"]}:{preferred:["iphoneos"],disallowed:["iphonesimulator","appletvos","appletvsimulator","macos"]};return o.preferred.length>0&&(o.preferred.some(e=>a.includes(e))?i+=2e3:i-=500),o.disallowed.some(e=>a.includes(e))&&(i-=2500),i}function dn(e,t){try{let r=i.readFileSync(e,"utf8"),n=new Set([t]);try{n.add(i.realpathSync(t))}catch{}for(let e of n)if(r.includes(e))return!0;return!1}catch{return!1}}async function di(e,t,r){let i=n.dirname(e),a=r.replace(/[^a-zA-Z0-9._-]/g,"_"),o=n.join(i,`AgentDeviceRunner.env.${a}.json`),s=n.join(i,`AgentDeviceRunner.env.${a}.xctestrun`),l=await da(e);return dl(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})}),dl(l,e=>Object.assign(e,lB),{requireTestBundlePath:!0}),await ds(l,o,s),{xctestrunPath:s,jsonPath:o}}async function da(e){let t=await ni("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new L("COMMAND_FAILED","Failed to read xctestrun plist",{xctestrunPath:e,stderr:t.stderr});try{let e=JSON.parse(t.stdout);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Root must be an object");return e}catch(t){throw new L("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function ds(e,t,r){i.writeFileSync(t,JSON.stringify(e,null,2));let n=await ni("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new L("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:r,stderr:n.stderr})}function dl(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=dd(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=dd(r,{requireTestBundlePath:!0});e&&t(e)}}function dd(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function du(e,t,r,n){let i=dh(process.env),a=dm(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=dw(),l=await lY(e);try{var d;let l;await F("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",df(e),"1","-destination",(d=e,l=dc(d),"macOS"===l?`platform=macOS,arch=${dp()}`:"simulator"===d.kind?`platform=${l} Simulator,id=${d.id}`:`generic/platform=${l}`),"-derivedDataPath",r,...s,...i,...o,...a],{detached:!0,onSpawn:e=>{lK.add(e),e.on("close",()=>{lK.delete(e)})},onStdoutChunk:e=>{lp(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{lp(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof L?a:new L("COMMAND_FAILED",String(a)),i=(e=r.details?JSON.stringify(r.details):"",((t=`${r.message}
|
|
14
|
+
${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)??s5);throw new L("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await l?.release()}}function dc(e){var t;if("ios"!==e.platform&&"macos"!==e.platform)throw new L("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);return"macos"===e.platform?"macOS":"macos"===(t=e.target)||"desktop"===t?"macOS":"tv"===t?"tvOS":"iOS"}function dp(){return"arm64"===process.arch?"arm64":"x86_64"}function df(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function dm(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 dh(e=process.env){let t=lz(e),r=lJ(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function dw(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function dg(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,i;if(r=e,t=n.resolve(e4(),".tmp"),""===(i=n.relative(t,n.resolve(r)))||i.startsWith("..")||n.isAbsolute(i))throw new L("COMMAND_FAILED","Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically",{derivedPath:e,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${n.join(e4(),".tmp")}.`})}}async function dy(e){var t,r;let a,o=(t=e.derived,r=e.expectedCacheMetadata,(a=function(e){try{let t=JSON.parse(i.readFileSync(n.join(e,lj),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?JSON.stringify(l8(a))!==JSON.stringify(l8(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:a}:{ok:!1,reason:"cache_metadata_missing"}),s=o.ok?function(e){var t;let r=e?.artifacts;if(!(!(!(t=r)||"object"!=typeof t||Array.isArray(t))&&"string"==typeof t.xctestrunPath&&Number.isInteger(t.xctestrunMtimeMs)&&Array.isArray(t.productPaths)&&t.productPaths.length>0&&t.productPaths.every(l9))||l7(r.xctestrunPath)!==r.xctestrunMtimeMs)return null;let n=[];for(let e of r.productPaths){if(l7(e.path)!==e.mtimeMs)return null;n.push(e.path)}return{xctestrunPath:r.xctestrunPath,productPaths:n}}(o.metadata):null,l=s?.xctestrunPath??e.findXctestrun(e.derived);if(!l)return{reason:"missing_xctestrun",xctestrunPath:null};let d=s?.xctestrunPath===l?s.productPaths:await e.resolveExistingXctestrunProductPaths(l);return d?e.xctestrunReferencesProjectRoot(l,e.projectRoot)?o.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:d}:{reason:o.reason,xctestrunPath:l,productPaths:d}:{reason:"project_root_mismatch",xctestrunPath:l,productPaths:d}:{reason:"missing_products",xctestrunPath:l,productPaths:[]}}function dv(e,t,r){N({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let dS=new Map,d_=new Map;async function dI(e,t){return await sH(d_,e.id,async()=>{let r,n,i=dS.get(e.id);if(i){if(dC(i.child.pid))return N({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:i.sessionId,ready:i.ready}}),i;await dO({},"stop_stale_session",async()=>{await dN(e.id,i)})}let a={};await dO(a,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(N({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):dP(t))}),t.cleanStaleBundles?await dO(a,"cleanup_stale_bundles",async()=>{await dA(e)}):(a.cleanup_stale_bundles=0,N({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let o=await dO(a,"ensure_xctestrun",async()=>await l2(e,t)),s=await dO(a,"allocate_port",async()=>await lc()),{xctestrunPath:l,jsonPath:d}=await dO(a,"prepare_xctestrun_env",async()=>await di(o,{AGENT_DEVICE_RUNNER_PORT:String(s)},`session-${e.id}-${s}`)),u=await dO(a,"simulator_set_redirect",async()=>await lY(e));try{({child:r,wait:n}=await dO(a,"launch_xcodebuild",()=>{let t;return $("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",df(e),"1","-destination-timeout",String(20),"-xctestrun",l,"-destination",(t=dc(e),"macOS"===t?`platform=macOS,arch=${dp()}`:"simulator"===e.kind?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(s)},detached:!0})}))}catch(e){throw await u?.release(),e}r.stdout?.on("data",e=>{lp(e,t.logPath,t.traceLogPath,t.verbose)}),r.stderr?.on("data",e=>{lp(e,t.logPath,t.traceLogPath,t.verbose)});let c={sessionId:`${e.id}:${s}:${Date.now()}`,device:e,deviceId:e.id,port:s,xctestrunPath:l,jsonPath:d,testPromise:n,child:r,ready:!1,startupTimings:a,simulatorSetRedirect:u??void 0};return dS.set(e.id,c),c})}async function dA(e){if("simulator"===e.kind)for(let t of lX){let r=await na(s3(e,["uninstall",e.id,t]),{allowFailure:!0});if(0!==r.exitCode){let e=`${r.stdout}
|
|
15
|
+
${r.stderr}`.toLowerCase();if(!e.includes("not installed")&&!e.includes("found nothing")&&!e.includes("no such file")&&!e.includes("invalid device")&&!e.includes("could not find"))continue}}}function db(e){let t=dS.get(e);return t?{sessionId:t.sessionId,alive:dC(t.child.pid)}:null}async function dx(e,t){await sH(d_,e.deviceId,async()=>{dS.get(e.deviceId)===e&&(N({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await dN(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function dN(e,t,r={}){let n=t??dS.get(e);if(n){var i;if(!1!==r.graceful)try{await ln(n.device,n.port,{command:"shutdown"},void 0,15e3)}catch{await dk(n.child.pid,"SIGTERM")}else await dk(n.child.pid,"SIGTERM");try{await Promise.race([n.testPromise,new Promise(e=>setTimeout(e,r.waitTimeoutMs??1e4))])}catch{}(i=n.child.pid)&&(dC(i)||C(i))&&await dk(n.child.pid,"SIGKILL"),lh(n.xctestrunPath),lh(n.jsonPath),await n.simulatorSetRedirect?.release(),dS.get(e)===n&&dS.delete(e)}}async function dM(e){await sH(d_,e,async()=>{await dN(e)})}async function dE(){let e=Array.from(dS.values()),t=Array.from(lK);await Promise.allSettled(e.map(async e=>{await dk(e.child.pid,"SIGINT")})),await Promise.allSettled(t.map(async e=>{await dk(e.pid,"SIGINT")})),await Promise.allSettled(e.map(async e=>{await dk(e.child.pid,"SIGTERM")})),await Promise.allSettled(t.map(async e=>{await dk(e.pid,"SIGTERM")})),await Promise.allSettled(e.map(async e=>{await dk(e.child.pid,"SIGKILL")})),await Promise.allSettled(t.map(async e=>{await dk(e.pid,"SIGKILL"),lK.delete(e)})),await Promise.allSettled(e.map(async e=>{await e.simulatorSetRedirect?.release()}))}async function dD(){await dE();let e=Array.from(dS.keys());await Promise.allSettled(e.map(async e=>{await dM(e)}));let t=Array.from(lK);await Promise.allSettled(t.map(async e=>{try{await dk(e.pid,"SIGTERM"),await dk(e.pid,"SIGKILL")}finally{lK.delete(e)}}))}function dC(e){return!!e&&P(e)}async function dk(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 ni("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function dP(e){await na(s3(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}async function dR(e,t,r,n,i,a){var o,s;if(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}})),le(r.command)){let o=await x("ios_runner_command_send",async()=>await ln(e,t.port,r,n,i,t,a),{command:r.command,readOnly:!0,sessionReady:t.ready,timeoutMs:i});return await dT(o,t,n)}let l=er.fromTimeoutMs(i);if(function(e,t){if(!e.ready||"tap"!==t.command&&"tapSeries"!==t.command)return!0;let r=e.lastSuccessfulRunnerResponseAtMs;return void 0===r||Date.now()-r>1e4}(t,r)){let i=t.ready?Math.min(5e3,l.remainingMs()):Math.min(45e3,l.remainingMs()),o=await x("ios_runner_readiness_preflight",async()=>await ln(e,t.port,{command:"uptime"},n,i,t,a),{command:r.command,sessionReady:t.ready,timeoutMs:i});await dT(o,t,n)}else N({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:r.command,lastSuccessfulRunnerResponseAgeMs:void 0===t.lastSuccessfulRunnerResponseAtMs?void 0:Date.now()-t.lastSuccessfulRunnerResponseAtMs,sessionReady:t.ready}});let d=l.remainingMs();if(d<=0)throw new L("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:i});let u=await x("ios_runner_command_send",async()=>await li(e,t.port,r,d,a),{command:r.command});return await dT(u,t,n)}async function dT(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new L("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code;throw new L("string"==typeof e&&e.trim().length>0?R(e):"COMMAND_FAILED",("string"==typeof n.error?.message?n.error.message:void 0)??"Runner error",{runner:n,xcodebuild:{exitCode:1,stdout:"",stderr:""},logPath:r})}return(t.ready=!0,t.lastSuccessfulRunnerResponseAtMs=Date.now(),n.data&&"object"==typeof n.data&&!Array.isArray(n.data))?n.data:{}}async function dO(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,N({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}let dL=new m;function d$(e){return{runCommand:e}}function dF(e,t,r,n={}){if(r)return dq(r);let i=dG(e,n);return i?dq(i.provider):dq(t)}function dU(e,t={}){return void 0!==dG(e,t)}function dG(e,t={}){let r=dL.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}async function dV(e,t,r){if(!e)return await r();let n={provider:dq(e),deviceId:t.deviceId,requestId:t.requestId};return await dL.run(n,r)}function dq(e){return"function"==typeof e?{runCommand:e}:e}async function dj(e,t,r={}){if("ios"!==e.platform&&"macos"!==e.platform)throw new L("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new L("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`);lt(r.requestId);let n=dF(e,d$(dH),void 0,{requestId:r.requestId});return le(t.command)?et(()=>(lt(r.requestId),n.runCommand(e,t,r)),{shouldRetry:e=>(lt(r.requestId),s8(e))}):n.runCommand(e,t,r)}function dB(e,t={}){return"ios"!==e.platform?void 0:dU(e,{requestId:t.requestId})?void N({level:"debug",phase:"ios_runner_session_prewarm_skipped_scoped_provider",data:{deviceId:e.id}}):dI(e,t).then(()=>{}).catch(t=>{N({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}})})}async function dH(e,t,r){let n;lt(r.requestId);let i=t3(r.requestId);try{let a=((n=await dI(e,r)).ready,45e3);return await dR(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof L?o:new L("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&s6(a)&&n){lt(r.requestId),await dx(n,"runner_connect_failed_before_command_send"),n=await dI(e,{...r,cleanStaleBundles:!0});try{return await dR(e,n,t,r.logPath,45e3,i)}catch(e){throw s8(e instanceof L?e:new L("COMMAND_FAILED",String(e)))&&await dx(n,"transport_error_after_retry_command_send"),e}}throw!n&&a.message.includes("Runner did not accept connection")&&await dM(e.id),n&&s8(a)&&await dx(n,"transport_error_after_command_send"),o}}let dK=new WeakMap;async function dW(e){var t,r;let n,i,a,{sessionStore:o,leaseRegistry:s}=e,l=(n={...(t=function(e){let t=W(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=B(r);if(r&&!n)throw new L("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new L("INVALID_ARGS","session isolation mode tenant requires --tenant (or meta.tenantId).");let i=e.session||"default";return i.startsWith(`${n}:`)?{...e,meta:{...e.meta,tenantId:n,sessionIsolation:t}}:{...e,session:`${n}:${i}`,meta:{...e.meta,tenantId:n,sessionIsolation:t}}}(e.req)).flags??{}},((i=to(t.command,n))||!t.flags)&&i?{...t,flags:n}:t);N({level:"info",phase:"request_start",data:{session:l.session,command:l.command,tenant:l.meta?.tenantId,isolation:l.meta?.sessionIsolation}});let d=l.command;!function(e,t){if(sQ.has(e.command)||e.meta?.sessionIsolation!=="tenant")return;let r=sZ(e);t.assertLeaseAdmission({tenantId:r.tenantId,runId:r.runId,leaseId:r.leaseId,backend:r.leaseBackend})}(l,s);let u=function(e,t){var r;let n,i=e.session||"default";if(r=e,"string"==typeof(n=r.flags?.session)&&n.trim().length>0||"default"!==i||t.has(i))return i;let a=t.toArray(),o=a[0];return void 0!==o&&1===a.length?o.name:i}(l,o),c=s0.has(d)?null:await s1({req:l,sessionName:u,sessionStore:o}),p=(r=s,(a=dK.get(r))||(a=new Map,dK.set(r,a)),a);return{req:l,command:d,sessionName:u,throwIfCanceled:()=>t5(l.meta?.requestId),runLocked:async e=>(t5(l.meta?.requestId),c)?await sH(p,c,async()=>(t5(l.meta?.requestId),await e())):await e()}}function dz(e){var t,r;let{scope:i,logPath:a,sessionStore:o,trackDownloadableArtifact:s}=e;i.throwIfCanceled();let l=o.get(i.sessionName);l&&(!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=db(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")}(l),o.set(i.sessionName,l));let d=function(e,t){let r=e.meta?.lockPolicy;if(!r)return e;let n={...e.flags??{}},i=sJ.has(e.command),a=i?[]:t?sK(t,n):function(e,t,r){var n,i;let a=[],o=r$(t);if(void 0!==e.platform&&o&&(n=r$(e.platform),i=o,n&&i&&n!==i&&("apple"===n?!rF(i):"apple"!==i||!rF(n)))&&a.push({key:"platform",value:e.platform}),"open"===r)return a;for(let t of sz){let r=e[t];sX(r)&&a.push({key:t,value:r})}return a}(n,e.meta?.lockPlatform,e.command),o=e.meta?.lockPlatform;if(0===a.length){var s,l,d;return s=i,l=t,d=n,!o||l||void 0!==d.platform||s&&sz.some(e=>sX(d[e]))||(n.platform=o),{...e,flags:n}}if("strip"===r)return function(e,t,r,n){if(n){(function(e,t){for(let r of t)delete e[r.key]})(e,t),e.platform=n.device.platform;return}var i=e,a=r;for(let e of sz)delete i[e];a&&(i.platform=a)}(n,a,o,t),{...e,flags:n};throw new L("INVALID_ARGS",`${e.command} cannot override session lock policy with ${a.map(sW).join(", ")}. Unset those selectors or remove the request lock policy.`)}(i.req,l),u=e=>(function(e,t,r){let i=A();if(!t.ok){N({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=b({force:!0})??void 0;return{ok:!1,error:O(new L(R(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint,diagnosticId:t.error.diagnosticId,logPath:t.error.logPath}),{diagnosticId:i.diagnosticId,logPath:e})}}return N({level:"info",phase:"request_success"}),b(),{ok:!0,data:function(e,t,r){var i,a;let o;if(!t)return t;let s=(i=e,o=Array.isArray((a=t).artifacts)?[...a.artifacts]:[],"screenshot"!==i.command||o.some(e=>e?.field==="path")||"string"!=typeof a.path||o.push({field:"path",path:a.path,localPath:i.meta?.clientArtifactPaths?.path,fileName:n.basename(i.meta?.clientArtifactPaths?.path??a.path)}),o.filter(e=>!!(e&&"string"==typeof e.field&&"string"==typeof e.path&&"string"==typeof e.localPath&&e.localPath.length>0)));return 0===s.length?t:{...t,artifacts:s.map(t=>{let n=t.path;return{field:t.field,artifactId:r({artifactPath:n,tenantId:e.meta?.tenantId,fileName:t.fileName}),fileName:t.fileName,localPath:t.localPath}})}}(e,t.data,r)}})(d,e,s);if(l?.recording?.invalidatedReason&&"record"!==(t=i.command)&&"close"!==t)return{type:"response",response:u({ok:!1,error:{code:"COMMAND_FAILED",message:l.recording.invalidatedReason}})};!l||d.meta?.lockPolicy||(r=i.command,sY.has(r))||function(e,t){let r=sK(e,t);if(0!==r.length){var n;let t,i,a;throw new L("INVALID_ARGS",`Session "${e.name}" is bound to ${(t=(n=e).device.platform,i=n.device.name.trim(),a=n.device.id,`${t} device "${i}" (${a})`)} and cannot be used with ${r.map(sW).join(", ")}. Use a different --session name or close this session first.`)}}(l,d.flags);let c=(e,t,r)=>{let n;return{...ab(a,e,t,r,n=A().requestId),requestId:n}};return{type:"scope",scope:{req:d,sessionName:i.sessionName,existingSession:l,finalize:u,contextFromFlags:c,handlerContextFromFlags:(e,t,r)=>({...c(e,t,r),surface:o.get(i.sessionName)?.surface})}}}async function dJ(e){let{lockedScope:t,logPath:r,sessionStore:n}=e,i=n.get(t.sessionName);if(!i)return t.finalize({ok:!1,error:{code:"SESSION_NOT_FOUND",message:"No active session. Run open first."}});let a=await sI({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function dX(e){N({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=A(),r=b({force:!0})??void 0;return{ok:!1,error:O(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function dZ(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function dY(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}
|
|
16
|
+
`)},flush:()=>{n&&(i(n),n="")}}}function dQ(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 d0(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new L("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function d1(e,t){let r=(await e8(el(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function d2(e,t){var r,n;let i;d0(t);let a=await d1(e,t),o=e8(el(e)),s=await ef(o,{lines:4e3,timeoutMs:3e3}).catch(()=>"");if(0===s.trim().length)return null;let l=function(e,t,r){let n=new Set;for(let i of(r&&n.add(r),e.split("\n")))if(i.includes(t))for(let e of function(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=[RegExp(`\\bStart proc\\s+(\\d+):${r}(?:\\b|/)`,"i"),RegExp(`\\b(\\d+):${r}(?:\\b|/)`,"i"),RegExp(`${r}.*?\\bpid\\s*[=:]?\\s*(\\d+)\\b`,"i"),RegExp(`\\bpid\\s*[=:]?\\s*(\\d+)\\b.*${r}`,"i")],i=[];for(let t of n){let r=t.exec(e),n=r?.[1];n&&/^\d+$/.test(n)&&i.push(n)}return i}(i,t))n.add(e);return[...n]}(s,t,a);if(0===l.length)return null;let d=(r=s,n=t,i=new Set(l),r.split("\n").filter(e=>{var t;let r;if(!e.trim())return!1;if(e.includes(n))return!0;let a=(t=e,r=/\(\s*(\d+)\)\s*:/.exec(t),r?.[1]??null);return!!a&&i.has(a)}).join("\n"));return 0===d.trim().length?null:{pid:a,text:d,recoveredPids:l}}async function d3(e,t,r,n,i){let a,o,s="recovering",l=!1,d=(async()=>{try{for(;!l;){let d=await d1(e,t);if(!d){s="recovering",await e$(1e3);continue}let u=e5(el(e)),c=eo(u,{pid:d});a=c;let p=dY(r,{redactionPatterns:n});if(o=dQ(c,r,{endStreamOnClose:!1,writer:p}),"number"==typeof c.pid&&tK(i,c.pid),s="active",await o,tW(i),a=void 0,o=void 0,l)break;s="recovering",await e$(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),tW(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:d,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await dZ(o),a&&!a.killed&&a.kill("SIGKILL"),await dZ(d),tW(i)}}}function d4(e,t){let r=d6(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=d6(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 d5(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=s2(["spawn",t,"log","show","--style","compact","--info","--predicate",d4(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 na(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")}
|
|
17
|
+
`,recoveredLineCount:l.length}}async function d8(e,t,r,n,i,a){let o=await d9({deviceId:e,appBundleId:t,simulatorSetPath:i});return ut({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return s2(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",d4(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function d6(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function d9(e){let{deviceId:t,appBundleId:r,simulatorSetPath:i}=e,a=await na(s2(["get_app_container",t,r,"app"],{simulatorSetPath:i}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=n.join(o,"Info.plist"),l=await U("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function d7(e,t,r,n){return ut({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",d4(e)],stream:t,redactionPatterns:r,pidPath:n})}async function ue(e,t,r,n){return ut({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function ut(e){let t="active",r=$(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=dY(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&tK(e.pidPath,n.pid);let a=dQ(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),tW(e.pidPath),r),r=>{throw t="failed",tW(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await dZ(a),n.killed||n.kill("SIGKILL"),await dZ(a),tW(e.pidPath)}}}let ur=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),un=/https?:\/\/[^\s"'<>\])]+/i,ui=[/\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 ua(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>us(e)));for(let e of t.entries){let t=us(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function uo(e,t){let r=ug(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=ug(t?.maxPayloadChars,2048,64,16384),o=ug(t?.maxScanLines,4e3,100,2e4),s=e.split("\n"),l=Math.max(0,s.length-o),d=s.slice(l),u=[];for(let e=d.length-1;e>=0&&u.length<r;e-=1){let t=d[e];if(!t?.trim())continue;let r=function(e,t,r,n,i,a){let o=e[t]?.trim();if(!o)return null;let s=function(e){let t=e.indexOf("{");if(t<0)return null;let r=e.lastIndexOf("}");if(r<=t)return null;let n=e.slice(t,r+1);try{let e=JSON.parse(n);return e&&"object"==typeof e?e:null}catch{return null}}(o),l=uf(s,["method","httpMethod"]),d=uf(s,["url","requestUrl"]),u=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"]),c=ur.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??c?.[1])?.toUpperCase(),m=un.exec(o),h=d??m?.[0];if(!h)return null;let w=u??ud(o)??void 0;if(!(l||p?.[1]||c?.[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:uu(o),packetId:uc(o)??void 0,durationMs:up(o)??void 0,raw:uw(o,a),line:r};if("android"===n&&function(e,t,r){let n=ul(t,r,5),i=e.packetId??n.map(e=>uc(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?ul(t,r,12).filter(e=>uc(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>uu(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>ud(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>up(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 uh(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=uw(e,a))}if("body"===i||"all"===i){let e=um(o,s,["requestBody","body","payload","request"]),t=um(o,s,["responseBody","response"]);e&&(g.requestBody=uw(e,a)),t&&(g.responseBody=uw(t,a))}return g}(d,e,l+e+1,n,i,a);r&&u.push(r)}return{path:t?.path??"<memory>",exists:!0,scannedLines:d.length,matchedLines:u.length,entries:u,include:i,limits:{maxEntries:r,maxPayloadChars:a,maxScanLines:o}}}function us(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function ul(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 ud(e){for(let t of ui){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function uu(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 uc(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function up(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 um(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return uh(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 uh(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function uw(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function ug(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let uy={start:async e=>await uM(e)},uv=r2(uy,function(e={}){return{...uy,...e}});async function uS(e,t){return await uv.run(e,t)}function u_(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 uI(e){let t=n.dirname(e);i.existsSync(t)||i.mkdirSync(t,{recursive:!0}),function(e,t){if(i.existsSync(e)&&!(i.statSync(e).size<t.maxBytes))for(let r=t.maxRotatedFiles;r>=1;r-=1){let t=1===r?e:`${e}.${r-1}`,n=`${e}.${r}`;i.existsSync(t)&&(i.existsSync(n)&&i.unlinkSync(n),i.renameSync(t,n))}}(e,{maxBytes:u_("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:u_("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function uA(e){if(!i.existsSync(e))return{exists:!1,sizeBytes:0};let t=i.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}async function ub(e){var t,r,n,a;let o,s,l,d,{device:u,appBundleId:c,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y}=e,v="macos"===u.platform?"macos":"ios"===u.platform?"device"===u.kind?"ios-device":"ios-simulator":"android",S=(t={backend:v,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y},o=ug(t?.maxEntries,25,1,200),s=t?.include??"summary",l=ug(t?.maxPayloadChars,2048,64,16384),d=ug(t?.maxScanLines,4e3,100,2e4),i.existsSync(m)?uo(i.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:o,maxPayloadChars:l,maxScanLines:d}}),_=[],I=await ux({device:u,appBundleId:c,appLogPath:m,appLogState:p});if(I){let e=await d2(u.id,c);if(e){let t=uo(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y});t.entries.length>0&&(S=ua(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"===u.platform&&"simulator"===u.kind&&c&&0===S.entries.length){let e=await uE({deviceId:u.id,appBundleId:c,startedAt:f,simulatorSetPath:u.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y});e&&(e.dump.entries.length>0?(S=ua(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"===u.platform&&"simulator"===u.kind?_.push("Session app log stream is inactive. The iOS simulator recovery path scanned recent simctl log history, but a fresh logs clear --restart window is still the most reliable repro loop."):_.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===S.entries.length&&_.push("ios"===(a=u).platform&&"simulator"===a.kind?"No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.":"ios"===a.platform?"No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.":"No HTTP(s) entries were found in recent session app logs."),{backend:v,dump:S,notes:_}}async function ux(e){let{device:t,appBundleId:r,appLogPath:a,appLogState:o}=e;if("android"!==t.platform||!r)return null;if(void 0!==o&&"active"!==o)return{reason:"inactive"};if("active"!==o)return null;let s=function(e){let t=function(e){if(!e||!i.existsSync(e))return null;try{return tH(i.readFileSync(e,"utf8"))}catch{return null}}(e)?.command;if(!t)return null;let r=/(?:^|\s)--pid\s+(\d+)(?:\s|$)/.exec(t);return r?.[1]??null}(n.join(n.dirname(a),tB));if(!s)return null;let l=await d1(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function uN(e,t,r,n){return await uv.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function uM({device:e,appBundleId:t,outPath:r,pidPath:n}){uI(r);let a=i.createWriteStream(r,{flags:"a"}),o=function(){let e=process.env.AGENT_DEVICE_APP_LOG_REDACT_PATTERNS;if(!e)return[];let t=e.split(",").map(e=>e.trim()).filter(e=>e.length>0),r=[];for(let e of t)try{r.push(RegExp(e,"gi"))}catch{}return r}();if("ios"===e.platform)return"device"===e.kind?await ue(e.id,a,o,n):await d8(e.id,t,a,o,e.simulatorSetPath,n);if("android"===e.platform)return d0(t),await d3(e.id,t,a,o,n);if("macos"===e.platform)return await d7(t,a,o,n);throw a.end(),new L("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function uE(e){let t=await d5({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:uo(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 uD(e){await e.stop(),await dZ(e.wait)}async function uC(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 Y(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await Y(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 na(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await na(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await U("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function uk(e,t){uI(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
|
|
18
|
+
`;i.appendFileSync(e,r,"utf8")}function uP(e){let t=n.dirname(e),r=n.basename(e);i.existsSync(t)||i.mkdirSync(t,{recursive:!0}),i.existsSync(e)?i.truncateSync(e,0):i.writeFileSync(e,"","utf8");let a=0;for(let e of i.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let o=e.slice(r.length+1);if(/^\d+$/.test(o))try{i.unlinkSync(n.join(t,e)),a+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:a}}function uR(e,t){if("simulator"!==e.kind)throw new L("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function uT(){await ni("open",["-a","Simulator"],{allowFailure:!0,timeoutMs:1e4})}async function uO(e){let t,r;if("simulator"!==e.kind||"Booted"===await u$(e))return;let n=er.fromTimeoutMs(18e4);try{await eu(async({deadline:n})=>{if(n?.isExpired())throw new L("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:18e4});let i=Math.max(1e3,n?.remainingMs()??18e4),a=await na(s3(e,["boot",e.id]),{allowFailure:!0,timeoutMs:i});t={stdout:String(a.stdout??""),stderr:String(a.stderr??""),exitCode:a.exitCode};let o=`${t.stdout}
|
|
19
|
+
${t.stderr}`.toLowerCase(),s=o.includes("already booted")||o.includes("current state: booted");if(0!==t.exitCode&&!s)throw new L("COMMAND_FAILED","simctl boot failed",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let l=await na(s3(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:i});if(r={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==r.exitCode)throw new L("COMMAND_FAILED","simctl bootstatus failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let d=await u$(e);if("Booted"!==d)throw new L("COMMAND_FAILED","Simulator is still booting",{state:d})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let n=ea({error:e,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});return"IOS_BOOT_TIMEOUT"!==n&&"CI_RESOURCE_STARVATION_SUSPECTED"!==n}},{deadline:n,phase:"boot",classifyReason:e=>ea({error:e,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(a){let i=ea({error:a,stdout:r?.stdout??t?.stdout,stderr:r?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});throw new L("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:18e4,elapsedMs:n.elapsedMs(),reason:i,hint:es(i),boot:t,bootstatus:r})}await uT()}async function uL(e){let t=s3(e,["shutdown",e.id]),r=await na(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===r.exitCode,exitCode:r.exitCode,stdout:String(r.stdout??""),stderr:String(r.stderr??"")}}async function u$(e){let t="string"==typeof e?e:e.id,r="string"==typeof e?s2(["list","devices","-j"]):s3(e,["list","devices","-j"]),n=await na(r,{allowFailure:!0,timeoutMs:6e4});if(0!==n.exitCode)return null;try{let e=JSON.parse(String(n.stdout??""));for(let r of Object.values(e.devices??{})){let e=r.find(e=>e.udid===t);if(e)return e.state}return null}catch{return null}}let uF="shared_prefs/ReactNativeDevPrefs.xml",uU="debug_http_host",uG="dev_server_https",uV="RCT_jsLocation",uq="RCT_packager_scheme",uj="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.",uB='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function uH(e){return void 0!==D(e)}async function uK(e){let{device:t,appId:r,runtime:n}=e;if(!r)return;let i=D(n);if(i){if("android"===t.platform)return void await uz(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await uY(t,r,i)}}async function uW(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await uJ(t,r);"ios"===t.platform&&"simulator"===t.kind&&await uQ(t,r)}}async function uz(e,t,r){var n,i,a,o,s,l;let d,u;u3(t);let c=(n=await uX(e,t),i=uU,a=`${r.host}:${r.port}`,d=` <string name="${u4(i)}">${u4(a)}</string>`,u1(u2(n,i),d));o=c,s=uG,l="https"===r.scheme,u=` <boolean name="${u4(s)}" value="${l?"true":"false"}" />`,c=u1(u2(o,s),u),await uZ(e,t,c)}async function uJ(e,t){u3(t);let r=await uX(e,t),n=u2(r,uU),i=u2(n,uG);i!==r&&await uZ(e,t,i)}async function uX(e,t){let r=await Y(e,["shell","run-as",t,"cat",uF],{allowFailure:!0});return 0!==r.exitCode?uB:u0(r.stdout)}async function uZ(e,t,r){let n=["shell","run-as",t,"id"],i=await Y(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=u5(i.stdout,i.stderr);throw new L("COMMAND_FAILED",e?`Failed to access Android app sandbox for ${t}`:`Failed to probe Android app sandbox for ${t}`,{package:t,cmd:"adb",args:n,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,hint:e?uj:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await Y(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await Y(e,["shell","run-as",t,"tee",uF],{stdin:r.trimEnd()})}catch(n){let e=T(n);if("TOOL_MISSING"===e.code)throw e;let r=u5("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new L("COMMAND_FAILED",r?`Failed to access Android app sandbox for ${t}`:`Failed to write Android runtime hints for ${t}`,{...e.details??{},package:t,cmd:"adb",phase:"write-runtime-hints",hint:r?uj:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function uY(e,t,r){await na(s3(e,["spawn",e.id,"defaults","write",t,uV,"-string",`${r.host}:${r.port}`])),await na(s3(e,["spawn",e.id,"defaults","write",t,uq,"-string",r.scheme]))}async function uQ(e,t){await na(s3(e,["spawn",e.id,"defaults","delete",t,uV]),{allowFailure:!0}),await na(s3(e,["spawn",e.id,"defaults","delete",t,uq]),{allowFailure:!0})}function u0(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
|
|
20
|
+
`:uB}function u1(e,t){return u0(e).replace("</map>",`${t}
|
|
21
|
+
</map>`)}function u2(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return u0(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 u3(e){if("binary"!==ep(e))return;let t=ew(e);throw new L("INVALID_ARGS",t,{package:e,hint:t})}function u4(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function u5(e,t){let r=`${e}
|
|
22
|
+
${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 u8=new Map;async function u6(e){let r=await h.mkdtemp(n.join(u.tmpdir(),"agent-device-materialized-"));try{let i=await ce(e.installablePath,n.join(r,"installable")),a=e.archivePath?await ce(e.archivePath,n.join(r,"archive")):void 0,o=t.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{u9(o)},s);return u8.set(o,{rootPath:r,installablePath:i,archivePath:a,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:d}),{materializationId:o,installablePath:i,...a?{archivePath:a}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await h.rm(r,{recursive:!0,force:!0}),e}}async function u9(e,t){let r=u8.get(e);if(!r)throw new L("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new L("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),u8.delete(e),await h.rm(r.rootPath,{recursive:!0,force:!0})}async function u7(e){let t=Array.from(u8.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await u9(e)}))}async function ce(e,t){let r=await h.stat(e);await h.mkdir(t,{recursive:!0});let i=n.join(t,n.basename(e));return r.isDirectory()?await h.cp(e,i,{recursive:!0}):await h.copyFile(e,i),i}async function ct(e){let t=await Y(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 cr(e){let{device:t,shutdownRequested:r}=e;if(r&&(iy(t)||"android"===t.platform&&"emulator"===t.kind))try{return iy(t)?await uL(t):await ct(t)}catch(t){let e=O(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function cn(e){if(await dM(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await i2("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 ci(e,t){e.appLog&&await uD(e.appLog),rF(e.device.platform)&&await cn(e),await u7(t).catch(()=>{})}async function ca(e){let t,{req:r,sessionName:n,logPath:i,sessionStore:a}=e,o=a.get(n);if(!o)return await co(r,i);o.appLog&&await uD(o.appLog),r.positionals&&r.positionals.length>0&&(rF(o.device.platform)&&await cn(o),await n6(o.device,"close",r.positionals,r.flags?.out,{...ab(i,r.flags,o.appBundleId,o.trace?.outPath)}),await iv(o.device,ip)),rF(o.device.platform)&&(t=(r.positionals?.length??0)>0,!iy(o.device)||t||r.flags?.shutdown||o.recording)?await cn(o):rF(o.device.platform)&&N({level:"debug",phase:"ios_runner_retained_after_close",data:{session:o.name,deviceId:o.device.id}}),uH(a.getRuntimeHints(n))&&o.appBundleId&&await uW({device:o.device,appId:o.appBundleId}).catch(()=>{}),a.recordAction(o,{command:"close",positionals:r.positionals??[],flags:r.flags??{},result:{session:n,...eU(`Closed: ${n}`)}}),r.flags?.saveScript&&(o.recordSession=!0),a.writeSessionLog(o),await u7(n).catch(()=>{}),a.delete(n);let s=await cr({device:o.device,shutdownRequested:r.flags?.shutdown});return s?{ok:!0,data:eG({session:n,shutdown:s},`Closed: ${n}`)}:{ok:!0,data:{session:n,...eU(`Closed: ${n}`)}}}async function co(e,t){if(!e.positionals||0===e.positionals.length)return ic("SESSION_NOT_FOUND","No active session");let r=await iS({session:void 0,flags:e.flags,ensureReady:!0});return await n6(r,"close",e.positionals,e.flags?.out,{...ab(t,e.flags)}),await iv(r,ip),{ok:!0,data:{app:e.positionals[0],...eU(`Closed: ${e.positionals[0]}`)}}}async function cs(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 cl(e){i.existsSync(e)&&i.unlinkSync(e)}function cd(e){if(!i.existsSync(e))return null;try{let t=JSON.parse(i.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function cu(e){let t=cd(e);if(!t||t.pid===process.pid)try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}function cc(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function cp(e,t){return new Promise((r,n)=>{e.once("error",n),e.listen(0,"127.0.0.1",()=>{e.off("error",n);let i=e.address();"object"==typeof i&&i?.port?r(i.port):n(new L("COMMAND_FAILED",t))})})}(async function(e={}){let r,a,o=e.env??process.env,s=e.stdout??process.stdout,l=e.stderr??process.stderr,d=e.exit??(e=>process.exit(e)),{baseDir:u,infoPath:c,lockPath:p,logPath:f,sessionsDir:m}=K(o.AGENT_DEVICE_STATE_DIR),h=z(o.AGENT_DEVICE_DAEMON_SERVER_MODE);var g,y,v,S=m;if(i.existsSync(S))for(let e of i.readdirSync(S,{withFileTypes:!0})){if(!e.isDirectory())continue;let t=n.join(S,e.name,tB);if(i.existsSync(t))try{let e=tH(i.readFileSync(t,"utf8"));if(e&&function(e){let t,r=M(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=E(e.pid);return!!n&&!!((t=n.toLowerCase().replaceAll("\\","/")).includes("log stream")||t.includes("logcat")||t.includes("devicectl device log stream"))&&(!e.command||n===e.command)}(e))try{process.kill(e.pid,"SIGTERM")}catch{}}catch{}finally{tW(t)}}let _=new tj(m),A=new rL({maxActiveSimulatorLeases:cc(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:cc(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:cc(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:cc(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),x=e3(),D=t.randomBytes(24).toString("hex"),C=M(process.pid)??void 0,P=J(),R=function(e){let{logPath:t,token:r,androidAdbProvider:n,appleRunnerProvider:i,appleToolProvider:a,linuxToolProvider:o,appLogProvider:s,recordingProvider:l,deviceInventoryProvider:d,trackDownloadableArtifact:u}=e,{sessionStore:c,leaseRegistry:p}=e;async function f(e){let m=!!(e.meta?.debug||e.flags?.verbose);return await I({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:m,logPath:t},async()=>{if(e.token!==r)return{ok:!1,error:O(new L("UNAUTHORIZED","Invalid token"))};try{return await rZ(d,async()=>{let d=await dW({req:e,sessionStore:c,leaseRegistry:p});return await d.runLocked(async()=>{let e=dz({scope:d,logPath:t,sessionStore:c,trackDownloadableArtifact:u});if("response"===e.type)return e.response;let m=e.scope;return await ix({req:m.req,existingSession:m.existingSession,providers:{androidAdbProvider:n,appleRunnerProvider:i,appleToolProvider:a,linuxToolProvider:o,appLogProvider:s,recordingProvider:l}},async e=>{let n=await sT({req:m.req,sessionName:m.sessionName,logPath:t,sessionStore:c,leaseRegistry:p,invoke:f,invokeReplayAction:function(e){let{parentScope:t,providerScope:r,handleRequest:n,deps:i}=e;return async e=>{var a,o;if(a=e,o=t,!(a.session===o.sessionName&&ej.replayScopedAction.has(a.command)))return await n(e);if(e.token!==i.token)return{ok:!1,error:O(new L("UNAUTHORIZED","Invalid token"))};try{let a=await dW({req:e,sessionStore:i.sessionStore,leaseRegistry:i.leaseRegistry});if(a.sessionName!==t.sessionName)return await n(e);let o=dz({scope:a,logPath:i.logPath,sessionStore:i.sessionStore,trackDownloadableArtifact:i.trackDownloadableArtifact});if("response"===o.type)return o.response;let s=o.scope,l=await sT({req:s.req,sessionName:s.sessionName,logPath:i.logPath,sessionStore:i.sessionStore,leaseRegistry:i.leaseRegistry,invoke:n,androidAdbExecutor:r.androidAdbExecutor,contextFromFlags:s.handlerContextFromFlags});if(l)return s.finalize(l);return await dJ({lockedScope:s,logPath:i.logPath,sessionStore:i.sessionStore})}catch(e){return dX(e)}}}({parentScope:m,providerScope:e,handleRequest:f,deps:{logPath:t,token:r,sessionStore:c,leaseRegistry:p,trackDownloadableArtifact:u}}),androidAdbExecutor:e.androidAdbExecutor,contextFromFlags:m.handlerContextFromFlags});return n?m.finalize(n):await dJ({lockedScope:m,logPath:t,sessionStore:c})})})})}catch(e){return dX(e)}})}return f}({logPath:f,token:D,sessionStore:_,leaseRegistry:A,trackDownloadableArtifact:t9}),$=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)}}),b({force:!0})})},F=async e=>{let t=ci(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,e$(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
|
|
24
|
+
`)})]),_.writeSessionLog(e),_.delete(e.name)},U=async()=>{let e=_.toArray();await Promise.all(e.map(F))},G=async()=>{let e,t,r=[];if("http"!==h){let t,n,i=(t=new Set,(n=w.createServer(e=>{t.add(e),e.on("close",()=>t.delete(e));let r="",n=0,i=new Set,a=!1,o=()=>{if(!a&&0!==n){for(let e of(a=!0,i))t0(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(td);if(await e(),n<=0)break;await e$(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=q(r,t);for(let t of(r=a.buffer,a.lines)){let r,a;n+=1;let o=!1;try{let n=JSON.parse(t);if(o=H(n),a=tY(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),tQ(a),t2(a))throw t4();r=await ru(o?t=>{e.destroyed||e.write(X(t))}:void 0,async()=>await R(n))}catch(e){r={ok:!1,error:O(e)}}finally{n-=1,a&&(i.delete(a),t1(a))}e.destroyed||e.write(o?j(r):`${JSON.stringify(r)}
|
|
25
|
+
`)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await cp(i,"Failed to bind socket server")}if("socket"!==h){let e=await rE({handleRequest:R,token:D});r.push(e),t=await cp(e,"Failed to bind HTTP server")}return{servers:r,socketPort:e,httpPort:t}};if(!function(e,t,r){i.existsSync(e)||i.mkdirSync(e,{recursive:!0});let n=JSON.stringify(r,null,2),a=()=>{try{return i.writeFileSync(t,n,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(a())return!0;let o=cd(t);if(o?.pid&&o.pid!==process.pid&&k(o.pid,o.processStartTime))return!1;try{i.unlinkSync(t)}catch{}return a()}(u,p,{pid:process.pid,version:x,startedAt:Date.now(),processStartTime:C}))return l.write("Daemon lock is held by another process; exiting.\n"),d(0),null;let V=[];try{let e,t=await G();V=t.servers,r=t.socketPort,a=t.httpPort,g=r,y=a,v={socketPort:g,httpPort:y,token:D,version:x,codeSignature:P,processStartTime:C},i.existsSync(u)||i.mkdirSync(u,{recursive:!0}),i.writeFileSync(f,""),e=v.socketPort&&v.httpPort?"dual":v.httpPort?"http":"socket",i.writeFileSync(c,JSON.stringify({port:v.socketPort,httpPort:v.httpPort,transport:e,token:v.token,pid:process.pid,version:v.version,codeSignature:v.codeSignature,processStartTime:v.processStartTime,stateDir:u},null,2),{mode:384}),g&&s.write(`AGENT_DEVICE_DAEMON_PORT=${g}
|
|
26
|
+
`),y&&s.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${y}
|
|
27
|
+
`)}catch(t){let e=T(t);for(let t of(l.write(`Daemon error: ${e.message}
|
|
28
|
+
`),V))try{t.close(()=>{})}catch{}return cl(c),cu(p),d(1),null}let B=!1,W=async(e={})=>{if(B)return;B=!0,e.cause&&await $(e.cause),await cs(V),await U();let{stopAllIosRunnerSessions:t}=await Promise.resolve(td);await t(),cl(c),cu(p),d(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{W()}),process.on("SIGTERM",()=>{W()}),process.on("SIGHUP",()=>{W()}),process.on("uncaughtException",e=>{let t=e instanceof L?e:T(e);l.write(`Daemon error: ${t.message}
|
|
29
|
+
`),W({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof L?t:T(t);l.write(`Daemon error: ${r.message}
|
|
30
|
+
`),W({exitCode:1,cause:t})})),{httpPort:a,shutdown:W,socketPort:r,token:D}})().catch(e=>{let t=T(e);process.stderr.write(`Daemon error: ${t.message}
|
|
31
|
+
`),process.exit(1)});export{np as IOS_DEVICECTL_DEFAULT_HINT,lX as IOS_RUNNER_CONTAINER_BUNDLE_IDS,ip as IOS_SIMULATOR_POST_CLOSE_SETTLE_MS,im as IOS_SIMULATOR_POST_OPEN_SETTLE_MS,nA as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,nI as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,tj as SessionStore,oZ as annotateScreenshotWithRefs,uS as withAppLogProvider,uk as appendAppLogMarker,uK as applyRuntimeHintsToApp,s2 as buildSimctlArgs,s3 as buildSimctlArgsForDevice,a0 as buildSnapshotState,nN as buttonTag,on as captureAndroidUiHierarchyXml,az as captureSnapshot,u9 as cleanupRetainedMaterializedPaths,rr as cleanupUploadedArtifact,uP as clearAppLogFiles,t1 as clearRequestCanceled,uW as clearRuntimeHintsFromApp,ab as context_contextFromFlags,a8 as createDaemonRuntimeSessionStore,d$ as createLocalAppleRunnerProvider,t4 as createRequestCanceledError,r2 as createScopedProvider,n6 as dispatchCommand,rc as emitRequestProgress,oD as ensureAndroidBlockingSystemDialogReady,nh as ensureDeviceReady,ic as errorResponse,r3 as filterAppleAppsByBundlePrefix,tU as formatPortableActionLine,tP as formatScriptActionSummary,tE as formatScriptStringLiteral,aS as getActiveAndroidSnapshotFreshness,uA as getAppLogPathMetadata,nx as getClickButtonValidationError,t3 as getRequestSignal,db as getRunnerSessionSnapshot,u$ as getSimulatorState,si as getSnapshotReferenceFrame,ca as handleCloseCommand,ig as hasExplicitSessionFlag,uH as hasRuntimeTransportHints,dU as hasScopedAppleRunnerProvider,nn as hasScopedAppleToolProvider,tg as inferFillText,rF as isApplePlatform,tb as isClickLikeCommand,iF as isCommandSupportedOnDevice,aI as isNavigationSensitiveAction,t2 as isRequestCanceled,tx as isTouchTargetCommand,rY as listDeviceInventory,nd as listIosDeviceApps,nu as listIosDeviceProcesses,i5 as runMacOsPressAction,i4 as runMacOsReadTextAction,av as markAndroidSnapshotFreshness,t0 as markRequestCanceled,r$ as normalizePlatformSelector,tF as parseReplayOpenFlags,tL as parseReplayRuntimeFlags,tO as parseReplaySeriesFlags,lI as parseXmlDocumentSync,rt as prepareUploadedArtifact,dB as prewarmIosRunnerSession,i0 as quitMacOsApp,no as readApplePlistJson,ub as readSessionNetworkCapture,ss as recordTouchVisualizationEvent,oE as recoverAndroidBlockingSystemDialog,i_ as refreshSessionDeviceIfNeeded,tQ as registerRequestAbort,ih as requireSessionOrExplicitSelector,uR as requireSimulatorDevice,iI as resolveAndroidEmulatorAvdName,dF as resolveAppleRunnerProvider,rG as resolveAppleSimulatorSetPathForSelector,nt as resolveAppleToolProvider,nb as resolveClickButton,iS as resolveCommandDevice,iQ as resolveFrontmostMacOsApp,nf as resolveIosDevicectlHint,sZ as resolveLeaseScope,ae as resolveLinuxToolProvider,n4 as resolvePayloadInput,tY as resolveRequestTrackingId,a4 as resolveSnapshotScope,rz as resolveTargetDevice,u6 as retainMaterializedPaths,uC as runAppLogDoctor,ni as runAppleToolCommand,nl as runIosDevicectl,ar as runLinuxToolCommand,i2 as runMacOsAlertAction,i1 as runMacOsPermissionAction,i8 as runMacOsScreenshotAction,i3 as runMacOsSnapshotAction,s4 as runSimctlForDevice,na as runXcrun,dj as runIosRunnerCommand,dV as withAppleRunnerProvider,dE as abortAllIosRunnerSessions,dD as stopAllIosRunnerSessions,iA as selectorTargetsSessionDevice,a5 as setSessionSnapshot,iv as settleIosSimulator,uL as shutdownSimulator,uO as ensureBootedSimulator,oi as snapshotAndroid,ah as snapshotLinux,aw as readLinuxTextAtPoint,uN as startAppLog,uD as stopAppLog,dM as stopIosRunnerSession,nr as withAppleToolProvider,at as withLinuxToolProvider,ty as uniqueStrings,lA as visitXmlPlistEntries,sH as withKeyedLock};
|