agent-device 0.17.1 → 0.17.3
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 +3 -3
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.1.apk → agent-device-android-multitouch-helper-0.17.3.apk} +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.3.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.1.manifest.json → agent-device-android-multitouch-helper-0.17.3.manifest.json} +4 -4
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.1.apk → agent-device-android-snapshot-helper-0.17.3.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.3.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.1.manifest.json → agent-device-android-snapshot-helper-0.17.3.manifest.json} +6 -6
- package/dist/src/123.js +1 -0
- package/dist/src/1231.js +1 -1
- package/dist/src/1352.js +1 -1
- package/dist/src/221.js +2 -2
- package/dist/src/2403.js +3 -0
- package/dist/src/2415.js +36 -30
- package/dist/src/4778.js +1 -1
- package/dist/src/5611.js +1 -0
- package/dist/src/5827.js +1 -0
- package/dist/src/6088.js +1 -0
- package/dist/src/6133.js +1 -0
- package/dist/src/7556.js +1 -1
- package/dist/src/7847.js +1 -1
- package/dist/src/8806.js +3 -3
- package/dist/src/9010.js +1 -0
- package/dist/src/9238.js +3 -3
- package/dist/src/9471.js +1 -1
- package/dist/src/9542.js +6 -3
- package/dist/src/9616.js +2 -0
- package/dist/src/9818.js +1 -1
- package/dist/src/android-adb.d.ts +12 -6
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-snapshot-helper.d.ts +15 -8
- package/dist/src/android.js +5 -5
- package/dist/src/apple.js +1 -1
- package/dist/src/apps.js +10 -10
- package/dist/src/args.js +53 -14
- package/dist/src/batch.d.ts +16 -4
- package/dist/src/batch.js +1 -1
- package/dist/src/cli-output.js +29 -0
- package/dist/src/cli.js +17 -42
- package/dist/src/command-surface.js +1 -1
- package/dist/src/contracts.d.ts +80 -4
- package/dist/src/contracts.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.d.ts +3 -1
- package/dist/src/generic.js +7 -7
- package/dist/src/index.d.ts +250 -79
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/internal/png-worker.d.ts +26 -0
- package/dist/src/internal/png-worker.js +1 -0
- package/dist/src/metro.d.ts +3 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-trace-recording.js +3 -3
- package/dist/src/remote-config.d.ts +33 -7
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.d.ts +17 -3
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +2 -2
- package/dist/src/session.js +8 -11
- package/dist/src/snapshot.js +2 -2
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +1 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +14 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +297 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +328 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +121 -172
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +153 -5
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +171 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +0 -10
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +64 -18
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +200 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +406 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +82 -169
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +425 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +77 -6
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +10 -1
- package/ios-runner/README.md +5 -5
- package/ios-runner/RUNNER_PROTOCOL.md +0 -1
- package/package.json +8 -5
- package/server.json +2 -2
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.1.apk.sha256 +0 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.1.apk.sha256 +0 -1
- package/dist/src/1998.js +0 -1
- package/dist/src/2805.js +0 -1
- package/dist/src/4057.js +0 -1
- package/dist/src/5310.js +0 -1
- package/dist/src/5792.js +0 -1
- package/dist/src/6085.js +0 -1
- package/dist/src/6232.js +0 -1
- package/dist/src/7455.js +0 -1
- package/dist/src/8020.js +0 -1
- package/dist/src/8502.js +0 -1
- package/dist/src/8699.js +0 -1
- package/dist/src/940.js +0 -1
- package/dist/src/9404.js +0 -1
- package/dist/src/9533.js +0 -1
- package/dist/src/command-metadata.js +0 -1
- /package/dist/src/{1393.js → 3675.js} +0 -0
package/dist/src/2415.js
CHANGED
|
@@ -1,31 +1,37 @@
|
|
|
1
|
-
let e;import{__webpack_require__ as t}from"./rslib-runtime.js";import n,{createHash as r}from"node:crypto";import i from"node:path";import a,{existsSync as o,promises as s}from"node:fs";import l from"node:http";import{fileURLToPath as c,pathToFileURL as d}from"node:url";import"node:https";import u from"node:os";import{once as p}from"node:events";import{Transform as f}from"node:stream";import{pipeline as m}from"node:stream/promises";import{AsyncLocalStorage as h}from"node:async_hooks";import w from"node:fs/promises";import g from"node:net";import{resolveUserPath as v}from"./3267.js";import{appendScreenshotScriptFlags as y,screenshotOptionsFromFlags as S,screenshotFlagsFromOptions as _,SCREENSHOT_ACTION_FLAG_KEYS as I}from"./5310.js";import{withDiagnosticsScope as b,getDiagnosticsMeta as A,flushDiagnosticsToSessionFile as x,withDiagnosticTimer as N,updateDiagnosticsScope as M,emitDiagnostic as E}from"./7599.js";import{readProcessStartTime as D,readProcessCommand as k,resolveRuntimeTransportHints as P,isProcessGroupAlive as C,isAgentDeviceDaemonProcess as R,isProcessAlive as T}from"./8656.js";import{toAppErrorCode as O,asAppError as L,normalizeError as $,AppError as F}from"./9152.js";import{runCmdBackground as U,runCmdStreaming as G,runCmd as q,runCmdSync as j,resolveExecutableOverridePath as V,whichCmd as B}from"./9818.js";import{consumeTextLines as H,serializeDaemonResponseEnvelope as K,normalizeTenantId as W,shouldStreamRequestProgress as z,resolveDaemonPaths as J,resolveSessionIsolationMode as X,shellQuoteIfNeeded as Z,resolveDaemonServerMode as Y,resolveDaemonCodeSignature as Q,serializeDaemonProgressEnvelope as ee,serializeDaemonRpcResponseEnvelope as et}from"./9238.js";import{runAndroidAdb as en,resolveIosSimulatorDeviceSetPath as er,getAndroidBlockingDialogFocus as ei,withRetry as ea,Deadline as eo,isEnvTruthy as es,openAndroidApp as el,classifyBootFailure as ec,streamAndroidLogcatWithAdb as ed,bootFailureHint as eu,androidDeviceForSerial as ep,parseSerialAllowlist as ef,retryWithPolicy as em,getAndroidAppState as eh,classifyAndroidAppTarget as ew,captureAndroidLogcatWithAdb as eg,resolveAndroidSerialAllowlist as ev,isDeepLinkTarget as ey,formatAndroidInstalledPackageRequiredMessage as eS}from"./8806.js";import{PUBLIC_COMMANDS as e_,INTERNAL_COMMANDS as eI,GESTURE_SUBCOMMAND_ERROR as eb}from"./5792.js";import{findMistargetedTypeRefToken as eA,buildSwipePresetGesturePlan as ex,analyzeReactNativeOverlay as eN,parseScrollDirection as eM,isKeyboardAction as eE,areRectsApproximatelyEqual as eD,isSystemScrollIndicatorLabel as ek,formatScrollEdgeMessage as eP,isReactNativeCollapsedWarningWrapperWithVisibleBanner as eC,deriveMobileSnapshotHiddenContentHints as eR,decodePng as eT,inferVerticalScrollIndicatorDirections as eO,captureScrollEdgeState as eL,normalizeSnapshotTree as e$,isReactNativeCollapsedWarningWrapperCandidate as eF,PNG as eU,createAgentDevice as eG,runScrollEdgePasses as eq,requireIntInRange as ej,inferGestureReferenceFrame as eV,annotateCoveredSnapshotNodes as eB,localCommandPolicy as eH,buildScrollGesturePlan as eK,parseSwipePreset as eW}from"./9533.js";import{sleep as ez}from"./4829.js";import{readLocationCoordinate as eJ,successText as eX,withSuccessText as eZ,parseDeviceRotation as eY}from"./1998.js";import{findNearestAncestor as eQ,normalizeType as e0,pruneGroupNodes as e1,findNodeByLabel as e2,resolveRefLabel as e3}from"./940.js";import{snapshotPresentationOptionsFromFlags as e4,normalizeRef as e5,findNodeByRef as e8,buildSnapshotPresentationKey as e6,centerOfRect as e9,attachRefs as e7}from"./4057.js";import{isScrollableType as te}from"./4778.js";import{readVersion as tt,findProjectRoot as tn}from"./9671.js";import{resolveAndroidAdbProvider as tr,resolveAndroidAdbExecutor as ti}from"./9639.js";import{parseUiHierarchy as ta,ensureAndroidSnapshotHelper as to,parseUiHierarchyTree as ts,captureAndroidSnapshotWithHelper as tl,captureAndroidSnapshotWithHelperSession as tc,parseAndroidSnapshotHelperManifest as td,forgetAndroidSnapshotHelperInstall as tu,buildUiHierarchySnapshot as tp,stopAndroidSnapshotHelperSession as tf}from"./221.js";import{applyCommandDefaults as tm}from"./1352.js";var th,tw,tg={};t.r(tg),t.d(tg,{IH:()=>pt,ug:()=>pn,sE:()=>u3,Bx:()=>u4,WX:()=>pe,Co:()=>u8,wg:()=>u7,withAppLogProvider:()=>u0});var tv={};t.r(tv),t.d(tv,{IO:()=>iQ,LB:()=>iY,xY:()=>i1,eN:()=>i0,runMacOsPressAction:()=>i4,runMacOsReadTextAction:()=>i3,rR:()=>i5,r5:()=>i2});var ty={};t.r(ty),t.d(ty,{bu:()=>cN,abortAllIosRunnerSessions:()=>dB,hv:()=>dG,Nr:()=>up,gE:()=>uu,FS:()=>cA,runIosRunnerCommand:()=>ud,stopAllIosRunnerSessions:()=>dH,yA:()=>dV});var tS={};t.r(tS),t.d(tS,{v:()=>d1,M:()=>d2,withAppleRunnerProvider:()=>d3});var t_={};t.r(t_),t.d(t_,{ensureBootedSimulator:()=>pa,SA:()=>ps,EB:()=>pr,N3:()=>po});var tI={};t.r(tI),t.d(tI,{qx:()=>iR,Ly:()=>iL,Gr:()=>iP,vT:()=>iT,Cc:()=>iO,withAppleToolProvider:()=>iC});var tb={};t.r(tb),t.d(tb,{readLinuxTextAtPoint:()=>ah,r:()=>am});var tA={};function tx(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}t.r(tA),t.d(tA,{uK:()=>i7,nE:()=>at,withLinuxToolProvider:()=>ae});let tN=["platform","device","udid","serial","out","verbose","metroHost","metroPort","bundleUrl","launchUrl","snapshotInteractiveOnly","snapshotCompact","snapshotDepth","snapshotScope","snapshotRaw",...I,"relaunch","saveScript","noRecord","fps","quality","hideTouches","count","intervalMs","delayMs","holdMs","jitterPx","doubleTap","clickButton","pauseMs","pattern"];function tM(e){let t=e.result?.text;if("string"==typeof t&&t.trim().length>0)return t;let n=e.positionals??[];if(0===n.length)return"";let r=n[0];return r?.startsWith("@")?n.length>=3?n.slice(2).join(" ").trim():n.slice(1).join(" ").trim():!(n.length>=3)||Number.isNaN(Number(n[0]))||Number.isNaN(Number(n[1]))?n.slice(1).join(" ").trim():n.slice(2).join(" ").trim()}function tE(e){let t=new Set,n=[];for(let r of e)t.has(r)||(t.add(r),n.push(r));return n}let tD=/^-?\d+(\.\d+)?$/,tk=/^[^\s"\\]+$/,tP=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),tC=new Map([["--count","count"],["--pause-ms","pauseMs"]]),tR=new Map([["--delay-ms","delayMs"]]);function tT(e){return"click"===e||"press"===e}function tO(e){return tT(e)||"longpress"===e}function tL(e){return"type"===e||"fill"===e}function t$(e){return tU(e,tG)}function tF(e){return JSON.stringify(e)}function tU(e,t){return t(e)?e:tF(e)}function tG(e){return tq(e)&&e.startsWith("@")||tD.test(e)}function tq(e){return tk.test(e)}function tj(e){let t=(e.positionals??[]).map(e=>t$(e));return[e.command,...t].join(" ")}function tV(e,t){let n=t.flags??{};if(tT(t.command)){"number"==typeof n.count&&e.push("--count",String(n.count)),"number"==typeof n.intervalMs&&e.push("--interval-ms",String(n.intervalMs)),"number"==typeof n.holdMs&&e.push("--hold-ms",String(n.holdMs)),"number"==typeof n.jitterPx&&e.push("--jitter-px",String(n.jitterPx)),!0===n.doubleTap&&e.push("--double-tap");let t=n.clickButton;t&&"primary"!==t&&e.push("--button",t);return}if("swipe"===t.command){"number"==typeof n.count&&e.push("--count",String(n.count)),"number"==typeof n.pauseMs&&e.push("--pause-ms",String(n.pauseMs)),("one-way"===n.pattern||"ping-pong"===n.pattern)&&e.push("--pattern",n.pattern);return}tL(t.command)&&"number"==typeof n.delayMs&&e.push("--delay-ms",String(n.delayMs))}function tB(e,t){t&&(("ios"===t.platform||"android"===t.platform)&&e.push("--platform",t.platform),"string"==typeof t.metroHost&&t.metroHost.length>0&&e.push("--metro-host",tU(t.metroHost,tq)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",tU(t.bundleUrl,tq)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",tU(t.launchUrl,tq)))}function tH(e,t){let n=[],r={},i=tT(e)?tP:"swipe"===e?tC:tL(e)?tR:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(tT(e)&&"--double-tap"===o){r.doubleTap=!0;continue}let s=t[a+1];if(tT(e)&&"--button"===o&&void 0!==s){("primary"===s||"secondary"===s||"middle"===s)&&(r.clickButton=s),a+=1;continue}let l=i?.get(o);if(l&&void 0!==s){let e=tW(s);if(null!==e){r[l]=e,a+=1;continue}}if("swipe"===e&&"--pattern"===o&&void 0!==s){("one-way"===s||"ping-pong"===s)&&(r.pattern=s),a+=1;continue}n.push(o)}return{positionals:n,flags:r}}function tK(e){let t=[],n={};for(let r=0;r<e.length;r+=1){let i=e[r],a=e[r+1];if("--platform"===i&&void 0!==a){("ios"===a||"android"===a)&&(n.platform=a),r+=1;continue}if("--metro-host"===i&&void 0!==a){n.metroHost=a,r+=1;continue}if("--metro-port"===i&&void 0!==a){let e=tW(a);null!==e&&(n.metroPort=e),r+=1;continue}if("--bundle-url"===i&&void 0!==a){n.bundleUrl=a,r+=1;continue}if("--launch-url"===i&&void 0!==a){n.launchUrl=a,r+=1;continue}t.push(i)}return{positionals:t,flags:n}}function tW(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function tz(e){var t;let n=[],r={};for(let t of e){if("--relaunch"===t){r.relaunch=!0;continue}n.push(t)}let i=tK(n);return{positionals:i.positionals,flags:r,runtime:(t=i.flags).platform||t.metroHost||void 0!==t.metroPort||t.bundleUrl||t.launchUrl?i.flags:void 0}}function tJ(e,t={}){let n=[e.command];if("snapshot"===e.command)e.flags?.snapshotInteractiveOnly&&n.push("-i"),e.flags?.snapshotCompact&&n.push("-c"),"number"==typeof e.flags?.snapshotDepth&&n.push("-d",String(e.flags.snapshotDepth)),e.flags?.snapshotScope&&n.push("-s",t$(e.flags.snapshotScope)),e.flags?.snapshotRaw&&n.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])n.push(t$(t));e.flags?.relaunch&&n.push("--relaunch"),tB(n,e.runtime)}else if("runtime"===e.command)!function(e,t,n={}){let r=t.positionals??[];for(let t of n.includeAllPositionals?r:r.slice(0,1))e.push(tU(t,tq));tB(e,t.flags)}(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals});else if("record"===e.command)!function(e,t){let[n,...r]=t.positionals??[];for(let t of(n&&e.push(tU(n,tq)),r))e.push(t$(t));"number"==typeof t.flags?.fps&&e.push("--fps",String(t.flags.fps)),"number"==typeof t.flags?.quality&&e.push("--quality",String(t.flags.quality)),t.flags?.hideTouches&&e.push("--hide-touches")}(n,e);else if("screenshot"===e.command){for(let t of e.positionals??[])n.push(t$(t));y(n,e.flags)}else{for(let t of e.positionals??[])n.push(t$(t));tV(n,e)}return n.join(" ")}class tX{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let n=i.dirname(t);a.existsSync(n)||a.mkdirSync(n,{recursive:!0});let r=function(e){var t=e,n=function(e){let t=[];for(let n of e.actions){if("snapshot"===n.command)continue;let r=function(e){let t=function(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>"string"==typeof e)?e.result.selectorChain:[];return t.length>0?t.join(" || "):void 0}(e);if(t&&tZ(e.command))return tT(e.command)?{...e,positionals:[t]}:"longpress"===e.command?function(e,t){let n="number"==typeof e.result?.durationMs?String(e.result.durationMs):function(e){let t=e.at(-1);if(!(e.length<=1)&&void 0!==t&&""!==t.trim())return Number.isFinite(Number(t))?t:void 0}(e.positionals??[]);return{...e,positionals:n?[t,n]:[t]}}(e,t):"fill"===e.command?function(e,t){let n=tM(e);return n.length>0?{...e,positionals:[t,n]}:void 0}(e,t):function(e,t){let n=e.positionals?.[0];return"text"===n||"attrs"===n?{...e,positionals:[n,t]}:void 0}(e,t)}(n);if(r){t.push(r);continue}let i=function(e,t){if(!tZ(t.command))return;let n=t.result?.refLabel;if("string"!=typeof n||0===n.trim().length)return;let r=n.trim();return{ts:t.ts,command:"snapshot",positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotCompact:!0,snapshotScope:r},result:{scope:r}}}(e,n);i&&t.push(i),t.push(n)}return t}(e);let r=[],i=t.device.kind?` kind=${t.device.kind}`:"";for(let e of(r.push(`context platform=${t.device.platform} device=${tF(t.device.name)}${i} theme=unknown`),n))e.flags?.noRecord||r.push(function(e){var t,n;let r=(t=[e.command],n=e,tT(n.command)?function(e,t){let n=t.positionals?.[0];if(n){if(n.startsWith("@"))return e.push(t$(n)),tY(e,t),tV(e,t),e.join(" ");if(1===t.positionals.length)return e.push(t$(n)),tV(e,t),e.join(" ")}}(t,n):"fill"===n.command?function(e,t){let n=t.positionals?.[0];if(!n?.startsWith("@"))return;e.push(t$(n)),tY(e,t);let r=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(t$(r)),tV(e,t),e.join(" ")}(t,n):"get"===n.command?function(e,t){let n=t.positionals?.[0],r=t.positionals?.[1];if(n&&r)return e.push(t$(n)),e.push(t$(r)),r.startsWith("@")&&tY(e,t),e.join(" ")}(t,n):void 0);return r||tJ(e)}(e));return`${r.join("\n")}
|
|
2
|
-
`}(e);return a.writeFileSync(t,
|
|
3
|
-
`)}function t5(e){if(e&&a.existsSync(e))try{a.unlinkSync(e)}catch{}}let t8=new Set,t6=new Map,t9="request_canceled",t7="request canceled";function ne(e,t){if("string"==typeof e&&e.length>0)return e;let n=("string"==typeof t?t:"number"==typeof t&&Number.isFinite(t)?String(t):"generated").trim().replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,32)||"generated",r=Math.random().toString(36).slice(2,10);return`req:${n}:${process.pid}:${Date.now()}:${r}`}function nt(e){if(!e)return;!function(e){if(e.size<=5e4)return;let t=0;for(let n of e.keys()){if(t>=1e4)break;e.delete(n),t++}}(t6);let t=new AbortController;t6.set(e,t),t8.has(e)&&t.abort()}function nn(e){e&&(!function(e){if(e.size<=5e4)return;let t=0;for(let n of e){if(t>=1e4)break;e.delete(n),t++}}(t8),t8.add(e),t6.get(e)?.abort())}function nr(e){e&&(t8.delete(e),t6.delete(e))}function ni(e){return!!e&&t8.has(e)}function na(e){if(e)return t6.get(e)?.signal}function no(){return new F("COMMAND_FAILED",t7,{reason:t9})}function ns(e){if(ni(e))throw no()}function nl(e){return e instanceof F&&"COMMAND_FAILED"===e.code&&(e.details?.reason===t9||e.message===t7)}let nc=new Map;function nd(e){let t=n.randomUUID(),r=setTimeout(()=>{nu(t)},9e5);return r.unref(),nc.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:r}),t}function nu(e){let t=nc.get(e);if(t&&(clearTimeout(t.timer),nc.delete(e),t.deleteAfterDownload))try{a.rmSync(t.artifactPath,{force:!0})}catch{}}let np=new Map;function nf(e,t){let n=np.get(e);if(!n)throw new F("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(n.tenantId&&n.tenantId!==t)throw new F("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(n.timer),n.artifactPath}function nm(e){let t=np.get(e);t&&(clearTimeout(t.timer),np.delete(e),a.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function nh(e){let t=await nw(e);await q("tar",["xf",e.archivePath,"-C",e.tempDir]);let n=i.join(e.tempDir,t);if(!a.existsSync(n))throw new F("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return n}async function nw(e){let t=await q("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new F("INVALID_ARGS","Artifact is not a valid tar archive",{archivePath:e.archivePath,stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let n=t.stdout.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(0===n.length)throw new F("INVALID_ARGS","Uploaded app bundle archive is empty");let r=n.map(ng),i=e.expectedRootName??function(e,t){let n=new Set;for(let t of e){let[e]=t.split("/");e&&n.add(e)}let r=[...n];if("ios"===t){let e=r.filter(e=>e.toLowerCase().endsWith(".app")),t=e[0];if(void 0!==t&&1===e.length)return t;if(0===e.length)throw new F("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new F("INVALID_ARGS",`iOS app bundle archives must contain exactly one top-level .app directory, found: ${e.join(", ")}`)}let i=r[0];if(void 0!==i&&1===r.length)return i;throw new F("INVALID_ARGS",`Archive must contain a single top-level bundle, found: ${r.join(", ")}`)}(r,e.platform);if(!r.some(e=>e===i||e.startsWith(`${i}/`)))throw new F("INVALID_ARGS",`Uploaded archive must contain a top-level "${i}" bundle`);for(let e of r){var a=e,o=i;if(a!==o&&!a.startsWith(`${o}/`))throw new F("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await q("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new F("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function ng(e){if(e.includes("\0"))throw new F("INVALID_ARGS",`Invalid archive entry: ${e}`);if(i.posix.isAbsolute(e))throw new F("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=i.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new F("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function nv(e,t){return new Promise((n,r)=>{let i,o=!1,s=0,l=a.createWriteStream(t),c=e=>{if(!o){if(o=!0,i&&clearTimeout(i),e)return void ny(l,t).finally(()=>r(e));n()}},d=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new F("COMMAND_FAILED","Artifact transfer timed out due to inactivity",{timeoutMs:6e4});"destroy"in e&&"function"==typeof e.destroy&&e.destroy(t),u.destroy(t),c(t)},6e4)},u=new f({transform(e,t,n){d();let r=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=r)>0x80000000?n(new F("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):n(null,e)}});e.on("aborted",()=>{c(new F("COMMAND_FAILED","Artifact transfer was interrupted"))}),d(),m(e,u,l).then(()=>c(),e=>c(e))})}async function ny(e,t){if(e.destroy(),!e.closed)try{await p(e,"close")}catch{}await a.promises.rm(t,{force:!0}).catch(()=>{})}async function nS(e){let t,n=e.headers["x-artifact-type"],r=e.headers["x-artifact-filename"];if(!n||!r)throw new F("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==n&&"app-bundle"!==n)throw new F("INVALID_ARGS",`Invalid x-artifact-type: ${n}. Must be "file" or "app-bundle".`);!function(e){if(void 0===e)return;let t=Number(e);if(Number.isFinite(t)&&t>0x80000000)throw new F("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let o=function(e){let t=e.trim(),n=i.basename(t);if(!n||"."===n||".."===n)throw new F("INVALID_ARGS",`Invalid artifact filename: ${e}`);return n}(r),s=(t=function(e){let t=e?.trim();if(!t)return"request";let n=t.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return n.length>0?n.slice(0,48):"request"}("upload"),a.mkdtempSync(i.join(u.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===n){let t=i.join(s,o);return await nv(e,t),{artifactPath:t,tempDir:s}}let t=i.join(s,"artifact.tar");await nv(e,t);let r=await nh({archivePath:t,tempDir:s,platform:"ios",expectedRootName:o});return a.rmSync(t,{force:!0}),{artifactPath:r,tempDir:s}}catch(e){throw a.rmSync(s,{recursive:!0,force:!0}),e}}let n_=new h;async function nI(e,t){return await n_.run(e,t)}function nb(e){n_.getStore()?.(e)}let nA=new Set(["agent_device.command","agent-device.command"]),nx=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),nN=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),nM={"agent_device.lease.allocate":"lease_allocate","agent-device.lease.allocate":"lease_allocate","agent_device.lease.heartbeat":"lease_heartbeat","agent-device.lease.heartbeat":"lease_heartbeat","agent_device.lease.release":"lease_release","agent-device.lease.release":"lease_release"},nE=new Set([...nA,...nx,...nN,...Object.keys(nM)]);function nD(e,t,n,r){return{jsonrpc:"2.0",id:e,error:{code:t,message:n,data:r}}}function nk(e,t,n=200){e.statusCode=n,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function nP(e,t){e.destroyed||(e.write(et(t)),e.end())}function nC(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function nR(e,t){let n="string"==typeof t.authorization?t.authorization:"",r=n.toLowerCase().startsWith("bearer ")?n.slice(7):void 0,i="string"==typeof t["x-agent-device-token"]?t["x-agent-device-token"]:void 0;return("string"==typeof e.token?e.token:void 0)??i??r??""}function nT(e,t){let n=e[t];return"string"==typeof n?n:void 0}function nO(e,t){let n=e[t];return Number.isInteger(n)?Number(n):void 0}function nL(e,t){let n="string"==typeof e[t]?e[t].trim():"";if(!n)throw new F("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return n}function n$(e,t){let n=e[t],r="number"==typeof n?n:"string"==typeof n?Number(n):NaN;if(!Number.isInteger(r))throw new F("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return r}async function nF(e,t){if(!e)return{ok:!0};let n=await e(t);if(void 0===n||!0===n)return{ok:!0};if(!1===n){let e=$(new F("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:nD(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===n.ok){let e=$(new F(O(n.code,"UNAUTHORIZED"),n.message??"Request rejected by auth hook",n.details));return{ok:!1,statusCode:401,response:nD(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof n.tenantId&&n.tenantId.length>0){let e=W(n.tenantId);if(!e){let e=$(new F("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:nD(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function nU(){let e,t=process.env.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let n=process.env.AGENT_DEVICE_HTTP_AUTH_EXPORT||"default",r=i.isAbsolute(t)?t:i.resolve(t);try{e=await import(d(r).href)}catch(e){throw new F("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:r,error:e instanceof Error?e.message:String(e)})}let a=e[n];if("function"!=typeof a)throw new F("INVALID_ARGS",`Auth hook export ${n} is not a function`,{hookPath:r,exportName:n});return a}async function nG(e){let t=await nU(),{handleRequest:n,token:r}=e;return l.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!0}));return}if("POST"===e.method&&"/upload"===e.url)return void nq(e,i,t,r);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void nj(e,i,t,r);if("POST"!==e.method||"/rpc"!==e.url){i.statusCode=404,i.end("Not found");return}let a="";e.setEncoding("utf8"),e.on("data",t=>{(a+=t).length>1048576&&e.destroy(Error("request too large"))}),e.on("error",()=>{i.headersSent||nk(i,nD(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let r,o;try{r=JSON.parse(a)}catch{nk(i,nD(null,-32700,"Parse error"),400);return}if("2.0"!==r.jsonrpc||"string"!=typeof r.method)return void nk(i,nD(r.id??null,-32600,"Invalid Request"),400);if(!nE.has(r.method))return void nk(i,nD(r.id??null,-32601,`Method not found: ${r.method}`),404);if(!r.params||"object"!=typeof r.params)return void nk(i,nD(r.id??null,-32602,"Invalid params"),400);try{var s;let a=r.params,l=function(e,t,n){if(nA.has(e))return{token:nR(t,n),session:t.session??"default",command:t.command??"",positionals:Array.isArray(t.positionals)?t.positionals:[],flags:t.flags,runtime:t.runtime,meta:t.meta};if(nx.has(e)){let e,r=nT(t,"platform");if("ios"!==r&&"android"!==r)throw new F("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:nR(t,n),session:nT(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:r},meta:{requestId:nT(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new F("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new F("INVALID_ARGS","Invalid params: source.url is required for url sources");let n=t.headers,r={};if(void 0!==n){if(!n||"object"!=typeof n||Array.isArray(n))throw new F("INVALID_ARGS","Invalid params: source.headers must be a string map");for(let[e,t]of Object.entries(n)){if("string"!=typeof t)throw new F("INVALID_ARGS","Invalid params: source.headers values must be strings");r[e]=t}}return Object.keys(r).length>0?{kind:"url",url:e,headers:r}:{kind:"url",url:e}}if("path"===t.kind){let e="string"==typeof t.path?t.path.trim():"";if(!e)throw new F("INVALID_ARGS","Invalid params: source.path is required for path sources");return{kind:"path",path:e}}if("github-actions-artifact"===t.kind)return function(e){let t,n=nL(e,"owner"),r=nL(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new F("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new F("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new F("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:n,repo:r,artifactId:n$(e,"artifactId")}:(a&&(t=n$(e,"runId")),{kind:"github-actions-artifact",owner:n,repo:r,...a?{runId:t}:{},artifactName:nL(e,"artifactName")})}(t);throw new F("INVALID_ARGS",'Invalid params: source.kind must be "url", "path", or "github-actions-artifact"')}(t),retainMaterializedPaths:(e=t.retainPaths,"boolean"==typeof e?e:void 0),materializedPathRetentionMs:nO(t,"retentionMs")}}}if(nN.has(e)){let e=nT(t,"materializationId")?.trim();if(!e)throw new F("INVALID_ARGS","Invalid params: materializationId is required");return{token:nR(t,n),session:nT(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:nT(t,"requestId"),materializationId:e}}}let r=nM[e];if(r)return{token:nR(t,n),session:nT(t,"session")??"default",command:r,positionals:[],meta:{tenantId:nT(t,"tenantId")??nT(t,"tenant"),runId:nT(t,"runId"),leaseId:nT(t,"leaseId"),leaseTtlMs:nO(t,"ttlMs"),leaseBackend:nT(t,"backend")}};throw new F("INVALID_ARGS",`Method not found: ${e}`)}(r.method,a,e.headers);if(s=r.method,nA.has(s)&&("string"!=typeof l.command||0===l.command.length))return void nk(i,nD(r.id??null,-32602,"Invalid params: command is required"),400);o=ne(l.meta?.requestId,r.id),l.meta={...l.meta,requestId:o},nt(o);let c=()=>{i.writableFinished||nn(o)};e.on("aborted",c),i.on("close",c);let d=await nF(t,{headers:e.headers,rpcRequest:r,daemonRequest:l});if(!d.ok)return void nk(i,d.response,d.statusCode);if(d.tenantId&&(l.meta={...l.meta,tenantId:d.tenantId,sessionIsolation:l.meta?.sessionIsolation??l.flags?.sessionIsolation??"tenant"}),z(l)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await nI(e=>{!i.destroyed&&i.write(ee(e))},async()=>await n(l)),t=e.ok?{jsonrpc:"2.0",id:r.id??null,result:e}:nD(r.id??null,-32e3,e.error.message,e.error);nP(i,t);return}let u=await n(l);if(u.ok)return void nk(i,{jsonrpc:"2.0",id:r.id??null,result:u});nk(i,nD(r.id??null,-32e3,u.error.message,u.error),nC(u.error.code))}catch(t){let e=$(t);if(i.headersSent)return void nP(i,nD(r.id??null,-32e3,e.message,e));nk(i,nD(r.id??null,-32e3,e.message,e),nC(e.code))}finally{nr(o)}})})}async function nq(e,t,r,i){try{var a;let o,s,l=await nV({req:e,res:t,authHook:r,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let c=await nS(e),d=(a={artifactPath:c.artifactPath,tempDir:c.tempDir,tenantId:l.tenantId},o=n.randomUUID(),(s=setTimeout(()=>{nm(o)},3e5)).unref(),np.set(o,{artifactPath:a.artifactPath,tempDir:a.tempDir,tenantId:a.tenantId,timer:s}),o);t.statusCode=200,t.setHeader("content-type","application/json"),t.end(JSON.stringify({ok:!0,uploadId:d}))}catch(e){nB(t,$(e))}}async function nj(e,t,n,r){let i=e.url?.slice("/artifacts/".length)??"";if(!i){t.statusCode=400,t.end("Missing artifact id");return}try{let o=await nV({req:e,res:t,authHook:n,expectedToken:r,daemonRequest:{command:"download_artifact",positionals:[i]}});if(!o)return;let s=function(e,t){let n=nc.get(e);if(!n)throw new F("INVALID_ARGS",`Artifact not found: ${e}`);if(n.tenantId&&n.tenantId!==t)throw new F("UNAUTHORIZED","Artifact belongs to a different tenant");if(!a.existsSync(n.artifactPath))throw nu(e),new F("COMMAND_FAILED",`Artifact file is missing: ${n.artifactPath}`);return{artifactPath:n.artifactPath,fileName:n.fileName,deleteAfterDownload:n.deleteAfterDownload}}(i,o.tenantId),l=a.createReadStream(s.artifactPath);t.statusCode=200,t.setHeader("content-type","application/octet-stream"),s.fileName&&t.setHeader("content-disposition",`attachment; filename="${s.fileName.replace(/"/g,"")}"`),l.on("error",e=>{if(t.headersSent)t.destroy(e);else{let n=$(e);t.statusCode=nC(n.code),t.end(n.message)}}),t.on("close",()=>{t.writableFinished&&nu(i)}),l.pipe(t)}catch(e){nB(t,$(e))}}async function nV(e){var t,n;let{req:r,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=nR({},r.headers),c=(t=l,(n=o)&&t!==n?$(new F("UNAUTHORIZED","Invalid token")):null);if(c)return nB(i,c),null;let d=await nF(a,{headers:r.headers,rpcRequest:{jsonrpc:"2.0",id:null,method:"agent_device.command"},daemonRequest:{token:l,session:"default",command:s.command,positionals:s.positionals}});return d.ok?{tenantId:d.tenantId}:(i.statusCode=d.statusCode,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!1,error:d.response.error?.data?.message??d.response.error?.message??"Unauthorized"})),null)}function nB(e,t){e.statusCode=nC(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function nH(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function nK(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function nW(e){let t=(e??"").trim().toLowerCase();if(!t||"ios-simulator"===t)return"ios-simulator";if("ios-instance"===t||"android-instance"===t)return t;throw new F("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class nz{leases=new Map;runBindings=new Map;maxActiveSimulatorLeases;defaultLeaseTtlMs;minLeaseTtlMs;maxLeaseTtlMs;now;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.defaultLeaseTtlMs=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,this.minLeaseTtlMs=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):5e3,this.maxLeaseTtlMs=Number.isInteger(e.maxLeaseTtlMs)?Math.max(this.minLeaseTtlMs,Number(e.maxLeaseTtlMs)):6e5,this.now=e.now??(()=>Date.now())}allocateLease(e){let t=nW(e.backend),r=W(e.tenantId);if(!r)throw new F("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=nH(e.runId);if(!i)throw new F("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");this.cleanupExpiredLeases();let a=this.resolveLeaseTtlMs(e.ttlMs),o=this.bindingKey(r,i,t),s=this.runBindings.get(o);if(s){let e=this.leases.get(s);if(e)return this.refreshLease(e,a);this.runBindings.delete(o)}this.enforceCapacity(t);let l=this.now(),c={leaseId:n.randomBytes(16).toString("hex"),tenantId:r,runId:i,backend:t,createdAt:l,heartbeatAt:l,expiresAt:l+a};return this.leases.set(c.leaseId,c),this.runBindings.set(o,c.leaseId),{...c}}heartbeatLease(e){let t=nK(e.leaseId);if(!t)throw new F("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let n=this.leases.get(t);if(!n)throw new F("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});this.assertOptionalScopeMatch(n,e.tenantId,e.runId);let r=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(n,r)}releaseLease(e){let t=nK(e.leaseId);if(!t)throw new F("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let n=this.leases.get(t);return n?(this.assertOptionalScopeMatch(n,e.tenantId,e.runId),this.leases.delete(t),this.runBindings.delete(this.bindingKey(n.tenantId,n.runId,n.backend)),{released:!0}):{released:!1}}assertLeaseAdmission(e){let t=nW(e.backend),n=W(e.tenantId);if(!n)throw new F("INVALID_ARGS","tenant isolation requires tenant id.");let r=nH(e.runId);if(!r)throw new F("INVALID_ARGS","tenant isolation requires run id.");let i=nK(e.leaseId);if(!i)throw new F("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new F("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==n||a.runId!==r)throw new F("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}cleanupExpiredLeases(){let e=this.now();for(let t of this.leases.values())t.expiresAt>e||(this.leases.delete(t.leaseId),this.runBindings.delete(this.bindingKey(t.tenantId,t.runId,t.backend)))}enforceCapacity(e){if("ios-simulator"!==e||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>"ios-simulator"===e.backend).length;if(!(t<this.maxActiveSimulatorLeases))throw new F("COMMAND_FAILED","No simulator lease capacity available",{reason:"LEASE_CAPACITY_EXCEEDED",activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:"Retry after releasing another simulator lease."})}resolveLeaseTtlMs(e){if(!Number.isInteger(e))return this.defaultLeaseTtlMs;let t=Number(e);if(t<this.minLeaseTtlMs||t>this.maxLeaseTtlMs)throw new F("INVALID_ARGS",`Lease ttlMs must be between ${this.minLeaseTtlMs} and ${this.maxLeaseTtlMs}.`);return t}refreshLease(e,t){let n=this.now(),r={...e,heartbeatAt:n,expiresAt:n+t};return this.leases.set(r.leaseId,r),this.runBindings.set(this.bindingKey(r.tenantId,r.runId,r.backend),r.leaseId),{...r}}bindingKey(e,t,n){return`${e}:${t}:${n}`}assertOptionalScopeMatch(e,t,n){let r=W(t),i=nH(n);if(t&&!r)throw new F("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(n&&!i)throw new F("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&e.tenantId!==r||i&&e.runId!==i)throw new F("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}function nJ(e){return e}function nX(e){return"apple"===e||"ios"===e||"macos"===e}function nZ(e,t){return!t||("apple"===t?nX(e):e===t)}function nY(e){let{simulatorSetPath:t,platform:n,target:r}=e;if(t&&"macos"!==n&&"desktop"!==r)return t}async function nQ(e,t,n={}){let r=e,i=e=>e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim();if(t.platform&&(r=r.filter(e=>nZ(e.platform,t.platform))),t.target&&(r=r.filter(e=>(e.target??"mobile")===t.target)),t.udid){let e=r.find(e=>e.id===t.udid&&nX(e.platform));if(!e)throw new F("DEVICE_NOT_FOUND",`No Apple device with UDID ${t.udid}`);return e}if(t.serial){let e=r.find(e=>e.id===t.serial&&"android"===e.platform);if(!e)throw new F("DEVICE_NOT_FOUND",`No Android device with serial ${t.serial}`);return e}if(t.deviceName){let e=i(t.deviceName),n=r.find(t=>i(t.name)===e);if(!n)throw new F("DEVICE_NOT_FOUND",`No device named ${t.deviceName}`);return n}let a=r[0];if(void 0!==a&&1===r.length)return a;if(0===r.length){var o;let e=n.simulatorSetPath;if(e&&(!(o=t.platform)||"apple"===o||"ios"===o))throw new F("DEVICE_NOT_FOUND","No devices found in the scoped simulator set",{simulatorSetPath:e,hint:`The simulator set at "${e}" appears to be empty. Create a simulator first:
|
|
4
|
-
xcrun simctl --set "${e}" create "iPhone 16" com.apple.CoreSimulator.SimDeviceType.iPhone-16 com.apple.CoreSimulator.SimRuntime.iOS-18-0`,selector:t});throw new F("DEVICE_NOT_FOUND","No devices found",{selector:t})}let s=r.filter(e=>"device"!==e.kind);s.length>0&&(r=s);let l=r.filter(e=>e.booted),c=l[0];if(void 0!==c&&1===l.length)return c;let d=l[0]??r[0];if(void 0===d)throw new F("DEVICE_NOT_FOUND","No devices found",{selector:t});return d}async function n0(e){var t;if("macos"===(t=e).platform||"apple"===t.platform&&"desktop"===t.target){let{listMacosDevices:e}=await import("./devices~2.js");return await e()}if("linux"===e.platform){let{listLinuxDevices:e}=await import("./devices~1.js");return await e()}if("android"===e.platform){let{listAndroidDevices:t}=await import("./8806.js");return await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0})}if(e.platform){let{listAppleDevices:t}=await import("./devices.js");return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}let n=[];try{let{listAndroidDevices:t}=await import("./8806.js");n.push(...await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0}))}catch{}try{let{listAppleDevices:t}=await import("./devices.js");n.push(...await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid}))}catch{}try{let{listLinuxDevices:e}=await import("./devices~1.js");n.push(...await e())}catch{}return n}let n1=new h,n2=new h;async function n3(e,t,n){var r,i;let a=await n4(e,t,n);if(r=t,i=a,!n5(r)&&(!r.platform||"apple"===r.platform||"ios"===r.platform)&&"desktop"!==r.target&&(!i||"device"===i.kind)){let{findBootableIosSimulator:e}=await import("./devices.js"),r=await e({simulatorSetPath:n.simulatorSetPath,target:t.target});if(r)return r}if(a)return a;throw new F("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function n4(e,t,n){try{return await nQ(e,t,n)}catch(e){var r;if(r=e,!n5(t)&&r instanceof F&&"DEVICE_NOT_FOUND"===r.code)return;throw e}}function n5(e){return!!(e.udid||e.serial||e.deviceName)}async function n8(e){let t=nJ(e.platform),n=nY({simulatorSetPath:er(e.iosSimulatorDeviceSet),platform:t,target:e.target}),r=ev(e.androidDeviceAllowlist),i=function(e){let{flags:t,normalizedPlatform:n,iosSimulatorSetPath:r,androidSerialAllowlist:i}=e;return JSON.stringify({platform:n,target:t.target,device:t.device,udid:t.udid,serial:t.serial,iosSimulatorSetPath:r,androidSerialAllowlist:i?Array.from(i).sort():void 0})}({flags:e,normalizedPlatform:t,iosSimulatorSetPath:n,androidSerialAllowlist:r}),a={platform:t,target:e.target,cacheHit:!1};return await N("resolve_target_device",async()=>{let o=function(e){let t=n1.getStore(),n=t?.get(e);if(n)return{...n}}(i);if(o)return a.cacheHit=!0,o;let s={platform:t,target:e.target,deviceName:e.device,udid:e.udid,serial:e.serial};if(s.target&&!s.platform)throw new F("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await rt({...s,iosSimulatorSetPath:n,androidSerialAllowlist:r?Array.from(r).sort():void 0});if(l)return rn(s)?rr(i,await n3(l,s,{simulatorSetPath:n})):rr(i,await nQ(l,s,{simulatorSetPath:n}));let c=await n0({...s,iosSimulatorSetPath:n,androidSerialAllowlist:r?Array.from(r).sort():void 0});return rn(s)?rr(i,await n3(c,s,{simulatorSetPath:n})):rr(i,await nQ(c,s,{simulatorSetPath:n}))},a)}async function n6(e){return n1.getStore()?await e():await n1.run(new Map,e)}async function n9(e,t){return e?await n2.run(e,t):await t()}async function n7(e,t){return await n9(e,async()=>await n6(t))}async function re(e){return await rt(e)??await n0(e)}async function rt(e){let t=n2.getStore();if(!t)return null;let n=await t(e);return null==n?null:n.map(e=>({...e}))}function rn(e){return!!e.platform&&"android"!==e.platform&&"linux"!==e.platform}function rr(e,t){return n1.getStore()?.set(e,{...t}),t}let ri=["platform","target","device","udid","serial"],ra=[...ri,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function ro(e){return"string"==typeof e&&e.trim().length>0}function rs(e,t){return!!e&&t.some(t=>ro(e[t]))}let rl={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},rc=function(e){let t=new Map,n=new Map;for(let r of e){if(t.has(r.command))throw Error(`Duplicate daemon command descriptor: ${r.command}`);if(t.set(r.command,r),"generic"!==r.route){let e=n.get(r.route)??[];e.push(r.command),n.set(r.route,e)}}return{descriptorsByCommand:t,handlerCommandsByRoute:n}}([...rp("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},eI.leaseAllocate,eI.leaseHeartbeat,eI.leaseRelease),ru(eI.sessionList,"session",{sessionKind:"inventory",...rl}),ru(e_.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...rl}),ru(e_.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...rp("session",{sessionKind:"state"},e_.boot,e_.appState),...rp("session",{sessionKind:"observability"},e_.perf,e_.logs,e_.network),...rp("session",{sessionKind:"replay",skipSessionlessProviderDevice:function(e){return e.command===e_.test&&("number"==typeof e.flags?.shardAll||"number"==typeof e.flags?.shardSplit)}},e_.replay,e_.test),ru(eI.runtime,"session"),ru(e_.clipboard,"session",{replayScopedAction:!0}),ru(e_.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...rp("session",{},e_.install,e_.reinstall,eI.installSource),ru(eI.releaseMaterializedPaths,"session",rl),...rp("session",{},e_.push,e_.triggerAppEvent),ru(e_.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...rp("session",{},e_.prepare,e_.batch),ru(e_.close,"session",{allowInvalidRecording:!0}),...rp("snapshot",{replayScopedAction:!0},e_.snapshot,e_.diff,e_.wait,e_.alert,e_.settings),ru(e_.reactNative,"reactNative",{replayScopedAction:!0}),ru(e_.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),ru(e_.trace,"recordTrace"),ru(e_.find,"find",{replayScopedAction:!0}),...rp("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},e_.click,e_.fill,e_.longPress,e_.press,e_.type),...rp("interaction",{replayScopedAction:!0},e_.get,e_.is),...rp("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},e_.back,e_.gesture,e_.home,e_.rotate,e_.scroll,e_.swipe,"pinch"),ru(e_.focus,"generic",{androidBlockingDialogGuard:!0}),ru(e_.screenshot,"generic",{replayScopedAction:!0}),...rp("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function rd(e){return rf(e)?.sessionKind}function ru(e,t,n={}){return{command:e,route:t,...n}}function rp(e,t,...n){return n.map(n=>ru(n,e,t))}function rf(e){return rc.descriptorsByCommand.get(e)}let rm=[{resolverKey:"androidAdbProvider",resolve(e,t){let n=e.androidAdbProvider;if(!n||"android"!==t.device.platform)return{};let r=n(t),i="function"==typeof r?r:r?.exec;return{androidAdb:{provider:r,executor:i,serial:t.device.id}}},async appendWrapper(e,t){if(!e.androidAdb?.provider)return;let{withAndroidAdbProvider:n}=await import("./9639.js");ry(t,e.androidAdb,(t,r)=>n(t,{serial:e.androidAdb?.serial??""},r))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let n=e.appleRunnerProvider;return n&&nX(t.device.platform)?{appleRunner:{provider:n(t),deviceId:t.device.id,requestId:t.req.meta?.requestId}}:{}},async appendWrapper(e,t){if(!e.appleRunner?.provider)return;let{withAppleRunnerProvider:n}=await Promise.resolve(tS);ry(t,e.appleRunner,(t,r)=>n(t,{deviceId:e.appleRunner?.deviceId??"",requestId:e.appleRunner?.requestId},r))}},{resolverKey:"appleToolProvider",resolve(e,t){let n=e.appleToolProvider;return n&&nX(t.device.platform)?{appleTool:{provider:n(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:n}=await Promise.resolve(tI);ry(t,e.appleTool,n)}},{resolverKey:"linuxToolProvider",resolve(e,t){let n=e.linuxToolProvider;return n&&"linux"===t.device.platform?{linuxTool:{provider:n(t)}}:{}},async appendWrapper(e,t){if(!e.linuxTool?.provider)return;let{withLinuxToolProvider:n}=await Promise.resolve(tA);ry(t,e.linuxTool,n)}},{resolverKey:"appLogProvider",resolve(e,t){let n=e.appLogProvider;return n?{appLog:{provider:n(t)}}:{}},async appendWrapper(e,t){if(!e.appLog?.provider)return;let{withAppLogProvider:n}=await Promise.resolve(tg);ry(t,e.appLog,n)}},{resolverKey:"recordingProvider",resolve(e,t){let n=e.recordingProvider;return n?{recording:{provider:n(t)}}:{}},async appendWrapper(e,t){if(!e.recording?.provider)return;let{withRecordingProvider:n}=await import("./recording-provider.js");ry(t,e.recording,n)}}];async function rh(e,t){let n=await rw(e),r={androidAdbExecutor:n.androidAdb?.executor},i=await rv(n);return await rS(i,async()=>await t(r))}async function rw(e){var t,n,r;if(t=e.providers,!rm.some(e=>!!t[e.resolverKey]))return{};let i=await rg(e.req,e.existingSession);if(!i)return{};let a=(n=e,r=i,{req:n.req,device:r,session:n.existingSession});return rm.reduce((t,n)=>({...t,...n.resolve(e.providers,a)}),{})}async function rg(e,t){switch(function(e,t){var n;let r,i;if(t.hasExistingSession)return rf(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(n=e,"function"==typeof(i=rf(n.command)?.skipSessionlessProviderDevice)&&i(n))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(r=rf(e.command)?.allowSessionlessDefaultDevice)&&r(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:rs(e.flags,ri)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await n8(e.flags??{});case"skip":return}}async function rv(e){let t=[];for(let n of rm)await n.appendWrapper(e,t);return t}function ry(e,t,n){let r=t?.provider;r&&e.push(async e=>await n(r,e))}async function rS(e,t){let n=t;for(let t of[...e].reverse()){let e=n;n=async()=>await t(e)}return await n()}async function r_(e,t){switch(e.platform){case"android":{let{createAndroidInteractor:t}=await import("./android.js");return t(e)}case"linux":{let{createLinuxInteractor:e}=await import("./linux.js");return e()}case"ios":case"macos":{let{createAppleInteractor:n}=await import("./apple.js");return n(e,t)}default:throw new F("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let rI=/^[A-Za-z0-9_.:-]{1,64}$/,rb="--launch-console is supported only for iOS simulator app launches",rA="--launch-console requires a direct app launch and cannot be used with URL opens";function rx(e){return e?.clickButton??"primary"}function rN(e){return"primary"===e.button?null:"click"!==e.commandLabel?new F("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new F("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new F("UNSUPPORTED_OPERATION","click --button middle is not supported by the macOS runner yet"):"number"==typeof e.count||"number"==typeof e.intervalMs||"number"==typeof e.holdMs||"number"==typeof e.jitterPx||!0===e.doubleTap?new F("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function rM(e){return"primary"===e?{}:{button:e}}let rE=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];async function rD(e,t,n){for(let r=0;r<e;r+=1)await n(r),r<e-1&&t>0&&await ez(t)}async function rk(e,t){let{x:n,y:r}=r$(t,"longpress requires x y [durationMs]",{hint:"Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i -c, use the target rect center as x y, then retry longpress x y durationMs."}),i=t[2]?Number(t[2]):void 0;return await e.longPress(n,r,i),{x:n,y:r,durationMs:i,...eX(`Long pressed (${n}, ${r})`)}}async function rP(e,t){let{x:n,y:r}=r$(t,"focus requires x y");return await e.focus(n,r),{x:n,y:r,...eX(`Focused (${n}, ${r})`)}}async function rC(e,t,n){let r=eA(t[0]);if(r)throw new F("INVALID_ARGS",`type does not accept a target ref like "${r}"`,{hint:`Use fill ${r} "text" to target that field, or press ${r} then type "text" to append.`});let i=t.join(" ");if(!i)throw new F("INVALID_ARGS","type requires text");let a=ej(n?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...eX(r4("Typed",i))}}async function rR(e,t,n){if(n?.directElementSelector)return await rT(e,n.directElementSelector,t,n);let r=Number(t[0]),i=Number(t[1]),a=t.slice(2).join(" ");if(Number.isNaN(r)||Number.isNaN(i)||!a)throw new F("INVALID_ARGS","fill requires x y text");let o=ej(n?.delayMs??0,"delay-ms",0,1e4);return await e.fill(r,i,a,o),{x:r,y:i,text:a,delayMs:o,...eX(r4("Filled",a))}}async function rT(e,t,n,r){if(!e.fillElementSelector)throw new F("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=n.join(" ");if(!i)throw new F("INVALID_ARGS","fill requires text");let a=ej(r.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...eX(r4("Filled",i))}}async function rO(e,t,n,r){var i,a,o,s;if(r?.directElementSelector&&"ios"===e.platform)return await rL(t,r.directElementSelector);let{x:l,y:c}=r$(n,"press requires x y");if("macos"===e.platform&&r?.surface&&"app"!==r.surface)return await rF(l,c,r);let d=rx(r);if("primary"!==d)return await rU(e,l,c,d,r);let u=(s=r,{count:rq(s?.count,1,"count",1,200),intervalMs:rq(s?.intervalMs,0,"interval-ms",0,1e4),holdMs:rq(s?.holdMs,0,"hold-ms",0,1e4),jitterPx:rq(s?.jitterPx,0,"jitter-px",0,100),doubleTap:!!s?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:n}){if(e&&t>0)throw new F("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&n>0)throw new F("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(u),i=u.count,a=u.holdMs,o=u.jitterPx,nX(e.platform)&&i>1&&0===a&&0===o)?await rj(e,l,c,u,r):await rV(t,l,c,u)}async function rL(e,t){if(!e.tapElementSelector)throw new F("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let n=await e.tapElementSelector(t);return{selector:t.raw,...n??{},...eX(`Tapped ${t.raw}`)}}function r$(e,t,n){let r=Number(e[0]),i=Number(e[1]);if(Number.isNaN(r)||Number.isNaN(i))throw new F("INVALID_ARGS",t,n);return{x:r,y:i}}async function rF(e,t,n){let r=rx(n);if("primary"!==r)throw new F("UNSUPPORTED_OPERATION",`${r} click is not supported on macOS ${n.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(tv);return await i(e,t,{bundleId:n.appBundleId,surface:n.surface}),{x:e,y:t,...eX(r2({x:e,y:t}))}}async function rU(e,t,n,r,i){if(function(e,t,n){let r=rN({commandLabel:"click",platform:e.platform,button:t,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap});if(r)throw r}(e,r,i),"linux"===e.platform)return await rG(t,n,r);let{runIosRunnerCommand:a}=await Promise.resolve(ty);return await a(e,{command:"mouseClick",x:t,y:n,button:r,appBundleId:i?.appBundleId},rB(i)),{x:t,y:n,button:r,...eX(r2({x:t,y:n,button:r}))}}async function rG(e,t,n){if("secondary"===n){let{rightClickLinux:n}=await import("./input-actions~1.js");await n(e,t)}else{let{middleClickLinux:n}=await import("./input-actions~1.js");await n(e,t)}return{x:e,y:t,button:n,...eX(r2({x:e,y:t,button:n}))}}function rq(e,t,n,r,i){return ej(void 0===e?t:e,n,r,i)}async function rj(e,t,n,r,i){let{runIosRunnerCommand:a}=await Promise.resolve(ty),o=await a(e,{command:"tapSeries",x:t,y:n,count:r.count,intervalMs:r.intervalMs,doubleTap:r.doubleTap,appBundleId:i?.appBundleId},rB(i));return{x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,timingMode:"runner-series",...o,...eX(r2({x:t,y:n}))}}async function rV(e,t,n,r){let i;return await rD(r.count,r.intervalMs,async a=>{let[o,s]=function(e,t){if(t<=0)return[0,0];let[n,r]=rE[e%rE.length];return[n*t,r*t]}(a,r.jitterPx),l=t+o,c=n+s;if(r.doubleTap){i??=await e.doubleTap(l,c)??void 0;return}r.holdMs>0?i??=await e.longPress(l,c,r.holdMs)??void 0:i??=await e.tap(l,c)??void 0}),eZ({x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,...i},r2({x:t,y:n}))}function rB(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId}}async function rH(e,t,n,r){let i=Number(n[0]),a=Number(n[1]),o=Number(n[2]),s=Number(n[3]);if([i,a,o,s].some(Number.isNaN))throw new F("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=n[4]?Number(n[4]):250;return await rW({device:e,interactor:t,context:r,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function rK(e,t,n,r){let i=eW(n[0]),a=n[1]?Number(n[1]):300,o=eV((await t.snapshot({appBundleId:r?.appBundleId,compact:!0})).nodes??[]);if(!o)throw new F("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=ex(i,o,{platform:e.platform});return await rW({device:e,interactor:t,context:r,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function rW(e){let{device:t,interactor:n,context:r,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:c}=e,d=ej(l,"durationMs",16,1e4),u=ej(r?.count??1,"count",1,200),p=ej(r?.pauseMs??0,"pause-ms",0,1e4),f=r?.pattern??"one-way";if("one-way"!==f&&"ping-pong"!==f)throw new F("INVALID_ARGS",`Invalid pattern: ${f}`);if(nX(t.platform)&&u>1){let{runIosRunnerCommand:e}=await Promise.resolve(ty),n=await e(t,{command:"dragSeries",x:i,y:a,x2:o,y2:s,durationMs:d,count:u,pauseMs:p,pattern:f,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId});return{x1:i,y1:a,x2:o,y2:s,...c?{preset:c}:{},durationMs:d,effectiveDurationMs:d,timingMode:"runner-series",count:u,pauseMs:p,pattern:f,...n,...eX(r3(u,f))}}return await rD(u,p,async e=>{"ping-pong"===f&&e%2==1?await n.swipe(o,s,i,a,d):await n.swipe(i,a,o,s,d)}),eZ({x1:i,y1:a,x2:o,y2:s,...c?{preset:c}:{},durationMs:d,effectiveDurationMs:d,timingMode:"direct",count:u,pauseMs:p,pattern:f},c?`Swiped ${c}`:r3(u,f))}async function rz(e,t){let n=Number(t[0]),r=Number(t[1]),i=Number(t[2]),a=Number(t[3]);if([n,r,i,a].some(e=>!Number.isFinite(e)))throw new F("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=ej(t[4]?Number(t[4]):500,"durationMs",16,1e4),s=n+i,l=r+a,c=await e.pan(n,r,s,l,o);return{x:n,y:r,dx:i,dy:a,x2:s,y2:l,durationMs:o,...c??{},...eX(`Panned (${n}, ${r}) by (${i}, ${a})`)}}async function rJ(e,t){let n=function(e,t){if("up"===e||"down"===e||"left"===e||"right"===e)return e;throw new F("INVALID_ARGS",`${t} must be up, down, left, or right`)}(t[0],"fling direction"),r=Number(t[1]),i=Number(t[2]);if(![r,i].every(Number.isFinite))throw new F("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new F("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=ej(t[4]?Number(t[4]):50,"durationMs",16,1e3),{x2:s,y2:l}=function(e,t,n,r){switch(n){case"up":return{x2:e,y2:t-r};case"down":return{x2:e,y2:t+r};case"left":return{x2:e-r,y2:t};case"right":return{x2:e+r,y2:t}}}(r,i,n,a);return await e.fling(r,i,s,l,o),{direction:n,x:r,y:i,x2:s,y2:l,distance:a,durationMs:o,...eX(`Flung ${n}`)}}async function rX(e,t,n){var r;let i=t[0],a=t[1]?Number(t[1]):void 0,o=n?.pixels;if(!i)throw new F("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new F("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==o)throw new F("INVALID_ARGS","scroll accepts either a relative amount or --pixels, not both");let s="bottom"===(r=i)?{direction:"down",edge:"bottom"}:"top"===r?{direction:"up",edge:"top"}:{direction:eM(r)},l={},c=0;if(s.edge){let t=s.edge,r=await eq({edge:t,captureState:async r=>await rZ(e,n,t,r),scroll:async()=>await e.scroll(s.direction,{amount:a,pixels:o})});l=r.result??{},c=r.passes}else l=await e.scroll(s.direction,{amount:a,pixels:o}),c=1;return eZ({direction:s.direction,...s.edge?{edge:s.edge,passes:c}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},eP(s.direction,s.edge,c,a,o))}async function rZ(e,t,n,r){if("function"!=typeof e.snapshot)throw new F("UNSUPPORTED_OPERATION",`scroll ${n} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await eL({edge:n,scope:r,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,compact:!0,scope:e})).nodes??[]})}async function rY(e,t,n,r){if("tv"===e.target)throw new F("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&r?.surface&&"app"!==r.surface)throw new F("UNSUPPORTED_OPERATION","gesture pinch is only supported in macOS app sessions. Re-open the target app without --surface desktop|menubar|frontmost-app first.");let i=Number(n[0]),a=n[1]?Number(n[1]):void 0,o=n[2]?Number(n[2]):void 0;if(Number.isNaN(i)||i<=0)throw new F("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...eX(`Pinched to scale ${i}`)}}async function rQ(e,t,n){if("tv"===e.target)throw new F("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new F("UNSUPPORTED_OPERATION","gesture rotate is not supported on macOS; XCTest rotation gestures are available only for iOS app sessions.");let{degrees:r,x:i,y:a,velocity:o}=function(e){let t=Number(e[0]);if(!Number.isFinite(t))throw new F("INVALID_ARGS","gesture rotate requires degrees [x] [y] [velocity]");let n=function(e,t){if(void 0===e&&void 0===t)return{};if(void 0===e||void 0===t)throw new F("INVALID_ARGS","gesture rotate center requires both x and y");let n=Number(e),r=Number(t);if(!Number.isFinite(n)||!Number.isFinite(r))throw new F("INVALID_ARGS","gesture rotate center requires finite x and y");return{x:n,y:r}}(e[1],e[2]),r=Number(e[3]??(t>=0?1:-1));if(!Number.isFinite(r)||0===r)throw new F("INVALID_ARGS","gesture rotate velocity must be a non-zero number");return{degrees:t,...n,velocity:Math.abs(r)*(t>=0?1:-1)}}(n),s=await t.rotateGesture(r,i,a,o);return{degrees:r,...void 0!==i&&void 0!==a?{x:i,y:a}:{},velocity:o,...s,...eX(`Rotated gesture ${r} degrees`)}}async function r0(e,t,n){if("tv"===e.target)throw new F("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let r="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!r)throw new F("UNSUPPORTED_OPERATION","gesture transform is currently supported on Android and iOS simulators");let i=function(e){let t=Number(e[0]),n=Number(e[1]),r=Number(e[2]),i=Number(e[3]),a=Number(e[4]),o=Number(e[5]);if(![t,n,r,i,a,o].every(Number.isFinite))throw new F("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new F("INVALID_ARGS","gesture transform scale must be > 0");return{x:t,y:n,dx:r,dy:i,scale:a,degrees:o,durationMs:void 0===e[6]?void 0:ej(Number(e[6]),"durationMs",16,1e4)}}(n),a=await t.transformGesture(i);return{...i,...a,...eX(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function r1(e,t,n){let{x:r,y:i}=r$(t,"read requires x y");if("android"===e.platform){let{readAndroidTextAtPoint:t}=await import("./input-actions.js");return{action:"read",text:await t(e,r,i)??""}}if("linux"===e.platform){let{readLinuxTextAtPoint:e}=await Promise.resolve(tb);return{action:"read",text:await e(r,i,n?.surface)}}if("macos"===e.platform&&n?.surface&&"app"!==n.surface){let{runMacOsReadTextAction:e}=await Promise.resolve(tv);return{action:"read",text:(await e(r,i,{bundleId:n.appBundleId,surface:n.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(ty),o=await a(e,{command:"readText",x:r,y:i,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function r2(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function r3(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function r4(e,t){return`${e} ${Array.from(t).length} chars`}function r5(e,t){let n,r=t?.subject??"Payload",i=e.trim();if(!i)throw new F("INVALID_ARGS",`${r} cannot be empty`);let o=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!a.statSync(o).isFile())throw new F("INVALID_ARGS",`${r} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof F)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new F("INVALID_ARGS",`${r} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new F("COMMAND_FAILED",`Unable to read ${r} file: ${o}`,{cause:String(t)})}if((n=i.trim()).startsWith("{")&&n.endsWith("}")||n.startsWith("[")&&n.endsWith("]"))return{kind:"inline",text:i};throw new F("INVALID_ARGS",`${r} file not found: ${o}`)}async function r8(e){let t=r5(e,{subject:"Push payload"}),n="inline"===t.kind?t.text:await r6(t.path);try{let e=JSON.parse(n);if(!e||"object"!=typeof e||Array.isArray(e))throw new F("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof F)throw t;throw new F("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function r6(e){try{return await s.readFile(e,"utf8")}catch(n){let t=n.code;if("ENOENT"===t)throw new F("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new F("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new F("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new F("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(n)})}}async function r9(e,t,n,r,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},o=await r_(e,a);return E({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await N("platform_command",async()=>await r7(e,o,t,n,r,i,a),{command:t,platform:e.platform})}async function r7(e,t,n,r,i,a,o){switch(n){case"open":return await ie(e,t,r,a);case"close":{let e=r[0];if(!e)return{closed:"session",...eX("Closed session")};return await t.close(e),{app:e,...eX(`Closed: ${e}`)}}case"press":return await rO(e,t,r,a);case"swipe":return await rH(e,t,r,a);case"swipe-preset":return await rK(e,t,r,a);case"pan":return await rz(t,r);case"fling":return await rJ(t,r);case"longpress":return await rk(t,r);case"focus":return await rP(t,r);case"type":return await rC(t,r,a);case"fill":return await rR(t,r,a);case"scroll":return await rX(t,r,a);case"pinch":return await rY(e,t,r,a);case"rotate-gesture":return await rQ(e,t,r);case"transform-gesture":return await r0(e,t,r);case"trigger-app-event":return await it(e,t,r,a);case"screenshot":return await ir(t,r,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...eX("Back")};case"home":return await t.home(),{action:"home",...eX("Home")};case"rotate":{let e=eY(r[0]);return await t.rotate(e),{action:"rotate",orientation:e,...eX(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...eX("Opened app switcher")};case"clipboard":return await ii(t,r);case"keyboard":return await ia(e,r,a,o);case"settings":return await il(e,t,r,a);case"push":return await ic(e,r,a);case"snapshot":return await id(t,a);case"read":return await r1(e,r,a);default:throw new F("INVALID_ARGS",`Unknown command: ${n}`)}}async function ie(e,t,n,r){let i=n[0],a=n[1],o=r?.launchConsole,s=r?.launchArgs;if(n.length>2)throw new F("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new F("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new F("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...eX("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new F("UNSUPPORTED_OPERATION",rb);if("linux"===e.platform&&s&&s.length>0)throw new F("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(ey(i))throw new F("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!ey(a))throw new F("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new F("INVALID_ARGS",rA);return await t.open(i,{activity:r?.activity,appBundleId:r?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...eX(`Opened: ${i}`)}}if(o&&ey(i))throw new F("INVALID_ARGS",rA);if(r?.clearAppState){if(ey(i))throw new F("INVALID_ARGS","Clearing app state requires an app target, not a deep link.");await t.setSetting("clear-app-state","clear",i)}return await t.open(i,{activity:r?.activity,appBundleId:r?.appBundleId,launchConsole:o,launchArgs:s}),{app:i,...o?{launchConsole:o}:{},...eX(`Opened: ${i}`)}}async function it(e,t,n,r){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),n=e[1]?.trim();if(!t)throw new F("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!rI.test(t))throw new F("INVALID_ARGS",`Invalid trigger-app-event event name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});if(e.length>2)throw new F("INVALID_ARGS","trigger-app-event accepts at most two arguments: <event> [payloadJson]");let r=function(e,t){if(e)try{let n=JSON.parse(e);if(!n||"object"!=typeof n||Array.isArray(n))throw new F("INVALID_ARGS",`trigger-app-event payload for "${t}" must be a JSON object`);let r=JSON.stringify(n);if(Buffer.byteLength(r,"utf8")>8192)throw new F("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return n}catch(t){if(t instanceof F)throw t;throw new F("INVALID_ARGS",`Invalid trigger-app-event payload JSON: ${e}`)}}(n,t);return{eventName:t,payload:r}}(n),o=function(e,t,n){var r;let i,a=(i=("ios"===(r=e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:"macos"===r?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE,i?.trim()||void 0);if(!a)throw new F("UNSUPPORTED_OPERATION",`No app event URL template configured for ${e}.`,{hint:`Set AGENT_DEVICE_${e.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=n?JSON.stringify(n):"",s=a.replaceAll("{event}",encodeURIComponent(t)).replaceAll("{payload}",encodeURIComponent(o)).replaceAll("{platform}",encodeURIComponent(e));if(s.length>4096)throw new F("INVALID_ARGS","trigger-app-event URL exceeds maximum supported length",{hint:"Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.",length:s.length,maxLength:4096});return s}(e.platform,i,a);return await t.open(o,{appBundleId:r?.appBundleId}),{event:i,eventUrl:o,transport:"deep-link",...eX(`Triggered app event: ${i}`)}}async function ir(e,t,n,r){let a=t[0]??n??`./screenshot-${Date.now()}.png`;await s.mkdir(i.dirname(a),{recursive:!0});let o=S(r);return await e.screenshot(a,{appBundleId:r?.appBundleId,fullscreen:o.fullscreen,stabilize:o.stabilize,surface:r?.surface}),{path:a,...eX(`Saved screenshot: ${a}`)}}async function ii(e,t){let n=(t[0]??"").toLowerCase();if("read"!==n&&"write"!==n)throw new F("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===n){if(1!==t.length)throw new F("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:n,text:await e.readClipboard()}}if(t.length<2)throw new F("INVALID_ARGS",'clipboard write requires text (use "" to clear clipboard)');let r=t.slice(1).join(" ");return await e.writeClipboard(r),{action:n,textLength:Array.from(r).length,...eX("Clipboard updated")}}async function ia(e,t,n,r){let i=(t[0]??"status").toLowerCase();if(!eE(i))throw new F("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new F("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await io(e,i);if("ios"===e.platform)return await is(e,i,n,r);throw new F("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function io(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...eX("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./8133.js"),n=await t(e);return{platform:"android",action:"dismiss",attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}let{getAndroidKeyboardState:n}=await import("./8133.js"),r=await n(e);return{platform:"android",action:"status",visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}async function is(e,t,n,r){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new F("UNSUPPORTED_OPERATION","keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS");if("enter"===t||"return"===t){let{runIosRunnerCommand:t}=await Promise.resolve(ty),i=await t(e,{command:"keyboardReturn",appBundleId:n?.appBundleId},r);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...eX("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(ty),a=await i(e,{command:"keyboardDismiss",appBundleId:n?.appBundleId},r);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...eX(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function il(e,t,n,r){let[i,a,o,s]=n;if(!i||!a&&"clear-app-state"!==i)throw new F("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let n=("clear"===a?o:a)??r?.appBundleId;if(!n)throw new F("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");E({level:"debug",phase:"settings_apply",data:{setting:i,state:"clear",appBundleId:n,platform:e.platform}});let s=await t.setSetting(i,"clear",n);return s&&"object"==typeof s?eZ({setting:i,state:"clear",...s},iu(s)??`Cleared user data for ${n}`):{setting:i,state:"clear",...eX(`Cleared user data for ${n}`)}}if(!a)throw new F("INVALID_ARGS","settings requires setting state");let l="location"===i&&"set"===a,c=("permission"===i||l?n[4]:n[2])??r?.appBundleId,d="permission"===i?{permissionTarget:o,permissionMode:s}:l?{latitude:eJ(o,"latitude"),longitude:eJ(s,"longitude")}:void 0;E({level:"debug",phase:"settings_apply",data:l?{setting:i,state:a,latitude:o,longitude:s,platform:e.platform}:"permission"===i?{setting:i,state:a,permissionTarget:o,permissionMode:s,platform:e.platform}:{setting:i,state:a,appBundleId:c,platform:e.platform}});let u=await t.setSetting(i,a,c,d);return u&&"object"==typeof u?eZ({setting:i,state:a,...u},iu(u)??`Updated setting: ${i}`):{setting:i,state:a,...eX(`Updated setting: ${i}`)}}async function ic(e,t,n){let r=t[0]?.trim(),i=t[1]?.trim();if(!r||!i)throw new F("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await r8(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,r,a),{platform:"ios",bundleId:r,...eX(`Pushed notification to ${r}`)}}let{pushAndroidNotification:o}=await import("./notifications.js"),s=await o(e,r,a);return{platform:"android",package:r,action:s.action,extrasCount:s.extrasCount,...eX(`Pushed notification to ${r}`)}}async function id(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,compact:t?.snapshotCompact,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,surface:t?.surface})}function iu(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let ip=e=>"macos"!==e.platform,im=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,ih=e=>"macos"===e.platform?"macOS automation has no multi-touch input — this gesture is supported on Android and the iOS simulator only.":"ios"===e.platform&&"tv"===e.target?"tvOS has no touch input — this gesture is supported on Android and the iOS simulator only.":"ios"===e.platform&&"device"===e.kind?"Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices.":void 0,iw={device:!0},ig={},iv={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},iy={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:ip},iS={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},pinch:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:e=>"android"===e.platform||im(e),unsupportedHint:ih},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:e=>"android"===e.platform||im(e),unsupportedHint:ih},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:e=>"android"===e.platform||im(e),unsupportedHint:ih},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:ip},open:iv,close:iv,reinstall:iy,install:iy,"install-from-source":iy,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:ip},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw,supports:e=>"android"===e.platform||"linux"===e.platform||"macos"===e.platform||"simulator"===e.kind},keyboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},fill:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},snapshot:iv,diff:iv,screenshot:iv,wait:iv,get:iv,find:iv,is:iv,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw,supports:ip},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:ip},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},scroll:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iw},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},"trigger-app-event":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ig},type:iv};function i_(e,t){let n=iS[e];if(!n)return!0;let r=nX(t.platform)?n.apple:"linux"===t.platform?n.linux:n.android;return!!r&&(!n.supports||!!n.supports(t))&&!0===r[t.kind??"unknown"]}function iI(e,t=e=>e){let n=new h;return{resolve:r=>r?t(r):n.getStore()??e,run:async(e,r)=>e?await n.run(t(e),r):await r(),hasScope:()=>!!n.getStore()}}function ib(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function iA(e,t){return{openBundle:async(t,n)=>{var r,i;let a;await e("open",(r=t,i=n,a=["-b",r],i&&a.push(i),a))},openTarget:async t=>{await e("open",[t])},readClipboard:async()=>{let t=await e("pbpaste",[],{allowFailure:!0});if(0!==t.exitCode)throw new F("COMMAND_FAILED","Failed to read macOS clipboard",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});return t.stdout.replace(/\r\n/g,"\n").replace(/\n$/,"")},writeClipboard:async t=>{let n=await e("pbcopy",[],{allowFailure:!0,stdin:t});if(0!==n.exitCode)throw new F("COMMAND_FAILED","Failed to write macOS clipboard",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},readDarkMode:async()=>{let t=await e("osascript",["-e",'tell application "System Events" to tell appearance preferences to get dark mode'],{allowFailure:!0});if(0!==t.exitCode)throw new F("COMMAND_FAILED","Failed to read macOS appearance",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let n=t.stdout.trim().toLowerCase();if("true"===n)return!0;if("false"===n)return!1;throw new F("COMMAND_FAILED",`Unable to determine current macOS appearance from osascript output: ${t.stdout.trim()}`)},setDarkMode:async t=>{let n=`tell application "System Events" to tell appearance preferences to set dark mode to ${t?"true":"false"}`,r=await e("osascript",["-e",n],{allowFailure:!0});if(0!==r.exitCode)throw new F("COMMAND_FAILED","Failed to set macOS appearance",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode})},listApps:async n=>await ix(e,t,n)}}async function ix(e,t,n){let r=["/Applications","/System/Applications",i.join(u.homedir(),"Applications")],a=new Set;for(let t of r){let n=await s.stat(t).catch(()=>null);if(!n?.isDirectory())continue;let r=await e("find",[t,"-maxdepth","4","-type","d","-name","*.app"],{allowFailure:!0});if(0===r.exitCode)for(let e of r.stdout.split("\n")){let t=e.trim();t&&a.add(t)}}return ib((await Promise.all(Array.from(a).map(async e=>{let n=await iN(e,t).catch(()=>({})),r=n.bundleId;return r?{bundleId:r,name:n.appName??i.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),n)}async function iN(e,t){for(let n of[i.join(e,"Contents","Info.plist"),i.join(e,"Info.plist")]){let e=await t(n),r=iM(e,"CFBundleIdentifier"),i=iM(e,"CFBundleDisplayName"),a=iM(e,"CFBundleName");if(r||i||a)return{bundleId:r,appName:i??a}}return{}}function iM(e,t){let n=e?.[t];return"string"==typeof n&&n.trim()?n.trim():void 0}let iE={runCommand:q,simctl:{run:async(e,t)=>await q("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await q("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await i$(q,e)},macosHost:iA(q,async e=>await i$(q,e)),whichCommand:B},iD=iI(iE,function(e){return"function"==typeof e?ik({runCommand:e}):ik(e)});function ik(e={}){let t={...iE,...e},n=e.plist??{readJson:async e=>await i$(t.runCommand,e)};return{...t,simctl:e.simctl??{run:async(e,n)=>await t.runCommand("xcrun",["simctl",...e],n)},devicectl:e.devicectl??{run:async(e,n)=>await t.runCommand("xcrun",["devicectl",...e],n)},plist:n,macosHost:e.macosHost??iA(t.runCommand,async e=>await n.readJson(e))}}function iP(e){return iD.resolve(e)}async function iC(e,t){return await iD.run(e,t)}function iR(){return iD.hasScope()}async function iT(e,t,n){return await iP().runCommand(e,t,n)}async function iO(e,t){let n=iP(),[r,...i]=e;return"simctl"===r?await (n.simctl?.run(i,t)??n.runCommand("xcrun",e,t)):"devicectl"===r?await (n.devicectl?.run(i,t)??n.runCommand("xcrun",e,t)):await iT("xcrun",e,t)}async function iL(e){return await iP().plist?.readJson(e)??null}async function i$(e,t){try{let n=await e("plutil",["-convert","json","-o","-",t],{allowFailure:!0});if(0!==n.exitCode||!n.stdout.trim())return null;return JSON.parse(n.stdout)}catch{return null}}let iF="agent-device-macos-helper",iU="AGENT_DEVICE_MACOS_HELPER_BIN",iG=i.join(u.homedir(),".agent-device","macos-helper","current"),iq=i.join(iG,"manifest.json"),ij=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function iV(e){let t=e.trim();if(!ij.test(t))throw new F("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function iB(e,t){t.bundleId&&e.push("--bundle-id",iV(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iH(){return function(e){let t=i.dirname(e);for(;;){let e=i.join(t,"macos-helper");if(o(i.join(e,"Package.swift")))return e;let n=i.dirname(t);if(n===t)break;t=n}throw new F("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(c(import.meta.url))}async function iK(e){let t=await s.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=i.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await iK(n):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[n]:[]}))).flat().sort()}async function iW(e){let t=await iK(e),n=r("sha256");for(let r of t)n.update(i.relative(e,r)),n.update("\0"),n.update(await s.readFile(r)),n.update("\0");let a=await iT("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return n.update("swift-version"),n.update("\0"),n.update(a.stdout||a.stderr||`exit:${a.exitCode}`),n.update("\0"),n.digest("hex")}async function iz(){try{let e=JSON.parse(await s.readFile(iq,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function iJ(){let e=await V(process.env[iU],iU);if(e)return e;let t=iH(),n=await iW(t),r=i.join(iG,iF);try{if(await iz()===n)return await s.access(r),r}catch{}let a=i.join(iH(),".build","release",iF);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await iT("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await s.mkdir(iG,{recursive:!0});let o=`${r}.tmp`;return await s.copyFile(a,o),await s.rename(o,r),await s.chmod(r,493),await s.writeFile(iq,`${JSON.stringify({fingerprint:n},null,2)}
|
|
5
|
-
`,"utf8"),r}async function iX(){let e=process.env[iU]?.trim();if(e){let t=await V(e,iU);if(t)return t}if(iR())return iF;if("darwin"!==process.platform)throw new F("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await iJ()}async function iZ(e){let t={allowFailure:!0,timeoutMs:3e4},n=iP().macosHelper,r=n?iF:await iX(),i=n?await n.run(e,t):await iT(r,e,t),a=i.stdout.trim(),o=null;if(a)try{o=JSON.parse(a)}catch{o=null}if(0===i.exitCode&&o?.ok)return o.data;throw new F("COMMAND_FAILED",o&&!o.ok?o.error?.message??`macOS helper exited with code ${i.exitCode}`:a||i.stderr.trim()||`macOS helper exited with code ${i.exitCode}`,{helperPath:r,args:e,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,...o&&!o.ok?o.error?.details:{}})}async function iY(){return await iZ(["app","frontmost"])}async function iQ(e){return await iZ(["app","quit","--bundle-id",iV(e)])}async function i0(e,t){return await iZ(["permission",e,t])}async function i1(e,t={}){let n=["alert",e];return iB(n,t),await iZ(n)}async function i2(e,t={}){let n=["snapshot","--surface",e];return iB(n,t),await iZ(n)}async function i3(e,t,n={}){let r=["read","--x",String(e),"--y",String(t)];return iB(r,n),await iZ(r)}async function i4(e,t,n={}){let r=["press","--x",String(e),"--y",String(t)];return iB(r,n),await iZ(r)}async function i5(e,t={}){let n=["screenshot","--out",e];return iB(n,t),t.fullscreen&&n.push("--fullscreen"),await iZ(n)}let i8={"push button":"Button","toggle button":"Button","push button menu":"Button",label:"StaticText",static:"StaticText",caption:"StaticText",text:"TextField",entry:"TextField","password text":"TextField","spin button":"TextField",terminal:"TextArea","document text":"TextArea",paragraph:"TextArea",frame:"Window",window:"Window",dialog:"Dialog",alert:"Alert","file chooser":"Dialog","color chooser":"Dialog","font chooser":"Dialog",panel:"Group",filler:"Group",section:"Group",form:"Group",grouping:"Group","layered pane":"Group","glass pane":"Group","root pane":"Group","option pane":"Group","internal frame":"Group","desktop frame":"Group","block quote":"Group",article:"Group",comment:"Group",landmark:"Group",log:"Group",marquee:"Group",math:"Group",notification:"Group","content deletion":"Group","content insertion":"Group",mark:"Group",suggestion:"Group","scroll pane":"ScrollArea","scroll bar":"ScrollBar","menu bar":"MenuBar",menu:"Menu","popup menu":"Menu","menu item":"MenuItem","check menu item":"MenuItem","radio menu item":"MenuItem","tearoff menu item":"MenuItem","check box":"CheckBox","radio button":"RadioButton",switch:"Switch","combo box":"ComboBox","page tab":"Tab","page tab list":"TabList",table:"Table","tree table":"Table","table cell":"Cell","table row":"Row","table column header":"Cell","table row header":"Cell","column header":"Cell","row header":"Cell",list:"List","list item":"ListItem","list box":"List",tree:"Tree","tree item":"TreeItem","description list":"List","description term":"ListItem","description value":"ListItem","tool bar":"Toolbar","status bar":"StatusBar","info bar":"StatusBar",slider:"Slider","progress bar":"ProgressBar","level bar":"ProgressBar",image:"Image",icon:"Image",animation:"Image",canvas:"Image","drawing area":"Image",video:"Video",audio:"Audio",link:"Link",hyperlink:"Link",separator:"Separator",application:"Application","tool tip":"Tooltip",timer:"Timer",heading:"Heading",footnote:"Footnote","title bar":"TitleBar","date editor":"DateEditor",rating:"Slider"},i6={runCommand:q,whichCommand:B,desktop:an(q,B),clipboard:ar(q,B),screenshot:ai(q,B)},i9=iI(i6,function(e={}){let t={...i6,...e};return{...t,desktop:e.desktop??an(t.runCommand,t.whichCommand),clipboard:e.clipboard??ar(t.runCommand,t.whichCommand),screenshot:e.screenshot??ai(t.runCommand,t.whichCommand)}});function i7(e){return i9.resolve(e)}async function ae(e,t){return await i9.run(e,t)}async function at(e,t,n){return await i7().runCommand(e,t,n)}function an(e,t){return{async openTarget(n){if(n.includes("://")||n.startsWith("/"))return void await e("xdg-open",[n]);if(await t(n)){e(n,[],{allowFailure:!0}).catch(e=>{E({level:"warn",phase:"linux_app_launch",data:{app:n,error:String(e)}})}),await ez(500);return}await e("xdg-open",[n],{allowFailure:!0})},async closeApp(n){await t("wmctrl")?await e("wmctrl",["-c",n],{allowFailure:!0}):await e("pkill",["-x",n],{allowFailure:!0})}}}function ar(e,t){return{async readText(){let n=as[await ad(t,aa)];return(await e(n.cmd,n.args,n.options)).stdout},async writeText(n){let r=al[await ad(t,aa)](n);await e(r.cmd,r.args,r.options)}}}function ai(e,t){return{async capture(n){let r=ac[await ad(t,ao)](n);await e(r.cmd,r.args,r.options)}}}let aa={wayland:[{tool:"wl-clipboard",command:"wl-paste"}],x11:[{tool:"xclip",command:"xclip"},{tool:"xsel",command:"xsel"}],waylandError:"wl-paste (wl-clipboard) is required for clipboard access on Wayland. Install via your package manager.",x11Error:"xclip or xsel is required for clipboard access on X11. Install via your package manager."},ao={wayland:[{tool:"grim",command:"grim"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],x11:[{tool:"scrot",command:"scrot"},{tool:"import",command:"import"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],waylandError:"grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.",x11Error:"scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager."},as={"wl-clipboard":{cmd:"wl-paste",args:["--no-newline"],options:{allowFailure:!0,timeoutMs:5e3}},xclip:{cmd:"xclip",args:["-selection","clipboard","-o"],options:{allowFailure:!0,timeoutMs:5e3}},xsel:{cmd:"xsel",args:["--clipboard","--output"],options:{allowFailure:!0,timeoutMs:5e3}}},al={"wl-clipboard":e=>({cmd:"wl-copy",args:["--",e],options:{allowFailure:!1,timeoutMs:5e3}}),xclip:e=>({cmd:"xclip",args:["-selection","clipboard"],options:{allowFailure:!1,timeoutMs:5e3,stdin:e}}),xsel:e=>({cmd:"xsel",args:["--clipboard","--input"],options:{allowFailure:!1,timeoutMs:5e3,stdin:e}})},ac={grim:e=>({cmd:"grim",args:[e]}),scrot:e=>({cmd:"scrot",args:[e]}),import:e=>({cmd:"import",args:["-window","root",e]}),"gnome-screenshot":e=>({cmd:"gnome-screenshot",args:["-f",e]})};async function ad(e,t){let n=process.env.WAYLAND_DISPLAY||"wayland"===process.env.XDG_SESSION_TYPE?"wayland":"x11";for(let r of t[n])if(await e(r.command))return r.tool;throw new F("TOOL_MISSING","wayland"===n?t.waylandError:t.x11Error)}let au="atspi-dump.py",ap=null;async function af(e,t={}){let n,r=i7().accessibility;if(r)return await r.captureTree(e,t);if("linux"!==process.platform)throw new F("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await i7().whichCommand("python3"))throw new F("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let o=t.maxNodes??1500,s=t.maxDepth??12,l=t.maxApps??24,d=[function(){if(ap)return ap;let e=i.dirname(c(import.meta.url));for(let t=0;t<5;t++){let n=i.join(e,"src","platforms","linux",au);if(a.existsSync(n))return ap=n,n;if(0===t){let t=i.join(e,au);if(a.existsSync(t))return ap=t,t}e=i.dirname(e)}throw new F("TOOL_MISSING",`Cannot find ${au}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(l)],u=await at("python3",d,{allowFailure:!0,timeoutMs:3e4});if(0!==u.exitCode){let e=u.stderr.trim();if(e.includes("No module named")||e.includes("gi.require_version"))throw new F("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new F("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{n=JSON.parse(u.stdout)}catch{throw new F("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(n.error)throw new F("COMMAND_FAILED",`AT-SPI2: ${n.error}`);return{nodes:(n.nodes??[]).map(e=>{let t,n;return{index:e.index,type:(n=i8[t=e.role.toLowerCase().trim()])||t.split(/[\s_-]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(""),role:e.role,label:e.label??void 0,value:e.value??void 0,rect:e.rect??void 0,enabled:e.enabled??void 0,selected:e.selected??void 0,hittable:e.hittable??void 0,depth:e.depth,parentIndex:e.parentIndex??void 0,pid:e.pid??void 0,appName:e.appName??void 0,windowTitle:e.windowTitle??void 0}}),truncated:n.truncated,surface:e}}async function am(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&E({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),n=await af(t);return{nodes:n.nodes,truncated:n.truncated}}async function ah(e,t,n){let{nodes:r}=await am(n);for(let n of r.filter(n=>{let r=n.rect;return!!r&&e>=r.x&&t>=r.y&&e<=r.x+r.width&&t<=r.y+r.height}).sort((e,t)=>{let n=e.depth??0,r=t.depth??0;return n!==r?r-n:aw(e.rect)-aw(t.rect)})){let e=function(e){for(let t of[e.value,e.label,e.identifier])if("string"==typeof t&&t.length>0)return t;return""}(n);if(e.trim())return e}return""}function aw(e){return(e?.width??0)*(e?.height??0)}let ag=[250,400,600];function av(e,t,n=e.snapshot){if("android"!==e.device.platform)return;let r=function(e,t){if(t?.comparisonSafe===!0)return t;let n=e.lastComparisonSafeSnapshot;return n&&!0===n.comparisonSafe&&Date.now()-n.createdAt<=5e3?n:t}(e,n),i=r?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(r??n)?.nodes.length??0,baselineSignatures:i?aI(r?.nodes??[]):void 0,routeComparable:i}}function ay(e){if(!e||"android"!==e.device.platform)return;let t=e.androidSnapshotFreshness;if(t)return Date.now()-t.markedAt>2500?void delete e.androidSnapshotFreshness:t}function aS(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function a_(e){return"press"===e||"click"===e||"back"===e||"open"===e}function aI(e){return e.map(e=>[e.depth??0,e.type??"",e.role??"",e.label??"",e.value??"",e.identifier??"",!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].join("|"))}function ab(e,t,n,r,i){return{requestId:i??A().requestId,appBundleId:n,activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:r,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotCompact:t?.snapshotCompact,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,..._(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:rx(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function aA(e){var t;let{session:n,command:r,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!aP(n))return;let s=function(e){if("click"===e||"press"===e)return"press"}(r);if(!s||!(2===(t=i).length&&t.every(e=>Number.isFinite(Number(e)))))return;let l=aE(o?.nodes??[]);0!==l.length&&(n.pendingInteractionOutcome={action:r,command:s,positionals:i,flags:aM(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function ax(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function aN(e){let{session:t,pending:n,snapshot:r}=e,i=aD(n.preSignature,aE(r.nodes));if("unchanged"!==i||n.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return n.attemptsRemaining-=1,await r9(t.device,n.command,n.positionals,n.flags?.out,{...ab(e.logPath,n.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),E({level:"info",phase:"interaction_no_change_retry",data:{action:n.action,attemptsRemaining:n.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function aM(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:n,...r}=e;return r}function aE(e){let t=new Map,n=[];for(let r of e){let e=function(e,t){var n,r;if(!e.rect||!([(n=e.rect).x,n.y,n.width,n.height].every(e=>Number.isFinite(e))&&n.width>0&&n.height>0)||(r=e,`${r.label??""} ${r.identifier??""}`.toLowerCase().includes("scroll bar")))return;let i=function(e){let t=[e.identifier,e.label,e.value,e.type,e.role,!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].map(e=>"string"==typeof e?e.trim():"").join("|");return t.replaceAll("|","")?t:void 0}(e);if(!i)return;let a=t.get(i)??0;return t.set(i,a+1),{key:`${i}|#${a}`,x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height)}}(r,t);e&&n.push(e)}return n}function aD(e,t){return 0===e.length||0===t.length?"ambiguous":ak(e,t)?"unchanged":"changed"}function ak(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1){let r=e[n],i=t[n];if(!r||!i||r.key!==i.key||Math.abs(r.x-i.x)>1||Math.abs(r.y-i.y)>1||Math.abs(r.width-i.width)>1||Math.abs(r.height-i.height)>1)return!1}return!0}function aP(e){return"ios"===e.device.platform||"android"===e.device.platform}function aC(e,t,n=[],r){var i,a,o;aO(e.device.platform)&&(i=t,a=n,o=r,(o?.postGestureStabilization===!0||"swipe"===i||"scroll"===i||"gesture"===i&&"swipe"===a[0])&&(e.postGestureStabilization={action:t,markedAt:Date.now()}))}function aR(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function aT(e){let{session:t,capture:n}=e,r=t?.postGestureStabilization;if(!t||!aO(t.device.platform)||!r)return e.initial??await n();let i=Date.now(),a=1,o=e.initial??await n(),s=aE(e.readSnapshot(o).nodes);for(;Date.now()-i<1500;){await ez(200),a+=1;let l=await n(),c=aE(e.readSnapshot(l).nodes);if(ak(s,c))return aR(t),E({level:a>2?"info":"debug",phase:"post_gesture_snapshot_stabilized",data:{action:r.action,attempts:a,durationMs:Date.now()-i}}),l;o=l,s=c}return aR(t),E({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:r.action,attempts:a,durationMs:Date.now()-i}}),o}function aO(e){return"ios"===e||"android"===e}function aL(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}let a$=new WeakMap;function aF(e,t){if(!e[t])return[];let n=aq(e)[t]??t+1;return e.slice(t+1,n)}function aU(e,t,n){let r=aq(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];if(t&&n(t))return t}}function aG(e,t,n){let r=aq(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];t&&n(t)}}function aq(e){let t=a$.get(e);if(t)return t;let n=Array(e.length),r=[];for(let[t,i]of e.entries()){let e=i?.depth??0;for(;r.length>0&&e<=r[r.length-1].depth;)n[r.pop().position]=t;r.push({depth:e,position:t})}for(let t of r)n[t.position]=e.length;return a$.set(e,n),n}function aj(e,t,n){for(let r of function(e,t){let n=[],r="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),n.push(r),r="number"==typeof r.parentIndex?t.get(r.parentIndex):void 0;return n}(e,t))if(n(r))return r;return null}function aV(e,t){let n=e0(e.type??""),r=e.label?.trim();return!!(aB(e)||"other"===n&&!r&&!e.value||("other"===n||"statictext"===n)&&r&&t.includes(r))||"image"===n}function aB(e){return"button"===e0(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function aH(e){let t=e0(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function aK(e,t,n){e.set(t.index,{...t,...e.get(t.index),...n})}function aW(e){let t;for(let i of e){var n,r;let e=e0(i.type??"");("application"===e||"window"===e)&&(n=i.rect,r=t,n&&(!r||az(n)>az(r)))&&(t=i.rect)}return t}function az(e){return e?e.width*e.height:0}function aJ(e){let t=e0(e.type??"");return"scrollview"===t||"scrollarea"===t}function aX(e,t){return!0===e||!!t||void 0}function aZ(e,t,n,r){aG(e,t,e=>{(function(e,t){let n=e.label?.trim();if(!n||n!==t)return!1;let r=e0(e.type??"");return"other"===r||"statictext"===r||"link"===r})(e,n)&&r.add(e.index)})}function aY(e,t,n,r){aG(e,t,e=>{var t;let i;e.index!==n&&"button"!==(i=e0((t=e).type??""))&&("image"===i||"Search"===t.label)&&r.add(e.index)})}function aQ(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?.label?.trim();r&&i&&"other"===e0(r.type??"")&&t(r,i,n)}}function a0(e,t,n,r){for(let i of e)(aV(i,t)||r&&a2(i,r))&&n.add(i.index)}function a1(e,t,n){if("button"!==e0(e.type??""))return!1;let r=t.identifier?.trim(),i=e.identifier?.trim();return!!r&&!!i&&r===i||e.label?.trim()===n&&eD(e.rect,t.rect)}function a2(e,t){return"button"===e0(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&eD(e.rect,t.rect)}let a3=[function(e,t){var n,r,i,a;let{suppressedIndexes:o}=t;(function(e,t){let n=aW(e),r=n?n.y+n.height:null;if(null!==r)for(let n=0;n<e.length;n+=1){var i,a;let o=e[n];o&&(i=o,a=r,i.rect&&"keyboard"===e0(i.type??"")&&i.rect.y>=a)&&(t.add(o.index),function(e,t,n,r){let i=new Map(t.map(e=>[e.index,e])),a="number"==typeof e.parentIndex?i.get(e.parentIndex):void 0;for(;a?.rect&&a.rect.y>=r;)n.add(a.index),a="number"==typeof a.parentIndex?i.get(a.parentIndex):void 0}(o,e,t,r),aG(e,n,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let n of e)!("other"!==e0(n.type??"")||!0===n.hittable||n.label?.trim()||n.value?.trim())&&n.identifier?.trim()&&t.add(n.index)}(e,o);let s=new Map(e.map(e=>[e.index,e]));for(let n of e)(function(e){let t=e.label?.trim();return!!(t&&ek(t))})(n)&&function(e,t,n){var r,i,a,o;aH(e.type)||n.suppressedIndexes.add(e.index);let s=eO(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,n={}){return(!0===n.includeSelf&&aH(e.type)?e:null)??aj(e,t,e=>aH(e.type))}(e,t,{includeSelf:!0});l&&(r=n,i=l,a=e,o=s,aK(r.replacements,i,{rect:function(e,t){if(e&&t&&!(t.height<=0)&&!(t.height>=e.height)&&!(t.y<e.y)&&!(t.y>e.y+e.height))return{...e,y:t.y,height:Math.min(t.height,e.y+e.height-t.y)}}(i.rect,a.rect)??i.rect,hiddenContentAbove:aX(i.hiddenContentAbove,o.above),hiddenContentBelow:aX(i.hiddenContentBelow,o.below)}))}(n,s,t);(function(e,t){for(let n=0;n<e.length;n+=1){let r=e[n];if(!r||"searchfield"!==e0(r.type??""))continue;if("Search"===r.label){aY(e,n,null,t);continue}if("Toolbar"!==r.label)continue;let i=aU(e,n,e=>"searchfield"===e0(e.type??"")&&"Search"===e.label);i&&(t.add(r.index),function(e,t,n){let r=new Map(t.map(e=>[e.index,e])),i=e;for(;"number"==typeof i.parentIndex;){let e=r.get(i.parentIndex);if(!e||"Toolbar"!==e.label)return;n.add(e.index),i=e}}(r,e,t),aY(e,n,i.index,t))}})(e,o),n=e,r=o,aQ(n,(e,t,i)=>{aU(n,i,n=>{let r;return("button"===(r=e0(n.type??""))||"link"===r||"switch"===r||"searchfield"===r||"textfield"===r)&&n.label?.trim()===t&&(eD(n.rect,e.rect)||function(e,t){var n,r,i,a,o;let s;if(t.label?.trim()!==e.label?.trim())return!1;let l=e0(t.type??"");return n=e,r=l,s=n.label?.trim(),"button"===r&&("Dismiss"===s||"Back"===s)||"textfield"===l||(i=e,a=l,o=t,"button"===a&&!!i.rect&&!!o.rect&&0===i.rect.x&&0===i.rect.y&&i.rect.width>=300&&i.rect.height>=600&&o.rect.width<i.rect.width)}(e,n))})&&r.add(e.index)}),i=e,a=o,aQ(i,(e,t,n)=>{let r;eF(e)&&eC(e,(r=[],aG(i,n,e=>{r.push(e)}),r))&&a.add(e.index)}),function(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?.label?.trim();!(!r||t.has(r.index))&&i&&function(e,t,n,r,i){let a=e0(n.type??"");if("statictext"===a||"link"===a)return aZ(e,t,r,i);if("other"===a){if(function(e,t,n){return!!aU(e,t,e=>{let t=e0(e.type??"");return("link"===t||"searchfield"===t||aH(e.type))&&e.label?.trim()===n})}(e,t,r))return i.add(n.index);aZ(e,t,r,i)}}(e,n,r,i,t)}}(e,o)},function(e,t){let n=new Map(e.map(e=>[e.index,e])),r=aW(n.values());for(let i of e)(function(e,t,n){var r;return!("other"!==e0(e.type??"")||!1===e.enabled||!e.rect||!function(e){let t=e?.trim();return!(!t||/^(toolbar|window|application)$/i.test(t)||t.startsWith("!,")||/debugger|fast refresh/i.test(t))}(e.label)||!aj(e,t,aJ)||!((r=e).rect&&r.rect.height>=44&&r.rect.height<=160&&r.rect.width>=120)||function(e,t,n=.8){let r=az(e),i=az(t);return r>0&&i>0&&r/i>=n}(e.rect,n))})(i,n,r)&&aK(t.replacements,i,{type:"Cell"})},function(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?.label?.trim();r?.rect&&i&&function(e,t,n,r,i){let a=e0(n.type??"");if("button"===a)return a0(aF(e,t),r,i.suppressedIndexes,n);if("cell"!==a)return;let o=aF(e,t);!function(e,t,n,r){let i=e.find(e=>(function(e,t,n){if("switch"!==e0(e.type??""))return!1;let r=t.identifier?.trim(),i=e.identifier?.trim();return!!r&&!!i&&r===i||e.label?.trim()===n})(e,t,n));if(!i)return!1;let a=e.find(e=>a1(e,t,n)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&aK(r.replacements,i,{identifier:o}),r.suppressedIndexes.add(t.index),function(e,t,n,r,i){for(let a of e)a.index!==r.index&&(a1(a,t,n)||a2(a,t)||function(e,t){if("switch"!==e0(e.type??"")||e.index===t.index)return!1;let n=e.label?.trim();return n===t.value?.trim()||"0"===n||"1"===n}(a,r)||aV(a,n))&&i.add(a.index)}(e,t,n,i,r.suppressedIndexes),!0}(o,n,r,i)&&function(e,t,n,r){let i=e.find(e=>a1(e,t,n));if(!i){e.some(aB)&&a0(e,n,r.suppressedIndexes,t);return}!t.identifier&&i.identifier&&aK(r.replacements,t,{identifier:i.identifier}),r.suppressedIndexes.add(i.index),a0(e.filter(e=>e.index!==i.index),n,r.suppressedIndexes,t)}(o,n,r,i)}(e,n,r,i,t)}}];async function a4(e){let t=await a5(e);if(t)return t;let n=await a9(e);return aS(e.session),{snapshot:oo(n,oi(e)),analysis:n.analysis,androidSnapshot:n.androidSnapshot}}async function a5(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!aP(e)||Date.now()-t.markedAt>3e4?void ax(e):t}(e.session);if(t&&e.session)return await a8({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await ot({...e,session:e.session});let n=ay(e.session);if(n&&"android"===e.device.platform)return await a7(e,n)}async function a8(e,t){var n,r;let i=e.session,a=Date.now(),o=0,s=await a6(e,t,await on(e)),l=await aN({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await a6(e,t,await on(e)),l=await aN({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(ax(i),s=await aT({session:i,initial:s,capture:async()=>await on(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.freshness?.staleAfterRetries!==!0&&aS(i),"unchanged"===l.change)?E({level:"warn",phase:"interaction_settle_timeout",data:{action:(n={pending:t,attempts:o,startedAt:a}).pending.action,attempts:n.attempts,durationMs:Date.now()-n.startedAt}}):E({level:(r={pending:t,change:l.change,attempts:o,startedAt:a}).attempts>0?"info":"debug",phase:"interaction_settled",data:{action:r.pending.action,change:r.change,attempts:r.attempts,durationMs:Date.now()-r.startedAt}}),{snapshot:s.snapshot,analysis:s.data.analysis,androidSnapshot:s.data.androidSnapshot,freshness:s.freshness}}async function a6(e,t,n){let r=n;return"unchanged"!==aD(t.preSignature,aE(r.snapshot.nodes))?r:(await ez(500),r=await on(e))}async function a9(e){let{device:t,session:n,flags:r,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await am(n?.surface);return os({nodes:e.nodes,truncated:e.truncated,backend:"linux-atspi"},{snapshotDepth:r?.snapshotDepth,snapshotInteractiveOnly:r?.snapshotInteractiveOnly,snapshotScope:o})}return"macos"===t.platform&&n?.surface&&"app"!==n.surface?os(await i2(n.surface,{bundleId:"menubar"===n.surface?n.appBundleId:void 0}),{snapshotDepth:r?.snapshotDepth,snapshotInteractiveOnly:r?.snapshotInteractiveOnly,snapshotScope:o}):await r9(t,"snapshot",[],i,{...ab(a,{...r,snapshotScope:o},n?.appBundleId,n?.trace?.outPath)})}async function a7(e,t){let n=await oe(e,t);return{snapshot:n.snapshot,analysis:n.data.analysis,androidSnapshot:n.data.androidSnapshot,freshness:n.freshness}}async function oe(e,t){let n=await or(e),r=oa(n,t,e),i=0,a=t.markedAt+1500;for(let o of ag){if(!r)break;let s=a-Date.now();if(s<=0)break;await ez(Math.min(o,s)),n=await or(e),i+=1,r=oa(n,t,e)}return r||aS(e.session),{...n,freshness:i>0||r?{action:t.action,retryCount:i,staleAfterRetries:!!r,reason:r??void 0}:void 0}}async function ot(e){let t=await aT({session:e.session,capture:async()=>await on(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,analysis:t.data.analysis,androidSnapshot:t.data.androidSnapshot,freshness:t.freshness}}async function on(e){let t=ay(e.session);return t&&"android"===e.device.platform?await oe(e,t):await or(e)}async function or(e){let t=await a9(e);return{data:t,snapshot:oo(t,oi(e))}}function oi(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function oa(e,t,n){var r,i;let a=n.flags?.snapshotInteractiveOnly===!0,o=e.data.analysis;if(a&&0===e.snapshot.nodes.length&&o&&o.rawNodeCount>=12)return"empty-interactive";if("ref-refresh"===n.androidFreshnessMode)return null;return(r=t.baselineCount,i=e.snapshot.nodes.length,!(r<12)&&i<=Math.floor(.2*r))?e.snapshot.nodes.some(e=>!0===e.hittable||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())?null:"sharp-drop":t.routeComparable&&a_(t.action)&&function(e,t){if(!e||0===e.length)return!1;let n=Math.max(e.length,t.length);if(n<12)return!1;let r=aI(t),i=Math.min(e.length,r.length),a=0;for(let t=0;t<i;t+=1)e[t]===r[t]&&(a+=1);let o=Math.max(0,r.length-e.length),s=Math.max(0,e.length-r.length),l=Math.max(3,Math.floor(.15*n));return a>=Math.floor(.9*n)&&o<=l&&s<=l}(t.baselineSignatures,e.snapshot.nodes)?"stuck-route":null}function oo(e,t){var n,r,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=e$(s?o:e1(o)),c=t?.snapshotScope&&e?.backend!=="macos-helper"?ol(l,t.snapshotScope):l,d=(n=e?.backend,r=t,"xctest"===n&&r?.snapshotInteractiveOnly===!0&&!0!==r.snapshotRaw)?function(e){if(0===e.length)return e;let t=new Map,n=new Set;for(let r of a3)r(e,{replacements:t,suppressedIndexes:n});if(0===n.size&&0===t.size)return e;var r=e.filter(e=>!n.has(e.index)).map(e=>t.get(e.index)??e);let i=new Map(e.map(e=>[e.index,e])),a=new Map;for(let[e,t]of r.entries())a.set(t.index,e);return r.map((e,t)=>{let r="number"==typeof e.parentIndex?a.get(e.parentIndex):void 0;return void 0===r&&"number"==typeof e.parentIndex&&(r=function(e,t,n,r){let i=e,a=new Set;for(;"number"==typeof i&&!a.has(i);){if(a.add(i),!t.has(i))return r.get(i);i=n.get(i)?.parentIndex}}(e.parentIndex,n,i,a)),{...e,index:t,parentIndex:r}})}(c):c;return{nodes:e7(s?d:eB(d)),truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,presentationKey:e6(e4(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&a?.snapshotCompact!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function os(e,t){var n,r;let i=e.nodes??[];return t.snapshotScope&&(i=ol(i,t.snapshotScope)),t.snapshotInteractiveOnly&&(i=function(e){if(0===e.length)return e;let t=new Map;for(let n of e)t.set(n.index,n);let n=new Set;for(let r of e){if(!function(e){if(e.focused||e.hittable||e.rect)return!0;let t=`${e.type??""} ${e.role??""} ${e.subrole??""}`.toLowerCase();return t.includes("button")||t.includes("menu")||t.includes("textfield")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")}(r))continue;let e=r;for(;e&&!n.has(e.index);)n.add(e.index),e="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0}return 0===n.size?e:oc(e.filter(e=>n.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(n=i,r=t.snapshotDepth,i=oc(n.filter(e=>(e.depth??0)<=r))),{...e,nodes:i}}function ol(e,t){let n=e2(e7(e),t);if(!n)return[];let r=e.findIndex(e=>e.index===n.index);if(-1===r)return[];let i=e[r]?.depth??0,a=[];for(let t=r;t<e.length;t+=1){let n=e[t];if(!n)continue;let o=n.depth??0;if(t>r&&o<=i)break;a.push(n)}return oc(a,i)}function oc(e,t=0){let n=new Map;for(let[t,r]of e.entries())n.set(r.index,t);return e.map((e,r)=>({...e,index:r,depth:Math.max(0,(e.depth??0)-t),parentIndex:"number"==typeof e.parentIndex?n.get(e.parentIndex):void 0}))}function od(e,t){let n;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return aL("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let r=e5(e.trim());if(!r)return aL("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=e8(e.nodes,r);if(n=t?e3(t,e.nodes):void 0)break}return n?{ok:!0,scope:n}:aL("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function ou(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function op(e){return{get:t=>t===e.sessionName?function(e,t,n={}){if(e)return{name:t,appBundleId:e.appBundleId,appName:e.appName,...!0===n.includeSnapshot?{snapshot:e.snapshot}:{},metadata:{surface:e.surface,...n.metadata??{}}}}(e.getSession(),e.sessionName,e.recordOptions):void 0,set:t=>{t.name!==e.sessionName?E({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function of(e){let{session:t,sessionName:n,outPath:r,outputPlacement:a,dispatchContext:o}=e,l=eG({backend:function(e){let{session:t,outputPlacement:n,dispatchContext:r}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...r,..._(a),surface:a?.surface};return"out"===n?om(await r9(t.device,"screenshot",[],i,o)):om(await r9(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:o}),artifacts:{resolveInput:async()=>{throw new F("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,n;return e?.kind==="path"?n=e.path:(t=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-screenshot-")),n=i.join(t,"screenshot.png")),await s.mkdir(i.dirname(n),{recursive:!0}),{path:n,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await s.mkdtemp(i.join(u.tmpdir(),`${e.prefix}-`));return{path:i.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}}},sessions:op({sessionName:n,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eH()});return await l.capture.screenshot({session:n,requestId:o.requestId,appBundleId:t.appBundleId,...S(o),surface:t.surface,...r?{out:{kind:"path",path:r}}:{}})}function om(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function oh(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function ow(e,t){let n=Math.max(24,Math.round(.2*Math.min(e.size,t.size))),r=Math.max(48,Math.round(.15*Math.min(e.crossSize,t.crossSize)));return Math.abs(e.size-t.size)<=n&&Math.abs(e.crossSize-t.crossSize)<=r}function og(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let ov=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function oy(e,t={}){let n=tr(e,t.helperAdb).exec;return(await oA(e,t,n)).xml}async function oS(e,t={}){let n=tr(e,t.helperAdb).exec,r=await oA(e,t,n),i=r.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=ta(i,void 0,t),s=o_(o.truncated,r.metadata);return a&&function(e,t){for(let[n,r]of e){let e=t[n];e&&(r.hiddenContentAbove&&(e.hiddenContentAbove=!0),r.hiddenContentBelow&&(e.hiddenContentBelow=!0))}}(await oT(e,o.nodes,i,n),o.nodes),{...o,...oI(s),androidSnapshot:r.metadata}}let o=ts(i),s=tp(o,void 0,t),l=o_(s.truncated,r.metadata);a&&await ob({device:e,options:t,tree:o,xml:i,adb:n,interactiveSnapshot:s});let{sourceNodes:c,...d}=s;return{...d,...oI(l),androidSnapshot:r.metadata}}function o_(e,t){return!0===e||!0===t.helperTruncated||e}function oI(e){return!0===e?{truncated:!0}:{}}async function ob(e){if(oL(e.interactiveSnapshot.nodes).size>0||oO(e.xml))return;let t=tp(e.tree,void 0,{...e.options,interactiveOnly:!1}),n=await oT(e.device,t.nodes,e.xml,e.adb);oj(n,t,e.interactiveSnapshot),0===n.size&&oj(eR(e7(t.nodes)),t,e.interactiveSnapshot)}async function oA(e,t,n){let r=await N("android_snapshot_helper_artifact_resolution",async()=>await oC(t.helperArtifact));return r.artifact?await ox(e,t,n,r.artifact):(E({level:r.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:r.fallbackReason??"artifact_not_found"}}),await oR(e,r.fallbackReason,n))}async function ox(e,t,n,r){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),c=tr(e,t.helperAdb);try{let e=await oN(t,n,c,r,l);return e.installed&&await tf(l),a=await oM(t,n,c,r,l),o=r,s=e.reason,{xml:a.xml,metadata:{backend:"android-helper",helperVersion:o.manifest.version,helperApiVersion:a.metadata.helperApiVersion,helperTransport:a.metadata.transport,helperSessionReused:a.metadata.sessionReused,installReason:s,waitForIdleTimeoutMs:a.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:a.metadata.waitForIdleQuietMs,timeoutMs:a.metadata.timeoutMs,maxDepth:a.metadata.maxDepth,maxNodes:a.metadata.maxNodes,rootPresent:a.metadata.rootPresent,captureMode:a.metadata.captureMode,windowCount:a.metadata.windowCount,nodeCount:a.metadata.nodeCount,helperTruncated:a.metadata.truncated,elapsedMs:a.metadata.elapsedMs}}}catch(t){return await oE({error:t,helperDeviceKey:l,artifact:r,device:e,adb:n})}}async function oN(e,t,n,r,i){let a=await N("android_snapshot_helper_install",async()=>await to({adb:t,adbProvider:n,artifact:r,deviceKey:i,installPolicy:e.helperInstallPolicy,timeoutMs:3e4}),{packageName:r.manifest.packageName,versionCode:r.manifest.versionCode,installPolicy:e.helperInstallPolicy??"missing-or-outdated"});return E({phase:"android_snapshot_helper_install_decision",data:{packageName:a.packageName,versionCode:a.versionCode,installedVersionCode:a.installedVersionCode,installed:a.installed,reason:a.reason}}),a}async function oM(e,t,n,r,i){let a={adb:t,adbProvider:n,deviceKey:i,helperVersion:r.manifest.version,helperVersionCode:r.manifest.versionCode,packageName:r.manifest.packageName,instrumentationRunner:r.manifest.instrumentationRunner,waitForIdleTimeoutMs:e.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await N("android_snapshot_helper_session_capture",async()=>await tc(a),{packageName:r.manifest.packageName,version:r.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){E({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:$(e).message}}),await oD(t,r.manifest.packageName)}return await N("android_snapshot_helper_capture",async()=>await tl(a),{packageName:r.manifest.packageName,version:r.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function oE(e){let t=function(e){var t;let n=$(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let n="errorType"in e?String(e.errorType):"",r=oP(e)??t;return/TimeoutException/.test(n)||/timed out/i.test(r)}(n.details?.helper,n.message)&&(t=n,!(t.details?.exitCode===137&&/Android snapshot helper (failed before returning parseable output|output could not be parsed)/.test(t.message))))return;let r=ok(e);return new F(O(n.code),`${r}. Stock UIAutomator fallback was skipped because this usually means the Android accessibility tree is busy or stalled.`,{...n.details,hint:"Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout and report the busy UI if it persists."},e)}(e.error);if(t)throw t;let n=ok(e.error);return E({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:n}}),await tf(e.helperDeviceKey),await oD(e.adb,e.artifact.manifest.packageName),tu({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oR(e.device,n,e.adb)}async function oD(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await ez(150),E({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){E({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:$(e).message}})}}function ok(e){let t=$(e),n=oP(t.details?.helper);if(n&&n!==t.message)return`${t.message}: ${n}`;if(n)return n;let r=("string"==typeof t.details?.stderr?t.details.stderr.trim():"").split(/\r?\n/).find(e=>e.trim());return r?`${t.message}: ${r}`:t.message}function oP(e){if(!e||"object"!=typeof e||!("message"in e))return;let t=String(e.message).trim();return t&&"null"!==t?t:void 0}async function oC(e){if(e)return{artifact:e};let t=tt(),n=i.join(tn(),"android-snapshot-helper","dist"),r=i.join(n,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await w.access(r)}catch{return{}}try{let e=td(JSON.parse(await w.readFile(r,"utf8"))),t=i.join(n,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await w.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:$(e).message}}}async function oR(e,t,n){let r;try{r=await N("android_snapshot_stock_capture",async()=>await o$(e,n),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let n;throw i=e,a=t,new F(O((n=$(i)).code),`${n.message} Android snapshot helper failed before stock fallback: ${a}`,{...n.details,androidSnapshotHelperFallbackReason:a,...n.hint?{hint:n.hint}:{}},i)}throw e}return{xml:r,metadata:{backend:"uiautomator-dump",...t?{fallbackReason:t}:{}}}}async function oT(e,t,n,r){if(!t.some(e=>te(e.type)))return new Map;let i=oL(t);if(i.size>0||oO(n))return i;let a=await oq(e,r);return a?function(e,t){let n=function(e){let t={className:"root",rect:{x:0,y:0,width:0,height:0},children:[]},n=[{indent:-1,node:t}],r=/^(\s*)([\w.$]+)\{[^}]* (-?\d+),(-?\d+)-(-?\d+),(-?\d+) #/;for(let t of e.split("\n")){let e=r.exec(t);if(!e)continue;let[i,a,o,s,l,c]=e.slice(1);if(void 0===i||void 0===a||void 0===o||void 0===s||void 0===l||void 0===c)continue;let d=i.length,u=Number(o),p=Number(s),f={className:a,rect:{x:u,y:p,width:Math.max(0,Number(l)-u),height:Math.max(0,Number(c)-p)},children:[]};for(;n.length>1&&d<=n[n.length-1].indent;)n.pop();n[n.length-1].node.children.push(f),n.push({indent:d,node:f})}return t.children.length>0?t:null}(t);if(!n)return new Map;let r=function(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();if(te(e.className)){let n=function(e){let t=e.children[0];if(!t)return null;let n=Math.max(t.rect.height,...t.children.map(e=>e.rect.y+e.rect.height)),r=t.children.filter(e=>e.rect.height>0).map(t=>og(t.rect,e.rect)).sort((e,t)=>e.start-t.start);return 0===r.length?null:{rect:e.rect,contentExtent:n,contentBlocks:r}}(e);n&&t.push(n)}n.push(...e.children)}return t}(n);if(0===r.length)return new Map;let i=new Map;for(let t of e){if(!t.rect||!te(t.type))continue;let n=function(e,t){let n=null,r=1/0;for(let i of t){let t=Math.abs(i.rect.width-e.width)+Math.abs(i.rect.height-e.height);if(t>32)continue;let a=4*t+(Math.abs(i.rect.x-e.x)+Math.abs(i.rect.y-e.y));a<r&&(n=i,r=a)}return n}(t.rect,r);if(!n)continue;let a=function(e,t){let n=function(e,t){let n=t,r=new Set;for(;!r.has(n.index);){var i,a;r.add(n.index);let o=e.filter(e=>e.parentIndex===n.index&&e.rect);if(1!==o.length)return n;let s=o[0];if(i=s.rect,a=t.rect,i.x!==a.x||i.y!==a.y||i.width!==a.width||i.height!==a.height)return n;n=s}return t}(e,t);return e.filter(e=>e.parentIndex===n.index&&e.rect).map(e=>e.rect).filter(e=>e.height>0).sort((e,t)=>e.y-t.y).map(e=>og(e,t.rect))}(e,t),o=function(e){let{viewportRect:t,visibleBlocks:n,nativeScrollView:r}=e;if(0===n.length||0===r.contentBlocks.length)return null;let i=function(e){if(0===e.contentBlocks.length)return null;let t=e.contentBlocks[0],n=e.contentBlocks[e.contentBlocks.length-1];if(!t||!n)return null;let r=oh(e.contentBlocks.map(e=>e.size))??e.rect.height,i=Math.max(48,Math.round(.5*r)),a=Math.max(24,Math.round(.25*r)),o=t.start>=i,s=e.contentExtent-(n.start+n.size)>=a;return o||s?{above:o,below:s}:null}(r),a=function(e,t){let n=new Map;for(let r of e)for(let e of t){if(!ow(r,e))continue;let t=r.start-e.start,i=8*Math.round(t/8),a=n.get(i)??[];a.push(t),n.set(i,a)}let r=null;for(let e of n.values())(!r||e.length>r.length)&&(r=e);if(!r||r.length<2)return null;let i=[...r].sort((e,t)=>e-t);return i[Math.floor(i.length/2)]??null}(r.contentBlocks,n)??function(e){let{nativeBlocks:t,visibleBlocks:n,viewportExtent:r,contentExtent:i}=e,a=[],o=[];for(let e of t)for(let t of n){if(!ow(e,t))continue;let n=e.start-t.start;16>=Math.abs(n)&&a.push(n),16>=Math.abs(n+r-i)&&o.push(n)}return o.length>0?oh(o):a.length>0?oh(a):null}({nativeBlocks:r.contentBlocks,visibleBlocks:n,viewportExtent:t.height,contentExtent:r.contentExtent});if(null===a)return i;let o=t.height;return{above:(i?.above??!1)||a>16,below:(i?.below??!1)||a+o<r.contentExtent-16}}({viewportRect:t.rect,visibleBlocks:a,nativeScrollView:n});if(!o)continue;let s={};o.above&&(s.hiddenContentAbove=!0),o.below&&(s.hiddenContentBelow=!0),(s.hiddenContentAbove||s.hiddenContentBelow)&&i.set(t.index,s)}return i}(t,a):new Map}function oO(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function oL(e){let t=new Map;for(let n of e){let e={};n.hiddenContentAbove&&(e.hiddenContentAbove=!0),n.hiddenContentBelow&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n.index,e)}return t}async function o$(e,t=ti(e)){try{return await ea(()=>oF(t),{shouldRetry:oG})}catch(t){var n,r;let e;if((n=t)instanceof F&&"COMMAND_FAILED"===n.code&&"number"==typeof n.details?.timeoutMs&&n.details?.cmd==="adb"&&(e=Array.isArray(r=n.details?.args)?r.map(String):"string"==typeof r?r.split(/\s+/):[]).includes("uiautomator")&&e.includes("dump")){let e="Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout. Stock Android UIAutomator may still time out on app-owned infinite animations.";throw new F("COMMAND_FAILED",`Android UI hierarchy dump timed out while waiting for the UI to become idle. ${e}`,{...t.details??{},hint:e},t)}throw t}}async function oF(e){var t,n;let r,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=oU(a.stdout,a.stderr);if(o)return o;let s="/sdcard/window_dump.xml",l=await e(["shell","uiautomator","dump",s],{allowFailure:!0,timeoutMs:8e3}),c=(t=l.stdout,n=l.stderr,r=`${t}
|
|
6
|
-
${
|
|
7
|
-
${t}`,r=n.indexOf("<?xml"),i=r>=0?r:n.indexOf("<hierarchy");if(i<0)return null;let a=n.lastIndexOf("</hierarchy>");if(a<0||a<i)return null;let o=n.slice(i,a+12).trim();return o.length>0?o:null}function oG(e){if(!(e instanceof F)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,n=("string"==typeof t?t:"").toLowerCase();return ov.some(e=>n.includes(e))}async function oq(e,t=ti(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),n=`${e.stdout}
|
|
8
|
-
${e.stderr}`.trim();return n.length>0?n:null}catch{return null}}function oj(e,t,n){if(0===e.size)return;let r=new Map;for(let[e,t]of n.sourceNodes.entries()){let i=n.nodes[e];i&&r.set(t,i)}for(let[n,i]of e){let e=t.sourceNodes[n];if(!e)continue;let a=r.get(e);a&&(i.hiddenContentAbove&&(a.hiddenContentAbove=!0),i.hiddenContentBelow&&(a.hiddenContentBelow=!0))}}let oV=/\bis(?:n(?:'|'|')?t| not)\s+responding\b/i,oB=/^close app$/i,oH="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function oK(e){let t,{session:n}=e;if("android"!==n.device.platform||!n.recording)return{status:"absent"};try{t=await oY(n)}catch(e){return E({level:"warn",phase:"android_blocking_dialog_inspection_failed",data:{session:n.name,deviceId:n.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"unknown",reason:"inspection-failed"}}let r=o0(t);if(!r?.rect)return{status:"absent"};try{let e=await oQ(n,r);if(!e.ok)return E({level:"warn",phase:"android_blocking_dialog_tap_failed",data:{session:n.name,deviceId:n.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:"failed",reason:"tap-failed"};if(!await o1(n))return E({level:"warn",phase:"android_blocking_dialog_still_present",data:{session:n.name,deviceId:n.device.id}}),{status:"failed",reason:"dismiss-failed"};if(n.appBundleId&&(await el(n.device,n.appBundleId),!await o2(n,n.appBundleId)))return E({level:"warn",phase:"android_blocking_dialog_relaunch_unfocused",data:{session:n.name,deviceId:n.device.id,appBundleId:n.appBundleId}}),{status:"failed",reason:"relaunch-failed"};return E({level:"warn",phase:"android_blocking_dialog_recovered",data:{session:n.name,deviceId:n.device.id,appBundleId:n.appBundleId,x:e.x,y:e.y}}),{status:"recovered"}}catch(e){return E({level:"warn",phase:"android_blocking_dialog_recovery_failed",data:{session:n.name,deviceId:n.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"failed",reason:"error"}}}async function oW(e){var t,n;let{session:r,command:i}=e;if("android"!==r.device.platform)return{status:"clear"};let a=await ei(r.device);if(!a)return{status:"clear"};if(t=r,n=a,t.appBundleId&&n.package===t.appBundleId){if(await oz(r)){let t=`Recovered Android app ANR before ${i}: closed and relaunched ${r.appBundleId}.`;if("before-command"===e.phase)return{status:"recovered",warning:t};throw oX({session:r,command:i,focus:a,message:`Android app ANR appeared after ${i}; ${r.appBundleId} was closed and relaunched. Retry the command against the fresh app session.`,hint:"Retry the command. If the ANR returns, inspect app logs or restart the emulator."})}throw oX({session:r,command:i,focus:a,message:`Android app ANR blocked ${i}: ${oZ(a)}. Automatic recovery failed.`,hint:oH})}throw oX({session:r,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${oZ(a)}.`,hint:oH})}async function oz(e){try{return await oJ(e)}catch(t){return E({level:"warn",phase:"android_app_anr_recovery_failed",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}async function oJ(e){if(!e.appBundleId)return!1;let t=o0(await oY(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let n=await oQ(e,t);if(!n.ok)return!1;await el(e.device,e.appBundleId);let r=await o2(e,e.appBundleId,{requireNoBlockingDialog:!0});return r&&E({level:"warn",phase:"android_app_anr_recovered",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:n.x,y:n.y}}),r}function oX(e){let{session:t,command:n,focus:r,message:i,hint:a}=e;return new F("COMMAND_FAILED",i,{command:n,expectedPackage:t.appBundleId,focusedPackage:r.package,focusedWindow:r.focusedWindow,rawFocus:r.raw,hint:a})}function oZ(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function oY(e){return e7(e1((await oS(e.device,{interactiveOnly:!1,compact:!1})).nodes))}async function oQ(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:n,y:r}=e9(t.rect),i=await en(e.device,["shell","input","tap",String(Math.round(n)),String(Math.round(r))],{allowFailure:!0});return 0!==i.exitCode?{ok:!1,exitCode:i.exitCode,stdout:i.stdout.trim(),stderr:i.stderr.trim()}:{ok:!0,x:n,y:r}}function o0(e,t={}){if(!1===t.requireDialogSignal||o5(e))return e.find(e=>o4(e).some(e=>oB.test(e))&&e.rect)}async function o1(e){for(let t=0;t<12;t+=1){if(!o5(await oY(e)))return!0;await ez(500)}return!o5(await oY(e))}async function o2(e,t,n={}){for(let r=0;r<12;r+=1){if(await o3(e,t,n))return!0;await ez(500)}return await o3(e,t,n)}async function o3(e,t,n){return!(n.requireNoBlockingDialog&&await ei(e.device))&&(await eh(e.device)).package===t}function o4(e){let t=[e.label,e.identifier];return"string"==typeof e.value&&e.value.trim().length>0&&t.push(e.value),t.filter(e=>"string"==typeof e&&e.trim().length>0).map(e=>e.trim())}function o5(e){return e.some(e=>{let t=o4(e).join(" ").trim();return t.length>0&&oV.test(t)})}function o8(e){return!!(e&&e.width>0&&e.height>0)}function o6(e){return e.width*e.height}function o9(e,t){return t.x>=e.x&&t.y>=e.y&&t.x+t.width<=e.x+e.width&&t.y+t.height<=e.y+e.height}let o7=[255,59,48,255],se=[255,214,10,255],st=[0,0,0,255],sn=["scroll","list","recyclerview","edittext","textfield"],sr=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],si={e:["01110","10000","11110","10000","10000","10001","01110"],0:["01110","10001","10011","10101","11001","10001","01110"],1:["00100","01100","00100","00100","00100","00100","01110"],2:["01110","10001","00001","00010","00100","01000","11111"],3:["11110","00001","00001","01110","00001","00001","11110"],4:["00010","00110","01010","10010","11111","00010","00010"],5:["11111","10000","10000","11110","00001","00001","11110"],6:["01110","10000","10000","11110","10001","10001","01110"],7:["11111","00001","00010","00100","01000","01000","01000"],8:["01110","10001","10001","01110","10001","10001","01110"],9:["01110","10001","10001","01111","00001","00001","01110"]};async function sa(e){let t=eT(await s.readFile(e.screenshotPath),"screenshot"),n=function(e,t,n,r={}){let i=function(e){let t=null;for(let n of e)sl(n)&&o8(n.rect)&&(!t||o6(n.rect)>o6(t))&&(t=n.rect);return t||function(e){let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)a.rect&&o8(a.rect)&&(t=Math.min(t,a.rect.x),n=Math.min(n,a.rect.y),r=Math.max(r,a.rect.x+a.rect.width),i=Math.max(i,a.rect.y+a.rect.height));return!Number.isFinite(t)||!Number.isFinite(n)||r<=t||i<=n?null:{x:t,y:n,width:r-t,height:i-n}}(e.filter(e=>{var t;return o8(e.rect)&&!("image"===e0((t=e).type??"")&&!sd(t.label))}))}(e.nodes),a=new Map;for(let r of e.nodes){var o,s;if(!function(e,t,n){let r=[n.label,n.value].some(su)||sp(n.identifier);return!!function(e,t,n){if("android"!==e.backend||!n.hittable||!o8(n.rect)||sl(n))return!1;let r=e0(n.type??"");return!(sn.some(e=>r.includes(e))||t&&o6(n.rect)>.25*o6(t))}(e,t,n)||(ss(n)?r:r&&function(e){let t=e0(e.type??"");return t.includes("statictext")||t.includes("image")||t.includes("text")||t.includes("other")}(n))}(e,i,r))continue;let l=(o=e.nodes,[function(e){return ss(e)&&!sl(e)}(s=r)?s:null,eQ(o,s,e=>(function(e){return ss(e)&&!sl(e)})(e)),s.hittable?s:null,eQ(o,s,e=>!0===e.hittable)].find(sc)??null);if(!l?.rect||!o8(l.rect))continue;let c=function(e,t,n){let r=sf(e);if(e.ref!==t.ref&&r)return r;let i=function(e,t){let n=null;for(let r of t){if(r.ref===e.ref||!function(e,t,n){let r=e;for(;void 0!==r.parentIndex;){let e=n[r.parentIndex];if(!e)break;if(e.ref===t.ref)return!0;r=e}return!1}(r,e,t))continue;let i=sf(r);if(!i)continue;let a=function(e){let t=0;return e0(e.type??"").includes("text")&&(t+=2),su(e.label)&&(t+=2),su(e.value)&&(t+=1),t}(r);(!n||a>n.score)&&(n={label:i,score:a})}return n?.label}(t,n);return i||sf(t)}(r,l,e.nodes),d=function(e,t,n){let r=0;return e.ref===t.ref&&(r+=4),t.hittable&&(r+=3),ss(t)&&(r+=3),ss(e)&&(r+=2),n&&(r+=2),sp(t.identifier)&&(r+=1),sd(t.value)&&(r+=1),r}(r,l,c),u=function(e,t,n){var r,i;return"android"!==e.backend?t.rect:(r=ss,i=e=>!!sf(e),(!t.rect||!0!==t.hittable||r(t)||i(t)?null:function(e,t,n){let r=e.rect,i=function(e,t,n){let r=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&function(e,t,n){let r=e;for(;void 0!==r.parentIndex;){let e=n.get(r.parentIndex);if(!e)break;if(e.ref===t.ref)return!0;r=e}return!1}(t,e,i)&&function(e,t){let n=e0(e.type??"");return n.includes("text")||n.includes("image")&&t(e)}(t,n)&&o8(t.rect)&&o9(r,t.rect)).map(e=>e.rect);return a.length<2?null:function(e){let t=e[0];if(void 0===t)throw Error("unionRects requires at least one rect");let n=t.x,r=t.y,i=t.x+t.width,a=t.y+t.height;for(let t of e.slice(1))n=Math.min(n,t.x),r=Math.min(r,t.y),i=Math.max(i,t.x+t.width),a=Math.max(a,t.y+t.height);return{x:n,y:r,width:i-n,height:a-r}}(a)}(e,t,n);if(!i)return null;let a=i.y-r.y,o=r.y+r.height-(i.y+i.height);if(a<0||o<0||16>Math.abs(o-a))return null;let s=Math.min(a,o),l=Math.round(i.y-s),c=Math.round(i.height+2*s);return c<=0||c>=r.height?null:{x:r.x,y:l,width:r.width,height:c}}(t,n,i))??t.rect)}(e,l,e.nodes),p=so(e,i,u,t,n);if(!o8(p))continue;let f=a.get(l.ref);(!f||d>f.score)&&a.set(l.ref,{ref:l.ref,label:c,rect:l.rect,overlayRect:p,score:d})}return function(e,t,n,r,i){let a=eN(e.nodes).primaryAction;if(!a?.ref||!a.rect||!o8(a.rect))return;let o=so(e,t,a.rect,r,i);if(!o8(o))return;let s={ref:a.ref,label:a.label,rect:a.rect,overlayRect:o,score:100},l=n.get(a.ref);n.set(a.ref,l?{...l,score:Math.max(l.score,s.score)}:s)}(e,i,a,t,n),(function(e){let t=[];for(let n of e.sort((e,t)=>o6(e.overlayRect)-o6(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===n.label&&(o9(e.overlayRect,n.overlayRect)||o9(n.overlayRect,e.overlayRect)));if(-1===e){t.push(n);continue}o6(n.overlayRect)<o6(t[e].overlayRect)&&(t[e]=n)}return t})([...a.values()]).sort(sS).slice(0,r.maxRefs??24).sort(sy).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:e9(e.overlayRect)}))}(e.snapshot,t.width,t.height,{maxRefs:e.maxRefs});for(let e of n){var r,i;(function(e,t,n){for(let r=0;r<2;r+=1)sw(e,t.x,t.x+t.width-1,t.y+r,n),sw(e,t.x,t.x+t.width-1,t.y+t.height-1-r,n),sg(e,t.x+r,t.y,t.y+t.height-1,n),sg(e,t.x+t.width-1-r,t.y,t.y+t.height-1,n)})(r=t,(i=e).overlayRect,o7),function(e,t,n){let r=6+5*n.length+ +Math.max(0,n.length-1),i=sh(t.x,0,Math.max(0,e.width-r)),a=t.y-11-2,o=a>=0?a:sh(t.y+2,0,Math.max(0,e.height-11));(function(e,t,n,r,i){for(let a=0;a<11;a+=1)for(let o=0;o<r;o+=1)sv(e,t+o,n+a,i)})(e,i,o,r,se),function(e,t,n,r,i){let a=t;for(let t of r.toLowerCase()){let r=si[t];if(r)for(let t=0;t<r.length;t+=1)for(let o=0;o<r[t].length;o+=1)"1"===r[t][o]&&sv(e,a+o,n+t,i);a+=6}}(e,i+3,o+2,n,st)}(r,i.overlayRect,i.ref)}return await s.writeFile(e.screenshotPath,eU.sync.write(t)),n}function so(e,t,n,r,i){if("android"===e.backend||!t)return sm(function(e){return{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}(n),r,i);let a=r/t.width,o=i/t.height;return sm({x:Math.round((n.x-t.x)*a),y:Math.round((n.y-t.y)*o),width:Math.max(1,Math.round(n.width*a)),height:Math.max(1,Math.round(n.height*o))},r,i)}function ss(e){let t=[e.type,e.role,e.subrole].map(e=>e0(e??"")).join(" ");return sr.some(e=>t.includes(e))}function sl(e){let t=[e.type,e.role,e.subrole].map(e=>e0(e??"")).join(" ");return t.includes("application")||t.includes("window")}function sc(e){return!!(e?.rect&&o8(e.rect)&&!sl(e))}function sd(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function su(e){var t;let n;return!!sd(e)&&(t=e,"toolbar"!==(n=t?.trim().toLowerCase())&&"window"!==n&&"application"!==n&&n?.startsWith("vertical scroll bar")!==!0)}function sp(e){var t;return"string"==typeof e&&!!su(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function sf(e){let t=[e.label,e.value].find(su);return t?t.trim():sp(e.identifier)?e.identifier.trim():void 0}function sm(e,t,n){let r=sh(e.x,0,Math.max(0,t-1)),i=sh(e.y,0,Math.max(0,n-1)),a=Math.max(1,t-r),o=Math.max(1,n-i);return{x:r,y:i,width:sh(e.width,1,a),height:sh(e.height,1,o)}}function sh(e,t,n){return Number.isFinite(e)?Math.max(t,Math.min(n,e)):t}function sw(e,t,n,r,i){for(let a=t;a<=n;a+=1)sv(e,a,r,i)}function sg(e,t,n,r,i){for(let a=n;a<=r;a+=1)sv(e,t,a,i)}function sv(e,t,n,r){if(t<0||n<0||t>=e.width||n>=e.height)return;let i=(e.width*n+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}function sy(e,t){var n,r;let i=e.overlayRect.y-t.overlayRect.y;if(0!==i)return i;let a=e.overlayRect.x-t.overlayRect.x;return 0!==a?a:(n=e.ref,r=t.ref,Number.parseInt(n.replace(/^\D+/,""),10)-Number.parseInt(r.replace(/^\D+/,""),10))}function sS(e,t){return t.score!==e.score?t.score-e.score:sy(e,t)}function s_(e){return"number"==typeof e.gestureClockOriginAtMs&&"number"==typeof e.gestureClockOriginUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureClockOriginAtMs+(e.gestureStartUptimeMs-e.gestureClockOriginUptimeMs)-e.recordingStartedAt):"number"==typeof e.runnerStartedAtUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureStartUptimeMs-e.runnerStartedAtUptimeMs):"number"==typeof e.gestureStartUptimeMs&&"number"==typeof e.gestureEndUptimeMs?Math.max(0,e.fallbackFinishedAtMs-(e.gestureEndUptimeMs-e.gestureStartUptimeMs)-e.recordingStartedAt):Math.max(0,e.fallbackStartedAtMs-e.recordingStartedAt)}let sI=new WeakMap;function sb(e){if(!e)return;let t=sI.get(e);if(t)return t;let n=sA(e.nodes??[]);if(n)return sI.set(e,n),n}let sA=eV,sx={referenceWidth:1e3,referenceHeight:1e3};function sN(e,t,n,r,i={},a=Date.now(),o=Date.now()){var s,l,c,d,u,p,f,m,h;let w,g,v,y=e.recording;if(!y)return;let S={...i,...r??{}},_=sT(S.effectiveDurationMs)??sT(S.durationMs),I={recordingStartedAt:y.startedAt,gestureClockOriginAtMs:y.gestureClockOriginAtMs,gestureClockOriginUptimeMs:y.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===y.platform?y.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:sT(S.gestureStartUptimeMs),gestureEndUptimeMs:sT(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},b="number"==typeof(s={gestureStartUptimeMs:sT(S.gestureStartUptimeMs),gestureEndUptimeMs:sT(S.gestureEndUptimeMs),reportedDurationMs:_,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}).gestureStartUptimeMs&&"number"==typeof s.gestureEndUptimeMs?Math.max(0,s.gestureEndUptimeMs-s.gestureStartUptimeMs):"number"==typeof s.reportedDurationMs?Math.max(0,s.reportedDurationMs):Math.max(0,s.fallbackFinishedAtMs-s.fallbackStartedAtMs),A="ios"===e.device.platform&&void 0===sT(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sO(sT(t.count),1)??1,n=!0===t.doubleTap,r=sO(sT(t.holdMs),1);return 1===e&&!n&&void 0===r}case"react-native":return"dismiss-overlay"===t.action;default:return!1}}(t,S)?function(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return s_(e);let n=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-n-e.recordingStartedAt)}({...I,gestureDurationMs:b}):s_(I),x=(l=e.snapshot,w=sT((c=S).referenceWidth),g=sT(c.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:sb(l)),N=(d=t,u=n,p=S,f=A,m=b,h=x,v=sM[d],v?.(u,p,f,m,h)??[]);0!==N.length&&(y.gestureEvents.push(...N),E({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:N.length,tMs:A,gestureDurationMs:b,kinds:N.map(e=>e.kind)}}))}let sM={click:(e,t,n,r,i)=>sE(e,t,n,i),press:(e,t,n,r,i)=>sE(e,t,n,i),"react-native":(e,t,n,r,i)=>"dismiss-overlay"===e[0]?sE(e,t,n,i):[],fill:(e,t,n,r,i)=>sD(e,t,n,i),focus:(e,t,n,r,i)=>sD(e,t,n,i),longpress:function(e,t,n,r,i){let a=sL(t,e);if(!a)return[];let{x:o,y:s}=a;return[sC(n,o,s,sU(r,[sT(t.durationMs),sT(e[2])],800),i)]},scroll:function(e,t,n,r,i){let a=s$(t,e),o=sR(t.contentDirection)??sR(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:c,y2:d}=a,u=sU(r,[],250),p=sT(t.amount)??sT(e[1]),f=sT(t.pixels);return[{kind:"scroll",tMs:n,x:s,y:l,x2:c,y2:d,...i,durationMs:u,contentDirection:o,...void 0!==p?{amount:p}:{},...void 0!==f?{pixels:f}:{}}]},pan:sk,fling:sk,swipe:sk,pinch:function(e,t,n,r,i){let a=sL(t,e,1),o=sT(t.scale)??sT(e[0]);if(!a||void 0===o||o<=0)return[];let{x:s,y:l}=a;return[{kind:"pinch",tMs:n,x:s,y:l,...i,scale:o,durationMs:sU(r,[],280)}]}};function sE(e,t,n,r){let i=sL(t,e);if(!i)return[];let{x:a,y:o}=i,s=sO(sT(t.count),1)??1,l=sO(sT(t.intervalMs),0)??0,c=!0===t.doubleTap,d=sO(sT(t.holdMs),1),u=[];for(let e=0;e<s;e+=1){let t=n+e*l;if(void 0!==d&&d>0){u.push(sC(t,a,o,d,r));continue}u.push(sP(t,a,o,r)),c&&u.push(sP(t+90,a,o,r))}return u}function sD(e,t,n,r){let i=sL(t,e);if(!i)return[];let{x:a,y:o}=i;return[sP(n,a,o,r)]}function sk(e,t,n,r,i){let a=s$(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:c}=a,d=sU(r,[sT(t.effectiveDurationMs),sT(t.durationMs),sT(e[4])],250),u=sO(sT(t.count),1)??1,p=sO(sT(t.pauseMs),0)??0,f="ping-pong"===t.pattern?"ping-pong":"one-way";return Array.from({length:u},(e,t)=>{var r,a,u,m,h,w,g,v,y,S,_,I,b;let A,{startX:x,startY:N,endX:M,endY:E}=(r=t,a=f,u=o,m=s,h=l,w=c,"ping-pong"===a&&r%2==1?{startX:h,startY:w,endX:u,endY:m}:{startX:u,startY:m,endX:h,endY:w});return g=n+t*(d+p),v=x,y=N,S=M,_=E,I=d,"back-swipe"===(A=function(e,t,n,r,i){if(!i||Math.abs(n-e)<=1.25*Math.abs(r-t))return"swipe";let a=.08*i.referenceWidth;return e<=a&&n>e||e>=i.referenceWidth-a&&n<e?"back-swipe":"swipe"}(v,y,S,_,b=i))?{kind:A,tMs:g,x:v,y,x2:S,y2:_,...b,durationMs:I,edge:function(e,t,n){if(n){let t=.08*n.referenceWidth;if(e<=t)return"left";if(e>=n.referenceWidth-t)return"right"}return t>=e?"left":"right"}(v,S,b)}:{kind:A,tMs:g,x:v,y,x2:S,y2:_,...b,durationMs:I}})}function sP(e,t,n,r){return{kind:"tap",tMs:e,x:t,y:n,...r}}function sC(e,t,n,r,i){return{kind:"longpress",tMs:e,x:t,y:n,...i,durationMs:r}}function sR(e){if("string"!=typeof e)return;let t=e.trim().toLowerCase();switch(t){case"up":case"down":case"left":case"right":return t;default:return}}function sT(e){if("number"==typeof e&&Number.isFinite(e))return e;if("string"!=typeof e||0===e.trim().length)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function sO(e,t){if(void 0===e)return;let n=Math.floor(e);return n>=t?n:void 0}function sL(e,t,n=0){let r=sT(e.x)??sT(t[n]),i=sT(e.y)??sT(t[n+1]);if(void 0!==r&&void 0!==i)return{x:r,y:i}}function s$(e,t){let n=sF(e.x1,e.x,t[0]),r=sF(e.y1,e.y,t[1]),i=sF(e.x2,t[2]),a=sF(e.y2,t[3]);if(void 0!==n&&void 0!==r&&void 0!==i&&void 0!==a)return{x1:n,y1:r,x2:i,y2:a}}function sF(...e){return e.map(sT).find(e=>void 0!==e)}function sU(e,t,n){return sO(e,1)??t.map(e=>sO(e,1)).find(e=>void 0!==e)??n}let sG={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sq(e){var t,n,r,i,a,o,s;let l,c,d,u,p,{req:f,session:m,logPath:h,sessionStore:w,contextFromFlags:g}=e,v=function(e){if("pan"===e.command||"fling"===e.command||"rotate-gesture"===e.command||"transform-gesture"===e.command)return{ok:!1,message:"Use gesture pan, gesture fling, gesture swipe, gesture rotate, or gesture transform."};if("gesture"!==e.command)return{ok:!0,platformCommand:e.command,dispatchRequest:e,recordedCommand:e.command};let[t,...n]=e.positionals??[],r=t?sG[t]:void 0;return r?{ok:!0,platformCommand:r,dispatchRequest:{...e,command:r,positionals:n},recordedCommand:e.command}:{ok:!1,message:eb}}(f);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:y,dispatchRequest:S,recordedCommand:_}=v,I=await sV(m,y);if(I)return I;let b=await sj(m,y);if("response"in b)return b.response;let{resolvedPositionals:A,resolvedOut:x,recordedPositionals:N,recordedFlags:M}="screenshot"===(t=S).command?(c=(r=(n=t).positionals??[],i=n.meta?.cwd,(l=r[0])?[tQ.expandHome(l,i),...r.slice(1)]:r),u=(d=(a=n.flags?.out,o=n.meta?.cwd,a?tQ.expandHome(a,o):a))?{...n.flags??{},out:d}:n.flags??{},{resolvedPositionals:c,resolvedOut:d,recordedPositionals:c,recordedFlags:u}):{resolvedPositionals:p=(s=t).positionals??[],resolvedOut:s.flags?.out,recordedPositionals:p,recordedFlags:s.flags??{}},E=Date.now(),D={...g(f.flags,m.appBundleId,m.trace?.outPath),surface:m.surface},k=await sB({session:m,sessionName:e.sessionName,logPath:h,command:y,request:S,positionals:A,out:x,dispatchContext:D}),P=await sj(m,y,"after-command");if("response"in P)return P.response;"status"in b&&"recovered"===b.status&&(!k||"object"==typeof k)&&((k??={}).warning=b.warning);let C=Date.now(),R=_===y?N:f.positionals??[],T=_===y?M:f.flags??{};return function(e){let{session:t,sessionStore:n,command:r,recordedCommand:i,resolvedPositionals:a,recordedPositionals:o,recordedFlags:s,data:l,actionStartedAt:c,actionFinishedAt:d,flags:u}=e,p=function(e,t,n,r){if("scroll"!==t)return r;let i=sb(e.snapshot),a={...r??{}},o=sR(a.direction)??sR(n[0]);if(!o)return r;let s=sT(a.amount)??sT(n[1]),l=sT(a.pixels),c=s$(a,[]),d=sT(a.referenceWidth),u=sT(a.referenceHeight),p=void 0!==d&&d>0&&void 0!==u&&u>0?{referenceWidth:d,referenceHeight:u}:i??sx;if(c&&(c.x1!==c.x2||c.y1!==c.y2))return{...a,x1:c.x1,y1:c.y1,x2:c.x2,y2:c.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==l?{pixels:l}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250};let f=eK({direction:o,amount:s,pixels:l,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:f.x1,y1:f.y1,x2:f.x2,y2:f.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==f.pixels?{pixels:f.pixels}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250}}(t,r,a,l);sN(t,r,a,p,u,c,d),n.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:y,recordedCommand:_,resolvedPositionals:A,recordedPositionals:R,recordedFlags:T,data:k,actionStartedAt:E,actionFinishedAt:C,flags:f.flags??{}}),a_(y)&&av(m,y),aC(m,y,A,f.flags),{ok:!0,data:k??{}}}async function sj(e,t,n="before-command"){if("android"!==e.device.platform||rf(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await oW({session:e,command:t,phase:n})}catch(e){return{response:{ok:!1,error:$(e)}}}}async function sV(e,t){if(!i_(t,e.device)){var n;let r=(n=e.device,iS[t]?.unsupportedHint?.(n));return{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:`${t} is not supported on this device`,...r?{hint:r}:{}}}}return"android"===e.device.platform&&e.recording&&"record"!==t&&"failed"===(await oK({session:e})).status?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function sB(e){var t;let{session:n,command:r,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==r)return await r9(n.device,r,a,o,{...s});let l=await of({session:n,sessionName:e.sessionName,outPath:a[0]??o,outputPlacement:"screenshot"!==(t=i).command?"default":(t.positionals??[])[0]?"positional":t.flags?.out?"out":"default",dispatchContext:s});return i.flags?.overlayRefs&&"string"==typeof l?.path&&await sH(n,l,e.logPath),l}async function sH(e,t,n){let r={snapshotInteractiveOnly:!0,snapshotCompact:!0},i=oo(await a9({device:e.device,session:e,flags:r,logPath:n,snapshotScope:void 0}),r);ou(e,i);let a=await sa({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let sK=s6(()=>import("./lease.js")),sW=s6(()=>import("./session.js").then(e=>e.session_namespaceObject)),sz=s6(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),sJ=s6(()=>import("./react-native.js")),sX=s6(()=>import("./record-trace.js")),sZ=s6(()=>import("./find.js")),sY=s6(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function sQ(e){var t;switch(t=e.req.command,rf(t)?.route??"generic"){case"lease":return await s0(e);case"session":return await s1(e);case"snapshot":return await s2(e);case"reactNative":return await s3(e);case"recordTrace":return await s4(e);case"find":return await s5(e);case"interaction":return await s8(e);case"generic":return null}}async function s0(e){let{handleLeaseCommands:t}=await sK();return s9(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function s1(e){let{handleSessionCommands:t}=await sW();return s9(e.req.command,"session",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke,invokeReplayAction:e.invokeReplayAction,androidAdbExecutor:e.androidAdbExecutor}))}async function s2(e){let{handleSnapshotCommands:t}=await sz();return s9(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function s3(e){let{handleReactNativeCommands:t}=await sJ();return s9(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function s4(e){let{handleRecordTraceCommands:t}=await sX();return s9(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function s5(e){let{handleFindCommands:t}=await sZ();return s9(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function s8(e){let{handleInteractionCommands:t}=await sY();return s9(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function s6(e){let t;return()=>t??=e()}function s9(e,t,n){if(n)return n;throw new F("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let s7=new h;async function le(e,t,n){let r=s7.getStore()??[];if(r.some(n=>n.locks===e&&n.key===t))return await n();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>s7.run([...r,{locks:e,key:t}],n));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function lt(e){let t=e.device.platform,n=e.device.name.trim(),r=e.device.id;return`${t} device "${n}" (${r})`}function ln(e,t){var n,r,i,a;let o,s,l,c,d,u;return e.recording?(n=e,r=t,o=Z(n.name),s=`agent-device close --session ${o}`,l=`agent-device record stop --session ${o}`,c="selector-conflict"===r?`To keep using this device, rerun the command with --session ${o} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${o} for commands that should attach to the recording session.`,`Recording session "${n.name}" owns this device. Run ${l}; if the session still appears in agent-device session list, run ${s}. ${c} Run agent-device session list to inspect active sessions.`):(i=e,a=t,d=Z(i.name),u=`agent-device close --session ${d}`,"selector-conflict"===a?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${d} and remove conflicting device selectors. To switch devices, first run ${u}, then open the desired device with a different --session name.`:`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${d}. To open a new session on this device, first run ${u}.`)}function lr(e,t){if(!t)return[];let n=[],r=e.device,i=nJ(t.platform);if(i&&!nZ(r.platform,i)&&n.push({key:"platform",value:t.platform}),t.target&&t.target!==(r.target??"mobile")&&n.push({key:"target",value:t.target}),t.udid&&("ios"!==r.platform||t.udid!==r.id)&&n.push({key:"udid",value:t.udid}),t.serial&&("android"!==r.platform||t.serial!==r.id)&&n.push({key:"serial",value:t.serial}),t.device&&t.device.trim().toLowerCase()!==r.name.trim().toLowerCase()&&n.push({key:"device",value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=r.simulatorSetPath?.trim();("ios"!==r.platform||"simulator"!==r.kind||e!==i)&&n.push({key:"iosSimulatorDeviceSet",value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=ef(t.androidDeviceAllowlist);"android"===r.platform&&e.has(r.id)||n.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return n}function li(e){return`${function(e){switch(e){case"iosSimulatorDeviceSet":return"--ios-simulator-device-set";case"androidDeviceAllowlist":return"--android-device-allowlist";default:return`--${e}`}}(e.key)}=${e.value}`}let la="default";function lo(e){return e.session||la}function ls(e){if(e.meta?.sessionExplicit===!0||(e.session||la)!==la||e.meta?.sessionIsolation==="tenant"||e.flags?.sessionIsolation==="tenant")return;let t=function(e){if(!e||0===e.trim().length)return;let t=function(e){let t=i.resolve(e);try{return a.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(a.existsSync(i.join(t,".git")))return t;let e=i.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(t){var r;return{kind:"cwd",id:(r=t,n.createHash("sha256").update(r).digest("hex").slice(0,16))}}}function ll(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function lc(e,t){let n=ls(e);return!!n&&!!t.sessionScope&&!ll(t,n)}function ld(e){return{tenantId:e.meta?.tenantId??e.flags?.tenant,runId:e.meta?.runId??e.flags?.runId,leaseId:e.meta?.leaseId??e.flags?.leaseId,leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend}}function lu(e,t){var n,r,i,a,o,s,l,c,d,u,p;let f,m,h,w=e.meta?.lockPolicy;if(!w)return e;let g={...e.flags??{}},v=(n=e.command,rf(n)?.lockPolicySelectorOverride===!0),y=v?[]:t?lr(t,g):(r=g,i=e.meta?.lockPlatform,f=[],m=nJ(i),void 0!==r.platform&&m&&(a=nJ(r.platform),o=m,a&&o&&a!==o&&("apple"===a?!nX(o):"apple"!==o||!nX(a)))&&f.push({key:"platform",value:r.platform}),m&&(s=f,l=r,c=m,(h=l.target)&&function(e,t){switch(t){case"android":case"ios":return"desktop"===e;case"macos":case"linux":return"desktop"!==e;case"apple":return!1;default:return lf(t)}}(h,c)&&s.push({key:"target",value:h}),function(e,t,n){for(let r of function(e,t){switch(e){case"android":return["udid","iosSimulatorDeviceSet"];case"ios":return["serial","androidDeviceAllowlist"];case"apple":var n;return"desktop"===(n=t).target||"macos"===nJ(n.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return lf(e)}}(n,t)){let n=t[r];ro(n)&&e.push({key:r,value:n})}}(f,r,m)),f),S=e.meta?.lockPlatform;if(0===y.length){return d=v,u=t,p=g,!S||u||void 0!==p.platform||d&&rs(p,ra)||(g.platform=S),{...e,flags:g}}if("strip"===w)return function(e,t,n,r){if(r){lp(e,t),e.platform=r.device.platform;return}lp(e,t),n&&void 0===e.platform&&(e.platform=n)}(g,y,S,t),{...e,flags:g};throw new F("INVALID_ARGS",function(e,t,n){let r=t.map(li).join(", ");if(n)return`${e.command} is already bound to session "${n.name}" on ${lt(n)}, but this request selected ${r}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:"";return`${e.command} is using a bound-session lock${a}, but this request selected ${r}.`}(e,y,t),{session:e.session,conflicts:y.map(li),hint:function(e,t){if(t)return ln(t,"selector-conflict");let n=e.meta?.lockPlatform,r=e.session?` --session ${Z(e.session)}`:"";return"Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. "+(n?`Run agent-device open <app>${r} --platform ${n} first if no session is active. `:`Run agent-device open <app>${r} first if no session is active. `)+"Run agent-device session list to inspect active sessions."}(e,t)})}function lp(e,t){for(let n of t)delete e[n.key]}function lf(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function lm(e){var t,n;let{req:r,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[lh(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return lu(e)}catch{return e}}(r);if("open"===(n=l).command||rs(n.flags,ri))try{let e=await n8(l.flags??{});s.add(lh(e.id))}catch{}return Array.from(s).sort((e,t)=>{let n=lw(e)-lw(t);return 0!==n?n:e.localeCompare(t)})}function lh(e){return`device:${e}`}function lw(e){return+!e.startsWith("session:")}function lg(e,t={}){let n=er(t.simulatorSetPath);return n?["simctl","--set",n,...e]:["simctl",...e]}function lv(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:lg(t,{simulatorSetPath:e.simulatorSetPath})}function ly(e,t,n){return iO(lv(e,t),n)}let lS="If runner build products look stale or corrupted, run `pnpm clean:xcuitest` in a local checkout, or remove ~/.agent-device/ios-runner/derived, then retry.";function l_(e){if(!(e instanceof F)||"COMMAND_FAILED"!==e.code)return!1;let t=`${e.message??""}`.toLowerCase();return!(t.includes("xcodebuild exited early")||t.includes("device is busy")&&t.includes("connecting"))&&!!(t.includes("runner did not accept connection")||t.includes("fetch failed")||t.includes("econnrefused")||t.includes("socket hang up"))}function lI(e){return!(e instanceof F)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lb(e){let{port:t,endpoints:n,logPath:r,lastError:i}=e,a="Runner did not accept connection";return new F("COMMAND_FAILED",a,{port:t,endpoints:n,logPath:r,lastError:i?String(i):void 0,reason:ec({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:eu("IOS_RUNNER_CONNECT_TIMEOUT")})}async function lA(e){var t,n;let r,{session:i,port:a,logPath:o}=e,s=await i.testPromise,l="Runner did not accept connection (xcodebuild exited early)",c=ec({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new F("COMMAND_FAILED",l,{port:a,logPath:o,xcodebuild:{exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr},reason:c,hint:(t=s.stdout,n=s.stderr,(r=`${l}
|
|
1
|
+
let e;import{__webpack_require__ as t}from"./rslib-runtime.js";import r,{createHash as n}from"node:crypto";import i from"node:path";import a,{existsSync as o,promises as s}from"node:fs";import l from"node:http";import{fileURLToPath as d,pathToFileURL as c}from"node:url";import"node:https";import u from"node:os";import{once as p}from"node:events";import{Transform as f}from"node:stream";import{pipeline as m}from"node:stream/promises";import{AsyncLocalStorage as h}from"node:async_hooks";import w from"node:fs/promises";import g from"node:net";import{setTimeout as y}from"node:timers/promises";import{resolveUserPath as v}from"./3267.js";import{SCREENSHOT_ACTION_FLAG_KEYS as S,SCROLL_DIRECTIONS as I,parseScrollDirection as A,isStringMember as _,isReactNativeCollapsedWarningWrapperWithVisibleBanner as b,deriveMobileSnapshotHiddenContentHints as x,resolveClickButton as M,inferVerticalScrollIndicatorDirections as N,withSuccessText as D,runScrollEdgePasses as k,splitNonEmptyTrimmedLines as P,annotateCoveredSnapshotNodes as E,parseSwipePreset as C,analyzeReactNativeOverlay as R,readLocationCoordinate as O,getClickButtonValidationError as T,areRectsApproximatelyEqual as L,isSystemScrollIndicatorLabel as $,formatScrollEdgeMessage as F,SWIPE_PATTERNS as U,successText as G,screenshotOptionsFromFlags as q,captureScrollEdgeState as j,normalizeSnapshotTree as V,isReactNativeCollapsedWarningWrapperCandidate as B,screenshotFlagsFromOptions as H,snapshotCaptureAnnotationsFrom as K,parseStringMember as W,requireIntInRange as z,inferGestureReferenceFrame as X,parseDeviceRotation as J,buildScrollGesturePlan as Z,buildSwipePresetGesturePlan as Y}from"./6133.js";import{withDiagnosticsScope as Q,getDiagnosticsMeta as ee,flushDiagnosticsToSessionFile as et,withDiagnosticTimer as er,updateDiagnosticsScope as en,emitDiagnostic as ei}from"./7599.js";import{formatScriptStringLiteral as ea,terminatePngWorker as eo,prewarmPngWorker as es,formatPortableActionLine as el,formatScriptArg as ed,isKeyboardAction as ec,encodePngAsync as eu,createAgentDevice as ep,localCommandPolicy as ef,isTouchTargetCommand as em,appendScriptSeriesFlags as eh,decodePngAsync as ew,isClickLikeCommand as eg,findMistargetedTypeRefToken as ey}from"./123.js";import{readProcessStartTime as ev,readProcessCommand as eS,resolveRuntimeTransportHints as eI,isProcessGroupAlive as eA,isAgentDeviceDaemonProcess as e_,isProcessAlive as eb}from"./8656.js";import{toAppErrorCode as ex,asAppError as eM,normalizeError as eN,AppError as eD}from"./9152.js";import{runCmdBackground as ek,runCmdStreaming as eP,runCmd as eE,runCmdSync as eC,resolveExecutableOverridePath as eR,whichCmd as eO}from"./9818.js";import{consumeTextLines as eT,serializeDaemonResponseEnvelope as eL,normalizeTenantId as e$,shouldStreamRequestProgress as eF,resolveDaemonPaths as eU,resolveSessionIsolationMode as eG,shellQuoteIfNeeded as eq,resolveDaemonServerMode as ej,resolveDaemonCodeSignature as eV,serializeDaemonProgressEnvelope as eB,serializeDaemonRpcResponseEnvelope as eH}from"./9238.js";import{sleep as eK}from"./4829.js";import{resolveAppleSimulatorSetPathForSelector as eW,normalizeRef as ez,resolveApplePlatformName as eX,matchesPlatformSelector as eJ,snapshotPresentationOptionsFromFlags as eZ,isApplePlatform as eY,findNodeByRef as eQ,normalizePlatformSelector as e0,resolveDevice as e1,buildSnapshotPresentationKey as e2,centerOfRect as e3,attachRefs as e5}from"./9616.js";import{runAndroidAdb as e4,resolveIosSimulatorDeviceSetPath as e8,getAndroidBlockingDialogFocus as e6,withRetry as e9,Deadline as e7,isEnvTruthy as te,openAndroidApp as tt,classifyBootFailure as tr,streamAndroidLogcatWithAdb as tn,bootFailureHint as ti,androidDeviceForSerial as ta,parseSerialAllowlist as to,retryWithPolicy as ts,getAndroidAppState as tl,classifyAndroidAppTarget as td,captureAndroidLogcatWithAdb as tc,resolveAndroidSerialAllowlist as tu,isDeepLinkTarget as tp,formatAndroidInstalledPackageRequiredMessage as tf}from"./8806.js";import{PUBLIC_COMMANDS as tm,INTERNAL_COMMANDS as th,GESTURE_SUBCOMMAND_ERROR as tw}from"./6088.js";import{findNearestAncestor as tg,normalizeType as ty,pruneGroupNodes as tv,findNodeByLabel as tS,resolveRefLabel as tI}from"./7847.js";import{isScrollableType as tA}from"./4778.js";import{readVersion as t_,findProjectRoot as tb}from"./9671.js";import{resolveAndroidAdbProvider as tx,resolveAndroidAdbExecutor as tM}from"./9639.js";import{parseUiHierarchy as tN,ensureAndroidSnapshotHelper as tD,parseUiHierarchyTree as tk,captureAndroidSnapshotWithHelper as tP,captureAndroidSnapshotWithHelperSession as tE,parseAndroidSnapshotHelperManifest as tC,forgetAndroidSnapshotHelperInstall as tR,buildUiHierarchySnapshot as tO,stopAndroidSnapshotHelperSession as tT}from"./221.js";import{applyCommandDefaults as tL}from"./1352.js";var t$,tF,tU={};t.r(tU),t.d(tU,{IH:()=>pp,ug:()=>pf,sE:()=>pn,Bx:()=>pa,hQ:()=>pi,WX:()=>pu,Co:()=>ps,wg:()=>pc,withAppLogProvider:()=>pe});var tG={};t.r(tG),t.d(tG,{IO:()=>i2,LB:()=>i1,xY:()=>i5,eN:()=>i3,runMacOsPressAction:()=>i6,runMacOsReadTextAction:()=>i8,rR:()=>i9,r5:()=>i4});var tq={};t.r(tq),t.d(tq,{bu:()=>dk,abortAllIosRunnerSessions:()=>cJ,hv:()=>cK,Nr:()=>uA,gE:()=>uI,FS:()=>dN,runIosRunnerCommand:()=>uS,stopAllIosRunnerSessions:()=>cZ,yA:()=>cX});var tj={};t.r(tj),t.d(tj,{v:()=>c7,M:()=>ue,withAppleRunnerProvider:()=>ut});var tV={};t.r(tV),t.d(tV,{ensureBootedSimulator:()=>mF,SA:()=>mG,EB:()=>mL,N3:()=>mU});var tB={};t.r(tB),t.d(tB,{qx:()=>iL,Ly:()=>iU,Gr:()=>iO,vT:()=>i$,Cc:()=>iF,withAppleToolProvider:()=>iT});var tH={};t.r(tH),t.d(tH,{readLinuxTextAtPoint:()=>ay,r:()=>ag});var tK={};function tW(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}t.r(tK),t.d(tK,{uK:()=>ar,nE:()=>ai,withLinuxToolProvider:()=>an});let tz=["platform","device","udid","serial","out","verbose","metroHost","metroPort","bundleUrl","launchUrl","snapshotInteractiveOnly","snapshotDepth","snapshotScope","snapshotRaw",...S,"relaunch","saveScript","noRecord","fps","quality","hideTouches","count","intervalMs","delayMs","holdMs","jitterPx","doubleTap","clickButton","pauseMs","pattern"];function tX(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 tJ(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}class tZ{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let r=i.dirname(t);a.existsSync(r)||a.mkdirSync(r,{recursive:!0});let n=function(e){var t=e,r=function(e){let t=[];for(let r of e.actions){if("snapshot"===r.command)continue;let n=function(e){let t=function(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>"string"==typeof e)?e.result.selectorChain:[];return t.length>0?t.join(" || "):void 0}(e);if(t&&tY(e.command))return eg(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=tX(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(!tY(t.command))return;let r=t.result?.refLabel;if("string"!=typeof r||0===r.trim().length)return;let n=r.trim();return{ts:t.ts,command:"snapshot",positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotScope:n},result:{scope:n}}}(e,r);i&&t.push(i),t.push(r)}return t}(e);let n=[],i=t.device.kind?` kind=${t.device.kind}`:"";for(let e of(n.push(`context platform=${t.device.platform} device=${ea(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,eg(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(ed(r)),tQ(e,t),eh(e,t),e.join(" ");if(1===t.positionals.length)return e.push(ed(r)),eh(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(ed(r)),tQ(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(ed(n)),eh(e,t),e.join(" ")}(t,r):"get"===r.command?function(e,t){let r=t.positionals?.[0],n=t.positionals?.[1];if(r&&n)return e.push(ed(r)),e.push(ed(n)),n.startsWith("@")&&tQ(e,t),e.join(" ")}(t,r):void 0);return n||el(e)}(e));return`${n.join("\n")}
|
|
2
|
+
`}(e);return a.writeFileSync(t,n),{written:!0,path:t}}catch(r){return ei({level:"warn",phase:"session_script_write_failed",data:{session:e.name,path:t,error:r instanceof Error?r.message:String(r)}}),{written:!1}}}resolveScriptPath(e){if(e.saveScriptPath)return v(e.saveScriptPath,{cwd:void 0});a.existsSync(this.sessionsDir)||a.mkdirSync(this.sessionsDir,{recursive:!0});let t=tW(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${r}.ad`)}}function tY(e){return em(e)||"fill"===e||"get"===e}function tQ(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(ed(r))}class t0{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new tZ(e)}get(e){return this.sessions.get(e)}set(e,t){this.sessions.set(e,t)}delete(e){return this.runtimeHints.delete(e),this.sessions.delete(e)}values(){return this.sessions.values()}toArray(){return Array.from(this.sessions.values())}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){this.runtimeHints.set(e,t)}clearRuntimeHints(e){return this.runtimeHints.delete(e)}recordAction(e,t){t.flags?.noRecord||(t.flags?.saveScript&&(e.recordSession=!0,"string"==typeof t.flags.saveScript&&(e.saveScriptPath=v(t.flags.saveScript,{cwd:void 0}))),e.actions.push({ts:Date.now(),command:t.command,positionals:t.positionals,runtime:t.runtime,flags:function(e){if(!e)return{};let t={};for(let r of tz)void 0!==e[r]&&(t[r]=e[r]);return t}(t.flags),result:t.result}),ei({level:"debug",phase:"record_action",data:{command:t.command,session:e.name}}))}writeSessionLog(e){let t=this.scriptWriter.write(e);t.written&&ei({level:"info",phase:"session_script_written",data:{session:e.name,path:t.path}})}defaultTracePath(e){let t=tW(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return i.join(this.sessionsDir,tW(e))}ensureSessionDir(e){let t=this.resolveSessionDir(e);return a.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return i.join(this.resolveSessionDir(e),"app.log")}resolveAppLogPidPath(e){return i.join(this.resolveSessionDir(e),"app-log.pid")}static expandHome(e,t){return v(e,{cwd:t})}}function t1(e){return i.join(e,"runner.log")}function t2(e,t){let r=tW(t&&t.length>0?t:"unknown");return i.join(e,"requests",`${r}.ndjson`)}let t3="app-log.pid";function t5(e){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t))return{pid:Number.parseInt(t,10)};try{let e=JSON.parse(t);if(!Number.isInteger(e.pid)||e.pid<=0)return null;return e}catch{return null}}function t4(e,t){if(!e)return;let r=i.dirname(e);a.existsSync(r)||a.mkdirSync(r,{recursive:!0});let n={pid:t,startTime:ev(t)??void 0,command:eS(t)??void 0};a.writeFileSync(e,`${JSON.stringify(n)}
|
|
3
|
+
`)}function t8(e){if(e&&a.existsSync(e))try{a.unlinkSync(e)}catch{}}function t6(e,t){let n=r.createHash("sha256").update(e).digest(),i=r.createHash("sha256").update(t).digest();return r.timingSafeEqual(n,i)}let t9=new Set,t7=new Map,re="request_canceled",rt="request canceled";function rr(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 rn(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++}}(t7);let t=new AbortController;t7.set(e,t),t9.has(e)&&t.abort()}function ri(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++}}(t9),t9.add(e),t7.get(e)?.abort())}function ra(e){e&&(t9.delete(e),t7.delete(e))}function ro(e){return!!e&&t9.has(e)}function rs(e){if(e)return t7.get(e)?.signal}function rl(){return new eD("COMMAND_FAILED",rt,{reason:re})}function rd(e){if(ro(e))throw rl()}function rc(e){return e instanceof eD&&"COMMAND_FAILED"===e.code&&(e.details?.reason===re||e.message===rt)}let ru=new Map;function rp(e){let t=r.randomUUID(),n=setTimeout(()=>{rf(t)},9e5);return n.unref(),ru.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),t}function rf(e){let t=ru.get(e);if(t&&(clearTimeout(t.timer),ru.delete(e),t.deleteAfterDownload))try{a.rmSync(t.artifactPath,{force:!0})}catch{}}let rm=new Map;function rh(e,t){let r=rm.get(e);if(!r)throw new eD("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eD("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function rw(e){let t=rm.get(e);t&&(clearTimeout(t.timer),rm.delete(e),a.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function rg(e){let t=await ry(e);await eE("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=i.join(e.tempDir,t);if(!a.existsSync(r))throw new eD("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function ry(e){let t=await eE("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new eD("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 eD("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(rv),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 eD("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new eD("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 eD("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 eD("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 eD("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await eE("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new eD("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rv(e){if(e.includes("\0"))throw new eD("INVALID_ARGS",`Invalid archive entry: ${e}`);if(i.posix.isAbsolute(e))throw new eD("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=i.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new eD("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function rS(e,t){return new Promise((r,n)=>{let i,o=!1,s=0,l=a.createWriteStream(t),d=e=>{if(!o){if(o=!0,i&&clearTimeout(i),e)return void rI(l,t).finally(()=>n(e));r()}},c=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new eD("COMMAND_FAILED","Artifact transfer timed out due to inactivity",{timeoutMs:6e4});"destroy"in e&&"function"==typeof e.destroy&&e.destroy(t),u.destroy(t),d(t)},6e4)},u=new f({transform(e,t,r){c();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new eD("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{d(new eD("COMMAND_FAILED","Artifact transfer was interrupted"))}),c(),m(e,u,l).then(()=>d(),e=>d(e))})}async function rI(e,t){if(e.destroy(),!e.closed)try{await p(e,"close")}catch{}await a.promises.rm(t,{force:!0}).catch(()=>{})}async function rA(e){let t,r=e.headers["x-artifact-type"],n=e.headers["x-artifact-filename"];if(!r||!n)throw new eD("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new eD("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 eD("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let o=function(e){let t=e.trim(),r=i.basename(t);if(!r||"."===r||".."===r)throw new eD("INVALID_ARGS",`Invalid artifact filename: ${e}`);return r}(n),s=(t=function(e){let t=e?.trim();if(!t)return"request";let r=t.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return r.length>0?r.slice(0,48):"request"}("upload"),a.mkdtempSync(i.join(u.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===r){let t=i.join(s,o);return await rS(e,t),{artifactPath:t,tempDir:s}}let t=i.join(s,"artifact.tar");await rS(e,t);let n=await rg({archivePath:t,tempDir:s,platform:"ios",expectedRootName:o});return a.rmSync(t,{force:!0}),{artifactPath:n,tempDir:s}}catch(e){throw a.rmSync(s,{recursive:!0,force:!0}),e}}let r_=new h;async function rb(e,t){return await r_.run(e,t)}function rx(e){r_.getStore()?.(e)}let rM=new Set(["replay","test"]),rN=new Set(["agent_device.command","agent-device.command"]),rD=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rk=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rP={"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"},rE=new Set([...rN,...rD,...rk,...Object.keys(rP)]);function rC(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rR(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function rO(e,t){e.destroyed||(e.write(eH(t)),e.end())}function rT(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rL(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 r$(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rF(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rU(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new eD("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function rG(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new eD("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function rq(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=eN(new eD("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rC(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=eN(new eD(ex(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rC(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=e$(r.tenantId);if(!e){let e=eN(new eD("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rC(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rj(){let e,t=process.env.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let r=process.env.AGENT_DEVICE_HTTP_AUTH_EXPORT||"default",n=i.isAbsolute(t)?t:i.resolve(t);try{e=await import(c(n).href)}catch(e){throw new eD("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:n,error:e instanceof Error?e.message:String(e)})}let a=e[r];if("function"!=typeof a)throw new eD("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:n,exportName:r});return a}async function rV(e){let t=await rj(),{handleRequest:r,token:n}=e;return l.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!0}));return}if("POST"===e.method&&"/upload"===e.url)return void rB(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void rH(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||rR(i,rC(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rR(i,rC(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rR(i,rC(n.id??null,-32600,"Invalid Request"),400);if(!rE.has(n.method))return void rR(i,rC(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rR(i,rC(n.id??null,-32602,"Invalid params"),400);let s=!1;try{var l,d;let a=n.params,c=function(e,t,r){if(rN.has(e))return{token:rL(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(rD.has(e)){let e,n=r$(t,"platform");if("ios"!==n&&"android"!==n)throw new eD("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:rL(t,r),session:r$(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:r$(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new eD("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new eD("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 eD("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 eD("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 eD("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=rU(e,"owner"),n=rU(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new eD("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new eD("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new eD("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:rG(e,"artifactId")}:(a&&(t=rG(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rU(e,"artifactName")})}(t);throw new eD("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:rF(t,"retentionMs")}}}if(rk.has(e)){let e=r$(t,"materializationId")?.trim();if(!e)throw new eD("INVALID_ARGS","Invalid params: materializationId is required");return{token:rL(t,r),session:r$(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:r$(t,"requestId"),materializationId:e}}}let n=rP[e];if(n)return{token:rL(t,r),session:r$(t,"session")??"default",command:n,positionals:[],meta:{tenantId:r$(t,"tenantId")??r$(t,"tenant"),runId:r$(t,"runId"),leaseId:r$(t,"leaseId"),leaseTtlMs:rF(t,"ttlMs"),leaseBackend:r$(t,"backend")}};throw new eD("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(l=n.method,rN.has(l)&&("string"!=typeof c.command||0===c.command.length))return void rR(i,rC(n.id??null,-32602,"Invalid params: command is required"),400);o=rr(c.meta?.requestId,n.id),c.meta={...c.meta,requestId:o},rn(o);let u=await rq(t,{headers:e.headers,rpcRequest:n,daemonRequest:c});if(!u.ok)return void rR(i,u.response,u.statusCode);u.tenantId&&(c.meta={...c.meta,tenantId:u.tenantId,sessionIsolation:c.meta?.sessionIsolation??c.flags?.sessionIsolation??"tenant"});let p=(d=c,d.flags?.platform!=="android"&&(d.flags?.platform==="ios"||rM.has(d.command))),f=!1,m=()=>{s||i.writableFinished||f||(f=!0,ri(o),ei({level:"warn",phase:"request_client_disconnected",data:{requestId:o,abortIosRunnerSessions:p}}),p&&rK(o))};if(e.on("aborted",m),i.on("close",()=>{i.headersSent&&m()}),(e.aborted||i.destroyed&&i.headersSent)&&m(),eF(c)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await rb(e=>{!i.destroyed&&i.write(eB(e))},async()=>await r(c));s=!0;let t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rC(n.id??null,-32e3,e.error.message,e.error);rO(i,t);return}let h=await r(c);if(s=!0,h.ok)return void rR(i,{jsonrpc:"2.0",id:n.id??null,result:h});rR(i,rC(n.id??null,-32e3,h.error.message,h.error),rT(h.error.code))}catch(t){s=!0;let e=eN(t);if(i.headersSent)return void rO(i,rC(n.id??null,-32e3,e.message,e));rR(i,rC(n.id??null,-32e3,e.message,e),rT(e.code))}finally{ra(o)}})})}async function rB(e,t,n,i){try{var a;let o,s,l=await rW({req:e,res:t,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let d=await rA(e),c=(a={artifactPath:d.artifactPath,tempDir:d.tempDir,tenantId:l.tenantId},o=r.randomUUID(),(s=setTimeout(()=>{rw(o)},3e5)).unref(),rm.set(o,{artifactPath:a.artifactPath,tempDir:a.tempDir,tenantId:a.tenantId,timer:s}),o);t.statusCode=200,t.setHeader("content-type","application/json"),t.end(JSON.stringify({ok:!0,uploadId:c}))}catch(e){rz(t,eN(e))}}async function rH(e,t,r,n){let i=e.url?.slice("/artifacts/".length)??"";if(!i){t.statusCode=400,t.end("Missing artifact id");return}try{let o=await rW({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[i]}});if(!o)return;let s=function(e,t){let r=ru.get(e);if(!r)throw new eD("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eD("UNAUTHORIZED","Artifact belongs to a different tenant");if(!a.existsSync(r.artifactPath))throw rf(e),new eD("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(i,o.tenantId),l=a.createReadStream(s.artifactPath);t.statusCode=200,t.setHeader("content-type","application/octet-stream"),s.fileName&&t.setHeader("content-disposition",`attachment; filename="${s.fileName.replace(/"/g,"")}"`),l.on("error",e=>{if(t.headersSent)t.destroy(e);else{let r=eN(e);t.statusCode=rT(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rf(i)}),l.pipe(t)}catch(e){rz(t,eN(e))}}async function rK(e){try{let t=Date.now()+15e3;for(;ro(e)&&Date.now()<t;){let{abortAllIosRunnerSessions:t}=await Promise.resolve(tq);if(await t(),!ro(e))break;await eK(200)}}catch(e){ei({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e)}})}}async function rW(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=rL({},n.headers),d=(t=l,!(r=o)||t6(t,r)?null:eN(new eD("UNAUTHORIZED","Invalid token")));if(d)return rz(i,d),null;let c=await rq(a,{headers:n.headers,rpcRequest:{jsonrpc:"2.0",id:null,method:"agent_device.command"},daemonRequest:{token:l,session:"default",command:s.command,positionals:s.positionals}});return c.ok?{tenantId:c.tenantId}:(i.statusCode=c.statusCode,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!1,error:c.response.error?.data?.message??c.response.error?.message??"Unauthorized"})),null)}function rz(e,t){e.statusCode=rT(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function rX(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function rJ(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function rZ(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 eD("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class rY{leases=new Map;runBindings=new Map;maxActiveSimulatorLeases;defaultLeaseTtlMs;minLeaseTtlMs;maxLeaseTtlMs;now;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.defaultLeaseTtlMs=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,this.minLeaseTtlMs=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):5e3,this.maxLeaseTtlMs=Number.isInteger(e.maxLeaseTtlMs)?Math.max(this.minLeaseTtlMs,Number(e.maxLeaseTtlMs)):6e5,this.now=e.now??(()=>Date.now())}allocateLease(e){let t=rZ(e.backend),n=e$(e.tenantId);if(!n)throw new eD("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=rX(e.runId);if(!i)throw new eD("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");this.cleanupExpiredLeases();let a=this.resolveLeaseTtlMs(e.ttlMs),o=this.bindingKey(n,i,t),s=this.runBindings.get(o);if(s){let e=this.leases.get(s);if(e)return this.refreshLease(e,a);this.runBindings.delete(o)}this.enforceCapacity(t);let l=this.now(),d={leaseId:r.randomBytes(16).toString("hex"),tenantId:n,runId:i,backend:t,createdAt:l,heartbeatAt:l,expiresAt:l+a};return this.leases.set(d.leaseId,d),this.runBindings.set(o,d.leaseId),{...d}}heartbeatLease(e){let t=rJ(e.leaseId);if(!t)throw new eD("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);if(!r)throw new eD("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});this.assertOptionalScopeMatch(r,e.tenantId,e.runId);let n=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(r,n)}releaseLease(e){let t=rJ(e.leaseId);if(!t)throw new eD("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=rZ(e.backend),r=e$(e.tenantId);if(!r)throw new eD("INVALID_ARGS","tenant isolation requires tenant id.");let n=rX(e.runId);if(!n)throw new eD("INVALID_ARGS","tenant isolation requires run id.");let i=rJ(e.leaseId);if(!i)throw new eD("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new eD("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==r||a.runId!==n)throw new eD("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 eD("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 eD("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=e$(t),i=rX(r);if(t&&!n)throw new eD("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&!i)throw new eD("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 eD("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}async function rQ(e){var t;if("macos"===(t=e).platform||"apple"===t.platform&&"desktop"===t.target){let{listMacosDevices:e}=await import("./devices~2.js");return await e()}if("linux"===e.platform){let{listLinuxDevices:e}=await import("./devices~1.js");return await e()}if("android"===e.platform){let{listAndroidDevices:t}=await import("./8806.js");return await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0})}if(e.platform){let{listAppleDevices:t}=await import("./devices.js");return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}let r=[];try{let{listAndroidDevices:t}=await import("./8806.js");r.push(...await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0}))}catch{}try{let{listAppleDevices:t}=await import("./devices.js");r.push(...await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid}))}catch{}try{let{listLinuxDevices:e}=await import("./devices~1.js");r.push(...await e())}catch{}return r}let r0=new h,r1=new h;async function r2(e,t,r){var n,i;let a=await r3(e,t,r);if(n=t,i=a,!r5(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 eD("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function r3(e,t,r){try{return await e1(e,t,r)}catch(e){var n;if(n=e,!r5(t)&&n instanceof eD&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function r5(e){return!!(e.udid||e.serial||e.deviceName)}async function r4(e){let t=e0(e.platform),r=eW({simulatorSetPath:e8(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=tu(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 er("resolve_target_device",async()=>{let o=function(e){let t=r0.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 eD("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await ne({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return nt(s)?nr(i,await r2(l,s,{simulatorSetPath:r})):nr(i,await e1(l,s,{simulatorSetPath:r}));let d=await rQ({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return nt(s)?nr(i,await r2(d,s,{simulatorSetPath:r})):nr(i,await e1(d,s,{simulatorSetPath:r}))},a)}async function r8(e){return r0.getStore()?await e():await r0.run(new Map,e)}async function r6(e,t){return e?await r1.run(e,t):await t()}async function r9(e,t){return await r6(e,async()=>await r8(t))}async function r7(e){return await ne(e)??await rQ(e)}async function ne(e){let t=r1.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function nt(e){return!!e.platform&&"android"!==e.platform&&"linux"!==e.platform}function nr(e,t){return r0.getStore()?.set(e,{...t}),t}let nn=["platform","target","device","udid","serial"],ni=[...nn,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function na(e){return"string"==typeof e&&e.trim().length>0}function no(e,t){return!!e&&t.some(t=>na(e[t]))}let ns={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},nl=function(e){let t=new Map,r=new Map;for(let n of e){if(t.has(n.command))throw Error(`Duplicate daemon command descriptor: ${n.command}`);if(t.set(n.command,n),"generic"!==n.route){let e=r.get(n.route)??[];e.push(n.command),r.set(n.route,e)}}return{descriptorsByCommand:t,handlerCommandsByRoute:r}}([...nu("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},th.leaseAllocate,th.leaseHeartbeat,th.leaseRelease),nc(th.sessionList,"session",{sessionKind:"inventory",...ns}),nc(tm.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...ns}),nc(tm.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...nu("session",{sessionKind:"state"},tm.boot,tm.shutdown,tm.appState),...nu("session",{sessionKind:"observability"},tm.perf,tm.logs,tm.network),...nu("session",{sessionKind:"replay",skipSessionlessProviderDevice:function(e){return e.command===tm.test&&("number"==typeof e.flags?.shardAll||"number"==typeof e.flags?.shardSplit)}},tm.replay,tm.test),nc(th.runtime,"session"),nc(tm.clipboard,"session",{replayScopedAction:!0}),nc(tm.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...nu("session",{},tm.install,tm.reinstall,th.installSource),nc(th.releaseMaterializedPaths,"session",ns),...nu("session",{},tm.push,tm.triggerAppEvent),nc(tm.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...nu("session",{},tm.prepare,tm.batch),nc(tm.close,"session",{allowInvalidRecording:!0}),...nu("snapshot",{replayScopedAction:!0},tm.snapshot,tm.diff,tm.wait,tm.alert,tm.settings),nc(tm.reactNative,"reactNative",{replayScopedAction:!0}),nc(tm.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),nc(tm.trace,"recordTrace"),nc(tm.find,"find",{replayScopedAction:!0}),...nu("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},tm.click,tm.fill,tm.longPress,tm.press,tm.type),...nu("interaction",{replayScopedAction:!0},tm.get,tm.is),...nu("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},tm.back,tm.gesture,tm.home,tm.rotate,tm.scroll,tm.swipe,"pinch"),nc(tm.focus,"generic",{androidBlockingDialogGuard:!0}),nc(tm.screenshot,"generic",{replayScopedAction:!0}),...nu("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function nd(e){return np(e)?.sessionKind}function nc(e,t,r={}){return{command:e,route:t,...r}}function nu(e,t,...r){return r.map(r=>nc(r,e,t))}function np(e){return nl.descriptorsByCommand.get(e)}let nf=[{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");ny(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&eY(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(tj);ny(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&&eY(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(tB);ny(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(tK);ny(t,e.linuxTool,r)}},{resolverKey:"appLogProvider",resolve(e,t){let r=e.appLogProvider;return r?{appLog:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appLog?.provider)return;let{withAppLogProvider:r}=await Promise.resolve(tU);ny(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");ny(t,e.recording,r)}}];async function nm(e,t){let r=await nh(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await ng(r);return await nv(i,async()=>await t(n))}async function nh(e){var t,r,n;if(t=e.providers,!nf.some(e=>!!t[e.resolverKey]))return{};let i=await nw(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return nf.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function nw(e,t){switch(function(e,t){var r;let n,i;if(t.hasExistingSession)return np(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(r=e,"function"==typeof(i=np(r.command)?.skipSessionlessProviderDevice)&&i(r))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(n=np(e.command)?.allowSessionlessDefaultDevice)&&n(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:no(e.flags,nn)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await r4(e.flags??{});case"skip":return}}async function ng(e){let t=[];for(let r of nf)await r.appendWrapper(e,t);return t}function ny(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function nv(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function nS(e,t){switch(e.platform){case"android":{let{createAndroidInteractor:t}=await import("./android.js");return t(e)}case"linux":{let{createLinuxInteractor:e}=await import("./linux.js");return e()}case"ios":case"macos":{let{createAppleInteractor:r}=await import("./apple.js");return r(e,t)}default:throw new eD("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let nI=/^[A-Za-z0-9_.:-]{1,64}$/,nA="--launch-console is supported only for iOS simulator app launches",n_="--launch-console requires a direct app launch and cannot be used with URL opens",nb=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function nx(e,t){if(t<=0)return[0,0];let[r,n]=nb[e%nb.length];return[r*t,n*t]}async function nM(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await eK(t)}let nN=["tap","doubleTap","longPress","drag"];function nD(e,t,r){return new eD("INVALID_ARGS",r,{stepIndex:e,kind:"string"==typeof t?t:void 0})}function nk(e,t,r,n,i,a){if(!Number.isFinite(e)||e<t||e>r)throw nD(n,i,`sequence step ${n} (${i}) ${a} must be between ${t} and ${r}`)}function nP(e,t){if(!Array.isArray(e)||0===e.length)throw new eD("INVALID_ARGS","sequence requires at least one step",{stepCount:Array.isArray(e)?e.length:0});if(e.length>20)throw new eD("INVALID_ARGS",`sequence accepts at most 20 steps, received ${e.length}`,{stepCount:e.length,maxSteps:20});return e.forEach((e,t)=>(function(e,t){var r;if(!("string"==typeof(r=e.kind)&&nN.includes(r)))throw nD(t,e.kind,`sequence step ${t} has unsupported kind "${String(e.kind)}"; allowed: ${nN.join(", ")}`);if(!Number.isFinite(e.x)||!Number.isFinite(e.y))throw nD(t,e.kind,`sequence step ${t} (${e.kind}) requires finite x and y`);if("drag"===e.kind&&(!Number.isFinite(e.x2)||!Number.isFinite(e.y2)))throw nD(t,e.kind,`sequence step ${t} (drag) requires finite x2 and y2`);void 0!==e.durationMs&&nk(e.durationMs,0,1e4,t,e.kind,"durationMs"),void 0!==e.pauseMs&&nk(e.pauseMs,0,1e4,t,e.kind,"pauseMs")})(e,t)),{command:"sequence",steps:e,appBundleId:t}}function nE(e){var t,r,n,i;let a=Array.isArray(t=e.sequenceResults)?t.map(e=>{let t=e??{};return{ok:!0===t.ok,kind:"string"==typeof t.kind?t.kind:"unknown",errorCode:"string"==typeof t.errorCode?t.errorCode:void 0,errorMessage:"string"==typeof t.errorMessage?t.errorMessage:void 0,gestureStartUptimeMs:"number"==typeof t.gestureStartUptimeMs?t.gestureStartUptimeMs:void 0,gestureEndUptimeMs:"number"==typeof t.gestureEndUptimeMs?t.gestureEndUptimeMs:void 0}}):[],o="number"==typeof e.completedSteps&&Number.isFinite(e.completedSteps)?e.completedSteps:a.filter(e=>e.ok).length,s="number"==typeof e.failedStepIndex&&Number.isFinite(e.failedStepIndex)?e.failedStepIndex:a.findIndex(e=>!e.ok)>=0?a.findIndex(e=>!e.ok):void 0;if(void 0!==s){let e,t,l;throw r=a,n=o,e=r[i=s],t=e?.kind??"step",l=e?.errorMessage??`sequence step ${i} (${t}) failed`,new eD(ex(e?.errorCode),l,{failedStepIndex:i,failedStepKind:t,completedSteps:n,sequenceResults:r,hint:"Run snapshot -i to inspect the current UI, then continue from the observed state."})}return{results:a,completedSteps:o,failedStepIndex:s}}async function nC(e,t){let{x:r,y:n}=nU(t,"longpress requires x y [durationMs]",{hint:"Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i, use the target rect center as x y, then retry longpress x y durationMs."}),i=t[2]?Number(t[2]):void 0;return await e.longPress(r,n,i),{x:r,y:n,durationMs:i,...G(`Long pressed (${r}, ${n})`)}}async function nR(e,t){let{x:r,y:n}=nU(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...G(`Focused (${r}, ${n})`)}}async function nO(e,t,r){let n=ey(t[0]);if(n)throw new eD("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 eD("INVALID_ARGS","type requires text");let a=z(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...G(n6("Typed",i))}}async function nT(e,t,r){if(r?.directElementSelector)return await nL(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 eD("INVALID_ARGS","fill requires x y text");let o=z(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...G(n6("Filled",a))}}async function nL(e,t,r,n){if(!e.fillElementSelector)throw new eD("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new eD("INVALID_ARGS","fill requires text");let a=z(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...G(n6("Filled",i))}}async function n$(e,t,r,n){var i,a;if(n?.directElementSelector&&"ios"===e.platform)return await nF(t,n.directElementSelector);let{x:o,y:s}=nU(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await nG(o,s,n);let l=M(n);if("primary"!==l)return await nq(e,o,s,l,n);let d=(a=n,{count:nV(a?.count,1,"count",1,200),intervalMs:nV(a?.intervalMs,0,"interval-ms",0,1e4),holdMs:nV(a?.holdMs,0,"hold-ms",0,1e4),jitterPx:nV(a?.jitterPx,0,"jitter-px",0,100),doubleTap:!!a?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new eD("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new eD("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(d),i=d.count,eY(e.platform)&&i>1)?await nH(e,o,s,d,n):await nK(t,o,s,d)}async function nF(e,t){if(!e.tapElementSelector)throw new eD("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...G(`Tapped ${t.raw}`)}}function nU(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new eD("INVALID_ARGS",t,r);return{x:n,y:i}}async function nG(e,t,r){let n=M(r);if("primary"!==n)throw new eD("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(tG);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...G(n4({x:e,y:t}))}}async function nq(e,t,r,n,i){if(function(e,t,r){let n=T({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 nj(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(tq);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},nW(i)),{x:t,y:r,button:n,...G(n4({x:t,y:r,button:n}))}}async function nj(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,...G(n4({x:e,y:t,button:r}))}}function nV(e,t,r,n,i){return z(void 0===e?t:e,r,n,i)}async function nB(e,t,r){let n,i,{runIosRunnerCommand:a}=await Promise.resolve(tq),o=function(e,t=2e4){if(0===e.length)return[];let r=[],n=[],i=0;for(let a of e){let e=(a.durationMs??0)+(a.pauseMs??0)+250,o=n.length>0&&i+e>t,s=n.length>=20;(o||s)&&(r.push(n),n=[],i=0),n.push(a),i+=e}return n.length>0&&r.push(n),r}(t),s=0,l=[],d=0;for(let t of o){let o,c=await a(e,nP(t,r?.appBundleId),nW(r));n??=c,i=c;try{o=nE(c)}catch(e){throw function(e,t){if(0===t||!(e instanceof eD)||!e.details)return e;let r=e.details.failedStepIndex;if("number"!=typeof r)return e;let n=e.details.completedSteps;return new eD(e.code,e.message,{...e.details,failedStepIndex:r+t,chunkStepIndex:r,..."number"==typeof n?{completedSteps:t+n}:{}},e.cause)}(e,d)}s+=o.completedSteps,l.push(...o.results),d+=t.length}return{...n??{},completedSteps:s,sequenceResults:l,...i?.gestureEndUptimeMs!==void 0?{gestureEndUptimeMs:i.gestureEndUptimeMs}:{}}}async function nH(e,t,r,n,i){var a,o,s,l;let d,c,u=await nB(e,(a=e,o=t,s=r,c="tap"==(d=(l=n).doubleTap?"doubleTap":l.holdMs>0?"longPress":"tap")&&"ios"===a.platform&&"tv"!==a.target,Array.from({length:l.count},(e,t)=>{let[r,n]=nx(t,l.jitterPx),i=t===l.count-1;return{kind:d,x:o+r,y:s+n,...c?{synthesized:!0}:{},...l.holdMs>0?{durationMs:l.holdMs}:{},...!i&&l.intervalMs>0?{pauseMs:l.intervalMs}:{}}})),i);return{x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,timingMode:"runner-sequence",...u,...G(n4({x:t,y:r}))}}async function nK(e,t,r,n){let i;return await nM(n.count,n.intervalMs,async a=>{let[o,s]=nx(a,n.jitterPx),l=t+o,d=r+s;if(n.doubleTap){let t=await e.doubleTap(l,d);i??=t??void 0;return}if(n.holdMs>0){let t=await e.longPress(l,d,n.holdMs);i??=t??void 0}else{let t=await e.tap(l,d);i??=t??void 0}}),D({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},n4({x:t,y:r}))}function nW(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId}}async function nz(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 eD("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await nJ({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function nX(e,t,r,n){let i=C(r[0]),a=r[1]?Number(r[1]):300,o=X((await t.snapshot({appBundleId:n?.appBundleId})).nodes??[]);if(!o)throw new eD("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=Y(i,o,{platform:e.platform});return await nJ({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function nJ(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:d}=e,c=z(l,"durationMs",16,1e4),u=z(n?.count??1,"count",1,200),p=z(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if(!_(U,f))throw new eD("INVALID_ARGS",`Invalid pattern: ${f}`);if(eY(t.platform)&&u>1){let e=await nB(t,function(e){let{x1:t,y1:r,x2:n,y2:i,count:a,pauseMs:o,pattern:s,effectiveDurationMs:l}=e;return Array.from({length:a},(e,d)=>{let c="ping-pong"===s&&d%2==1;return{kind:"drag",x:c?n:t,y:c?i:r,x2:c?t:n,y2:c?r:i,durationMs:l,...d!==a-1&&o>0?{pauseMs:o}:{}}})}({x1:i,y1:a,x2:o,y2:s,count:u,pauseMs:p,pattern:f,effectiveDurationMs:c}),n);return{x1:i,y1:a,x2:o,y2:s,...d?{preset:d}:{},durationMs:c,effectiveDurationMs:c,timingMode:"runner-sequence",count:u,pauseMs:p,pattern:f,...e,...G(n8(u,f))}}return await nM(u,p,async e=>{"ping-pong"===f&&e%2==1?await r.swipe(o,s,i,a,c):await r.swipe(i,a,o,s,c)}),D({x1:i,y1:a,x2:o,y2:s,...d?{preset:d}:{},durationMs:c,effectiveDurationMs:c,timingMode:"direct",count:u,pauseMs:p,pattern:f},d?`Swiped ${d}`:n8(u,f))}async function nZ(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 eD("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=z(t[4]?Number(t[4]):500,"durationMs",16,1e4),s=r+i,l=n+a,d=await e.pan(r,n,s,l,o);return{x:r,y:n,dx:i,dy:a,x2:s,y2:l,durationMs:o,...d??{},...G(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function nY(e,t){let r=W(I,t[0],{message:"fling direction must be up, down, left, or right"}),n=Number(t[1]),i=Number(t[2]);if(![n,i].every(Number.isFinite))throw new eD("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new eD("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=z(t[4]?Number(t[4]):50,"durationMs",16,1e3),{x2:s,y2:l}=function(e,t,r,n){switch(r){case"up":return{x2:e,y2:t-n};case"down":return{x2:e,y2:t+n};case"left":return{x2:e-n,y2:t};case"right":return{x2:e+n,y2:t}}}(n,i,r,a);return await e.fling(n,i,s,l,o),{direction:r,x:n,y:i,x2:s,y2:l,distance:a,durationMs:o,...G(`Flung ${r}`)}}async function nQ(e,t,r){var n;let i=t[0],a=t[1]?Number(t[1]):void 0,o=r?.pixels;if(!i)throw new eD("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new eD("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==o)throw new eD("INVALID_ARGS","scroll accepts either a relative amount or --pixels, not both");let s="bottom"===(n=i)?{direction:"down",edge:"bottom"}:"top"===n?{direction:"up",edge:"top"}:{direction:A(n)},l={},d=0;if(s.edge){let t=s.edge,n=await k({edge:t,captureState:async n=>await n0(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 D({direction:s.direction,...s.edge?{edge:s.edge,passes:d}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},F(s.direction,s.edge,d,a,o))}async function n0(e,t,r,n){if("function"!=typeof e.snapshot)throw new eD("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await j({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,scope:e})).nodes??[]})}async function n1(e,t,r,n){if("tv"===e.target)throw new eD("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new eD("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 eD("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...G(`Pinched to scale ${i}`)}}async function n2(e,t,r){if("tv"===e.target)throw new eD("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new eD("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 eD("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 eD("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 eD("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 eD("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,...G(`Rotated gesture ${n} degrees`)}}async function n3(e,t,r){if("tv"===e.target)throw new eD("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new eD("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 eD("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new eD("INVALID_ARGS","gesture transform scale must be > 0");return{x:t,y:r,dx:n,dy:i,scale:a,degrees:o,durationMs:void 0===e[6]?void 0:z(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...G(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function n5(e,t,r){let{x:n,y:i}=nU(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(tG);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(tq),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 n4(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function n8(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function n6(e,t){return`${e} ${Array.from(t).length} chars`}function n9(e,t){let r,n=t?.subject??"Payload",i=e.trim();if(!i)throw new eD("INVALID_ARGS",`${n} cannot be empty`);let o=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!a.statSync(o).isFile())throw new eD("INVALID_ARGS",`${n} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof eD)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new eD("INVALID_ARGS",`${n} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new eD("COMMAND_FAILED",`Unable to read ${n} file: ${o}`,{cause:String(t)})}if((r=i.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:i};throw new eD("INVALID_ARGS",`${n} file not found: ${o}`)}async function n7(e){let t=n9(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await ie(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new eD("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof eD)throw t;throw new eD("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function ie(e){try{return await s.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new eD("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new eD("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new eD("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new eD("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function it(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},o=await nS(e,a);return ei({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await er("platform_command",async()=>await ir(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function ir(e,t,r,n,i,a,o){switch(r){case"open":return await ii(e,t,n,a);case"close":{let e=n[0];if(!e)return{closed:"session",...G("Closed session")};return await t.close(e),{app:e,...G(`Closed: ${e}`)}}case"press":return await n$(e,t,n,a);case"swipe":return await nz(e,t,n,a);case"swipe-preset":return await nX(e,t,n,a);case"pan":return await nZ(t,n);case"fling":return await nY(t,n);case"longpress":return await nC(t,n);case"focus":return await nR(t,n);case"type":return await nO(t,n,a);case"fill":return await nT(t,n,a);case"scroll":return await nQ(t,n,a);case"pinch":return await n1(e,t,n,a);case"rotate-gesture":return await n2(e,t,n);case"transform-gesture":return await n3(e,t,n);case"trigger-app-event":return await ia(e,t,n,a);case"screenshot":return await io(t,n,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...G("Back")};case"home":return await t.home(),{action:"home",...G("Home")};case"rotate":{let e=J(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...G(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...G("Opened app switcher")};case"clipboard":return await is(t,n);case"keyboard":return await il(e,n,a,o);case"settings":return await iu(e,t,n,a);case"push":return await ip(e,n,a);case"snapshot":return await im(t,a);case"read":return await n5(e,n,a);default:throw new eD("INVALID_ARGS",`Unknown command: ${r}`)}}async function ii(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new eD("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new eD("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new eD("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...G("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new eD("UNSUPPORTED_OPERATION",nA);if("linux"===e.platform&&s&&s.length>0)throw new eD("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(tp(i))throw new eD("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!tp(a))throw new eD("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new eD("INVALID_ARGS",n_);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...G(`Opened: ${i}`)}}if(o&&tp(i))throw new eD("INVALID_ARGS",n_);if(n?.clearAppState){if(tp(i))throw new eD("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}:{},...G(`Opened: ${i}`)}}async function ia(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new eD("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!nI.test(t))throw new eD("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 eD("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 eD("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 eD("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof eD)throw t;throw new eD("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 eD("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 eD("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",...G(`Triggered app event: ${i}`)}}async function io(e,t,r,n){let a=t[0]??r??`./screenshot-${Date.now()}.png`;await s.mkdir(i.dirname(a),{recursive:!0});let o=q(n);return await e.screenshot(a,{appBundleId:n?.appBundleId,fullscreen:o.fullscreen,stabilize:o.stabilize,surface:n?.surface}),{path:a,...G(`Saved screenshot: ${a}`)}}async function is(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new eD("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new eD("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new eD("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,...G("Clipboard updated")}}async function il(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!ec(i))throw new eD("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new eD("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await id(e,i);if("ios"===e.platform)return await ic(e,i,r,n);throw new eD("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function id(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...G("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 ic(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new eD("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(tq),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...G("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(tq),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...G(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function iu(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new eD("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new eD("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");ei({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?D({setting:i,state:"clear",...s},ih(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...G(`Cleared user data for ${r}`)}}if(!a)throw new eD("INVALID_ARGS","settings requires setting state");let l="location"===i&&"set"===a,d=("permission"===i||l?r[4]:r[2])??n?.appBundleId,c="permission"===i?{permissionTarget:o,permissionMode:s}:l?{latitude:O(o,"latitude"),longitude:O(s,"longitude")}:void 0;ei({level:"debug",phase:"settings_apply",data:l?{setting:i,state:a,latitude:o,longitude:s,platform:e.platform}:"permission"===i?{setting:i,state:a,permissionTarget:o,permissionMode:s,platform:e.platform}:{setting:i,state:a,appBundleId:d,platform:e.platform}});let u=await t.setSetting(i,a,d,c);return u&&"object"==typeof u?D({setting:i,state:a,...u},ih(u)??`Updated setting: ${i}`):{setting:i,state:a,...G(`Updated setting: ${i}`)}}async function ip(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new eD("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await n7(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...G(`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,...G(`Pushed notification to ${n}`)}}async function im(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,surface:t?.surface})}function ih(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let iw=e=>"macos"!==e.platform,ig=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,iy=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,iv={device:!0},iS={},iI={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iv},iA={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS,supports:iw},i_={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},pinch:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS,supports:e=>"android"===e.platform||ig(e),unsupportedHint:iy},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS,supports:e=>"android"===e.platform||ig(e),unsupportedHint:iy},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS,supports:e=>"android"===e.platform||ig(e),unsupportedHint:iy},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS,supports:iw},open:iI,close:iI,reinstall:iA,install:iA,"install-from-source":iA,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iv},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS,supports:iw},shutdown:{apple:{simulator:!0},android:{emulator:!0},linux:iS},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iv},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iv,supports:e=>"android"===e.platform||"linux"===e.platform||"macos"===e.platform||"simulator"===e.kind},keyboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},fill:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iv},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},snapshot:iI,diff:iI,screenshot:iI,wait:iI,get:iI,find:iI,is:iI,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iv},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iv,supports:iw},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iv},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iv},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iv},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS,supports:iw},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},scroll:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iv},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iv},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},"trigger-app-event":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},type:iI};function ib(e,t){let r=i_[e];if(!r)return!0;let n=eY(t.platform)?r.apple:"linux"===t.platform?r.linux:r.android;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}function ix(e,t=e=>e){let r=new h;return{resolve:n=>n?t(n):r.getStore()??e,run:async(e,n)=>e?await r.run(t(e),n):await n(),hasScope:()=>!!r.getStore()}}function iM(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function iN(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 eD("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 eD("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 eD("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 eD("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 eD("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await iD(e,t,r)}}async function iD(e,t,r){let n=["/Applications","/System/Applications",i.join(u.homedir(),"Applications")],a=new Set;for(let t of n){let r=await s.stat(t).catch(()=>null);if(!r?.isDirectory())continue;let n=await e("find",[t,"-maxdepth","4","-type","d","-name","*.app"],{allowFailure:!0});if(0===n.exitCode)for(let e of n.stdout.split("\n")){let t=e.trim();t&&a.add(t)}}return iM((await Promise.all(Array.from(a).map(async e=>{let r=await ik(e,t).catch(()=>({})),n=r.bundleId;return n?{bundleId:n,name:r.appName??i.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function ik(e,t){for(let r of[i.join(e,"Contents","Info.plist"),i.join(e,"Info.plist")]){let e=await t(r),n=iP(e,"CFBundleIdentifier"),i=iP(e,"CFBundleDisplayName"),a=iP(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function iP(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let iE={runCommand:eE,simctl:{run:async(e,t)=>await eE("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await eE("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await iG(eE,e)},macosHost:iN(eE,async e=>await iG(eE,e)),whichCommand:eO},iC=ix(iE,function(e){return"function"==typeof e?iR({runCommand:e}):iR(e)});function iR(e={}){let t={...iE,...e},r=e.plist??{readJson:async e=>await iG(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??iN(t.runCommand,async e=>await r.readJson(e))}}function iO(e){return iC.resolve(e)}async function iT(e,t){return await iC.run(e,t)}function iL(){return iC.hasScope()}async function i$(e,t,r){return await iO().runCommand(e,t,r)}async function iF(e,t){let r=iO(),[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 i$("xcrun",e,t)}async function iU(e){return await iO().plist?.readJson(e)??null}async function iG(e,t){try{let r=await e("plutil",["-convert","json","-o","-",t],{allowFailure:!0});if(0!==r.exitCode||!r.stdout.trim())return null;return JSON.parse(r.stdout)}catch{return null}}let iq="agent-device-macos-helper",ij="AGENT_DEVICE_MACOS_HELPER_BIN",iV=i.join(u.homedir(),".agent-device","macos-helper","current"),iB=i.join(iV,"manifest.json"),iH=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function iK(e){let t=e.trim();if(!iH.test(t))throw new eD("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function iW(e,t){t.bundleId&&e.push("--bundle-id",iK(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iz(){return function(e){let t=i.dirname(e);for(;;){let e=i.join(t,"macos-helper");if(o(i.join(e,"Package.swift")))return e;let r=i.dirname(t);if(r===t)break;t=r}throw new eD("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(d(import.meta.url))}async function iX(e){let t=await s.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=i.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await iX(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function iJ(e){let t=await iX(e),r=n("sha256");for(let n of t)r.update(i.relative(e,n)),r.update("\0"),r.update(await s.readFile(n)),r.update("\0");let a=await i$("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return r.update("swift-version"),r.update("\0"),r.update(a.stdout||a.stderr||`exit:${a.exitCode}`),r.update("\0"),r.digest("hex")}async function iZ(){try{let e=JSON.parse(await s.readFile(iB,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function iY(){let e=await eR(process.env[ij],ij);if(e)return e;let t=iz(),r=await iJ(t),n=i.join(iV,iq);try{if(await iZ()===r)return await s.access(n),n}catch{}let a=i.join(iz(),".build","release",iq);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await i$("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await s.mkdir(iV,{recursive:!0});let o=`${n}.tmp`;return await s.copyFile(a,o),await s.rename(o,n),await s.chmod(n,493),await s.writeFile(iB,`${JSON.stringify({fingerprint:r},null,2)}
|
|
4
|
+
`,"utf8"),n}async function iQ(){let e=process.env[ij]?.trim();if(e){let t=await eR(e,ij);if(t)return t}if(iL())return iq;if("darwin"!==process.platform)throw new eD("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await iY()}async function i0(e){let t={allowFailure:!0,timeoutMs:3e4},r=iO().macosHelper,n=r?iq:await iQ(),i=r?await r.run(e,t):await i$(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 eD("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 i1(){return await i0(["app","frontmost"])}async function i2(e){return await i0(["app","quit","--bundle-id",iK(e)])}async function i3(e,t){return await i0(["permission",e,t])}async function i5(e,t={}){let r=["alert",e];return iW(r,t),await i0(r)}async function i4(e,t={}){let r=["snapshot","--surface",e];return iW(r,t),await i0(r)}async function i8(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return iW(n,r),await i0(n)}async function i6(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return iW(n,r),await i0(n)}async function i9(e,t={}){let r=["screenshot","--out",e];return iW(r,t),t.fullscreen&&r.push("--fullscreen"),await i0(r)}let i7={"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"},ae={runCommand:eE,whichCommand:eO,desktop:aa(eE,eO),clipboard:ao(eE,eO),screenshot:as(eE,eO)},at=ix(ae,function(e={}){let t={...ae,...e};return{...t,desktop:e.desktop??aa(t.runCommand,t.whichCommand),clipboard:e.clipboard??ao(t.runCommand,t.whichCommand),screenshot:e.screenshot??as(t.runCommand,t.whichCommand)}});function ar(e){return at.resolve(e)}async function an(e,t){return await at.run(e,t)}async function ai(e,t,r){return await ar().runCommand(e,t,r)}function aa(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=>{ei({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await eK(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 ao(e,t){return{async readText(){let r=ac[await af(t,al)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=au[await af(t,al)](r);await e(n.cmd,n.args,n.options)}}}function as(e,t){return{async capture(r){let n=ap[await af(t,ad)](r);await e(n.cmd,n.args,n.options)}}}let al={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."},ad={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}}},au={"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}})},ap={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 af(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 eD("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let am="atspi-dump.py",ah=null;async function aw(e,t={}){let r,n=ar().accessibility;if(n)return await n.captureTree(e,t);if("linux"!==process.platform)throw new eD("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await ar().whichCommand("python3"))throw new eD("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let o=t.maxNodes??1500,s=t.maxDepth??12,l=t.maxApps??24,c=[function(){if(ah)return ah;let e=i.dirname(d(import.meta.url));for(let t=0;t<5;t++){let r=i.join(e,"src","platforms","linux",am);if(a.existsSync(r))return ah=r,r;if(0===t){let t=i.join(e,am);if(a.existsSync(t))return ah=t,t}e=i.dirname(e)}throw new eD("TOOL_MISSING",`Cannot find ${am}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(l)],u=await ai("python3",c,{allowFailure:!0,timeoutMs:3e4});if(0!==u.exitCode){let e=u.stderr.trim();if(e.includes("No module named")||e.includes("gi.require_version"))throw new eD("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new eD("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new eD("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new eD("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=i7[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 ag(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&ei({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await aw(t);return{nodes:r.nodes,truncated:r.truncated}}async function ay(e,t,r){let{nodes:n}=await ag(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:av(e.rect)-av(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 av(e){return(e?.width??0)*(e?.height??0)}let aS=[250,400,600];function aI(e,t,r=e.snapshot){if("android"!==e.device.platform)return;let n=function(e,t){if(t?.comparisonSafe===!0)return t;let r=e.lastComparisonSafeSnapshot;return r&&!0===r.comparisonSafe&&Date.now()-r.createdAt<=5e3?r:t}(e,r),i=n?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(n??r)?.nodes.length??0,baselineSignatures:i?ax(n?.nodes??[]):void 0,routeComparable:i}}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 a_(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function ab(e){return"press"===e||"click"===e||"back"===e||"open"===e}function ax(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??ee().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,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...H(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:M(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function aN(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=aE(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){let{session:t,pending:r,snapshot:n}=e,i=aC(r.preSignature,aE(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await it(t.device,r.command,r.positionals,r.flags?.out,{...aM(e.logPath,r.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),ei({level:"info",phase:"interaction_no_change_retry",data:{action:r.action,attemptsRemaining:r.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function aP(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function aE(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 aC(e,t){return 0===e.length||0===t.length?"ambiguous":aR(e,t)?"unchanged":"changed"}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,t,r=[],n){var i,a,o;aF(e.device.platform)&&(i=t,a=r,o=n,(o?.postGestureStabilization===!0||"swipe"===i||"scroll"===i||"gesture"===i&&"swipe"===a[0])&&(e.postGestureStabilization={action:t,markedAt:Date.now()}))}function aL(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function a$(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!aF(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=aE(e.readSnapshot(o).nodes);for(;Date.now()-i<1500;){await eK(200),a+=1;let l=await r(),d=aE(e.readSnapshot(l).nodes);if(aR(s,d))return aL(t),ei({level:a>2?"info":"debug",phase:"post_gesture_snapshot_stabilized",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),l;o=l,s=d}return aL(t),ei({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function aF(e){return"ios"===e||"android"===e}function aU(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let aG=new WeakMap;function aq(e,t){if(!e[t])return[];let r=aB(e)[t]??t+1;return e.slice(t+1,r)}function aj(e,t,r){let n=aB(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=aB(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function aB(e){let t=aG.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 aG.set(e,r),r}function aH(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 aK(e,t){let r=ty(e.type??""),n=e.label?.trim();return!!(aW(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function aW(e){return"button"===ty(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function az(e){let t=ty(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function aX(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function aJ(e){let t;for(let i of e){var r,n;let e=ty(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||aZ(r)>aZ(n)))&&(t=i.rect)}return t}function aZ(e){return e?e.width*e.height:0}function aY(e){let t=ty(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=ty(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=ty((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"===ty(n.type??"")&&t(n,i,r)}}function a3(e,t,r,n){for(let i of e)(aK(i,t)||n&&a4(i,n))&&r.add(i.index)}function a5(e,t,r){if("button"!==ty(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&L(e.rect,t.rect)}function a4(e,t){return"button"===ty(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&L(e.rect,t.rect)}let a8=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=aJ(e),n=r?r.y+r.height:null;if(null!==n)for(let r=0;r<e.length;r+=1){var i,a;let o=e[r];o&&(i=o,a=n,i.rect&&"keyboard"===ty(i.type??"")&&i.rect.y>=a)&&(t.add(o.index),function(e,t,r,n){let i=new Map(t.map(e=>[e.index,e])),a="number"==typeof e.parentIndex?i.get(e.parentIndex):void 0;for(;a?.rect&&a.rect.y>=n;)r.add(a.index),a="number"==typeof a.parentIndex?i.get(a.parentIndex):void 0}(o,e,t,n),aV(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==ty(r.type??"")||!0===r.hittable||r.label?.trim()||r.value?.trim())&&r.identifier?.trim()&&t.add(r.index)}(e,o);let s=new Map(e.map(e=>[e.index,e]));for(let r of e)(function(e){let t=e.label?.trim();return!!(t&&$(t))})(r)&&function(e,t,r){var n,i,a,o;az(e.type)||r.suppressedIndexes.add(e.index);let s=N(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&az(e.type)?e:null)??aH(e,t,e=>az(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,aX(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"!==ty(n.type??""))continue;if("Search"===n.label){a1(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=aj(e,r,e=>"searchfield"===ty(e.type??"")&&"Search"===e.label);i&&(t.add(n.index),function(e,t,r){let n=new Map(t.map(e=>[e.index,e])),i=e;for(;"number"==typeof i.parentIndex;){let e=n.get(i.parentIndex);if(!e||"Toolbar"!==e.label)return;r.add(e.index),i=e}}(n,e,t),a1(e,r,i.index,t))}})(e,o),r=e,n=o,a2(r,(e,t,i)=>{aj(r,i,r=>{let n;return("button"===(n=ty(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(L(r.rect,e.rect)||function(e,t){var r,n,i,a,o;let s;if(t.label?.trim()!==e.label?.trim())return!1;let l=ty(t.type??"");return r=e,n=l,s=r.label?.trim(),"button"===n&&("Dismiss"===s||"Back"===s)||"textfield"===l||(i=e,a=l,o=t,"button"===a&&!!i.rect&&!!o.rect&&0===i.rect.x&&0===i.rect.y&&i.rect.width>=300&&i.rect.height>=600&&o.rect.width<i.rect.width)}(e,r))})&&n.add(e.index)}),i=e,a=o,a2(i,(e,t,r)=>{let n;B(e)&&b(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=ty(r.type??"");if("statictext"===a||"link"===a)return a0(e,t,n,i);if("other"===a){if(function(e,t,r){return!!aj(e,t,e=>{let t=ty(e.type??"");return("link"===t||"searchfield"===t||az(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=aJ(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==ty(e.type??"")||!1===e.enabled||!e.rect||!function(e){let t=e?.trim();return!(!t||/^(toolbar|window|application)$/i.test(t)||t.startsWith("!,")||/debugger|fast refresh/i.test(t))}(e.label)||!aH(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)&&aX(t.replacements,i,{type:"Cell"})},function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n?.rect&&i&&function(e,t,r,n,i){let a=ty(r.type??"");if("button"===a)return a3(aq(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=aq(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==ty(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r})(e,t,r));if(!i)return!1;let a=e.find(e=>a5(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&aX(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&&(a5(a,t,r)||a4(a,t)||function(e,t){if("switch"!==ty(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||aK(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=>a5(e,t,r));if(!i){e.some(aW)&&a3(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&aX(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){let t=await a9(e);if(t)return t;let r=await oo(e);return a_(e.session),{snapshot:r.snapshot,...r.annotations}}async function a9(e){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 a7({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await oi({...e,session:e.session});let r=aA(e.session);if(r&&"android"===e.device.platform)return await or(e,r)}async function a7(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await oe(e,t,await oa(e)),l=await ak({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await oe(e,t,await oa(e)),l=await ak({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(aD(i),s=await a$({session:i,initial:s,capture:async()=>await oa(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.annotations.freshness?.staleAfterRetries!==!0&&a_(i),"unchanged"===l.change)?ei({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}}):ei({level:(n={pending:t,change:l.change,attempts:o,startedAt:a}).attempts>0?"info":"debug",phase:"interaction_settled",data:{action:n.pending.action,change:n.change,attempts:n.attempts,durationMs:Date.now()-n.startedAt}}),{snapshot:s.snapshot,...s.annotations}}async function oe(e,t,r){let n=r;return"unchanged"!==aC(t.preSignature,aE(n.snapshot.nodes))?n:(await eK(500),n=await oa(e))}async function ot(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await ag(r?.surface);return od({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?od(await i4(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await it(t,"snapshot",[],i,{...aM(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath)})}async function or(e,t){let r=await on(e,t);return{snapshot:r.snapshot,...r.annotations}}async function on(e,t){let r=await oo(e),n=os(r,t,e),i=0,a=t.markedAt+1500;for(let o of aS){if(!n)break;let s=a-Date.now();if(s<=0)break;await eK(Math.min(o,s)),r=await oo(e),i+=1,n=os(r,t,e)}n||a_(e.session);let o=i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0;return{...r,annotations:{...r.annotations,...K({freshness:o})}}}async function oi(e){let t=await a$({session:e.session,capture:async()=>await oa(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,...t.annotations}}async function oa(e){let t=aA(e.session);return t&&"android"===e.device.platform?await on(e,t):await oo(e)}async function oo(e){var t;let r=await ot(e);return{data:r,snapshot:ol(r,void 0===(t=e).snapshotScope?t.flags:{...t.flags,snapshotScope:t.snapshotScope}),annotations:K(r)}}function os(e,t,r){var n,i;let a=r.flags?.snapshotInteractiveOnly===!0,o=e.annotations.analysis;if(a&&0===e.snapshot.nodes.length&&o&&o.rawNodeCount>=12)return"empty-interactive";if("ref-refresh"===r.androidFreshnessMode)return null;return(n=t.baselineCount,i=e.snapshot.nodes.length,!(n<12)&&i<=Math.floor(.2*n))?e.snapshot.nodes.some(e=>!0===e.hittable||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())?null:"sharp-drop":t.routeComparable&&ab(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=ax(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 ol(e,t){var r,n,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=V(s?o:tv(o)),d=t?.snapshotScope&&e?.backend!=="macos-helper"?oc(l,t.snapshotScope):l,c=(r=e?.backend,n=t,"xctest"===r&&n?.snapshotInteractiveOnly===!0&&!0!==n.snapshotRaw)?function(e){if(0===e.length)return e;let t=new Map,r=new Set;for(let n of 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}})}(d):d,u=e5(s?c:E(c)),p=K(e).quality;return{nodes:u,truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,...p?{snapshotQuality:p}:{},presentationKey:e2(eZ(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function od(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=oc(i,t.snapshotScope)),t.snapshotInteractiveOnly&&(i=function(e){if(0===e.length)return e;let t=new Map;for(let r of e)t.set(r.index,r);let r=new Set;for(let n of e){if(!function(e){if(e.focused||e.hittable||e.rect)return!0;let t=`${e.type??""} ${e.role??""} ${e.subrole??""}`.toLowerCase();return t.includes("button")||t.includes("menu")||t.includes("textfield")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")}(n))continue;let e=n;for(;e&&!r.has(e.index);)r.add(e.index),e="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0}return 0===r.size?e:ou(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=ou(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function oc(e,t){let r=tS(e5(e),t);if(!r)return[];let n=e.findIndex(e=>e.index===r.index);if(-1===n)return[];let i=e[n]?.depth??0,a=[];for(let t=n;t<e.length;t+=1){let r=e[t];if(!r)continue;let o=r.depth??0;if(t>n&&o<=i)break;a.push(r)}return ou(a,i)}function ou(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 op(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return aU("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=ez(e.trim());if(!n)return aU("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=eQ(e.nodes,n);if(r=t?tI(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:aU("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function of(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function om(e){return{get:t=>t===e.sessionName?function(e,t,r={}){if(e)return{name:t,appBundleId:e.appBundleId,appName:e.appName,...!0===r.includeSnapshot?{snapshot:e.snapshot}:{},metadata:{surface:e.surface,...r.metadata??{}}}}(e.getSession(),e.sessionName,e.recordOptions):void 0,set:t=>{t.name!==e.sessionName?ei({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function oh(e){let{session:t,sessionName:r,outPath:n,outputPlacement:a,dispatchContext:o}=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,...H(a),surface:a?.surface};return"out"===r?ow(await it(t.device,"screenshot",[],i,o)):ow(await it(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:o}),artifacts:{resolveInput:async()=>{throw new eD("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-screenshot-")),r=i.join(t,"screenshot.png")),await s.mkdir(i.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await s.mkdtemp(i.join(u.tmpdir(),`${e.prefix}-`));return{path:i.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}}},sessions:om({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:ef()});return await l.capture.screenshot({session:r,requestId:o.requestId,appBundleId:t.appBundleId,...q(o),surface:t.surface,...n?{out:{kind:"path",path:n}}:{}})}function ow(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function og(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function oy(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 ov(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let oS=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function oI(e,t={}){let r=tx(e,t.helperAdb).exec;return(await oM(e,t,r)).xml}async function oA(e,t={}){let r=tx(e,t.helperAdb).exec,n=await oM(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=tN(i,void 0,t),s=o_(o.truncated,n.metadata);return a&&function(e,t){for(let[r,n]of e){let e=t[r];e&&(n.hiddenContentAbove&&(e.hiddenContentAbove=!0),n.hiddenContentBelow&&(e.hiddenContentBelow=!0))}}(await oL(e,o.nodes,i,r),o.nodes),{...o,...ob(s),androidSnapshot:n.metadata}}let o=tk(i),s=tO(o,void 0,t),l=o_(s.truncated,n.metadata);a&&await ox({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:d,...c}=s;return{...c,...ob(l),androidSnapshot:n.metadata}}function o_(e,t){return!0===e||!0===t.helperTruncated||e}function ob(e){return!0===e?{truncated:!0}:{}}async function ox(e){if(oF(e.interactiveSnapshot.nodes).size>0||o$(e.xml))return;let t=tO(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await oL(e.device,t.nodes,e.xml,e.adb);oB(r,t,e.interactiveSnapshot),0===r.size&&oB(x(e5(t.nodes)),t,e.interactiveSnapshot)}async function oM(e,t,r){let n=await er("android_snapshot_helper_artifact_resolution",async()=>await oO(t.helperArtifact));return n.artifact?await oN(e,t,r,n.artifact):(ei({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await oT(e,n.fallbackReason,r))}async function oN(e,t,r,n){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),d=tx(e,t.helperAdb);try{let e=await oD(t,r,d,n,l);return e.installed&&await tT(l),a=await ok(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 oP({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function oD(e,t,r,n,i){let a=await er("android_snapshot_helper_install",async()=>await tD({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 ei({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 ok(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 er("android_snapshot_helper_session_capture",async()=>await tE(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){ei({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:eN(e).message}}),await oE(t,n.manifest.packageName)}return await er("android_snapshot_helper_capture",async()=>await tP(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function oP(e){let t=function(e){var t;let r=eN(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=oR(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=oC(e);return new eD(ex(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=oC(e.error);return ei({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tT(e.helperDeviceKey),await oE(e.adb,e.artifact.manifest.packageName),tR({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oT(e.device,r,e.adb)}async function oE(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await eK(150),ei({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){ei({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:eN(e).message}})}}function oC(e){let t=eN(e),r=oR(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 oR(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 oO(e){if(e)return{artifact:e};let t=t_(),r=i.join(tb(),"android-snapshot-helper","dist"),n=i.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await w.access(n)}catch{return{}}try{let e=tC(JSON.parse(await w.readFile(n,"utf8"))),t=i.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await w.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:eN(e).message}}}async function oT(e,t,r){let n;try{n=await er("android_snapshot_stock_capture",async()=>await oU(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new eD(ex((r=eN(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 oL(e,t,r,n){if(!t.some(e=>tA(e.type)))return new Map;let i=oF(t);if(i.size>0||o$(r))return i;let a=await oV(e,n);return a?function(e,t){let r=function(e){let t={className:"root",rect:{x:0,y:0,width:0,height:0},children:[]},r=[{indent:-1,node:t}],n=/^(\s*)([\w.$]+)\{[^}]* (-?\d+),(-?\d+)-(-?\d+),(-?\d+) #/;for(let t of e.split("\n")){let e=n.exec(t);if(!e)continue;let[i,a,o,s,l,d]=e.slice(1);if(void 0===i||void 0===a||void 0===o||void 0===s||void 0===l||void 0===d)continue;let c=i.length,u=Number(o),p=Number(s),f={className:a,rect:{x:u,y:p,width:Math.max(0,Number(l)-u),height:Math.max(0,Number(d)-p)},children:[]};for(;r.length>1&&c<=r[r.length-1].indent;)r.pop();r[r.length-1].node.children.push(f),r.push({indent:c,node:f})}return t.children.length>0?t:null}(t);if(!r)return new Map;let n=function(e){let t=[],r=[e];for(;r.length>0;){let e=r.pop();if(tA(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=>ov(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||!tA(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=>ov(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=og(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(!oy(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(!oy(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?og(o):a.length>0?og(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 o$(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function oF(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 oU(e,t=tM(e)){try{return await e9(()=>oG(t),{shouldRetry:oj})}catch(t){var r,n;let e;if((r=t)instanceof eD&&"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 eD("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 oG(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=oq(a.stdout,a.stderr);if(o)return o;let s="/sdcard/window_dump.xml",l=await e(["shell","uiautomator","dump",s],{allowFailure:!0,timeoutMs:8e3}),d=(t=l.stdout,r=l.stderr,n=`${t}
|
|
5
|
+
${r}`,i=/dumped to:\s*(\S+)/i.exec(n),i?.[1]);if(0!==l.exitCode&&!d)throw new eD("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode,reason:"missing_fresh_dump"});let c=await e(["shell","cat",d??s]),u=oq(c.stdout,c.stderr);if(!u)throw new eD("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:c.stdout,stderr:c.stderr});return u}function oq(e,t){let r=`${e}
|
|
6
|
+
${t}`,n=r.indexOf("<?xml"),i=n>=0?n:r.indexOf("<hierarchy");if(i<0)return null;let a=r.lastIndexOf("</hierarchy>");if(a<0||a<i)return null;let o=r.slice(i,a+12).trim();return o.length>0?o:null}function oj(e){if(!(e instanceof eD)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return oS.some(e=>r.includes(e))}async function oV(e,t=tM(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),r=`${e.stdout}
|
|
7
|
+
${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function oB(e,t,r){if(0===e.size)return;let n=new Map;for(let[e,t]of r.sourceNodes.entries()){let i=r.nodes[e];i&&n.set(t,i)}for(let[r,i]of e){let e=t.sourceNodes[r];if(!e)continue;let a=n.get(e);a&&(i.hiddenContentAbove&&(a.hiddenContentAbove=!0),i.hiddenContentBelow&&(a.hiddenContentBelow=!0))}}let oH=/\bis(?:n(?:'|'|')?t| not)\s+responding\b/i,oK=/^close app$/i,oW="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function oz(e){let t,{session:r}=e;if("android"!==r.device.platform||!r.recording)return{status:"absent"};try{t=await o0(r)}catch(e){return ei({level:"warn",phase:"android_blocking_dialog_inspection_failed",data:{session:r.name,deviceId:r.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"unknown",reason:"inspection-failed"}}let n=o2(t);if(!n?.rect)return{status:"absent"};try{let e=await o1(r,n);if(!e.ok)return ei({level:"warn",phase:"android_blocking_dialog_tap_failed",data:{session:r.name,deviceId:r.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:"failed",reason:"tap-failed"};if(!await o3(r))return ei({level:"warn",phase:"android_blocking_dialog_still_present",data:{session:r.name,deviceId:r.device.id}}),{status:"failed",reason:"dismiss-failed"};if(r.appBundleId&&(await tt(r.device,r.appBundleId),!await o5(r,r.appBundleId)))return ei({level:"warn",phase:"android_blocking_dialog_relaunch_unfocused",data:{session:r.name,deviceId:r.device.id,appBundleId:r.appBundleId}}),{status:"failed",reason:"relaunch-failed"};return ei({level:"warn",phase:"android_blocking_dialog_recovered",data:{session:r.name,deviceId:r.device.id,appBundleId:r.appBundleId,x:e.x,y:e.y}}),{status:"recovered"}}catch(e){return ei({level:"warn",phase:"android_blocking_dialog_recovery_failed",data:{session:r.name,deviceId:r.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"failed",reason:"error"}}}async function oX(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await e6(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await oJ(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 oY({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 oY({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${oQ(a)}. Automatic recovery failed.`,hint:oW})}throw oY({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${oQ(a)}.`,hint:oW})}async function oJ(e){try{return await oZ(e)}catch(t){return ei({level:"warn",phase:"android_app_anr_recovery_failed",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}async function oZ(e){if(!e.appBundleId)return!1;let t=o2(await o0(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await o1(e,t);if(!r.ok)return!1;await tt(e.device,e.appBundleId);let n=await o5(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&ei({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 oY(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new eD("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function oQ(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function o0(e){return e5(tv((await oA(e.device,{interactiveOnly:!1})).nodes))}async function o1(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=e3(t.rect),i=await e4(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 o2(e,t={}){if(!1===t.requireDialogSignal||o6(e))return e.find(e=>o8(e).some(e=>oK.test(e))&&e.rect)}async function o3(e){for(let t=0;t<12;t+=1){if(!o6(await o0(e)))return!0;await eK(500)}return!o6(await o0(e))}async function o5(e,t,r={}){for(let n=0;n<12;n+=1){if(await o4(e,t,r))return!0;await eK(500)}return await o4(e,t,r)}async function o4(e,t,r){return!(r.requireNoBlockingDialog&&await e6(e.device))&&(await tl(e.device)).package===t}function o8(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 o6(e){return e.some(e=>{let t=o8(e).join(" ").trim();return t.length>0&&oH.test(t)})}function o9(e){return!!(e&&e.width>0&&e.height>0)}function o7(e){return e.width*e.height}function se(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 st=[255,59,48,255],sr=[255,214,10,255],sn=[0,0,0,255],si=["scroll","list","recyclerview","edittext","textfield"],sa=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],so={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 ss(e){let t=await s.readFile(e.screenshotPath),r=await ew(t,"screenshot"),n=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)sc(r)&&o9(r.rect)&&(!t||o7(r.rect)>o7(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&&o9(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 o9(e.rect)&&!("image"===ty((t=e).type??"")&&!sp(t.label))}))}(e.nodes),a=new Map;for(let n of e.nodes){var o,s;if(!function(e,t,r){let n=[r.label,r.value].some(sf)||sm(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!o9(r.rect)||sc(r))return!1;let n=ty(r.type??"");return!(si.some(e=>n.includes(e))||t&&o7(r.rect)>.25*o7(t))}(e,t,r)||(sd(r)?n:n&&function(e){let t=ty(e.type??"");return t.includes("statictext")||t.includes("image")||t.includes("text")||t.includes("other")}(r))}(e,i,n))continue;let l=(o=e.nodes,[function(e){return sd(e)&&!sc(e)}(s=n)?s:null,tg(o,s,e=>(function(e){return sd(e)&&!sc(e)})(e)),s.hittable?s:null,tg(o,s,e=>!0===e.hittable)].find(su)??null);if(!l?.rect||!o9(l.rect))continue;let d=function(e,t,r){let n=sh(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=sh(n);if(!i)continue;let a=function(e){let t=0;return ty(e.type??"").includes("text")&&(t+=2),sf(e.label)&&(t+=2),sf(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||sh(t)}(n,l,e.nodes),c=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),sd(t)&&(n+=3),sd(e)&&(n+=2),r&&(n+=2),sm(t.identifier)&&(n+=1),sp(t.value)&&(n+=1),n}(n,l,d),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=sd,i=e=>!!sh(e),(!t.rect||!0!==t.hittable||n(t)||i(t)?null:function(e,t,r){let n=e.rect,i=function(e,t,r){let n=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r.get(n.parentIndex);if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(t,e,i)&&function(e,t){let r=ty(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&o9(t.rect)&&se(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=sl(e,i,u,t,r);if(!o9(p))continue;let f=a.get(l.ref);(!f||c>f.score)&&a.set(l.ref,{ref:l.ref,label:d,rect:l.rect,overlayRect:p,score:c})}return function(e,t,r,n,i){let a=R(e.nodes).primaryAction;if(!a?.ref||!a.rect||!o9(a.rect))return;let o=sl(e,t,a.rect,n,i);if(!o9(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)=>o7(e.overlayRect)-o7(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(se(e.overlayRect,r.overlayRect)||se(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}o7(r.overlayRect)<o7(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(sA).slice(0,n.maxRefs??24).sort(sI).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:e3(e.overlayRect)}))}(e.snapshot,r.width,r.height,{maxRefs:e.maxRefs});for(let e of n){var i,a;(function(e,t,r){for(let n=0;n<2;n+=1)sy(e,t.x,t.x+t.width-1,t.y+n,r),sy(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),sv(e,t.x+n,t.y,t.y+t.height-1,r),sv(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(i=r,(a=e).overlayRect,st),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=sg(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:sg(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)sS(e,t+o,r+a,i)})(e,i,o,n,sr),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=so[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]&&sS(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,sn)}(i,a.overlayRect,a.ref)}return await s.writeFile(e.screenshotPath,await eu(r)),n}function sl(e,t,r,n,i){if("android"===e.backend||!t)return sw(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 sw({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 sd(e){let t=[e.type,e.role,e.subrole].map(e=>ty(e??"")).join(" ");return sa.some(e=>t.includes(e))}function sc(e){let t=[e.type,e.role,e.subrole].map(e=>ty(e??"")).join(" ");return t.includes("application")||t.includes("window")}function su(e){return!!(e?.rect&&o9(e.rect)&&!sc(e))}function sp(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function sf(e){var t;let r;return!!sp(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function sm(e){var t;return"string"==typeof e&&!!sf(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function sh(e){let t=[e.label,e.value].find(sf);return t?t.trim():sm(e.identifier)?e.identifier.trim():void 0}function sw(e,t,r){let n=sg(e.x,0,Math.max(0,t-1)),i=sg(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:sg(e.width,1,a),height:sg(e.height,1,o)}}function sg(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function sy(e,t,r,n,i){for(let a=t;a<=r;a+=1)sS(e,a,n,i)}function sv(e,t,r,n,i){for(let a=r;a<=n;a+=1)sS(e,t,a,i)}function sS(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 sI(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 sA(e,t){return t.score!==e.score?t.score-e.score:sI(e,t)}function s_(e){return"number"==typeof e.gestureClockOriginAtMs&&"number"==typeof e.gestureClockOriginUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureClockOriginAtMs+(e.gestureStartUptimeMs-e.gestureClockOriginUptimeMs)-e.recordingStartedAt):"number"==typeof e.runnerStartedAtUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureStartUptimeMs-e.runnerStartedAtUptimeMs):"number"==typeof e.gestureStartUptimeMs&&"number"==typeof e.gestureEndUptimeMs?Math.max(0,e.fallbackFinishedAtMs-(e.gestureEndUptimeMs-e.gestureStartUptimeMs)-e.recordingStartedAt):Math.max(0,e.fallbackStartedAtMs-e.recordingStartedAt)}let sb=new WeakMap;function sx(e){if(!e)return;let t=sb.get(e);if(t)return t;let r=sM(e.nodes??[]);if(r)return sb.set(e,r),r}let sM=X,sN={referenceWidth:1e3,referenceHeight:1e3};function sD(e,t,r,n,i={},a=Date.now(),o=Date.now()){var s,l,d,c,u,p,f,m,h;let w,g,y,v=e.recording;if(!v)return;let S={...i,...n??{}},I=sL(S.effectiveDurationMs)??sL(S.durationMs),A={recordingStartedAt:v.startedAt,gestureClockOriginAtMs:v.gestureClockOriginAtMs,gestureClockOriginUptimeMs:v.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===v.platform?v.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:sL(S.gestureStartUptimeMs),gestureEndUptimeMs:sL(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},_="number"==typeof(s={gestureStartUptimeMs:sL(S.gestureStartUptimeMs),gestureEndUptimeMs:sL(S.gestureEndUptimeMs),reportedDurationMs:I,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===sL(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=s$(sL(t.count),1)??1,r=!0===t.doubleTap,n=s$(sL(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 s_(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...A,gestureDurationMs:_}):s_(A),x=(l=e.snapshot,w=sL((d=S).referenceWidth),g=sL(d.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:sx(l)),M=(c=t,u=r,p=S,f=b,m=_,h=x,y=sk[c],y?.(u,p,f,m,h)??[]);0!==M.length&&(v.gestureEvents.push(...M),ei({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:M.length,tMs:b,gestureDurationMs:_,kinds:M.map(e=>e.kind)}}))}let sk={click:(e,t,r,n,i)=>sP(e,t,r,i),press:(e,t,r,n,i)=>sP(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?sP(e,t,r,i):[],fill:(e,t,r,n,i)=>sE(e,t,r,i),focus:(e,t,r,n,i)=>sE(e,t,r,i),longpress:function(e,t,r,n,i){let a=sF(t,e);if(!a)return[];let{x:o,y:s}=a;return[sO(r,o,s,sq(n,[sL(t.durationMs),sL(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sU(t,e),o=sT(t.contentDirection)??sT(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:c}=a,u=sq(n,[],250),p=sL(t.amount)??sL(e[1]),f=sL(t.pixels);return[{kind:"scroll",tMs:r,x:s,y:l,x2:d,y2:c,...i,durationMs:u,contentDirection:o,...void 0!==p?{amount:p}:{},...void 0!==f?{pixels:f}:{}}]},pan:sC,fling:sC,swipe:sC,pinch:function(e,t,r,n,i){let a=sF(t,e,1),o=sL(t.scale)??sL(e[0]);if(!a||void 0===o||o<=0)return[];let{x:s,y:l}=a;return[{kind:"pinch",tMs:r,x:s,y:l,...i,scale:o,durationMs:sq(n,[],280)}]}};function sP(e,t,r,n){let i=sF(t,e);if(!i)return[];let{x:a,y:o}=i,s=s$(sL(t.count),1)??1,l=s$(sL(t.intervalMs),0)??0,d=!0===t.doubleTap,c=s$(sL(t.holdMs),1),u=[];for(let e=0;e<s;e+=1){let t=r+e*l;if(void 0!==c&&c>0){u.push(sO(t,a,o,c,n));continue}u.push(sR(t,a,o,n)),d&&u.push(sR(t+90,a,o,n))}return u}function sE(e,t,r,n){let i=sF(t,e);if(!i)return[];let{x:a,y:o}=i;return[sR(r,a,o,n)]}function sC(e,t,r,n,i){let a=sU(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,c=sq(n,[sL(t.effectiveDurationMs),sL(t.durationMs),sL(e[4])],250),u=s$(sL(t.count),1)??1,p=s$(sL(t.pauseMs),0)??0,f="ping-pong"===t.pattern?"ping-pong":"one-way";return Array.from({length:u},(e,t)=>{var n,a,u,m,h,w,g,y,v,S,I,A,_;let b,{startX:x,startY:M,endX:N,endY:D}=(n=t,a=f,u=o,m=s,h=l,w=d,"ping-pong"===a&&n%2==1?{startX:h,startY:w,endX:u,endY:m}:{startX:u,startY:m,endX:h,endY:w});return g=r+t*(c+p),y=x,v=M,S=N,I=D,A=c,"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,I,_=i))?{kind:b,tMs:g,x:y,y:v,x2:S,y2:I,..._,durationMs:A,edge:function(e,t,r){if(r){let t=.08*r.referenceWidth;if(e<=t)return"left";if(e>=r.referenceWidth-t)return"right"}return t>=e?"left":"right"}(y,S,_)}:{kind:b,tMs:g,x:y,y:v,x2:S,y2:I,..._,durationMs:A}})}function sR(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sO(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sT(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 sL(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 s$(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sF(e,t,r=0){let n=sL(e.x)??sL(t[r]),i=sL(e.y)??sL(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function sU(e,t){let r=sG(e.x1,e.x,t[0]),n=sG(e.y1,e.y,t[1]),i=sG(e.x2,t[2]),a=sG(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 sG(...e){return e.map(sL).find(e=>void 0!==e)}function sq(e,t,r){return s$(e,1)??t.map(e=>s$(e,1)).find(e=>void 0!==e)??r}let sj={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sV(e){var t,r,n,i,a,o,s;let l,d,c,u,p,{req:f,session:m,logPath:h,sessionStore:w,contextFromFlags:g}=e,y=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?sj[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:tw}}(f);if(!y.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:y.message}};let{platformCommand:v,dispatchRequest:S,recordedCommand:I}=y,A=await sH(m,v);if(A)return A;let _=await sB(m,v);if("response"in _)return _.response;let{resolvedPositionals:b,resolvedOut:x,recordedPositionals:M,recordedFlags:N}="screenshot"===(t=S).command?(d=(n=(r=t).positionals??[],i=r.meta?.cwd,(l=n[0])?[t0.expandHome(l,i),...n.slice(1)]:n),u=(c=(a=r.flags?.out,o=r.meta?.cwd,a?t0.expandHome(a,o):a))?{...r.flags??{},out:c}:r.flags??{},{resolvedPositionals:d,resolvedOut:c,recordedPositionals:d,recordedFlags:u}):{resolvedPositionals:p=(s=t).positionals??[],resolvedOut:s.flags?.out,recordedPositionals:p,recordedFlags:s.flags??{}},D=Date.now(),k={...g(f.flags,m.appBundleId,m.trace?.outPath),surface:m.surface},P=await sK({session:m,sessionName:e.sessionName,logPath:h,command:v,request:S,positionals:b,out:x,dispatchContext:k}),E=await sB(m,v,"after-command");if("response"in E)return E.response;"status"in _&&"recovered"===_.status&&(!P||"object"==typeof P)&&((P??={}).warning=_.warning);let C=Date.now(),R=I===v?M:f.positionals??[],O=I===v?N:f.flags??{};return function(e){let{session:t,sessionStore:r,command:n,recordedCommand:i,resolvedPositionals:a,recordedPositionals:o,recordedFlags:s,data:l,actionStartedAt:d,actionFinishedAt:c,flags:u}=e,p=function(e,t,r,n){if("scroll"!==t)return n;let i=sx(e.snapshot),a={...n??{}},o=sT(a.direction)??sT(r[0]);if(!o)return n;let s=sL(a.amount)??sL(r[1]),l=sL(a.pixels),d=sU(a,[]),c=sL(a.referenceWidth),u=sL(a.referenceHeight),p=void 0!==c&&c>0&&void 0!==u&&u>0?{referenceWidth:c,referenceHeight:u}:i??sN;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=Z({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);sD(t,n,a,p,u,d,c),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:v,recordedCommand:I,resolvedPositionals:b,recordedPositionals:R,recordedFlags:O,data:P,actionStartedAt:D,actionFinishedAt:C,flags:f.flags??{}}),ab(v)&&aI(m,v),aT(m,v,b,f.flags),{ok:!0,data:P??{}}}async function sB(e,t,r="before-command"){if("android"!==e.device.platform||np(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await oX({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:eN(e)}}}}async function sH(e,t){if(!ib(t,e.device)){var r;let n=(r=e.device,i_[t]?.unsupportedHint?.(r));return{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:`${t} is not supported on this device`,...n?{hint:n}:{}}}}return"android"===e.device.platform&&e.recording&&"record"!==t&&"failed"===(await oz({session:e})).status?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function sK(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await it(r.device,n,a,o,{...s});let l=await oh({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 sW(r,l,e.logPath),l}async function sW(e,t,r){let n={snapshotInteractiveOnly:!0},i=ol(await ot({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);of(e,i);let a=await ss({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let sz=s7(()=>import("./lease.js")),sX=s7(()=>import("./session.js").then(e=>e.session_namespaceObject)),sJ=s7(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),sZ=s7(()=>import("./react-native.js")),sY=s7(()=>import("./record-trace.js")),sQ=s7(()=>import("./find.js")),s0=s7(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function s1(e){var t;switch(t=e.req.command,np(t)?.route??"generic"){case"lease":return await s2(e);case"session":return await s3(e);case"snapshot":return await s5(e);case"reactNative":return await s4(e);case"recordTrace":return await s8(e);case"find":return await s6(e);case"interaction":return await s9(e);case"generic":return null}}async function s2(e){let{handleLeaseCommands:t}=await sz();return le(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function s3(e){let{handleSessionCommands:t}=await sX();return le(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 s5(e){let{handleSnapshotCommands:t}=await sJ();return le(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function s4(e){let{handleReactNativeCommands:t}=await sZ();return le(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function s8(e){let{handleRecordTraceCommands:t}=await sY();return le(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function s6(e){let{handleFindCommands:t}=await sQ();return le(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function s9(e){let{handleInteractionCommands:t}=await s0();return le(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function s7(e){let t;return()=>t??=e()}function le(e,t,r){if(r)return r;throw new eD("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let lt=new h;async function lr(e,t,r){let n=lt.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>lt.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function ln(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function li(e,t){var r,n,i,a;let o,s,l,d,c,u;return e.recording?(r=e,n=t,o=eq(r.name),s=`agent-device close --session ${o}`,l=`agent-device record stop --session ${o}`,d="selector-conflict"===n?`To keep using this device, rerun the command with --session ${o} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${o} for commands that should attach to the recording session.`,`Recording session "${r.name}" owns this device. Run ${l}; if the session still appears in agent-device session list, run ${s}. ${d} Run agent-device session list to inspect active sessions.`):(i=e,a=t,c=eq(i.name),u=`agent-device close --session ${c}`,"selector-conflict"===a?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${c} and remove conflicting device selectors. To switch devices, first run ${u}, then open the desired device with a different --session name.`:`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${c}. To open a new session on this device, first run ${u}.`)}function la(e,t){if(!t)return[];let r=[],n=e.device,i=e0(t.platform);if(i&&!eJ(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=to(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function lo(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 ls="default";function ll(e){return e.session||ls}function ld(e){if(e.meta?.sessionExplicit===!0||(e.session||ls)!==ls||e.meta?.sessionIsolation==="tenant"||e.flags?.sessionIsolation==="tenant")return;let t=function(e){if(!e||0===e.trim().length)return;let t=function(e){let t=i.resolve(e);try{return a.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(a.existsSync(i.join(t,".git")))return t;let e=i.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(t){var n;return{kind:"cwd",id:(n=t,r.createHash("sha256").update(n).digest("hex").slice(0,16))}}}function lc(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function lu(e,t){let r=ld(e);return!!r&&!!t.sessionScope&&!lc(t,r)}function lp(e){return{tenantId:e.meta?.tenantId??e.flags?.tenant,runId:e.meta?.runId??e.flags?.runId,leaseId:e.meta?.leaseId??e.flags?.leaseId,leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend}}function lf(e,t){var r,n,i,a,o,s,l,d,c,u,p;let f,m,h,w=e.meta?.lockPolicy;if(!w)return e;let g={...e.flags??{}},y=(r=e.command,np(r)?.lockPolicySelectorOverride===!0),v=y?[]:t?la(t,g):(n=g,i=e.meta?.lockPlatform,f=[],m=e0(i),void 0!==n.platform&&m&&(a=e0(n.platform),o=m,a&&o&&a!==o&&("apple"===a?!eY(o):"apple"!==o||!eY(a)))&&f.push({key:"platform",value:n.platform}),m&&(s=f,l=n,d=m,(h=l.target)&&function(e,t){switch(t){case"android":case"ios":return"desktop"===e;case"macos":case"linux":return"desktop"!==e;case"apple":return!1;default:return lh(t)}}(h,d)&&s.push({key:"target",value:h}),function(e,t,r){for(let n of function(e,t){switch(e){case"android":return["udid","iosSimulatorDeviceSet"];case"ios":return["serial","androidDeviceAllowlist"];case"apple":var r;return"desktop"===(r=t).target||"macos"===e0(r.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return lh(e)}}(r,t)){let r=t[n];na(r)&&e.push({key:n,value:r})}}(f,n,m)),f),S=e.meta?.lockPlatform;if(0===v.length){return c=y,u=t,p=g,!S||u||void 0!==p.platform||c&&no(p,ni)||(g.platform=S),{...e,flags:g}}if("strip"===w)return function(e,t,r,n){if(n){lm(e,t),e.platform=n.device.platform;return}lm(e,t),r&&void 0===e.platform&&(e.platform=r)}(g,v,S,t),{...e,flags:g};throw new eD("INVALID_ARGS",function(e,t,r){let n=t.map(lo).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${ln(r)}, but this request selected ${n}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:"";return`${e.command} is using a bound-session lock${a}, but this request selected ${n}.`}(e,v,t),{session:e.session,conflicts:v.map(lo),hint:function(e,t){if(t)return li(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${eq(e.session)}`:"";return"Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. "+(r?`Run agent-device open <app>${n} --platform ${r} first if no session is active. `:`Run agent-device open <app>${n} first if no session is active. `)+"Run agent-device session list to inspect active sessions."}(e,t)})}function lm(e,t){for(let r of t)delete e[r.key]}function lh(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function lw(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[lg(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return lf(e)}catch{return e}}(n);if("open"===(r=l).command||no(r.flags,nn))try{let e=await r4(l.flags??{});s.add(lg(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=ly(e)-ly(t);return 0!==r?r:e.localeCompare(t)})}function lg(e){return`device:${e}`}function ly(e){return+!e.startsWith("session:")}function lv(e,t={}){let r=e8(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function lS(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:lv(t,{simulatorSetPath:e.simulatorSetPath})}function lI(e,t,r){return iF(lS(e,t),r)}let lA="If runner build products look stale or corrupted, run `pnpm clean:xcuitest` in a local checkout, or remove ~/.agent-device/ios-runner/derived, then retry.";function l_(e){if(!(e instanceof eD)||"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 lb(e){return!(e instanceof eD)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lx(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new eD("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:tr({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:ti("IOS_RUNNER_CONNECT_TIMEOUT")})}async function lM(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=tr({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new eD("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}
|
|
9
8
|
${t}
|
|
10
|
-
${n}`.toLowerCase()).includes("device is busy")&&r.includes("connecting")?"Target iOS device is still connecting. Keep it unlocked, wait for device trust/connection to settle, then retry.":`${eu("IOS_RUNNER_CONNECT_TIMEOUT")} ${lS}`)})}function lx(e){return"interactionFrame"===e||"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function lN(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${n.randomUUID()}`}}function lM(e){if(ni(e))throw no()}let lE=new Map;async function lD(e,t,n,r,i=45e3,a,o){let s=eo.fromTimeoutMs(i),{getEndpoints:l}=lL(e,t),{endpoints:c}=await l(s.remainingMs()),d=null,u=Math.max(1,Math.ceil(i/250));try{return await em(async({deadline:s})=>{let u=await lk({device:e,port:t,command:n,timeoutMs:i,logPath:r,session:a,endpoints:c,getEndpoints:l,signal:o,attemptDeadline:s,setEndpoints:e=>{c=e},setLastError:e=>{d=e}});if(u)return u;throw function(e){if(e.signal?.aborted)throw no();return new F("COMMAND_FAILED","Runner endpoint probe failed",{port:e.port,endpoints:e.endpoints,lastError:e.lastError?String(e.lastError):void 0})}({port:t,endpoints:c,lastError:d,signal:o})},{maxAttempts:u,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:lI},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||nl(e))throw no();d||(d=e)}if(o?.aborted)throw no();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw lb({port:t,endpoints:c,logPath:r,lastError:d});let a=await lj(e,t,n,i,o);return new Response(a.body,{status:a.status})}throw lb({port:t,endpoints:c,logPath:r,lastError:d})}async function lk(e){await lP(e);let t=await lC(e);if(t.response)return t.response;let n=await lR(e);return n||await lT(e,t.usedCachedTunnelIp)}async function lP(e){if(e.attemptDeadline?.isExpired())throw new F("COMMAND_FAILED","Runner connection deadline exceeded",{port:e.port,timeoutMs:e.timeoutMs});if(e.session?.child.exitCode!==null&&e.session?.child.exitCode!==void 0)throw await lA({session:e.session,port:e.port,logPath:e.logPath})}async function lC(e){let t=e.endpoints,n=!1;if("device"===e.device.kind){let r=await e.getEndpoints(e.attemptDeadline?.remainingMs());t=r.endpoints,n=r.cached,e.setEndpoints(t)}let r=n?t[0]:null;return{response:await l$(t,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,n)=>{var i;e.setLastError(n),"device"===e.device.kind&&t===r&&(i=e.device.id,lE.delete(i))}}),usedCachedTunnelIp:n}}async function lR(e){return"simulator"===e.device.kind&&e.session?.ready?await lF(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function lT(e,t){var n;if("device"!==e.device.kind||!t)return null;n=e.device.id,lE.delete(n);let r=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(r.endpoints),await l$(r.endpoints,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,n)=>{e.setLastError(n)}})}async function lO(e,t,n,r=45e3,i){if(i?.aborted)throw no();let a=eo.fromTimeoutMs(r),{getEndpoints:o}=lL(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new F("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let c=a.remainingMs();if(c<=0)throw new F("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:r});return await lG(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)},c,i)}function lL(e,t){let n;return{getEndpoints:async(r,i=!1)=>{var a,o,s;let l,c=await lU({device:e,timeoutBudgetMs:r,forceRefresh:i,requestTunnelIp:n,setRequestTunnelIp:e=>{n=e}});return{endpoints:(a=e,o=t,s=c.ip,l=[`http://127.0.0.1:${o}/command`],"device"!==a.kind||s&&l.unshift(`http://[${s}]:${o}/command`),l),cached:c.sharedCacheHit}}}}async function l$(e,t){let{command:n,port:r,timeoutMs:i,signal:a,attemptDeadline:o,onError:s}=t;for(let t of e)try{let e=o?.remainingMs()??i;if(e<=0)throw new F("COMMAND_FAILED","Runner connection deadline exceeded",{port:r,timeoutMs:i});return await lG(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||nl(e))throw no();s(t,e)}return null}async function lF(e,t,n,r){let{signal:i,attemptDeadline:a,onError:o}=r,s=a?.remainingMs()??45e3;if(s<=0)return null;try{let r=await lj(e,t,n,s,i);return new Response(r.body,{status:r.status})}catch(e){if(i?.aborted||nl(e))throw no();return o(e),null}}async function lU(e){var t,n,r;let{device:i,timeoutBudgetMs:a,forceRefresh:o,requestTunnelIp:s,setRequestTunnelIp:l}=e;if("device"!==i.kind)return{ip:null,sharedCacheHit:!1};if(!o){let e,n=(t=i.id,(e=lE.get(t))?e.expiresAt<=Date.now()?(lE.delete(t),null):e.ip:null);if(n)return{ip:n,sharedCacheHit:!0};if(void 0!==s)return{ip:s,sharedCacheHit:!1}}let c=await lq(i.id,a);return l(c),c&&(n=i.id,r=c,lE.set(n,{ip:r,expiresAt:Date.now()+3e4})),{ip:c,sharedCacheHit:!1}}async function lG(e,t,n,r){let i=AbortSignal.timeout(n),a=r?AbortSignal.any([r,i]):i;return await fetch(e,{...t,signal:a})}async function lq(e,t){if("number"==typeof t&&t<=0)return null;let n="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,r=i.join(u.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(n/1e3)),i=await iO(["devicectl","device","info","details","--device",e,"--json-output",r,"--timeout",String(t)],{allowFailure:!0,timeoutMs:n});if(0!==i.exitCode||!a.existsSync(r))return null;let o=JSON.parse(a.readFileSync(r,"utf8"));if(o.info?.outcome&&"success"!==o.info.outcome)return null;let s=(o.result?.connectionProperties?.tunnelIPAddress??o.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{lW(r)}}async function lj(e,t,n,r,i){let a=JSON.stringify(n),o=lv(e,["spawn",e.id,"/usr/bin/curl","-s","-X","POST","-H","Content-Type: application/json","--data",a,`http://127.0.0.1:${t}/command`]),s=await iO(o,{allowFailure:!0,timeoutMs:r,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=ec({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new F("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:eu(e)})}return{status:200,body:l}}async function lV(){return await new Promise((e,t)=>{let n=g.createServer();n.listen(0,"127.0.0.1",()=>{let r=n.address();if("object"==typeof r&&r?.port){let t=r.port;n.close(()=>e(t))}else n.close(()=>t(new F("COMMAND_FAILED","Failed to allocate port")))}),n.on("error",t)})}function lB(e,t,n,r){t&&lK(t,e),n&&lK(n,e),r&&process.stderr.write(e)}let lH=new Map;function lK(e,t){let n=(lH.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await a.promises.mkdir(i.dirname(e),{recursive:!0}),await a.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{lH.get(e)===n&&lH.delete(e)});lH.set(e,n)}function lW(e){try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}async function lz(e){let{lockDirPath:t,owner:n}=e,r=i.join(t,"owner.json"),o=Date.now()+(e.timeoutMs??3e4),s=e.pollMs??100,l=e.ownerGraceMs??5e3,c=e.description??"process lock";for(a.mkdirSync(i.dirname(t),{recursive:!0});Date.now()<o;)try{a.mkdirSync(t),function(e,t){let n=`${e}.${process.pid}.${Date.now()}.tmp`;a.writeFileSync(n,JSON.stringify(t),"utf8"),a.renameSync(n,e)}(r,n);let e=!1;return async()=>{e||(e=!0,a.rmSync(t,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,t,n){let r=null;try{r=a.statSync(e)}catch{return!0}let i=lJ(t);if(i){var o;return!(Number.isInteger((o=i).pid)&&!(o.pid<=0)&&T(o.pid)&&(!o.startTime||D(o.pid)===o.startTime))&&(a.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-r.mtimeMs<n)&&(a.rmSync(e,{recursive:!0,force:!0}),!0)}(t,r,l))continue;await ez(s)}throw new F("COMMAND_FAILED",`Timed out waiting for ${c}`,{lockDirPath:t,...function(e,t){let n,r=Date.now(),i=lJ(t);try{n=Math.max(0,Math.round(r-a.statSync(e).mtimeMs))}catch{}return{...void 0!==n?{lockAgeMs:n}:{},...i?{ownerPid:i.pid,ownerStartTime:i.startTime,ownerAgeMs:Math.max(0,Math.round(r-i.acquiredAtMs))}:{}}}(t,r)})}function lJ(e){try{return JSON.parse(a.readFileSync(e,"utf8"))}catch{return null}}let lX=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function lZ(e,t,n){if("macos"!==e.platform)return;if(0===t.length)throw new F("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",xctestrunPath:n});let r=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of r)if(!a.existsSync(e))throw new F("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:n});for(let e of r)if(!await lY(e)){await iT("codesign",["--remove-signature",e],{allowFailure:!0});try{await iT("codesign",["--force","--sign","-",e])}catch(r){let t=r instanceof F?r:new F("COMMAND_FAILED",String(r));throw new F("COMMAND_FAILED","Failed to repair macOS runner product signature",{reason:"RUNNER_PRODUCT_REPAIR_FAILED",productPath:e,xctestrunPath:n,error:t.message,details:t.details})}}}async function lY(e){return 0===(await iT("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let lQ=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),l0=new Set([" "," ","\n","\r"]),l1=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function l2(e,t={}){let n=t.maxDocumentChars??0x8000000;if(e.length>n)throw Error(`XML document exceeds maximum supported size of ${n} characters.`);return new l4(e).parse()}function l3(e,t){for(let n of e){if("dict"===n.name)for(let e=0;e<n.children.length-1;e+=1){let r=n.children[e],i=n.children[e+1];r?.name==="key"&&r.text&&i&&t(r.text,i)}l3(n.children,t)}}class l4{roots=[];stack=[];index=0;xml;constructor(e){this.xml=e}parse(){for(this.skipByteOrderMark();this.index<this.xml.length;)this.readNextToken();return this.assertFullyClosed(),this.roots}readNextToken(){"<"!==this.xml[this.index]?this.readText():this.resolveMarkupReader()()}resolveMarkupReader(){return this.startsWith("\x3c!--")?()=>this.skipUntil("--\x3e","Comment is not closed."):this.startsWith("<?")?()=>this.skipUntil("?>","Processing instruction is not closed."):this.startsWith("<![CDATA[")?()=>this.readCdata():this.startsWith("<!")?()=>this.skipDeclaration():this.startsWith("</")?()=>this.readClosingTag():()=>this.readOpeningTag()}assertFullyClosed(){if(this.stack.length>0){let e=this.stack[this.stack.length-1];throw Error(`Unclosed XML tag <${e?.name??"unknown"}>.`)}}skipByteOrderMark(){65279===this.xml.charCodeAt(0)&&(this.index=1)}readOpeningTag(){this.index+=1,this.skipWhitespace();let e=this.readRequiredName(`Missing XML tag name at offset ${this.index}.`),{attributes:t,selfClosing:n}=this.readOpeningTagBody(),r={name:e,attributes:t,text:null,children:[]};this.addNode(r),n||this.pushOpenNode(r)}readOpeningTagBody(){let e={};for(;;){this.skipWhitespace();let t=this.readOpeningTagEnd();if(t)return{attributes:e,selfClosing:"self-closing"===t};let n=this.readAttribute();e[n.name]=n.value}}readOpeningTagEnd(){if(this.index>=this.xml.length)throw Error("Opening XML tag is not closed.");return">"===this.xml[this.index]?(this.index+=1,"open"):"/"===this.xml[this.index]&&">"===this.xml[this.index+1]?(this.index+=2,"self-closing"):null}readAttribute(){let e=this.readRequiredName(`Invalid XML attribute at offset ${this.index}.`);if(function(e){if(l1.has(e))throw Error(`Unsupported XML attribute name "${e}".`)}(e),this.skipWhitespace(),"="!==this.xml[this.index])throw Error(`Missing value for XML attribute "${e}".`);return this.index+=1,this.skipWhitespace(),{name:e,value:this.readAttributeValue(e)}}pushOpenNode(e){if(this.stack.length>=256)throw Error("Maximum XML nesting depth of 256 exceeded.");this.stack.push(e)}readClosingTag(){this.index+=2,this.skipWhitespace();let e=this.readName();if(this.skipWhitespace(),">"!==this.xml[this.index])throw Error(`Closing XML tag </${e}> is not closed.`);this.index+=1;let t=this.stack.pop();if(!t)throw Error(`Unexpected closing XML tag </${e}>.`);if(t.name!==e)throw Error(`Expected </${t.name}> before </${e}>.`)}readText(){let e=this.xml.indexOf("<",this.index),t=-1===e?this.xml.length:e;this.appendText(this.xml.slice(this.index,t),!0),this.index=t}readCdata(){let e=this.index+9,t=this.xml.indexOf("]]>",e);if(-1===t)throw Error("CDATA section is not closed.");this.appendText(this.xml.slice(e,t),!1),this.index=t+3}appendText(e,t){let n=e.trim();if(!n)return;let r=this.stack[this.stack.length-1];r&&(r.text=`${r.text??""}${t?l5(n):n}`)}addNode(e){let t=this.stack[this.stack.length-1];t?t.children.push(e):this.roots.push(e)}readName(){var e;let t=this.index;for(;this.index<this.xml.length&&void 0!==(e=this.xml[this.index])&&lQ.has(e);)this.index+=1;return this.xml.slice(t,this.index)}readRequiredName(e){let t=this.readName();if(!t)throw Error(e);return t}readAttributeValue(e){let t=this.xml[this.index];if('"'!==t&&"'"!==t)throw Error(`XML attribute "${e}" must use a quoted value.`);this.index+=1;let n=this.index,r=this.xml.indexOf(t,n);if(-1===r)throw Error(`XML attribute "${e}" is not closed.`);return this.index=r+1,l5(this.xml.slice(n,r).trim())}skipDeclaration(){let e={quote:null,bracketDepth:0};for(let t=this.index+2;t<this.xml.length;t+=1)if(function(e,t){var n,r,i;return!(void 0===t||(n=e,r=t,n.quote?(r===n.quote&&(n.quote=null),!0):('"'===r||"'"===r)&&(n.quote=r,!0)))&&(function(e,t){if("["===t){e.bracketDepth+=1;return}"]"===t&&e.bracketDepth>0&&(e.bracketDepth-=1)}(e,t),i=e,">"===t&&0===i.bracketDepth)}(e,this.xml[t])){this.index=t+1;return}throw Error("XML declaration is not closed.")}skipUntil(e,t){let n=this.xml.indexOf(e,this.index+e.length);if(-1===n)throw Error(t);this.index=n+e.length}skipWhitespace(){for(var e;this.index<this.xml.length&&void 0!==(e=this.xml[this.index])&&l0.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function l5(e){return e.replace(/&(#x[0-9a-fA-F]+|#[0-9]+|amp|lt|gt|quot|apos);/g,(e,t)=>{switch(t){case"amp":return"&";case"lt":return"<";case"gt":return">";case"quot":return'"';case"apos":return"'";default:var n=e,r=t;let i=r.startsWith("#x")?Number.parseInt(r.slice(2),16):Number(r.slice(1));if(!Number.isInteger(i)||i<0||i>1114111)return n;try{return String.fromCodePoint(i)}catch{return n}}})}let l8=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function l6(e){var t;let n=await l9(e);if(!n||0===n.length)return null;let r=i.dirname(e),o=new Set,s=function(e,t){let n=[],r=new Set,a=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){a.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);n.push(i.join(t,e));let s=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(e);s&&r.add(i.join(t,s))}return{testRootPaths:n,hostRoots:Array.from(r),hostRelativePaths:a}}(n,r);for(let e of s.testRootPaths){if(!a.existsSync(e))return null;o.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let n=t.hostRoots.find(t=>a.existsSync(i.join(t,e)));return n?i.join(n,e):null})){if(!e)return null;o.add(e)}return Array.from(o)}async function l9(e){let t=await iL(e);if(t){var n,r,i,o=t;let e=new Set;for(let t of[i=o,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!l7(e))continue;let t=e.TestTargets;Array.isArray(t)&&n.push(...t.filter(l7))}return n}(i),...Object.values(i).filter(e=>l7(e)&&"TestBundlePath"in e)])for(let n of function(e){let t=new Set;for(let[n,r]of Object.entries(e))if(l8.has(n)){if("string"==typeof r){t.add(r);continue}if(Array.isArray(r))for(let e of r)"string"==typeof e&&t.add(e)}return Array.from(t)}(t))e.add(n);return Array.from(e)}if("darwin"===process.platform)return null;try{let t;return n=a.readFileSync(e,"utf8"),r=l2(n),t=new Set,l3(r,(e,n)=>{if(l8.has(e)){if("string"===n.name&&n.text)return void t.add(n.text);if("array"===n.name)for(let e of n.children)"string"===e.name&&e.text&&t.add(e.text)}}),Array.from(t)}catch{return null}}function l7(e){return!!e&&"object"==typeof e}let ce=["CFBundleIcons","CFBundleIcons~ipad"];async function ct(e){let t=e.filter(co);if(0===t.length)return;let n=e.filter(e=>cl(e)&&!cs(e));for(let e of t){let t=function(e,t){let n=i.dirname(e);return t.find(e=>i.dirname(e)===n&&"AgentDeviceRunner.app"===i.basename(e))??t.find(t=>i.dirname(t)===n&&t!==e)??null}(e,n);t&&await cn(t,e)}}async function cn(e,t){var n;let r,o=function(e,t){let n=!1;for(let o of a.readdirSync(e,{withFileTypes:!0})){var r;if(o.isFile()&&(r=o.name,/^AppIcon.*\.png$/.test(r)||"Assets.car"===r))(function(e,t){if(a.existsSync(t)){let n=a.readFileSync(e),r=a.readFileSync(t);return!n.equals(r)&&(a.copyFileSync(e,t),!0)}return a.copyFileSync(e,t),!0})(i.join(e,o.name),i.join(t,o.name))&&(n=!0)}return n}(e,t),s=await cr(e,t);(o||s)&&(await ca(t),n=t,r=new Date,a.utimesSync(n,r,r))}async function cr(e,t){var n,r;let a=i.join(e,"Info.plist"),o=i.join(t,"Info.plist"),s=await iL(a),l=await iL(o);if(!s||!l)return!1;let c=(n=s,r=l,ce.flatMap(e=>{let t=n[e];return void 0===t||JSON.stringify(r[e])===JSON.stringify(t)?[]:[{key:e,value:t,shouldInsert:void 0===r[e]}]}));if(0===c.length)return!1;for(let e of c)await ci(o,e.key,e.value,e.shouldInsert);return!0}async function ci(e,t,n,r){let i=await iT("plutil",[r?"-insert":"-replace",t,"-json",JSON.stringify(n),e],{allowFailure:!0});if(0!==i.exitCode)throw new F("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function ca(e){let t=await iT("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new F("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function co(e){return cl(e)&&cs(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function cs(e){return i.basename(e).endsWith("-Runner.app")}function cl(e){return i.basename(e).endsWith(".app")}let cc={iOS:{sdkName:{simulator:"iphonesimulator",device:"iphoneos"},derivedBaseName:{simulator:"ios-simulator",device:"ios-device"},xctestrunHints:{simulator:{preferred:["iphonesimulator"],disallowed:["iphoneos","appletvos","appletvsimulator","macos"]},device:{preferred:["iphoneos"],disallowed:["iphonesimulator","appletvos","appletvsimulator","macos"]}}},tvOS:{sdkName:{simulator:"appletvsimulator",device:"appletvos"},derivedBaseName:{simulator:"tvos-simulator",device:"tvos-device"},xctestrunHints:{simulator:{preferred:["appletvsimulator"],disallowed:["appletvos","iphoneos","iphonesimulator","macos"]},device:{preferred:["appletvos"],disallowed:["appletvsimulator","iphoneos","iphonesimulator","macos"]}}},macOS:{sdkName:{simulator:"macosx",device:"macosx"},derivedBaseName:{simulator:"macos",device:"macos"},xctestrunHints:{simulator:{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]},device:{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]}}}};function cd(e){var t;if("ios"!==e.platform&&"macos"!==e.platform)throw new F("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":"macos"===(t=e.target)||"desktop"===t?"macOS":"tv"===t?"tvOS":"iOS"}function cu(e){return"simulator"===e?"simulator":"device"}function cp(){return"arm64"===process.arch?"arm64":"x86_64"}let cf="XCTestDevices",cm=".agent-device-backup",ch=".agent-device-xctestdevices-backup-",cw=i.join(u.homedir(),".agent-device","ios-runner"),cg=".agent-device-runner-cache.json",cv={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},cy=new Map,cS=new Set,c_=new Map,cI=new Set;function cb(e){return e?.trim()??""}function cA(e=process.env){return cb(e.AGENT_DEVICE_IOS_BUNDLE_ID)||cb(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function cx(e=process.env){let t=cb(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${cA(e)}.uitests`}let cN=function(e=process.env){let t=cA(e),n=cx(e);return Array.from(new Set([cb(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${n}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function cM(e=u.homedir()){return i.join(e,"Library","Developer","XCTestDevices")}async function cE(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let n=er(e.simulatorSetPath);if(!n)return null;let r=i.resolve(n),o=i.resolve(t.xctestDeviceSetPath??cM()),s=i.resolve(t.backupPath??function(e=cM()){return`${e}${cm}`}(o)),l=i.resolve(t.lockDirPath??function(e=u.homedir()){return i.join(e,".agent-device","xctest-device-set.lock")}()),c=t.ownerStartTime??D(process.pid),d=await cP({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:c,acquiredAtMs:t.nowMs??Date.now()}});try{if(cD({xctestDeviceSetPath:o,backupPath:s}),function(e,t){if(i.resolve(e)===i.resolve(t))return!0;try{return a.realpathSync.native(e)===a.realpathSync.native(t)}catch{return!1}}(r,o))return await d(),null;a.mkdirSync(r,{recursive:!0}),a.existsSync(o)&&a.renameSync(o,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:n}=e,r=i.dirname(n),o=i.join(r,`${cf}.agent-device-link-${process.pid}-${Date.now()}`);a.mkdirSync(r,{recursive:!0});try{a.symlinkSync(t,o,"dir"),a.renameSync(o,n)}catch(e){throw a.existsSync(o)&&ck(o),e}}({requestedSetPath:r,xctestDeviceSetPath:o})}catch(e){throw cD({xctestDeviceSetPath:o,backupPath:s}),await d(),new F("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:r,xctestDeviceSetPath:o,backupPath:s,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{cD({xctestDeviceSetPath:o,backupPath:s})}finally{await d()}}}}}function cD(e){let{xctestDeviceSetPath:t,backupPath:n}=e,r=[n,...function(e){let t=i.dirname(e),n=i.basename(e).replace(cm,""),r=n===cf?ch:`${n}${ch}`;try{return a.readdirSync(t).filter(e=>e.startsWith(r)).sort().map(e=>i.join(t,e))}catch{return[]}}(n)],o=r.find(e=>a.existsSync(e)),s=a.existsSync(t)&&a.lstatSync(t).isSymbolicLink();if(o){if(s&&ck(t),a.existsSync(t))if(!s)return void E({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:o}});else o!==n?a.rmSync(o,{recursive:!0,force:!0}):a.rmSync(n,{recursive:!0,force:!0});else a.mkdirSync(i.dirname(t),{recursive:!0}),a.renameSync(o,t);for(let e of r)e!==o&&a.existsSync(e)&&a.rmSync(e,{recursive:!0,force:!0});return}s&&(E({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),ck(t))}function ck(e){!a.existsSync(e)||a.lstatSync(e).isSymbolicLink()&&a.unlinkSync(e)}async function cP(e){return await lz({lockDirPath:e.lockDirPath,owner:e.owner,timeoutMs:e.timeoutMs??3e4,pollMs:e.pollMs??100,ownerGraceMs:5e3,description:e.description??"XCTest device set lock"})}async function cC(e){var t;return await cP({lockDirPath:(t=e,i.join(i.dirname(t),`${i.basename(t)}.lock`)),owner:{pid:process.pid,startTime:D(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function cR(e,t){let n=tn(),r=cG(e,n),i=c6(e,r);return await le(cy,i,async()=>{let a=await cC(i);try{return await cT({device:e,options:t,projectRoot:n,expectedCacheMetadata:r,derived:i,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await a()}})}async function cT(e){var t,n;let{device:r,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,n=e.forceRebuild,(es(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||n||cS.has(t))&&(di("clean",n?"forced_rebuild":"forced_clean",{derived:t}),dn(t),cF(t),cS.delete(t));let l=await dr({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>cY(e,r),xctestrunReferencesProjectRoot:c0,resolveExistingXctestrunProductPaths:l6}),c="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&di("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let d=await cO({device:r,derived:s,expectedCacheMetadata:o,existing:l,cache:c});return d||(l.xctestrunPath&&(dn(s),cF(s)),await cL({device:r,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:c,reason:l.reason}))}async function cO(e){let{device:t,derived:n,expectedCacheMetadata:r,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await c$(t,n,r,i);return o?{xctestrunPath:o,derived:n,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function cL(e){let{device:t,options:n,projectRoot:r,expectedCacheMetadata:o,derived:s,cache:l,reason:c}=e,d=i.join(r,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!a.existsSync(d))throw new F("COMMAND_FAILED","iOS runner project not found",{projectPath:d});let u=Date.now();await c8(t,d,s,n);let p=Math.max(0,Date.now()-u),f=cY(s,t);if(!f)throw new F("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await l6(f);if(!m)throw new F("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await lZ(t,m,f),await ct(m),cj(s,cK(o,f,m)),di("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:c}}async function c$(e,t,n,r){try{var i,a,o,s;return await lZ(e,r.productPaths,r.xctestrunPath),di("reuse","reuse_ready",{derived:t,xctestrunPath:r.xctestrunPath}),i=t,a=n,o=r.xctestrunPath,s=r.productPaths,cj(i,cK(a,o,s)),r.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof F))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&lX.has(t)}(e))throw e;return di("rebuild","repair_failed",{derived:t,xctestrunPath:r.xctestrunPath}),null}}function cF(e){try{if(!a.existsSync(e))return;if("derived"!==i.basename(e))return void a.rmSync(e,{recursive:!0,force:!0});for(let n of a.readdirSync(e,{withFileTypes:!0})){var t;t=n.name,cU.has(t)&&a.rmSync(i.join(e,n.name),{recursive:!0,force:!0})}}catch{}}let cU=new Set([cg,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function cG(e,t=tn()){let r,o=cd(e);return{schemaVersion:2,packageVersion:tt(),runnerSourceFingerprint:function(e){let t=i.join(e,"ios-runner","AgentDeviceRunner"),r=function(e){if(!a.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop();for(let s of a.readdirSync(e,{withFileTypes:!0})){var r,o;let a=i.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;n.push(a);continue}s.isFile()&&(r=s.name,o=a,"project.pbxproj"===r?o.includes(`${i.sep}.xcodeproj${i.sep}`):[".jpg",".json",".png",".swift",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(i.extname(r)))&&t.push(a)}}return t.sort((e,t)=>e.localeCompare(t))}(t),o=function(e,t){let r=n.createHash("sha256");for(let n of t){let t=i.relative(e,n),o=a.statSync(n);r.update(t),r.update("\0"),r.update(String(o.size)),r.update("\0"),r.update(String(Math.trunc(o.mtimeMs))),r.update("\0")}return r.digest("hex")}(t,r),s=cZ.get(t);if(s?.fileStatsFingerprint===o)return s.sourceFingerprint;let l=n.createHash("sha256");for(let e of r){let n=i.relative(t,e);l.update(n),l.update("\0"),l.update(a.readFileSync(e)),l.update("\0")}let c=l.digest("hex");return cZ.set(t,{fileStatsFingerprint:o,sourceFingerprint:c}),c}(t),...function(e,t){var n;let r=(n=cq("xcodebuild",["-version"]),{version:n.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:n.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=cc[e].sdkName[cu(t)];return{xcodeVersion:r.version,xcodeBuildVersion:r.buildVersion,sdkName:i,sdkVersion:cq("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:cq("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(o,e.kind),platformName:o,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(r=cd(e))?`platform=macOS,arch=${cp()}`:"simulator"===e.kind?`generic/platform=${r} Simulator`:`generic/platform=${r}`,runnerBundleBuildSettings:de(process.env),runnerSigningBuildSettings:c7(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:dt()}}function cq(e,t){let n=JSON.stringify([e,t]),r=c_.get(n);if(void 0!==r)return r;try{let r=j(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===r.exitCode&&r.stdout.trim()||"unknown";return c_.set(n,i),i}catch{return c_.set(n,"unknown"),"unknown"}}function cj(e,t){a.mkdirSync(e,{recursive:!0}),a.writeFileSync(i.join(e,cg),`${JSON.stringify(t,null,2)}
|
|
11
|
-
`)}async function
|
|
12
|
-
${e}`.toLowerCase()).includes("failed registering bundle identifier")||t.includes("app identifier")&&t.includes("not available")?"Set AGENT_DEVICE_IOS_BUNDLE_ID to a unique reverse-DNS value (for example, com.yourname.agentdevice.runner), then retry.":t.includes("requires a development team")?"Configure signing in Xcode or set AGENT_DEVICE_IOS_TEAM_ID for physical-device runs.":t.includes("no profiles for")||t.includes("provisioning profile")?"Install/select a valid iOS provisioning profile, or set AGENT_DEVICE_IOS_PROVISIONING_PROFILE.":t.includes("code signing")?"Enable Automatic Signing in Xcode or provide AGENT_DEVICE_IOS_TEAM_ID and optional AGENT_DEVICE_IOS_SIGNING_IDENTITY.":void 0)??lS);throw new F("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:n.message,details:n.details,logPath:r.logPath,hint:i})}finally{await l?.release()}}function c6(e,t){let r,a=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(a)return i.resolve(a);let o=(r=n.createHash("sha256").update(cH(cB(t))).digest("hex"),`cache-${r.slice(0,16)}`),s=function(e){return i.join(cw,"derived",cc[cd(e)].derivedBaseName[cu(e.kind)])}(e);return i.join(s,o)}function c9(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function c7(e=process.env,t=!1,n="ios"){if("macos"===n)return["CODE_SIGNING_ALLOWED=NO","CODE_SIGNING_REQUIRED=NO","CODE_SIGN_IDENTITY=","DEVELOPMENT_TEAM="];if(!t)return[];let r=e.AGENT_DEVICE_IOS_TEAM_ID?.trim()||"",i=e.AGENT_DEVICE_IOS_SIGNING_IDENTITY?.trim()||"",a=e.AGENT_DEVICE_IOS_PROVISIONING_PROFILE?.trim()||"",o=["CODE_SIGN_STYLE=Automatic"];return r&&o.push(`DEVELOPMENT_TEAM=${r}`),i&&o.push(`CODE_SIGN_IDENTITY=${i}`),a&&o.push(`PROVISIONING_PROFILE_SPECIFIER=${a}`),o}function de(e=process.env){let t=cA(e),n=cx(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${n}`]}function dt(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function dn(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var n;let t,r;if(n=e,t=i.resolve(tn(),".tmp"),""===(r=i.relative(t,i.resolve(n)))||r.startsWith("..")||i.isAbsolute(r))throw new F("COMMAND_FAILED","Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically",{derivedPath:e,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${i.join(tn(),".tmp")}.`})}}async function dr(e){var t,n;let r,o=(t=e.derived,n=e.expectedCacheMetadata,(r=function(e){try{let t=JSON.parse(a.readFileSync(i.join(e,cg),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?cH(cB(r))!==cH(cB(n))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:r}:{ok:!1,reason:"cache_metadata_missing"}),s=o.ok?function(e,t){var n;let r=t?.artifacts;if(!(!(!(n=r)||"object"!=typeof n||Array.isArray(n))&&"string"==typeof n.xctestrunPath&&Number.isInteger(n.xctestrunMtimeMs)&&Number.isInteger(n.xctestrunSize)&&Array.isArray(n.productPaths)&&n.productPaths.length>0&&n.productPaths.every(cW))||!cX(r.xctestrunPath,e)||!cJ(r.xctestrunPath,{mtimeMs:r.xctestrunMtimeMs,size:r.xctestrunSize}))return null;let i=[];for(let t of r.productPaths){if(!cX(t.path,e)||!cJ(t.path,t))return null;i.push(t.path)}return{xctestrunPath:r.xctestrunPath,productPaths:i}}(e.derived,o.metadata):null,l=s?.xctestrunPath??e.findXctestrun(e.derived);if(!l)return{reason:"missing_xctestrun",xctestrunPath:null};let c=s?.xctestrunPath===l,d=c?"manifest":"scan",u=c?s.productPaths:await e.resolveExistingXctestrunProductPaths(l);return u?e.xctestrunReferencesProjectRoot(l,e.projectRoot)||c?o.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:u,source:d}:{reason:o.reason,xctestrunPath:l,productPaths:u,source:d}:{reason:"project_root_mismatch",xctestrunPath:l,productPaths:u,source:d}:{reason:"missing_products",xctestrunPath:l,productPaths:[],source:d}}function di(e,t,n){E({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...n}})}let da=process.pid,ds=D(process.pid),dl=(th=da,tw=ds,(e=n.createHash("sha256")).update(String(th)),e.update("\0"),e.update(tw??"unknown-start"),`owner-${th}-${e.digest("hex").slice(0,8)}`);async function dc(e,t){let n=await lz({lockDirPath:`${dh(e)}.lock`,owner:{pid:da,startTime:ds,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await n()}}function dd(e){try{let t=JSON.parse(a.readFileSync(dh(e),"utf8"));return function(e,t){var n,r,i;let a;if(!e||"object"!=typeof e||Array.isArray(e)||1!==e.schemaVersion||e.deviceId!==t)return null;let o=(n=e,a={ownerToken:dw(n.ownerToken),ownerPid:dg(n.ownerPid),sessionId:dw(n.sessionId),port:dg(n.port),xctestrunPath:dw(n.xctestrunPath),jsonPath:dw(n.jsonPath),createdAtMs:(r=n.createdAtMs,"number"==typeof r&&Number.isFinite(r)?r:null)},Object.values(a).some(e=>null===e)?null:a);return o?{schemaVersion:1,deviceId:t,...o,ownerStartTime:(i=e.ownerStartTime,"string"==typeof i?i:null),runnerPid:dg(e.runnerPid)}:null}(t,e)}catch{return null}}function du(e){var t;return e?e.ownerToken===dl?{type:"owned",lease:e}:T((t=e).ownerPid)&&(!t.ownerStartTime||D(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function dp(e,t){let n=du(dd(e));if("empty"===n.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===n.type)throw new F("COMMAND_FAILED",`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,ownerPid:n.lease.ownerPid,ownerStartTime:n.lease.ownerStartTime,ownerToken:n.lease.ownerToken,sessionId:n.lease.sessionId,hint:"Use a different simulator/session, wait for the other run to finish, or stop the owning daemon before retrying."});await dv(n.lease,n.type,t)}async function df(e,t){let n=du(dd(e));"owned"===n.type&&await dv(n.lease,"owned",t)}function dm(e){e&&function(e){let t=dd(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{a.unlinkSync(dh(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function dh(e){let t;return i.join((t=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim())?i.resolve(t):i.join(u.homedir(),".agent-device","ios-runner","leases"),`${e.replaceAll(/[^A-Za-z0-9._-]/g,"-")||"unknown-device"}.json`)}function dw(e){return"string"==typeof e&&e.length>0?e:null}function dg(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function dv(e,t,n){E({level:"stale"===t?"warn":"debug",phase:"ios_runner_lease_cleanup",data:{deviceId:e.deviceId,ownerPid:e.ownerPid,ownerToken:e.ownerToken,runnerPid:e.runnerPid,sessionId:e.sessionId,reason:t}}),await n.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGTERM"),await n.cleanupRunnerXcodebuildProcesses(e.deviceId,e.ownerToken),await n.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGKILL"),n.cleanupTempFile(e.xctestrunPath),n.cleanupTempFile(e.jsonPath),dm(e)}let dy={cleanupRunnerProcessTree:dk,cleanupRunnerXcodebuildProcesses:dP,cleanupTempFile:lW};async function dS(e,t={}){var n;!1!==t.graceful?await dA(e):await dk(e.child.pid,"SIGTERM"),await dx(e,t.waitTimeoutMs??1e4),(n=e.child.pid)&&(dM(n)||C(n))&&await dk(e.child.pid,"SIGKILL"),await dN(e)}async function d_(e){await df(e,dy)}async function dI(e){let t=Array.from(cI);await dE(e,"SIGINT"),await dD(t,"SIGINT"),await dE(e,"SIGTERM"),await dD(t,"SIGTERM"),await dE(e,"SIGKILL"),await dD(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await dN(e)}))}async function db(){let e=Array.from(cI);await Promise.allSettled(e.map(async e=>{try{await dk(e.pid,"SIGTERM"),await dk(e.pid,"SIGKILL")}finally{cI.delete(e)}}))}async function dA(e){try{await lD(e.device,e.port,lN({command:"shutdown"}),void 0,15e3)}catch{await dk(e.child.pid,"SIGTERM")}}async function dx(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function dN(e){lW(e.xctestrunPath),lW(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{dm(e.lease)}}function dM(e){return!!e&&T(e)}async function dE(e,t){await Promise.allSettled(e.map(async e=>{await dk(e.child.pid,t)}))}async function dD(e,t){await Promise.allSettled(e.map(async e=>{await dk(e.pid,t),"SIGKILL"===t&&cI.delete(e)}))}async function dk(e,t){if(!e||e<=0)return;try{process.kill(-e,t)}catch{}try{process.kill(e,t)}catch{}let n="SIGINT"===t?"INT":"SIGTERM"===t?"TERM":"KILL";try{await iT("pkill",[`-${n}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function dP(e,t){let n=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${dC(e)}-${dC(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${dC(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await iT("pkill",[`-${t}`,"-f",n],{allowFailure:!0,timeoutMs:2e3})}catch(n){E({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:t,error:n instanceof Error?n.message:String(n)}})}}function dC(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}let dR=new Map,dT=new Map;async function dO(e,t){return await le(dT,e.id,async()=>{let n=dR.get(e.id);if(n){let t=await d$(e,n);if(t)return t}return await dc(e.id,async()=>await dL(e,t))})}async function dL(e,t){var n,r;let o,s,l={};await dQ(l,"cleanup_stale_xcodebuild",async()=>{await dp(e.id,dy)}),await dQ(l,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(E({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):dK(t))}),t.cleanStaleBundles?await dQ(l,"cleanup_stale_bundles",async()=>{await dF(e)}):(l.cleanup_stale_bundles=0,E({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let c=await dQ(l,"ensure_xctestrun",async()=>await cR(e,t));l.build_xctestrun=c.buildMs;let d=await dQ(l,"allocate_port",async()=>await lV()),{xctestrunPath:u,jsonPath:p}=await dQ(l,"prepare_xctestrun_env",async()=>await c1(c.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(d)},`session-${e.id}-${dl}-${d}`)),f=await dQ(l,"simulator_set_redirect",async()=>await cE(e));try{({child:o,wait:s}=await dQ(l,"launch_xcodebuild",()=>{let t;return U("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",c9(e),"1","-destination-timeout",String(20),"-xctestrun",u,"-destination",(t=cd(e),"macOS"===t?`platform=macOS,arch=${cp()}`:"simulator"===e.kind?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(d)},detached:!0})}))}catch(e){throw await f?.release(),e}o.stdout?.on("data",e=>{lB(e,t.logPath,t.traceLogPath,t.verbose)}),o.stderr?.on("data",e=>{lB(e,t.logPath,t.traceLogPath,t.verbose)});let m=`${e.id}:${d}:${Date.now()}`,h={schemaVersion:1,deviceId:(n={deviceId:e.id,sessionId:m,runnerPid:o.pid,port:d,xctestrunPath:u,jsonPath:p}).deviceId,ownerToken:dl,ownerPid:da,ownerStartTime:ds,sessionId:n.sessionId,runnerPid:n.runnerPid??null,port:n.port,xctestrunPath:n.xctestrunPath,jsonPath:n.jsonPath,createdAtMs:Date.now()},w={sessionId:m,device:e,deviceId:e.id,port:d,xctestrunPath:u,xctestrunArtifact:c,jsonPath:p,testPromise:s,child:o,ready:!1,startupTimeoutMs:"number"==typeof(r=t.startupTimeoutMs)&&Number.isFinite(r)&&r>0?Math.floor(r):void 0,startupTimings:l,simulatorSetRedirect:f??void 0,lease:h};try{let e,t;e=dh(h.deviceId),a.mkdirSync(i.dirname(e),{recursive:!0}),t=`${e}.${process.pid}.${Date.now()}.tmp`,a.writeFileSync(t,JSON.stringify(h,null,2),"utf8"),a.renameSync(t,e)}catch(t){throw await dj(e.id,w,{graceful:!1,waitTimeoutMs:1e3}),t}return dR.set(e.id,w),w}async function d$(e,t){if(!dM(t.child.pid))return await dQ({},"stop_stale_session",async()=>{await dj(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let n=c6(e,cG(e));return t.xctestrunArtifact?.derived!==n?(E({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:t.xctestrunArtifact?.derived,expectedDerived:n}}),await dQ({},"stop_stale_artifact_session",async()=>{await dj(e.id,t)}),null):(E({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready}}),t)}async function dF(e){if("simulator"===e.kind)for(let t of cN){let n=await dU(e,t);if(!n||function(e){if(0===e.exitCode)return!0;let t=`${e.stdout}
|
|
13
|
-
${e.stderr}`.toLowerCase();return t.includes("not installed")||t.includes("found nothing")||t.includes("no such file")||t.includes("invalid device")||t.includes("could not find")}(n))continue}}async function dU(e,t){try{return await iO(lv(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(n){E({level:"warn",phase:"ios_runner_startup_cleanup_stale_bundle_failed",data:{deviceId:e.id,bundleId:t,timeoutMs:1e4,error:n instanceof Error?n.message:String(n)}});return}}function dG(e){let t=dR.get(e);return t?{sessionId:t.sessionId,alive:dM(t.child.pid)}:null}async function dq(e,t){await le(dT,e.deviceId,async()=>{dR.get(e.deviceId)===e&&(E({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await dj(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function dj(e,t,n={}){let r=t??dR.get(e);r&&(await dS(r,n),dR.get(e)===r&&dR.delete(e))}async function dV(e){await le(dT,e,async()=>{await dc(e,async()=>{await dj(e),await d_(e)})})}async function dB(){let e=Array.from(dR.values());for(let t of(await dI(e),e))dR.get(t.deviceId)===t&&dR.delete(t.deviceId)}async function dH(){await dB();let e=Array.from(dR.keys());await Promise.allSettled(e.map(async e=>{await dV(e)})),await db()}async function dK(e){await iO(lv(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}function dW(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new F("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new F("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function dz(e,t,n,r,i,a){var o,s,l,c,d;o=t,s=n.command,o.startupTimingsReported||!o.startupTimings||(o.startupTimingsReported=!0,E({level:"info",phase:"ios_runner_session_startup_timings",durationMs:Object.values(o.startupTimings).reduce((e,t)=>e+t,0),data:{command:s,sessionId:o.sessionId,ready:o.ready,timings:o.startupTimings}}));let u=lN(n),p=lx(u.command),f=eo.fromTimeoutMs(i),m=function(e,t){var n;let r=lx(t.command);if(!e.ready)return r?{action:"skip",reason:"read_only_startup_command"}:{action:"run",reason:"startup"};return"uptime"===(n=t.command)||"status"===n?{action:"skip",reason:"readiness_probe_command"}:{action:"run",reason:"ready_session"}}(t,u);"run"===m.action?await dX({device:e,session:t,runnerCommand:u,logPath:r,deadline:f,signal:a,decision:m}):(l=u,c=t,d=m,E({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:l.command,commandId:l.commandId,reason:d.reason,sessionReady:c.ready}}));let h=await dJ({device:e,session:t,runnerCommand:u,logPath:r,deadline:f,timeoutMs:i,signal:a,readOnlyCommand:p});try{let e=await dZ(h,t,r),n=function(e){if(!0===e.runnerFatal)return"string"==typeof e.runnerFatalReason&&e.runnerFatalReason.trim().length>0?e.runnerFatalReason:"runner_reported_fatal_response"}(e);return n&&await dq(t,n),e}catch(n){let e=function(e){if(e instanceof F){if("IOS_AX_SNAPSHOT_FAILED"===e.code)return"ax_snapshot_failure";if("XCTEST_RECORDED_FAILURE"===e.code)return"xctest_recorded_failure"}}(n);throw e&&await dq(t,e),n}}async function dJ(e){let{device:t,session:n,runnerCommand:r,logPath:i,deadline:a,timeoutMs:o,signal:s,readOnlyCommand:l}=e,c=a.remainingMs();if(c<=0)throw new F("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:o});let d=l?{command:r.command,commandId:r.commandId,readOnly:!0,sessionReady:n.ready,timeoutMs:c}:{command:r.command,commandId:r.commandId};return await N("ios_runner_command_send",async()=>l?await lD(t,n.port,r,i,c,n,s):await lO(t,n.port,r,c,s),d)}async function dX(e){let{device:t,session:n,runnerCommand:r,logPath:i,deadline:a,signal:o,decision:s}=e,l=n.ready?Math.min(1e3,a.remainingMs()):Math.min(dY(n),a.remainingMs());try{let e=await N("ios_runner_readiness_preflight",async()=>await lD(t,n.port,lN({command:"uptime"}),i,l,n,o),{command:r.command,commandId:r.commandId,reason:s.reason,sessionReady:n.ready,timeoutMs:l});await dZ(e,n,i)}catch(t){var c,d;let e;throw d={runnerReadinessPreflightFailed:!0},e=(c=t)instanceof F?c:new F("COMMAND_FAILED",c instanceof Error?c.message:String(c),void 0,c),new F(e.code,e.message,{...e.details??{},...d},e.cause??c)}}async function dZ(e,t,n){let r,i=await e.text();try{let e=JSON.parse(i);r=e&&"object"==typeof e?e:{}}catch{throw new F("COMMAND_FAILED","Invalid runner response",{text:i})}if(!r.ok){let e=r.error?.code,t="string"==typeof e&&e.trim().length>0?O(e):"COMMAND_FAILED",i="string"==typeof r.error?.message?r.error.message:void 0,a="string"==typeof r.error?.hint?r.error.hint:void 0;throw new F(t,i??"Runner error",{runner:r,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,logPath:n})}if(t.ready=!0,r.data&&"object"==typeof r.data&&!Array.isArray(r.data)){var a;let e,t=r.data;return"string"==typeof(e=(a=t).gestureFallback)&&0!==e.length&&E({level:"debug",phase:"ios_runner_gesture_fallback",data:{fallback:e,message:"string"==typeof a.gestureFallbackMessage?a.gestureFallbackMessage:void 0,hint:"string"==typeof a.gestureFallbackHint?a.gestureFallbackHint:void 0}}),t}return{}}function dY(e){return e.startupTimeoutMs??45e3}async function dQ(e,t,n){let r=Date.now();try{return await n()}finally{let n=Date.now()-r;e[t]=n,E({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:n})}}let d0=new h;function d1(e,t={}){return{runCommand:e,...t}}function d2(e,t,n,r={}){if(n)return d4(n);let i=function(e,t={}){let n=d0.getStore();return n&&n.deviceId===e.id&&(n.requestId?n.requestId===t.requestId:!t.requestId)?n:void 0}(e,r);return i?d4(i.provider):d4(t)}async function d3(e,t,n){if(!e)return await n();let r={provider:d4(e),deviceId:t.deviceId,requestId:t.requestId};return await d0.run(r,n)}function d4(e){return"function"==typeof e?{runCommand:e}:e}async function d5(e){let{device:t,session:n,command:r,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await d9(t,n,r,i,a,o);return await d8(l,{command:r,session:n,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function d8(e,t){var n,r,i,a;if(!e)return await d6(t,"status_recovery_unavailable");if("recovered"===e.type){return n=e,d7({command:(r=t).command,session:r.session,transportError:r.transportError,decision:"skipped",reason:n.reason,lifecycleState:n.lifecycleState}),n.data}if("skipInvalidation"===e.type){throw i=e,d7({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await d6(t,e.reason,e.lifecycleState,e.error)}async function d6(e,t,n,r){throw d7({command:e.command,session:e.session,transportError:e.transportError,decision:"retained",reason:t,lifecycleState:n}),await e.invalidateSession(e.session,e.invalidationReason),r??e.transportError}async function d9(e,t,n,r,i,a){var o,s,l,c,d,u,p,f,m,h,w,g,v,y,S,_,I,b,A,x,N,M;let D,k,P,C,R;if("status"===n.command||!n.commandId?.trim())return;try{D=await dz(e,t,{command:"status",statusCommandId:n.commandId},i.logPath,3e3,a)}catch(e){return E({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:n.command,commandId:n.commandId,error:e instanceof Error?e.message:String(e)}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let T="string"==typeof D.lifecycleState?D.lifecycleState:"";return E({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:n.command,commandId:n.commandId,lifecycleState:T}}),o=D,s=T,l=n,c=r,d=i,"completed"===s?(u=o,p=l,f=c,m=d,(k=function(e){if("string"!=typeof e||0===e.trim().length)return;let t=function(e){try{let t=JSON.parse(e);if(t&&"object"==typeof t)return t}catch{}return{}}(e);if(t.ok)return t.data&&"object"==typeof t.data&&!Array.isArray(t.data)?t.data:{}}(u.lifecycleResponseJson))?{type:"recovered",data:k,reason:"completed_with_retained_response",lifecycleState:"completed"}:lx(p.command)?{type:"skipInvalidation",error:f,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"}:{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new F("COMMAND_FAILED",`Runner command "${p.command}" completed after the transport response was lost, but no recoverable response was retained.`,{command:p.command,commandId:p.commandId,lifecycleState:"completed",recovery:"completed_without_retained_response",hint:(h=p.command,`The runner is still reachable and reports "${h}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`),logPath:m.logPath,transportError:f.message},f)}):"failed"===s?{type:"skipInvalidation",reason:"runner_reported_failure",lifecycleState:s,error:(w=o,g=l,v=c,y=d,P="string"==typeof w.lifecycleErrorCode?w.lifecycleErrorCode:void 0,C="string"==typeof w.lifecycleErrorMessage?w.lifecycleErrorMessage:"Runner command failed",R="string"==typeof w.lifecycleErrorHint?w.lifecycleErrorHint:void 0,new F(O(P),C,{command:g.command,commandId:g.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",hint:R??(S=g.command,`The runner is still reachable and reports "${S}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`),logPath:y.logPath,transportError:v.message},v))}:"accepted"===s||"started"===s?{type:"skipInvalidation",reason:"command_still_in_flight",lifecycleState:s,error:(_=s,I=l,b=c,A=d,lx(I.command)?b:new F("COMMAND_FAILED",`Runner command "${I.command}" is still ${_} after the transport response was lost.`,{command:I.command,commandId:I.commandId,lifecycleState:_,recovery:"command_still_in_flight",hint:(x=I.command,N=_,`The runner is still reachable and reports "${x}" is ${N}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`),logPath:A.logPath,transportError:b.message},b))}:{type:"retainInvalidation",reason:s?"unknown_lifecycle_state":"missing_lifecycle_state",lifecycleState:s,error:new F("COMMAND_FAILED",`Runner command "${l.command}" lost its transport response and lifecycle status was ${s?`"${s}"`:"missing"}, so agent-device invalidated the runner session instead of replaying the command.`,{command:l.command,commandId:l.commandId,lifecycleState:s,recovery:"lifecycle_state_not_recoverable",hint:(M=l.command,`The runner did not confirm that "${M}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`),logPath:d.logPath,transportError:c.message},c)}}function d7(e){let{command:t,session:n,transportError:r,decision:i,reason:a,lifecycleState:o}=e;E({level:"retained"===i?"warn":"debug",phase:"ios_runner_command_invalidation_decision",data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:void 0!==o,sessionId:n.sessionId,transportError:r.message}})}async function ue(e,t){let n;lM(t.requestId);let r=na(t.requestId),i=lN({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await ut({device:e,command:i,options:t,signal:r,attempt:a,recoveryReason:n});if("prepared"===o.kind)return o.result;n=o.recoveryReason}throw new F("COMMAND_FAILED","iOS runner prepare failed")}async function ut(e){let{device:t,command:n,options:r,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await dO(t,{...r,cleanStaleBundles:a>1||r.cleanStaleBundles}),c=Date.now()-s;try{var d,u;let e=await ul(t,l,n,r,i,c,{recoveryReason:o});return{kind:"prepared",result:(d=t,u=e,uc(d,u),u)}}catch(e){return await un({device:t,session:l,command:n,options:r,signal:i,attempt:a,error:e})}}async function un(e){var t;let n,{device:r,session:i,command:a,options:o,signal:s,attempt:l,error:c}=e,d=c instanceof F?c:new F("COMMAND_FAILED",String(c));if(1===l&&(t=d,(n=i.xctestrunArtifact)&&"miss"!==n.cache&&ua(t)))return{kind:"prepared",result:await ur({device:r,session:i,command:a,options:o,signal:s,error:d})};if(!ua(d))throw c;let u=d.message||"runner_health_failed";if(l>=2)throw await ui(i,"prepare_runner_health_failed"),c;return lM(o.requestId),await dq(i,"prepare_runner_health_retry"),E({level:"warn",phase:"ios_runner_prepare_health_retry",data:{command:a.command,commandId:a.commandId,sessionId:i.sessionId,attempt:l,maxAttempts:2,reason:u}}),{kind:"retry",recoveryReason:u}}async function ur(e){var t,n,r,i,a;let{device:o,session:s,command:l,options:c,signal:d,error:u}=e,p=u.message||"runner_health_failed";await dq(s,"prepare_cached_runner_health_failed"),await cV(s.xctestrunArtifact,p);let f=Date.now(),m=await dO(o,{...c,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await ul(o,m,l,c,d,h,{recoveryReason:p});return E({level:"info",phase:"ios_runner_prepare_bad_cache_recovered",data:{command:l.command,commandId:l.commandId,sessionId:m.sessionId,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,reason:p}}),t=o,n=e,uc(t,n),n}catch(n){let e;await ui(m,"prepare_rebuilt_runner_health_failed");let t=(r=n,i=m,a=p,e=r instanceof F?r:new F("COMMAND_FAILED",String(r)),new F(e.code,"artifact restored but runner did not connect",{...e.details??{},restoredFailureReason:a,xctestrunPath:i.xctestrunArtifact?.xctestrunPath,artifact:i.xctestrunArtifact?.artifact,cache:i.xctestrunArtifact?.cache,reason:e.message},e));throw uc(o,{cache:m.xctestrunArtifact?.cache,artifact:m.xctestrunArtifact?.artifact,buildMs:m.xctestrunArtifact?.buildMs,connectMs:h,healthCheckMs:0,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,failureReason:t.message}),t}}async function ui(e,t){try{await dq(e,t)}catch{}}function ua(e){let t;return!nl(e)&&(l_(e)||lI(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function uo(e,t,n){let r;lM(n.requestId);let i=na(n.requestId);try{let a=(r=await dO(e,n)).ready?45e3:dY(r);return await dz(e,r,t,n.logPath,a,i)}catch(o){let a=o instanceof F?o:new F("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&lI(a)&&r)return lM(n.requestId),await us({device:e,session:r,command:t,options:n,signal:i,restartReason:"runner_connect_failed_before_command_send"});if(r&&function(e){let t;return e.details?.runnerReadinessPreflightFailed===!0&&(l_(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return lM(n.requestId),await us({device:e,session:r,command:t,options:n,signal:i,restartReason:"runner_readiness_preflight_failed_before_command_send",recoveredDiagnosticPhase:"ios_runner_readiness_preflight_recovered"});if(r&&l_(a))return await d5({device:e,session:r,command:t,transportError:a,options:n,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:dq});throw o}}async function us(e){let{device:t,command:n,options:r,signal:i,restartReason:a}=e;await dq(e.session,a);let o=await dO(t,{...r,cleanStaleBundles:!0});try{let a=await dz(t,o,n,r.logPath,45e3,i);return e.recoveredDiagnosticPhase&&E({level:"debug",phase:e.recoveredDiagnosticPhase,data:{command:n.command,commandId:n.commandId,recovery:"session_restarted",sessionId:o.sessionId}}),a}catch(a){let e=a instanceof F?a:new F("COMMAND_FAILED",String(a));if(l_(e))return await d5({device:t,session:o,command:n,transportError:e,options:r,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:dq});throw a}}async function ul(e,t,n,r,i,a,o){var s,l,c,d,u;let p,f,m=Date.now();return s=await dz(e,t,n,r.logPath,r.healthTimeoutMs,i),l=t,c=a,d=Date.now()-m,u=o,p=l.xctestrunArtifact,f={...u?.recoveryReason?{recoveryReason:u.recoveryReason}:{},...u?.failureReason?{failureReason:u.failureReason}:{}},p?{runner:s,cache:p.cache,artifact:p.artifact,buildMs:p.buildMs,connectMs:Math.max(0,c),healthCheckMs:Math.max(0,d),xctestrunPath:p.xctestrunPath,...f}:{runner:s,connectMs:Math.max(0,c),healthCheckMs:Math.max(0,d),...f}}function uc(e,t){E({level:t.failureReason?"warn":"info",phase:"apple_runner_prepare",data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}async function ud(e,t,n={}){dW(e),lM(n.requestId);let r=lN(t),i=uf(e,n);return lx(r.command)?ea(()=>(lM(n.requestId),i.runCommand(e,r,n)),{shouldRetry:e=>(lM(n.requestId),l_(e))}):i.runCommand(e,r,n)}function uu(e,t={}){if("ios"!==e.platform)return;let n=uf(e,t);return n.prewarm?n.prewarm(e,t).then(()=>{}).catch(t=>{E({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}})}):void E({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function up(e,t){dW(e),lM(t.requestId);let n=lN({command:"uptime"}),r=uf(e,t);if(r.prepare)return await r.prepare(e,t);let i=Date.now();return{runner:await r.runCommand(e,n,t),connectMs:0,healthCheckMs:Math.max(0,Date.now()-i)}}function uf(e,t){return d2(e,um,void 0,{requestId:t.requestId})}let um=d1(uo,{prepare:ue,prewarm:async(e,t)=>{await ue(e,{...t,healthTimeoutMs:45e3})}}),uh=new WeakMap;async function uw(e){var t,n;let r,i,{sessionStore:a,leaseRegistry:o}=e,s=(r={...(t=function(e){let t=X(e.meta?.sessionIsolation??e.flags?.sessionIsolation),n=e.meta?.tenantId??e.flags?.tenant,r=W(n);if(n&&!r)throw new F("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!r)throw new F("INVALID_ARGS","session isolation mode tenant requires --tenant (or meta.tenantId).");let i=e.session||"default";return i.startsWith(`${r}:`)?{...e,meta:{...e.meta,tenantId:r,sessionIsolation:t}}:{...e,session:`${r}:${i}`,meta:{...e.meta,tenantId:r,sessionIsolation:t}}}(e.req)).flags??{}},tm(t.command,r)?{...t,flags:r}:t),l=s.command,c=function(e){var t,n;let r=e.session||la;if(function(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return"string"==typeof t&&t.trim().length>0}(e))return r;let i=ls(e);return i?(t=i.id,n=r,`cwd:${t}:${n}`):r}(s),d=A(),u=a.resolveSessionDir(c),p=t1(u,s.meta?.requestId??d.requestId),f=t0(u);M({session:c,logPath:p}),E({level:"info",phase:"request_start",data:{publicSession:s.session,effectiveSession:c,command:s.command,tenant:s.meta?.tenantId,isolation:s.meta?.sessionIsolation,requestLogPath:p,runnerLogPath:f}}),function(e,t){var n;if(n=e.command,rf(n)?.leaseAdmissionExempt===!0||e.meta?.sessionIsolation!=="tenant")return;let r=ld(e);t.assertLeaseAdmission({tenantId:r.tenantId,runId:r.runId,leaseId:r.leaseId,backend:r.leaseBackend})}(s,o);let m=rf(l)?.sessionExecutionLockExempt!==!0?await lm({req:s,sessionName:c,sessionStore:a}):[],h=(n=o,(i=uh.get(n))||(i=new Map,uh.set(n,i)),i);return{req:s,command:l,sessionName:c,requestLogPath:p,runnerLogPath:f,throwIfCanceled:()=>ns(s.meta?.requestId),runLocked:async e=>(ns(s.meta?.requestId),0===m.length)?await e():await ug(h,m,async()=>(ns(s.meta?.requestId),await e()))}}async function ug(e,t,n){let[r,...i]=t;return r?await le(e,r,async()=>await ug(e,i,n)):await n()}function uv(){return{ok:!1,error:$(new F("UNAUTHORIZED","Invalid token"))}}async function uy(e){let{lockedScope:t,logPath:n,sessionStore:r}=e,i=r.get(t.sessionName);if(!i)return t.finalize({ok:!1,error:{code:"SESSION_NOT_FOUND",message:"No active session. Run open first."}});let a=await sq({req:t.req,session:i,sessionName:t.sessionName,logPath:n,sessionStore:r,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function uS(e){E({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=A(),n=x({force:!0})??void 0;return{ok:!1,error:$(e,{diagnosticId:t.diagnosticId,logPath:n})}}async function u_(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function uI(e,t){let n=t.includeTokens?.filter(e=>e.length>0)??[],r="",i=r=>{(!(n.length>0)||n.some(e=>r.includes(e)))&&e.write(function(e,t){if(0===t.length)return e;let n=e;for(let e of t)n=n.replace(e,"[REDACTED]");return n}(r,t.redactionPatterns))};return{onChunk:e=>{let t=`${r}${e}`.split("\n");for(let e of(r=t.pop()??"",t))i(`${e}
|
|
14
|
-
`)},flush:()=>{
|
|
15
|
-
`,recoveredLineCount:l.length}}async function uk(e,t,n,r,i,a){let o=await uC({deviceId:e,appBundleId:t,simulatorSetPath:i});return uO({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:n,executableName:r,simulatorSetPath:i}=e;return lg(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",uE(n,r)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:n,redactionPatterns:r,pidPath:a})}function uP(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function uC(e){let{deviceId:t,appBundleId:n,simulatorSetPath:r}=e,a=await iO(lg(["get_app_container",t,n,"app"],{simulatorSetPath:r}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=i.join(o,"Info.plist"),l=await q("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function uR(e,t,n,r){return uO({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",uE(e)],stream:t,redactionPatterns:n,pidPath:r})}async function uT(e,t,n,r){return uO({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:n,pidPath:r})}function uO(e){let t="active",n=U(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});n.wait.catch(()=>{});let r=n.child,i=uI(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof r.pid&&t4(e.pidPath,r.pid);let a=ub(r,e.stream,{endStreamOnClose:!0,writer:i}).then(n=>(0!==n.exitCode&&(t="failed"),t5(e.pidPath),n),n=>{throw t="failed",t5(e.pidPath),n});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{r.killed||r.kill("SIGINT"),await u_(a),r.killed||r.kill("SIGKILL"),await u_(a),t5(e.pidPath)}}}let uL=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),u$=/https?:\/\/[^\s"'<>\])]+/i,uF=[/\bstatus(?:Code)?["'=: ]+([1-5]\d{2})\b/i,/\bresponse(?:\s+code)?["'=: ]+([1-5]\d{2})\b/i,/\bHTTP\/[0-9.]+\s+([1-5]\d{2})\b/i];function uU(e,t,n=e.limits.maxEntries){let r=[...e.entries],i=new Set(r.map(e=>uq(e)));for(let e of t.entries){let t=uq(e);if(!i.has(t)&&(i.add(t),r.push(e),r.length>=n))break}return{...e,matchedLines:r.length,entries:r}}function uG(e,t){let n=uZ(t?.maxEntries,25,1,200),r=t?.backend,i=t?.include??"summary",a=uZ(t?.maxPayloadChars,2048,64,16384),o=uZ(t?.maxScanLines,4e3,100,2e4),s=e.split("\n"),l=Math.max(0,s.length-o),c=s.slice(l),d=[];for(let e=c.length-1;e>=0&&d.length<n;e-=1){let t=c[e];if(!t?.trim())continue;let n=function(e,t,n,r,i,a){let o=e[t]?.trim();if(!o)return null;let s=function(e){let t=e.indexOf("{");if(t<0)return null;let n=e.lastIndexOf("}");if(n<=t)return null;let r=e.slice(t,n+1);try{let e=JSON.parse(r);return e&&"object"==typeof e?e:null}catch{return null}}(o),l=uW(s,["method","httpMethod"]),c=uW(s,["url","requestUrl"]),d=function(e,t){if(!e)return null;for(let n of t){let t=e[n];if("number"==typeof t&&Number.isInteger(t))return t;if("string"==typeof t&&/^\d{3}$/.test(t.trim()))return Number.parseInt(t.trim(),10)}return null}(s,["status","statusCode","responseCode"]),u=uL.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=u$.exec(o),h=c??m?.[0];if(!h)return null;let w=d??uV(o)??void 0;if(!(l||p?.[1]||u?.[1]||void 0!==w||/\bURL["'=: ]+https?:\/\//i.test(o)||/\bheaders?["'=: ]+/i.test(o)||/\b(?:requestBody|responseBody|payload|request|response)["'=: ]+/i.test(o)))return null;let g={method:f,url:h,status:w,timestamp:uB(o),packetId:uH(o)??void 0,durationMs:uK(o)??void 0,raw:uX(o,a),line:n};if("android"===r&&function(e,t,n){let r=uj(t,n,5),i=e.packetId??r.map(e=>uH(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?uj(t,n,12).filter(e=>uH(e)===i):r;e.timestamp||(e.timestamp=a.map(e=>uB(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>uV(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>uK(e)).find(e=>"number"==typeof e))}(g,e,t),"headers"===i||"all"===i){let e=function(e,t){if(t){let e=t.headers??t.requestHeaders??t.responseHeaders;if(void 0!==e)return uJ(e)}let n=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return n?.[1]?.trim()}(o,s);e&&(g.headers=uX(e,a))}if("body"===i||"all"===i){let e=uz(o,s,["requestBody","body","payload","request"]),t=uz(o,s,["responseBody","response"]);e&&(g.requestBody=uX(e,a)),t&&(g.responseBody=uX(t,a))}return g}(c,e,l+e+1,r,i,a);n&&d.push(n)}return{path:t?.path??"<memory>",exists:!0,scannedLines:c.length,matchedLines:d.length,entries:d,include:i,limits:{maxEntries:n,maxPayloadChars:a,maxScanLines:o}}}function uq(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function uj(e,t,n){let r=[],i=Math.max(0,t-n),a=Math.min(e.length-1,t+n);for(let t=i;t<=a;t+=1){let n=e[t]?.trim();n&&r.push(n)}return r}function uV(e){for(let t of uF){let n=t.exec(e);if(!n)continue;let r=Number.parseInt(n[1]??"",10);if(Number.isInteger(r))return r}return null}function uB(e){let t=/\b\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z)?\b/.exec(e);if(t)return t[0];let n=/\b\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\b/.exec(e);return n?.[0]}function uH(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function uK(e){let t=/\b(?:duration|elapsed request\/response time, ms)[:= ]+(\d+)\b/i.exec(e);if(!t)return null;let n=Number.parseInt(t[1]??"",10);return Number.isInteger(n)?n:null}function uW(e,t){if(e)for(let n of t){let t=e[n];if("string"==typeof t&&t.trim().length>0)return t.trim()}}function uz(e,t,n){if(t){for(let e of n)if(void 0!==t[e])return uJ(t[e])}for(let t of n){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=RegExp(`\\b${n}["'=: ]+(.+)$`,"i").exec(e);if(r?.[1])return r[1].trim()}}function uJ(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function uX(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function uZ(e,t,n,r){return void 0!==e&&Number.isInteger(e)?Math.max(n,Math.min(r,e)):t}let uY={start:async e=>await u6(e)},uQ=iI(uY,function(e={}){return{...uY,...e}});async function u0(e,t){return await uQ.run(e,t)}function u1(e,t){let n=process.env[e];if(!n)return t;let r=Number.parseInt(n,10);return Number.isInteger(r)&&r>0?r:t}function u2(e){let t=i.dirname(e);a.existsSync(t)||a.mkdirSync(t,{recursive:!0}),function(e,t){if(a.existsSync(e)&&!(a.statSync(e).size<t.maxBytes))for(let n=t.maxRotatedFiles;n>=1;n-=1){let t=1===n?e:`${e}.${n-1}`,r=`${e}.${n}`;a.existsSync(t)&&(a.existsSync(r)&&a.unlinkSync(r),a.renameSync(t,r))}}(e,{maxBytes:u1("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:u1("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function u3(e){if(!a.existsSync(e))return{exists:!1,sizeBytes:0};let t=a.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}async function u4(e){var t,n,r,i;let o,s,l,c,{device:d,appBundleId:u,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v}=e,y="macos"===d.platform?"macos":"ios"===d.platform?"device"===d.kind?"ios-device":"ios-simulator":"android",S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},o=uZ(t?.maxEntries,25,1,200),s=t?.include??"summary",l=uZ(t?.maxPayloadChars,2048,64,16384),c=uZ(t?.maxScanLines,4e3,100,2e4),a.existsSync(m)?uG(a.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:o,maxPayloadChars:l,maxScanLines:c}}),_=[],I=await u5({device:d,appBundleId:u,appLogPath:m,appLogState:p});if(I){let e=await uN(d.id,u);if(e){let t=uG(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=uU(t,S,h),_.push((n=I,r=e.recoveredPids,"stale-active"===n.reason?`Session app log stream was still bound to prior Android PID ${n.trackedPid}. Recovered recent Android HTTP entries from adb logcat for PID set ${r.join(", ")}.`:`Session app log stream was inactive. Recovered recent Android HTTP entries from adb logcat for PID set ${r.join(", ")}.`)))}}if("ios"===d.platform&&"simulator"===d.kind&&u&&0===S.entries.length){let e=await u9({deviceId:d.id,appBundleId:u,startedAt:f,simulatorSetPath:d.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});e&&(e.dump.entries.length>0?(S=uU(e.dump,S,h),_.push(`Recovered ${e.dump.entries.length} iOS simulator HTTP entr${1===e.dump.entries.length?"y":"ies"} from simctl log show (${e.recoveredLineCount} app log lines scanned).`)):e.recoveredLineCount>0&&_.push(`Recovered ${e.recoveredLineCount} recent iOS simulator app log lines from simctl log show, but none looked like HTTP traffic. This app may not emit request URLs, status, or timing into Unified Logging for this repro window.`))}return void 0===p?_.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===_.length&&("ios"===d.platform&&"simulator"===d.kind?_.push("Session app log stream is inactive. The iOS simulator recovery path scanned recent simctl log history, but a fresh logs clear --restart window is still the most reliable repro loop."):_.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===S.entries.length&&_.push("ios"===(i=d).platform&&"simulator"===i.kind?"No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.":"ios"===i.platform?"No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.":"No HTTP(s) entries were found in recent session app logs."),{backend:y,dump:S,notes:_}}async function u5(e){let{device:t,appBundleId:n,appLogPath:r,appLogState:o}=e;if("android"!==t.platform||!n)return null;if(void 0!==o&&"active"!==o)return{reason:"inactive"};if("active"!==o)return null;let s=function(e){let t=function(e){if(!e||!a.existsSync(e))return null;try{return t3(a.readFileSync(e,"utf8"))}catch{return null}}(e)?.command;if(!t)return null;let n=/(?:^|\s)--pid\s+(\d+)(?:\s|$)/.exec(t);return n?.[1]??null}(i.join(i.dirname(r),t2));if(!s)return null;let l=await ux(t.id,n);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function u8(e,t,n,r){return await uQ.resolve(void 0).start({device:e,appBundleId:t,outPath:n,pidPath:r})}async function u6({device:e,appBundleId:t,outPath:n,pidPath:r}){u2(n);let i=a.createWriteStream(n,{flags:"a"}),o=function(){let e=process.env.AGENT_DEVICE_APP_LOG_REDACT_PATTERNS;if(!e)return[];let t=e.split(",").map(e=>e.trim()).filter(e=>e.length>0),n=[];for(let e of t)try{n.push(RegExp(e,"gi"))}catch{}return n}();if("ios"===e.platform)return"device"===e.kind?await uT(e.id,i,o,r):await uk(e.id,t,i,o,e.simulatorSetPath,r);if("android"===e.platform)return uA(t),await uM(e.id,t,i,o,r);if("macos"===e.platform)return await uR(t,i,o,r);throw i.end(),new F("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function u9(e){let t=await uD({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:uG(t.text,{path:`${e.appLogPath} (simctl log show recovery)`,backend:"ios-simulator",maxEntries:e.maxEntries,include:e.include,maxPayloadChars:e.maxPayloadChars,maxScanLines:e.maxScanLines}),recoveredLineCount:t.recoveredLineCount}:null}async function u7(e){await e.stop(),await u_(e.wait)}async function pe(e,t){let n={},r=[];if(t||r.push("No app bundle is tracked in this session. Run open <app> first for app-scoped logs."),"android"===e.platform){try{let t=await en(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});n.adbAvailable=0===t.exitCode}catch{n.adbAvailable=!1}if(t)try{n.androidPidVisible=(await en(e,["shell","pidof",t],{allowFailure:!0,timeoutMs:1e3})).stdout.trim().length>0}catch{n.androidPidVisible=!1}}if("ios"===e.platform&&"simulator"===e.kind)try{let e=await iO(["simctl","help"],{allowFailure:!0});n.simctlAvailable=0===e.exitCode}catch{n.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await iO(["devicectl","--version"],{allowFailure:!0});n.devicectlAvailable=0===e.exitCode}catch{n.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await q("log",["help"],{allowFailure:!0});n.logAvailable=0===e.exitCode}catch{n.logAvailable=!1}return{checks:n,notes:r}}function pt(e,t){u2(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
|
|
16
|
-
`;a.appendFileSync(e,
|
|
17
|
-
${t.stderr}`.toLowerCase(),s=o.includes("already booted")||o.includes("current state: booted");if(0!==t.exitCode&&!s)throw new F("COMMAND_FAILED","simctl boot failed",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let l=await iO(lv(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:i});if(n={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==n.exitCode)throw new F("COMMAND_FAILED","simctl bootstatus failed",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode});let c=await ps(e);if("Booted"!==c)throw new F("COMMAND_FAILED","Simulator is still booting",{state:c})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let r=ec({error:e,stdout:n?.stdout??t?.stdout,stderr:n?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});return"IOS_BOOT_TIMEOUT"!==r&&"CI_RESOURCE_STARVATION_SUSPECTED"!==r}},{deadline:r,phase:"boot",classifyReason:e=>ec({error:e,stdout:n?.stdout??t?.stdout,stderr:n?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(a){let i=ec({error:a,stdout:n?.stdout??t?.stdout,stderr:n?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});throw new F("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:18e4,elapsedMs:r.elapsedMs(),reason:i,hint:eu(i),boot:t,bootstatus:n})}await pi()}async function po(e){let t=lv(e,["shutdown",e.id]),n=await iO(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===n.exitCode,exitCode:n.exitCode,stdout:String(n.stdout??""),stderr:String(n.stderr??"")}}async function ps(e){let t="string"==typeof e?e:e.id,n="string"==typeof e?lg(["list","devices","-j"]):lv(e,["list","devices","-j"]),r=await iO(n,{allowFailure:!0,timeoutMs:6e4});if(0!==r.exitCode)return null;try{let e=JSON.parse(String(r.stdout??""));for(let n of Object.values(e.devices??{})){let e=n.find(e=>e.udid===t);if(e)return e.state}return null}catch{return null}}let pl="shared_prefs/ReactNativeDevPrefs.xml",pc="debug_http_host",pd="dev_server_https",pu="RCT_jsLocation",pp="RCT_packager_scheme",pf="React Native runtime hints require adb run-as access to the app sandbox. Verify the app is debuggable and the selected package/device are correct.",pm='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function ph(e){return void 0!==P(e)}async function pw(e){let{device:t,appId:n,runtime:r}=e;if(!n)return;let i=P(r);if(i){if("android"===t.platform)return void await pv(t,n,i);"ios"===t.platform&&"simulator"===t.kind&&await pI(t,n,i)}}async function pg(e){let{device:t,appId:n}=e;if(n){if("android"===t.platform)return void await py(t,n);"ios"===t.platform&&"simulator"===t.kind&&await pb(t,n)}}async function pv(e,t,n){var r,i,a,o,s,l;let c,d;pM(t);let u=(r=await pS(e,t),i=pc,a=`${n.host}:${n.port}`,c=` <string name="${pE(i)}">${pE(a)}</string>`,px(pN(r,i),c));o=u,s=pd,l="https"===n.scheme,d=` <boolean name="${pE(s)}" value="${l?"true":"false"}" />`,u=px(pN(o,s),d),await p_(e,t,u)}async function py(e,t){pM(t);let n=await pS(e,t),r=pN(n,pc),i=pN(r,pd);i!==n&&await p_(e,t,i)}async function pS(e,t){let n=await en(e,["shell","run-as",t,"cat",pl],{allowFailure:!0});return 0!==n.exitCode?pm:pA(n.stdout)}async function p_(e,t,n){let r=["shell","run-as",t,"id"],i=await en(e,r,{allowFailure:!0});if(0!==i.exitCode){let e=pD(i.stdout,i.stderr);throw new F("COMMAND_FAILED",e?`Failed to access Android app sandbox for ${t}`:`Failed to probe Android app sandbox for ${t}`,{package:t,cmd:"adb",args:r,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,hint:e?pf:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await en(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await en(e,["shell","run-as",t,"tee",pl],{stdin:n.trimEnd()})}catch(r){let e=L(r);if("TOOL_MISSING"===e.code)throw e;let n=pD("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new F("COMMAND_FAILED",n?`Failed to access Android app sandbox for ${t}`:`Failed to write Android runtime hints for ${t}`,{...e.details??{},package:t,cmd:"adb",phase:"write-runtime-hints",hint:n?pf:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function pI(e,t,n){await iO(lv(e,["spawn",e.id,"defaults","write",t,pu,"-string",`${n.host}:${n.port}`])),await iO(lv(e,["spawn",e.id,"defaults","write",t,pp,"-string",n.scheme]))}async function pb(e,t){await iO(lv(e,["spawn",e.id,"defaults","delete",t,pu]),{allowFailure:!0}),await iO(lv(e,["spawn",e.id,"defaults","delete",t,pp]),{allowFailure:!0})}function pA(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
${
|
|
21
|
-
${t}`.toLowerCase();return n.includes("device
|
|
22
|
-
${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":pU)}let pW=300,pz=300;function pJ(e,t,n){return t||rs(n,ri)?null:aL("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function pX(e){return"string"==typeof e?.session&&e.session.trim().length>0}function pZ(e){return"ios"===e.platform&&"simulator"===e.kind}async function pY(e,t){pZ(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function pQ(e){let t=rs(e.flags,ri)||!e.session?await n8(e.flags??{}):await p0(e.session.device);return!1!==e.ensureReady&&await pj(t),t}async function p0(e){if("ios"!==e.platform||"simulator"!==e.kind||"darwin"!==process.platform)return e;let t={platform:"ios",target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await n8(t)}catch(e){if(!(e instanceof F)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await n8({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function p1(e){let t=e.flags?.device?.trim();return t||(e.resolvedDevice?.platform==="android"&&"emulator"===e.resolvedDevice.kind?e.resolvedDevice.name:e.sessionDevice?.platform==="android"&&"emulator"===e.sessionDevice.kind?e.sessionDevice.name:void 0)}function p2(e,t){return!!t&&0===lr(t,e).length}async function p3(e){let t=await en(e,["emu","kill"],{allowFailure:!0,timeoutMs:15e3});return{success:0===t.exitCode,exitCode:t.exitCode,stdout:String(t.stdout??""),stderr:String(t.stderr??"")}}async function p4(e){let{device:t,shutdownRequested:n}=e;if(n&&(pZ(t)||"android"===t.platform&&"emulator"===t.kind))try{return pZ(t)?await po(t):await p3(t)}catch(t){let e=$(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function p5(e){if(await dV(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await i1("dismiss",t).catch(t=>{E({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function p8(e,t){e.appLog&&await u7(e.appLog),nX(e.device.platform)&&await p5(e),await pR(t).catch(()=>{})}async function p6(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n);if(!a)return await p9(t,r);a.appLog&&await u7(a.appLog),t.positionals&&t.positionals.length>0&&(nX(a.device.platform)&&!pZ(a.device)&&await p5(a),await r9(a.device,"close",t.positionals,t.flags?.out,{...ab(r,t.flags,a.appBundleId,a.trace?.outPath)}),await pY(a.device,pW)),nX(a.device.platform)&&(!pZ(a.device)||t.flags?.shutdown||a.recording)?await p5(a):nX(a.device.platform)&&E({level:"debug",phase:"ios_runner_retained_after_close",data:{session:a.name,deviceId:a.device.id}}),ph(i.getRuntimeHints(n))&&a.appBundleId&&await pg({device:a.device,appId:a.appBundleId}).catch(()=>{}),i.recordAction(a,{command:"close",positionals:t.positionals??[],flags:t.flags??{},result:{session:a.name,...eX(`Closed: ${a.name}`)}}),t.flags?.saveScript&&(a.recordSession=!0),i.writeSessionLog(a),await pR(n).catch(()=>{}),i.delete(n);let o=await p4({device:a.device,shutdownRequested:t.flags?.shutdown});return o?{ok:!0,data:eZ({session:a.name,shutdown:o},`Closed: ${a.name}`)}:{ok:!0,data:{session:a.name,...eX(`Closed: ${a.name}`)}}}async function p9(e,t){if(!e.positionals||0===e.positionals.length)return aL("SESSION_NOT_FOUND","No active session");let n=await pQ({session:void 0,flags:e.flags,ensureReady:!0});return await r9(n,"close",e.positionals,e.flags?.out,{...ab(t,e.flags)}),await pY(n,pW),{ok:!0,data:{app:e.positionals[0],...eX(`Closed: ${e.positionals[0]}`)}}}async function p7(e,t=5e3){await Promise.all(e.map(async e=>{let n;await new Promise(r=>{n=setTimeout(()=>{!function(e){e.destroyConnections?.();let t="closeAllConnections"in e?e.closeAllConnections:void 0;if("function"==typeof t)return t.call(e);let n="closeIdleConnections"in e?e.closeIdleConnections:void 0;"function"==typeof n&&n.call(e)}(e),r()},t);try{e.close(()=>r())}catch{r()}}),n&&clearTimeout(n)}))}function fe(e){a.existsSync(e)&&a.unlinkSync(e)}function ft(e){if(!a.existsSync(e))return null;try{let t=JSON.parse(a.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function fn(e){let t=ft(e);if(!t||t.pid===process.pid)try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}function fr(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function fi(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(0,"127.0.0.1",()=>{e.off("error",r);let i=e.address();"object"==typeof i&&i?.port?n(i.port):r(new F("COMMAND_FAILED",t))})})}(async function(e={}){let t,r,o=e.env??process.env,s=e.stdout??process.stdout,l=e.stderr??process.stderr,c=e.exit??(e=>process.exit(e)),{baseDir:d,infoPath:u,lockPath:p,logPath:f,sessionsDir:m}=J(o.AGENT_DEVICE_STATE_DIR),h=Y(o.AGENT_DEVICE_DAEMON_SERVER_MODE);var w,v,y,S=m;if(a.existsSync(S))for(let e of a.readdirSync(S,{withFileTypes:!0})){if(!e.isDirectory())continue;let t=i.join(S,e.name,t2);if(a.existsSync(t))try{let e=t3(a.readFileSync(t,"utf8"));if(e&&function(e){let t,n=D(e.pid);if(!n||e.startTime&&n!==e.startTime)return!1;let r=k(e.pid);return!!r&&!!((t=r.toLowerCase().replaceAll("\\","/")).includes("log stream")||t.includes("logcat")||t.includes("devicectl device log stream"))&&(!e.command||r===e.command)}(e))try{process.kill(e.pid,"SIGTERM")}catch{}}catch{}finally{t5(t)}}let _=new tQ(m),I=new nz({maxActiveSimulatorLeases:fr(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:fr(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:fr(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:fr(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),N=tt(),M=n.randomBytes(24).toString("hex"),P=D(process.pid)??void 0,C=Q(),T=function(e){let{logPath:t,token:n,androidAdbProvider:r,appleRunnerProvider:a,appleToolProvider:o,linuxToolProvider:s,appLogProvider:l,recordingProvider:c,deviceInventoryProvider:d,trackDownloadableArtifact:u}=e,{sessionStore:p,leaseRegistry:f}=e;async function m(e){let r=!!(e.meta?.debug||e.flags?.verbose);return await b({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:r,logPath:t},async()=>{if(e.token!==n)return uv();try{return await n7(d,async()=>{let t=await uw({req:e,sessionStore:p,leaseRegistry:f});return await h(t)})}catch(e){return uS(e)}})}async function h(e,t){let n=async()=>{let n=function(e){var t,n,r;let a,{scope:o,sessionStore:s,trackDownloadableArtifact:l}=e,c=o.runnerLogPath;o.throwIfCanceled();let d=s.get(o.sessionName);d&&(!function(e){var t;let n;if(!((n=(t=e).recording)&&"ios"===t.device.platform&&"ios"!==n.platform&&!1!==n.showTouches))return;let r=e.recording,i=dG(e.device.id);if(!r.runnerSessionId){i?.alive&&(r.runnerSessionId=i.sessionId);return}if(!i?.alive){r.invalidatedReason??="iOS runner session exited during recording";return}i.sessionId!==r.runnerSessionId&&(r.invalidatedReason??="iOS runner session restarted during recording")}(d),s.set(o.sessionName,d));let u=(a=(t={req:o.req,sessionName:o.sessionName,sessionStore:s}).sessionStore.get(t.sessionName),{req:lu(t.req,a),existingSession:a}),p=u.req;d=u.existingSession;let f=e=>(function(e,t,n){let r=A();if(!t.ok){E({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=x({force:!0})??void 0;return{ok:!1,error:$(new F(O(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??("string"==typeof t.error.details?.hint?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath}),{diagnosticId:r.diagnosticId,logPath:e})}}return E({level:"info",phase:"request_success"}),x(),{ok:!0,data:function(e,t,n){var r,a;let o;if(!t)return t;let s=(r=e,o=Array.isArray((a=t).artifacts)?[...a.artifacts]:[],"screenshot"!==r.command||o.some(e=>e?.field==="path")||"string"!=typeof a.path||o.push({field:"path",path:a.path,localPath:r.meta?.clientArtifactPaths?.path,fileName:i.basename(r.meta?.clientArtifactPaths?.path??a.path)}),o.filter(e=>!!(e&&"string"==typeof e.field&&"string"==typeof e.path&&"string"==typeof e.localPath&&e.localPath.length>0)));return 0===s.length?t:{...t,artifacts:s.map(t=>{let r=t.path;return{field:t.field,artifactId:n({artifactPath:r,tenantId:e.meta?.tenantId,fileName:t.fileName}),fileName:t.fileName,localPath:t.localPath}})}}(e,t.data,n)}})(p,e,l);if(d?.recording?.invalidatedReason&&(n=o.command,rf(n)?.allowInvalidRecording!==!0))return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:d.recording.invalidatedReason}})};d&&!p.meta?.lockPolicy&&(r=o.command,rf(r)?.selectorValidationExempt!==!0)&&function(e,t){let n=lr(e,t);if(0!==n.length)throw new F("INVALID_ARGS",`Session "${e.name}" is already bound to ${lt(e)}, but this request selected ${n.map(li).join(", ")}.`,{session:e.name,conflicts:n.map(li),hint:ln(e,"selector-conflict")})}(d,p.flags);let m=(e,t,n)=>{let r;return{...ab(c,e,t,n,r=A().requestId),requestId:r}};return{type:"scope",scope:{req:p,sessionName:o.sessionName,logPath:c,existingSession:d,finalize:f,contextFromFlags:m,handlerContextFromFlags:(e,t,n)=>({...m(e,t,n),surface:s.get(o.sessionName)?.surface})}}}({scope:e,sessionStore:p,trackDownloadableArtifact:u});if("response"===n.type)return n.response;let d=n.scope,f=async e=>await w({lockedScope:d,providerScope:e,allowReplayActions:void 0===t});return t?await f(t):await rh({req:d.req,existingSession:d.existingSession,providers:{androidAdbProvider:r,appleRunnerProvider:a,appleToolProvider:o,linuxToolProvider:s,appLogProvider:l,recordingProvider:c}},f)};return t?await n():await e.runLocked(n)}async function w(e){var t,r;let{lockedScope:i,providerScope:a,allowReplayActions:o}=e,s=await sQ({req:i.req,sessionName:i.sessionName,logPath:i.logPath,sessionStore:p,leaseRegistry:f,invoke:m,invokeReplayAction:o?(t=i,r=a,async e=>{var i,a,o;if(i=e,a=t,i.session!==a.sessionName||(o=i.command,rf(o)?.replayScopedAction!==!0))return await m(e);if(e.token!==n)return uv();try{let n=await uw({req:e,sessionStore:p,leaseRegistry:f});return n.sessionName===t.sessionName?await h(n,r):await m(e)}catch(e){return uS(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await uy({lockedScope:i,logPath:i.logPath,sessionStore:p})}return m}({logPath:f,token:M,sessionStore:_,leaseRegistry:I,trackDownloadableArtifact:nd}),U=async e=>{await b({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{E({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),x({force:!0})})},G=async e=>{let t=p8(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
|
|
23
|
-
`)});await
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
`),W({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),n=t instanceof F?t:L(t);l.write(`Daemon error: ${n.message}
|
|
30
|
-
`)
|
|
31
|
-
`),
|
|
9
|
+
${r}`.toLowerCase()).includes("device is busy")&&n.includes("connecting")?"Target iOS device is still connecting. Keep it unlocked, wait for device trust/connection to settle, then retry.":`${ti("IOS_RUNNER_CONNECT_TIMEOUT")} ${lA}`)})}function lN(e){return"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function lD(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${r.randomUUID()}`}}function lk(e){if(ro(e))throw rl()}let lP=new Map;async function lE(e,t,r,n,i=45e3,a,o){let s=e7.fromTimeoutMs(i),{getEndpoints:l}=lF(e,t),{endpoints:d}=await l(s.remainingMs()),c=null,u=Math.max(1,Math.ceil(i/250));try{return await ts(async({deadline:s})=>{let u=await lC({device:e,port:t,command:r,timeoutMs:i,logPath:n,session:a,endpoints:d,getEndpoints:l,signal:o,attemptDeadline:s,setEndpoints:e=>{d=e},setLastError:e=>{c=e}});if(u)return u;throw function(e){if(e.signal?.aborted)throw rl();return new eD("COMMAND_FAILED","Runner endpoint probe failed",{port:e.port,endpoints:e.endpoints,lastError:e.lastError?String(e.lastError):void 0})}({port:t,endpoints:d,lastError:c,signal:o})},{maxAttempts:u,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:lb},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||rc(e))throw rl();c||(c=e)}if(o?.aborted)throw rl();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw lx({port:t,endpoints:d,logPath:n,lastError:c});let a=await lB(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw lx({port:t,endpoints:d,logPath:n,lastError:c})}async function lC(e){await lR(e);let t=await lO(e);if(t.response)return t.response;let r=await lT(e);return r||await lL(e,t.usedCachedTunnelIp)}async function lR(e){if(e.attemptDeadline?.isExpired())throw new eD("COMMAND_FAILED","Runner connection deadline exceeded",{port:e.port,timeoutMs:e.timeoutMs});if(e.session?.child.exitCode!==null&&e.session?.child.exitCode!==void 0)throw await lM({session:e.session,port:e.port,logPath:e.logPath})}async function lO(e){let t=e.endpoints,r=!1;if("device"===e.device.kind){let n=await e.getEndpoints(e.attemptDeadline?.remainingMs());t=n.endpoints,r=n.cached,e.setEndpoints(t)}let n=r?t[0]:null;return{response:await lU(t,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,r)=>{var i;e.setLastError(r),"device"===e.device.kind&&t===n&&(i=e.device.id,lP.delete(i))}}),usedCachedTunnelIp:r}}async function lT(e){return"simulator"===e.device.kind&&e.session?.ready?await lG(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function lL(e,t){var r;if("device"!==e.device.kind||!t)return null;r=e.device.id,lP.delete(r);let n=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(n.endpoints),await lU(n.endpoints,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,r)=>{e.setLastError(r)}})}async function l$(e,t,r,n=45e3,i){if(i?.aborted)throw rl();let a=e7.fromTimeoutMs(n),{getEndpoints:o}=lF(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new eD("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let d=a.remainingMs();if(d<=0)throw new eD("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await lj(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function lF(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await lq({device:e,timeoutBudgetMs:n,forceRefresh:i,requestTunnelIp:r,setRequestTunnelIp:e=>{r=e}});return{endpoints:(a=e,o=t,s=d.ip,l=[`http://127.0.0.1:${o}/command`],"device"!==a.kind||s&&l.unshift(`http://[${s}]:${o}/command`),l),cached:d.sharedCacheHit}}}}async function lU(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 eD("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await lj(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||rc(e))throw rl();s(t,e)}return null}async function lG(e,t,r,n){let{signal:i,attemptDeadline:a,onError:o}=n,s=a?.remainingMs()??45e3;if(s<=0)return null;try{let n=await lB(e,t,r,s,i);return new Response(n.body,{status:n.status})}catch(e){if(i?.aborted||rc(e))throw rl();return o(e),null}}async function lq(e){var t,r,n;let{device:i,timeoutBudgetMs:a,forceRefresh:o,requestTunnelIp:s,setRequestTunnelIp:l}=e;if("device"!==i.kind)return{ip:null,sharedCacheHit:!1};if(!o){let e,r=(t=i.id,(e=lP.get(t))?e.expiresAt<=Date.now()?(lP.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 lV(i.id,a);return l(d),d&&(r=i.id,n=d,lP.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function lj(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 lV(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,n=i.join(u.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),i=await iF(["devicectl","device","info","details","--device",e,"--json-output",n,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==i.exitCode||!a.existsSync(n))return null;let o=JSON.parse(a.readFileSync(n,"utf8"));if(o.info?.outcome&&"success"!==o.info.outcome)return null;let s=(o.result?.connectionProperties?.tunnelIPAddress??o.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{lX(n)}}async function lB(e,t,r,n,i){let a=JSON.stringify(r),o=lS(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 iF(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=tr({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new eD("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:ti(e)})}return{status:200,body:l}}async function lH(){return await new Promise((e,t)=>{let r=g.createServer();r.listen(0,"127.0.0.1",()=>{let n=r.address();if("object"==typeof n&&n?.port){let t=n.port;r.close(()=>e(t))}else r.close(()=>t(new eD("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function lK(e,t,r,n){t&&lz(t,e),r&&lz(r,e),n&&process.stderr.write(e)}let lW=new Map;function lz(e,t){let r=(lW.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await a.promises.mkdir(i.dirname(e),{recursive:!0}),await a.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{lW.get(e)===r&&lW.delete(e)});lW.set(e,r)}function lX(e){try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}async function lJ(e){let{lockDirPath:t,owner:r}=e,n=i.join(t,"owner.json"),o=Date.now()+(e.timeoutMs??3e4),s=e.pollMs??100,l=e.ownerGraceMs??5e3,d=e.description??"process lock";for(a.mkdirSync(i.dirname(t),{recursive:!0});Date.now()<o;)try{a.mkdirSync(t),function(e,t){let r=`${e}.${process.pid}.${Date.now()}.tmp`;a.writeFileSync(r,JSON.stringify(t),"utf8"),a.renameSync(r,e)}(n,r);let e=!1;return async()=>{e||(e=!0,a.rmSync(t,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,t,r){let n=null;try{n=a.statSync(e)}catch{return!0}let i=lZ(t);if(i){var o;return!(Number.isInteger((o=i).pid)&&!(o.pid<=0)&&eb(o.pid)&&(!o.startTime||ev(o.pid)===o.startTime))&&(a.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-n.mtimeMs<r)&&(a.rmSync(e,{recursive:!0,force:!0}),!0)}(t,n,l))continue;await eK(s)}throw new eD("COMMAND_FAILED",`Timed out waiting for ${d}`,{lockDirPath:t,...function(e,t){let r,n=Date.now(),i=lZ(t);try{r=Math.max(0,Math.round(n-a.statSync(e).mtimeMs))}catch{}return{...void 0!==r?{lockAgeMs:r}:{},...i?{ownerPid:i.pid,ownerStartTime:i.startTime,ownerAgeMs:Math.max(0,Math.round(n-i.acquiredAtMs))}:{}}}(t,n)})}function lZ(e){try{return JSON.parse(a.readFileSync(e,"utf8"))}catch{return null}}let lY=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function lQ(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new eD("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",xctestrunPath:r});let n=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of n)if(!a.existsSync(e))throw new eD("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await l0(e)){await i$("codesign",["--remove-signature",e],{allowFailure:!0});try{await i$("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof eD?n:new eD("COMMAND_FAILED",String(n));throw new eD("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 l0(e){return 0===(await i$("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let l1=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),l2=new Set([" "," ","\n","\r"]),l3=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function l5(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new l8(e).parse()}function l4(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)}l4(r.children,t)}}class l8{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(l3.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?l6(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])&&l1.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,l6(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])&&l2.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function l6(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 l9=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function l7(e){var t;let r=await de(e);if(!r||0===r.length)return null;let n=i.dirname(e),o=new Set,s=function(e,t){let r=[],n=new Set,a=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){a.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);r.push(i.join(t,e));let s=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(e);s&&n.add(i.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(n),hostRelativePaths:a}}(r,n);for(let e of s.testRootPaths){if(!a.existsSync(e))return null;o.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>a.existsSync(i.join(t,e)));return r?i.join(r,e):null})){if(!e)return null;o.add(e)}return Array.from(o)}async function de(e){let t=await iU(e);if(t){var r,n,i,o=t;let e=new Set;for(let t of[i=o,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!dt(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(dt))}return r}(i),...Object.values(i).filter(e=>dt(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(l9.has(r)){if("string"==typeof n){t.add(n);continue}if(Array.isArray(n))for(let e of n)"string"==typeof e&&t.add(e)}return Array.from(t)}(t))e.add(r);return Array.from(e)}if("darwin"===process.platform)return null;try{let t;return r=a.readFileSync(e,"utf8"),n=l5(r),t=new Set,l4(n,(e,r)=>{if(l9.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 dt(e){return!!e&&"object"==typeof e}let dr=["CFBundleIcons","CFBundleIcons~ipad"];async function dn(e){let t=e.filter(dd);if(0===t.length)return;let r=e.filter(e=>du(e)&&!dc(e));for(let e of t){let t=function(e,t){let r=i.dirname(e);return t.find(e=>i.dirname(e)===r&&"AgentDeviceRunner.app"===i.basename(e))??t.find(t=>i.dirname(t)===r&&t!==e)??null}(e,r);t&&await di(t,e)}}async function di(e,t){var r;let n,o=function(e,t){let r=!1;for(let o of a.readdirSync(e,{withFileTypes:!0})){var n;if(o.isFile()&&(n=o.name,/^AppIcon.*\.png$/.test(n)||"Assets.car"===n))(function(e,t){if(a.existsSync(t)){let r=a.readFileSync(e),n=a.readFileSync(t);return!r.equals(n)&&(a.copyFileSync(e,t),!0)}return a.copyFileSync(e,t),!0})(i.join(e,o.name),i.join(t,o.name))&&(r=!0)}return r}(e,t),s=await da(e,t);(o||s)&&(await dl(t),r=t,n=new Date,a.utimesSync(r,n,n))}async function da(e,t){var r,n;let a=i.join(e,"Info.plist"),o=i.join(t,"Info.plist"),s=await iU(a),l=await iU(o);if(!s||!l)return!1;let d=(r=s,n=l,dr.flatMap(e=>{let t=r[e];return void 0===t||JSON.stringify(n[e])===JSON.stringify(t)?[]:[{key:e,value:t,shouldInsert:void 0===n[e]}]}));if(0===d.length)return!1;for(let e of d)await ds(o,e.key,e.value,e.shouldInsert);return!0}async function ds(e,t,r,n){let i=await i$("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new eD("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function dl(e){let t=await i$("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new eD("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function dd(e){return du(e)&&dc(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function dc(e){return i.basename(e).endsWith("-Runner.app")}function du(e){return i.basename(e).endsWith(".app")}let dp={iOS:{sdkName:{simulator:"iphonesimulator",device:"iphoneos"},derivedBaseName:{simulator:"ios-simulator",device:"ios-device"},xctestrunHints:{simulator:{preferred:["iphonesimulator"],disallowed:["iphoneos","appletvos","appletvsimulator","macos"]},device:{preferred:["iphoneos"],disallowed:["iphonesimulator","appletvos","appletvsimulator","macos"]}}},tvOS:{sdkName:{simulator:"appletvsimulator",device:"appletvos"},derivedBaseName:{simulator:"tvos-simulator",device:"tvos-device"},xctestrunHints:{simulator:{preferred:["appletvsimulator"],disallowed:["appletvos","iphoneos","iphonesimulator","macos"]},device:{preferred:["appletvos"],disallowed:["appletvsimulator","iphoneos","iphonesimulator","macos"]}}},macOS:{sdkName:{simulator:"macosx",device:"macosx"},derivedBaseName:{simulator:"macos",device:"macos"},xctestrunHints:{simulator:{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]},device:{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]}}}};function df(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eD("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":eX(e.target)}function dm(e){return"simulator"===e?"simulator":"device"}function dh(){return"arm64"===process.arch?"arm64":"x86_64"}let dw="XCTestDevices",dg=".agent-device-backup",dy=".agent-device-xctestdevices-backup-",dv=i.join(u.homedir(),".agent-device","ios-runner"),dS=".agent-device-runner-cache.json",dI={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},dA=new Map,d_=new Set,db=new Map,dx=new Set;function dM(e){return e?.trim()??""}function dN(e=process.env){return dM(e.AGENT_DEVICE_IOS_BUNDLE_ID)||dM(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function dD(e=process.env){let t=dM(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${dN(e)}.uitests`}let dk=function(e=process.env){let t=dN(e),r=dD(e);return Array.from(new Set([dM(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function dP(e=u.homedir()){return i.join(e,"Library","Developer","XCTestDevices")}async function dE(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=e8(e.simulatorSetPath);if(!r)return null;let n=i.resolve(r),o=i.resolve(t.xctestDeviceSetPath??dP()),s=i.resolve(t.backupPath??function(e=dP()){return`${e}${dg}`}(o)),l=i.resolve(t.lockDirPath??function(e=u.homedir()){return i.join(e,".agent-device","xctest-device-set.lock")}()),d=t.ownerStartTime??ev(process.pid),c=await dO({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(dC({xctestDeviceSetPath:o,backupPath:s}),function(e,t){if(i.resolve(e)===i.resolve(t))return!0;try{return a.realpathSync.native(e)===a.realpathSync.native(t)}catch{return!1}}(n,o))return await c(),null;a.mkdirSync(n,{recursive:!0}),a.existsSync(o)&&a.renameSync(o,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,n=i.dirname(r),o=i.join(n,`${dw}.agent-device-link-${process.pid}-${Date.now()}`);a.mkdirSync(n,{recursive:!0});try{a.symlinkSync(t,o,"dir"),a.renameSync(o,r)}catch(e){throw a.existsSync(o)&&dR(o),e}}({requestedSetPath:n,xctestDeviceSetPath:o})}catch(e){throw dC({xctestDeviceSetPath:o,backupPath:s}),await c(),new eD("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:n,xctestDeviceSetPath:o,backupPath:s,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{dC({xctestDeviceSetPath:o,backupPath:s})}finally{await c()}}}}}function dC(e){let{xctestDeviceSetPath:t,backupPath:r}=e,n=[r,...function(e){let t=i.dirname(e),r=i.basename(e).replace(dg,""),n=r===dw?dy:`${r}${dy}`;try{return a.readdirSync(t).filter(e=>e.startsWith(n)).sort().map(e=>i.join(t,e))}catch{return[]}}(r)],o=n.find(e=>a.existsSync(e)),s=a.existsSync(t)&&a.lstatSync(t).isSymbolicLink();if(o){if(s&&dR(t),a.existsSync(t))if(!s)return void ei({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:o}});else o!==r?a.rmSync(o,{recursive:!0,force:!0}):a.rmSync(r,{recursive:!0,force:!0});else a.mkdirSync(i.dirname(t),{recursive:!0}),a.renameSync(o,t);for(let e of n)e!==o&&a.existsSync(e)&&a.rmSync(e,{recursive:!0,force:!0});return}s&&(ei({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),dR(t))}function dR(e){!a.existsSync(e)||a.lstatSync(e).isSymbolicLink()&&a.unlinkSync(e)}async function dO(e){return await lJ({lockDirPath:e.lockDirPath,owner:e.owner,timeoutMs:e.timeoutMs??3e4,pollMs:e.pollMs??100,ownerGraceMs:5e3,description:e.description??"XCTest device set lock"})}async function dT(e){var t;return await dO({lockDirPath:(t=e,i.join(i.dirname(t),`${i.basename(t)}.lock`)),owner:{pid:process.pid,startTime:ev(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function dL(e,t){let r=tb(),n=dV(e,r),i=ce(e,n);return await lr(dA,i,async()=>{let a=await dT(i);try{return await d$({device:e,options:t,projectRoot:r,expectedCacheMetadata:n,derived:i,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await a()}})}async function d$(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(te(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||d_.has(t))&&(cs("clean",r?"forced_rebuild":"forced_clean",{derived:t}),ca(t),dq(t),d_.delete(t));let l=await co({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>d1(e,n),xctestrunReferencesProjectRoot:d3,resolveExistingXctestrunProductPaths:l7}),d="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&cs("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let c=await dF({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:d});return c||(l.xctestrunPath&&(ca(s),dq(s)),await dU({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:d,reason:l.reason}))}async function dF(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await dG(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function dU(e){let{device:t,options:r,projectRoot:n,expectedCacheMetadata:o,derived:s,cache:l,reason:d}=e,c=i.join(n,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!a.existsSync(c))throw new eD("COMMAND_FAILED","iOS runner project not found",{projectPath:c});let u=Date.now();await d7(t,c,s,r);let p=Math.max(0,Date.now()-u),f=d1(s,t);if(!f)throw new eD("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await l7(f);if(!m)throw new eD("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await lQ(t,m,f),await dn(m),dH(s,dX(o,f,m)),cs("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:d}}async function dG(e,t,r,n){try{var i,a,o,s;return await lQ(e,n.productPaths,n.xctestrunPath),cs("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,dH(i,dX(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof eD))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&lY.has(t)}(e))throw e;return cs("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function dq(e){try{if(!a.existsSync(e))return;if("derived"!==i.basename(e))return void a.rmSync(e,{recursive:!0,force:!0});for(let r of a.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,dj.has(t)&&a.rmSync(i.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let dj=new Set([dS,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function dV(e,t=tb()){let n,o=df(e);return{schemaVersion:2,packageVersion:t_(),runnerSourceFingerprint:function(e){let t=i.join(e,"ios-runner","AgentDeviceRunner"),n=function(e){if(!a.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of a.readdirSync(e,{withFileTypes:!0})){var n,o;let a=i.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(a);continue}s.isFile()&&(n=s.name,o=a,"project.pbxproj"===n?o.includes(`${i.sep}.xcodeproj${i.sep}`):[".jpg",".json",".png",".swift",".m",".h",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(i.extname(n)))&&t.push(a)}}return t.sort((e,t)=>e.localeCompare(t))}(t),o=function(e,t){let n=r.createHash("sha256");for(let r of t){let t=i.relative(e,r),o=a.statSync(r);n.update(t),n.update("\0"),n.update(String(o.size)),n.update("\0"),n.update(String(Math.trunc(o.mtimeMs))),n.update("\0")}return n.digest("hex")}(t,n),s=d0.get(t);if(s?.fileStatsFingerprint===o)return s.sourceFingerprint;let l=r.createHash("sha256");for(let e of n){let r=i.relative(t,e);l.update(r),l.update("\0"),l.update(a.readFileSync(e)),l.update("\0")}let d=l.digest("hex");return d0.set(t,{fileStatsFingerprint:o,sourceFingerprint:d}),d}(t),...function(e,t){var r;let n=(r=dB("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=dp[e].sdkName[dm(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:dB("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:dB("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(o,e.kind),platformName:o,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(n=df(e))?`platform=macOS,arch=${dh()}`:"simulator"===e.kind?`generic/platform=${n} Simulator`:`generic/platform=${n}`,runnerBundleBuildSettings:cn(process.env),runnerSigningBuildSettings:cr(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:ci()}}function dB(e,t){let r=JSON.stringify([e,t]),n=db.get(r);if(void 0!==n)return n;try{let n=eC(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return db.set(r,i),i}catch{return db.set(r,"unknown"),"unknown"}}function dH(e,t){a.mkdirSync(e,{recursive:!0}),a.writeFileSync(i.join(e,dS),`${JSON.stringify(t,null,2)}
|
|
10
|
+
`)}async function dK(e,t){d_.add(e.derived);let r=await dT(e.derived);try{cs("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),ca(e.derived),dq(e.derived)}finally{await r()}}function dW(e){let{artifacts:t,...r}=e;return r}function dz(e){return JSON.stringify(function e(t){return Array.isArray(t)?t.map(t=>e(t)):t&&"object"==typeof t?Object.fromEntries(Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([t,r])=>[t,e(r)])):t}(e))}function dX(e,t,r){let n=function(e,t){let r=dZ(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=dZ(e);if(null===t)return null;n.push({path:e,...t})}return{xctestrunPath:e,xctestrunMtimeMs:r.mtimeMs,xctestrunSize:r.size,productPaths:n}}(t,r);return n?{...e,artifacts:n}:e}function dJ(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function dZ(e){try{let t=a.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function dY(e,t){let r=dZ(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function dQ(e,t){let r=i.relative(i.resolve(t),i.resolve(e));return""!==r&&!r.startsWith("..")&&!i.isAbsolute(r)}let d0=new Map;function d1(e,t){if(!a.existsSync(e))return null;let r=[],n=[e];for(;n.length>0;){let e=n.pop();for(let t of a.readdirSync(e,{withFileTypes:!0})){let o=i.join(e,t.name);if(t.isDirectory()){n.push(o);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=a.statSync(o);r.push({path:o,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,r)=>{if(t){let n=d2(r.path,t)-d2(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function d2(e,t){let r=0,n=e.toLowerCase();i.basename(n).startsWith("agentdevicerunner.env.")&&(r-=1e3),n.includes(`${i.sep}macos${i.sep}`)&&(r-=5e3);let a=dp[df(t)].xctestrunHints[dm(t.kind)];return a.preferred.length>0&&(a.preferred.some(e=>n.includes(e))?r+=2e3:r-=500),a.disallowed.some(e=>n.includes(e))&&(r-=2500),r}function d3(e,t){try{let r=a.readFileSync(e,"utf8"),n=new Set([t]);try{n.add(a.realpathSync(t))}catch{}for(let e of n)if(r.includes(e))return!0;return!1}catch{return!1}}async function d5(e,t,r){let n=i.dirname(e),a=r.replace(/[^a-zA-Z0-9._-]/g,"_"),o=i.join(n,`AgentDeviceRunner.env.${a}.json`),s=i.join(n,`AgentDeviceRunner.env.${a}.xctestrun`),l=await d4(e);return d6(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})}),d6(l,e=>Object.assign(e,dI),{requireTestBundlePath:!0}),await d8(l,o,s),{xctestrunPath:s,jsonPath:o}}async function d4(e){let t=await i$("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new eD("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 eD("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function d8(e,t,r){a.writeFileSync(t,JSON.stringify(e,null,2));let n=await i$("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new eD("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:r,stderr:n.stderr})}function d6(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=d9(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=d9(r,{requireTestBundlePath:!0});e&&t(e)}}function d9(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function d7(e,t,r,n){let i=cn(process.env),a=cr(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=ci(),l=await dE(e);try{let l;await eP("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",ct(e),"1","-destination",(l=df(e),"macOS"===l?`platform=macOS,arch=${dh()}`:"simulator"===e.kind?`platform=${l} Simulator,id=${e.id}`:`generic/platform=${l}`),"-derivedDataPath",r,...s,...i,...o,...a],{detached:!0,timeoutMs:n.buildTimeoutMs,onSpawn:e=>{dx.add(e),e.on("close",()=>{dx.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 eD?a:new eD("COMMAND_FAILED",String(a)),i=(e=r.details?JSON.stringify(r.details):"",((t=`${r.message}
|
|
11
|
+
${e}`.toLowerCase()).includes("failed registering bundle identifier")||t.includes("app identifier")&&t.includes("not available")?"Set AGENT_DEVICE_IOS_BUNDLE_ID to a unique reverse-DNS value (for example, com.yourname.agentdevice.runner), then retry.":t.includes("requires a development team")?"Configure signing in Xcode or set AGENT_DEVICE_IOS_TEAM_ID for physical-device runs.":t.includes("no profiles for")||t.includes("provisioning profile")?"Install/select a valid iOS provisioning profile, or set AGENT_DEVICE_IOS_PROVISIONING_PROFILE.":t.includes("code signing")?"Enable Automatic Signing in Xcode or provide AGENT_DEVICE_IOS_TEAM_ID and optional AGENT_DEVICE_IOS_SIGNING_IDENTITY.":void 0)??lA);throw new eD("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await l?.release()}}function ce(e,t){let n,a=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(a)return i.resolve(a);let o=(n=r.createHash("sha256").update(dz(dW(t))).digest("hex"),`cache-${n.slice(0,16)}`),s=function(e){return i.join(dv,"derived",dp[df(e)].derivedBaseName[dm(e.kind)])}(e);return i.join(s,o)}function ct(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function cr(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 cn(e=process.env){let t=dN(e),r=dD(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function ci(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function ca(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,n;if(r=e,t=i.resolve(tb(),".tmp"),""===(n=i.relative(t,i.resolve(r)))||n.startsWith("..")||i.isAbsolute(n))throw new eD("COMMAND_FAILED","Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically",{derivedPath:e,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${i.join(tb(),".tmp")}.`})}}async function co(e){var t,r;let n,o=(t=e.derived,r=e.expectedCacheMetadata,(n=function(e){try{let t=JSON.parse(a.readFileSync(i.join(e,dS),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?dz(dW(n))!==dz(dW(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:n}:{ok:!1,reason:"cache_metadata_missing"}),s=o.ok?function(e,t){var r;let n=t?.artifacts;if(!(!(!(r=n)||"object"!=typeof r||Array.isArray(r))&&"string"==typeof r.xctestrunPath&&Number.isInteger(r.xctestrunMtimeMs)&&Number.isInteger(r.xctestrunSize)&&Array.isArray(r.productPaths)&&r.productPaths.length>0&&r.productPaths.every(dJ))||!dQ(n.xctestrunPath,e)||!dY(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!dQ(t.path,e)||!dY(t.path,t))return null;i.push(t.path)}return{xctestrunPath:n.xctestrunPath,productPaths:i}}(e.derived,o.metadata):null,l=s?.xctestrunPath??e.findXctestrun(e.derived);if(!l)return{reason:"missing_xctestrun",xctestrunPath:null};let d=s?.xctestrunPath===l,c=d?"manifest":"scan",u=d?s.productPaths:await e.resolveExistingXctestrunProductPaths(l);return u?e.xctestrunReferencesProjectRoot(l,e.projectRoot)||d?o.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:u,source:c}:{reason:o.reason,xctestrunPath:l,productPaths:u,source:c}:{reason:"project_root_mismatch",xctestrunPath:l,productPaths:u,source:c}:{reason:"missing_products",xctestrunPath:l,productPaths:[],source:c}}function cs(e,t,r){ei({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let cl=process.pid,cd=ev(process.pid),cc=(t$=cl,tF=cd,(e=r.createHash("sha256")).update(String(t$)),e.update("\0"),e.update(tF??"unknown-start"),`owner-${t$}-${e.digest("hex").slice(0,8)}`);async function cu(e,t){let r=await lJ({lockDirPath:`${cg(e)}.lock`,owner:{pid:cl,startTime:cd,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await r()}}function cp(e){try{let t=JSON.parse(a.readFileSync(cg(e),"utf8"));return function(e,t){var r,n,i;let a;if(!e||"object"!=typeof e||Array.isArray(e)||1!==e.schemaVersion||e.deviceId!==t)return null;let o=(r=e,a={ownerToken:cy(r.ownerToken),ownerPid:cv(r.ownerPid),sessionId:cy(r.sessionId),port:cv(r.port),xctestrunPath:cy(r.xctestrunPath),jsonPath:cy(r.jsonPath),createdAtMs:(n=r.createdAtMs,"number"==typeof n&&Number.isFinite(n)?n:null)},Object.values(a).some(e=>null===e)?null:a);return o?{schemaVersion:1,deviceId:t,...o,ownerStartTime:(i=e.ownerStartTime,"string"==typeof i?i:null),runnerPid:cv(e.runnerPid)}:null}(t,e)}catch{return null}}function cf(e){var t;return e?e.ownerToken===cc?{type:"owned",lease:e}:eb((t=e).ownerPid)&&(!t.ownerStartTime||ev(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function cm(e,t){let r=cf(cp(e));if("empty"===r.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===r.type)throw new eD("COMMAND_FAILED",`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,ownerPid:r.lease.ownerPid,ownerStartTime:r.lease.ownerStartTime,ownerToken:r.lease.ownerToken,sessionId:r.lease.sessionId,hint:"Use a different simulator/session, wait for the other run to finish, or stop the owning daemon before retrying."});await cS(r.lease,r.type,t)}async function ch(e,t){let r=cf(cp(e));"owned"===r.type&&await cS(r.lease,"owned",t)}function cw(e){e&&function(e){let t=cp(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{a.unlinkSync(cg(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function cg(e){let t;return i.join((t=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim())?i.resolve(t):i.join(u.homedir(),".agent-device","ios-runner","leases"),`${e.replaceAll(/[^A-Za-z0-9._-]/g,"-")||"unknown-device"}.json`)}function cy(e){return"string"==typeof e&&e.length>0?e:null}function cv(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function cS(e,t,r){ei({level:"stale"===t?"warn":"debug",phase:"ios_runner_lease_cleanup",data:{deviceId:e.deviceId,ownerPid:e.ownerPid,ownerToken:e.ownerToken,runnerPid:e.runnerPid,sessionId:e.sessionId,reason:t}}),await r.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGTERM"),await r.cleanupRunnerXcodebuildProcesses(e.deviceId,e.ownerToken),await r.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGKILL"),r.cleanupTempFile(e.xctestrunPath),r.cleanupTempFile(e.jsonPath),cw(e)}let cI={cleanupRunnerProcessTree:cC,cleanupRunnerXcodebuildProcesses:cR,cleanupTempFile:lX};async function cA(e,t={}){var r;!1!==t.graceful?await cM(e):await cC(e.child.pid,"SIGTERM"),await cN(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(ck(r)||eA(r))&&await cC(e.child.pid,"SIGKILL"),await cD(e)}async function c_(e){await ch(e,cI)}async function cb(e){let t=Array.from(dx);await cP(e,"SIGINT"),await cE(t,"SIGINT"),await cP(e,"SIGTERM"),await cE(t,"SIGTERM"),await cP(e,"SIGKILL"),await cE(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await cD(e)}))}async function cx(){let e=Array.from(dx);await Promise.allSettled(e.map(async e=>{try{await cC(e.pid,"SIGTERM"),await cC(e.pid,"SIGKILL")}finally{dx.delete(e)}}))}async function cM(e){try{await lE(e.device,e.port,lD({command:"shutdown"}),void 0,15e3)}catch{await cC(e.child.pid,"SIGTERM")}}async function cN(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function cD(e){lX(e.xctestrunPath),lX(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{cw(e.lease)}}function ck(e){return!!e&&eb(e)}async function cP(e,t){await Promise.allSettled(e.map(async e=>{await cC(e.child.pid,t)}))}async function cE(e,t){await Promise.allSettled(e.map(async e=>{await cC(e.pid,t),"SIGKILL"===t&&dx.delete(e)}))}async function cC(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 i$("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function cR(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${cO(e)}-${cO(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${cO(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await i$("pkill",[`-${t}`,"-f",r],{allowFailure:!0,timeoutMs:2e3})}catch(r){ei({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:t,error:r instanceof Error?r.message:String(r)}})}}function cO(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function cT(e){let t=await cL(e.logPath);return t?new eD(t.code??e.error.code,e.error.message,{...e.error.details??{},hint:"string"==typeof e.error.details?.hint?`${e.error.details.hint} ${t.hint}`:t.hint,runnerFailureReason:t.reason},e.error):e.error}async function cL(e){if(!e)return;let t=await c$(e,65536);if(t){var r,n;let e;return(r=e=t.toLowerCase()).includes("axruntime")&&r.includes("coretext")&&(r.includes("attributesforelement")||r.includes("axuielementcopymultipleattributevalues")||r.includes("reconstitutedsmuggledctfontfromdictionary")||r.includes("reconstitutedsmuggledattributedstringfromdictionary"))?{code:"IOS_TARGET_APP_CRASH",reason:"target_app_axruntime_coretext_crash",hint:"The target iOS app appears to have crashed while XCTest/AXRuntime read accessibility attributes. This is usually a simulator/XCTest/runtime or app accessibility payload issue, not a text-entry failure. Reproduce on the latest stable simulator runtime, reinstall the app, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime."}:(n=e).includes("process crashed")||n.includes("the application under test")||n.includes("terminated unexpectedly")||n.includes("exception type:")&&n.includes("thread 0 crashed")||n.includes("crashed")&&n.includes("xctest")?{code:"IOS_TARGET_APP_CRASH",reason:"target_app_crash",hint:"The target iOS app appears to have crashed while the runner was executing the command. Reopen or reinstall the app, retry on a fresh/latest stable simulator runtime, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime."}:void 0}}async function c$(e,t){let r;try{let n=await w.stat(e),i=Math.max(0,n.size-t),a=n.size-i;if(a<=0)return;r=await w.open(e,"r");let o=Buffer.alloc(a);return await r.read(o,0,a,i),o.toString("utf8")}catch{return}finally{await r?.close().catch(()=>{})}}let cF=new Map,cU=new Map,cG=new Set(["tap","longPress","drag","swipe","scroll","sequence"]);async function cq(e,t){return await lr(cU,e.id,async()=>{let r=cF.get(e.id);if(r){let t=await cV(e,r);if(t)return t}return await cu(e.id,async()=>await cj(e,t))})}async function cj(e,t){var r,n;let o,s,l={};await c6(l,"cleanup_stale_xcodebuild",async()=>{await cm(e.id,cI)}),await c6(l,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(ei({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):cY(t))}),t.cleanStaleBundles?await c6(l,"cleanup_stale_bundles",async()=>{await cB(e)}):(l.cleanup_stale_bundles=0,ei({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let d=await c6(l,"ensure_xctestrun",async()=>await dL(e,t));l.build_xctestrun=d.buildMs;let c=await c6(l,"allocate_port",async()=>await lH()),{xctestrunPath:u,jsonPath:p}=await c6(l,"prepare_xctestrun_env",async()=>await d5(d.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(c)},`session-${e.id}-${cc}-${c}`)),f=await c6(l,"simulator_set_redirect",async()=>await dE(e));try{({child:o,wait:s}=await c6(l,"launch_xcodebuild",()=>{let t;return ek("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",ct(e),"1","-destination-timeout",String(20),"-xctestrun",u,"-destination",(t=df(e),"macOS"===t?`platform=macOS,arch=${dh()}`:"simulator"===e.kind?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(c)},detached:!0})}))}catch(e){throw await f?.release(),e}o.stdout?.on("data",e=>{lK(e,t.logPath,t.traceLogPath,t.verbose)}),o.stderr?.on("data",e=>{lK(e,t.logPath,t.traceLogPath,t.verbose)});let m=`${e.id}:${c}:${Date.now()}`,h={schemaVersion:1,deviceId:(r={deviceId:e.id,sessionId:m,runnerPid:o.pid,port:c,xctestrunPath:u,jsonPath:p}).deviceId,ownerToken:cc,ownerPid:cl,ownerStartTime:cd,sessionId:r.sessionId,runnerPid:r.runnerPid??null,port:r.port,xctestrunPath:r.xctestrunPath,jsonPath:r.jsonPath,createdAtMs:Date.now()},w={sessionId:m,device:e,deviceId:e.id,port:c,xctestrunPath:u,xctestrunArtifact:d,jsonPath:p,testPromise:s,child:o,ready:!1,startupTimeoutMs:"number"==typeof(n=t.startupTimeoutMs)&&Number.isFinite(n)&&n>0?Math.floor(n):void 0,startupTimings:l,simulatorSetRedirect:f??void 0,lease:h};try{let e,t;e=cg(h.deviceId),a.mkdirSync(i.dirname(e),{recursive:!0}),t=`${e}.${process.pid}.${Date.now()}.tmp`,a.writeFileSync(t,JSON.stringify(h,null,2),"utf8"),a.renameSync(t,e)}catch(t){throw await cz(e.id,w,{graceful:!1,waitTimeoutMs:1e3}),t}return cF.set(e.id,w),w}async function cV(e,t){if(!ck(t.child.pid))return await c6({},"stop_stale_session",async()=>{await cz(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=ce(e,dV(e));return t.xctestrunArtifact?.derived!==r?(ei({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:t.xctestrunArtifact?.derived,expectedDerived:r}}),await c6({},"stop_stale_artifact_session",async()=>{await cz(e.id,t)}),null):(ei({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready}}),t)}async function cB(e){if("simulator"===e.kind)for(let t of dk){let r=await cH(e,t);if(!r||function(e){if(0===e.exitCode)return!0;let t=`${e.stdout}
|
|
12
|
+
${e.stderr}`.toLowerCase();return t.includes("not installed")||t.includes("found nothing")||t.includes("no such file")||t.includes("invalid device")||t.includes("could not find")}(r))continue}}async function cH(e,t){try{return await iF(lS(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(r){ei({level:"warn",phase:"ios_runner_startup_cleanup_stale_bundle_failed",data:{deviceId:e.id,bundleId:t,timeoutMs:1e4,error:r instanceof Error?r.message:String(r)}});return}}function cK(e){let t=cF.get(e);return t?{sessionId:t.sessionId,alive:ck(t.child.pid)}:null}async function cW(e,t){await lr(cU,e.deviceId,async()=>{cF.get(e.deviceId)===e&&(ei({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await cz(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function cz(e,t,r={}){let n=t??cF.get(e);n&&(await cA(n,r),cF.get(e)===n&&cF.delete(e))}async function cX(e){await lr(cU,e,async()=>{await cu(e,async()=>{await cz(e),await c_(e)})})}async function cJ(){let e=Array.from(cF.values());for(let t of(await cb(e),e))cF.get(t.deviceId)===t&&cF.delete(t.deviceId)}async function cZ(){await cJ();let e=Array.from(cF.keys());await Promise.allSettled(e.map(async e=>{await cX(e)})),await cx()}async function cY(e){await iF(lS(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}function cQ(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eD("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new eD("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function c0(e,t,r,n,i,a){var o,s,l,d,c,u;let p;o=t,s=r.command,o.startupTimingsReported||!o.startupTimings||(o.startupTimingsReported=!0,ei({level:"info",phase:"ios_runner_session_startup_timings",durationMs:Object.values(o.startupTimings).reduce((e,t)=>e+t,0),data:{command:s,sessionId:o.sessionId,ready:o.ready,timings:o.startupTimings}}));let f=lD(r),m=lN(f.command),h=e7.fromTimeoutMs(i),w=function(e,t){var r;let n=lN(t.command);if(!e.ready)return n?{action:"skip",reason:"read_only_startup_command"}:{action:"run",reason:"startup"};if("uptime"===(r=t.command)||"status"===r)return{action:"skip",reason:"readiness_probe_command"};if(!cG.has(t.command))return{action:"run",reason:"conservative_command"};let i=e.lastHealthyMutation;if(!i)return{action:"run",reason:"no_recent_healthy_mutation"};if(t.appBundleId!==i.appBundleId)return{action:"run",reason:"app_activation_uncertain"};let a=Date.now()-i.atMs;return a>5e3?{action:"run",reason:"healthy_mutation_stale",lastHealthyMutationAgeMs:a}:{action:"skip",reason:"recent_healthy_mutation",lastHealthyMutationAgeMs:a}}(t,f);"run"===w.action?await c3({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,signal:a,decision:w}):(l=f,d=t,c=w,ei({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:l.command,commandId:l.commandId,reason:c.reason,lastHealthyMutationAgeMs:"recent_healthy_mutation"===c.reason?c.lastHealthyMutationAgeMs:void 0,sessionReady:d.ready}}));try{p=await c2({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,timeoutMs:i,signal:a,readOnlyCommand:m})}catch(e){throw c1(e,t,w)}try{let e=await c5(p,t,n),r=function(e){if(!0===e.runnerFatal)return"string"==typeof e.runnerFatalReason&&e.runnerFatalReason.trim().length>0?e.runnerFatalReason:"runner_reported_fatal_response"}(e);return r?(t.lastHealthyMutation=void 0,await cW(t,r)):cG.has(f.command)&&(t.lastHealthyMutation={atMs:Date.now(),appBundleId:f.appBundleId}),e}catch(r){let e=function(e){if(e instanceof eD){if("IOS_AX_SNAPSHOT_FAILED"===e.code)return"ax_snapshot_failure";if("XCTEST_RECORDED_FAILURE"===e.code)return"xctest_recorded_failure"}}(r);if(e)throw t.lastHealthyMutation=void 0,await cW(t,e),r;if((u=r)instanceof eD&&u.details?.runner!==void 0)throw r;throw c1(r,t,w)}}function c1(e,t,r){return"skip"!==r.action||"recent_healthy_mutation"!==r.reason?e:(t.lastHealthyMutation=void 0,c4(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:r.reason,runnerReadinessPreflightSkippedAgeMs:r.lastHealthyMutationAgeMs}))}async function c2(e){let{device:t,session:r,runnerCommand:n,logPath:i,deadline:a,timeoutMs:o,signal:s,readOnlyCommand:l}=e,d=a.remainingMs();if(d<=0)throw new eD("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:o});let c=l?{command:n.command,commandId:n.commandId,readOnly:!0,sessionReady:r.ready,timeoutMs:d}:{command:n.command,commandId:n.commandId};return await er("ios_runner_command_send",async()=>l?await lE(t,r.port,n,i,d,r,s):await l$(t,r.port,n,d,s),c)}async function c3(e){let{device:t,session:r,runnerCommand:n,logPath:i,deadline:a,signal:o,decision:s}=e,l=r.ready?Math.min(1e3,a.remainingMs()):Math.min(c8(r),a.remainingMs());try{let e=await er("ios_runner_readiness_preflight",async()=>await lE(t,r.port,lD({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:r.ready,timeoutMs:l});await c5(e,r,i)}catch(e){throw c4(e,{runnerReadinessPreflightFailed:!0})}}async function c5(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new eD("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?ex(e):"COMMAND_FAILED",i="string"==typeof n.error?.message?n.error.message:void 0,a="string"==typeof n.error?.hint?n.error.hint:void 0;throw await cT({error:new eD(t,i??"Runner error",{runner:n,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,logPath:r}),logPath:r})}if(t.ready=!0,n.data&&"object"==typeof n.data&&!Array.isArray(n.data)){var a;let e,t=n.data;return"string"==typeof(e=(a=t).gestureFallback)&&0!==e.length&&ei({level:"debug",phase:"ios_runner_gesture_fallback",data:{fallback:e,message:"string"==typeof a.gestureFallbackMessage?a.gestureFallbackMessage:void 0,hint:"string"==typeof a.gestureFallbackHint?a.gestureFallbackHint:void 0}}),t}return{}}function c4(e,t){let r=e instanceof eD?e:new eD("COMMAND_FAILED",e instanceof Error?e.message:String(e),void 0,e);return new eD(r.code,r.message,{...r.details??{},...t},r.cause??e)}function c8(e){return e.startupTimeoutMs??45e3}async function c6(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,ei({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}let c9=new h;function c7(e,t={}){return{runCommand:e,...t}}function ue(e,t,r,n={}){if(r)return ur(r);let i=function(e,t={}){let r=c9.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?ur(i.provider):ur(t)}async function ut(e,t,r){if(!e)return await r();let n={provider:ur(e),deviceId:t.deviceId,requestId:t.requestId};return await c9.run(n,r)}function ur(e){return"function"==typeof e?{runCommand:e}:e}async function un(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await uo(t,r,n,i,a,o);return await ui(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function ui(e,t){var r,n,i,a;if(!e)return await ua(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,ud({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,ud({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await ua(t,e.reason,e.lifecycleState,e.error)}async function ua(e,t,r,n){throw ud({command:e.command,session:e.session,transportError:e.transportError,decision:"retained",reason:t,lifecycleState:r}),await e.invalidateSession(e.session,e.invalidationReason),n??e.transportError}async function uo(e,t,r,n,i,a){var o,s,l,d,c,u,p,f,m,h,w,g;let y,v,S,I,A;if("status"===r.command||!r.commandId?.trim())return;let _=ul(n);try{y=await c0(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return ei({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 b="string"==typeof y.lifecycleState?y.lifecycleState:"";return ei({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:b,..._}}),o=y,s=b,l=r,d=n,c=i,"completed"===s?function(e,t,r,n){var i,a;let o=function(e){if("string"!=typeof e||0===e.trim().length)return;let t=function(e){try{let t=JSON.parse(e);if(t&&"object"==typeof t)return t}catch{}return{}}(e);if(t.ok)return t.data&&"object"==typeof t.data&&!Array.isArray(t.data)?t.data:{}}(e.lifecycleResponseJson);if(o)return{type:"recovered",data:o,reason:"completed_with_retained_response",lifecycleState:"completed"};if(lN(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let s=ul(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new eD("COMMAND_FAILED",`Runner command "${t.command}" completed after the transport response was lost, but no recoverable response was retained.`,{command:t.command,commandId:t.commandId,lifecycleState:"completed",recovery:"completed_without_retained_response",...s,hint:(i=t.command,a=s,`${us(a)}The runner is still reachable and reports "${i}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`),logPath:n.logPath,transportError:r.message},r)}}(o,l,d,c):"failed"===s?{type:"skipInvalidation",reason:"runner_reported_failure",lifecycleState:s,error:(u=o,p=l,f=d,m=c,v="string"==typeof u.lifecycleErrorCode?u.lifecycleErrorCode:void 0,S="string"==typeof u.lifecycleErrorMessage?u.lifecycleErrorMessage:"Runner command failed",I="string"==typeof u.lifecycleErrorHint?u.lifecycleErrorHint:void 0,A=ul(f),new eD(ex(v),S,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...A,hint:I??(h=p.command,w=A,`${us(w)}The runner is still reachable and reports "${h}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`),logPath:m.logPath,transportError:f.message},f))}:"accepted"===s||"started"===s?{type:"skipInvalidation",reason:"command_still_in_flight",lifecycleState:s,error:function(e,t,r,n){var i,a,o;if(lN(t.command))return r;let s=ul(r);return new eD("COMMAND_FAILED",`Runner command "${t.command}" is still ${e} after the transport response was lost.`,{command:t.command,commandId:t.commandId,lifecycleState:e,recovery:"command_still_in_flight",...s,hint:(i=t.command,a=e,o=s,`${us(o)}The runner is still reachable and reports "${i}" is ${a}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`),logPath:n.logPath,transportError:r.message},r)}(s,l,d,c)}:{type:"retainInvalidation",reason:s?"unknown_lifecycle_state":"missing_lifecycle_state",lifecycleState:s,error:new eD("COMMAND_FAILED",`Runner command "${l.command}" lost its transport response and lifecycle status was ${s?`"${s}"`:"missing"}, so agent-device invalidated the runner session instead of replaying the command.`,{command:l.command,commandId:l.commandId,lifecycleState:s,recovery:"lifecycle_state_not_recoverable",hint:(g=l.command,`The runner did not confirm that "${g}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`),logPath:c.logPath,transportError:d.message},d)}}function us(e){return!0!==e.readinessPreflightSkipped?"":"This hot command skipped the uptime preflight because the runner had just completed a healthy interaction; status recovery confirmed the runner still observed it. "}function ul(e){let t,r,n,i={},a="boolean"==typeof(t=e.details?.runnerReadinessPreflightSkipped)?t:void 0;void 0!==a&&(i.readinessPreflightSkipped=a);let o="string"==typeof(r=e.details?.runnerReadinessPreflightSkipReason)?r:void 0;void 0!==o&&(i.readinessPreflightSkipReason=o);let s="number"==typeof(n=e.details?.runnerReadinessPreflightSkippedAgeMs)?n:void 0;return void 0!==s&&(i.readinessPreflightSkippedAgeMs=s),i}function ud(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;ei({level:"retained"===i?"warn":"debug",phase:"ios_runner_command_invalidation_decision",data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:void 0!==o,sessionId:r.sessionId,transportError:n.message}})}async function uc(e,t){let r;lk(t.requestId);let n=rs(t.requestId),i=lD({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await uu({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new eD("COMMAND_FAILED","iOS runner prepare failed")}async function uu(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await cq(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles}),d=Date.now()-s;try{var c,u;let e=await uy(t,l,r,n,i,d,{recoveryReason:o});return{kind:"prepared",result:(c=t,u=e,uv(c,u),u)}}catch(e){return await up({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function up(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:d}=e,c=d instanceof eD?d:new eD("COMMAND_FAILED",String(d));if(1===l&&(t=c,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&uh(t)))return{kind:"prepared",result:await uf({device:n,session:i,command:a,options:o,signal:s,error:c})};if(!uh(c))throw d;let u=c.message||"runner_health_failed";if(l>=2)throw await um(i,"prepare_runner_health_failed"),d;return lk(o.requestId),await cW(i,"prepare_runner_health_retry"),ei({level:"warn",phase:"ios_runner_prepare_health_retry",data:{command:a.command,commandId:a.commandId,sessionId:i.sessionId,attempt:l,maxAttempts:2,reason:u}}),{kind:"retry",recoveryReason:u}}async function uf(e){var t,r,n,i,a;let{device:o,session:s,command:l,options:d,signal:c,error:u}=e,p=u.message||"runner_health_failed";await cW(s,"prepare_cached_runner_health_failed"),await dK(s.xctestrunArtifact,p);let f=Date.now(),m=await cq(o,{...d,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await uy(o,m,l,d,c,h,{recoveryReason:p});return ei({level:"info",phase:"ios_runner_prepare_bad_cache_recovered",data:{command:l.command,commandId:l.commandId,sessionId:m.sessionId,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,reason:p}}),t=o,r=e,uv(t,r),r}catch(r){let e;await um(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof eD?n:new eD("COMMAND_FAILED",String(n)),new eD(e.code,"artifact restored but runner did not connect",{...e.details??{},restoredFailureReason:a,xctestrunPath:i.xctestrunArtifact?.xctestrunPath,artifact:i.xctestrunArtifact?.artifact,cache:i.xctestrunArtifact?.cache,reason:e.message},e));throw uv(o,{cache:m.xctestrunArtifact?.cache,artifact:m.xctestrunArtifact?.artifact,buildMs:m.xctestrunArtifact?.buildMs,connectMs:h,healthCheckMs:0,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,failureReason:t.message}),t}}async function um(e,t){try{await cW(e,t)}catch{}}function uh(e){let t;return!rc(e)&&(l_(e)||lb(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function uw(e,t,r){let n;lk(r.requestId);let i=rs(r.requestId);try{let a=(n=await cq(e,r)).ready?45e3:c8(n);return await c0(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof eD?o:new eD("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&lb(a)&&n)return lk(r.requestId),await ug({device:e,session:n,command:t,options:r,signal:i,restartReason:"runner_connect_failed_before_command_send"});if(n&&function(e){let t;return e.details?.runnerReadinessPreflightFailed===!0&&(l_(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return lk(r.requestId),await ug({device:e,session:n,command:t,options:r,signal:i,restartReason:"runner_readiness_preflight_failed_before_command_send",recoveredDiagnosticPhase:"ios_runner_readiness_preflight_recovered"});if(n&&l_(a))return await un({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:cW});throw o}}async function ug(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await cW(e.session,a);let o=await cq(t,{...n,cleanStaleBundles:!0});try{let a=await c0(t,o,r,n.logPath,45e3,i);return e.recoveredDiagnosticPhase&&ei({level:"debug",phase:e.recoveredDiagnosticPhase,data:{command:r.command,commandId:r.commandId,recovery:"session_restarted",sessionId:o.sessionId}}),a}catch(a){let e=a instanceof eD?a:new eD("COMMAND_FAILED",String(a));if(l_(e))return await un({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:cW});throw a}}async function uy(e,t,r,n,i,a,o){var s,l,d,c,u;let p,f,m=Date.now();return s=await c0(e,t,r,n.logPath,n.healthTimeoutMs,i),l=t,d=a,c=Date.now()-m,u=o,p=l.xctestrunArtifact,f={...u?.recoveryReason?{recoveryReason:u.recoveryReason}:{},...u?.failureReason?{failureReason:u.failureReason}:{}},p?{runner:s,cache:p.cache,artifact:p.artifact,buildMs:p.buildMs,connectMs:Math.max(0,d),healthCheckMs:Math.max(0,c),xctestrunPath:p.xctestrunPath,...f}:{runner:s,connectMs:Math.max(0,d),healthCheckMs:Math.max(0,c),...f}}function uv(e,t){ei({level:t.failureReason?"warn":"info",phase:"apple_runner_prepare",data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}async function uS(e,t,r={}){cQ(e),lk(r.requestId);let n=lD(t),i=u_(e,r);return lN(n.command)?e9(()=>(lk(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(lk(r.requestId),l_(e))}):i.runCommand(e,n,r)}function uI(e,t={}){if("ios"!==e.platform)return;let r=u_(e,t);return r.prewarm?r.prewarm(e,t).then(()=>{}).catch(t=>{ei({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}})}):void ei({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function uA(e,t){cQ(e),lk(t.requestId);let r=lD({command:"uptime"}),n=u_(e,t);if(n.prepare)return await n.prepare(e,t);let i=Date.now();return{runner:await n.runCommand(e,r,t),connectMs:0,healthCheckMs:Math.max(0,Date.now()-i)}}function u_(e,t){return ue(e,ub,void 0,{requestId:t.requestId})}let ub=c7(uw,{prepare:uc,prewarm:async(e,t)=>{await uc(e,{...t,healthTimeoutMs:45e3})}}),ux=new WeakMap;async function uM(e){var t,r;let n,i,{sessionStore:a,leaseRegistry:o}=e,s=(n={...(t=function(e){let t=eG(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=e$(r);if(r&&!n)throw new eD("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new eD("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??{}},tL(t.command,n)?{...t,flags:n}:t),l=s.command,d=function(e){var t,r;let n=e.session||ls;if(function(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return"string"==typeof t&&t.trim().length>0}(e))return n;let i=ld(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(s),c=ee(),u=a.resolveSessionDir(d),p=t2(u,s.meta?.requestId??c.requestId),f=t1(u);en({session:d,logPath:p}),ei({level:"info",phase:"request_start",data:{publicSession:s.session,effectiveSession:d,command:s.command,tenant:s.meta?.tenantId,isolation:s.meta?.sessionIsolation,requestLogPath:p,runnerLogPath:f}}),function(e,t){var r;if(r=e.command,np(r)?.leaseAdmissionExempt===!0||e.meta?.sessionIsolation!=="tenant")return;let n=lp(e);t.assertLeaseAdmission({tenantId:n.tenantId,runId:n.runId,leaseId:n.leaseId,backend:n.leaseBackend})}(s,o);let m=np(l)?.sessionExecutionLockExempt!==!0?await lw({req:s,sessionName:d,sessionStore:a}):[],h=(r=o,(i=ux.get(r))||(i=new Map,ux.set(r,i)),i);return{req:s,command:l,sessionName:d,requestLogPath:p,runnerLogPath:f,throwIfCanceled:()=>rd(s.meta?.requestId),runLocked:async e=>(rd(s.meta?.requestId),0===m.length)?await e():await uN(h,m,async()=>(rd(s.meta?.requestId),await e()))}}async function uN(e,t,r){let[n,...i]=t;return n?await lr(e,n,async()=>await uN(e,i,r)):await r()}function uD(){return{ok:!1,error:eN(new eD("UNAUTHORIZED","Invalid token"))}}async function uk(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 sV({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function uP(e){ei({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=ee(),r=et({force:!0})??void 0;return{ok:!1,error:eN(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function uE(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function uC(e,t){let r=t.includeTokens?.filter(e=>e.length>0)??[],n="",i=n=>{(!(r.length>0)||r.some(e=>n.includes(e)))&&e.write(function(e,t){if(0===t.length)return e;let r=e;for(let e of t)r=r.replace(e,"[REDACTED]");return r}(n,t.redactionPatterns))};return{onChunk:e=>{let t=`${n}${e}`.split("\n");for(let e of(n=t.pop()??"",t))i(`${e}
|
|
13
|
+
`)},flush:()=>{n&&(i(n),n="")}}}function uR(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 uO(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new eD("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function uT(e,t){let r=(await tM(ta(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function uL(e,t){var r,n;let i;uO(t);let a=await uT(e,t),o=tM(ta(e)),s=await tc(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 u$(e,t,r,n,i){let a,o,s="recovering",l=!1,d=(async()=>{try{for(;!l;){let d=await uT(e,t);if(!d){s="recovering",await eK(1e3);continue}let c=tx(ta(e)),u=tn(c,{pid:d});a=u;let p=uC(r,{redactionPatterns:n});if(o=uR(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&t4(i,u.pid),s="active",await o,t8(i),a=void 0,o=void 0,l)break;s="recovering",await eK(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),t8(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:d,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await uE(o),a&&!a.killed&&a.kill("SIGKILL"),await uE(d),t8(i)}}}function uF(e,t){let r=uq(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=uq(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 uU(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=lv(["spawn",t,"log","show","--style","compact","--info","--predicate",uF(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 iF(o,{allowFailure:!0,timeoutMs:4e3});if(0!==s.exitCode||0===s.stdout.trim().length)return null;let l=s.stdout.split("\n").map(e=>e.trimEnd()).filter(e=>{let t=e.trim();return t.length>0&&!t.startsWith("Timestamp Ty Process[PID:TID]")});return 0===l.length?null:{text:`${l.join("\n")}
|
|
14
|
+
`,recoveredLineCount:l.length}}async function uG(e,t,r,n,i,a){let o=await uj({deviceId:e,appBundleId:t,simulatorSetPath:i});return uH({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return lv(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",uF(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function uq(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function uj(e){let{deviceId:t,appBundleId:r,simulatorSetPath:n}=e,a=await iF(lv(["get_app_container",t,r,"app"],{simulatorSetPath:n}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=i.join(o,"Info.plist"),l=await eE("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function uV(e,t,r,n){return uH({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",uF(e)],stream:t,redactionPatterns:r,pidPath:n})}async function uB(e,t,r,n){return uH({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function uH(e){let t="active",r=ek(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=uC(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&t4(e.pidPath,n.pid);let a=uR(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),t8(e.pidPath),r),r=>{throw t="failed",t8(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await uE(a),n.killed||n.kill("SIGKILL"),await uE(a),t8(e.pidPath)}}}let uK=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),uW=/https?:\/\/[^\s"'<>\])]+/i,uz=[/\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 uX(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>uZ(e)));for(let e of t.entries){let t=uZ(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function uJ(e,t){let r=u6(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=u6(t?.maxPayloadChars,2048,64,16384),o=u6(t?.maxScanLines,4e3,100,2e4),s=e.split("\n"),l=Math.max(0,s.length-o),d=s.slice(l),c=[];for(let e=d.length-1;e>=0&&c.length<r;e-=1){let t=d[e];if(!t?.trim())continue;let r=function(e,t,r,n,i,a){let o=e[t]?.trim();if(!o)return null;let s=function(e){let t=e.indexOf("{");if(t<0)return null;let r=e.lastIndexOf("}");if(r<=t)return null;let n=e.slice(t,r+1);try{let e=JSON.parse(n);return e&&"object"==typeof e?e:null}catch{return null}}(o),l=u3(s,["method","httpMethod"]),d=u3(s,["url","requestUrl"]),c=function(e,t){if(!e)return null;for(let r of t){let t=e[r];if("number"==typeof t&&Number.isInteger(t))return t;if("string"==typeof t&&/^\d{3}$/.test(t.trim()))return Number.parseInt(t.trim(),10)}return null}(s,["status","statusCode","responseCode"]),u=uK.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=uW.exec(o),h=d??m?.[0];if(!h)return null;let w=c??uQ(o)??void 0;if(!(l||p?.[1]||u?.[1]||void 0!==w||/\bURL["'=: ]+https?:\/\//i.test(o)||/\bheaders?["'=: ]+/i.test(o)||/\b(?:requestBody|responseBody|payload|request|response)["'=: ]+/i.test(o)))return null;let g={method:f,url:h,status:w,timestamp:u0(o),packetId:u1(o)??void 0,durationMs:u2(o)??void 0,raw:u8(o,a),line:r};if("android"===n&&function(e,t,r){let n=uY(t,r,5),i=e.packetId??n.map(e=>u1(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?uY(t,r,12).filter(e=>u1(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>u0(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>uQ(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>u2(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 u4(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=u8(e,a))}if("body"===i||"all"===i){let e=u5(o,s,["requestBody","body","payload","request"]),t=u5(o,s,["responseBody","response"]);e&&(g.requestBody=u8(e,a)),t&&(g.responseBody=u8(t,a))}return g}(d,e,l+e+1,n,i,a);r&&c.push(r)}return{path:t?.path??"<memory>",exists:!0,scannedLines:d.length,matchedLines:c.length,entries:c,include:i,limits:{maxEntries:r,maxPayloadChars:a,maxScanLines:o}}}function uZ(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function uY(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 uQ(e){for(let t of uz){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function u0(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 u1(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function u2(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 u3(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 u5(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return u4(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 u4(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function u8(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function u6(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let u9={start:async e=>await pl(e)},u7=ix(u9,function(e={}){return{...u9,...e}});async function pe(e,t){return await u7.run(e,t)}function pt(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 pr(e){let t=i.dirname(e);a.existsSync(t)||a.mkdirSync(t,{recursive:!0}),function(e,t){if(a.existsSync(e)&&!(a.statSync(e).size<t.maxBytes))for(let r=t.maxRotatedFiles;r>=1;r-=1){let t=1===r?e:`${e}.${r-1}`,n=`${e}.${r}`;a.existsSync(t)&&(a.existsSync(n)&&a.unlinkSync(n),a.renameSync(t,n))}}(e,{maxBytes:pt("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:pt("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function pn(e){if(!a.existsSync(e))return{exists:!1,sizeBytes:0};let t=a.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}function pi(e){return"macos"===e.platform?"macos":"ios"===e.platform?"device"===e.kind?"ios-device":"ios-simulator":"android"}async function pa(e){var t,r,n,i;let o,s,l,d,{device:c,appBundleId:u,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y}=e,v=pi(c),S=(t={backend:v,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y},o=u6(t?.maxEntries,25,1,200),s=t?.include??"summary",l=u6(t?.maxPayloadChars,2048,64,16384),d=u6(t?.maxScanLines,4e3,100,2e4),a.existsSync(m)?uJ(a.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:o,maxPayloadChars:l,maxScanLines:d}}),I=[],A=await po({device:c,appBundleId:u,appLogPath:m,appLogState:p});if(A){let e=await uL(c.id,u);if(e){let t=uJ(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y});t.entries.length>0&&(S=uX(t,S,h),I.push((r=A,n=e.recoveredPids,"stale-active"===r.reason?`Session app log stream was still bound to prior Android PID ${r.trackedPid}. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`:`Session app log stream was inactive. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`)))}}if("ios"===c.platform&&"simulator"===c.kind&&u&&0===S.entries.length){let e=await pd({deviceId:c.id,appBundleId:u,startedAt:f,simulatorSetPath:c.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y});e&&(e.dump.entries.length>0?(S=uX(e.dump,S,h),I.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&&I.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?I.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===I.length&&("ios"===c.platform&&"simulator"===c.kind?I.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."):I.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===S.entries.length&&I.push("ios"===(i=c).platform&&"simulator"===i.kind?"No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.":"ios"===i.platform?"No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.":"No HTTP(s) entries were found in recent session app logs."),{backend:v,dump:S,notes:I}}async function po(e){let{device:t,appBundleId:r,appLogPath:n,appLogState:o}=e;if("android"!==t.platform||!r)return null;if(void 0!==o&&"active"!==o)return{reason:"inactive"};if("active"!==o)return null;let s=function(e){let t=function(e){if(!e||!a.existsSync(e))return null;try{return t5(a.readFileSync(e,"utf8"))}catch{return null}}(e)?.command;if(!t)return null;let r=/(?:^|\s)--pid\s+(\d+)(?:\s|$)/.exec(t);return r?.[1]??null}(i.join(i.dirname(n),t3));if(!s)return null;let l=await uT(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function ps(e,t,r,n){return await u7.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function pl({device:e,appBundleId:t,outPath:r,pidPath:n}){pr(r);let i=a.createWriteStream(r,{flags:"a"}),o=function(){let e=process.env.AGENT_DEVICE_APP_LOG_REDACT_PATTERNS;if(!e)return[];let t=e.split(",").map(e=>e.trim()).filter(e=>e.length>0),r=[];for(let e of t)try{r.push(RegExp(e,"gi"))}catch{}return r}();if("ios"===e.platform)return"device"===e.kind?await uB(e.id,i,o,n):await uG(e.id,t,i,o,e.simulatorSetPath,n);if("android"===e.platform)return uO(t),await u$(e.id,t,i,o,n);if("macos"===e.platform)return await uV(t,i,o,n);throw i.end(),new eD("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function pd(e){let t=await uU({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:uJ(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 pc(e){await e.stop(),await uE(e.wait)}async function pu(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 e4(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await e4(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 iF(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await iF(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await eE("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function pp(e,t){pr(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
|
|
15
|
+
`;a.appendFileSync(e,r,"utf8")}function pf(e){let t=i.dirname(e),r=i.basename(e);a.existsSync(t)||a.mkdirSync(t,{recursive:!0}),a.existsSync(e)?a.truncateSync(e,0):a.writeFileSync(e,"","utf8");let n=0;for(let e of a.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let o=e.slice(r.length+1);if(/^\d+$/.test(o))try{a.unlinkSync(i.join(t,e)),n+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:n}}function pm(e,t){for(let r of e){if(t(r))return r;let e=pm(r.children,t);if(e)return e}}function ph(e,t){let r=[];for(let n of e)t(n)&&r.push(n),r.push(...ph(n.children,t));return r}function pw(e,t){let r=pm(e,e=>"schema"===e.name&&e.attributes.name===t);return r?r.children.filter(e=>"col"===e.name).map(e=>{let t;return t=e.children.find(e=>"mnemonic"===e.name),t?.text??null??""}):[]}function pg(e){if(!e||e.children.some(e=>"sentinel"===e.name)||!e.text)return null;let t=Number(e.text);return Number.isFinite(t)?t:null}function py(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.numberValue??null:pg(e):null}function pv(e){return Math.round(10*e)/10}async function pS(e,t){let r=["devicectl",...e],n=await iF(r,{allowFailure:!0,timeoutMs:2e4});if(0===n.exitCode)return;let i=String(n.stdout??""),a=String(n.stderr??"");throw new eD("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:r,exitCode:n.exitCode,stdout:i,stderr:a,deviceId:t.deviceId,hint:px(i,a)??pb})}async function pI(e,t){var r;return r=function(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.bundleIdentifier?e.bundleIdentifier.trim():"";if(!t)continue;let n="string"==typeof e.name&&e.name.trim().length>0?e.name.trim():t,i="string"==typeof e.url&&e.url.trim().length>0?e.url.trim():void 0;r.push({bundleId:t,name:n,url:i})}return r}(await p_(e,{jsonPrefix:"agent-device-ios-apps",args:["devicectl","device","info","apps","--device",e.id,"--include-all-apps"],failureMessage:"Failed to list iOS apps",parseFailureMessage:"Failed to parse iOS apps list"})),iM(r,t)}async function pA(e){return function(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.executable?e.executable.trim():"",n="number"==typeof e.processIdentifier&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;t&&Number.isFinite(n)&&r.push({executable:t,pid:n})}return r}(await p_(e,{jsonPrefix:"agent-device-ios-processes",args:["devicectl","device","info","processes","--device",e.id],failureMessage:"Failed to list iOS processes",parseFailureMessage:"Failed to parse iOS process list"}))}async function p_(e,t){let r=i.join(u.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=[...t.args,"--json-output",r],a=await iF(n,{allowFailure:!0,timeoutMs:2e4});try{if(0!==a.exitCode){let r=String(a.stdout??""),i=String(a.stderr??"");throw new eD("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:n,exitCode:a.exitCode,stdout:r,stderr:i,deviceId:e.id,hint:px(r,i)??pb})}return JSON.parse(await s.readFile(r,"utf8"))}catch(r){if(r instanceof eD)throw r;throw new eD("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await s.unlink(r).catch(()=>{})}}let pb="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function px(e,t){let r=`${e}
|
|
16
|
+
${t}`.toLowerCase();return r.includes("device is busy")&&r.includes("connecting")?"iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.":r.includes("coredeviceservice")&&r.includes("timed out")?"CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.":null}async function pM(e,t){try{let r=await iU(e),n=r?.[t];if("string"==typeof n&&n.length>0)return n}catch{}try{let r=await i$("plutil",["-extract",t,"raw","-o","-",e],{allowFailure:!0});if(0===r.exitCode){let e=String(r.stdout??"").trim();if(e.length>0)return e}}catch{}try{var r,n;let i;return r=await s.readFile(e,"utf8"),n=t,l4(l5(r),(e,t)=>{void 0===i&&e===n&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}let pN="xctrace-animation-hitches";function pD(e,t){let r=l5(e),n=pw(r,t);return{rows:0===n.length?[]:ph(r,e=>"row"===e.name),schema:n}}function pk(e,t){for(let r of e)pk(r.children,t),r.attributes.id&&t.set(r.attributes.id,{numberValue:pg(r),process:pP(r)})}function pP(e){if(!e||e.children.some(e=>"sentinel"===e.name))return null;let t=pg(pm(e.children,e=>"pid"===e.name)),r=(e.attributes.fmt??"").replace(/\s+\(\d+\)$/,"").trim();return null===t&&0===r.length?null:{pid:t??void 0,name:r.length>0?r:void 0}}let pE="ps-process-snapshot",pC="ps-process-snapshot",pR="xctrace-activity-monitor",pO="xctrace-activity-monitor",pT="leaks-output-graph",pL="Memory graph captured with leaks --outputGraph for host-visible Apple app processes.";async function p$(e,t){if("ios"===e.platform&&"device"===e.kind)return await p2(e,t);let r=await p1(e,t),n=await p9(e,r);if(0===n.length)throw new eD("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf."});let i=new Date().toISOString();return fi({usagePercent:n.reduce((e,t)=>e+t.cpuPercent,0),residentMemoryKb:n.reduce((e,t)=>e+t.rssKb,0),measuredAt:i,matchedProcesses:[r.executableName],cpuMethod:pE,memoryMethod:pC})}async function pF(e,t,r){let n,a=pH(e);if(!a.memgraph)return{available:!1,kind:"memgraph",reason:a.reason,hint:a.hint,support:a};let o=await fe(e,t,a);if(!1===o.available)return o;let{process:l}=o;await s.mkdir(i.dirname(r),{recursive:!0});let d=await pG(r);try{n=await pU(e,r,l.pid)}catch(n){throw await pq(r,d),function(e,t,r,n,a){if(a instanceof eD){let o=a.details??{};return new eD(a.code,`Failed to capture Apple memgraph for ${t}`,{...o,kind:"memgraph",appBundleId:t,pid:r.pid,processName:i.basename(fn(r.command)),path:n,hint:ft(e,"string"==typeof o.stdout?o.stdout:"","string"==typeof o.stderr&&o.stderr.length>0?o.stderr:a.message)},a)}return new eD("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:r.pid,processName:i.basename(fn(r.command)),path:n,hint:"Retry perf memory snapshot. If it still fails, run with --debug and inspect leaks output."},a)}(e,t,l,r,n)}if(0!==n.exitCode)throw await pq(r,d),new eD("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:l.pid,processName:i.basename(fn(l.command)),path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:ft(e,n.stdout,n.stderr)});let c=await s.stat(r).catch(()=>null);if(!c?.isFile()||c.size<=0)throw await pq(r,d),new eD("COMMAND_FAILED","Apple memgraph artifact is missing or empty",{kind:"memgraph",appBundleId:t,pid:l.pid,path:r,hint:"Retry with a writable --out path. If the file is still empty, run with --debug and inspect leaks output."});return{available:!0,kind:"memgraph",path:r,sizeBytes:c.size,measuredAt:new Date().toISOString(),method:pT,appBundleId:t,pid:l.pid,processName:i.basename(fn(l.command)),support:a}}async function pU(e,t,r){return"macos"===e.platform?await i$("leaks",[`--outputGraph=${t}`,String(r)],{allowFailure:!0,timeoutMs:12e4}):await iF(lS(e,["spawn",e.id,"leaks",`--outputGraph=${t}`,String(r)]),{allowFailure:!0,timeoutMs:12e4})}async function pG(e){return await s.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function pq(e,t){t||await s.rm(e,{force:!0}).catch(()=>{})}async function pj(e,t){var r;let n,a,o,s,l,c;if("ios"!==e.platform||"device"!==e.kind)throw new eD("COMMAND_FAILED","Apple frame-health sampling is currently available only on connected iOS devices.",{metric:"fps",platform:e.platform,deviceKind:e.kind});let u=await p3(e,t),p=await pK(e,t,u);return n=pD((r={hitchesXml:p.hitchesXml,frameLifetimesXml:p.frameLifetimesXml,displayInfoXml:p.displayInfoXml,processIds:u.map(e=>e.pid),processNames:tJ(u.map(e=>i.basename(d(e.executable)))),windowStartedAt:p.windowStartedAt,windowEndedAt:p.windowEndedAt,measuredAt:p.windowEndedAt}).frameLifetimesXml,"hitches-frame-lifetimes").rows.length,a=function(e){if(!e)return;let{rows:t,schema:r}=pD(e,"device-display-info"),n=r.indexOf("max-refresh-rate");if(n<0)return;let i=new Map;for(let e of t){pk(e.children,i);let t=py(e.children[n],i);if(null!==t&&t>0)return t}}(r.displayInfoXml),s=(o=(function(e){let t,r,n=l5(e),i=Object.values(r={start:(t=pw(n,"hitches")).indexOf("start"),duration:t.indexOf("duration"),process:t.indexOf("process"),isSystem:t.indexOf("is-system")}).every(e=>e>=0)?r:null;if(!i)return[];let a=new Map;return ph(n,e=>"row"===e.name).map(e=>(function(e,t,r){var n,i,a;let o;if(pk(e.children,r),!0===(n=e.children[t.isSystem],null===(o=py(n,r))?null:0!==o))return null;let s=py(e.children[t.start],r),l=py(e.children[t.duration],r);if(null===s||null===l)return null;let d=(i=e.children[t.process],a=r,i?i.attributes.ref?a.get(i.attributes.ref)?.process??null:pP(i):null);return{startNs:s,durationNs:l,pid:d?.pid,processName:d?.name}})(e,i,a)).filter(e=>!!e)})(r.hitchesXml).filter(e=>{var t,n,i;return t=e,n=r.processIds,i=r.processNames,!!(void 0!==t.pid&&n.includes(t.pid))||!!t.processName&&i.includes(t.processName)})).length,l=Math.max(0,Math.round(Date.parse(r.windowEndedAt)-Date.parse(r.windowStartedAt))),c=function(e,t){if(0===e.length)return[];let r=[...e].sort((e,t)=>e.startNs-t.startNs),n=[],i=[];for(let e of r){let t=i.at(-1);if(!t||e.startNs-(t.startNs+t.durationNs)<=5e8){i.push(e);continue}n.push(i),i=[e]}return i.length>0&&n.push(i),n.map(e=>{var r,n;let i,a,o,s;return r=e,n=t,i=Math.min(...r.map(e=>e.startNs)),a=Math.max(...r.map(e=>e.startNs+e.durationNs)),s=Math.max(o=Math.max(0,Math.round(i/1e6)),Math.round(a/1e6)),{startOffsetMs:o,endOffsetMs:s,startAt:new Date(n+o).toISOString(),endAt:new Date(n+s).toISOString(),missedDeadlineFrameCount:r.length,worstFrameMs:pv(Math.max(...r.map(e=>e.durationNs))/1e6)}}).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}(o,Date.parse(r.windowStartedAt)),{droppedFramePercent:n>0?pv(s/n*100):0,droppedFrameCount:s,totalFrameCount:n,sampleWindowMs:l,windowStartedAt:r.windowStartedAt,windowEndedAt:r.windowEndedAt,measuredAt:r.measuredAt,method:pN,matchedProcesses:[...new Set(o.map(e=>e.processName).filter(e=>"string"==typeof e&&e.length>0))],frameDeadlineMs:void 0===a?void 0:pv(1e3/a),refreshRateHz:a,worstWindows:c.length>0?c:void 0}}function pV(e){return"ios"===e.platform&&"device"===e.kind?{method:pN,description:"Rendered-frame hitch health from xctrace Animation Hitches on connected iOS devices. Dropped frames are counted from native hitch rows for the attached app process, with total frames from the same trace frame-lifetime table.",unit:"percent",primaryField:"droppedFramePercent",window:"short 2s xctrace Animation Hitches record of the active app process",resetsAfterRead:!1}:{method:pN,description:"Unavailable on iOS simulators and macOS because local Apple tooling does not expose reliable app frame hitches for these targets.",unit:"percent",primaryField:"droppedFramePercent"}}function pB(e){let t=pV(e);if("ios"===e.platform&&"device"===e.kind)return{fps:t,memory:{method:pO,description:"Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"kB"},cpu:{method:pR,description:"Recent CPU usage snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"percent"}};let r="macos"===e.platform?"host ps for the running macOS app executable resolved from the bundle ID.":"xcrun simctl spawn ps, with host ps fallback, for the running iOS simulator app executable resolved from the bundle ID.";return{fps:t,memory:{method:pC,description:`Resident memory snapshot from ${r}`,unit:"kB"},cpu:{method:pE,description:`Recent CPU usage snapshot from ${r}`,unit:"percent"}}}function pH(e){return"ios"===e.platform&&"device"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:pT,reason:"Physical iOS device memgraph capture is not exposed through reliable local agent-device tooling.",hint:"Use perf memory sample for a compact resident-memory reading, or reproduce on an iOS simulator/macOS target for memgraph capture."}:"ios"===e.platform&&"simulator"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!0,method:pT,reason:"iOS simulator processes are host-visible through simctl spawn leaks.",hint:"Keep the simulator app running in the foreground while the memgraph is captured."}:"macos"===e.platform?{platform:e.platform,deviceKind:e.kind,memgraph:!0,method:pT,reason:"macOS app processes are host-visible to leaks --outputGraph.",hint:"Grant Terminal/agent process permissions if macOS denies process inspection."}:{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:pT,reason:"Apple memgraph capture is available only for iOS simulator and macOS app sessions.",hint:"Use perf memory sample on supported app sessions, or rerun against iOS simulator/macOS for memgraph capture."}}async function pK(e,t,r){let n=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-ios-frame-perf-")),a=i.join(n,"animation-hitches.trace"),o=i.join(n,"hitches.xml"),l=i.join(n,"frame-lifetimes.xml"),d=i.join(n,"display-info.xml");try{let n=await pW({device:e,appBundleId:t,tracePath:a,template:"Animation Hitches",duration:"2s",targetPids:r.map(e=>e.pid),validateTraceOutput:!0,failureMessage:`Failed to record iOS frame-health sample for ${t}`});await pY(e,t,a,"hitches",o),await pY(e,t,a,"hitches-frame-lifetimes",l);let i=await pQ(e,t,a,"device-display-info",d);return{windowStartedAt:n.startedAt,windowEndedAt:n.endedAt,hitchesXml:await s.readFile(o,"utf8"),frameLifetimesXml:await s.readFile(l,"utf8"),displayInfoXml:i?await s.readFile(d,"utf8"):void 0}}finally{await s.rm(n,{recursive:!0,force:!0}).catch(()=>{})}}async function pW(e){let{device:t,appBundleId:r,tracePath:n,template:i,duration:a}=e,o=e.allProcesses?["--all-processes"]:(e.targetPids??[]).flatMap(e=>["--attach",String(e)]),s=["xctrace","record","--template",i,"--device",t.id,...o,"--time-limit",a,"--output",n,"--quiet","--no-prompt"],l=await pz(s,e.tracePath);if(0===l.result.exitCode)return e.validateTraceOutput&&await pZ(e,l.result.stdout,l.result.stderr),{startedAt:l.startedAt,endedAt:l.endedAt,capturedAtMs:l.capturedAtMs};throw new eD("COMMAND_FAILED",e.failureMessage,{cmd:"xcrun",args:s,exitCode:l.result.exitCode,stdout:l.result.stdout,stderr:l.result.stderr,appBundleId:r,deviceId:t.id,hint:fo(l.result.stdout,l.result.stderr)})}async function pz(e,t){let r;for(let n=1;n<=3;n+=1){await pJ(t,n,1500);let i=new Date().toISOString(),a=await iF(e,{allowFailure:!0,timeoutMs:6e4});if(r={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},0===a.exitCode||!pX(a))break}return r}function pX(e){let t=`${e.stdout}
|
|
17
|
+
${e.stderr}`.toLowerCase();return t.includes("_lockkperf")||t.includes("could not lock kperf")||t.includes("likely another session just started")}async function pJ(e,t,r){t<=1||(await s.rm(e,{recursive:!0,force:!0}).catch(()=>{}),await new Promise(e=>setTimeout(e,r)))}async function pZ(e,t,r){let n=await s.stat(e.tracePath).catch(()=>null);if(!(n?.isDirectory()===!0?(await s.readdir(e.tracePath).catch(()=>[])).length>0:(n?.size??0)>0))throw new eD("COMMAND_FAILED",`${e.failureMessage}: xctrace produced no trace data`,{tracePath:e.tracePath,appBundleId:e.appBundleId,deviceId:e.device.id,stdout:t,stderr:r,hint:"Keep the iOS device unlocked and connected by cable, keep the app active, then retry perf."})}async function pY(e,t,r,n,i){let a=["xctrace","export","--input",r,"--xpath",`/trace-toc/run/data/table[@schema="${n}"]`,"--output",i],o=await iF(a,{allowFailure:!0,timeoutMs:15e3});if(0!==o.exitCode)throw new eD("COMMAND_FAILED",`Failed to export iOS device ${n} data`,{cmd:"xcrun",args:a,exitCode:o.exitCode,stdout:o.stdout,stderr:o.stderr,appBundleId:t,deviceId:e.id,hint:fo(o.stdout,o.stderr)})}async function pQ(e,t,r,n,i){try{return await pY(e,t,r,n,i),!0}catch{return!1}}async function p0(e){let t=l5(e),r=pw(t,"activity-monitor-process-live");if(0===r.length)throw new eD("COMMAND_FAILED","Failed to parse xctrace activity-monitor-process-live schema");let n=r.indexOf("pid"),i=r.indexOf("process"),a=r.indexOf("cpu-total"),o=r.indexOf("memory-real");if(n<0||i<0||a<0||o<0)throw new eD("COMMAND_FAILED","xctrace activity-monitor-process-live export is missing expected columns");let s=ph(t,e=>"row"===e.name),l=[],d=new Map;for(let e of s){var c,u;let t=e.children;if(0===t.length)continue;for(let e of t){let t=pm(e.children,e=>"pid"===e.name&&"string"==typeof e.attributes.id);if(t?.attributes.id){let e=Number(t.text);d.set(t.attributes.id,{numberValue:Number.isFinite(e)?e:null})}e.attributes.id&&d.set(e.attributes.id,{numberValue:pg(e),processName:fa(e)})}let r=py(t[n],d),s=(c=t[i],u=d,c?c.attributes.ref?u.get(c.attributes.ref)?.processName??null:fa(c):null);null!==r&&Number.isFinite(r)&&s&&l.push({pid:r,processName:s,cpuTimeNs:py(t[a],d),residentMemoryBytes:py(t[o],d)})}return l}async function p1(e,t){let r="macos"===e.platform?await p8(t):await p6(e,t),n="macos"===e.platform?i.join(r,"Contents","Info.plist"):i.join(r,"Info.plist"),a=await pM(n,"CFBundleExecutable");if(!a)throw new eD("COMMAND_FAILED",`Failed to resolve executable for ${t}`,{appBundleId:t,appPath:r});return{executableName:a,executablePath:"macos"===e.platform?i.join(r,"Contents","MacOS",a):i.join(r,a)}}async function p2(e,t){let r=await p3(e,t),n=await p5(e,t),i=await p5(e,t),a=p4(await p0(n.xml),r,t,e),o=p4(await p0(i.xml),r,t,e),s=i.capturedAtMs-n.capturedAtMs;if(s<=0)throw new eD("COMMAND_FAILED",`Invalid Activity Monitor sample window for ${t}`,{appBundleId:t,deviceId:e.id});if(null===a.cpuTimeNs||null===o.cpuTimeNs||null===o.residentMemoryBytes)throw new eD("COMMAND_FAILED",`Incomplete Activity Monitor sample for ${t}`,{appBundleId:t,deviceId:e.id,hint:"Keep the app running in the foreground while perf samples the device, then retry."});return fi({usagePercent:Math.max(0,o.cpuTimeNs-a.cpuTimeNs)/(1e6*s)*100,residentMemoryKb:o.residentMemoryBytes/1024,measuredAt:new Date(i.capturedAtMs).toISOString(),matchedProcesses:o.matchedProcesses,cpuMethod:pR,memoryMethod:pO})}async function p3(e,t){let r=(await pI(e,"all")).find(e=>e.bundleId===t);if(!r)throw new eD("APP_NOT_INSTALLED",`No iOS device app found for ${t}`,{appBundleId:t,deviceId:e.id});if(!r.url)throw new eD("COMMAND_FAILED",`Missing app bundle URL for ${t}`,{appBundleId:t,deviceId:e.id});let n=r.url.replace(/\/$/,""),i=d(n),a=(await pA(e)).filter(e=>e.executable.startsWith(`${n}/`));if(0===a.length)throw new eD("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,deviceId:e.id,appBundlePath:i,hint:"Run open <app> for this session again to ensure the iOS app is active, then retry perf."});return a}async function p5(e,t){let r=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-ios-perf-")),n=i.join(r,"sample.trace"),a=i.join(r,"activity-monitor-process-live.xml");try{let r=await pW({device:e,appBundleId:t,tracePath:n,template:"Activity Monitor",duration:"1s",allProcesses:!0,failureMessage:`Failed to record iOS device Activity Monitor sample for ${t}`});return await pY(e,t,n,"activity-monitor-process-live",a),{capturedAtMs:r.capturedAtMs,xml:await s.readFile(a,"utf8")}}finally{await s.rm(r,{recursive:!0,force:!0}).catch(()=>{})}}function p4(e,t,r,n){let a=new Set(t.map(e=>e.pid)),o=new Set(t.map(e=>i.basename(d(e.executable)))),s=e.filter(e=>a.has(e.pid)||o.has(e.processName));if(0===s.length)throw new eD("COMMAND_FAILED",`No Activity Monitor sample found for ${r}`,{appBundleId:r,deviceId:n.id,hint:"Keep the app running in the foreground while perf samples the device, then retry."});let l=new Map;for(let e of s){let t=l.get(e.pid);if(!t){l.set(e.pid,e);continue}l.set(e.pid,{pid:e.pid,processName:e.processName||t.processName,cpuTimeNs:fs(t.cpuTimeNs,e.cpuTimeNs),residentMemoryBytes:fs(t.residentMemoryBytes,e.residentMemoryBytes)})}let c=[...l.values()],u=c.map(e=>e.cpuTimeNs).filter(e=>null!==e),p=c.map(e=>e.residentMemoryBytes).filter(e=>null!==e);return{cpuTimeNs:u.length>0?u.reduce((e,t)=>e+t,0):null,residentMemoryBytes:p.length>0?p.reduce((e,t)=>e+t,0):null,matchedProcesses:tJ(c.map(e=>e.processName))}}async function p8(e){let t=`kMDItemCFBundleIdentifier == "${e.replaceAll('"','\\"')}"`,r=await i$("mdfind",[t],{allowFailure:!0,timeoutMs:15e3});if(0!==r.exitCode)throw new eD("COMMAND_FAILED",`Failed to resolve macOS app bundle for ${e}`,{appBundleId:e,stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let n=r.stdout.split("\n").map(e=>e.trim()).find(e=>e.endsWith(".app"));if(!n)throw new eD("APP_NOT_INSTALLED",`No macOS app found for ${e}`,{appBundleId:e});return n}async function p6(e,t){let r=lS(e,["get_app_container",e.id,t,"app"]),n=await iF(r,{allowFailure:!0,timeoutMs:15e3});if(0!==n.exitCode)throw new eD("COMMAND_FAILED",`Failed to resolve iOS simulator app container for ${t}`,{appBundleId:t,stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode,hint:"Ensure the iOS simulator app is installed and booted, then retry perf."});let i=n.stdout.trim();if(0===i.length)throw new eD("APP_NOT_INSTALLED",`No iOS simulator app container found for ${t}`,{appBundleId:t});return i}async function p9(e,t){let r="macos"===e.platform?["-axo","pid=,%cpu=,rss=,command="]:lS(e,["spawn",e.id,"ps","-axo","pid=,%cpu=,rss=,command="]);return(function(e){let t=[];for(let r of P(e)){let e=r.match(/^(\d+)\s+([0-9]+(?:\.[0-9]+)?)\s+(\d+)\s+(.+)$/);if(!e)continue;let[n,i,a,o]=e.slice(1);if(void 0===n||void 0===i||void 0===a||void 0===o)continue;let s=Number(n),l=Number(i),d=Number(a),c=o.trim();Number.isFinite(s)&&Number.isFinite(l)&&Number.isFinite(d)&&t.push({pid:s,cpuPercent:l,rssKb:d,command:c})}return t})(("macos"===e.platform?await i$("ps",r,{timeoutMs:15e3}):await fr(r)).stdout).filter(e=>(function(e,t){let r=fn(e);if(t.executablePath){var n;let i;for(let a of(i=[n=t.executablePath],n.startsWith("/private/var/")?i.push(n.replace("/private/var/","/var/")):n.startsWith("/var/")&&i.push(n.replace("/var/","/private/var/")),i))if(e===a||r===a||e.startsWith(`${a} `))return!0}return i.basename(r)===t.executableName})(e.command,t))}async function p7(e,t,r){let n=(await p9(e,r)).sort((e,t)=>t.rssKb-e.rssKb)[0];if(n)return n;throw new eD("COMMAND_FAILED",`No running process found for ${t}`,{kind:"memgraph",appBundleId:t,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf memory snapshot."})}async function fe(e,t,r){try{let r=await p1(e,t);return{available:!0,process:await p7(e,t,r)}}catch(t){if(function(e,t){if("ios"!==e.platform||"simulator"!==e.kind||!(t instanceof eD))return!1;let r=t.details??{},n=Array.isArray(r.args)?r.args.join(" "):"",i="string"==typeof r.stderr?r.stderr:"",a=`${t.message}
|
|
18
|
+
${i}`.toLowerCase();return n.includes("simctl spawn")&&n.includes(" ps ")&&a.includes("no such file")}(e,t))return{available:!1,kind:"memgraph",reason:"iOS simulator memgraph capture needs process tools inside simctl spawn, but this simulator runtime did not provide ps.",hint:"Use perf memory sample when available, or retry memgraph on a simulator runtime that includes process tools such as ps and leaks.",support:{...r,memgraph:!1}};throw t}}function ft(e,t,r){let n=`${t}
|
|
19
|
+
${r}`.toLowerCase();return n.includes("timed out")||n.includes("timeout")?"Apple memgraph capture can take longer than metric sampling. Keep the app running and retry; if it times out again, collect a smaller reproduction before capturing leaks --outputGraph.":n.includes("not found")||n.includes("no such file")?"Install Xcode command line tools and ensure leaks is available, then retry.":n.includes("permission")||n.includes("denied")||n.includes("not authorized")?"macos"===e.platform?"Grant the agent terminal process permission to inspect this macOS app, then retry.":"Keep the simulator booted and app running; if inspection is denied, retry with a debug simulator build.":"Keep the app process running and retry perf memory snapshot with --debug if the failure persists."}async function fr(e){let t=await iF(e,{allowFailure:!0,timeoutMs:15e3});return 0===t.exitCode?t:await i$("ps",["-axo","pid=,%cpu=,rss=,command="],{timeoutMs:15e3})}function fn(e){let[t=""]=e.trim().split(/\s+/,1);return t}function fi(e){return{cpu:{usagePercent:pv(e.usagePercent),measuredAt:e.measuredAt,method:e.cpuMethod,matchedProcesses:e.matchedProcesses},memory:{residentMemoryKb:Math.round(e.residentMemoryKb),measuredAt:e.measuredAt,method:e.memoryMethod,matchedProcesses:e.matchedProcesses}}}function fa(e){let t=e?.attributes.fmt?.trim()??"";return t?t.replace(/\s+\(\d+\)$/,"").trim():null}function fo(e,t){let r=px(e,t);if(r)return r;let n=`${e}
|
|
20
|
+
${t}`.toLowerCase();return n.includes("no device matched")||n.includes("failed to find device")?pb:n.includes("timed out")?"Keep the iOS device unlocked and connected by cable, keep the app active, then retry perf.":"Ensure the iOS device is unlocked, trusted, visible to xctrace, and the target app stays active while perf samples it."}function fs(e,t){return null===e?t:null===t?e:Math.max(e,t)}async function fl(e){var t;let r=await fp(e.device,e.appBundleId);await s.mkdir(i.dirname(e.outPath),{recursive:!0});let n=["xctrace","record","--template",(t={device:e.device,template:e.template,targetPids:r.pids,outPath:e.outPath}).template,..."ios"===t.device.platform?["--device",t.device.id]:[],...t.targetPids.flatMap(e=>["--attach",String(e)]),"--output",t.outPath,"--quiet","--no-prompt"],a=new Date().toISOString(),o=await ff(n,e.outPath,{device:e.device,appBundleId:e.appBundleId,failureMessage:`Failed to start Apple xctrace ${e.mode} capture for ${e.appBundleId}`});return{kind:"xctrace",mode:e.mode,template:e.template,outPath:e.outPath,appBundleId:e.appBundleId,deviceId:e.device.id,platform:e.device.platform,targetPids:r.pids,targetProcesses:r.processNames,startedAt:a,child:o.child,wait:o.wait}}async function fd(e,t=e.outPath){t!==e.outPath&&await s.mkdir(i.dirname(t),{recursive:!0});let r=await fh(e,{failOnForcedKill:!0});if(0!==r.exitCode)throw new eD("COMMAND_FAILED",`Failed to stop Apple xctrace ${e.mode} capture`,{exitCode:r.exitCode,stdout:r.stdout,stderr:r.stderr,tracePath:e.outPath,captureCleanedUp:!0,hint:fo(r.stdout,r.stderr)});return t!==e.outPath&&await s.rename(e.outPath,t).catch(async()=>{await s.cp(e.outPath,t,{recursive:!0}),await s.rm(e.outPath,{recursive:!0,force:!0})}),await fg(t,{appBundleId:e.appBundleId,deviceId:e.deviceId,stdout:r.stdout,stderr:r.stderr}),{kind:"xctrace",mode:e.mode,template:e.template,outPath:t,appBundleId:e.appBundleId,deviceId:e.deviceId,platform:e.platform,targetPids:e.targetPids,targetProcesses:e.targetProcesses,startedAt:e.startedAt,endedAt:new Date().toISOString()}}async function fc(e){return await fh(e,{failOnForcedKill:!1})}async function fu(e){let t=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-xctrace-report-")),r=i.join(t,"trace-toc.xml");try{var n;let t,a,o,l=["xctrace","export","--input",e.tracePath,"--xpath","/trace-toc","--output",r],d=await iF(l,{allowFailure:!0,timeoutMs:15e3});if(0!==d.exitCode)throw new eD("COMMAND_FAILED","Failed to export Apple xctrace report metadata",{cmd:"xcrun",args:l,exitCode:d.exitCode,stdout:d.stdout,stderr:d.stderr,tracePath:e.tracePath,hint:fo(d.stdout,d.stderr)});let c=(n={...e,tocXml:await s.readFile(r,"utf8")},t=l5(n.tocXml),a=ph(t,e=>"run"===e.name),o=tJ(ph(t,e=>"table"===e.name).map(e=>e.attributes.schema).filter(e=>"string"==typeof e&&e.length>0)).sort(),{kind:"xctrace",mode:n.mode,template:n.template,tracePath:n.tracePath,reportPath:n.outPath,appBundleId:n.appBundleId,generatedAt:new Date().toISOString(),summary:{runCount:a.length,tableSchemas:o}});return await s.mkdir(i.dirname(e.outPath),{recursive:!0}),await s.writeFile(e.outPath,`${JSON.stringify(c,null,2)}
|
|
21
|
+
`,"utf8"),c}finally{await s.rm(t,{recursive:!0,force:!0}).catch(()=>{})}}async function fp(e,t){if("ios"!==e.platform&&"macos"!==e.platform)throw new eD("UNSUPPORTED_OPERATION","Apple xctrace perf is not supported on Android.",{platform:e.platform,hint:"Android native profiling belongs to the Android perf rollout and is not implemented under Apple xctrace."});if("ios"===e.platform&&"device"===e.kind){let r=await p3(e,t);return{pids:r.map(e=>e.pid),processNames:tJ(r.map(e=>i.basename(d(e.executable))))}}let r=await p1(e,t),n=await p9(e,r);if(0===n.length)throw new eD("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,deviceId:e.id,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf."});return{pids:n.map(e=>e.pid),processNames:[r.executableName]}}async function ff(e,t,r){let n;for(let r=1;r<=3;r+=1){await pJ(t,r,1500);let i=ek("xcrun",e,{allowFailure:!0}),a=await fm(i.wait);if(!a)return i;if(n=a,!pX(a))break}let i=n??{stdout:"",stderr:"",exitCode:1};throw new eD("COMMAND_FAILED",r.failureMessage,{cmd:"xcrun",args:e,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,appBundleId:r.appBundleId,deviceId:r.device.id,hint:fo(i.stdout,i.stderr)})}async function fm(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function fh(e,t){e.child.kill("SIGINT");let r=await fw(e.wait,45e3);if(r)return r;e.child.kill("SIGKILL");let n=await fw(e.wait,5e3);if(n&&!t.failOnForcedKill)return n;if(n)throw new eD("COMMAND_FAILED","Timed out waiting for Apple xctrace capture to stop",{exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,tracePath:e.outPath,captureCleanedUp:!0,forcedKill:!0,hint:"xctrace did not finish after SIGINT, so it was force-killed. Retry the perf command after confirming no other xctrace session is active."});throw new eD("COMMAND_FAILED","Timed out waiting for Apple xctrace capture to stop after SIGKILL",{tracePath:e.outPath,captureCleanedUp:!1,forcedKill:!0,hint:"xctrace did not exit after SIGKILL. Inspect running xctrace processes before retrying."})}async function fw(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function fg(e,t){let r=await s.stat(e).catch(()=>null);if(!(r?.isDirectory()===!0?(await s.readdir(e).catch(()=>[])).length>0:(r?.size??0)>0))throw new eD("COMMAND_FAILED","xctrace produced no trace data",{tracePath:e,appBundleId:t.appBundleId,deviceId:t.deviceId,stdout:t.stdout,stderr:t.stderr,hint:"Keep the Apple device unlocked and connected, keep the app active, then retry perf."})}function fy(e){let t=e.replaceAll(",","").match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let r=Number(t[0]);return Number.isFinite(r)?r:null}function fv(e){return Math.round(10*e)/10}let fS="adb-shell-dumpsys-gfxinfo-framestats",fI="Rendered-frame health from the current adb shell dumpsys gfxinfo <package> framestats window. Dropped frames use Android gfxinfo janky-frame/frame-deadline data when available; this is not video recording FPS.";function fA(e,t,r){let n=t.get(r);if(void 0===n)return null;let i=Number(e[n]);return Number.isFinite(i)?i:null}function f_(e){return 0===e.length?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function fb(e,t){if(void 0!==e&&void 0!==t)return Math.max(0,Math.round((t-e)/1e6))}function fx(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=e.match(RegExp(`^\\s*${r}:\\s*([0-9][0-9,]*)`,"im"));if(!n)return;let i=n[1];return void 0===i?void 0:fy(i)??void 0}async function fM(e,t,r={}){var n,i,a,o,s,l,d,c;let u=tM(e,r.adb);try{let d,c,p,f,m,h,w,g,y,v,S,I=(n=(await u(["shell","dumpsys","gfxinfo",t,"framestats"],{timeoutMs:15e3})).stdout,i=new Date().toISOString(),function(e,t){if(/no process found for:/i.test(e))throw new eD("COMMAND_FAILED",`Android gfxinfo did not find a running process for ${t}`,{metric:"fps",package:t,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf after the interaction you want to inspect."})}(n,t),p=function(e){let t=e.split(/\nProfile data in ms:\n/i)[0]??"",r=fx(t,"Total frames rendered"),n=t.match(/^\s*Janky frames:\s*([0-9][0-9,]*)\s*\(([0-9.]+)%\)/im);if(void 0===r||!n)return;let i=n[1],a=n[2];if(void 0===i||void 0===a)return;let o=fy(i)??void 0,s=Number(a);if(void 0===o||!Number.isFinite(s)||r<0)return;let l=fx(t,"Uptime"),d=fx(t,"Stats since");return{droppedFramePercent:pv(s),droppedFrameCount:o,totalFrameCount:r,sampleWindowMs:function(e){let{uptimeMs:t,statsSinceNs:r}=e;if(void 0===t||void 0===r)return;let n=t-Math.round(r/1e6);return n>=0?n:void 0}({uptimeMs:l,statsSinceNs:d}),uptimeMs:l,statsSinceNs:d}}(n),f=function(e){let t=[],r=null;for(let i of e.split("\n")){var n;let e=i.trim();if(0===e.length||"---PROFILEDATA---"===e)continue;let a=e.split(",").map(e=>e.trim());if((n=a).includes("IntendedVsync")&&n.includes("FrameCompleted")){r=new Map(a.map((e,t)=>[e,t]));continue}let o=function(e,t){if(!t||e.length<t.size)return;let r=fA(e,t,"Flags"),n=fA(e,t,"IntendedVsync"),i=fA(e,t,"FrameCompleted");if(0===r&&null!==n&&null!==i&&!(n<=0)&&!(i<=n))return{intendedVsyncNs:n,frameCompletedNs:i,durationNs:i-n}}(a,r);o&&t.push(o)}return t.sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs)}(n),m=function(e,t,r){let n=function(e){var t;let r=(t=e.map(e=>e.intendedVsyncNs),[...new Set(t.filter(e=>Number.isFinite(e)))].sort((e,t)=>e-t)),n=[];for(let e=1;e<r.length;e+=1){let t=r[e]-r[e-1];t>=4e6&&t<=5e7&&n.push(t)}if(0!==n.length){let e,t;return e=[...n].sort((e,t)=>e-t),t=Math.floor(e.length/2),e.length%2==1?e[t]:(e[t-1]+e[t])/2}}(e);if(t||0!==e.length||function(e){throw new eD("COMMAND_FAILED",`Failed to parse Android framestats output for ${e}`,{metric:"fps",package:e,hint:"Retry perf after exercising the app screen. If the problem persists, capture adb shell dumpsys gfxinfo <package> framestats output for debugging."})}(r),t||void 0!==n)return n;throw new eD("COMMAND_FAILED",`Failed to infer Android frame deadline from framestats output for ${r}`,{metric:"fps",package:r,hint:"Retry perf after a longer interaction window so consecutive Android frame timestamps are available."})}(f,p,t),h=Date.parse(i),w=function(e){let{frames:t,measuredAtMs:r,summary:n}=e,i=f_(t),a=n?.statsSinceNs,o=a??i.firstFrameNs,s=fb(o,i.lastFrameNs),l=n?.sampleWindowMs??s;if(!Number.isFinite(r)||n?.uptimeMs===void 0||void 0===o)return{sampleWindowMs:l,windowStartNs:o};let d=r-n.uptimeMs;return{sampleWindowMs:l,windowStartNs:o,windowStartedAt:new Date(d+o/1e6).toISOString(),windowEndedAt:function(e){let{deviceBootWallClockMs:t,measuredAtMs:r,summaryStartNs:n,lastFrameNs:i}=e;return void 0!==n?new Date(r).toISOString():void 0===i?void 0:new Date(t+i/1e6).toISOString()}({deviceBootWallClockMs:d,measuredAtMs:r,summaryStartNs:a,lastFrameNs:i.lastFrameNs}),timestampSource:"estimated-from-device-uptime"}}({frames:f,measuredAtMs:h,summary:p}),g=function(e){let{frames:t,frameDeadlineNs:r,summaryDroppedFrameCount:n}=e;return void 0!==n?n<=0?[]:[...t].sort((e,t)=>t.durationNs-e.durationNs).slice(0,n).sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs):void 0===r?[]:t.filter(e=>e.durationNs>r)}({frames:f,frameDeadlineNs:m,summaryDroppedFrameCount:p?.droppedFrameCount}),y=p?.sampleWindowMs??w.sampleWindowMs??function(e){if(0===e.length)return;let t=f_(e);return fb(t.firstFrameNs,t.lastFrameNs)}(f),a=p,o=f,s=g,d=a?.totalFrameCount??o.length,c=a?.droppedFrameCount??s.length,v={totalFrameCount:d,droppedFrameCount:c,droppedFramePercent:a?.droppedFramePercent??(d>0?pv(c/d*100):0)},S=function(e){let{droppedFrames:t,timing:r,measuredAtMs:n,summary:i}=e;if(0===t.length)return;let a=function(e){let{frames:t,windowStartNs:r,measuredAtMs:n,uptimeMs:i}=e;if(0===t.length||void 0===r)return[];let a=[],o=[];for(let e of t){let t=o.at(-1);if(!t||e.intendedVsyncNs-t.frameCompletedNs<=5e8){o.push(e);continue}a.push(o),o=[e]}return o.length>0&&a.push(o),a.map(e=>(function(e){let{frames:t,windowStartNs:r,measuredAtMs:n,uptimeMs:i}=e,a=Math.min(...t.map(e=>e.intendedVsyncNs)),o=Math.max(...t.map(e=>e.frameCompletedNs)),s=Math.max(0,Math.round((a-r)/1e6)),l=Math.max(s,Math.round((o-r)/1e6)),d=void 0!==i&&Number.isFinite(n)?n-i:void 0;return{startOffsetMs:s,endOffsetMs:l,startAt:void 0===d?void 0:new Date(d+a/1e6).toISOString(),endAt:void 0===d?void 0:new Date(d+o/1e6).toISOString(),missedDeadlineFrameCount:t.length,worstFrameMs:fv(Math.max(...t.map(e=>e.durationNs))/1e6)}})({frames:e,windowStartNs:r,measuredAtMs:n,uptimeMs:i})).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}({frames:t,windowStartNs:r.windowStartNs,measuredAtMs:n,uptimeMs:i?.uptimeMs});return a.length>0?a:void 0}({droppedFrames:g,timing:w,measuredAtMs:h,summary:p}),{...v,sampleWindowMs:y,...(l=m,{frameDeadlineMs:void 0===l?void 0:fv(l/1e6),refreshRateHz:void 0===l?void 0:fv(1e9/l)}),windowStartedAt:w.windowStartedAt,windowEndedAt:w.windowEndedAt,timestampSource:w.timestampSource,measuredAt:i,method:fS,source:p?"android-gfxinfo-summary":"framestats-rows",worstWindows:S&&S.length>0?S:void 0});return await fN(e,t,r),I}catch(e){throw d=t,(c=e)instanceof eD?new eD(c.code,c.message,{...c.details??{},metric:"fps",package:d},c):new eD("COMMAND_FAILED",`Failed to sample Android fps for ${d}`,{metric:"fps",package:d},c)}}async function fN(e,t,r={}){let n=tM(e,r.adb);try{await n(["shell","dumpsys","gfxinfo",t,"reset"],{allowFailure:!0,timeoutMs:3e3})}catch{}}function fD(e,t,r,n){if(n instanceof eD){var i,a,o,s,l;let d,c=n.details??{};return new eD(n.code,n.message,{...c,action:e,package:r,tool:t,hint:"string"==typeof c.hint?c.hint:(i=t,d=("string"==typeof(a=c).stderr?a.stderr:"").toLowerCase(),"simpleperf"===i?(s=o=d).includes("permission denied")||s.includes("not profileable")||s.includes("profileable")?"Use a debuggable/profileable Android app or a device image that permits simpleperf for the target process, then retry perf cpu profile start.":o.includes("not supported")||o.includes("failed to open perf event")?"This device image does not expose the requested simpleperf event for the app process. Try a different emulator/system image or a profileable app.":fk("simpleperf"):(l=d).includes("permission denied")||l.includes("not allowed")?"Use a device image that permits perfetto trace capture for shell, keep the app running, then retry perf trace start.":fk(i))},n)}return new eD("COMMAND_FAILED",`Failed to ${e} Android ${t} for ${r}`,{action:e,package:r,tool:t,hint:fk(t)},n)}function fk(e){return"simpleperf"===e?"Verify simpleperf is available, the app process is running, and the app/device permits native CPU profiling.":"Verify perfetto is available, the app process is running, and the device permits trace capture."}async function fP(e,t,r,n,i){return{capture:{durationMs:n,packageName:t.packageName,appPid:t.appPid,artifactPath:t.outPath,sizeBytes:r},frameHealth:"perfetto"===t.kind?await fE(e,t.packageName,i):void 0,notes:["perfetto"===t.kind?"Frame health is sampled from Android gfxinfo around the trace window; open the Perfetto artifact for timeline root cause.":"Open the Simpleperf report artifact for symbol-level CPU attribution."]}}async function fE(e,t,r){try{let n=await fM(e,t,r);return{available:!0,droppedFramePercent:n.droppedFramePercent,droppedFrameCount:n.droppedFrameCount,totalFrameCount:n.totalFrameCount,method:n.method,worstWindows:n.worstWindows?.slice(0,3).map(e=>({startOffsetMs:e.startOffsetMs,endOffsetMs:e.endOffsetMs,missedDeadlineFrameCount:e.missedDeadlineFrameCount,worstFrameMs:e.worstFrameMs}))}}catch(e){return{available:!1,reason:e instanceof Error?e.message:"Android frame health was not available"}}}let fC="adb-shell-simpleperf",fR="adb-shell-perfetto",fO="/data/local/tmp";async function fT(e,t,r){let n=tM(e,r.adb);await fj(n,t),await fB(n,t),await fV(n,t);let i=await fG(t.outPath);await fF(n,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await fP(e,t,i,o,{adb:n});return{...t,action:"stop",platform:"android",state:"stopped",stoppedAt:a,durationMs:o,sizeBytes:i,method:"simpleperf"===t.kind?fC:fR,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function fL(e,t,r={}){let n=tM(e,r.adb);try{"running"===t.state&&(await fj(n,t),await fB(n,t).catch(()=>{}))}finally{await fF(n,t.remotePath)}}function f$(e,t,r=fO){let n=e.replace(/[^A-Za-z0-9_.-]/g,"_");return`${r}/agent-device-${n}-${Date.now()}-${t}`}async function fF(e,t){try{await e(["shell",`rm -f ${fq(t)}`],{allowFailure:!0,timeoutMs:15e3})}catch{}}async function fU(e,t){await s.mkdir(i.dirname(e),{recursive:!0}),await s.writeFile(e,`${JSON.stringify(t,null,2)}
|
|
22
|
+
`)}async function fG(e){try{return(await s.stat(e)).size}catch(t){throw new eD("COMMAND_FAILED",`Profiler artifact was not written: ${e}`,{outPath:e,hint:"Retry the profiling command and check daemon logs if the artifact path is still missing."},t)}}function fq(e){return`'${e.replace(/'/g,"'\\''")}'`}async function fj(e,t){try{var r;await e(["shell",(r=t.profilerPid,`pid=${fq(r)}; kill -INT "$pid" 2>/dev/null || true; for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done; kill -TERM "$pid" 2>/dev/null || true; for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done; echo "profiler process did not stop after SIGTERM" >&2; exit 1`)],{timeoutMs:3e4})}catch(e){throw fD("stop",t.kind,t.packageName,e)}}async function fV(e,t){await s.mkdir(i.dirname(t.outPath),{recursive:!0});try{await e(["pull",t.remotePath,t.outPath],{timeoutMs:3e4})}catch(e){throw new eD("COMMAND_FAILED",`Failed to pull Android ${t.kind} artifact for ${t.packageName}`,{package:t.packageName,tool:t.kind,remotePath:t.remotePath,outPath:t.outPath,hint:"Check that the profiling command ran long enough to create an artifact, then retry stop with the same session."},e)}}async function fB(e,t){let r;for(let n=0;n<12;n+=1){let n=await fH(e,t.remotePath);if(void 0!==n&&n>0&&n===r)return;r=n,await y(250)}throw new eD("COMMAND_FAILED",`Android ${t.kind} artifact is not ready to pull`,{package:t.packageName,tool:t.kind,remotePath:t.remotePath,hint:"The profiler stopped, but the remote artifact was missing, empty, or still changing. Retry stop with the same session or inspect the device-side artifact."})}async function fH(e,t){let r=fq(t),n=await e(["shell",`if [ -f ${r} ]; then stat -c %s ${r} 2>/dev/null || wc -c < ${r}; fi`],{allowFailure:!0,timeoutMs:15e3});if(0!==n.exitCode)return;let i=Number(n.stdout.trim().split(/\s+/)[0]);return Number.isFinite(i)?i:void 0}async function fK(e,t){try{let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=fz(r.stdout);if(0===r.exitCode&&n)return n}catch{}throw new eD("COMMAND_FAILED",`No active Android app process found for ${t}`,{package:t,hint:"Run open <app> for this session again, wait for the app UI to appear, then retry perf."})}async function fW(e,t,r){let n=await e(["shell",`command -v ${t} || which ${t}`],{allowFailure:!0,timeoutMs:15e3});if(!(0===n.exitCode&&n.stdout.trim()))throw new eD("UNSUPPORTED_OPERATION",`Android device does not expose ${t}`,{package:r,tool:t,hint:"simpleperf"===t?"Use an emulator/system image with simpleperf available, or install the Android NDK simpleperf binary for this device.":"Use Android 10+ or a system image that exposes the perfetto command-line binary."})}function fz(e){return e.trim().split(/\s+/).find(e=>/^\d+$/.test(e))}async function fX(e,t,r,n={}){let i,a=tM(e,n.adb),o=await fK(a,t);await fW(a,"perfetto",t);let s=f$(t,"app.perfetto-trace","/data/misc/perfetto-traces");try{await fN(e,t,{adb:a}),i=await fZ(a,s,t)}catch(e){throw await fF(a,s),e}return{...{type:"trace",kind:"perfetto",packageName:t,appPid:o,profilerPid:i,remotePath:s,outPath:r,startedAt:Date.now(),state:"running"},action:"start",platform:"android",method:fR,message:`Started Android Perfetto trace for ${t}`}}async function fJ(e,t,r,n={}){return await fT(e,{...t,outPath:r},n)}async function fZ(e,t,r){try{let n=await e(["shell","perfetto","--background-wait","-o",t,"-t","3600s","sched","freq","idle","am","wm","gfx","view","binder_driver","hal","dalvik"],{timeoutMs:3e4}),i=fz(n.stdout);if(i)return i;throw new eD("COMMAND_FAILED","Android perfetto did not return a profiler pid",{package:r,tool:"perfetto",hint:"Retry perf trace start. If perfetto exits immediately, verify the device permits trace capture."})}catch(e){throw fD("start","perfetto",r,e)}}async function fY(e,t,r,n={}){let i,a=tM(e,n.adb),o=await fK(a,t);await fW(a,"simpleperf",t);let s=f$(t,"cpu.perf.data");try{i=await f1(a,o,s,t)}catch(e){throw await fF(a,s),e}return{...{type:"cpu-profile",kind:"simpleperf",packageName:t,appPid:o,profilerPid:i,remotePath:s,outPath:r,startedAt:Date.now(),state:"running"},action:"start",platform:"android",method:fC,message:`Started Android Simpleperf CPU profile for ${t}`}}async function fQ(e,t,r,n={}){return await fT(e,{...t,outPath:r},n)}async function f0(e,t,r,n={}){let i=tM(e,n.adb);await fW(i,"simpleperf",t.packageName);let a=await f2(i,t),o=new Date().toISOString(),s=function(e){let t=[];for(let r of P(e)){let e=r.match(/^([0-9]+(?:\.[0-9]+)?)%\s+(.+)$/);if(!e)continue;let n=Number(e[1]),i=e[2]?.trim();if(!Number.isFinite(n)||!i)continue;let a=i.split(/\s{2,}/).filter(Boolean);if(t.push({percentage:pv(n),command:a[0],dso:a[1],symbol:a.slice(2).join(" ")||void 0}),t.length>=50)break}return t}(a.stdout),l={kind:"simpleperf-report",generatedAt:o,packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,sourceRemotePath:t.remotePath,entryCount:s.length,entries:s};await fU(r,l);let d=await fG(r);return{action:"report",platform:"android",type:"cpu-profile-report",kind:"simpleperf",packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,outPath:r,sizeBytes:d,generatedAt:o,entryCount:s.length,method:fC,message:`Wrote Android Simpleperf report for ${t.packageName}`}}async function f1(e,t,r,n){try{var i,a,o,s;let l,d,c=await e(["shell",(i=t,a=r,o=["simpleperf","record","-e","cpu-clock:u","-p",i,"-o",a,"--duration",String(3600)],s="simpleperf",l=o.map(fq).join(" "),d=`${fO}/agent-device-${s}-${Date.now()}.err`,`err=${fq(d)}; (${l}) >/dev/null 2>"$err" & pid=$!; sleep 1; if kill -0 "$pid" 2>/dev/null; then rm -f "$err"; echo "$pid"; exit 0; fi; cat "$err" >&2; rm -f "$err"; exit 1`)],{timeoutMs:3e4}),u=fz(c.stdout);if(u)return u;throw new eD("COMMAND_FAILED","Android simpleperf did not return a profiler pid",{package:n,tool:"simpleperf",hint:"Retry perf. If simpleperf exits immediately, verify the app is profileable and the device permits native profiling."})}catch(e){throw fD("start","simpleperf",n,e)}}async function f2(e,t){try{return await e(["shell","simpleperf","report","-i",t.remotePath,"--stdio","--sort","comm,dso,symbol"],{timeoutMs:3e4})}catch(e){throw fD("report","simpleperf",t.packageName,e)}}let f3="adb-shell-dumpsys-cpuinfo",f5="Aggregated CPU usage for app processes matched from adb shell dumpsys cpuinfo.",f4="adb-shell-dumpsys-meminfo",f8="Memory snapshot from adb shell dumpsys meminfo <package>. Values are reported in kilobytes.",f6="adb-shell-am-dumpheap",f9="Java heap dump captured with adb shell am dumpheap, pulled to a local artifact path.";async function f7(e,t,r={}){let n=tM(e,r.adb);try{let e=await n(["shell","dumpsys","cpuinfo"],{timeoutMs:15e3});return function(e,t,r){let n=new Set,i=0;for(let r of P(e)){var a,o;let e=r.match(/^([0-9]+(?:\.[0-9]+)?)%\s+\d+\/([^\s]+):\s/);if(!e)continue;let s=e[1],l=e[2];if(void 0===s||void 0===l)continue;let d=Number(s);Number.isFinite(d)&&(a=l,o=t,a===o||a.startsWith(`${o}:`))&&(i+=d,n.add(l))}return{usagePercent:pv(i),measuredAt:r,method:f3,matchedProcesses:[...n]}}(e.stdout,t,new Date().toISOString())}catch(e){throw ma("cpu",t,e)}}async function me(e,t,r={}){let n=tM(e,r.adb);try{let e=await n(["shell","dumpsys","meminfo",t],{timeoutMs:15e3});return function(e,t,r){let n;if(/no process found for:/i.test(e))throw new eD("COMMAND_FAILED",`Android meminfo did not find a running process for ${t}`,{metric:"memory",package:t,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf."});let i=mo(e,"TOTAL PSS")??function(e){for(let t of e.split("\n")){let e=t.trim();if(!/^TOTAL\b(?!\s+PSS:)/.test(e))continue;let r=e.split(/\s+/).slice(1).find(e=>null!==fy(e));if(!r)break;return fy(r)??void 0}}(e);if(void 0===i)throw new eD("COMMAND_FAILED",`Failed to parse Android meminfo output for ${t}`,{metric:"memory",package:t,hint:"Retry perf after reopening the app session. If the problem persists, capture adb shell dumpsys meminfo output for debugging."});return{totalPssKb:i,totalRssKb:mo(e,"TOTAL RSS"),measuredAt:r,method:f4,topConsumers:(n=e.split("\n").flatMap(e=>(function(e){let t=e.trim();if(function(e){if(!e||e.startsWith("**")||e.startsWith("-")||e.includes(":"))return!0;let t=/^\S.+\s+\d/.test(e);return/^(pss|total|native|dalvik|unknown|app summary\b)/i.test(e)&&!t}(t))return;let r=t.match(/^(.+?)\s+([0-9][0-9,]*(?:\(\d+\))?)(?:\s|$)/);if(r)return function(e,t){let r=e?.trim(),n=t?fy(t):null;if(r&&"TOTAL"!==r&&null!==n&&!(n<=0)&&!/^(pss|private|shared|heap|size|alloc|free)$/i.test(r))return{name:r,pssKb:n}}(r[1],r[2])})(e)??[]).sort((e,t)=>t.pssKb-e.pssKb).slice(0,5)).length>0?n:void 0}}(e.stdout,t,new Date().toISOString())}catch(e){throw ma("memory",t,e)}}async function mt(e,t,r,n={}){let a,o=tM(e,n.adb),l=await mi(o,t),d=(a=t.replace(/[^a-zA-Z0-9._-]/g,"_"),`/data/local/tmp/agent-device-${a}-${Date.now()}.hprof`);await s.mkdir(i.dirname(r),{recursive:!0});let c=await mr(r);try{let e=await o(["shell","am","dumpheap",t,d],{allowFailure:!0,timeoutMs:12e4});if(0!==e.exitCode){var u,p;let r;throw new eD("COMMAND_FAILED",`Failed to capture Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:l,remotePath:d,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,hint:(u=e.stdout,p=e.stderr,(r=`${u}
|
|
23
|
+
${p}`.toLowerCase()).includes("profileable")||r.includes("debuggable")||r.includes("not allowed")?"Android heap dumps require a debuggable/profileable app process on many devices. Use a debug/profileable build, reopen the app, then retry.":r.includes("permission")||r.includes("denied")?"The device denied heap dump access. Use a debug/profileable build or a device image that permits app heap dumping.":"Reopen the app to refresh the process, then retry perf memory snapshot. If it still fails, run with --debug and inspect adb am dumpheap output.")})}let n=await o(["pull",d,r],{allowFailure:!0,timeoutMs:12e4});if(0!==n.exitCode)throw await mn(r,c),new eD("COMMAND_FAILED",`Failed to pull Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:l,remotePath:d,path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:"Verify the daemon can write the requested --out path and retry. The heap dump stays on-device only until cleanup runs."});let i=await s.stat(r).catch(()=>null);if(!i?.isFile()||i.size<=0)throw await mn(r,c),new eD("COMMAND_FAILED","Android heap dump artifact is missing or empty",{kind:"android-hprof",package:t,pid:l,path:r,remotePath:d,hint:"Retry with a writable --out path. If the file is still empty, inspect adb pull output with --debug."});return{available:!0,kind:"android-hprof",path:r,sizeBytes:i.size,measuredAt:new Date().toISOString(),method:f6,packageName:t,pid:l,remotePath:d}}finally{await o(["shell","rm","-f",d],{allowFailure:!0,timeoutMs:15e3}).catch(()=>{})}}async function mr(e){return await s.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function mn(e,t){t||await s.rm(e,{force:!0}).catch(()=>{})}async function mi(e,t){let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=r.stdout.trim().split(/\s+/).map(e=>Number(e)).find(e=>Number.isInteger(e)&&e>0);if(0===r.exitCode&&void 0!==n)return n;throw new eD("COMMAND_FAILED",`No running Android process found for ${t}`,{kind:"android-hprof",package:t,stdout:r.stdout,stderr:r.stderr,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf memory snapshot."})}function ma(e,t,r){return r instanceof eD?new eD(r.code,r.message,{...r.details??{},metric:e,package:t},r):new eD("COMMAND_FAILED",`Failed to sample Android ${e} for ${t}`,{metric:e,package:t},r)}function mo(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=e.match(RegExp(`${r}:\\s*([0-9][0-9,]*)`,"i"));if(!n)return;let i=n[1];return void 0===i?void 0:fy(i)??void 0}let ms="shared_prefs/ReactNativeDevPrefs.xml",ml="debug_http_host",md="dev_server_https",mc="RCT_jsLocation",mu="RCT_packager_scheme",mp="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.",mf='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function mm(e){return void 0!==eI(e)}async function mh(e){let{device:t,appId:r,runtime:n}=e;if(!r)return;let i=eI(n);if(i){if("android"===t.platform)return void await mg(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await mI(t,r,i)}}async function mw(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await my(t,r);"ios"===t.platform&&"simulator"===t.kind&&await mA(t,r)}}async function mg(e,t,r){var n,i,a,o,s,l;let d,c;mM(t);let u=(n=await mv(e,t),i=ml,a=`${r.host}:${r.port}`,d=` <string name="${mN(i)}">${mN(a)}</string>`,mb(mx(n,i),d));o=u,s=md,l="https"===r.scheme,c=` <boolean name="${mN(s)}" value="${l?"true":"false"}" />`,u=mb(mx(o,s),c),await mS(e,t,u)}async function my(e,t){mM(t);let r=await mv(e,t),n=mx(r,ml),i=mx(n,md);i!==r&&await mS(e,t,i)}async function mv(e,t){let r=await e4(e,["shell","run-as",t,"cat",ms],{allowFailure:!0});return 0!==r.exitCode?mf:m_(r.stdout)}async function mS(e,t,r){let n=["shell","run-as",t,"id"],i=await e4(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=mD(i.stdout,i.stderr);throw new eD("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?mp:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await e4(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await e4(e,["shell","run-as",t,"tee",ms],{stdin:r.trimEnd()})}catch(n){let e=eM(n);if("TOOL_MISSING"===e.code)throw e;let r=mD("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new eD("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?mp:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function mI(e,t,r){await iF(lS(e,["spawn",e.id,"defaults","write",t,mc,"-string",`${r.host}:${r.port}`])),await iF(lS(e,["spawn",e.id,"defaults","write",t,mu,"-string",r.scheme]))}async function mA(e,t){await iF(lS(e,["spawn",e.id,"defaults","delete",t,mc]),{allowFailure:!0}),await iF(lS(e,["spawn",e.id,"defaults","delete",t,mu]),{allowFailure:!0})}function m_(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
|
|
24
|
+
`:mf}function mb(e,t){return m_(e).replace("</map>",`${t}
|
|
25
|
+
</map>`)}function mx(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return m_(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 mM(e){if("binary"!==td(e))return;let t=tf(e);throw new eD("INVALID_ARGS",t,{package:e,hint:t})}function mN(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function mD(e,t){let r=`${e}
|
|
26
|
+
${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 mk=new Map;async function mP(e){let t=await w.mkdtemp(i.join(u.tmpdir(),"agent-device-materialized-"));try{let n=await mR(e.installablePath,i.join(t,"installable")),a=e.archivePath?await mR(e.archivePath,i.join(t,"archive")):void 0,o=r.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{mE(o)},s);return mk.set(o,{rootPath:t,installablePath:n,archivePath:a,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:d}),{materializationId:o,installablePath:n,...a?{archivePath:a}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await w.rm(t,{recursive:!0,force:!0}),e}}async function mE(e,t){let r=mk.get(e);if(!r)throw new eD("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eD("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),mk.delete(e),await w.rm(r.rootPath,{recursive:!0,force:!0})}async function mC(e){let t=Array.from(mk.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await mE(e)}))}async function mR(e,t){let r=await w.stat(e);await w.mkdir(t,{recursive:!0});let n=i.join(t,i.basename(e));return r.isDirectory()?await w.cp(e,n,{recursive:!0}):await w.copyFile(e,n),n}let mO=["Simulator"],mT=["Device Hub","Simulator"];function mL(e,t){if("simulator"!==e.kind)throw new eD("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function m$(e={}){let t=e.deviceHub?mT:mO,r=e.background?["-g","-a"]:["-a"];for(let e of t)if(0===(await i$("open",[...r,e],{allowFailure:!0,timeoutMs:1e4})).exitCode)return}async function mF(e,t={}){let r,n;if("simulator"!==e.kind)return;if("Booted"===await mG(e)){t.focusExisting&&await m$({background:t.deviceHub,deviceHub:t.deviceHub});return}let i=e7.fromTimeoutMs(18e4);try{await ts(async({deadline:t})=>{if(t?.isExpired())throw new eD("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:18e4});let i=Math.max(1e3,t?.remainingMs()??18e4),a=await iF(lS(e,["boot",e.id]),{allowFailure:!0,timeoutMs:i});r={stdout:String(a.stdout??""),stderr:String(a.stderr??""),exitCode:a.exitCode};let o=`${r.stdout}
|
|
27
|
+
${r.stderr}`.toLowerCase(),s=o.includes("already booted")||o.includes("current state: booted");if(0!==r.exitCode&&!s)throw new eD("COMMAND_FAILED","simctl boot failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let l=await iF(lS(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:i});if(n={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==n.exitCode)throw new eD("COMMAND_FAILED","simctl bootstatus failed",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode});let d=await mG(e);if("Booted"!==d)throw new eD("COMMAND_FAILED","Simulator is still booting",{state:d})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let t=tr({error:e,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}});return"IOS_BOOT_TIMEOUT"!==t&&"CI_RESOURCE_STARVATION_SUSPECTED"!==t}},{deadline:i,phase:"boot",classifyReason:e=>tr({error:e,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(a){let t=tr({error:a,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}});throw new eD("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:18e4,elapsedMs:i.elapsedMs(),reason:t,hint:ti(t),boot:r,bootstatus:n})}await m$({deviceHub:t.deviceHub})}async function mU(e){let t=lS(e,["shutdown",e.id]),r=await iF(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===r.exitCode,exitCode:r.exitCode,stdout:String(r.stdout??""),stderr:String(r.stderr??"")}}async function mG(e){let t="string"==typeof e?e:e.id,r="string"==typeof e?lv(["list","devices","-j"]):lS(e,["list","devices","-j"]),n=await iF(r,{allowFailure:!0,timeoutMs:6e4});if(0!==n.exitCode)return null;try{let e=JSON.parse(String(n.stdout??""));for(let r of Object.values(e.devices??{})){let e=r.find(e=>e.udid===t);if(e)return e.state}return null}catch{return null}}function mq(e){return"ios"===e.platform&&"simulator"===e.kind}async function mj(e){if(!1===e.booted)return{success:!0,exitCode:0,stdout:"",stderr:""};try{return mq(e)?await mV(e):await mH(e)}catch(t){let e=eN(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function mV(e){let t=await mU(e);return t.success?t:"Shutdown"===await mB(e)?{...t,success:!0,exitCode:0}:t}async function mB(e){try{return await mG(e)}catch{return null}}async function mH(e){let t=await e4(e,["emu","kill"],{allowFailure:!0,timeoutMs:15e3});return{success:0===t.exitCode,exitCode:t.exitCode,stdout:String(t.stdout??""),stderr:String(t.stderr??"")}}let mK=new Map;async function mW(e,t={}){var r;let n,i=(n="simulator"===(r=e).kind?r.simulatorSetPath??"":"",JSON.stringify([r.platform,r.kind,r.id,r.target??"",n])),a=mK.get(i);if(void 0!==a){if(a>Date.now()&&!t.focusExisting)return;mK.delete(i)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:r}=await Promise.resolve(tV);await r(e,{deviceHub:t.deviceHub,focusExisting:t.focusExisting}),mz(i);return}if("device"===e.kind){await mX(e.id),mz(i);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./8806.js");await t(e.id),mz(i)}}function mz(e){mK.set(e,Date.now()+5e3)}async function mX(e){let t=i.join(u.tmpdir(),`agent-device-ready-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),r=Math.max(1,Math.ceil(15));try{let n=await iF(["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 mJ(t);if(0===n.exitCode){if(!o.parsed)throw new eD("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 eD("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 eD("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:mZ(i,a)})}catch(t){if(t instanceof eD&&"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 eD("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:a,stdout:n,stderr:i,hint:n||i?mZ(n,i):o},t)}throw new eD("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,hint:"Reconnect the device, keep it unlocked, and retry."},t instanceof Error?t:void 0)}finally{await s.rm(t,{force:!0}).catch(()=>{})}}async function mJ(e){try{let t=await s.readFile(e,"utf8"),r=JSON.parse(t),n=function(e){let t=e?.result;if(!t||"object"!=typeof t)return{};let r=t.connectionProperties?.tunnelState,n=t.device?.connectionProperties?.tunnelState,i="string"==typeof r?r:"string"==typeof n?n:void 0;return i?{tunnelState:i}:{}}(r);return{parsed:!0,tunnelState:n.tunnelState}}catch{return{parsed:!1}}}function mZ(e,t){let r=px(e,t);return r||(`${e}
|
|
28
|
+
${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":pb)}let mY=300,mQ=300;function m0(e,t,r){return t||no(r,nn)?null:aU("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function m1(e){return"string"==typeof e?.session&&e.session.trim().length>0}async function m2(e,t){mq(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function m3(e){let t=no(e.flags,nn)||!e.session?await r4(e.flags??{}):await m5(e.session.device);return!1!==e.ensureReady&&await mW(t),t}async function m5(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 r4(t)}catch(e){if(!(e instanceof eD)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await r4({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function m4(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 m8(e,t){return!!t&&0===la(t,e).length}async function m6(e){let{device:t,shutdownRequested:r}=e;if(r&&(mq(t)||"android"===t.platform&&"emulator"===t.kind))return await mj(t)}async function m9(e){if(await cX(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=>{ei({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function m7(e){e.applePerf?.active&&(await fc(e.applePerf.active),e.applePerf={...e.applePerf??{},active:void 0})}async function he(e){let t=e.nativePerf?.android;t&&(await fL(e.device,t),e.nativePerf={...e.nativePerf??{},android:void 0})}async function ht(e,t){e.appLog&&await pc(e.appLog),await m7(e),await he(e),eY(e.device.platform)&&await m9(e),await mC(t).catch(()=>{})}async function hr(e){let{req:t,sessionName:r,logPath:n,sessionStore:i}=e,a=i.get(r);if(!a)return await hn(t,n);a.appLog&&await pc(a.appLog),await m7(a),await he(a),t.positionals&&t.positionals.length>0&&(eY(a.device.platform)&&!mq(a.device)&&await m9(a),await it(a.device,"close",t.positionals,t.flags?.out,{...aM(n,t.flags,a.appBundleId,a.trace?.outPath)}),await m2(a.device,mY)),eY(a.device.platform)&&(!mq(a.device)||t.flags?.shutdown||a.recording)?await m9(a):eY(a.device.platform)&&ei({level:"debug",phase:"ios_runner_retained_after_close",data:{session:a.name,deviceId:a.device.id}}),mm(i.getRuntimeHints(r))&&a.appBundleId&&await mw({device:a.device,appId:a.appBundleId}).catch(()=>{}),i.recordAction(a,{command:"close",positionals:t.positionals??[],flags:t.flags??{},result:{session:a.name,...G(`Closed: ${a.name}`)}}),t.flags?.saveScript&&(a.recordSession=!0),i.writeSessionLog(a),await mC(r).catch(()=>{}),i.delete(r);let o=await m6({device:a.device,shutdownRequested:t.flags?.shutdown});return o?{ok:!0,data:D({session:a.name,shutdown:o},`Closed: ${a.name}`)}:{ok:!0,data:{session:a.name,...G(`Closed: ${a.name}`)}}}async function hn(e,t){if(!e.positionals||0===e.positionals.length)return aU("SESSION_NOT_FOUND","No active session");let r=await m3({session:void 0,flags:e.flags,ensureReady:!0});return await it(r,"close",e.positionals,e.flags?.out,{...aM(t,e.flags)}),await m2(r,mY),{ok:!0,data:{app:e.positionals[0],...G(`Closed: ${e.positionals[0]}`)}}}async function hi(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 ha(e){a.existsSync(e)&&a.unlinkSync(e)}function ho(e){if(!a.existsSync(e))return null;try{let t=JSON.parse(a.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function hs(e){let t=ho(e);if(!t||t.pid===process.pid)try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}function hl(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function hd(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 eD("COMMAND_FAILED",t))})})}(async function(e={}){let t,n,o=e.env??process.env,s=e.stdout??process.stdout,l=e.stderr??process.stderr,d=e.exit??(e=>process.exit(e)),{baseDir:c,infoPath:u,lockPath:p,logPath:f,sessionsDir:m}=eU(o.AGENT_DEVICE_STATE_DIR),h=ej(o.AGENT_DEVICE_DAEMON_SERVER_MODE);var w,y,v,S=m;if(a.existsSync(S))for(let e of a.readdirSync(S,{withFileTypes:!0})){if(!e.isDirectory())continue;let t=i.join(S,e.name,t3);if(a.existsSync(t))try{let e=t5(a.readFileSync(t,"utf8"));if(e&&function(e){let t,r=ev(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=eS(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{t8(t)}}let I=new t0(m),A=new rY({maxActiveSimulatorLeases:hl(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:hl(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:hl(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:hl(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),_=t_(),b=r.randomBytes(24).toString("hex"),x=ev(process.pid)??void 0,M=eV(),N=function(e){let{logPath:t,token:r,androidAdbProvider:n,appleRunnerProvider:a,appleToolProvider:o,linuxToolProvider:s,appLogProvider:l,recordingProvider:d,deviceInventoryProvider:c,trackDownloadableArtifact:u}=e,{sessionStore:p,leaseRegistry:f}=e;async function m(e){let n=!!(e.meta?.debug||e.flags?.verbose);return await Q({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:n,logPath:t},async()=>{if(!t6(e.token,r))return uD();try{return await r9(c,async()=>{let t=await uM({req:e,sessionStore:p,leaseRegistry:f});return await h(t)})}catch(e){return uP(e)}})}async function h(e,t){let r=async()=>{let r=function(e){var t,r,n;let a,{scope:o,sessionStore:s,trackDownloadableArtifact:l}=e,d=o.runnerLogPath;o.throwIfCanceled();let c=s.get(o.sessionName);c&&(!function(e){var t;let r;if(!((r=(t=e).recording)&&"ios"===t.device.platform&&"ios"!==r.platform&&!1!==r.showTouches))return;let n=e.recording,i=cK(e.device.id);if(!n.runnerSessionId){i?.alive&&(n.runnerSessionId=i.sessionId);return}if(!i?.alive){n.invalidatedReason??="iOS runner session exited during recording";return}i.sessionId!==n.runnerSessionId&&(n.invalidatedReason??="iOS runner session restarted during recording")}(c),s.set(o.sessionName,c));let u=(a=(t={req:o.req,sessionName:o.sessionName,sessionStore:s}).sessionStore.get(t.sessionName),{req:lf(t.req,a),existingSession:a}),p=u.req;c=u.existingSession;let f=e=>(function(e,t,r){let n=ee();if(!t.ok){ei({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=et({force:!0})??void 0;return{ok:!1,error:eN(new eD(ex(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??("string"==typeof t.error.details?.hint?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath}),{diagnosticId:n.diagnosticId,logPath:e})}}return ei({level:"info",phase:"request_success"}),et(),{ok:!0,data:function(e,t,r){var n,a;let o;if(!t)return t;let s=(n=e,o=Array.isArray((a=t).artifacts)?[...a.artifacts]:[],"screenshot"!==n.command||o.some(e=>e?.field==="path")||"string"!=typeof a.path||o.push({field:"path",path:a.path,localPath:n.meta?.clientArtifactPaths?.path,fileName:i.basename(n.meta?.clientArtifactPaths?.path??a.path)}),o.filter(e=>!!(e&&"string"==typeof e.field&&"string"==typeof e.path&&"string"==typeof e.localPath&&e.localPath.length>0)));return 0===s.length?t:{...t,artifacts:s.map(t=>{let n=t.path;return{field:t.field,artifactId:r({artifactPath:n,tenantId:e.meta?.tenantId,fileName:t.fileName}),fileName:t.fileName,localPath:t.localPath}})}}(e,t.data,r)}})(p,e,l);if(c?.recording?.invalidatedReason&&(r=o.command,np(r)?.allowInvalidRecording!==!0))return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:c.recording.invalidatedReason}})};c&&!p.meta?.lockPolicy&&(n=o.command,np(n)?.selectorValidationExempt!==!0)&&function(e,t){let r=la(e,t);if(0!==r.length)throw new eD("INVALID_ARGS",`Session "${e.name}" is already bound to ${ln(e)}, but this request selected ${r.map(lo).join(", ")}.`,{session:e.name,conflicts:r.map(lo),hint:li(e,"selector-conflict")})}(c,p.flags);let m=(e,t,r)=>{let n;return{...aM(d,e,t,r,n=ee().requestId),requestId:n}};return{type:"scope",scope:{req:p,sessionName:o.sessionName,logPath:d,existingSession:c,finalize:f,contextFromFlags:m,handlerContextFromFlags:(e,t,r)=>({...m(e,t,r),surface:s.get(o.sessionName)?.surface})}}}({scope:e,sessionStore:p,trackDownloadableArtifact:u});if("response"===r.type)return r.response;let c=r.scope,f=async e=>await w({lockedScope:c,providerScope:e,allowReplayActions:void 0===t});return t?await f(t):await nm({req:c.req,existingSession:c.existingSession,providers:{androidAdbProvider:n,appleRunnerProvider:a,appleToolProvider:o,linuxToolProvider:s,appLogProvider:l,recordingProvider:d}},f)};return t?await r():await e.runLocked(r)}async function w(e){var t,n;let{lockedScope:i,providerScope:a,allowReplayActions:o}=e,s=await s1({req:i.req,sessionName:i.sessionName,logPath:i.logPath,sessionStore:p,leaseRegistry:f,invoke:m,invokeReplayAction:o?(t=i,n=a,async e=>{var i,a,o;if(i=e,a=t,i.session!==a.sessionName||(o=i.command,np(o)?.replayScopedAction!==!0))return await m(e);if(!t6(e.token,r))return uD();try{let r=await uM({req:e,sessionStore:p,leaseRegistry:f});return r.sessionName===t.sessionName?await h(r,n):await m(e)}catch(e){return uP(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await uk({lockedScope:i,logPath:i.logPath,sessionStore:p})}return m}({logPath:f,token:b,sessionStore:I,leaseRegistry:A,trackDownloadableArtifact:rp}),D=async e=>{await Q({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{ei({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),et({force:!0})})},k=async e=>{let t=ht(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
|
|
29
|
+
`)});await Promise.race([t,eK(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
|
|
30
|
+
`)})]),I.writeSessionLog(e),I.delete(e.name)},P=async()=>{let e=I.toArray();await Promise.all(e.map(k))},E=async()=>{let e,t,r=[];if("http"!==h){let t,n,i=(t=new Set,(n=g.createServer(e=>{t.add(e),e.on("close",()=>t.delete(e));let r="",n=0,i=new Set,a=!1,o=()=>{if(!a&&0!==n){for(let e of(a=!0,i))ri(e);ei({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(tq);if(await e(),n<=0)break;await eK(200)}}catch(e){ei({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=eT(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=eF(n),a=rr(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),rn(a),ro(a))throw rl();r=await rb(o?t=>{e.destroyed||e.write(eB(t))}:void 0,async()=>await N(n))}catch(e){r={ok:!1,error:eN(e)}}finally{n-=1,a&&(i.delete(a),ra(a))}e.destroyed||e.write(o?eL(r):`${JSON.stringify(r)}
|
|
31
|
+
`)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await hd(i,"Failed to bind socket server")}if("socket"!==h){let e=await rV({handleRequest:N,token:b});r.push(e),t=await hd(e,"Failed to bind HTTP server")}return{servers:r,socketPort:e,httpPort:t}};if(!function(e,t,r){a.existsSync(e)||a.mkdirSync(e,{recursive:!0});let n=JSON.stringify(r,null,2),i=()=>{try{return a.writeFileSync(t,n,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(i())return!0;let o=ho(t);if(o?.pid&&o.pid!==process.pid&&e_(o.pid,o.processStartTime))return!1;try{a.unlinkSync(t)}catch{}return i()}(c,p,{pid:process.pid,version:_,startedAt:Date.now(),processStartTime:x}))return l.write("Daemon lock is held by another process; exiting.\n"),d(0),null;let C=[];try{let e,r=await E();C=r.servers,t=r.socketPort,n=r.httpPort,w=t,y=n,v={socketPort:w,httpPort:y,token:b,version:_,codeSignature:M,processStartTime:x},a.existsSync(c)||a.mkdirSync(c,{recursive:!0}),a.writeFileSync(f,""),e=v.socketPort&&v.httpPort?"dual":v.httpPort?"http":"socket",a.writeFileSync(u,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:c},null,2),{mode:384}),a.chmodSync(u,384),w&&s.write(`AGENT_DEVICE_DAEMON_PORT=${w}
|
|
32
|
+
`),y&&s.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${y}
|
|
33
|
+
`)}catch(t){let e=eM(t);for(let t of(l.write(`Daemon error: ${e.message}
|
|
34
|
+
`),C))try{t.close(()=>{})}catch{}return ha(u),hs(p),d(1),null}es();let R=!1,O=async(e={})=>{if(R)return;R=!0,e.cause&&await D(e.cause),await hi(C),await P();let{stopAllIosRunnerSessions:t}=await Promise.resolve(tq);await t(),await Promise.race([eo().catch(()=>{}),eK(1e3)]),ha(u),hs(p),d(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{O()}),process.on("SIGTERM",()=>{O()}),process.on("SIGHUP",()=>{O()}),process.on("uncaughtException",e=>{let t=e instanceof eD?e:eM(e);l.write(`Daemon error: ${t.message}
|
|
35
|
+
`),O({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof eD?t:eM(t);l.write(`Daemon error: ${r.message}
|
|
36
|
+
`),O({exitCode:1,cause:t})})),{httpPort:n,shutdown:O,socketPort:t,token:b}})().catch(e=>{let t=eM(e);process.stderr.write(`Daemon error: ${t.message}
|
|
37
|
+
`),process.exit(1)});export{f5 as ANDROID_CPU_SAMPLE_DESCRIPTION,f3 as ANDROID_CPU_SAMPLE_METHOD,fI as ANDROID_FRAME_SAMPLE_DESCRIPTION,fS as ANDROID_FRAME_SAMPLE_METHOD,f9 as ANDROID_HPROF_SNAPSHOT_DESCRIPTION,f6 as ANDROID_HPROF_SNAPSHOT_METHOD,f8 as ANDROID_MEMORY_SAMPLE_DESCRIPTION,f4 as ANDROID_MEMORY_SAMPLE_METHOD,pL as APPLE_MEMGRAPH_SNAPSHOT_DESCRIPTION,pT as APPLE_MEMGRAPH_SNAPSHOT_METHOD,pb as IOS_DEVICECTL_DEFAULT_HINT,dk as IOS_RUNNER_CONTAINER_BUNDLE_IDS,mY as IOS_SIMULATOR_POST_CLOSE_SETTLE_MS,mQ as IOS_SIMULATOR_POST_OPEN_SETTLE_MS,n_ as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,nA as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,t0 as SessionStore,lJ as acquireProcessLock,ss as annotateScreenshotWithRefs,pe as withAppLogProvider,pp as appendAppLogMarker,mh as applyRuntimeHintsToApp,pV as buildAppleFrameSamplingMetadata,pH as buildAppleMemorySnapshotSupport,pB as buildAppleSamplingMetadata,nP as buildRunnerSequenceCommand,li as buildSessionRecoveryHint,lv as buildSimctlArgs,lS as buildSimctlArgsForDevice,ol as buildSnapshotState,mt as captureAndroidHeapSnapshot,oI as captureAndroidUiHierarchyXml,pF as captureAppleMemorySnapshot,a6 as captureSnapshot,mE as cleanupRetainedMaterializedPaths,rw as cleanupUploadedArtifact,pf as clearAppLogFiles,ra as clearRequestCanceled,mw as clearRuntimeHintsFromApp,aM as context_contextFromFlags,om as createDaemonRuntimeSessionStore,c7 as createLocalAppleRunnerProvider,rl as createRequestCanceledError,ix as createScopedProvider,it as dispatchCommand,rx as emitRequestProgress,oX as ensureAndroidBlockingSystemDialogReady,mW as ensureDeviceReady,aU as errorResponse,iM as filterAppleAppsByBundlePrefix,aA as getActiveAndroidSnapshotFreshness,pn as getAppLogPathMetadata,rs as getRequestSignal,cK as getRunnerSessionSnapshot,nd as getSessionCommandKind,mG as getSimulatorState,sx as getSnapshotReferenceFrame,hr as handleCloseCommand,mm as hasRuntimeTransportHints,iL as hasScopedAppleToolProvider,tX as inferFillText,ib as isCommandSupportedOnDevice,lu as isImplicitSessionScopeConflict,ab as isNavigationSensitiveAction,ro as isRequestCanceled,r7 as listDeviceInventory,pI as listIosDeviceApps,i6 as runMacOsPressAction,i8 as runMacOsReadTextAction,aI as markAndroidSnapshotFreshness,aN as markPendingInteractionOutcome,aT as markPostGestureStabilization,ri as markRequestCanceled,nE as parseRunnerSequenceResult,uA as prepareIosRunner,rh as prepareUploadedArtifact,uI as prewarmIosRunnerSession,i2 as quitMacOsApp,iU as readApplePlistJson,pM as readInfoPlistString,pa as readSessionNetworkCapture,sD as recordTouchVisualizationEvent,oz as recoverAndroidBlockingSystemDialog,m5 as refreshSessionDeviceIfNeeded,rn as registerRequestAbort,m0 as requireSessionOrExplicitSelector,mL as requireSimulatorDevice,fN as resetAndroidFramePerfStats,m4 as resolveAndroidEmulatorAvdName,ue as resolveAppleRunnerProvider,iO as resolveAppleToolProvider,m3 as resolveCommandDevice,i1 as resolveFrontmostMacOsApp,ld as resolveImplicitSessionScope,px as resolveIosDevicectlHint,lp as resolveLeaseScope,ar as resolveLinuxToolProvider,pi as resolveLogBackend,n9 as resolvePayloadInput,ll as resolvePublicSessionName,rr as resolveRequestTrackingId,dN as resolveRunnerAppBundleId,t2 as resolveSessionRequestLogPath,t1 as resolveSessionRunnerLogPath,op as resolveSnapshotScope,r4 as resolveTargetDevice,mP as retainMaterializedPaths,pu as runAppLogDoctor,i$ as runAppleToolCommand,pS as runIosDevicectl,ai as runLinuxToolCommand,i5 as runMacOsAlertAction,i3 as runMacOsPermissionAction,i9 as runMacOsScreenshotAction,i4 as runMacOsSnapshotAction,lI as runSimctlForDevice,iF as runXcrun,uS as runIosRunnerCommand,ut as withAppleRunnerProvider,cJ as abortAllIosRunnerSessions,cZ as stopAllIosRunnerSessions,f7 as sampleAndroidCpuPerf,fM as sampleAndroidFramePerf,me as sampleAndroidMemoryPerf,pj as sampleAppleFramePerf,p$ as sampleApplePerfMetrics,m8 as selectorTargetsSessionDevice,lc as sessionMatchesScope,m1 as session_device_utils_hasExplicitSessionFlag,of as setSessionSnapshot,m2 as settleIosSimulator,mj as shutdownDeviceTarget,mU as shutdownSimulator,mF as ensureBootedSimulator,oA as snapshotAndroid,ag as snapshotLinux,ay as readLinuxTextAtPoint,fX as startAndroidPerfettoTrace,fY as startAndroidSimpleperfProfile,ps as startAppLog,fl as startAppleXctracePerfCapture,fJ as stopAndroidPerfettoTrace,fQ as stopAndroidSimpleperfProfile,pc as stopAppLog,fd as stopAppleXctracePerfCapture,cX as stopIosRunnerSession,aP as stripInternalInteractionFlags,iT as withAppleToolProvider,an as withLinuxToolProvider,tJ as uniqueStrings,lr as withKeyedLock,f0 as writeAndroidSimpleperfReport,fu as writeAppleXctracePerfReport};
|