agent-device 0.16.9 → 0.16.10
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/README.md +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.16.9.apk → agent-device-android-multitouch-helper-0.16.10.apk} +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.10.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.16.9.manifest.json → agent-device-android-multitouch-helper-0.16.10.manifest.json} +4 -4
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.16.9.apk → agent-device-android-snapshot-helper-0.16.10.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.10.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.16.9.manifest.json → agent-device-android-snapshot-helper-0.16.10.manifest.json} +6 -6
- package/dist/src/2415.js +19 -19
- package/dist/src/apps.js +2 -2
- package/dist/src/input-actions.js +1 -1
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +197 -232
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +282 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +29 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +8 -34
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +30 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +2 -20
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +10 -50
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +3 -23
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +64 -22
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +7 -4
- package/package.json +1 -1
- package/server.json +2 -2
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.9.apk.sha256 +0 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.9.apk.sha256 +0 -1
package/dist/src/2415.js
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import{__webpack_require__ as e}from"./rslib-runtime.js";import t,{createHash as r}from"node:crypto";import n from"node:path";import i,{existsSync as a,promises as o}from"node:fs";import s from"node:http";import{fileURLToPath as l,pathToFileURL as 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 P,isProcessAlive as k}from"./8656.js";import{toAppErrorCode as R,asAppError as O,normalizeError as T,AppError as L}from"./9152.js";import{runCmdBackground as $,runCmdStreaming as F,runCmd as U,resolveExecutableOverridePath as G,whichCmd as q}from"./9818.js";import{consumeTextLines as V,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,analyzeReactNativeOverlay as ev,parseScrollDirection as eS,isKeyboardAction as e_,isSystemScrollIndicatorLabel as eI,isReactNativeCollapsedWarningWrapperWithVisibleBanner as eA,formatScrollEdgeMessage as eb,deriveMobileSnapshotHiddenContentHints as ex,inferVerticalScrollIndicatorDirections as eN,captureScrollEdgeState as eM,normalizeSnapshotTree as eE,isReactNativeCollapsedWarningWrapperCandidate as eD,PNG as eC,createAgentDevice as eP,runScrollEdgePasses as ek,requireIntInRange as eR,inferGestureReferenceFrame as eO,localCommandPolicy as eT,decodePng as eL,buildScrollGesturePlan as e$,parseSwipePreset as eF}from"./9533.js";import{sleep as eU}from"./4829.js";import{readLocationCoordinate as eG,successText as eq,withSuccessText as eV,parseDeviceRotation as ej}from"./1998.js";import{PUBLIC_COMMANDS as eB,DAEMON_COMMAND_GROUPS as eH,GESTURE_SUBCOMMAND_ERROR as eK}from"./5792.js";import{findNearestAncestor as eW,normalizeType as ez,pruneGroupNodes as eJ,findNodeByLabel as eX,resolveRefLabel as eZ}from"./940.js";import{snapshotPresentationOptionsFromFlags as eY,normalizeRef as eQ,findNodeByRef as e0,buildSnapshotPresentationKey as e1,centerOfRect as e2,attachRefs as e3}from"./4057.js";import{isScrollableType as e4}from"./2842.js";import{readVersion as e5,findProjectRoot as e8}from"./9671.js";import{resolveAndroidAdbProvider as e6,resolveAndroidAdbExecutor as e9}from"./9639.js";import{parseUiHierarchy as e7,ensureAndroidSnapshotHelper as te,parseUiHierarchyTree as tt,captureAndroidSnapshotWithHelper as tr,captureAndroidSnapshotWithHelperSession as tn,parseAndroidSnapshotHelperManifest as ti,forgetAndroidSnapshotHelperInstall as ta,buildUiHierarchySnapshot as to,stopAndroidSnapshotHelperSession as ts}from"./221.js";import{applyCommandDefaults as tl}from"./1352.js";var td={};e.r(td),e.d(td,{IH:()=>uz,ug:()=>uJ,sE:()=>uG,Bx:()=>uq,WX:()=>uW,Co:()=>uj,wg:()=>uK,withAppLogProvider:()=>u$});var tu={};e.r(tu),e.d(tu,{IO:()=>i3,LB:()=>i2,xY:()=>i5,eN:()=>i4,runMacOsPressAction:()=>i9,runMacOsReadTextAction:()=>i6,rR:()=>i7,r5:()=>i8});var tc={};e.r(tc),e.d(tc,{bu:()=>dn,abortAllIosRunnerSessions:()=>dH,hv:()=>dq,gE:()=>d6,runIosRunnerCommand:()=>d8,stopAllIosRunnerSessions:()=>dK,yA:()=>dB});var tp={};e.r(tp),e.d(tp,{vy:()=>d0,My:()=>d2,Ms:()=>d1,withAppleRunnerProvider:()=>d4});var tf={};e.r(tf),e.d(tf,{ensureBootedSimulator:()=>uY,SA:()=>u0,EB:()=>uX,N3:()=>uQ});var tm={};e.r(tm),e.d(tm,{qx:()=>na,Ly:()=>nl,Gr:()=>nn,vT:()=>no,Cc:()=>ns,withAppleToolProvider:()=>ni});var th={};e.r(th),e.d(th,{readLinuxTextAtPoint:()=>av,r:()=>ay});var tw={};function tg(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}e.r(tw),e.d(tw,{uK:()=>an,nE:()=>aa,withLinuxToolProvider:()=>ai});let ty=["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 tv(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 tS(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}let t_=/^-?\d+(\.\d+)?$/,tI=/^[^\s"\\]+$/,tA=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),tb=new Map([["--count","count"],["--pause-ms","pauseMs"]]),tx=new Map([["--delay-ms","delayMs"]]);function tN(e){return"click"===e||"press"===e}function tM(e){return tN(e)||"longpress"===e}function tE(e){return"type"===e||"fill"===e}function tD(e){return tP(e,tk)}function tC(e){return JSON.stringify(e)}function tP(e,t){return t(e)?e:tC(e)}function tk(e){return tR(e)&&e.startsWith("@")||t_.test(e)}function tR(e){return tI.test(e)}function tO(e){let t=(e.positionals??[]).map(e=>tD(e));return[e.command,...t].join(" ")}function tT(e,t){let r=t.flags??{};if(tN(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}tE(t.command)&&"number"==typeof r.delayMs&&e.push("--delay-ms",String(r.delayMs))}function tL(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",tP(t.metroHost,tR)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",tP(t.bundleUrl,tR)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",tP(t.launchUrl,tR)))}function t$(e,t){let r=[],n={},i=tN(e)?tA:"swipe"===e?tb:tE(e)?tx:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(tN(e)&&"--double-tap"===o){n.doubleTap=!0;continue}let s=t[a+1];if(tN(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=tU(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 tF(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=tU(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 tU(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function tG(e){var t;let r=[],n={};for(let t of e){if("--relaunch"===t){n.relaunch=!0;continue}r.push(t)}let i=tF(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 tq(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",tD(e.flags.snapshotScope)),e.flags?.snapshotRaw&&r.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])r.push(tD(t));e.flags?.relaunch&&r.push("--relaunch"),tL(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(tP(t,tR));tL(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(tP(r,tR)),n))e.push(tD(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(tD(t));y(r,e.flags)}else{for(let t of e.positionals??[])r.push(tD(t));tT(r,e)}return r.join(" ")}class tV{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&&tj(e.command))return tN(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=tv(e);return r.length>0?{...e,positionals:[t,r]}:void 0}(e,t):function(e,t){let r=e.positionals?.[0];return"text"===r||"attrs"===r?{...e,positionals:[r,t]}:void 0}(e,t)}(r);if(n){t.push(n);continue}let i=function(e,t){if(!tj(t.command))return;let r=t.result?.refLabel;if("string"!=typeof r||0===r.trim().length)return;let n=r.trim();return{ts:t.ts,command:"snapshot",positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotCompact:!0,snapshotScope:n},result:{scope:n}}}(e,r);i&&t.push(i),t.push(r)}return t}(e);let n=[],i=t.device.kind?` kind=${t.device.kind}`:"";for(let e of(n.push(`context platform=${t.device.platform} device=${tC(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,tN(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(tD(r)),tB(e,t),tT(e,t),e.join(" ");if(1===t.positionals.length)return e.push(tD(r)),tT(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(tD(r)),tB(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(tD(n)),tT(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(tD(r)),e.push(tD(n)),n.startsWith("@")&&tB(e,t),e.join(" ")}(t,r):void 0);return n||tq(e)}(e));return`${n.join("\n")}
|
|
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 b,flushDiagnosticsToSessionFile as A,withDiagnosticTimer as x,emitDiagnostic as N}from"./7599.js";import{readProcessStartTime as M,readProcessCommand as E,resolveRuntimeTransportHints as D,isProcessGroupAlive as k,isAgentDeviceDaemonProcess as P,isProcessAlive as C}from"./8656.js";import{toAppErrorCode as R,asAppError as O,normalizeError as T,AppError as L}from"./9152.js";import{runCmdBackground as $,runCmdStreaming as F,runCmd as U,resolveExecutableOverridePath as G,whichCmd as q}from"./9818.js";import{consumeTextLines as V,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,analyzeReactNativeOverlay as ev,parseScrollDirection as eS,isKeyboardAction as e_,isSystemScrollIndicatorLabel as eI,isReactNativeCollapsedWarningWrapperWithVisibleBanner as eb,formatScrollEdgeMessage as eA,deriveMobileSnapshotHiddenContentHints as ex,inferVerticalScrollIndicatorDirections as eN,captureScrollEdgeState as eM,normalizeSnapshotTree as eE,isReactNativeCollapsedWarningWrapperCandidate as eD,PNG as ek,createAgentDevice as eP,runScrollEdgePasses as eC,requireIntInRange as eR,inferGestureReferenceFrame as eO,localCommandPolicy as eT,decodePng as eL,buildScrollGesturePlan as e$,parseSwipePreset as eF}from"./9533.js";import{sleep as eU}from"./4829.js";import{readLocationCoordinate as eG,successText as eq,withSuccessText as eV,parseDeviceRotation as ej}from"./1998.js";import{PUBLIC_COMMANDS as eB,DAEMON_COMMAND_GROUPS as eH,GESTURE_SUBCOMMAND_ERROR as eK}from"./5792.js";import{findNearestAncestor as eW,normalizeType as ez,pruneGroupNodes as eJ,findNodeByLabel as eX,resolveRefLabel as eZ}from"./940.js";import{snapshotPresentationOptionsFromFlags as eY,normalizeRef as eQ,findNodeByRef as e0,buildSnapshotPresentationKey as e1,centerOfRect as e2,attachRefs as e3}from"./4057.js";import{isScrollableType as e4}from"./2842.js";import{readVersion as e5,findProjectRoot as e8}from"./9671.js";import{resolveAndroidAdbProvider as e6,resolveAndroidAdbExecutor as e9}from"./9639.js";import{parseUiHierarchy as e7,ensureAndroidSnapshotHelper as te,parseUiHierarchyTree as tt,captureAndroidSnapshotWithHelper as tr,captureAndroidSnapshotWithHelperSession as tn,parseAndroidSnapshotHelperManifest as ti,forgetAndroidSnapshotHelperInstall as ta,buildUiHierarchySnapshot as to,stopAndroidSnapshotHelperSession as ts}from"./221.js";import{applyCommandDefaults as tl}from"./1352.js";var td={};e.r(td),e.d(td,{IH:()=>u2,ug:()=>u3,sE:()=>uz,Bx:()=>uJ,WX:()=>u1,Co:()=>uZ,wg:()=>u0,withAppLogProvider:()=>uH});var tu={};e.r(tu),e.d(tu,{IO:()=>i3,LB:()=>i2,xY:()=>i5,eN:()=>i4,runMacOsPressAction:()=>i9,runMacOsReadTextAction:()=>i6,rR:()=>i7,r5:()=>i8});var tc={};e.r(tc),e.d(tc,{bu:()=>di,abortAllIosRunnerSessions:()=>dK,hv:()=>dV,gE:()=>d9,runIosRunnerCommand:()=>d6,stopAllIosRunnerSessions:()=>dW,yA:()=>dH});var tp={};e.r(tp),e.d(tp,{vy:()=>d1,My:()=>d3,Ms:()=>d2,withAppleRunnerProvider:()=>d5});var tf={};e.r(tf),e.d(tf,{ensureBootedSimulator:()=>u8,SA:()=>u9,EB:()=>u4,N3:()=>u6});var tm={};e.r(tm),e.d(tm,{qx:()=>na,Ly:()=>nl,Gr:()=>nn,vT:()=>no,Cc:()=>ns,withAppleToolProvider:()=>ni});var th={};e.r(th),e.d(th,{readLinuxTextAtPoint:()=>av,r:()=>ay});var tw={};function tg(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}e.r(tw),e.d(tw,{uK:()=>an,nE:()=>aa,withLinuxToolProvider:()=>ai});let ty=["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 tv(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 tS(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}let t_=/^-?\d+(\.\d+)?$/,tI=/^[^\s"\\]+$/,tb=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),tA=new Map([["--count","count"],["--pause-ms","pauseMs"]]),tx=new Map([["--delay-ms","delayMs"]]);function tN(e){return"click"===e||"press"===e}function tM(e){return tN(e)||"longpress"===e}function tE(e){return"type"===e||"fill"===e}function tD(e){return tP(e,tC)}function tk(e){return JSON.stringify(e)}function tP(e,t){return t(e)?e:tk(e)}function tC(e){return tR(e)&&e.startsWith("@")||t_.test(e)}function tR(e){return tI.test(e)}function tO(e){let t=(e.positionals??[]).map(e=>tD(e));return[e.command,...t].join(" ")}function tT(e,t){let r=t.flags??{};if(tN(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}tE(t.command)&&"number"==typeof r.delayMs&&e.push("--delay-ms",String(r.delayMs))}function tL(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",tP(t.metroHost,tR)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",tP(t.bundleUrl,tR)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",tP(t.launchUrl,tR)))}function t$(e,t){let r=[],n={},i=tN(e)?tb:"swipe"===e?tA:tE(e)?tx:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(tN(e)&&"--double-tap"===o){n.doubleTap=!0;continue}let s=t[a+1];if(tN(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=tU(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 tF(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=tU(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 tU(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function tG(e){var t;let r=[],n={};for(let t of e){if("--relaunch"===t){n.relaunch=!0;continue}r.push(t)}let i=tF(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 tq(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",tD(e.flags.snapshotScope)),e.flags?.snapshotRaw&&r.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])r.push(tD(t));e.flags?.relaunch&&r.push("--relaunch"),tL(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(tP(t,tR));tL(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(tP(r,tR)),n))e.push(tD(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(tD(t));y(r,e.flags)}else{for(let t of e.positionals??[])r.push(tD(t));tT(r,e)}return r.join(" ")}class tV{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&&tj(e.command))return tN(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=tv(e);return r.length>0?{...e,positionals:[t,r]}:void 0}(e,t):function(e,t){let r=e.positionals?.[0];return"text"===r||"attrs"===r?{...e,positionals:[r,t]}:void 0}(e,t)}(r);if(n){t.push(n);continue}let i=function(e,t){if(!tj(t.command))return;let r=t.result?.refLabel;if("string"!=typeof r||0===r.trim().length)return;let n=r.trim();return{ts:t.ts,command:"snapshot",positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotCompact:!0,snapshotScope:n},result:{scope:n}}}(e,r);i&&t.push(i),t.push(r)}return t}(e);let n=[],i=t.device.kind?` kind=${t.device.kind}`:"";for(let e of(n.push(`context platform=${t.device.platform} device=${tk(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,tN(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(tD(r)),tB(e,t),tT(e,t),e.join(" ");if(1===t.positionals.length)return e.push(tD(r)),tT(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(tD(r)),tB(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(tD(n)),tT(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(tD(r)),e.push(tD(n)),n.startsWith("@")&&tB(e,t),e.join(" ")}(t,r):void 0);return n||tq(e)}(e));return`${n.join("\n")}
|
|
2
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=tg(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return n.join(this.sessionsDir,`${t}-${r}.ad`)}}function tj(e){return tM(e)||"fill"===e||"get"===e}function tB(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(tD(r))}class tH{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new tV(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 ty)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=tg(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return n.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveAppLogPath(e){return n.join(this.sessionsDir,tg(e),"app.log")}resolveAppLogPidPath(e){return n.join(this.sessionsDir,tg(e),"app-log.pid")}static expandHome(e,t){return g(e,{cwd:t})}}let tK="app-log.pid";function tW(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 tz(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 tJ(e){if(e&&i.existsSync(e))try{i.unlinkSync(e)}catch{}}let tX=new Set,tZ=new Map,tY="request_canceled",tQ="request canceled";function t0(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 t1(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++}}(tZ);let t=new AbortController;tZ.set(e,t),tX.has(e)&&t.abort()}function t2(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++}}(tX),tX.add(e),tZ.get(e)?.abort())}function t3(e){e&&(tX.delete(e),tZ.delete(e))}function t4(e){return!!e&&tX.has(e)}function t5(e){if(e)return tZ.get(e)?.signal}function t8(){return new L("COMMAND_FAILED",tQ,{reason:tY})}function t6(e){if(t4(e))throw t8()}function t9(e){return e instanceof L&&"COMMAND_FAILED"===e.code&&(e.details?.reason===tY||e.message===tQ)}let t7=new Map;function re(e){let r=t.randomUUID(),n=setTimeout(()=>{rt(r)},9e5);return n.unref(),t7.set(r,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),r}function rt(e){let t=t7.get(e);if(t&&(clearTimeout(t.timer),t7.delete(e),t.deleteAfterDownload))try{i.rmSync(t.artifactPath,{force:!0})}catch{}}let rr=new Map;function rn(e,t){let r=rr.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 ri(e){let t=rr.get(e);t&&(clearTimeout(t.timer),rr.delete(e),i.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function ra(e){let t=await ro(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 ro(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(rs),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 rs(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 rl(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 rd(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 rd(e,t){if(e.destroy(),!e.closed)try{await c(e,"close")}catch{}await i.promises.rm(t,{force:!0}).catch(()=>{})}async function ru(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 rl(e,t),{artifactPath:t,tempDir:s}}let t=n.join(s,"artifact.tar");await rl(e,t);let a=await ra({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 rc=new m;async function rp(e,t){return await rc.run(e,t)}function rf(e){rc.getStore()?.(e)}let rm=new Set(["agent_device.command","agent-device.command"]),rh=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rw=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rg={"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"},ry=new Set([...rm,...rh,...rw,...Object.keys(rg)]);function rv(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rS(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function r_(e,t){e.destroyed||(e.write(Z(t)),e.end())}function rI(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rA(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 rb(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rx(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rN(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 rM(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 rE(e,t){if(!e)return{ok:!0};let r=await e(t);if(void 0===r||!0===r)return{ok:!0};if(!1===r){let e=T(new L("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rv(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=T(new L(R(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rv(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=T(new L("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rv(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rD(){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 rC(e){let t=await rD(),{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 rP(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void rk(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||rS(i,rv(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rS(i,rv(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rS(i,rv(n.id??null,-32600,"Invalid Request"),400);if(!ry.has(n.method))return void rS(i,rv(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rS(i,rv(n.id??null,-32602,"Invalid params"),400);try{var s;let a=n.params,l=function(e,t,r){if(rm.has(e))return{token:rA(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(rh.has(e)){let e,n=rb(t,"platform");if("ios"!==n&&"android"!==n)throw new L("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:rA(t,r),session:rb(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rb(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=rN(e,"owner"),n=rN(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:rM(e,"artifactId")}:(a&&(t=rM(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rN(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:rx(t,"retentionMs")}}}if(rw.has(e)){let e=rb(t,"materializationId")?.trim();if(!e)throw new L("INVALID_ARGS","Invalid params: materializationId is required");return{token:rA(t,r),session:rb(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rb(t,"requestId"),materializationId:e}}}let n=rg[e];if(n)return{token:rA(t,r),session:rb(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rb(t,"tenantId")??rb(t,"tenant"),runId:rb(t,"runId"),leaseId:rb(t,"leaseId"),leaseTtlMs:rx(t,"ttlMs"),leaseBackend:rb(t,"backend")}};throw new L("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(s=n.method,rm.has(s)&&("string"!=typeof l.command||0===l.command.length))return void rS(i,rv(n.id??null,-32602,"Invalid params: command is required"),400);o=t0(l.meta?.requestId,n.id),l.meta={...l.meta,requestId:o},t1(o);let d=()=>{i.writableFinished||t2(o)};e.on("aborted",d),i.on("close",d);let u=await rE(t,{headers:e.headers,rpcRequest:n,daemonRequest:l});if(!u.ok)return void rS(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 rp(e=>{!i.destroyed&&i.write(X(e))},async()=>await r(l)),t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rv(n.id??null,-32e3,e.error.message,e.error);r_(i,t);return}let c=await r(l);if(c.ok)return void rS(i,{jsonrpc:"2.0",id:n.id??null,result:c});rS(i,rv(n.id??null,-32e3,c.error.message,c.error),rI(c.error.code))}catch(t){let e=T(t);if(i.headersSent)return void r_(i,rv(n.id??null,-32e3,e.message,e));rS(i,rv(n.id??null,-32e3,e.message,e),rI(e.code))}finally{t3(o)}})})}async function rP(e,r,n,i){try{var a;let o,s,l=await rR({req:e,res:r,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let d=await ru(e),u=(a={artifactPath:d.artifactPath,tempDir:d.tempDir,tenantId:l.tenantId},o=t.randomUUID(),(s=setTimeout(()=>{ri(o)},3e5)).unref(),rr.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){rO(r,T(e))}}async function rk(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 rR({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[a]}});if(!o)return;let s=function(e,t){let r=t7.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 rt(e),new L("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(a,o.tenantId),l=i.createReadStream(s.artifactPath);t.statusCode=200,t.setHeader("content-type","application/octet-stream"),s.fileName&&t.setHeader("content-disposition",`attachment; filename="${s.fileName.replace(/"/g,"")}"`),l.on("error",e=>{if(t.headersSent)t.destroy(e);else{let r=T(e);t.statusCode=rI(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rt(a)}),l.pipe(t)}catch(e){rO(t,T(e))}}async function rR(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=rA({},n.headers),d=(t=l,(r=o)&&t!==r?T(new L("UNAUTHORIZED","Invalid token")):null);if(d)return rO(i,d),null;let u=await rE(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 rO(e,t){e.statusCode=rI(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function rT(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function rL(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function r$(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 rF{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=r$(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=rT(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=rL(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=rL(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=r$(e.backend),r=B(e.tenantId);if(!r)throw new L("INVALID_ARGS","tenant isolation requires tenant id.");let n=rT(e.runId);if(!n)throw new L("INVALID_ARGS","tenant isolation requires run id.");let i=rL(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=rT(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 rU(e){return e}function rG(e){return"apple"===e||"ios"===e||"macos"===e}function rq(e,t){return!t||("apple"===t?rG(e):e===t)}function rV(e){let{simulatorSetPath:t,platform:r,target:n}=e;if(t&&"macos"!==r&&"desktop"!==n)return t}async function rj(e,t,r={}){let n=e,i=e=>e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim();if(t.platform&&(n=n.filter(e=>rq(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&&rG(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:
|
|
3
|
+
`)}function tJ(e){if(e&&i.existsSync(e))try{i.unlinkSync(e)}catch{}}let tX=new Set,tZ=new Map,tY="request_canceled",tQ="request canceled";function t0(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 t1(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++}}(tZ);let t=new AbortController;tZ.set(e,t),tX.has(e)&&t.abort()}function t2(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++}}(tX),tX.add(e),tZ.get(e)?.abort())}function t3(e){e&&(tX.delete(e),tZ.delete(e))}function t4(e){return!!e&&tX.has(e)}function t5(e){if(e)return tZ.get(e)?.signal}function t8(){return new L("COMMAND_FAILED",tQ,{reason:tY})}function t6(e){if(t4(e))throw t8()}function t9(e){return e instanceof L&&"COMMAND_FAILED"===e.code&&(e.details?.reason===tY||e.message===tQ)}let t7=new Map;function re(e){let r=t.randomUUID(),n=setTimeout(()=>{rt(r)},9e5);return n.unref(),t7.set(r,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),r}function rt(e){let t=t7.get(e);if(t&&(clearTimeout(t.timer),t7.delete(e),t.deleteAfterDownload))try{i.rmSync(t.artifactPath,{force:!0})}catch{}}let rr=new Map;function rn(e,t){let r=rr.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 ri(e){let t=rr.get(e);t&&(clearTimeout(t.timer),rr.delete(e),i.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function ra(e){let t=await ro(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 ro(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(rs),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 rs(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 rl(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 rd(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 rd(e,t){if(e.destroy(),!e.closed)try{await c(e,"close")}catch{}await i.promises.rm(t,{force:!0}).catch(()=>{})}async function ru(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 rl(e,t),{artifactPath:t,tempDir:s}}let t=n.join(s,"artifact.tar");await rl(e,t);let a=await ra({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 rc=new m;async function rp(e,t){return await rc.run(e,t)}function rf(e){rc.getStore()?.(e)}let rm=new Set(["agent_device.command","agent-device.command"]),rh=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rw=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rg={"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"},ry=new Set([...rm,...rh,...rw,...Object.keys(rg)]);function rv(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rS(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function r_(e,t){e.destroyed||(e.write(Z(t)),e.end())}function rI(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rb(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 rA(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rx(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rN(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 rM(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 rE(e,t){if(!e)return{ok:!0};let r=await e(t);if(void 0===r||!0===r)return{ok:!0};if(!1===r){let e=T(new L("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rv(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=T(new L(R(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rv(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=T(new L("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rv(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rD(){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 rk(e){let t=await rD(),{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 rP(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||rS(i,rv(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rS(i,rv(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rS(i,rv(n.id??null,-32600,"Invalid Request"),400);if(!ry.has(n.method))return void rS(i,rv(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rS(i,rv(n.id??null,-32602,"Invalid params"),400);try{var s;let a=n.params,l=function(e,t,r){if(rm.has(e))return{token:rb(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(rh.has(e)){let e,n=rA(t,"platform");if("ios"!==n&&"android"!==n)throw new L("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:rb(t,r),session:rA(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rA(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=rN(e,"owner"),n=rN(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:rM(e,"artifactId")}:(a&&(t=rM(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rN(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:rx(t,"retentionMs")}}}if(rw.has(e)){let e=rA(t,"materializationId")?.trim();if(!e)throw new L("INVALID_ARGS","Invalid params: materializationId is required");return{token:rb(t,r),session:rA(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rA(t,"requestId"),materializationId:e}}}let n=rg[e];if(n)return{token:rb(t,r),session:rA(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rA(t,"tenantId")??rA(t,"tenant"),runId:rA(t,"runId"),leaseId:rA(t,"leaseId"),leaseTtlMs:rx(t,"ttlMs"),leaseBackend:rA(t,"backend")}};throw new L("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(s=n.method,rm.has(s)&&("string"!=typeof l.command||0===l.command.length))return void rS(i,rv(n.id??null,-32602,"Invalid params: command is required"),400);o=t0(l.meta?.requestId,n.id),l.meta={...l.meta,requestId:o},t1(o);let d=()=>{i.writableFinished||t2(o)};e.on("aborted",d),i.on("close",d);let u=await rE(t,{headers:e.headers,rpcRequest:n,daemonRequest:l});if(!u.ok)return void rS(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 rp(e=>{!i.destroyed&&i.write(X(e))},async()=>await r(l)),t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rv(n.id??null,-32e3,e.error.message,e.error);r_(i,t);return}let c=await r(l);if(c.ok)return void rS(i,{jsonrpc:"2.0",id:n.id??null,result:c});rS(i,rv(n.id??null,-32e3,c.error.message,c.error),rI(c.error.code))}catch(t){let e=T(t);if(i.headersSent)return void r_(i,rv(n.id??null,-32e3,e.message,e));rS(i,rv(n.id??null,-32e3,e.message,e),rI(e.code))}finally{t3(o)}})})}async function rP(e,r,n,i){try{var a;let o,s,l=await rR({req:e,res:r,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let d=await ru(e),u=(a={artifactPath:d.artifactPath,tempDir:d.tempDir,tenantId:l.tenantId},o=t.randomUUID(),(s=setTimeout(()=>{ri(o)},3e5)).unref(),rr.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){rO(r,T(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 rR({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[a]}});if(!o)return;let s=function(e,t){let r=t7.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 rt(e),new L("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(a,o.tenantId),l=i.createReadStream(s.artifactPath);t.statusCode=200,t.setHeader("content-type","application/octet-stream"),s.fileName&&t.setHeader("content-disposition",`attachment; filename="${s.fileName.replace(/"/g,"")}"`),l.on("error",e=>{if(t.headersSent)t.destroy(e);else{let r=T(e);t.statusCode=rI(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rt(a)}),l.pipe(t)}catch(e){rO(t,T(e))}}async function rR(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=rb({},n.headers),d=(t=l,(r=o)&&t!==r?T(new L("UNAUTHORIZED","Invalid token")):null);if(d)return rO(i,d),null;let u=await rE(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 rO(e,t){e.statusCode=rI(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function rT(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function rL(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function r$(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 rF{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=r$(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=rT(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=rL(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=rL(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=r$(e.backend),r=B(e.tenantId);if(!r)throw new L("INVALID_ARGS","tenant isolation requires tenant id.");let n=rT(e.runId);if(!n)throw new L("INVALID_ARGS","tenant isolation requires run id.");let i=rL(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=rT(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 rU(e){return e}function rG(e){return"apple"===e||"ios"===e||"macos"===e}function rq(e,t){return!t||("apple"===t?rG(e):e===t)}function rV(e){let{simulatorSetPath:t,platform:r,target:n}=e;if(t&&"macos"!==r&&"desktop"!==n)return t}async function rj(e,t,r={}){let n=e,i=e=>e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim();if(t.platform&&(n=n.filter(e=>rq(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&&rG(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
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 rB(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 rH=new m,rK=new m;async function rW(e,t,r){var n,i;let a=await rz(e,t,r);if(n=t,i=a,!rJ(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 rz(e,t,r){try{return await rj(e,t,r)}catch(e){var n;if(n=e,!rJ(t)&&n instanceof L&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function rJ(e){return!!(e.udid||e.serial||e.deviceName)}async function rX(e){let t=rU(e.platform),r=rV({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=rH.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 r1({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return r2(s)?r3(i,await rW(l,s,{simulatorSetPath:r})):r3(i,await rj(l,s,{simulatorSetPath:r}));let d=await rB({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return r2(s)?r3(i,await rW(d,s,{simulatorSetPath:r})):r3(i,await rj(d,s,{simulatorSetPath:r}))},a)}async function rZ(e){return rH.getStore()?await e():await rH.run(new Map,e)}async function rY(e,t){return e?await rK.run(e,t):await t()}async function rQ(e,t){return await rY(e,async()=>await rZ(t))}async function r0(e){return await r1(e)??await rB(e)}async function r1(e){let t=rK.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function r2(e){return!!e.platform&&"android"!==e.platform&&"linux"!==e.platform}function r3(e,t){return rH.getStore()?.set(e,{...t}),t}function r4(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 r5(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function r8(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 r6(e,t,r)}}async function r6(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 r5((await Promise.all(Array.from(a).map(async e=>{let r=await r9(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 r9(e,t){for(let r of[n.join(e,"Contents","Info.plist"),n.join(e,"Info.plist")]){let e=await t(r),n=r7(e,"CFBundleIdentifier"),i=r7(e,"CFBundleDisplayName"),a=r7(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function r7(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let ne={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 nd(U,e)},macosHost:r8(U,async e=>await nd(U,e)),whichCommand:q},nt=r4(ne,function(e){return"function"==typeof e?nr({runCommand:e}):nr(e)});function nr(e={}){let t={...ne,...e},r=e.plist??{readJson:async e=>await nd(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??r8(t.runCommand,async e=>await r.readJson(e))}}function nn(e){return nt.resolve(e)}async function ni(e,t){return await nt.run(e,t)}function na(){return nt.hasScope()}async function no(e,t,r){return await nn().runCommand(e,t,r)}async function ns(e,t){let r=nn(),[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 no("xcrun",e,t)}async function nl(e){return await nn().plist?.readJson(e)??null}async function nd(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 nu(e,t){let r=["devicectl",...e],n=await ns(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:nh(i,a)??nm})}async function nc(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 nf(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"})),r5(r,t)}async function np(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 nf(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 nf(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 ns(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:nh(r,n)??nm})}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 nm="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function nh(e,t){let r=`${e}
|
|
5
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 nw=new Map;async function ng(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=nw.get(n);if(void 0!==i){if(i>Date.now())return;nw.delete(n)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:t}=await Promise.resolve(tf);await t(e),ny(n);return}if("device"===e.kind){await nv(e.id),ny(n);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./8806.js");await t(e.id),ny(n)}}function ny(e){nw.set(e,Date.now()+5e3)}async function nv(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 ns(["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 nS(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:n_(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?n_(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 nS(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 n_(e,t){let r=nh(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.":nm)}async function nI(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 nA=/^[A-Za-z0-9_.:-]{1,64}$/,nb="--launch-console is supported only for iOS simulator app launches",nx="--launch-console requires a direct app launch and cannot be used with URL opens";function nN(e){return e?.clickButton??"primary"}function nM(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 nE(e){return"primary"===e?{}:{button:e}}let nD=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];async function nC(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await eU(t)}async function nP(e,t){let{x:r,y:n}=nF(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,...eq(`Long pressed (${r}, ${n})`)}}async function nk(e,t){let{x:r,y:n}=nF(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...eq(`Focused (${r}, ${n})`)}}async function nR(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=eR(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...eq(n5("Typed",i))}}async function nO(e,t,r){if(r?.directElementSelector)return await nT(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=eR(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...eq(n5("Filled",a))}}async function nT(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=eR(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...eq(n5("Filled",i))}}async function nL(e,t,r,n){var i,a,o,s;if(n?.directElementSelector&&"ios"===e.platform)return await n$(t,n.directElementSelector);let{x:l,y:d}=nF(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await nU(l,d,n);let u=nN(n);if("primary"!==u)return await nG(e,l,d,u,n);let c=(s=n,{count:nV(s?.count,1,"count",1,200),intervalMs:nV(s?.intervalMs,0,"interval-ms",0,1e4),holdMs:nV(s?.holdMs,0,"hold-ms",0,1e4),jitterPx:nV(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,rG(e.platform)&&i>1&&0===a&&0===o)?await nj(e,l,d,c,n):await nB(t,l,d,c)}async function n$(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??{},...eq(`Tapped ${t.raw}`)}}function nF(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 nU(e,t,r){let n=nN(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(tu);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...eq(n3({x:e,y:t}))}}async function nG(e,t,r,n,i){if(function(e,t,r){let n=nM({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 nq(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(tc);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},nH(i)),{x:t,y:r,button:n,...eq(n3({x:t,y:r,button:n}))}}async function nq(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,...eq(n3({x:e,y:t,button:r}))}}function nV(e,t,r,n,i){return eR(void 0===e?t:e,r,n,i)}async function nj(e,t,r,n,i){let{runIosRunnerCommand:a}=await Promise.resolve(tc),o=await a(e,{command:"tapSeries",x:t,y:r,count:n.count,intervalMs:n.intervalMs,doubleTap:n.doubleTap,appBundleId:i?.appBundleId},nH(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,...eq(n3({x:t,y:r}))}}async function nB(e,t,r,n){let i;return await nC(n.count,n.intervalMs,async a=>{let[o,s]=function(e,t){if(t<=0)return[0,0];let[r,n]=nD[e%nD.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}),eV({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},n3({x:t,y:r}))}function nH(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId}}async function nK(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 nz({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function nW(e,t,r,n){let i=eF(r[0]),a=r[1]?Number(r[1]):300,o=eO((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 nz({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function nz(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:d}=e,u=eR(l,"durationMs",16,1e4),c="ios"===t.platform?Math.min(60,Math.max(16,Math.round(u))):u,p=eR(n?.count??1,"count",1,200),f=eR(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(rG(t.platform)&&p>1){let{runIosRunnerCommand:e}=await Promise.resolve(tc),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,...eq(n4(p,m))}}return await nC(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)}),eV({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}`:n4(p,m))}async function nJ(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=eR(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,...eq(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function nX(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=eR(t[4]?Number(t[4]):50,"durationMs",16,1e3),{x2:s,y2:l}=function(e,t,r,n){switch(r){case"up":return{x2:e,y2:t-n};case"down":return{x2:e,y2:t+n};case"left":return{x2:e-n,y2:t};case"right":return{x2:e+n,y2:t}}}(n,i,r,a);return await e.fling(n,i,s,l,o),{direction:r,x:n,y:i,x2:s,y2:l,distance:a,durationMs:o,...eq(`Flung ${r}`)}}async function nZ(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:eS(n)},l={},d=0;if(s.edge){let t=s.edge,n=await ek({edge:t,captureState:async n=>await nY(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 eV({direction:s.direction,...s.edge?{edge:s.edge,passes:d}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},eb(s.direction,s.edge,d,a,o))}async function nY(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 eM({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,compact:!0,scope:e})).nodes??[]})}async function nQ(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,...eq(`Pinched to scale ${i}`)}}async function n0(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,...eq(`Rotated gesture ${n} degrees`)}}async function n1(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:eR(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...eq(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function n2(e,t,r){let{x:n,y:i}=nF(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(th);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(tu);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(tc),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 n3(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function n4(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function n5(e,t){return`${e} ${Array.from(t).length} chars`}function n8(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 n6(e){let t=n8(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await n9(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 n9(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 n7(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},o=await nI(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 ie(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function ie(e,t,r,n,i,a,o){switch(r){case"open":return await it(e,t,n,a);case"close":{let e=n[0];if(!e)return{closed:"session",...eq("Closed session")};return await t.close(e),{app:e,...eq(`Closed: ${e}`)}}case"press":return await nL(e,t,n,a);case"swipe":return await nK(e,t,n,a);case"swipe-preset":return await nW(e,t,n,a);case"pan":return await nJ(t,n);case"fling":return await nX(t,n);case"longpress":return await nP(t,n);case"focus":return await nk(t,n);case"type":return await nR(t,n,a);case"fill":return await nO(t,n,a);case"scroll":return await nZ(t,n,a);case"pinch":return await nQ(e,t,n,a);case"rotate-gesture":return await n0(e,t,n);case"transform-gesture":return await n1(e,t,n);case"trigger-app-event":return await ir(e,t,n,a);case"screenshot":return await ii(t,n,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...eq("Back")};case"home":return await t.home(),{action:"home",...eq("Home")};case"rotate":{let e=ej(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...eq(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...eq("Opened app switcher")};case"clipboard":return await ia(t,n);case"keyboard":return await io(e,n,a,o);case"settings":return await id(e,t,n,a);case"push":return await iu(e,n,a);case"snapshot":return await ic(t,a);case"read":return await n2(e,n,a);default:throw new L("INVALID_ARGS",`Unknown command: ${r}`)}}async function it(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,...eq("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new L("UNSUPPORTED_OPERATION",nb);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",nx);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...eq(`Opened: ${i}`)}}if(o&&eh(i))throw new L("INVALID_ARGS",nx);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}:{},...eq(`Opened: ${i}`)}}async function ir(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(!nA.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",...eq(`Triggered app event: ${i}`)}}async function ii(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,...eq(`Saved screenshot: ${a}`)}}async function ia(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,...eq("Clipboard updated")}}async function io(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!e_(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 is(e,i);if("ios"===e.platform)return await il(e,i,r,n);throw new L("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function is(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...eq("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 il(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(tc),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...eq("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(tc),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...eq(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function id(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?eV({setting:i,state:"clear",...s},ip(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...eq(`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:eG(o,"latitude"),longitude:eG(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?eV({setting:i,state:a,...c},ip(c)??`Updated setting: ${i}`):{setting:i,state:a,...eq(`Updated setting: ${i}`)}}async function iu(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 n6(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...eq(`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,...eq(`Pushed notification to ${n}`)}}async function ic(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,compact:t?.snapshotCompact,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,surface:t?.surface})}function ip(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}function im(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let ih=300,iw=300;function ig(e,t,r){return t||iy(r)?null:im("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function iy(e){return!!(e?.platform||e?.target||e?.device||e?.udid||e?.serial)}function iv(e){return"string"==typeof e?.session&&e.session.trim().length>0}function iS(e){return"ios"===e.platform&&"simulator"===e.kind}async function i_(e,t){iS(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function iI(e){let t=iy(e.flags)||!e.session?await rX(e.flags??{}):await iA(e.session.device);return!1!==e.ensureReady&&await ng(t),t}async function iA(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 rX(t)}catch(e){if(!(e instanceof L)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await rX({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function ib(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 ix(e,t){if(!t)return!1;if(!iy(e))return!0;let r=rU(e?.platform);return!(r&&!rq(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 iN=[{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");iP(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&rG(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(tp);iP(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&&rG(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(tm);iP(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(tw);iP(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(td);iP(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");iP(t,e.recording,r)}}];async function iM(e,t){let r=await iE(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await iC(r);return await ik(i,async()=>await t(n))}async function iE(e){var t,r,n;if(t=e.providers,!iN.some(e=>!!t[e.resolverKey]))return{};let i=await iD(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return iN.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function iD(e,t){var r;return t?e.command===eB.apps&&iy(e.flags)?await rX(e.flags??{}):t.device:e.command===eB.open||iy(e.flags)||(r=e).command===eB.record&&"start"===(r.positionals?.[0]??"").toLowerCase()?await rX(e.flags??{}):void 0}async function iC(e){let t=[];for(let r of iN)await r.appendWrapper(e,t);return t}function iP(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function ik(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}let iR=e=>"macos"!==e.platform,iO=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,iT=e=>"macos"===e.platform?"macOS automation has no multi-touch input — this gesture is supported on Android and the iOS simulator only.":"ios"===e.platform&&"tv"===e.target?"tvOS has no touch input — this gesture is supported on Android and the iOS simulator only.":"ios"===e.platform&&"device"===e.kind?"Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices.":void 0,iL={device:!0},i$={},iF={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},iU={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:iR},iG={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,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:i$,supports:e=>"android"===e.platform||iO(e),unsupportedHint:iT},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:e=>"android"===e.platform||iO(e),unsupportedHint:iT},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:e=>"android"===e.platform||iO(e),unsupportedHint:iT},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:iR},open:iF,close:iF,reinstall:iU,install:iU,"install-from-source":iU,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:iR},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL,supports:e=>"android"===e.platform||"linux"===e.platform||"macos"===e.platform||"simulator"===e.kind},keyboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},fill:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},snapshot:iF,diff:iF,screenshot:iF,wait:iF,get:iF,find:iF,is:iF,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL,supports:iR},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:iR},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},scroll:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,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:i$},type:iF};function iq(e,t){let r=iG[e];if(!r)return!0;let n=rG(t.platform)?r.apple:"linux"===t.platform?r.linux:r.android;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}let iV="agent-device-macos-helper",ij="AGENT_DEVICE_MACOS_HELPER_BIN",iB=n.join(u.homedir(),".agent-device","macos-helper","current"),iH=n.join(iB,"manifest.json"),iK=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function iW(e){let t=e.trim();if(!iK.test(t))throw new L("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function iz(e,t){t.bundleId&&e.push("--bundle-id",iW(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iJ(){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 iX(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 iX(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function iZ(e){let t=await iX(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 no("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 iY(){try{let e=JSON.parse(await o.readFile(iH,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function iQ(){let e=await G(process.env[ij],ij);if(e)return e;let t=iJ(),r=await iZ(t),i=n.join(iB,iV);try{if(await iY()===r)return await o.access(i),i}catch{}let a=n.join(iJ(),".build","release",iV);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await no("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await o.mkdir(iB,{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(iH,`${JSON.stringify({fingerprint:r},null,2)}
|
|
7
|
-
`,"utf8"),i}async function i0(){let e=process.env[ij]?.trim();if(e){let t=await G(e,ij);if(t)return t}if(na())return iV;if("darwin"!==process.platform)throw new L("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await iQ()}async function i1(e){let t={allowFailure:!0,timeoutMs:3e4},r=nn().macosHelper,n=r?iV:await i0(),i=r?await r.run(e,t):await no(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 i2(){return await i1(["app","frontmost"])}async function i3(e){return await i1(["app","quit","--bundle-id",iW(e)])}async function i4(e,t){return await i1(["permission",e,t])}async function i5(e,t={}){let r=["alert",e];return iz(r,t),await i1(r)}async function i8(e,t={}){let r=["snapshot","--surface",e];return iz(r,t),await i1(r)}async function i6(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return iz(n,r),await i1(n)}async function i9(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return iz(n,r),await i1(n)}async function i7(e,t={}){let r=["screenshot","--out",e];return iz(r,t),t.fullscreen&&r.push("--fullscreen"),await i1(r)}let ae={"push button":"Button","toggle button":"Button","push button menu":"Button",label:"StaticText",static:"StaticText",caption:"StaticText",text:"TextField",entry:"TextField","password text":"TextField","spin button":"TextField",terminal:"TextArea","document text":"TextArea",paragraph:"TextArea",frame:"Window",window:"Window",dialog:"Dialog",alert:"Alert","file chooser":"Dialog","color chooser":"Dialog","font chooser":"Dialog",panel:"Group",filler:"Group",section:"Group",form:"Group",grouping:"Group","layered pane":"Group","glass pane":"Group","root pane":"Group","option pane":"Group","internal frame":"Group","desktop frame":"Group","block quote":"Group",article:"Group",comment:"Group",landmark:"Group",log:"Group",marquee:"Group",math:"Group",notification:"Group","content deletion":"Group","content insertion":"Group",mark:"Group",suggestion:"Group","scroll pane":"ScrollArea","scroll bar":"ScrollBar","menu bar":"MenuBar",menu:"Menu","popup menu":"Menu","menu item":"MenuItem","check menu item":"MenuItem","radio menu item":"MenuItem","tearoff menu item":"MenuItem","check box":"CheckBox","radio button":"RadioButton",switch:"Switch","combo box":"ComboBox","page tab":"Tab","page tab list":"TabList",table:"Table","tree table":"Table","table cell":"Cell","table row":"Row","table column header":"Cell","table row header":"Cell","column header":"Cell","row header":"Cell",list:"List","list item":"ListItem","list box":"List",tree:"Tree","tree item":"TreeItem","description list":"List","description term":"ListItem","description value":"ListItem","tool bar":"Toolbar","status bar":"StatusBar","info bar":"StatusBar",slider:"Slider","progress bar":"ProgressBar","level bar":"ProgressBar",image:"Image",icon:"Image",animation:"Image",canvas:"Image","drawing area":"Image",video:"Video",audio:"Audio",link:"Link",hyperlink:"Link",separator:"Separator",application:"Application","tool tip":"Tooltip",timer:"Timer",heading:"Heading",footnote:"Footnote","title bar":"TitleBar","date editor":"DateEditor",rating:"Slider"},at={runCommand:U,whichCommand:q,desktop:ao(U,q),clipboard:as(U,q),screenshot:al(U,q)},ar=r4(at,function(e={}){let t={...at,...e};return{...t,desktop:e.desktop??ao(t.runCommand,t.whichCommand),clipboard:e.clipboard??as(t.runCommand,t.whichCommand),screenshot:e.screenshot??al(t.runCommand,t.whichCommand)}});function an(e){return ar.resolve(e)}async function ai(e,t){return await ar.run(e,t)}async function aa(e,t,r){return await an().runCommand(e,t,r)}function ao(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 eU(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 as(e,t){return{async readText(){let r=ac[await am(t,ad)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=ap[await am(t,ad)](r);await e(n.cmd,n.args,n.options)}}}function al(e,t){return{async capture(r){let n=af[await am(t,au)](r);await e(n.cmd,n.args,n.options)}}}let ad={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."},au={wayland:[{tool:"grim",command:"grim"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],x11:[{tool:"scrot",command:"scrot"},{tool:"import",command:"import"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],waylandError:"grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.",x11Error:"scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager."},ac={"wl-clipboard":{cmd:"wl-paste",args:["--no-newline"],options:{allowFailure:!0,timeoutMs:5e3}},xclip:{cmd:"xclip",args:["-selection","clipboard","-o"],options:{allowFailure:!0,timeoutMs:5e3}},xsel:{cmd:"xsel",args:["--clipboard","--output"],options:{allowFailure:!0,timeoutMs:5e3}}},ap={"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}})},af={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 am(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 ah="atspi-dump.py",aw=null;async function ag(e,t={}){let r,a=an().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 an().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(aw)return aw;let e=n.dirname(l(import.meta.url));for(let t=0;t<5;t++){let r=n.join(e,"src","platforms","linux",ah);if(i.existsSync(r))return aw=r,r;if(0===t){let t=n.join(e,ah);if(i.existsSync(t))return aw=t,t}e=n.dirname(e)}throw new L("TOOL_MISSING",`Cannot find ${ah}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(d)],c=await aa("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=ae[t=e.role.toLowerCase().trim()])||t.split(/[\s_-]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(""),role:e.role,label:e.label??void 0,value:e.value??void 0,rect:e.rect??void 0,enabled:e.enabled??void 0,selected:e.selected??void 0,hittable:e.hittable??void 0,depth:e.depth,parentIndex:e.parentIndex??void 0,pid:e.pid??void 0,appName:e.appName??void 0,windowTitle:e.windowTitle??void 0}}),truncated:r.truncated,surface:e}}async function ay(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 ag(t);return{nodes:r.nodes,truncated:r.truncated}}async function av(e,t,r){let{nodes:n}=await ay(r);for(let r of n.filter(r=>{let n=r.rect;return!!n&&e>=n.x&&t>=n.y&&e<=n.x+n.width&&t<=n.y+n.height}).sort((e,t)=>{let r=e.depth??0,n=t.depth??0;return r!==n?n-r:aS(e.rect)-aS(t.rect)})){let e=function(e){for(let t of[e.value,e.label,e.identifier])if("string"==typeof t&&t.length>0)return t;return""}(r);if(e.trim())return e}return""}function aS(e){return(e?.width??0)*(e?.height??0)}let a_=[250,400,600];function aI(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?aN(r?.nodes??[]):void 0,routeComparable:n}}function aA(e){if(!e||"android"!==e.device.platform)return;let t=e.androidSnapshotFreshness;if(t)return Date.now()-t.markedAt>2500?void delete e.androidSnapshotFreshness:t}function ab(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function ax(e){return"press"===e||"click"===e||"back"===e||"open"===e}function aN(e){return e.map(e=>[e.depth??0,e.type??"",e.role??"",e.label??"",e.value??"",e.identifier??"",!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].join("|"))}function aM(e,t,r,n,i){return{requestId:i??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:nN(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function aE(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!aO(r))return;let s=function(e){if("click"===e||"press"===e)return"press"}(n);if(!s||!(2===(t=i).length&&t.every(e=>Number.isFinite(Number(e)))))return;let l=ak(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:aP(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function aD(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function aC(e){var t,r;let{session:n,pending:i,snapshot:a}=e,o=(t=i.preSignature,r=ak(a.nodes),0===t.length||0===r.length?"ambiguous":aR(t,r)?"unchanged":"changed");if("unchanged"!==o||i.attemptsRemaining<=0)return{retried:!1,change:o};let s=Date.now();return i.attemptsRemaining-=1,await n7(n.device,i.command,i.positionals,i.flags?.out,{...aM(e.logPath,i.flags,n.appBundleId,n.trace?.outPath),surface:n.surface}),N({level:"info",phase:"interaction_no_change_retry",data:{action:i.action,attemptsRemaining:i.attemptsRemaining,durationMs:Date.now()-s}}),{retried:!0,change:o}}function aP(e){if(!e?.interactionOutcome)return e;let{interactionOutcome:t,...r}=e;return r}function ak(e){let t=new Map,r=[];for(let n of e){let e=function(e,t){var r,n;if(!e.rect||!([(r=e.rect).x,r.y,r.width,r.height].every(e=>Number.isFinite(e))&&r.width>0&&r.height>0)||(n=e,`${n.label??""} ${n.identifier??""}`.toLowerCase().includes("scroll bar")))return;let i=function(e){let t=[e.identifier,e.label,e.value,e.type,e.role,!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].map(e=>"string"==typeof e?e.trim():"").join("|");return t.replaceAll("|","")?t:void 0}(e);if(!i)return;let a=t.get(i)??0;return t.set(i,a+1),{key:`${i}|#${a}`,x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height)}}(n,t);e&&r.push(e)}return r}function aR(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r+=1){let n=e[r],i=t[r];if(!n||!i||n.key!==i.key||Math.abs(n.x-i.x)>1||Math.abs(n.y-i.y)>1||Math.abs(n.width-i.width)>1||Math.abs(n.height-i.height)>1)return!1}return!0}function aO(e){return"ios"===e.device.platform||"android"===e.device.platform}function aT(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function aL(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!a$(t.device.platform)||!n)return await r();let i=Date.now(),a=1,o=await r(),s=ak(o.nodes);for(;Date.now()-i<1500;){await eU(200),a+=1;let e=await r(),l=ak(e.nodes);if(aR(s,l))return aT(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 aT(t),N({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function a$(e){return"ios"===e||"android"===e}let aF=["x","y","width","height"],aU=new WeakMap;function aG(e,t){if(!e[t])return[];let r=aj(e)[t]??t+1;return e.slice(t+1,r)}function aq(e,t,r){let n=aj(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function aV(e,t,r){let n=aj(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function aj(e){let t=aU.get(e);if(t)return t;let r=Array(e.length),n=[];for(let[t,i]of e.entries()){let e=i?.depth??0;for(;n.length>0&&e<=n[n.length-1].depth;)r[n.pop().position]=t;n.push({depth:e,position:t})}for(let t of n)r[t.position]=e.length;return aU.set(e,r),r}function aB(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 aH(e,t){let r=ez(e.type??""),n=e.label?.trim();return!!(aK(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function aK(e){return"button"===ez(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function aW(e){let t=ez(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function az(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function aJ(e,t){return!!e&&!!t&&aF.every(r=>.5>=Math.abs(e[r]-t[r]))}function aX(e){let t;for(let i of e){var r,n;let e=ez(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||aZ(r)>aZ(n)))&&(t=i.rect)}return t}function aZ(e){return e?e.width*e.height:0}function aY(e){let t=ez(e.type??"");return"scrollview"===t||"scrollarea"===t}function aQ(e,t){return!0===e||!!t||void 0}function a0(e,t,r,n){aV(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=ez(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function a1(e,t,r,n){aV(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=ez((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function a2(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===ez(n.type??"")&&t(n,i,r)}}function a3(e,t,r,n){for(let i of e)(aH(i,t)||n&&a5(i,n))&&r.add(i.index)}function a4(e,t,r){if("button"!==ez(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&aJ(e.rect,t.rect)}function a5(e,t){return"button"===ez(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&aJ(e.rect,t.rect)}let a8=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=aX(e),n=r?r.y+r.height:null;if(null!==n)for(let r=0;r<e.length;r+=1){var i,a;let o=e[r];o&&(i=o,a=n,i.rect&&"keyboard"===ez(i.type??"")&&i.rect.y>=a)&&(t.add(o.index),function(e,t,r,n){let i=new Map(t.map(e=>[e.index,e])),a="number"==typeof e.parentIndex?i.get(e.parentIndex):void 0;for(;a?.rect&&a.rect.y>=n;)r.add(a.index),a="number"==typeof a.parentIndex?i.get(a.parentIndex):void 0}(o,e,t,n),aV(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==ez(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&&eI(t))})(r)&&function(e,t,r){var n,i,a,o;aW(e.type)||r.suppressedIndexes.add(e.index);let s=eN(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&aW(e.type)?e:null)??aB(e,t,e=>aW(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,az(n.replacements,i,{rect:function(e,t){if(e&&t&&!(t.height<=0)&&!(t.height>=e.height)&&!(t.y<e.y)&&!(t.y>e.y+e.height))return{...e,y:t.y,height:Math.min(t.height,e.y+e.height-t.y)}}(i.rect,a.rect)??i.rect,hiddenContentAbove:aQ(i.hiddenContentAbove,o.above),hiddenContentBelow:aQ(i.hiddenContentBelow,o.below)}))}(r,s,t);(function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r];if(!n||"searchfield"!==ez(n.type??""))continue;if("Search"===n.label){a1(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=aq(e,r,e=>"searchfield"===ez(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),a1(e,r,i.index,t))}})(e,o),r=e,n=o,a2(r,(e,t,i)=>{aq(r,i,r=>{let n;return("button"===(n=ez(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(aJ(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=ez(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,a2(i,(e,t,r)=>{let n;eD(e)&&eA(e,(n=[],aV(i,r,e=>{n.push(e)}),n))&&a.add(e.index)}),function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();!(!n||t.has(n.index))&&i&&function(e,t,r,n,i){let a=ez(r.type??"");if("statictext"===a||"link"===a)return a0(e,t,n,i);if("other"===a){if(function(e,t,r){return!!aq(e,t,e=>{let t=ez(e.type??"");return("link"===t||"searchfield"===t||aW(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);a0(e,t,n,i)}}(e,r,n,i,t)}}(e,o)},function(e,t){let r=new Map(e.map(e=>[e.index,e])),n=aX(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==ez(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)||!aB(e,t,aY)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=aZ(e),i=aZ(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&az(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=ez(r.type??"");if("button"===a)return a3(aG(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=aG(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==ez(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=>a4(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&az(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&&(a4(a,t,r)||a5(a,t)||function(e,t){if("switch"!==ez(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||aH(a,r))&&i.add(a.index)}(e,t,r,i,n.suppressedIndexes),!0}(o,r,n,i)&&function(e,t,r,n){let i=e.find(e=>a4(e,t,r));if(!i){e.some(aK)&&a3(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&az(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),a3(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function a6(e){if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return{snapshot:await aL({session:e.session,capture:async()=>(await on(e)).snapshot})};let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!aO(e)||Date.now()-t.markedAt>3e4?void aD(e):t}(e.session);if(t&&e.session)return await a9({...e,session:e.session},t);let r=aA(e.session);if(r&&"android"===e.device.platform)return await oe(e,r);let n=await a7(e);return ab(e.session),{snapshot:oo(n,oi(e)),analysis:n.analysis,androidSnapshot:n.androidSnapshot}}async function a9(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await or(e),l=await aC({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await or(e),l=await aC({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(aD(i),"ambiguous"!==l.change&&s.freshness?.staleAfterRetries!==!0&&ab(i),"unchanged"===l.change)?N({level:"warn",phase:"interaction_settle_timeout",data:{action:(r={pending:t,attempts:o,startedAt:a}).pending.action,attempts:r.attempts,durationMs:Date.now()-r.startedAt}}):N({level:(n={pending:t,change:l.change,attempts:o,startedAt:a}).attempts>0?"info":"debug",phase:"interaction_settled",data:{action:n.pending.action,change:n.change,attempts:n.attempts,durationMs:Date.now()-n.startedAt}}),{snapshot:s.snapshot,analysis:s.data.analysis,androidSnapshot:s.data.androidSnapshot,freshness:s.freshness}}async function a7(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await ay(r?.surface);return os({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?os(await i8(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await n7(t,"snapshot",[],i,{...aM(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath)})}async function oe(e,t){let r=await ot(e,t);return{snapshot:r.snapshot,analysis:r.data.analysis,androidSnapshot:r.data.androidSnapshot,freshness:r.freshness}}async function ot(e,t){let r=await on(e),n=oa(r,t,e),i=0,a=t.markedAt+1500;for(let o of a_){if(!n)break;let s=a-Date.now();if(s<=0)break;await eU(Math.min(o,s)),r=await on(e),i+=1,n=oa(r,t,e)}return n||ab(e.session),{...r,freshness:i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0}}async function or(e){let t=aA(e.session);return t&&"android"===e.device.platform?await ot(e,t):await on(e)}async function on(e){let t=await a7(e);return{data:t,snapshot:oo(t,oi(e))}}function oi(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function oa(e,t,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&&ax(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=aN(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 oo(e,t){var r,n,i,a;let o=e?.nodes??[],s=eE(t?.snapshotRaw?o:eJ(o)),l=t?.snapshotScope&&e?.backend!=="macos-helper"?ol(s,t.snapshotScope):s;return{nodes:e3((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 a8)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:e1(eY(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&a?.snapshotCompact!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function os(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=ol(i,t.snapshotScope)),t.snapshotInteractiveOnly&&(i=function(e){if(0===e.length)return e;let t=new Map;for(let 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:od(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=od(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function ol(e,t){let r=eX(e3(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 od(a,i)}function od(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 ou(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return im("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=eQ(e.trim());if(!n)return im("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=e0(e.nodes,n);if(r=t?eZ(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:im("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function oc(e,t){e.snapshot=t,e.snapshotScopeSource=void 0}function op(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 of(e){let{session:t,sessionName:r,outPath:i,outputPlacement:a,dispatchContext:s}=e,l=eP({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?om(await n7(t.device,"screenshot",[],i,o)):om(await n7(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:op({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eT()});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 om(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function oh(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function ow(e,t){let r=Math.max(24,Math.round(.2*Math.min(e.size,t.size))),n=Math.max(48,Math.round(.15*Math.min(e.crossSize,t.crossSize)));return Math.abs(e.size-t.size)<=r&&Math.abs(e.crossSize-t.crossSize)<=n}function og(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let oy=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function ov(e,t={}){let r=e6(e,t.helperAdb).exec;return(await oI(e,t,r)).xml}async function oS(e,t={}){let r=e6(e,t.helperAdb).exec,n=await oI(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=e7(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 ok(e,o.nodes,i,r),o.nodes),{...o,androidSnapshot:n.metadata}}let o=tt(i),s=to(o,800,t);a&&await o_({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:l,...d}=s;return{...d,androidSnapshot:n.metadata}}async function o_(e){if(oO(e.interactiveSnapshot.nodes).size>0||oR(e.xml))return;let t=to(e.tree,800,{...e.options,interactiveOnly:!1}),r=await ok(e.device,t.nodes,e.xml,e.adb);oG(r,t,e.interactiveSnapshot),0===r.size&&oG(ex(e3(t.nodes)),t,e.interactiveSnapshot)}async function oI(e,t,r){let n=await x("android_snapshot_helper_artifact_resolution",async()=>await oC(t.helperArtifact));return n.artifact?await oA(e,t,r,n.artifact):(N({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await oP(e,n.fallbackReason,r))}async function oA(e,t,r,n){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),d=e6(e,t.helperAdb);try{let e=await ob(t,r,d,n,l);return e.installed&&await ts(l),a=await ox(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 oN({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function ob(e,t,r,n,i){let a=await x("android_snapshot_helper_install",async()=>await te({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 ox(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 tn(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){N({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:T(e).message}}),await oM(t,n.manifest.packageName)}return await x("android_snapshot_helper_capture",async()=>await tr(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function oN(e){let t=function(e){var t;let r=T(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=oD(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=oE(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=oE(e.error);return N({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await ts(e.helperDeviceKey),await oM(e.adb,e.artifact.manifest.packageName),ta({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oP(e.device,r,e.adb)}async function oM(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await eU(150),N({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){N({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:T(e).message}})}}function oE(e){let t=T(e),r=oD(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 oD(e){if(!e||"object"!=typeof e||!("message"in e))return;let t=String(e.message).trim();return t&&"null"!==t?t:void 0}async function oC(e){if(e)return{artifact:e};let t=e5(),r=n.join(e8(),"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=ti(JSON.parse(await h.readFile(i,"utf8"))),t=n.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await h.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:T(e).message}}}async function oP(e,t,r){let n;try{n=await x("android_snapshot_stock_capture",async()=>await oT(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new L(R((r=T(i)).code),`${r.message} Android snapshot helper failed before stock fallback: ${a}`,{...r.details,androidSnapshotHelperFallbackReason:a,...r.hint?{hint:r.hint}:{}},i)}throw e}return{xml:n,metadata:{backend:"uiautomator-dump",...t?{fallbackReason:t}:{}}}}async function ok(e,t,r,n){if(!t.some(e=>e4(e.type)))return new Map;let i=oO(t);if(i.size>0||oR(r))return i;let a=await oU(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(e4(e.className)){let r=function(e){let t=e.children[0];if(!t)return null;let r=Math.max(t.rect.height,...t.children.map(e=>e.rect.y+e.rect.height)),n=t.children.filter(e=>e.rect.height>0).map(t=>og(t.rect,e.rect)).sort((e,t)=>e.start-t.start);return 0===n.length?null:{rect:e.rect,contentExtent:r,contentBlocks:n}}(e);r&&t.push(r)}r.push(...e.children)}return t}(r);if(0===n.length)return new Map;let i=new Map;for(let t of e){if(!t.rect||!e4(t.type))continue;let r=function(e,t){let r=null,n=1/0;for(let i of t){let t=Math.abs(i.rect.width-e.width)+Math.abs(i.rect.height-e.height);if(t>32)continue;let a=4*t+(Math.abs(i.rect.x-e.x)+Math.abs(i.rect.y-e.y));a<n&&(r=i,n=a)}return r}(t.rect,n);if(!r)continue;let a=function(e,t){let r=function(e,t){let r=t,n=new Set;for(;!n.has(r.index);){var i,a;n.add(r.index);let o=e.filter(e=>e.parentIndex===r.index&&e.rect);if(1!==o.length)return r;let s=o[0];if(i=s.rect,a=t.rect,i.x!==a.x||i.y!==a.y||i.width!==a.width||i.height!==a.height)return r;r=s}return t}(e,t);return e.filter(e=>e.parentIndex===r.index&&e.rect).map(e=>e.rect).filter(e=>e.height>0).sort((e,t)=>e.y-t.y).map(e=>og(e,t.rect))}(e,t),o=function(e){let{viewportRect:t,visibleBlocks:r,nativeScrollView:n}=e;if(0===r.length||0===n.contentBlocks.length)return null;let i=function(e){if(0===e.contentBlocks.length)return null;let t=e.contentBlocks[0],r=e.contentBlocks[e.contentBlocks.length-1];if(!t||!r)return null;let n=oh(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(!ow(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(!ow(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?oh(o):a.length>0?oh(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 oR(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function oO(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 oT(e,t=e9(e)){try{return await et(()=>oL(t),{shouldRetry:oF})}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 oL(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}
|
|
6
|
+
${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":nm)}async function nI(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 nb=/^[A-Za-z0-9_.:-]{1,64}$/,nA="--launch-console is supported only for iOS simulator app launches",nx="--launch-console requires a direct app launch and cannot be used with URL opens";function nN(e){return e?.clickButton??"primary"}function nM(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 nE(e){return"primary"===e?{}:{button:e}}let nD=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];async function nk(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await eU(t)}async function nP(e,t){let{x:r,y:n}=nF(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,...eq(`Long pressed (${r}, ${n})`)}}async function nC(e,t){let{x:r,y:n}=nF(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...eq(`Focused (${r}, ${n})`)}}async function nR(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=eR(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...eq(n5("Typed",i))}}async function nO(e,t,r){if(r?.directElementSelector)return await nT(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=eR(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...eq(n5("Filled",a))}}async function nT(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=eR(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...eq(n5("Filled",i))}}async function nL(e,t,r,n){var i,a,o,s;if(n?.directElementSelector&&"ios"===e.platform)return await n$(t,n.directElementSelector);let{x:l,y:d}=nF(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await nU(l,d,n);let u=nN(n);if("primary"!==u)return await nG(e,l,d,u,n);let c=(s=n,{count:nV(s?.count,1,"count",1,200),intervalMs:nV(s?.intervalMs,0,"interval-ms",0,1e4),holdMs:nV(s?.holdMs,0,"hold-ms",0,1e4),jitterPx:nV(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,rG(e.platform)&&i>1&&0===a&&0===o)?await nj(e,l,d,c,n):await nB(t,l,d,c)}async function n$(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??{},...eq(`Tapped ${t.raw}`)}}function nF(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 nU(e,t,r){let n=nN(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(tu);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...eq(n3({x:e,y:t}))}}async function nG(e,t,r,n,i){if(function(e,t,r){let n=nM({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 nq(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(tc);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},nH(i)),{x:t,y:r,button:n,...eq(n3({x:t,y:r,button:n}))}}async function nq(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,...eq(n3({x:e,y:t,button:r}))}}function nV(e,t,r,n,i){return eR(void 0===e?t:e,r,n,i)}async function nj(e,t,r,n,i){let{runIosRunnerCommand:a}=await Promise.resolve(tc),o=await a(e,{command:"tapSeries",x:t,y:r,count:n.count,intervalMs:n.intervalMs,doubleTap:n.doubleTap,appBundleId:i?.appBundleId},nH(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,...eq(n3({x:t,y:r}))}}async function nB(e,t,r,n){let i;return await nk(n.count,n.intervalMs,async a=>{let[o,s]=function(e,t){if(t<=0)return[0,0];let[r,n]=nD[e%nD.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}),eV({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},n3({x:t,y:r}))}function nH(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId}}async function nK(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 nz({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function nW(e,t,r,n){let i=eF(r[0]),a=r[1]?Number(r[1]):300,o=eO((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 nz({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function nz(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:d}=e,u=eR(l,"durationMs",16,1e4),c="ios"===t.platform?Math.min(60,Math.max(16,Math.round(u))):u,p=eR(n?.count??1,"count",1,200),f=eR(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(rG(t.platform)&&p>1){let{runIosRunnerCommand:e}=await Promise.resolve(tc),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,...eq(n4(p,m))}}return await nk(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)}),eV({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}`:n4(p,m))}async function nJ(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=eR(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,...eq(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function nX(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=eR(t[4]?Number(t[4]):50,"durationMs",16,1e3),{x2:s,y2:l}=function(e,t,r,n){switch(r){case"up":return{x2:e,y2:t-n};case"down":return{x2:e,y2:t+n};case"left":return{x2:e-n,y2:t};case"right":return{x2:e+n,y2:t}}}(n,i,r,a);return await e.fling(n,i,s,l,o),{direction:r,x:n,y:i,x2:s,y2:l,distance:a,durationMs:o,...eq(`Flung ${r}`)}}async function nZ(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:eS(n)},l={},d=0;if(s.edge){let t=s.edge,n=await eC({edge:t,captureState:async n=>await nY(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 eV({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 nY(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 eM({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,compact:!0,scope:e})).nodes??[]})}async function nQ(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,...eq(`Pinched to scale ${i}`)}}async function n0(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,...eq(`Rotated gesture ${n} degrees`)}}async function n1(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:eR(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...eq(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function n2(e,t,r){let{x:n,y:i}=nF(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(th);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(tu);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(tc),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 n3(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function n4(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function n5(e,t){return`${e} ${Array.from(t).length} chars`}function n8(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 n6(e){let t=n8(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await n9(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 n9(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 n7(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},o=await nI(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 ie(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function ie(e,t,r,n,i,a,o){switch(r){case"open":return await it(e,t,n,a);case"close":{let e=n[0];if(!e)return{closed:"session",...eq("Closed session")};return await t.close(e),{app:e,...eq(`Closed: ${e}`)}}case"press":return await nL(e,t,n,a);case"swipe":return await nK(e,t,n,a);case"swipe-preset":return await nW(e,t,n,a);case"pan":return await nJ(t,n);case"fling":return await nX(t,n);case"longpress":return await nP(t,n);case"focus":return await nC(t,n);case"type":return await nR(t,n,a);case"fill":return await nO(t,n,a);case"scroll":return await nZ(t,n,a);case"pinch":return await nQ(e,t,n,a);case"rotate-gesture":return await n0(e,t,n);case"transform-gesture":return await n1(e,t,n);case"trigger-app-event":return await ir(e,t,n,a);case"screenshot":return await ii(t,n,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...eq("Back")};case"home":return await t.home(),{action:"home",...eq("Home")};case"rotate":{let e=ej(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...eq(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...eq("Opened app switcher")};case"clipboard":return await ia(t,n);case"keyboard":return await io(e,n,a,o);case"settings":return await id(e,t,n,a);case"push":return await iu(e,n,a);case"snapshot":return await ic(t,a);case"read":return await n2(e,n,a);default:throw new L("INVALID_ARGS",`Unknown command: ${r}`)}}async function it(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,...eq("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new L("UNSUPPORTED_OPERATION",nA);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",nx);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...eq(`Opened: ${i}`)}}if(o&&eh(i))throw new L("INVALID_ARGS",nx);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}:{},...eq(`Opened: ${i}`)}}async function ir(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(!nb.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",...eq(`Triggered app event: ${i}`)}}async function ii(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,...eq(`Saved screenshot: ${a}`)}}async function ia(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,...eq("Clipboard updated")}}async function io(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!e_(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 is(e,i);if("ios"===e.platform)return await il(e,i,r,n);throw new L("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function is(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...eq("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 il(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(tc),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...eq("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(tc),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...eq(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function id(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?eV({setting:i,state:"clear",...s},ip(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...eq(`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:eG(o,"latitude"),longitude:eG(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?eV({setting:i,state:a,...c},ip(c)??`Updated setting: ${i}`):{setting:i,state:a,...eq(`Updated setting: ${i}`)}}async function iu(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 n6(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...eq(`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,...eq(`Pushed notification to ${n}`)}}async function ic(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,compact:t?.snapshotCompact,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,surface:t?.surface})}function ip(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}function im(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let ih=300,iw=300;function ig(e,t,r){return t||iy(r)?null:im("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function iy(e){return!!(e?.platform||e?.target||e?.device||e?.udid||e?.serial)}function iv(e){return"string"==typeof e?.session&&e.session.trim().length>0}function iS(e){return"ios"===e.platform&&"simulator"===e.kind}async function i_(e,t){iS(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function iI(e){let t=iy(e.flags)||!e.session?await rX(e.flags??{}):await ib(e.session.device);return!1!==e.ensureReady&&await ng(t),t}async function ib(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 rX(t)}catch(e){if(!(e instanceof L)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await rX({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function iA(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 ix(e,t){if(!t)return!1;if(!iy(e))return!0;let r=rU(e?.platform);return!(r&&!rq(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 iN=[{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");iP(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&rG(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(tp);iP(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&&rG(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(tm);iP(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(tw);iP(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(td);iP(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");iP(t,e.recording,r)}}];async function iM(e,t){let r=await iE(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await ik(r);return await iC(i,async()=>await t(n))}async function iE(e){var t,r,n;if(t=e.providers,!iN.some(e=>!!t[e.resolverKey]))return{};let i=await iD(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return iN.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function iD(e,t){var r;return t?e.command===eB.apps&&iy(e.flags)?await rX(e.flags??{}):t.device:e.command===eB.open||iy(e.flags)||(r=e).command===eB.record&&"start"===(r.positionals?.[0]??"").toLowerCase()?await rX(e.flags??{}):void 0}async function ik(e){let t=[];for(let r of iN)await r.appendWrapper(e,t);return t}function iP(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 iR=e=>"macos"!==e.platform,iO=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,iT=e=>"macos"===e.platform?"macOS automation has no multi-touch input — this gesture is supported on Android and the iOS simulator only.":"ios"===e.platform&&"tv"===e.target?"tvOS has no touch input — this gesture is supported on Android and the iOS simulator only.":"ios"===e.platform&&"device"===e.kind?"Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices.":void 0,iL={device:!0},i$={},iF={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},iU={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:iR},iG={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,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:i$,supports:e=>"android"===e.platform||iO(e),unsupportedHint:iT},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:e=>"android"===e.platform||iO(e),unsupportedHint:iT},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:e=>"android"===e.platform||iO(e),unsupportedHint:iT},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:iR},open:iF,close:iF,reinstall:iU,install:iU,"install-from-source":iU,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:iR},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL,supports:e=>"android"===e.platform||"linux"===e.platform||"macos"===e.platform||"simulator"===e.kind},keyboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},fill:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},snapshot:iF,diff:iF,screenshot:iF,wait:iF,get:iF,find:iF,is:iF,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL,supports:iR},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:iR},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},scroll:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iL},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i$,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:i$},type:iF};function iq(e,t){let r=iG[e];if(!r)return!0;let n=rG(t.platform)?r.apple:"linux"===t.platform?r.linux:r.android;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}let iV="agent-device-macos-helper",ij="AGENT_DEVICE_MACOS_HELPER_BIN",iB=n.join(u.homedir(),".agent-device","macos-helper","current"),iH=n.join(iB,"manifest.json"),iK=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function iW(e){let t=e.trim();if(!iK.test(t))throw new L("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function iz(e,t){t.bundleId&&e.push("--bundle-id",iW(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iJ(){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 iX(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 iX(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function iZ(e){let t=await iX(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 no("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 iY(){try{let e=JSON.parse(await o.readFile(iH,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function iQ(){let e=await G(process.env[ij],ij);if(e)return e;let t=iJ(),r=await iZ(t),i=n.join(iB,iV);try{if(await iY()===r)return await o.access(i),i}catch{}let a=n.join(iJ(),".build","release",iV);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await no("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await o.mkdir(iB,{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(iH,`${JSON.stringify({fingerprint:r},null,2)}
|
|
7
|
+
`,"utf8"),i}async function i0(){let e=process.env[ij]?.trim();if(e){let t=await G(e,ij);if(t)return t}if(na())return iV;if("darwin"!==process.platform)throw new L("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await iQ()}async function i1(e){let t={allowFailure:!0,timeoutMs:3e4},r=nn().macosHelper,n=r?iV:await i0(),i=r?await r.run(e,t):await no(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 i2(){return await i1(["app","frontmost"])}async function i3(e){return await i1(["app","quit","--bundle-id",iW(e)])}async function i4(e,t){return await i1(["permission",e,t])}async function i5(e,t={}){let r=["alert",e];return iz(r,t),await i1(r)}async function i8(e,t={}){let r=["snapshot","--surface",e];return iz(r,t),await i1(r)}async function i6(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return iz(n,r),await i1(n)}async function i9(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return iz(n,r),await i1(n)}async function i7(e,t={}){let r=["screenshot","--out",e];return iz(r,t),t.fullscreen&&r.push("--fullscreen"),await i1(r)}let ae={"push button":"Button","toggle button":"Button","push button menu":"Button",label:"StaticText",static:"StaticText",caption:"StaticText",text:"TextField",entry:"TextField","password text":"TextField","spin button":"TextField",terminal:"TextArea","document text":"TextArea",paragraph:"TextArea",frame:"Window",window:"Window",dialog:"Dialog",alert:"Alert","file chooser":"Dialog","color chooser":"Dialog","font chooser":"Dialog",panel:"Group",filler:"Group",section:"Group",form:"Group",grouping:"Group","layered pane":"Group","glass pane":"Group","root pane":"Group","option pane":"Group","internal frame":"Group","desktop frame":"Group","block quote":"Group",article:"Group",comment:"Group",landmark:"Group",log:"Group",marquee:"Group",math:"Group",notification:"Group","content deletion":"Group","content insertion":"Group",mark:"Group",suggestion:"Group","scroll pane":"ScrollArea","scroll bar":"ScrollBar","menu bar":"MenuBar",menu:"Menu","popup menu":"Menu","menu item":"MenuItem","check menu item":"MenuItem","radio menu item":"MenuItem","tearoff menu item":"MenuItem","check box":"CheckBox","radio button":"RadioButton",switch:"Switch","combo box":"ComboBox","page tab":"Tab","page tab list":"TabList",table:"Table","tree table":"Table","table cell":"Cell","table row":"Row","table column header":"Cell","table row header":"Cell","column header":"Cell","row header":"Cell",list:"List","list item":"ListItem","list box":"List",tree:"Tree","tree item":"TreeItem","description list":"List","description term":"ListItem","description value":"ListItem","tool bar":"Toolbar","status bar":"StatusBar","info bar":"StatusBar",slider:"Slider","progress bar":"ProgressBar","level bar":"ProgressBar",image:"Image",icon:"Image",animation:"Image",canvas:"Image","drawing area":"Image",video:"Video",audio:"Audio",link:"Link",hyperlink:"Link",separator:"Separator",application:"Application","tool tip":"Tooltip",timer:"Timer",heading:"Heading",footnote:"Footnote","title bar":"TitleBar","date editor":"DateEditor",rating:"Slider"},at={runCommand:U,whichCommand:q,desktop:ao(U,q),clipboard:as(U,q),screenshot:al(U,q)},ar=r4(at,function(e={}){let t={...at,...e};return{...t,desktop:e.desktop??ao(t.runCommand,t.whichCommand),clipboard:e.clipboard??as(t.runCommand,t.whichCommand),screenshot:e.screenshot??al(t.runCommand,t.whichCommand)}});function an(e){return ar.resolve(e)}async function ai(e,t){return await ar.run(e,t)}async function aa(e,t,r){return await an().runCommand(e,t,r)}function ao(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 eU(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 as(e,t){return{async readText(){let r=ac[await am(t,ad)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=ap[await am(t,ad)](r);await e(n.cmd,n.args,n.options)}}}function al(e,t){return{async capture(r){let n=af[await am(t,au)](r);await e(n.cmd,n.args,n.options)}}}let ad={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."},au={wayland:[{tool:"grim",command:"grim"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],x11:[{tool:"scrot",command:"scrot"},{tool:"import",command:"import"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],waylandError:"grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.",x11Error:"scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager."},ac={"wl-clipboard":{cmd:"wl-paste",args:["--no-newline"],options:{allowFailure:!0,timeoutMs:5e3}},xclip:{cmd:"xclip",args:["-selection","clipboard","-o"],options:{allowFailure:!0,timeoutMs:5e3}},xsel:{cmd:"xsel",args:["--clipboard","--output"],options:{allowFailure:!0,timeoutMs:5e3}}},ap={"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}})},af={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 am(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 ah="atspi-dump.py",aw=null;async function ag(e,t={}){let r,a=an().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 an().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(aw)return aw;let e=n.dirname(l(import.meta.url));for(let t=0;t<5;t++){let r=n.join(e,"src","platforms","linux",ah);if(i.existsSync(r))return aw=r,r;if(0===t){let t=n.join(e,ah);if(i.existsSync(t))return aw=t,t}e=n.dirname(e)}throw new L("TOOL_MISSING",`Cannot find ${ah}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(d)],c=await aa("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=ae[t=e.role.toLowerCase().trim()])||t.split(/[\s_-]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(""),role:e.role,label:e.label??void 0,value:e.value??void 0,rect:e.rect??void 0,enabled:e.enabled??void 0,selected:e.selected??void 0,hittable:e.hittable??void 0,depth:e.depth,parentIndex:e.parentIndex??void 0,pid:e.pid??void 0,appName:e.appName??void 0,windowTitle:e.windowTitle??void 0}}),truncated:r.truncated,surface:e}}async function ay(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 ag(t);return{nodes:r.nodes,truncated:r.truncated}}async function av(e,t,r){let{nodes:n}=await ay(r);for(let r of n.filter(r=>{let n=r.rect;return!!n&&e>=n.x&&t>=n.y&&e<=n.x+n.width&&t<=n.y+n.height}).sort((e,t)=>{let r=e.depth??0,n=t.depth??0;return r!==n?n-r:aS(e.rect)-aS(t.rect)})){let e=function(e){for(let t of[e.value,e.label,e.identifier])if("string"==typeof t&&t.length>0)return t;return""}(r);if(e.trim())return e}return""}function aS(e){return(e?.width??0)*(e?.height??0)}let a_=[250,400,600];function aI(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?aN(r?.nodes??[]):void 0,routeComparable:n}}function ab(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 aA(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function ax(e){return"press"===e||"click"===e||"back"===e||"open"===e}function aN(e){return e.map(e=>[e.depth??0,e.type??"",e.role??"",e.label??"",e.value??"",e.identifier??"",!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].join("|"))}function aM(e,t,r,n,i){return{requestId:i??b().requestId,appBundleId:r,activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotCompact:t?.snapshotCompact,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...S(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:nN(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function aE(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!aO(r))return;let s=function(e){if("click"===e||"press"===e)return"press"}(n);if(!s||!(2===(t=i).length&&t.every(e=>Number.isFinite(Number(e)))))return;let l=aC(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:aP(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function aD(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function ak(e){var t,r;let{session:n,pending:i,snapshot:a}=e,o=(t=i.preSignature,r=aC(a.nodes),0===t.length||0===r.length?"ambiguous":aR(t,r)?"unchanged":"changed");if("unchanged"!==o||i.attemptsRemaining<=0)return{retried:!1,change:o};let s=Date.now();return i.attemptsRemaining-=1,await n7(n.device,i.command,i.positionals,i.flags?.out,{...aM(e.logPath,i.flags,n.appBundleId,n.trace?.outPath),surface:n.surface}),N({level:"info",phase:"interaction_no_change_retry",data:{action:i.action,attemptsRemaining:i.attemptsRemaining,durationMs:Date.now()-s}}),{retried:!0,change:o}}function aP(e){if(!e?.interactionOutcome)return e;let{interactionOutcome:t,...r}=e;return r}function aC(e){let t=new Map,r=[];for(let n of e){let e=function(e,t){var r,n;if(!e.rect||!([(r=e.rect).x,r.y,r.width,r.height].every(e=>Number.isFinite(e))&&r.width>0&&r.height>0)||(n=e,`${n.label??""} ${n.identifier??""}`.toLowerCase().includes("scroll bar")))return;let i=function(e){let t=[e.identifier,e.label,e.value,e.type,e.role,!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].map(e=>"string"==typeof e?e.trim():"").join("|");return t.replaceAll("|","")?t:void 0}(e);if(!i)return;let a=t.get(i)??0;return t.set(i,a+1),{key:`${i}|#${a}`,x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height)}}(n,t);e&&r.push(e)}return r}function aR(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r+=1){let n=e[r],i=t[r];if(!n||!i||n.key!==i.key||Math.abs(n.x-i.x)>1||Math.abs(n.y-i.y)>1||Math.abs(n.width-i.width)>1||Math.abs(n.height-i.height)>1)return!1}return!0}function aO(e){return"ios"===e.device.platform||"android"===e.device.platform}function aT(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function aL(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!a$(t.device.platform)||!n)return await r();let i=Date.now(),a=1,o=await r(),s=aC(o.nodes);for(;Date.now()-i<1500;){await eU(200),a+=1;let e=await r(),l=aC(e.nodes);if(aR(s,l))return aT(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 aT(t),N({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function a$(e){return"ios"===e||"android"===e}let aF=["x","y","width","height"],aU=new WeakMap;function aG(e,t){if(!e[t])return[];let r=aj(e)[t]??t+1;return e.slice(t+1,r)}function aq(e,t,r){let n=aj(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function aV(e,t,r){let n=aj(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function aj(e){let t=aU.get(e);if(t)return t;let r=Array(e.length),n=[];for(let[t,i]of e.entries()){let e=i?.depth??0;for(;n.length>0&&e<=n[n.length-1].depth;)r[n.pop().position]=t;n.push({depth:e,position:t})}for(let t of n)r[t.position]=e.length;return aU.set(e,r),r}function aB(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 aH(e,t){let r=ez(e.type??""),n=e.label?.trim();return!!(aK(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function aK(e){return"button"===ez(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function aW(e){let t=ez(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function az(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function aJ(e,t){return!!e&&!!t&&aF.every(r=>.5>=Math.abs(e[r]-t[r]))}function aX(e){let t;for(let i of e){var r,n;let e=ez(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||aZ(r)>aZ(n)))&&(t=i.rect)}return t}function aZ(e){return e?e.width*e.height:0}function aY(e){let t=ez(e.type??"");return"scrollview"===t||"scrollarea"===t}function aQ(e,t){return!0===e||!!t||void 0}function a0(e,t,r,n){aV(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=ez(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function a1(e,t,r,n){aV(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=ez((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function a2(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===ez(n.type??"")&&t(n,i,r)}}function a3(e,t,r,n){for(let i of e)(aH(i,t)||n&&a5(i,n))&&r.add(i.index)}function a4(e,t,r){if("button"!==ez(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&aJ(e.rect,t.rect)}function a5(e,t){return"button"===ez(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&aJ(e.rect,t.rect)}let a8=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=aX(e),n=r?r.y+r.height:null;if(null!==n)for(let r=0;r<e.length;r+=1){var i,a;let o=e[r];o&&(i=o,a=n,i.rect&&"keyboard"===ez(i.type??"")&&i.rect.y>=a)&&(t.add(o.index),function(e,t,r,n){let i=new Map(t.map(e=>[e.index,e])),a="number"==typeof e.parentIndex?i.get(e.parentIndex):void 0;for(;a?.rect&&a.rect.y>=n;)r.add(a.index),a="number"==typeof a.parentIndex?i.get(a.parentIndex):void 0}(o,e,t,n),aV(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==ez(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&&eI(t))})(r)&&function(e,t,r){var n,i,a,o;aW(e.type)||r.suppressedIndexes.add(e.index);let s=eN(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&aW(e.type)?e:null)??aB(e,t,e=>aW(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,az(n.replacements,i,{rect:function(e,t){if(e&&t&&!(t.height<=0)&&!(t.height>=e.height)&&!(t.y<e.y)&&!(t.y>e.y+e.height))return{...e,y:t.y,height:Math.min(t.height,e.y+e.height-t.y)}}(i.rect,a.rect)??i.rect,hiddenContentAbove:aQ(i.hiddenContentAbove,o.above),hiddenContentBelow:aQ(i.hiddenContentBelow,o.below)}))}(r,s,t);(function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r];if(!n||"searchfield"!==ez(n.type??""))continue;if("Search"===n.label){a1(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=aq(e,r,e=>"searchfield"===ez(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),a1(e,r,i.index,t))}})(e,o),r=e,n=o,a2(r,(e,t,i)=>{aq(r,i,r=>{let n;return("button"===(n=ez(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(aJ(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=ez(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,a2(i,(e,t,r)=>{let n;eD(e)&&eb(e,(n=[],aV(i,r,e=>{n.push(e)}),n))&&a.add(e.index)}),function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();!(!n||t.has(n.index))&&i&&function(e,t,r,n,i){let a=ez(r.type??"");if("statictext"===a||"link"===a)return a0(e,t,n,i);if("other"===a){if(function(e,t,r){return!!aq(e,t,e=>{let t=ez(e.type??"");return("link"===t||"searchfield"===t||aW(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);a0(e,t,n,i)}}(e,r,n,i,t)}}(e,o)},function(e,t){let r=new Map(e.map(e=>[e.index,e])),n=aX(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==ez(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)||!aB(e,t,aY)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=aZ(e),i=aZ(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&az(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=ez(r.type??"");if("button"===a)return a3(aG(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=aG(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==ez(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=>a4(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&az(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&&(a4(a,t,r)||a5(a,t)||function(e,t){if("switch"!==ez(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||aH(a,r))&&i.add(a.index)}(e,t,r,i,n.suppressedIndexes),!0}(o,r,n,i)&&function(e,t,r,n){let i=e.find(e=>a4(e,t,r));if(!i){e.some(aK)&&a3(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&az(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),a3(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function a6(e){if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return{snapshot:await aL({session:e.session,capture:async()=>(await on(e)).snapshot})};let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!aO(e)||Date.now()-t.markedAt>3e4?void aD(e):t}(e.session);if(t&&e.session)return await a9({...e,session:e.session},t);let r=ab(e.session);if(r&&"android"===e.device.platform)return await oe(e,r);let n=await a7(e);return aA(e.session),{snapshot:oo(n,oi(e)),analysis:n.analysis,androidSnapshot:n.androidSnapshot}}async function a9(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await or(e),l=await ak({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await or(e),l=await ak({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(aD(i),"ambiguous"!==l.change&&s.freshness?.staleAfterRetries!==!0&&aA(i),"unchanged"===l.change)?N({level:"warn",phase:"interaction_settle_timeout",data:{action:(r={pending:t,attempts:o,startedAt:a}).pending.action,attempts:r.attempts,durationMs:Date.now()-r.startedAt}}):N({level:(n={pending:t,change:l.change,attempts:o,startedAt:a}).attempts>0?"info":"debug",phase:"interaction_settled",data:{action:n.pending.action,change:n.change,attempts:n.attempts,durationMs:Date.now()-n.startedAt}}),{snapshot:s.snapshot,analysis:s.data.analysis,androidSnapshot:s.data.androidSnapshot,freshness:s.freshness}}async function a7(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await ay(r?.surface);return os({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?os(await i8(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await n7(t,"snapshot",[],i,{...aM(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath)})}async function oe(e,t){let r=await ot(e,t);return{snapshot:r.snapshot,analysis:r.data.analysis,androidSnapshot:r.data.androidSnapshot,freshness:r.freshness}}async function ot(e,t){let r=await on(e),n=oa(r,t,e),i=0,a=t.markedAt+1500;for(let o of a_){if(!n)break;let s=a-Date.now();if(s<=0)break;await eU(Math.min(o,s)),r=await on(e),i+=1,n=oa(r,t,e)}return n||aA(e.session),{...r,freshness:i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0}}async function or(e){let t=ab(e.session);return t&&"android"===e.device.platform?await ot(e,t):await on(e)}async function on(e){let t=await a7(e);return{data:t,snapshot:oo(t,oi(e))}}function oi(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function oa(e,t,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&&ax(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=aN(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 oo(e,t){var r,n,i,a;let o=e?.nodes??[],s=eE(t?.snapshotRaw?o:eJ(o)),l=t?.snapshotScope&&e?.backend!=="macos-helper"?ol(s,t.snapshotScope):s;return{nodes:e3((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 a8)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:e1(eY(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&a?.snapshotCompact!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function os(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=ol(i,t.snapshotScope)),t.snapshotInteractiveOnly&&(i=function(e){if(0===e.length)return e;let t=new Map;for(let 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:od(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=od(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function ol(e,t){let r=eX(e3(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 od(a,i)}function od(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 ou(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return im("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=eQ(e.trim());if(!n)return im("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=e0(e.nodes,n);if(r=t?eZ(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:im("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function oc(e,t){e.snapshot=t,e.snapshotScopeSource=void 0}function op(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 of(e){let{session:t,sessionName:r,outPath:i,outputPlacement:a,dispatchContext:s}=e,l=eP({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?om(await n7(t.device,"screenshot",[],i,o)):om(await n7(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:op({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eT()});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 om(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function oh(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function ow(e,t){let r=Math.max(24,Math.round(.2*Math.min(e.size,t.size))),n=Math.max(48,Math.round(.15*Math.min(e.crossSize,t.crossSize)));return Math.abs(e.size-t.size)<=r&&Math.abs(e.crossSize-t.crossSize)<=n}function og(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let oy=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function ov(e,t={}){let r=e6(e,t.helperAdb).exec;return(await oI(e,t,r)).xml}async function oS(e,t={}){let r=e6(e,t.helperAdb).exec,n=await oI(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=e7(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 oC(e,o.nodes,i,r),o.nodes),{...o,androidSnapshot:n.metadata}}let o=tt(i),s=to(o,800,t);a&&await o_({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:l,...d}=s;return{...d,androidSnapshot:n.metadata}}async function o_(e){if(oO(e.interactiveSnapshot.nodes).size>0||oR(e.xml))return;let t=to(e.tree,800,{...e.options,interactiveOnly:!1}),r=await oC(e.device,t.nodes,e.xml,e.adb);oG(r,t,e.interactiveSnapshot),0===r.size&&oG(ex(e3(t.nodes)),t,e.interactiveSnapshot)}async function oI(e,t,r){let n=await x("android_snapshot_helper_artifact_resolution",async()=>await ok(t.helperArtifact));return n.artifact?await ob(e,t,r,n.artifact):(N({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await oP(e,n.fallbackReason,r))}async function ob(e,t,r,n){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),d=e6(e,t.helperAdb);try{let e=await oA(t,r,d,n,l);return e.installed&&await ts(l),a=await ox(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 oN({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function oA(e,t,r,n,i){let a=await x("android_snapshot_helper_install",async()=>await te({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 ox(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 tn(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){N({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:T(e).message}}),await oM(t,n.manifest.packageName)}return await x("android_snapshot_helper_capture",async()=>await tr(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function oN(e){let t=function(e){var t;let r=T(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=oD(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=oE(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=oE(e.error);return N({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await ts(e.helperDeviceKey),await oM(e.adb,e.artifact.manifest.packageName),ta({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oP(e.device,r,e.adb)}async function oM(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await eU(150),N({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){N({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:T(e).message}})}}function oE(e){let t=T(e),r=oD(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 oD(e){if(!e||"object"!=typeof e||!("message"in e))return;let t=String(e.message).trim();return t&&"null"!==t?t:void 0}async function ok(e){if(e)return{artifact:e};let t=e5(),r=n.join(e8(),"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=ti(JSON.parse(await h.readFile(i,"utf8"))),t=n.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await h.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:T(e).message}}}async function oP(e,t,r){let n;try{n=await x("android_snapshot_stock_capture",async()=>await oT(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new L(R((r=T(i)).code),`${r.message} Android snapshot helper failed before stock fallback: ${a}`,{...r.details,androidSnapshotHelperFallbackReason:a,...r.hint?{hint:r.hint}:{}},i)}throw e}return{xml:n,metadata:{backend:"uiautomator-dump",...t?{fallbackReason:t}:{}}}}async function oC(e,t,r,n){if(!t.some(e=>e4(e.type)))return new Map;let i=oO(t);if(i.size>0||oR(r))return i;let a=await oU(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(e4(e.className)){let r=function(e){let t=e.children[0];if(!t)return null;let r=Math.max(t.rect.height,...t.children.map(e=>e.rect.y+e.rect.height)),n=t.children.filter(e=>e.rect.height>0).map(t=>og(t.rect,e.rect)).sort((e,t)=>e.start-t.start);return 0===n.length?null:{rect:e.rect,contentExtent:r,contentBlocks:n}}(e);r&&t.push(r)}r.push(...e.children)}return t}(r);if(0===n.length)return new Map;let i=new Map;for(let t of e){if(!t.rect||!e4(t.type))continue;let r=function(e,t){let r=null,n=1/0;for(let i of t){let t=Math.abs(i.rect.width-e.width)+Math.abs(i.rect.height-e.height);if(t>32)continue;let a=4*t+(Math.abs(i.rect.x-e.x)+Math.abs(i.rect.y-e.y));a<n&&(r=i,n=a)}return r}(t.rect,n);if(!r)continue;let a=function(e,t){let r=function(e,t){let r=t,n=new Set;for(;!n.has(r.index);){var i,a;n.add(r.index);let o=e.filter(e=>e.parentIndex===r.index&&e.rect);if(1!==o.length)return r;let s=o[0];if(i=s.rect,a=t.rect,i.x!==a.x||i.y!==a.y||i.width!==a.width||i.height!==a.height)return r;r=s}return t}(e,t);return e.filter(e=>e.parentIndex===r.index&&e.rect).map(e=>e.rect).filter(e=>e.height>0).sort((e,t)=>e.y-t.y).map(e=>og(e,t.rect))}(e,t),o=function(e){let{viewportRect:t,visibleBlocks:r,nativeScrollView:n}=e;if(0===r.length||0===n.contentBlocks.length)return null;let i=function(e){if(0===e.contentBlocks.length)return null;let t=e.contentBlocks[0],r=e.contentBlocks[e.contentBlocks.length-1];if(!t||!r)return null;let n=oh(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(!ow(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(!ow(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?oh(o):a.length>0?oh(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 oR(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function oO(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 oT(e,t=e9(e)){try{return await et(()=>oL(t),{shouldRetry:oF})}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 oL(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
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
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 oF(e){if(!(e instanceof L)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return oy.some(e=>r.includes(e))}async function oU(e,t=e9(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 oG(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 oq=/\bis(?:n(?:'|'|')?t| not)\s+responding\b/i,oV=/^close app$/i,oj="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function oB(e){let{session:t}=e;if("android"!==t.device.platform||!t.recording)return"absent";try{let e=await oX(t),r=oY(e);if(!r?.rect)return"absent";let n=await oZ(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 oQ(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 o0(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 oH(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 oK(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 oz({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 oz({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${oJ(a)}. Automatic recovery failed.`,hint:oj})}throw oz({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${oJ(a)}.`,hint:oj})}async function oK(e){try{return await oW(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 oW(e){if(!e.appBundleId)return!1;let t=oY(await oX(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await oZ(e,t);if(!r.ok)return!1;await ei(e.device,e.appBundleId);let n=await o0(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 oz(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 oJ(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function oX(e){return e3(eJ((await oS(e.device,{interactiveOnly:!1,compact:!1})).nodes))}async function oZ(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=e2(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 oY(e,t={}){if(!1===t.requireDialogSignal||o3(e))return e.find(e=>o2(e).some(e=>oV.test(e))&&e.rect)}async function oQ(e){for(let t=0;t<12;t+=1){if(!o3(await oX(e)))return!0;await eU(500)}return!o3(await oX(e))}async function o0(e,t,r={}){for(let n=0;n<12;n+=1){if(await o1(e,t,r))return!0;await eU(500)}return await o1(e,t,r)}async function o1(e,t,r){return!(r.requireNoBlockingDialog&&await ee(e.device))&&(await ec(e.device)).package===t}function o2(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 o3(e){return e.some(e=>{let t=o2(e).join(" ").trim();return t.length>0&&oq.test(t)})}function o4(e){return!!(e&&e.width>0&&e.height>0)}function o5(e){return e.width*e.height}function o8(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 o6=[255,59,48,255],o9=[255,214,10,255],o7=[0,0,0,255],se=["scroll","list","recyclerview","edittext","textfield"],st=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],sr={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 sn(e){let t=eL(await o.readFile(e.screenshotPath),"screenshot"),r=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)so(r)&&o4(r.rect)&&(!t||o5(r.rect)>o5(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&&o4(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 o4(e.rect)&&!("image"===ez((t=e).type??"")&&!sl(t.label))}))}(e.nodes),a=new Map;for(let n of e.nodes){var o,s;if(!function(e,t,r){let n=[r.label,r.value].some(sd)||su(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!o4(r.rect)||so(r))return!1;let n=ez(r.type??"");return!(se.some(e=>n.includes(e))||t&&o5(r.rect)>.25*o5(t))}(e,t,r)||(sa(r)?n:n&&function(e){let t=ez(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 sa(e)&&!so(e)}(s=n)?s:null,eW(o,s,e=>(function(e){return sa(e)&&!so(e)})(e)),s.hittable?s:null,eW(o,s,e=>!0===e.hittable)].find(ss)??null);if(!l?.rect||!o4(l.rect))continue;let d=function(e,t,r){let n=sc(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=sc(n);if(!i)continue;let a=function(e){let t=0;return ez(e.type??"").includes("text")&&(t+=2),sd(e.label)&&(t+=2),sd(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||sc(t)}(n,l,e.nodes),u=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),sa(t)&&(n+=3),sa(e)&&(n+=2),r&&(n+=2),su(t.identifier)&&(n+=1),sl(t.value)&&(n+=1),n}(n,l,d),c=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=sa,i=e=>!!sc(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=ez(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&o4(t.rect)&&o8(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=si(e,i,c,t,r);if(!o4(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,t,r,n,i){let a=ev(e.nodes).primaryAction;if(!a?.ref||!a.rect||!o4(a.rect))return;let o=si(e,t,a.rect,n,i);if(!o4(o))return;let s={ref:a.ref,label:a.label,rect:a.rect,overlayRect:o,score:100},l=r.get(a.ref);r.set(a.ref,l?{...l,score:Math.max(l.score,s.score)}:s)}(e,i,a,t,r),(function(e){let t=[];for(let r of e.sort((e,t)=>o5(e.overlayRect)-o5(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(o8(e.overlayRect,r.overlayRect)||o8(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}o5(r.overlayRect)<o5(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(sy).slice(0,n.maxRefs??24).sort(sg).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:e2(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)sm(e,t.x,t.x+t.width-1,t.y+n,r),sm(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),sh(e,t.x+n,t.y,t.y+t.height-1,r),sh(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(n=t,(i=e).overlayRect,o6),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=sf(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:sf(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)sw(e,t+o,r+a,i)})(e,i,o,n,o9),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=sr[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]&&sw(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,o7)}(n,i.overlayRect,i.ref)}return await o.writeFile(e.screenshotPath,eC.sync.write(t)),r}function si(e,t,r,n,i){if("android"===e.backend||!t)return sp(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 sp({x:Math.round((r.x-t.x)*a),y:Math.round((r.y-t.y)*o),width:Math.max(1,Math.round(r.width*a)),height:Math.max(1,Math.round(r.height*o))},n,i)}function sa(e){let t=[e.type,e.role,e.subrole].map(e=>ez(e??"")).join(" ");return st.some(e=>t.includes(e))}function so(e){let t=[e.type,e.role,e.subrole].map(e=>ez(e??"")).join(" ");return t.includes("application")||t.includes("window")}function ss(e){return!!(e?.rect&&o4(e.rect)&&!so(e))}function sl(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function sd(e){var t;let r;return!!sl(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function su(e){var t;return"string"==typeof e&&!!sd(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function sc(e){let t=[e.label,e.value].find(sd);return t?t.trim():su(e.identifier)?e.identifier.trim():void 0}function sp(e,t,r){let n=sf(e.x,0,Math.max(0,t-1)),i=sf(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:sf(e.width,1,a),height:sf(e.height,1,o)}}function sf(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function sm(e,t,r,n,i){for(let a=t;a<=r;a+=1)sw(e,a,n,i)}function sh(e,t,r,n,i){for(let a=r;a<=n;a+=1)sw(e,t,a,i)}function sw(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 sg(e,t){var r,n;let i=e.overlayRect.y-t.overlayRect.y;if(0!==i)return i;let a=e.overlayRect.x-t.overlayRect.x;return 0!==a?a:(r=e.ref,n=t.ref,Number.parseInt(r.replace(/^\D+/,""),10)-Number.parseInt(n.replace(/^\D+/,""),10))}function sy(e,t){return t.score!==e.score?t.score-e.score:sg(e,t)}function sv(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 sS=new WeakMap;function s_(e){if(!e)return;let t=sS.get(e);if(t)return t;let r=sI(e.nodes??[]);if(r)return sS.set(e,r),r}let sI=eO,sA={referenceWidth:1e3,referenceHeight:1e3};function sb(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??{}},_=sk(S.effectiveDurationMs)??sk(S.durationMs),I={recordingStartedAt:v.startedAt,gestureClockOriginAtMs:v.gestureClockOriginAtMs,gestureClockOriginUptimeMs:v.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===v.platform?v.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:sk(S.gestureStartUptimeMs),gestureEndUptimeMs:sk(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},A="number"==typeof(s={gestureStartUptimeMs:sk(S.gestureStartUptimeMs),gestureEndUptimeMs:sk(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===sk(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sR(sk(t.count),1)??1,r=!0===t.doubleTap,n=sR(sk(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 sv(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...I,gestureDurationMs:A}):sv(I),x=(l=e.snapshot,w=sk((d=S).referenceWidth),g=sk(d.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:s_(l)),M=(u=t,c=r,p=S,f=b,m=A,h=x,y=sx[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 sx={click:(e,t,r,n,i)=>sN(e,t,r,i),press:(e,t,r,n,i)=>sN(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?sN(e,t,r,i):[],fill:(e,t,r,n,i)=>sM(e,t,r,i),focus:(e,t,r,n,i)=>sM(e,t,r,i),longpress:function(e,t,r,n,i){let a=sO(t,e);if(!a)return[];let{x:o,y:s}=a;return[sC(r,o,s,s$(n,[sk(t.durationMs),sk(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sT(t,e),o=sP(t.contentDirection)??sP(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:u}=a,c=s$(n,[],250),p=sk(t.amount)??sk(e[1]),f=sk(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:sE,fling:sE,swipe:sE,pinch:function(e,t,r,n,i){let a=sO(t,e,1),o=sk(t.scale)??sk(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:s$(n,[],280)}]}};function sN(e,t,r,n){let i=sO(t,e);if(!i)return[];let{x:a,y:o}=i,s=sR(sk(t.count),1)??1,l=sR(sk(t.intervalMs),0)??0,d=!0===t.doubleTap,u=sR(sk(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(sC(t,a,o,u,n));continue}c.push(sD(t,a,o,n)),d&&c.push(sD(t+90,a,o,n))}return c}function sM(e,t,r,n){let i=sO(t,e);if(!i)return[];let{x:a,y:o}=i;return[sD(r,a,o,n)]}function sE(e,t,r,n,i){let a=sT(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,u=s$(n,[sk(t.effectiveDurationMs),sk(t.durationMs),sk(e[4])],250),c=sR(sk(t.count),1)??1,p=sR(sk(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 sD(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sC(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sP(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 sk(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 sR(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sO(e,t,r=0){let n=sk(e.x)??sk(t[r]),i=sk(e.y)??sk(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function sT(e,t){let r=sL(e.x1,e.x,t[0]),n=sL(e.y1,e.y,t[1]),i=sL(e.x2,t[2]),a=sL(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 sL(...e){return e.map(sk).find(e=>void 0!==e)}function s$(e,t,r){return sR(e,1)??t.map(e=>sR(e,1)).find(e=>void 0!==e)??r}let sF={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sU(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?sF[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:eK}}(m);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:S,dispatchRequest:_,recordedCommand:I}=v,A=await sq(h,S);if(A)return A;let b=await sG(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])?[tH.expandHome(d,i),...n.slice(1)]:n),p=(c=(a=r.flags?.out,o=r.meta?.cwd,a?tH.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},P=await sV({session:h,sessionName:e.sessionName,logPath:w,command:S,request:_,positionals:x,out:N,dispatchContext:C}),k=await sG(h,S,"after-command");if("response"in k)return k.response;"status"in b&&"recovered"===b.status&&(!P||"object"==typeof P)&&((P??={}).warning=b.warning);let R=Date.now(),O=I===S?M:m.positionals??[],T=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=s_(e.snapshot),a={...n??{}},o=sP(a.direction)??sP(r[0]);if(!o)return n;let s=sk(a.amount)??sk(r[1]),l=sk(a.pixels),d=sT(a,[]),u=sk(a.referenceWidth),c=sk(a.referenceHeight),p=void 0!==u&&u>0&&void 0!==c&&c>0?{referenceWidth:u,referenceHeight:c}:i??sA;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=e$({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);sb(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:O,recordedFlags:T,data:P,actionStartedAt:D,actionFinishedAt:R,flags:m.flags??{}}),ax(S)&&aI(h,S),a$(h.device.platform)&&("swipe"===(l=S)||"scroll"===l)&&(h.postGestureStabilization={action:S,markedAt:Date.now()}),{ok:!0,data:P??{}}}async function sG(e,t,r="before-command"){if("android"!==e.device.platform||!eH.androidBlockingDialogGuardedAction.has(t))return{status:"clear"};try{return await oH({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:T(e)}}}}async function sq(e,t){if(!iq(t,e.device)){var r;let n=(r=e.device,iG[t]?.unsupportedHint?.(r));return{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:`${t} is not supported on this device`,...n?{hint:n}:{}}}}return"android"===e.device.platform&&e.recording&&"record"!==t&&await oB({session:e})==="failed"?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function sV(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await n7(r.device,n,a,o,{...s});let l=await of({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 sj(r,l,e.logPath),l}async function sj(e,t,r){let n={snapshotInteractiveOnly:!0,snapshotCompact:!0},i=oo(await a7({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);oc(e,i);let a=await sn({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let sB=s5(()=>import("./lease.js")),sH=s5(()=>import("./session.js").then(e=>e.session_namespaceObject)),sK=s5(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),sW=s5(()=>import("./react-native.js")),sz=s5(()=>import("./record-trace.js").then(e=>e.record_trace_namespaceObject)),sJ=s5(()=>import("./find.js")),sX=s5(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function sZ(e){let{command:t}=e.req;return eH.leaseHandler.has(t)?await sY(e):eH.sessionHandler.has(t)?await sQ(e):eH.snapshot.has(t)?await s0(e):eH.reactNativeHandler.has(t)?await s1(e):eH.recordTraceHandler.has(t)?await s2(e):eH.findHandler.has(t)?await s3(e):eH.interactionHandler.has(t)?await s4(e):null}async function sY(e){let{handleLeaseCommands:t}=await sB();return s8(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function sQ(e){let{handleSessionCommands:t}=await sH();return s8(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 s0(e){let{handleSnapshotCommands:t}=await sK();return s8(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function s1(e){let{handleReactNativeCommands:t}=await sW();return s8(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function s2(e){let{handleRecordTraceCommands:t}=await sz();return s8(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function s3(e){let{handleFindCommands:t}=await sJ();return s8(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function s4(e){let{handleInteractionCommands:t}=await sX();return s8(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function s5(e){let t;return()=>t??=e()}function s8(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 s6=new m;async function s9(e,t,r){let n=s6.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>s6.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function s7(e,t){if(!t)return[];let r=[],n=e.device,i=rU(t.platform);if(i&&!rq(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 le(e){return`${function(e){switch(e){case"iosSimulatorDeviceSet":return"--ios-simulator-device-set";case"androidDeviceAllowlist":return"--android-device-allowlist";default:return`--${e}`}}(e.key)}=${e.value}`}let lt=["target","device","udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"],lr=new Set([eB.apps,eB.devices]);function ln(e){return"string"==typeof e&&e.trim().length>0}function li(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 la=eH.selectorValidationExempt,lo=eH.leaseAdmissionExempt,ls=new Set(lo);async function ll(e){let{req:t,sessionName:r,sessionStore:n}=e,i=n.get(r);if(i)return`device:${i.device.id}`;if("open"===t.command||iy(t.flags))try{let e=await rX(t.flags??{});return`device:${e.id}`}catch{}return`session:${r}`}function ld(e,t={}){let r=Q(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function lu(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:ld(t,{simulatorSetPath:e.simulatorSetPath})}function lc(e,t,r){return ns(lu(e,t),r)}let lp="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 lf(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 lm(e){return!(e instanceof L)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lh(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 lw(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}
|
|
10
|
+
${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function oG(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 oq=/\bis(?:n(?:'|'|')?t| not)\s+responding\b/i,oV=/^close app$/i,oj="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function oB(e){let{session:t}=e;if("android"!==t.device.platform||!t.recording)return"absent";try{let e=await oX(t),r=oY(e);if(!r?.rect)return"absent";let n=await oZ(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 oQ(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 o0(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 oH(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 oK(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 oz({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 oz({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${oJ(a)}. Automatic recovery failed.`,hint:oj})}throw oz({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${oJ(a)}.`,hint:oj})}async function oK(e){try{return await oW(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 oW(e){if(!e.appBundleId)return!1;let t=oY(await oX(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await oZ(e,t);if(!r.ok)return!1;await ei(e.device,e.appBundleId);let n=await o0(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 oz(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 oJ(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function oX(e){return e3(eJ((await oS(e.device,{interactiveOnly:!1,compact:!1})).nodes))}async function oZ(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=e2(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 oY(e,t={}){if(!1===t.requireDialogSignal||o3(e))return e.find(e=>o2(e).some(e=>oV.test(e))&&e.rect)}async function oQ(e){for(let t=0;t<12;t+=1){if(!o3(await oX(e)))return!0;await eU(500)}return!o3(await oX(e))}async function o0(e,t,r={}){for(let n=0;n<12;n+=1){if(await o1(e,t,r))return!0;await eU(500)}return await o1(e,t,r)}async function o1(e,t,r){return!(r.requireNoBlockingDialog&&await ee(e.device))&&(await ec(e.device)).package===t}function o2(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 o3(e){return e.some(e=>{let t=o2(e).join(" ").trim();return t.length>0&&oq.test(t)})}function o4(e){return!!(e&&e.width>0&&e.height>0)}function o5(e){return e.width*e.height}function o8(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 o6=[255,59,48,255],o9=[255,214,10,255],o7=[0,0,0,255],se=["scroll","list","recyclerview","edittext","textfield"],st=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],sr={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 sn(e){let t=eL(await o.readFile(e.screenshotPath),"screenshot"),r=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)so(r)&&o4(r.rect)&&(!t||o5(r.rect)>o5(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&&o4(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 o4(e.rect)&&!("image"===ez((t=e).type??"")&&!sl(t.label))}))}(e.nodes),a=new Map;for(let n of e.nodes){var o,s;if(!function(e,t,r){let n=[r.label,r.value].some(sd)||su(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!o4(r.rect)||so(r))return!1;let n=ez(r.type??"");return!(se.some(e=>n.includes(e))||t&&o5(r.rect)>.25*o5(t))}(e,t,r)||(sa(r)?n:n&&function(e){let t=ez(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 sa(e)&&!so(e)}(s=n)?s:null,eW(o,s,e=>(function(e){return sa(e)&&!so(e)})(e)),s.hittable?s:null,eW(o,s,e=>!0===e.hittable)].find(ss)??null);if(!l?.rect||!o4(l.rect))continue;let d=function(e,t,r){let n=sc(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=sc(n);if(!i)continue;let a=function(e){let t=0;return ez(e.type??"").includes("text")&&(t+=2),sd(e.label)&&(t+=2),sd(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||sc(t)}(n,l,e.nodes),u=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),sa(t)&&(n+=3),sa(e)&&(n+=2),r&&(n+=2),su(t.identifier)&&(n+=1),sl(t.value)&&(n+=1),n}(n,l,d),c=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=sa,i=e=>!!sc(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=ez(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&o4(t.rect)&&o8(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=si(e,i,c,t,r);if(!o4(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,t,r,n,i){let a=ev(e.nodes).primaryAction;if(!a?.ref||!a.rect||!o4(a.rect))return;let o=si(e,t,a.rect,n,i);if(!o4(o))return;let s={ref:a.ref,label:a.label,rect:a.rect,overlayRect:o,score:100},l=r.get(a.ref);r.set(a.ref,l?{...l,score:Math.max(l.score,s.score)}:s)}(e,i,a,t,r),(function(e){let t=[];for(let r of e.sort((e,t)=>o5(e.overlayRect)-o5(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(o8(e.overlayRect,r.overlayRect)||o8(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}o5(r.overlayRect)<o5(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(sy).slice(0,n.maxRefs??24).sort(sg).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:e2(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)sm(e,t.x,t.x+t.width-1,t.y+n,r),sm(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),sh(e,t.x+n,t.y,t.y+t.height-1,r),sh(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(n=t,(i=e).overlayRect,o6),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=sf(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:sf(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)sw(e,t+o,r+a,i)})(e,i,o,n,o9),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=sr[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]&&sw(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,o7)}(n,i.overlayRect,i.ref)}return await o.writeFile(e.screenshotPath,ek.sync.write(t)),r}function si(e,t,r,n,i){if("android"===e.backend||!t)return sp(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 sp({x:Math.round((r.x-t.x)*a),y:Math.round((r.y-t.y)*o),width:Math.max(1,Math.round(r.width*a)),height:Math.max(1,Math.round(r.height*o))},n,i)}function sa(e){let t=[e.type,e.role,e.subrole].map(e=>ez(e??"")).join(" ");return st.some(e=>t.includes(e))}function so(e){let t=[e.type,e.role,e.subrole].map(e=>ez(e??"")).join(" ");return t.includes("application")||t.includes("window")}function ss(e){return!!(e?.rect&&o4(e.rect)&&!so(e))}function sl(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function sd(e){var t;let r;return!!sl(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function su(e){var t;return"string"==typeof e&&!!sd(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function sc(e){let t=[e.label,e.value].find(sd);return t?t.trim():su(e.identifier)?e.identifier.trim():void 0}function sp(e,t,r){let n=sf(e.x,0,Math.max(0,t-1)),i=sf(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:sf(e.width,1,a),height:sf(e.height,1,o)}}function sf(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function sm(e,t,r,n,i){for(let a=t;a<=r;a+=1)sw(e,a,n,i)}function sh(e,t,r,n,i){for(let a=r;a<=n;a+=1)sw(e,t,a,i)}function sw(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 sg(e,t){var r,n;let i=e.overlayRect.y-t.overlayRect.y;if(0!==i)return i;let a=e.overlayRect.x-t.overlayRect.x;return 0!==a?a:(r=e.ref,n=t.ref,Number.parseInt(r.replace(/^\D+/,""),10)-Number.parseInt(n.replace(/^\D+/,""),10))}function sy(e,t){return t.score!==e.score?t.score-e.score:sg(e,t)}function sv(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 sS=new WeakMap;function s_(e){if(!e)return;let t=sS.get(e);if(t)return t;let r=sI(e.nodes??[]);if(r)return sS.set(e,r),r}let sI=eO,sb={referenceWidth:1e3,referenceHeight:1e3};function sA(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??{}},_=sC(S.effectiveDurationMs)??sC(S.durationMs),I={recordingStartedAt:v.startedAt,gestureClockOriginAtMs:v.gestureClockOriginAtMs,gestureClockOriginUptimeMs:v.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===v.platform?v.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:sC(S.gestureStartUptimeMs),gestureEndUptimeMs:sC(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},b="number"==typeof(s={gestureStartUptimeMs:sC(S.gestureStartUptimeMs),gestureEndUptimeMs:sC(S.gestureEndUptimeMs),reportedDurationMs:_,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}).gestureStartUptimeMs&&"number"==typeof s.gestureEndUptimeMs?Math.max(0,s.gestureEndUptimeMs-s.gestureStartUptimeMs):"number"==typeof s.reportedDurationMs?Math.max(0,s.reportedDurationMs):Math.max(0,s.fallbackFinishedAtMs-s.fallbackStartedAtMs),A="ios"===e.device.platform&&void 0===sC(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sR(sC(t.count),1)??1,r=!0===t.doubleTap,n=sR(sC(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 sv(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...I,gestureDurationMs:b}):sv(I),x=(l=e.snapshot,w=sC((d=S).referenceWidth),g=sC(d.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:s_(l)),M=(u=t,c=r,p=S,f=A,m=b,h=x,y=sx[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:A,gestureDurationMs:b,kinds:M.map(e=>e.kind)}}))}let sx={click:(e,t,r,n,i)=>sN(e,t,r,i),press:(e,t,r,n,i)=>sN(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?sN(e,t,r,i):[],fill:(e,t,r,n,i)=>sM(e,t,r,i),focus:(e,t,r,n,i)=>sM(e,t,r,i),longpress:function(e,t,r,n,i){let a=sO(t,e);if(!a)return[];let{x:o,y:s}=a;return[sk(r,o,s,s$(n,[sC(t.durationMs),sC(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sT(t,e),o=sP(t.contentDirection)??sP(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:u}=a,c=s$(n,[],250),p=sC(t.amount)??sC(e[1]),f=sC(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:sE,fling:sE,swipe:sE,pinch:function(e,t,r,n,i){let a=sO(t,e,1),o=sC(t.scale)??sC(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:s$(n,[],280)}]}};function sN(e,t,r,n){let i=sO(t,e);if(!i)return[];let{x:a,y:o}=i,s=sR(sC(t.count),1)??1,l=sR(sC(t.intervalMs),0)??0,d=!0===t.doubleTap,u=sR(sC(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(sk(t,a,o,u,n));continue}c.push(sD(t,a,o,n)),d&&c.push(sD(t+90,a,o,n))}return c}function sM(e,t,r,n){let i=sO(t,e);if(!i)return[];let{x:a,y:o}=i;return[sD(r,a,o,n)]}function sE(e,t,r,n,i){let a=sT(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,u=s$(n,[sC(t.effectiveDurationMs),sC(t.durationMs),sC(e[4])],250),c=sR(sC(t.count),1)??1,p=sR(sC(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,b;let A,{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"===(A=function(e,t,r,n,i){if(!i||Math.abs(r-e)<=1.25*Math.abs(n-t))return"swipe";let a=.08*i.referenceWidth;return e<=a&&r>e||e>=i.referenceWidth-a&&r<e?"back-swipe":"swipe"}(y,v,S,_,b=i))?{kind:A,tMs:g,x:y,y:v,x2:S,y2:_,...b,durationMs:I,edge:function(e,t,r){if(r){let t=.08*r.referenceWidth;if(e<=t)return"left";if(e>=r.referenceWidth-t)return"right"}return t>=e?"left":"right"}(y,S,b)}:{kind:A,tMs:g,x:y,y:v,x2:S,y2:_,...b,durationMs:I}})}function sD(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sk(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sP(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 sC(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 sR(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sO(e,t,r=0){let n=sC(e.x)??sC(t[r]),i=sC(e.y)??sC(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function sT(e,t){let r=sL(e.x1,e.x,t[0]),n=sL(e.y1,e.y,t[1]),i=sL(e.x2,t[2]),a=sL(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 sL(...e){return e.map(sC).find(e=>void 0!==e)}function s$(e,t,r){return sR(e,1)??t.map(e=>sR(e,1)).find(e=>void 0!==e)??r}let sF={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sU(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?sF[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:eK}}(m);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:S,dispatchRequest:_,recordedCommand:I}=v,b=await sq(h,S);if(b)return b;let A=await sG(h,S);if("response"in A)return A.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])?[tH.expandHome(d,i),...n.slice(1)]:n),p=(c=(a=r.flags?.out,o=r.meta?.cwd,a?tH.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(),k={...y(m.flags,h.appBundleId,h.trace?.outPath),surface:h.surface},P=await sV({session:h,sessionName:e.sessionName,logPath:w,command:S,request:_,positionals:x,out:N,dispatchContext:k}),C=await sG(h,S,"after-command");if("response"in C)return C.response;"status"in A&&"recovered"===A.status&&(!P||"object"==typeof P)&&((P??={}).warning=A.warning);let R=Date.now(),O=I===S?M:m.positionals??[],T=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=s_(e.snapshot),a={...n??{}},o=sP(a.direction)??sP(r[0]);if(!o)return n;let s=sC(a.amount)??sC(r[1]),l=sC(a.pixels),d=sT(a,[]),u=sC(a.referenceWidth),c=sC(a.referenceHeight),p=void 0!==u&&u>0&&void 0!==c&&c>0?{referenceWidth:u,referenceHeight:c}:i??sb;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=e$({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);sA(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:O,recordedFlags:T,data:P,actionStartedAt:D,actionFinishedAt:R,flags:m.flags??{}}),ax(S)&&aI(h,S),a$(h.device.platform)&&("swipe"===(l=S)||"scroll"===l)&&(h.postGestureStabilization={action:S,markedAt:Date.now()}),{ok:!0,data:P??{}}}async function sG(e,t,r="before-command"){if("android"!==e.device.platform||!eH.androidBlockingDialogGuardedAction.has(t))return{status:"clear"};try{return await oH({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:T(e)}}}}async function sq(e,t){if(!iq(t,e.device)){var r;let n=(r=e.device,iG[t]?.unsupportedHint?.(r));return{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:`${t} is not supported on this device`,...n?{hint:n}:{}}}}return"android"===e.device.platform&&e.recording&&"record"!==t&&await oB({session:e})==="failed"?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function sV(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await n7(r.device,n,a,o,{...s});let l=await of({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 sj(r,l,e.logPath),l}async function sj(e,t,r){let n={snapshotInteractiveOnly:!0,snapshotCompact:!0},i=oo(await a7({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);oc(e,i);let a=await sn({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let sB=s5(()=>import("./lease.js")),sH=s5(()=>import("./session.js").then(e=>e.session_namespaceObject)),sK=s5(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),sW=s5(()=>import("./react-native.js")),sz=s5(()=>import("./record-trace.js").then(e=>e.record_trace_namespaceObject)),sJ=s5(()=>import("./find.js")),sX=s5(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function sZ(e){let{command:t}=e.req;return eH.leaseHandler.has(t)?await sY(e):eH.sessionHandler.has(t)?await sQ(e):eH.snapshot.has(t)?await s0(e):eH.reactNativeHandler.has(t)?await s1(e):eH.recordTraceHandler.has(t)?await s2(e):eH.findHandler.has(t)?await s3(e):eH.interactionHandler.has(t)?await s4(e):null}async function sY(e){let{handleLeaseCommands:t}=await sB();return s8(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function sQ(e){let{handleSessionCommands:t}=await sH();return s8(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 s0(e){let{handleSnapshotCommands:t}=await sK();return s8(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function s1(e){let{handleReactNativeCommands:t}=await sW();return s8(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function s2(e){let{handleRecordTraceCommands:t}=await sz();return s8(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function s3(e){let{handleFindCommands:t}=await sJ();return s8(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function s4(e){let{handleInteractionCommands:t}=await sX();return s8(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function s5(e){let t;return()=>t??=e()}function s8(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 s6=new m;async function s9(e,t,r){let n=s6.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>s6.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function s7(e,t){if(!t)return[];let r=[],n=e.device,i=rU(t.platform);if(i&&!rq(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 le(e){return`${function(e){switch(e){case"iosSimulatorDeviceSet":return"--ios-simulator-device-set";case"androidDeviceAllowlist":return"--android-device-allowlist";default:return`--${e}`}}(e.key)}=${e.value}`}let lt=["target","device","udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"],lr=new Set([eB.apps,eB.devices]);function ln(e){return"string"==typeof e&&e.trim().length>0}function li(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 la=eH.selectorValidationExempt,lo=eH.leaseAdmissionExempt,ls=new Set(lo);async function ll(e){let{req:t,sessionName:r,sessionStore:n}=e,i=n.get(r);if(i)return`device:${i.device.id}`;if("open"===t.command||iy(t.flags))try{let e=await rX(t.flags??{});return`device:${e.id}`}catch{}return`session:${r}`}function ld(e,t={}){let r=Q(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function lu(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:ld(t,{simulatorSetPath:e.simulatorSetPath})}function lc(e,t,r){return ns(lu(e,t),r)}let lp="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 lf(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 lm(e){return!(e instanceof L)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lh(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 lw(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
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")} ${lp}`)})}function lg(e){return"interactionFrame"===e||"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"uptime"===e}function ly(e){if(t4(e))throw t8()}let lv=new Map;async function lS(e,t,r,n,i=45e3,a,o){let s=er.fromTimeoutMs(i),{getEndpoints:l}=lI(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 lw({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 lA(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,lv.delete(n))}});if(f)return f;if("device"===e.kind&&c){var m;m=e.id,lv.delete(m),d=(await l(s?.remainingMs(),!0)).endpoints;let n=await lA(d,{command:r,port:t,timeoutMs:i,signal:o,attemptDeadline:s,onError:(e,t)=>{u=t}});if(n)return n}if(o?.aborted)throw t8();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:lm},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||t9(e))throw t8();u||(u=e)}if(o?.aborted)throw t8();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw lh({port:t,endpoints:d,logPath:n,lastError:u});let a=await lM(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw lh({port:t,endpoints:d,logPath:n,lastError:u})}async function l_(e,t,r,n=45e3,i){if(i?.aborted)throw t8();let a=er.fromTimeoutMs(n),{getEndpoints:o}=lI(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 lx(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function lI(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await lb({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 lA(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 lx(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||t9(e))throw t8();s(t,e)}return null}async function lb(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=lv.get(t))?e.expiresAt<=Date.now()?(lv.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 lN(i.id,a);return l(d),d&&(r=i.id,n=d,lv.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function lx(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 lN(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 ns(["devicectl","device","info","details","--device",e,"--json-output",a,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==n.exitCode||!i.existsSync(a))return null;let o=JSON.parse(i.readFileSync(a,"utf8"));if(o.info?.outcome&&"success"!==o.info.outcome)return null;let s=(o.result?.connectionProperties?.tunnelIPAddress??o.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{lk(a)}}async function lM(e,t,r,n,i){let a=JSON.stringify(r),o=lu(e,["spawn",e.id,"/usr/bin/curl","-s","-X","POST","-H","Content-Type: application/json","--data",a,`http://127.0.0.1:${t}/command`]),s=await ns(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 lE(){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 lD(e,t,r,n){t&&lP(t,e),r&&lP(r,e),n&&process.stderr.write(e)}let lC=new Map;function lP(e,t){let r=(lC.get(e)??Promise.resolve()).catch(()=>{}).then(()=>i.promises.appendFile(e,t)).catch(()=>{}).finally(()=>{lC.get(e)===r&&lC.delete(e)});lC.set(e,r)}function lk(e){try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}let lR=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function lO(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 lT(e)){await no("codesign",["--remove-signature",e],{allowFailure:!0});try{await no("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 lT(e){return 0===(await no("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let lL=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),l$=new Set([" "," ","\n","\r"]),lF=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function lU(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new lq(e).parse()}function lG(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)}lG(r.children,t)}}class lq{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(lF.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?lV(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])&&lL.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,lV(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])&&l$.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function lV(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 lj=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function lB(e){var t;let r=await lH(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 lH(e){let t=await nl(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(!lK(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(lK))}return r}(a),...Object.values(a).filter(e=>lK(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(lj.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=lU(r),t=new Set,lG(n,(e,r)=>{if(lj.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 lK(e){return!!e&&"object"==typeof e}let lW=["CFBundleIcons","CFBundleIcons~ipad"];async function lz(e){let t=e.filter(lQ);if(0===t.length)return;let r=e.filter(e=>l1(e)&&!l0(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 lJ(t,e)}}async function lJ(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 lX(e,t);(o||s)&&(await lY(t),r=t,a=new Date,i.utimesSync(r,a,a))}async function lX(e,t){var r,i;let a=n.join(e,"Info.plist"),o=n.join(t,"Info.plist"),s=await nl(a),l=await nl(o);if(!s||!l)return!1;let d=(r=s,i=l,lW.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 lZ(o,e.key,e.value,e.shouldInsert);return!0}async function lZ(e,t,r,n){let i=await no("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 lY(e){let t=await no("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 lQ(e){return l1(e)&&l0(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function l0(e){return n.basename(e).endsWith("-Runner.app")}function l1(e){return n.basename(e).endsWith(".app")}let l2="XCTestDevices",l3=".agent-device-backup",l4=".agent-device-xctestdevices-backup-",l5=n.join(u.homedir(),".agent-device","ios-runner"),l8=".agent-device-runner-cache.json",l6={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},l9=new Map,l7=new Set;function de(e){return e?.trim()??""}function dt(e=process.env){return de(e.AGENT_DEVICE_IOS_BUNDLE_ID)||de(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function dr(e=process.env){let t=de(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${dt(e)}.uitests`}let dn=function(e=process.env){let t=dt(e),r=dr(e);return Array.from(new Set([de(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function di(e=u.homedir()){return n.join(e,"Library","Developer","XCTestDevices")}async function da(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??di()),s=n.resolve(t.backupPath??function(e=di()){return`${e}${l3}`}(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 dd({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(ds({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,`${l2}.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)&&dl(o),e}}({requestedSetPath:a,xctestDeviceSetPath:o})}catch(e){throw ds({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{ds({xctestDeviceSetPath:o,backupPath:s})}finally{await c()}}}}}function ds(e){let{xctestDeviceSetPath:t,backupPath:r}=e,a=[r,...function(e){let t=n.dirname(e),r=n.basename(e).replace(l3,""),a=r===l2?l4:`${r}${l4}`;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&&dl(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}}),dl(t))}function dl(e){!i.existsSync(e)||i.lstatSync(e).isSymbolicLink()&&i.unlinkSync(e)}async function dd(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)&&k(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 eU(100)}throw new L("COMMAND_FAILED","Timed out waiting for XCTest device set lock",{lockDirPath:t})}async function du(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(l5,"derived","macos"):"simulator"===a.kind?n.join(l5,"derived"):n.join(l5,"derived",a.kind)),l=e8();return await s9(l9,s,async()=>{let a=function(e,r=e8()){var a;let o;return{schemaVersion:1,packageVersion:e5(),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=dy.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 dy.set(r,{fileStatsFingerprint:o,sourceFingerprint:d}),d}(r),platformName:dE(e),deviceKind:e.kind,target:e.target??"phone",buildDestinationFamily:"macOS"===(o=dE(a=e))?`platform=macOS,arch=${dD()}`:"simulator"===a.kind?`generic/platform=${o} Simulator`:`generic/platform=${o}`,runnerBundleBuildSettings:dk(process.env),runnerSigningBuildSettings:dP(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:dR()}}(e,l);en(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)&&(dL("clean","forced_clean",{derived:s}),dO(s),dc(s));let o=await dT({derived:s,projectRoot:l,expectedCacheMetadata:a,findXctestrun:t=>dv(t,e),xctestrunReferencesProjectRoot:d_,resolveExistingXctestrunProductPaths:lB});if("reuse_ready"!==o.reason&&dL("rebuild",o.reason,{derived:s,xctestrunPath:o.xctestrunPath}),"reuse_ready"===o.reason)try{return await lO(e,o.productPaths,o.xctestrunPath),dL("reuse","reuse_ready",{derived:s,xctestrunPath:o.xctestrunPath}),df(s,dh(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&&lR.has(t)}(e))throw e;dL("rebuild","repair_failed",{derived:s,xctestrunPath:o.xctestrunPath})}o.xctestrunPath&&(dO(s),dc(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 dM(e,d,s,r);let u=dv(s,e);if(!u)throw new L("COMMAND_FAILED","Failed to locate .xctestrun after build");let c=await lB(u);if(!c)throw new L("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:u});return await lO(e,c,u),await lz(c),df(s,dh(a,u,c)),dL("build","built_new",{derived:s,xctestrunPath:u}),u})}function dc(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,dp.has(t)&&i.rmSync(n.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let dp=new Set([l8,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function df(e,t){i.mkdirSync(e,{recursive:!0}),i.writeFileSync(n.join(e,l8),`${JSON.stringify(t,null,2)}
|
|
13
|
-
`)}function
|
|
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)??lp);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
|
|
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 dq(e){let t=d$.get(e);return t?{sessionId:t.sessionId,alive:dW(t.child.pid)}:null}async function dV(e,t){await s9(dF,e.deviceId,async()=>{d$.get(e.deviceId)===e&&(N({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await dj(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function dj(e,t,r={}){let n=t??d$.get(e);if(n){var i;if(!1!==r.graceful)try{await lS(n.device,n.port,{command:"shutdown"},void 0,15e3)}catch{await dz(n.child.pid,"SIGTERM")}else await dz(n.child.pid,"SIGTERM");try{await Promise.race([n.testPromise,new Promise(e=>setTimeout(e,r.waitTimeoutMs??1e4))])}catch{}(i=n.child.pid)&&(dW(i)||C(i))&&await dz(n.child.pid,"SIGKILL"),lk(n.xctestrunPath),lk(n.jsonPath),await n.simulatorSetRedirect?.release(),d$.get(e)===n&&d$.delete(e)}}async function dB(e){await s9(dF,e,async()=>{await dj(e)})}async function dH(){let e=Array.from(d$.values()),t=Array.from(l7);await Promise.allSettled(e.map(async e=>{await dz(e.child.pid,"SIGINT")})),await Promise.allSettled(t.map(async e=>{await dz(e.pid,"SIGINT")})),await Promise.allSettled(e.map(async e=>{await dz(e.child.pid,"SIGTERM")})),await Promise.allSettled(t.map(async e=>{await dz(e.pid,"SIGTERM")})),await Promise.allSettled(e.map(async e=>{await dz(e.child.pid,"SIGKILL")})),await Promise.allSettled(t.map(async e=>{await dz(e.pid,"SIGKILL"),l7.delete(e)})),await Promise.allSettled(e.map(async e=>{await e.simulatorSetRedirect?.release()}))}async function dK(){await dH();let e=Array.from(d$.keys());await Promise.allSettled(e.map(async e=>{await dB(e)}));let t=Array.from(l7);await Promise.allSettled(t.map(async e=>{try{await dz(e.pid,"SIGTERM"),await dz(e.pid,"SIGKILL")}finally{l7.delete(e)}}))}function dW(e){return!!e&&k(e)}async function dz(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 no("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function dJ(e){await ns(lu(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}async function dX(e,t,r,n,i,a){var o,s,l;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}})),lg(r.command)){let o=await x("ios_runner_command_send",async()=>await lS(e,t.port,r,n,i,t,a),{command:r.command,readOnly:!0,sessionReady:t.ready,timeoutMs:i});return await dZ(o,t,n)}let d=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,d.remainingMs()):Math.min(45e3,d.remainingMs());try{let o=await x("ios_runner_readiness_preflight",async()=>await lS(e,t.port,{command:"uptime"},n,i,t,a),{command:r.command,sessionReady:t.ready,timeoutMs:i});await dZ(o,t,n)}catch(t){let e;throw e=(l=t)instanceof L?l:new L("COMMAND_FAILED",l instanceof Error?l.message:String(l),void 0,l),new L(e.code,e.message,{...e.details??{},runnerReadinessPreflightFailed:!0},e.cause??l)}}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 u=d.remainingMs();if(u<=0)throw new L("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:i});let c=await x("ios_runner_command_send",async()=>await l_(e,t.port,r,u,a),{command:r.command});return await dZ(c,t,n)}async function dZ(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new L("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?R(e):"COMMAND_FAILED",i="string"==typeof n.error?.message?n.error.message:void 0,a="string"==typeof n.error?.hint?n.error.hint:void 0;throw new L(t,i??"Runner error",{runner:n,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,logPath:r})}return(t.ready=!0,t.lastSuccessfulRunnerResponseAtMs=Date.now(),n.data&&"object"==typeof n.data&&!Array.isArray(n.data))?n.data:{}}async function dY(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 dQ=new m;function d0(e){return{runCommand:e}}function d1(e,t,r,n={}){if(r)return d5(r);let i=d3(e,n);return i?d5(i.provider):d5(t)}function d2(e,t={}){return void 0!==d3(e,t)}function d3(e,t={}){let r=dQ.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}async function d4(e,t,r){if(!e)return await r();let n={provider:d5(e),deviceId:t.deviceId,requestId:t.requestId};return await dQ.run(n,r)}function d5(e){return"function"==typeof e?{runCommand:e}:e}async function d8(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}`);ly(r.requestId);let n=d1(e,d0(d9),void 0,{requestId:r.requestId});return lg(t.command)?et(()=>(ly(r.requestId),n.runCommand(e,t,r)),{shouldRetry:e=>(ly(r.requestId),lf(e))}):n.runCommand(e,t,r)}function d6(e,t={}){return"ios"!==e.platform?void 0:d2(e,{requestId:t.requestId})?void N({level:"debug",phase:"ios_runner_session_prewarm_skipped_scoped_provider",data:{deviceId:e.id}}):dU(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 d9(e,t,r){let n;ly(r.requestId);let i=t5(r.requestId);try{let a=((n=await dU(e,r)).ready,45e3);return await dX(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")&&lm(a)&&n){ly(r.requestId),await dV(n,"runner_connect_failed_before_command_send"),n=await dU(e,{...r,cleanStaleBundles:!0});try{return await dX(e,n,t,r.logPath,45e3,i)}catch(e){throw lf(e instanceof L?e:new L("COMMAND_FAILED",String(e)))&&await dV(n,"transport_error_after_retry_command_send"),e}}if(n&&function(e){let t;return e.details?.runnerReadinessPreflightFailed===!0&&(lf(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a)){ly(r.requestId),await dV(n,"runner_readiness_preflight_failed_before_command_send"),n=await dU(e,{...r,cleanStaleBundles:!0});try{return await dX(e,n,t,r.logPath,45e3,i)}catch(e){throw lf(e instanceof L?e:new L("COMMAND_FAILED",String(e)))&&await dV(n,"transport_error_after_retry_command_send"),e}}throw!n&&a.message.includes("Runner did not accept connection")&&await dB(e.id),n&&lf(a)&&await dV(n,"transport_error_after_command_send"),o}}let d7=new WeakMap;async function ue(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=tl(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(lo.has(e.command)||e.meta?.sessionIsolation!=="tenant")return;let r=li(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=ls.has(d)?null:await ll({req:l,sessionName:u,sessionStore:o}),p=(r=s,(a=d7.get(r))||(a=new Map,d7.set(r,a)),a);return{req:l,command:d,sessionName:u,throwIfCanceled:()=>t6(l.meta?.requestId),runLocked:async e=>(t6(l.meta?.requestId),c)?await s9(p,c,async()=>(t6(l.meta?.requestId),await e())):await e()}}function ut(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=dq(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=lr.has(e.command),a=i?[]:t?s7(t,n):function(e,t,r){var n,i;let a=[],o=rU(t);if(void 0!==e.platform&&o&&(n=rU(e.platform),i=o,n&&i&&n!==i&&("apple"===n?!rG(i):"apple"!==i||!rG(n)))&&a.push({key:"platform",value:e.platform}),"open"===r)return a;for(let t of lt){let r=e[t];ln(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&<.some(e=>ln(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 lt)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(le).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:T(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,la.has(r))||function(e,t){let r=s7(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(le).join(", ")}. Use a different --session name or close this session first.`)}}(l,d.flags);let c=(e,t,r)=>{let n;return{...aM(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 ur(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 sU({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function un(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:T(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function ui(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function ua(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
|
|
17
|
-
`,recoveredLineCount:l.length}}async function uf(e,t,r,n,i,a){let o=await uh({deviceId:e,appBundleId:t,simulatorSetPath:i});return uy({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return ld(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",uc(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function um(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function uh(e){let{deviceId:t,appBundleId:r,simulatorSetPath:i}=e,a=await ns(ld(["get_app_container",t,r,"app"],{simulatorSetPath:i}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=n.join(o,"Info.plist"),l=await U("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function uw(e,t,r,n){return uy({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",uc(e)],stream:t,redactionPatterns:r,pidPath:n})}async function ug(e,t,r,n){return uy({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function uy(e){let t="active",r=$(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=ua(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&tz(e.pidPath,n.pid);let a=uo(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),tJ(e.pidPath),r),r=>{throw t="failed",tJ(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await ui(a),n.killed||n.kill("SIGKILL"),await ui(a),tJ(e.pidPath)}}}let uv=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),uS=/https?:\/\/[^\s"'<>\])]+/i,u_=[/\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 uI(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>ub(e)));for(let e of t.entries){let t=ub(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function uA(e,t){let r=uO(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=uO(t?.maxPayloadChars,2048,64,16384),o=uO(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=uC(s,["method","httpMethod"]),d=uC(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=uv.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??c?.[1])?.toUpperCase(),m=uS.exec(o),h=d??m?.[0];if(!h)return null;let w=u??uN(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:uM(o),packetId:uE(o)??void 0,durationMs:uD(o)??void 0,raw:uR(o,a),line:r};if("android"===n&&function(e,t,r){let n=ux(t,r,5),i=e.packetId??n.map(e=>uE(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?ux(t,r,12).filter(e=>uE(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>uM(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>uN(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>uD(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 uk(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=uR(e,a))}if("body"===i||"all"===i){let e=uP(o,s,["requestBody","body","payload","request"]),t=uP(o,s,["responseBody","response"]);e&&(g.requestBody=uR(e,a)),t&&(g.responseBody=uR(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 ub(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function ux(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 uN(e){for(let t of u_){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function uM(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 uE(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function uD(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 uC(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 uP(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return uk(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 uk(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function uR(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function uO(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let uT={start:async e=>await uB(e)},uL=r4(uT,function(e={}){return{...uT,...e}});async function u$(e,t){return await uL.run(e,t)}function uF(e,t){let r=process.env[e];if(!r)return t;let n=Number.parseInt(r,10);return Number.isInteger(n)&&n>0?n:t}function uU(e){let t=n.dirname(e);i.existsSync(t)||i.mkdirSync(t,{recursive:!0}),function(e,t){if(i.existsSync(e)&&!(i.statSync(e).size<t.maxBytes))for(let r=t.maxRotatedFiles;r>=1;r-=1){let t=1===r?e:`${e}.${r-1}`,n=`${e}.${r}`;i.existsSync(t)&&(i.existsSync(n)&&i.unlinkSync(n),i.renameSync(t,n))}}(e,{maxBytes:uF("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:uF("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function uG(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 uq(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=uO(t?.maxEntries,25,1,200),s=t?.include??"summary",l=uO(t?.maxPayloadChars,2048,64,16384),d=uO(t?.maxScanLines,4e3,100,2e4),i.existsSync(m)?uA(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 uV({device:u,appBundleId:c,appLogPath:m,appLogState:p});if(I){let e=await ud(u.id,c);if(e){let t=uA(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y});t.entries.length>0&&(S=uI(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 uH({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=uI(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 uV(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 tW(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),tK));if(!s)return null;let l=await ul(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function uj(e,t,r,n){return await uL.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function uB({device:e,appBundleId:t,outPath:r,pidPath:n}){uU(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 ug(e.id,a,o,n):await uf(e.id,t,a,o,e.simulatorSetPath,n);if("android"===e.platform)return us(t),await uu(e.id,t,a,o,n);if("macos"===e.platform)return await uw(t,a,o,n);throw a.end(),new L("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function uH(e){let t=await up({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:uA(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 uK(e){await e.stop(),await ui(e.wait)}async function uW(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 ns(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await ns(["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 uz(e,t){uU(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
|
|
18
|
-
`;i.appendFileSync(e,r,"utf8")}function
|
|
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 ns(lu(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:i});if(r={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==r.exitCode)throw new L("COMMAND_FAILED","simctl bootstatus failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let d=await
|
|
20
|
-
`:
|
|
21
|
-
</map>`)}function
|
|
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
|
|
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")} ${lp}`)})}function lg(e){return"interactionFrame"===e||"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function ly(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${t.randomUUID()}`}}function lv(e){if(t4(e))throw t8()}let lS=new Map;async function l_(e,t,r,n,i=45e3,a,o){let s=er.fromTimeoutMs(i),{getEndpoints:l}=lb(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 lw({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 lA(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,lS.delete(n))}});if(f)return f;if("device"===e.kind&&c){var m;m=e.id,lS.delete(m),d=(await l(s?.remainingMs(),!0)).endpoints;let n=await lA(d,{command:r,port:t,timeoutMs:i,signal:o,attemptDeadline:s,onError:(e,t)=>{u=t}});if(n)return n}if(o?.aborted)throw t8();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:lm},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||t9(e))throw t8();u||(u=e)}if(o?.aborted)throw t8();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw lh({port:t,endpoints:d,logPath:n,lastError:u});let a=await lE(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw lh({port:t,endpoints:d,logPath:n,lastError:u})}async function lI(e,t,r,n=45e3,i){if(i?.aborted)throw t8();let a=er.fromTimeoutMs(n),{getEndpoints:o}=lb(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 lN(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function lb(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await lx({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 lA(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 lN(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||t9(e))throw t8();s(t,e)}return null}async function lx(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=lS.get(t))?e.expiresAt<=Date.now()?(lS.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 lM(i.id,a);return l(d),d&&(r=i.id,n=d,lS.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function lN(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 lM(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 ns(["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{lR(a)}}async function lE(e,t,r,n,i){let a=JSON.stringify(r),o=lu(e,["spawn",e.id,"/usr/bin/curl","-s","-X","POST","-H","Content-Type: application/json","--data",a,`http://127.0.0.1:${t}/command`]),s=await ns(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 lD(){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 lk(e,t,r,n){t&&lC(t,e),r&&lC(r,e),n&&process.stderr.write(e)}let lP=new Map;function lC(e,t){let r=(lP.get(e)??Promise.resolve()).catch(()=>{}).then(()=>i.promises.appendFile(e,t)).catch(()=>{}).finally(()=>{lP.get(e)===r&&lP.delete(e)});lP.set(e,r)}function lR(e){try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}let lO=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function lT(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 lL(e)){await no("codesign",["--remove-signature",e],{allowFailure:!0});try{await no("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 lL(e){return 0===(await no("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let l$=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),lF=new Set([" "," ","\n","\r"]),lU=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function lG(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new lV(e).parse()}function lq(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)}lq(r.children,t)}}class lV{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(lU.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?lj(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])&&l$.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,lj(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])&&lF.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function lj(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 lB=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function lH(e){var t;let r=await lK(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 lK(e){let t=await nl(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(!lW(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(lW))}return r}(a),...Object.values(a).filter(e=>lW(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(lB.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=lG(r),t=new Set,lq(n,(e,r)=>{if(lB.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 lW(e){return!!e&&"object"==typeof e}let lz=["CFBundleIcons","CFBundleIcons~ipad"];async function lJ(e){let t=e.filter(l0);if(0===t.length)return;let r=e.filter(e=>l2(e)&&!l1(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 lX(t,e)}}async function lX(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 lZ(e,t);(o||s)&&(await lQ(t),r=t,a=new Date,i.utimesSync(r,a,a))}async function lZ(e,t){var r,i;let a=n.join(e,"Info.plist"),o=n.join(t,"Info.plist"),s=await nl(a),l=await nl(o);if(!s||!l)return!1;let d=(r=s,i=l,lz.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 lY(o,e.key,e.value,e.shouldInsert);return!0}async function lY(e,t,r,n){let i=await no("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 lQ(e){let t=await no("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 l0(e){return l2(e)&&l1(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function l1(e){return n.basename(e).endsWith("-Runner.app")}function l2(e){return n.basename(e).endsWith(".app")}let l3="XCTestDevices",l4=".agent-device-backup",l5=".agent-device-xctestdevices-backup-",l8=n.join(u.homedir(),".agent-device","ios-runner"),l6=".agent-device-runner-cache.json",l9={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},l7=new Map,de=new Set;function dt(e){return e?.trim()??""}function dr(e=process.env){return dt(e.AGENT_DEVICE_IOS_BUNDLE_ID)||dt(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function dn(e=process.env){let t=dt(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${dr(e)}.uitests`}let di=function(e=process.env){let t=dr(e),r=dn(e);return Array.from(new Set([dt(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function da(e=u.homedir()){return n.join(e,"Library","Developer","XCTestDevices")}async function ds(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??da()),s=n.resolve(t.backupPath??function(e=da()){return`${e}${l4}`}(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 du({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(dl({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,`${l3}.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)&&dd(o),e}}({requestedSetPath:a,xctestDeviceSetPath:o})}catch(e){throw dl({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{dl({xctestDeviceSetPath:o,backupPath:s})}finally{await c()}}}}}function dl(e){let{xctestDeviceSetPath:t,backupPath:r}=e,a=[r,...function(e){let t=n.dirname(e),r=n.basename(e).replace(l4,""),a=r===l3?l5:`${r}${l5}`;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&&dd(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}}),dd(t))}function dd(e){!i.existsSync(e)||i.lstatSync(e).isSymbolicLink()&&i.unlinkSync(e)}async function du(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)&&C(a.pid)&&(!a.startTime||M(a.pid)===a.startTime))&&(i.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-r.mtimeMs<5e3)&&(i.rmSync(e,{recursive:!0,force:!0}),!0)}(t,a))continue;await eU(100)}throw new L("COMMAND_FAILED","Timed out waiting for XCTest device set lock",{lockDirPath:t})}async function dc(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(l8,"derived","macos"):"simulator"===a.kind?n.join(l8,"derived"):n.join(l8,"derived",a.kind)),l=e8();return await s9(l7,s,async()=>{let a=function(e,r=e8()){var a;let o;return{schemaVersion:1,packageVersion:e5(),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=dv.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 dv.set(r,{fileStatsFingerprint:o,sourceFingerprint:d}),d}(r),platformName:dD(e),deviceKind:e.kind,target:e.target??"phone",buildDestinationFamily:"macOS"===(o=dD(a=e))?`platform=macOS,arch=${dk()}`:"simulator"===a.kind?`generic/platform=${o} Simulator`:`generic/platform=${o}`,runnerBundleBuildSettings:dR(process.env),runnerSigningBuildSettings:dC(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:dO()}}(e,l);en(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)&&(d$("clean","forced_clean",{derived:s}),dT(s),dp(s));let o=await dL({derived:s,projectRoot:l,expectedCacheMetadata:a,findXctestrun:t=>dS(t,e),xctestrunReferencesProjectRoot:dI,resolveExistingXctestrunProductPaths:lH});if("reuse_ready"!==o.reason&&d$("rebuild",o.reason,{derived:s,xctestrunPath:o.xctestrunPath}),"reuse_ready"===o.reason)try{return await lT(e,o.productPaths,o.xctestrunPath),d$("reuse","reuse_ready",{derived:s,xctestrunPath:o.xctestrunPath}),dm(s,dw(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&&lO.has(t)}(e))throw e;d$("rebuild","repair_failed",{derived:s,xctestrunPath:o.xctestrunPath})}o.xctestrunPath&&(dT(s),dp(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 dE(e,d,s,r);let u=dS(s,e);if(!u)throw new L("COMMAND_FAILED","Failed to locate .xctestrun after build");let c=await lH(u);if(!c)throw new L("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:u});return await lT(e,c,u),await lJ(c),dm(s,dw(a,u,c)),d$("build","built_new",{derived:s,xctestrunPath:u}),u})}function dp(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,df.has(t)&&i.rmSync(n.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let df=new Set([l6,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function dm(e,t){i.mkdirSync(e,{recursive:!0}),i.writeFileSync(n.join(e,l6),`${JSON.stringify(t,null,2)}
|
|
13
|
+
`)}function dh(e){let{artifacts:t,...r}=e;return r}function dw(e,t,r){let n=function(e,t){let r=dy(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=dy(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 dg(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)}function dy(e){try{return Math.trunc(i.statSync(e).mtimeMs)}catch{return null}}let dv=new Map;function dS(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=d_(r.path,t)-d_(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function d_(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 dI(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 db(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 dN(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})}),dN(l,e=>Object.assign(e,l9),{requireTestBundlePath:!0}),await dx(l,o,s),{xctestrunPath:s,jsonPath:o}}async function dA(e){let t=await no("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 dx(e,t,r){i.writeFileSync(t,JSON.stringify(e,null,2));let n=await no("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 dN(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=dM(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=dM(r,{requireTestBundlePath:!0});e&&t(e)}}function dM(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function dE(e,t,r,n){let i=dR(process.env),a=dC(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=dO(),l=await ds(e);try{var d;let l;await F("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",dP(e),"1","-destination",(d=e,l=dD(d),"macOS"===l?`platform=macOS,arch=${dk()}`:"simulator"===d.kind?`platform=${l} Simulator,id=${d.id}`:`generic/platform=${l}`),"-derivedDataPath",r,...s,...i,...o,...a],{detached:!0,onSpawn:e=>{de.add(e),e.on("close",()=>{de.delete(e)})},onStdoutChunk:e=>{lk(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{lk(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)??lp);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 dD(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 dk(){return"arm64"===process.arch?"arm64":"x86_64"}function dP(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function dC(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 dR(e=process.env){let t=dr(e),r=dn(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function dO(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function dT(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,i;if(r=e,t=n.resolve(e8(),".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(e8(),".tmp")}.`})}}async function dL(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,l6),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?JSON.stringify(dh(a))!==JSON.stringify(dh(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(dg))||dy(r.xctestrunPath)!==r.xctestrunMtimeMs)return null;let n=[];for(let e of r.productPaths){if(dy(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 d$(e,t,r){N({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let dF=new Map,dU=new Map;async function dG(e,t){return await s9(dU,e.id,async()=>{let r,n,i=dF.get(e.id);if(i){if(dz(i.child.pid))return N({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:i.sessionId,ready:i.ready}}),i;await dQ({},"stop_stale_session",async()=>{await dB(e.id,i)})}let a={};await dQ(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()):dX(t))}),t.cleanStaleBundles?await dQ(a,"cleanup_stale_bundles",async()=>{await dq(e)}):(a.cleanup_stale_bundles=0,N({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let o=await dQ(a,"ensure_xctestrun",async()=>await dc(e,t)),s=await dQ(a,"allocate_port",async()=>await lD()),{xctestrunPath:l,jsonPath:d}=await dQ(a,"prepare_xctestrun_env",async()=>await db(o,{AGENT_DEVICE_RUNNER_PORT:String(s)},`session-${e.id}-${s}`)),u=await dQ(a,"simulator_set_redirect",async()=>await ds(e));try{({child:r,wait:n}=await dQ(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",dP(e),"1","-destination-timeout",String(20),"-xctestrun",l,"-destination",(t=dD(e),"macOS"===t?`platform=macOS,arch=${dk()}`:"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=>{lk(e,t.logPath,t.traceLogPath,t.verbose)}),r.stderr?.on("data",e=>{lk(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 dF.set(e.id,c),c})}async function dq(e){if("simulator"===e.kind)for(let t of di){let r=await ns(lu(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 dV(e){let t=dF.get(e);return t?{sessionId:t.sessionId,alive:dz(t.child.pid)}:null}async function dj(e,t){await s9(dU,e.deviceId,async()=>{dF.get(e.deviceId)===e&&(N({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await dB(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function dB(e,t,r={}){let n=t??dF.get(e);if(n){var i;if(!1!==r.graceful)try{await l_(n.device,n.port,ly({command:"shutdown"}),void 0,15e3)}catch{await dJ(n.child.pid,"SIGTERM")}else await dJ(n.child.pid,"SIGTERM");try{await Promise.race([n.testPromise,new Promise(e=>setTimeout(e,r.waitTimeoutMs??1e4))])}catch{}(i=n.child.pid)&&(dz(i)||k(i))&&await dJ(n.child.pid,"SIGKILL"),lR(n.xctestrunPath),lR(n.jsonPath),await n.simulatorSetRedirect?.release(),dF.get(e)===n&&dF.delete(e)}}async function dH(e){await s9(dU,e,async()=>{await dB(e)})}async function dK(){let e=Array.from(dF.values()),t=Array.from(de);await Promise.allSettled(e.map(async e=>{await dJ(e.child.pid,"SIGINT")})),await Promise.allSettled(t.map(async e=>{await dJ(e.pid,"SIGINT")})),await Promise.allSettled(e.map(async e=>{await dJ(e.child.pid,"SIGTERM")})),await Promise.allSettled(t.map(async e=>{await dJ(e.pid,"SIGTERM")})),await Promise.allSettled(e.map(async e=>{await dJ(e.child.pid,"SIGKILL")})),await Promise.allSettled(t.map(async e=>{await dJ(e.pid,"SIGKILL"),de.delete(e)})),await Promise.allSettled(e.map(async e=>{await e.simulatorSetRedirect?.release()}))}async function dW(){await dK();let e=Array.from(dF.keys());await Promise.allSettled(e.map(async e=>{await dH(e)}));let t=Array.from(de);await Promise.allSettled(t.map(async e=>{try{await dJ(e.pid,"SIGTERM"),await dJ(e.pid,"SIGKILL")}finally{de.delete(e)}}))}function dz(e){return!!e&&C(e)}async function dJ(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 no("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function dX(e){await ns(lu(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}async function dZ(e,t,r,n,i,a){var o,s,l;o=t,s=r.command,o.startupTimingsReported||!o.startupTimings||(o.startupTimingsReported=!0,N({level:"info",phase:"ios_runner_session_startup_timings",durationMs:Object.values(o.startupTimings).reduce((e,t)=>e+t,0),data:{command:s,sessionId:o.sessionId,ready:o.ready,timings:o.startupTimings}}));let d=ly(r);if(lg(d.command)){let r=await x("ios_runner_command_send",async()=>await l_(e,t.port,d,n,i,t,a),{command:d.command,commandId:d.commandId,readOnly:!0,sessionReady:t.ready,timeoutMs:i});return await dY(r,t,n)}let u=er.fromTimeoutMs(i),c=function(e,t){if(!e.ready)return{action:"run",reason:"startup"};if("tap"!==t.command&&"tapSeries"!==t.command)return{action:"run",reason:"conservative_command"};let r=e.lastSuccessfulRunnerResponseAtMs;if(void 0===r)return{action:"run",reason:"no_successful_response"};let n=Date.now()-r;return n>1e4?{action:"run",reason:"successful_response_stale",lastSuccessfulRunnerResponseAgeMs:n}:{action:"skip",reason:"recent_successful_response",lastSuccessfulRunnerResponseAgeMs:n}}(t,d);if("run"===c.action){let r=t.ready?Math.min(5e3,u.remainingMs()):Math.min(45e3,u.remainingMs());try{let i=await x("ios_runner_readiness_preflight",async()=>await l_(e,t.port,ly({command:"uptime"}),n,r,t,a),{command:d.command,commandId:d.commandId,lastSuccessfulRunnerResponseAgeMs:c.lastSuccessfulRunnerResponseAgeMs,reason:c.reason,sessionReady:t.ready,timeoutMs:r});await dY(i,t,n)}catch(t){let e;throw e=(l=t)instanceof L?l:new L("COMMAND_FAILED",l instanceof Error?l.message:String(l),void 0,l),new L(e.code,e.message,{...e.details??{},runnerReadinessPreflightFailed:!0},e.cause??l)}}else N({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:r.command,commandId:d.commandId,lastSuccessfulRunnerResponseAgeMs:c.lastSuccessfulRunnerResponseAgeMs,reason:c.reason,sessionReady:t.ready}});let p=u.remainingMs();if(p<=0)throw new L("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:i});let f=await x("ios_runner_command_send",async()=>await lI(e,t.port,d,p,a),{command:d.command,commandId:d.commandId}).catch(e=>{if("skip"===c.action){var t,r;let n;throw t=e,r=c,n=t instanceof L?t:new L("COMMAND_FAILED",t instanceof Error?t.message:String(t),void 0,t),new L(n.code,n.message,{...n.details??{},runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:r.reason,runnerReadinessPreflightSkippedAgeMs:r.lastSuccessfulRunnerResponseAgeMs},n.cause??t)}throw e});return await dY(f,t,n)}async function dY(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new L("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?R(e):"COMMAND_FAILED",i="string"==typeof n.error?.message?n.error.message:void 0,a="string"==typeof n.error?.hint?n.error.hint:void 0;throw new L(t,i??"Runner error",{runner:n,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,logPath:r})}return(t.ready=!0,t.lastSuccessfulRunnerResponseAtMs=Date.now(),n.data&&"object"==typeof n.data&&!Array.isArray(n.data))?n.data:{}}async function dQ(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 d0=new m;function d1(e){return{runCommand:e}}function d2(e,t,r,n={}){if(r)return d8(r);let i=d4(e,n);return i?d8(i.provider):d8(t)}function d3(e,t={}){return void 0!==d4(e,t)}function d4(e,t={}){let r=d0.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}async function d5(e,t,r){if(!e)return await r();let n={provider:d8(e),deviceId:t.deviceId,requestId:t.requestId};return await d0.run(n,r)}function d8(e){return"function"==typeof e?{runCommand:e}:e}async function d6(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}`);lv(r.requestId);let n=ly(t),i=d2(e,d1(d7),void 0,{requestId:r.requestId});return lg(n.command)?et(()=>(lv(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(lv(r.requestId),lf(e))}):i.runCommand(e,n,r)}function d9(e,t={}){return"ios"!==e.platform?void 0:d3(e,{requestId:t.requestId})?void N({level:"debug",phase:"ios_runner_session_prewarm_skipped_scoped_provider",data:{deviceId:e.id}}):dG(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 d7(e,t,r){let n;lv(r.requestId);let i=t5(r.requestId);try{let a=((n=await dG(e,r)).ready,45e3);return await dZ(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")&&lm(a)&&n){lv(r.requestId),await dj(n,"runner_connect_failed_before_command_send"),n=await dG(e,{...r,cleanStaleBundles:!0});try{return await dZ(e,n,t,r.logPath,45e3,i)}catch(o){let a=o instanceof L?o:new L("COMMAND_FAILED",String(o));if(lf(a))return await ue(e,n,t,a,r,i,"transport_error_after_retry_command_send");throw o}}if(n&&function(e){let t;return e.details?.runnerReadinessPreflightFailed===!0&&(lf(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a)){lv(r.requestId),await dj(n,"runner_readiness_preflight_failed_before_command_send"),n=await dG(e,{...r,cleanStaleBundles:!0});try{let a=await dZ(e,n,t,r.logPath,45e3,i);return N({level:"debug",phase:"ios_runner_readiness_preflight_recovered",data:{command:t.command,commandId:t.commandId,recovery:"session_restarted",sessionId:n.sessionId}}),a}catch(o){let a=o instanceof L?o:new L("COMMAND_FAILED",String(o));if(lf(a))return await ue(e,n,t,a,r,i,"transport_error_after_retry_command_send");throw o}}if(!n&&a.message.includes("Runner did not accept connection")&&await dH(e.id),n&&lf(a))return await ue(e,n,t,a,r,i,"transport_error_after_command_send");throw o}}async function ue(e,t,r,n,i,a,o){let s=await un(e,t,r,n,i,a);return await ut(s,{command:r,session:t,transportError:n,invalidationReason:o})}async function ut(e,t){var r,n,i,a;if(!e)return await ur(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,ua({command:(n=t).command,session:n.session,transportError:n.transportError,decision:"skipped",reason:r.reason,lifecycleState:r.lifecycleState}),r.data}if("skipInvalidation"===e.type){throw i=e,ua({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await ur(t,e.reason,e.lifecycleState,e.error)}async function ur(e,t,r,n){throw ua({command:e.command,session:e.session,transportError:e.transportError,decision:"retained",reason:t,lifecycleState:r}),await dj(e.session,e.invalidationReason),n??e.transportError}async function un(e,t,r,n,i,a){var o,s,l,d,u,c,p,f,m,h;let w,g,y,v,S;if("status"===r.command||!r.commandId?.trim())return;let _=uo(n);try{w=await dZ(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return N({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:r.command,commandId:r.commandId,error:e instanceof Error?e.message:String(e),..._}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let I="string"==typeof w.lifecycleState?w.lifecycleState:"";return N({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:I,..._}}),o=w,s=I,l=r,d=n,u=i,"completed"===s?function(e,t,r,n){let i=function(e){if("string"!=typeof e||0===e.trim().length)return;let t=function(e){try{let t=JSON.parse(e);if(t&&"object"==typeof t)return t}catch{}return{}}(e);if(t.ok)return t.data&&"object"==typeof t.data&&!Array.isArray(t.data)?t.data:{}}(e.lifecycleResponseJson);if(i)return{type:"recovered",data:i,reason:"completed_with_retained_response",lifecycleState:"completed"};if(lg(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let a=uo(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new L("COMMAND_FAILED",`Runner command "${t.command}" completed after the transport response was lost, but no recoverable response was retained.`,{command:t.command,commandId:t.commandId,lifecycleState:"completed",recovery:"completed_without_retained_response",...a,hint:function(e,t={}){return`${ui(t)}The runner is still reachable and reports "${e}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`}(t.command,a),logPath:n.logPath,transportError:r.message},r)}}(o,l,d,u):"failed"===s?{type:"skipInvalidation",reason:"runner_reported_failure",lifecycleState:s,error:(c=o,p=l,f=d,m=u,g="string"==typeof c.lifecycleErrorCode?c.lifecycleErrorCode:void 0,y="string"==typeof c.lifecycleErrorMessage?c.lifecycleErrorMessage:"Runner command failed",v="string"==typeof c.lifecycleErrorHint?c.lifecycleErrorHint:void 0,S=uo(f),new L(R(g),y,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...S,hint:v??function(e,t={}){return`${ui(t)}The runner is still reachable and reports "${e}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`}(p.command,S),logPath:m.logPath,transportError:f.message},f))}:"accepted"===s||"started"===s?{type:"skipInvalidation",reason:"command_still_in_flight",lifecycleState:s,error:function(e,t,r,n){if(lg(t.command))return r;let i=uo(r);return new L("COMMAND_FAILED",`Runner command "${t.command}" is still ${e} after the transport response was lost.`,{command:t.command,commandId:t.commandId,lifecycleState:e,recovery:"command_still_in_flight",...i,hint:function(e,t,r={}){return`${ui(r)}The runner is still reachable and reports "${e}" is ${t}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`}(t.command,e,i),logPath:n.logPath,transportError:r.message},r)}(s,l,d,u)}:{type:"retainInvalidation",reason:s?"unknown_lifecycle_state":"missing_lifecycle_state",lifecycleState:s,error:new L("COMMAND_FAILED",`Runner command "${l.command}" lost its transport response and lifecycle status was ${s?`"${s}"`:"missing"}, so agent-device invalidated the runner session instead of replaying the command.`,{command:l.command,commandId:l.commandId,lifecycleState:s,recovery:"lifecycle_state_not_recoverable",hint:(h=l.command,`The runner did not confirm that "${h}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`),logPath:u.logPath,transportError:d.message},d)}}function ui(e){return!0!==e.readinessPreflightSkipped?"":"This hot command skipped the uptime preflight because the runner had just responded; status recovery confirmed the runner still observed it. "}function ua(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;N({level:"retained"===i?"warn":"debug",phase:"ios_runner_command_invalidation_decision",data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:void 0!==o,sessionId:r.sessionId,transportError:n.message}})}function uo(e){let t,r,n,i={},a="boolean"==typeof(t=e.details?.runnerReadinessPreflightSkipped)?t:void 0;void 0!==a&&(i.readinessPreflightSkipped=a);let o="string"==typeof(r=e.details?.runnerReadinessPreflightSkipReason)?r:void 0;void 0!==o&&(i.readinessPreflightSkipReason=o);let s="number"==typeof(n=e.details?.runnerReadinessPreflightSkippedAgeMs)?n:void 0;return void 0!==s&&(i.readinessPreflightSkippedAgeMs=s),i}let us=new WeakMap;async function ul(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=tl(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(lo.has(e.command)||e.meta?.sessionIsolation!=="tenant")return;let r=li(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=ls.has(d)?null:await ll({req:l,sessionName:u,sessionStore:o}),p=(r=s,(a=us.get(r))||(a=new Map,us.set(r,a)),a);return{req:l,command:d,sessionName:u,throwIfCanceled:()=>t6(l.meta?.requestId),runLocked:async e=>(t6(l.meta?.requestId),c)?await s9(p,c,async()=>(t6(l.meta?.requestId),await e())):await e()}}function ud(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=dV(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=lr.has(e.command),a=i?[]:t?s7(t,n):function(e,t,r){var n,i;let a=[],o=rU(t);if(void 0!==e.platform&&o&&(n=rU(e.platform),i=o,n&&i&&n!==i&&("apple"===n?!rG(i):"apple"!==i||!rG(n)))&&a.push({key:"platform",value:e.platform}),"open"===r)return a;for(let t of lt){let r=e[t];ln(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&<.some(e=>ln(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 lt)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(le).join(", ")}. Unset those selectors or remove the request lock policy.`)}(i.req,l),u=e=>(function(e,t,r){let i=b();if(!t.ok){N({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=A({force:!0})??void 0;return{ok:!1,error:T(new L(R(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint,diagnosticId:t.error.diagnosticId,logPath:t.error.logPath}),{diagnosticId:i.diagnosticId,logPath:e})}}return N({level:"info",phase:"request_success"}),A(),{ok:!0,data:function(e,t,r){var i,a;let o;if(!t)return t;let s=(i=e,o=Array.isArray((a=t).artifacts)?[...a.artifacts]:[],"screenshot"!==i.command||o.some(e=>e?.field==="path")||"string"!=typeof a.path||o.push({field:"path",path:a.path,localPath:i.meta?.clientArtifactPaths?.path,fileName:n.basename(i.meta?.clientArtifactPaths?.path??a.path)}),o.filter(e=>!!(e&&"string"==typeof e.field&&"string"==typeof e.path&&"string"==typeof e.localPath&&e.localPath.length>0)));return 0===s.length?t:{...t,artifacts:s.map(t=>{let n=t.path;return{field:t.field,artifactId:r({artifactPath:n,tenantId:e.meta?.tenantId,fileName:t.fileName}),fileName:t.fileName,localPath:t.localPath}})}}(e,t.data,r)}})(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,la.has(r))||function(e,t){let r=s7(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(le).join(", ")}. Use a different --session name or close this session first.`)}}(l,d.flags);let c=(e,t,r)=>{let n;return{...aM(a,e,t,r,n=b().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 uu(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 sU({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function uc(e){N({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=b(),r=A({force:!0})??void 0;return{ok:!1,error:T(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function up(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function uf(e,t){let r=t.includeTokens?.filter(e=>e.length>0)??[],n="",i=n=>{(!(r.length>0)||r.some(e=>n.includes(e)))&&e.write(function(e,t){if(0===t.length)return e;let r=e;for(let e of t)r=r.replace(e,"[REDACTED]");return r}(n,t.redactionPatterns))};return{onChunk:e=>{let t=`${n}${e}`.split("\n");for(let e of(n=t.pop()??"",t))i(`${e}
|
|
16
|
+
`)},flush:()=>{n&&(i(n),n="")}}}function um(e,t,r){let n=e.stdout,i=e.stderr;return n&&i?(n.setEncoding("utf8"),i.setEncoding("utf8"),n.on("data",r.writer.onChunk),i.on("data",r.writer.onChunk),t.on("error",()=>{e.killed||e.kill("SIGKILL")}),e.on("error",()=>t.destroy()),new Promise(n=>{e.on("close",e=>{r.writer.flush(),r.endStreamOnClose&&t.end(),n({stdout:"",stderr:"",exitCode:e??1})})})):Promise.resolve({stdout:"",stderr:"missing stdio pipes",exitCode:1})}function uh(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new L("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function uw(e,t){let r=(await e9(el(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function ug(e,t){var r,n;let i;uh(t);let a=await uw(e,t),o=e9(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 uy(e,t,r,n,i){let a,o,s="recovering",l=!1,d=(async()=>{try{for(;!l;){let d=await uw(e,t);if(!d){s="recovering",await eU(1e3);continue}let u=e6(el(e)),c=eo(u,{pid:d});a=c;let p=uf(r,{redactionPatterns:n});if(o=um(c,r,{endStreamOnClose:!1,writer:p}),"number"==typeof c.pid&&tz(i,c.pid),s="active",await o,tJ(i),a=void 0,o=void 0,l)break;s="recovering",await eU(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),tJ(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:d,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await up(o),a&&!a.killed&&a.kill("SIGKILL"),await up(d),tJ(i)}}}function uv(e,t){let r=uI(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=uI(t);n.push(`process == "${e}"`,`processImagePath ENDSWITH[c] "/${e}"`,`senderImagePath ENDSWITH[c] "/${e}"`,`processImagePath CONTAINS[c] "/${e}.app/"`,`senderImagePath CONTAINS[c] "/${e}.app/"`)}return n.join(" OR ")}async function uS(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=ld(["spawn",t,"log","show","--style","compact","--info","--predicate",uv(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 ns(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 u_(e,t,r,n,i,a){let o=await ub({deviceId:e,appBundleId:t,simulatorSetPath:i});return uN({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return ld(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",uv(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function uI(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function ub(e){let{deviceId:t,appBundleId:r,simulatorSetPath:i}=e,a=await ns(ld(["get_app_container",t,r,"app"],{simulatorSetPath:i}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=n.join(o,"Info.plist"),l=await U("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function uA(e,t,r,n){return uN({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",uv(e)],stream:t,redactionPatterns:r,pidPath:n})}async function ux(e,t,r,n){return uN({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function uN(e){let t="active",r=$(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=uf(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&tz(e.pidPath,n.pid);let a=um(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),tJ(e.pidPath),r),r=>{throw t="failed",tJ(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await up(a),n.killed||n.kill("SIGKILL"),await up(a),tJ(e.pidPath)}}}let uM=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),uE=/https?:\/\/[^\s"'<>\])]+/i,uD=[/\bstatus(?:Code)?["'=: ]+([1-5]\d{2})\b/i,/\bresponse(?:\s+code)?["'=: ]+([1-5]\d{2})\b/i,/\bHTTP\/[0-9.]+\s+([1-5]\d{2})\b/i];function uk(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>uC(e)));for(let e of t.entries){let t=uC(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function uP(e,t){let r=uV(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=uV(t?.maxPayloadChars,2048,64,16384),o=uV(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=uM.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??c?.[1])?.toUpperCase(),m=uE.exec(o),h=d??m?.[0];if(!h)return null;let w=u??uO(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:uT(o),packetId:uL(o)??void 0,durationMs:u$(o)??void 0,raw:uq(o,a),line:r};if("android"===n&&function(e,t,r){let n=uR(t,r,5),i=e.packetId??n.map(e=>uL(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?uR(t,r,12).filter(e=>uL(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>uT(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>uO(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>u$(e)).find(e=>"number"==typeof e))}(g,e,t),"headers"===i||"all"===i){let e=function(e,t){if(t){let e=t.headers??t.requestHeaders??t.responseHeaders;if(void 0!==e)return uG(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=uq(e,a))}if("body"===i||"all"===i){let e=uU(o,s,["requestBody","body","payload","request"]),t=uU(o,s,["responseBody","response"]);e&&(g.requestBody=uq(e,a)),t&&(g.responseBody=uq(t,a))}return g}(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 uC(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function uR(e,t,r){let n=[],i=Math.max(0,t-r),a=Math.min(e.length-1,t+r);for(let t=i;t<=a;t+=1){let r=e[t]?.trim();r&&n.push(r)}return n}function uO(e){for(let t of uD){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function uT(e){let t=/\b\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z)?\b/.exec(e);if(t)return t[0];let r=/\b\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\b/.exec(e);return r?.[0]}function uL(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function u$(e){let t=/\b(?:duration|elapsed request\/response time, ms)[:= ]+(\d+)\b/i.exec(e);if(!t)return null;let r=Number.parseInt(t[1]??"",10);return Number.isInteger(r)?r:null}function uF(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.trim().length>0)return t.trim()}}function uU(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return uG(t[e])}for(let t of r){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=RegExp(`\\b${r}["'=: ]+(.+)$`,"i").exec(e);if(n?.[1])return n[1].trim()}}function uG(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function uq(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function uV(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let uj={start:async e=>await uY(e)},uB=r4(uj,function(e={}){return{...uj,...e}});async function uH(e,t){return await uB.run(e,t)}function uK(e,t){let r=process.env[e];if(!r)return t;let n=Number.parseInt(r,10);return Number.isInteger(n)&&n>0?n:t}function uW(e){let t=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:uK("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:uK("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function uz(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 uJ(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=uV(t?.maxEntries,25,1,200),s=t?.include??"summary",l=uV(t?.maxPayloadChars,2048,64,16384),d=uV(t?.maxScanLines,4e3,100,2e4),i.existsSync(m)?uP(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 ug(u.id,c);if(e){let t=uP(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y});t.entries.length>0&&(S=uk(t,S,h),_.push((r=I,n=e.recoveredPids,"stale-active"===r.reason?`Session app log stream was still bound to prior Android PID ${r.trackedPid}. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`:`Session app log stream was inactive. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`)))}}if("ios"===u.platform&&"simulator"===u.kind&&c&&0===S.entries.length){let e=await uQ({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=uk(e.dump,S,h),_.push(`Recovered ${e.dump.entries.length} iOS simulator HTTP entr${1===e.dump.entries.length?"y":"ies"} from simctl log show (${e.recoveredLineCount} app log lines scanned).`)):e.recoveredLineCount>0&&_.push(`Recovered ${e.recoveredLineCount} recent iOS simulator app log lines from simctl log show, but none looked like HTTP traffic. This app may not emit request URLs, status, or timing into Unified Logging for this repro window.`))}return void 0===p?_.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===_.length&&("ios"===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 tW(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),tK));if(!s)return null;let l=await uw(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function uZ(e,t,r,n){return await uB.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function uY({device:e,appBundleId:t,outPath:r,pidPath:n}){uW(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 ux(e.id,a,o,n):await u_(e.id,t,a,o,e.simulatorSetPath,n);if("android"===e.platform)return uh(t),await uy(e.id,t,a,o,n);if("macos"===e.platform)return await uA(t,a,o,n);throw a.end(),new L("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function uQ(e){let t=await uS({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:uP(t.text,{path:`${e.appLogPath} (simctl log show recovery)`,backend:"ios-simulator",maxEntries:e.maxEntries,include:e.include,maxPayloadChars:e.maxPayloadChars,maxScanLines:e.maxScanLines}),recoveredLineCount:t.recoveredLineCount}:null}async function u0(e){await e.stop(),await up(e.wait)}async function u1(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 ns(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await ns(["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 u2(e,t){uW(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
|
|
18
|
+
`;i.appendFileSync(e,r,"utf8")}function u3(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 u4(e,t){if("simulator"!==e.kind)throw new L("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function u5(){await no("open",["-a","Simulator"],{allowFailure:!0,timeoutMs:1e4})}async function u8(e){let t,r;if("simulator"!==e.kind||"Booted"===await u9(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 ns(lu(e,["boot",e.id]),{allowFailure:!0,timeoutMs:i});t={stdout:String(a.stdout??""),stderr:String(a.stderr??""),exitCode:a.exitCode};let o=`${t.stdout}
|
|
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 ns(lu(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:i});if(r={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==r.exitCode)throw new L("COMMAND_FAILED","simctl bootstatus failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let d=await u9(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 u5()}async function u6(e){let t=lu(e,["shutdown",e.id]),r=await ns(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===r.exitCode,exitCode:r.exitCode,stdout:String(r.stdout??""),stderr:String(r.stderr??"")}}async function u9(e){let t="string"==typeof e?e:e.id,r="string"==typeof e?ld(["list","devices","-j"]):lu(e,["list","devices","-j"]),n=await ns(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 u7="shared_prefs/ReactNativeDevPrefs.xml",ce="debug_http_host",ct="dev_server_https",cr="RCT_jsLocation",cn="RCT_packager_scheme",ci="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.",ca='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function co(e){return void 0!==D(e)}async function cs(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 cd(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await cf(t,r,i)}}async function cl(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await cu(t,r);"ios"===t.platform&&"simulator"===t.kind&&await cm(t,r)}}async function cd(e,t,r){var n,i,a,o,s,l;let d,u;cy(t);let c=(n=await cc(e,t),i=ce,a=`${r.host}:${r.port}`,d=` <string name="${cv(i)}">${cv(a)}</string>`,cw(cg(n,i),d));o=c,s=ct,l="https"===r.scheme,u=` <boolean name="${cv(s)}" value="${l?"true":"false"}" />`,c=cw(cg(o,s),u),await cp(e,t,c)}async function cu(e,t){cy(t);let r=await cc(e,t),n=cg(r,ce),i=cg(n,ct);i!==r&&await cp(e,t,i)}async function cc(e,t){let r=await Y(e,["shell","run-as",t,"cat",u7],{allowFailure:!0});return 0!==r.exitCode?ca:ch(r.stdout)}async function cp(e,t,r){let n=["shell","run-as",t,"id"],i=await Y(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=cS(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?ci:"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",u7],{stdin:r.trimEnd()})}catch(n){let e=O(n);if("TOOL_MISSING"===e.code)throw e;let r=cS("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?ci:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function cf(e,t,r){await ns(lu(e,["spawn",e.id,"defaults","write",t,cr,"-string",`${r.host}:${r.port}`])),await ns(lu(e,["spawn",e.id,"defaults","write",t,cn,"-string",r.scheme]))}async function cm(e,t){await ns(lu(e,["spawn",e.id,"defaults","delete",t,cr]),{allowFailure:!0}),await ns(lu(e,["spawn",e.id,"defaults","delete",t,cn]),{allowFailure:!0})}function ch(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
|
|
20
|
+
`:ca}function cw(e,t){return ch(e).replace("</map>",`${t}
|
|
21
|
+
</map>`)}function cg(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return ch(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 cy(e){if("binary"!==ep(e))return;let t=ew(e);throw new L("INVALID_ARGS",t,{package:e,hint:t})}function cv(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function cS(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 c_=new Map;async function cI(e){let r=await h.mkdtemp(n.join(u.tmpdir(),"agent-device-materialized-"));try{let i=await cx(e.installablePath,n.join(r,"installable")),a=e.archivePath?await cx(e.archivePath,n.join(r,"archive")):void 0,o=t.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{cb(o)},s);return c_.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 cb(e,t){let r=c_.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),c_.delete(e),await h.rm(r.rootPath,{recursive:!0,force:!0})}async function cA(e){let t=Array.from(c_.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await cb(e)}))}async function cx(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 cN(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 cM(e){let{device:t,shutdownRequested:r}=e;if(r&&(iS(t)||"android"===t.platform&&"emulator"===t.kind))try{return iS(t)?await u6(t):await cN(t)}catch(t){let e=T(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function cE(e){if(await dH(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await i5("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 cD(e,t){e.appLog&&await u0(e.appLog),rG(e.device.platform)&&await cE(e),await cA(t).catch(()=>{})}async function ck(e){let t,{req:r,sessionName:n,logPath:i,sessionStore:a}=e,o=a.get(n);if(!o)return await cP(r,i);o.appLog&&await u0(o.appLog),r.positionals&&r.positionals.length>0&&(rG(o.device.platform)&&await cE(o),await n7(o.device,"close",r.positionals,r.flags?.out,{...aM(i,r.flags,o.appBundleId,o.trace?.outPath)}),await i_(o.device,ih)),rG(o.device.platform)&&(t=(r.positionals?.length??0)>0,!iS(o.device)||t||r.flags?.shutdown||o.recording)?await cE(o):rG(o.device.platform)&&N({level:"debug",phase:"ios_runner_retained_after_close",data:{session:o.name,deviceId:o.device.id}}),co(a.getRuntimeHints(n))&&o.appBundleId&&await cl({device:o.device,appId:o.appBundleId}).catch(()=>{}),a.recordAction(o,{command:"close",positionals:r.positionals??[],flags:r.flags??{},result:{session:n,...eq(`Closed: ${n}`)}}),r.flags?.saveScript&&(o.recordSession=!0),a.writeSessionLog(o),await cA(n).catch(()=>{}),a.delete(n);let s=await cM({device:o.device,shutdownRequested:r.flags?.shutdown});return s?{ok:!0,data:eV({session:n,shutdown:s},`Closed: ${n}`)}:{ok:!0,data:{session:n,...eq(`Closed: ${n}`)}}}async function cP(e,t){if(!e.positionals||0===e.positionals.length)return im("SESSION_NOT_FOUND","No active session");let r=await iI({session:void 0,flags:e.flags,ensureReady:!0});return await n7(r,"close",e.positionals,e.flags?.out,{...aM(t,e.flags)}),await i_(r,ih),{ok:!0,data:{app:e.positionals[0],...eq(`Closed: ${e.positionals[0]}`)}}}async function cC(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 cR(e){i.existsSync(e)&&i.unlinkSync(e)}function cO(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 cT(e){let t=cO(e);if(!t||t.pid===process.pid)try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}function cL(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function c$(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,tK);if(i.existsSync(t))try{let e=tW(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{tJ(t)}}let _=new tH(m),b=new rF({maxActiveSimulatorLeases:cL(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:cL(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:cL(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:cL(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),x=e5(),D=t.randomBytes(24).toString("hex"),k=M(process.pid)??void 0,C=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:T(new L("UNAUTHORIZED","Invalid token"))};try{return await rQ(d,async()=>{let d=await ul({req:e,sessionStore:c,leaseRegistry:p});return await d.runLocked(async()=>{let e=ud({scope:d,logPath:t,sessionStore:c,trackDownloadableArtifact:u});if("response"===e.type)return e.response;let m=e.scope;return await iM({req:m.req,existingSession:m.existingSession,providers:{androidAdbProvider:n,appleRunnerProvider:i,appleToolProvider:a,linuxToolProvider:o,appLogProvider:s,recordingProvider:l}},async e=>{let n=await sZ({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&&eH.replayScopedAction.has(a.command)))return await n(e);if(e.token!==i.token)return{ok:!1,error:T(new L("UNAUTHORIZED","Invalid token"))};try{let a=await ul({req:e,sessionStore:i.sessionStore,leaseRegistry:i.leaseRegistry});if(a.sessionName!==t.sessionName)return await n(e);let o=ud({scope:a,logPath:i.logPath,sessionStore:i.sessionStore,trackDownloadableArtifact:i.trackDownloadableArtifact});if("response"===o.type)return o.response;let s=o.scope,l=await sZ({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 uu({lockedScope:s,logPath:i.logPath,sessionStore:i.sessionStore})}catch(e){return uc(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 uu({lockedScope:m,logPath:t,sessionStore:c})})})})}catch(e){return uc(e)}})}return f}({logPath:f,token:D,sessionStore:_,leaseRegistry:b,trackDownloadableArtifact:re}),$=async e=>{await I({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{N({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),A({force:!0})})},F=async e=>{let t=cD(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
|
|
23
23
|
`)});await Promise.race([t,eU(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
|
|
24
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))t2(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(tc);if(await e(),n<=0)break;await eU(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=V(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=t0(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),t1(a),t4(a))throw t8();r=await rp(o?t=>{e.destroyed||e.write(X(t))}:void 0,async()=>await R(n))}catch(e){r={ok:!1,error:T(e)}}finally{n-=1,a&&(i.delete(a),t3(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
|
|
25
|
+
`)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await c$(i,"Failed to bind socket server")}if("socket"!==h){let e=await rk({handleRequest:R,token:D});r.push(e),t=await c$(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=cO(t);if(o?.pid&&o.pid!==process.pid&&P(o.pid,o.processStartTime))return!1;try{i.unlinkSync(t)}catch{}return a()}(u,p,{pid:process.pid,version:x,startedAt:Date.now(),processStartTime:k}))return l.write("Daemon lock is held by another process; exiting.\n"),d(0),null;let q=[];try{let e,t=await G();q=t.servers,r=t.socketPort,a=t.httpPort,g=r,y=a,v={socketPort:g,httpPort:y,token:D,version:x,codeSignature:C,processStartTime:k},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
26
|
`),y&&s.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${y}
|
|
27
27
|
`)}catch(t){let e=O(t);for(let t of(l.write(`Daemon error: ${e.message}
|
|
28
|
-
`),q))try{t.close(()=>{})}catch{}return
|
|
28
|
+
`),q))try{t.close(()=>{})}catch{}return cR(c),cT(p),d(1),null}let B=!1,W=async(e={})=>{if(B)return;B=!0,e.cause&&await $(e.cause),await cC(q),await U();let{stopAllIosRunnerSessions:t}=await Promise.resolve(tc);await t(),cR(c),cT(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:O(e);l.write(`Daemon error: ${t.message}
|
|
29
29
|
`),W({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof L?t:O(t);l.write(`Daemon error: ${r.message}
|
|
30
30
|
`),W({exitCode:1,cause:t})})),{httpPort:a,shutdown:W,socketPort:r,token:D}})().catch(e=>{let t=O(e);process.stderr.write(`Daemon error: ${t.message}
|
|
31
|
-
`),process.exit(1)});export{nm as IOS_DEVICECTL_DEFAULT_HINT,
|
|
31
|
+
`),process.exit(1)});export{nm as IOS_DEVICECTL_DEFAULT_HINT,di as IOS_RUNNER_CONTAINER_BUNDLE_IDS,ih as IOS_SIMULATOR_POST_CLOSE_SETTLE_MS,iw as IOS_SIMULATOR_POST_OPEN_SETTLE_MS,nx as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,nA as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,tH as SessionStore,sn as annotateScreenshotWithRefs,uH as withAppLogProvider,u2 as appendAppLogMarker,cs as applyRuntimeHintsToApp,ld as buildSimctlArgs,lu as buildSimctlArgsForDevice,oo as buildSnapshotState,nE as buttonTag,ov as captureAndroidUiHierarchyXml,a6 as captureSnapshot,cb as cleanupRetainedMaterializedPaths,ri as cleanupUploadedArtifact,u3 as clearAppLogFiles,t3 as clearRequestCanceled,cl as clearRuntimeHintsFromApp,aM as context_contextFromFlags,op as createDaemonRuntimeSessionStore,d1 as createLocalAppleRunnerProvider,t8 as createRequestCanceledError,r4 as createScopedProvider,n7 as dispatchCommand,rf as emitRequestProgress,oH as ensureAndroidBlockingSystemDialogReady,ng as ensureDeviceReady,im as errorResponse,r5 as filterAppleAppsByBundlePrefix,tq as formatPortableActionLine,tO as formatScriptActionSummary,tk as formatScriptStringLiteral,ab as getActiveAndroidSnapshotFreshness,uz as getAppLogPathMetadata,nM as getClickButtonValidationError,t5 as getRequestSignal,dV as getRunnerSessionSnapshot,u9 as getSimulatorState,s_ as getSnapshotReferenceFrame,ck as handleCloseCommand,iv as hasExplicitSessionFlag,co as hasRuntimeTransportHints,d3 as hasScopedAppleRunnerProvider,na as hasScopedAppleToolProvider,tv as inferFillText,rG as isApplePlatform,tN as isClickLikeCommand,iq as isCommandSupportedOnDevice,ax as isNavigationSensitiveAction,t4 as isRequestCanceled,tM as isTouchTargetCommand,r0 as listDeviceInventory,nc as listIosDeviceApps,np as listIosDeviceProcesses,i9 as runMacOsPressAction,i6 as runMacOsReadTextAction,aI as markAndroidSnapshotFreshness,aE as markPendingInteractionOutcome,t2 as markRequestCanceled,rU as normalizePlatformSelector,tG as parseReplayOpenFlags,tF as parseReplayRuntimeFlags,t$ as parseReplaySeriesFlags,lG as parseXmlDocumentSync,rn as prepareUploadedArtifact,d9 as prewarmIosRunnerSession,i3 as quitMacOsApp,nl as readApplePlistJson,uJ as readSessionNetworkCapture,sA as recordTouchVisualizationEvent,oB as recoverAndroidBlockingSystemDialog,ib as refreshSessionDeviceIfNeeded,t1 as registerRequestAbort,ig as requireSessionOrExplicitSelector,u4 as requireSimulatorDevice,iA as resolveAndroidEmulatorAvdName,d2 as resolveAppleRunnerProvider,rV as resolveAppleSimulatorSetPathForSelector,nn as resolveAppleToolProvider,nN as resolveClickButton,iI as resolveCommandDevice,i2 as resolveFrontmostMacOsApp,nh as resolveIosDevicectlHint,li as resolveLeaseScope,an as resolveLinuxToolProvider,n8 as resolvePayloadInput,t0 as resolveRequestTrackingId,ou as resolveSnapshotScope,rX as resolveTargetDevice,cI as retainMaterializedPaths,u1 as runAppLogDoctor,no as runAppleToolCommand,nu as runIosDevicectl,aa as runLinuxToolCommand,i5 as runMacOsAlertAction,i4 as runMacOsPermissionAction,i7 as runMacOsScreenshotAction,i8 as runMacOsSnapshotAction,lc as runSimctlForDevice,ns as runXcrun,d6 as runIosRunnerCommand,d5 as withAppleRunnerProvider,dK as abortAllIosRunnerSessions,dW as stopAllIosRunnerSessions,ix as selectorTargetsSessionDevice,oc as setSessionSnapshot,i_ as settleIosSimulator,u6 as shutdownSimulator,u8 as ensureBootedSimulator,oS as snapshotAndroid,ay as snapshotLinux,av as readLinuxTextAtPoint,uZ as startAppLog,u0 as stopAppLog,dH as stopIosRunnerSession,aP as stripInternalInteractionOutcomeFlags,ni as withAppleToolProvider,ai as withLinuxToolProvider,tS as uniqueStrings,lq as visitXmlPlistEntries,s9 as withKeyedLock};
|