agent-device 0.18.2 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.2.apk → agent-device-android-multitouch-helper-0.19.0.apk} +0 -0
  2. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.0.apk.sha256 +1 -0
  3. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.2.manifest.json → agent-device-android-multitouch-helper-0.19.0.manifest.json} +4 -4
  4. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.2.apk → agent-device-android-snapshot-helper-0.19.0.apk} +0 -0
  5. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.0.apk.sha256 +1 -0
  6. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.2.manifest.json → agent-device-android-snapshot-helper-0.19.0.manifest.json} +6 -6
  7. package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +28 -0
  8. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +9 -120
  9. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +132 -66
  10. package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +155 -0
  11. package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +67 -0
  12. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +20 -74
  13. package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +64 -0
  14. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +0 -177
  15. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +81 -48
  16. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +102 -129
  17. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +208 -46
  18. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +82 -11
  19. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +72 -0
  20. package/dist/src/agent-browser-tool.js +1 -0
  21. package/dist/src/android-adb.d.ts +64 -234
  22. package/dist/src/android-adb.js +1 -1
  23. package/dist/src/android.js +1 -5
  24. package/dist/src/app-lifecycle.js +7 -0
  25. package/dist/src/apple-runner-options.js +1 -0
  26. package/dist/src/apps.js +5 -11
  27. package/dist/src/artifacts.d.ts +4 -3
  28. package/dist/src/artifacts.js +1 -1
  29. package/dist/src/audio-probe.js +1 -1
  30. package/dist/src/batch.d.ts +2 -177
  31. package/dist/src/batch.js +1 -1
  32. package/dist/src/cli-help.js +64 -38
  33. package/dist/src/cli-output.js +1 -1
  34. package/dist/src/cli-runner.js +2 -0
  35. package/dist/src/cli.js +12 -41
  36. package/dist/src/client-metro-companion.js +1 -0
  37. package/dist/src/client.js +3 -0
  38. package/dist/src/command-metadata.js +1 -0
  39. package/dist/src/command-schema.js +22 -0
  40. package/dist/src/command-surface.js +1 -1
  41. package/dist/src/contracts.d.ts +2 -213
  42. package/dist/src/contracts.js +1 -1
  43. package/dist/src/debug-symbols.js +5 -3
  44. package/dist/src/device-input-state.js +2 -0
  45. package/dist/src/device-rotation.js +14 -0
  46. package/dist/src/devices.js +1 -1
  47. package/dist/src/devices2.js +1 -0
  48. package/dist/src/devices3.js +1 -0
  49. package/dist/src/find.js +1 -1
  50. package/dist/src/finders.d.ts +2 -81
  51. package/dist/src/finders.js +1 -1
  52. package/dist/src/generic.js +1 -1
  53. package/dist/src/handler-utils.js +1 -1
  54. package/dist/src/helper.js +2 -0
  55. package/dist/src/host-process.js +2 -0
  56. package/dist/src/index.d.ts +1265 -1768
  57. package/dist/src/index.js +1 -1
  58. package/dist/src/input-actions.js +3 -1
  59. package/dist/src/input-actions2.js +1 -0
  60. package/dist/src/install-source.d.ts +13 -14
  61. package/dist/src/install-source.js +1 -1
  62. package/dist/src/install-source2.js +1 -0
  63. package/dist/src/interaction-snapshot.js +1 -0
  64. package/dist/src/interaction.js +1 -1
  65. package/dist/src/interactor.js +2 -1
  66. package/dist/src/internal/bin.d.ts +1 -1
  67. package/dist/src/internal/bin.js +2 -5
  68. package/dist/src/internal/companion-tunnel.d.ts +1 -1
  69. package/dist/src/internal/companion-tunnel.js +1 -1
  70. package/dist/src/internal/daemon.d.ts +1 -1
  71. package/dist/src/internal/daemon.js +16 -1
  72. package/dist/src/internal/png-worker.d.ts +29 -26
  73. package/dist/src/internal/png-worker.js +1 -1
  74. package/dist/src/internal/update-check-entry.d.ts +1 -1
  75. package/dist/src/internal/update-check-entry.js +1 -1
  76. package/dist/src/io.d.ts +2 -85
  77. package/dist/src/io.js +1 -1
  78. package/dist/src/lease.js +1 -1
  79. package/dist/src/linux.js +1 -1
  80. package/dist/src/logcat.js +6 -0
  81. package/dist/src/manifest.js +1 -0
  82. package/dist/src/metro.d.ts +70 -113
  83. package/dist/src/metro.js +1 -1
  84. package/dist/src/metro2.js +1 -0
  85. package/dist/src/notifications.js +1 -1
  86. package/dist/src/output-path.js +1 -0
  87. package/dist/src/path-resolution.js +1 -0
  88. package/dist/src/png-worker-contract.js +1 -0
  89. package/dist/src/points.js +4 -0
  90. package/dist/src/project-runtime.js +1 -0
  91. package/dist/src/provider.js +1 -1
  92. package/dist/src/providers.js +1 -0
  93. package/dist/src/react-native.js +1 -1
  94. package/dist/src/record-trace-recording.js +2 -5
  95. package/dist/src/record-trace.js +1 -1
  96. package/dist/src/recording-provider.js +1 -1
  97. package/dist/src/registry.js +37 -0
  98. package/dist/src/remote-config.d.ts +2 -83
  99. package/dist/src/reporting.js +9 -0
  100. package/dist/src/rolldown-runtime.js +1 -0
  101. package/dist/src/runner-client.js +1 -0
  102. package/dist/src/runner-provider.js +1 -0
  103. package/dist/src/runner-sequence.js +1 -1
  104. package/dist/src/runtime-transport.js +1 -0
  105. package/dist/src/runtime.js +3 -0
  106. package/dist/src/scoped-provider.js +1 -0
  107. package/dist/src/sdk-android-adb.d.ts +144 -0
  108. package/dist/src/sdk-android-adb.js +4 -0
  109. package/dist/src/sdk-app-inventory.d.ts +4 -0
  110. package/dist/src/sdk-app-inventory.js +1 -0
  111. package/dist/src/sdk-batch-runner.d.ts +40 -0
  112. package/dist/src/sdk-batch-runner.js +2 -0
  113. package/dist/src/sdk-batch.js +2 -0
  114. package/dist/src/sdk-contracts.d.ts +386 -0
  115. package/dist/src/sdk-contracts.js +2 -0
  116. package/dist/src/sdk-finders.d.ts +61 -0
  117. package/dist/src/sdk-finders.js +1 -0
  118. package/dist/src/sdk-io.d.ts +79 -0
  119. package/dist/src/sdk-io.js +1 -0
  120. package/dist/src/sdk-remote-config.d.ts +140 -0
  121. package/dist/src/sdk-remote-config.js +1 -0
  122. package/dist/src/sdk-selectors.js +1 -0
  123. package/dist/src/selector-runtime.js +1 -1
  124. package/dist/src/selectors.d.ts +39 -137
  125. package/dist/src/selectors.js +1 -1
  126. package/dist/src/selectors2.js +1 -0
  127. package/dist/src/server.js +3 -2
  128. package/dist/src/session.js +10 -11
  129. package/dist/src/setting-state.js +1 -0
  130. package/dist/src/simctl.js +1 -0
  131. package/dist/src/simulator.js +1 -2
  132. package/dist/src/snapshot-diagnostics.js +3 -0
  133. package/dist/src/snapshot-helper.js +5 -0
  134. package/dist/src/snapshot-quality.js +1 -0
  135. package/dist/src/snapshot.js +1 -2
  136. package/dist/src/snapshot2.js +2 -0
  137. package/dist/src/{5560.js → timeouts.js} +1 -1
  138. package/dist/src/tool-provider.js +3 -0
  139. package/dist/src/tool-provider2.js +1 -0
  140. package/dist/src/ttl-memo.js +1 -0
  141. package/dist/src/update-check.js +1 -0
  142. package/dist/src/url.js +1 -0
  143. package/dist/src/version.js +1 -0
  144. package/dist/src/web.js +1 -1
  145. package/dist/src/xml.js +2 -0
  146. package/package.json +12 -19
  147. package/server.json +2 -2
  148. package/skills/agent-device/SKILL.md +2 -0
  149. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.2.apk.sha256 +0 -1
  150. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.2.apk.sha256 +0 -1
  151. package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +0 -443
  152. package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -169
  153. package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +0 -220
  154. package/dist/src/1404.js +0 -1
  155. package/dist/src/1986.js +0 -1
  156. package/dist/src/2748.js +0 -1
  157. package/dist/src/2948.js +0 -30
  158. package/dist/src/3006.js +0 -1
  159. package/dist/src/314.js +0 -1
  160. package/dist/src/3340.js +0 -8
  161. package/dist/src/4418.js +0 -1
  162. package/dist/src/4428.js +0 -3
  163. package/dist/src/485.js +0 -1
  164. package/dist/src/4917.js +0 -1
  165. package/dist/src/495.js +0 -5
  166. package/dist/src/5448.js +0 -3
  167. package/dist/src/5484.js +0 -1
  168. package/dist/src/5643.js +0 -1
  169. package/dist/src/587.js +0 -1
  170. package/dist/src/5913.js +0 -4
  171. package/dist/src/6849.js +0 -1
  172. package/dist/src/6918.js +0 -1
  173. package/dist/src/6967.js +0 -1
  174. package/dist/src/760.js +0 -1
  175. package/dist/src/7871.js +0 -1
  176. package/dist/src/8184.js +0 -1
  177. package/dist/src/8225.js +0 -1
  178. package/dist/src/8391.js +0 -1
  179. package/dist/src/8404.js +0 -2
  180. package/dist/src/8414.js +0 -2
  181. package/dist/src/8875.js +0 -4
  182. package/dist/src/893.js +0 -1
  183. package/dist/src/8936.js +0 -1
  184. package/dist/src/9414.js +0 -1
  185. package/dist/src/9581.js +0 -22
  186. package/dist/src/9612.js +0 -1
  187. package/dist/src/9624.js +0 -1
  188. package/dist/src/9722.js +0 -38
  189. package/dist/src/devices~1.js +0 -1
  190. package/dist/src/devices~2.js +0 -1
  191. package/dist/src/input-actions~1.js +0 -1
  192. package/dist/src/rslib-runtime.js +0 -1
  193. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +0 -0
  194. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +0 -0
  195. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  196. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
  197. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
  198. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
  199. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +0 -0
  200. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +0 -0
  201. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
  202. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
  203. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +0 -0
  204. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +0 -0
  205. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +0 -0
  206. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
  207. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
  208. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +0 -0
  209. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +0 -0
  210. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
  211. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +0 -0
  212. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
  213. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
  214. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
  215. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
  216. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
package/dist/src/9722.js DELETED
@@ -1,38 +0,0 @@
1
- let e,t;import{__webpack_require__ as r}from"./rslib-runtime.js";import n,{createHash as i}from"node:crypto";import a from"node:path";import o,{existsSync as s,promises as l}from"node:fs";import d from"node:http";import{fileURLToPath as c,pathToFileURL as u}from"node:url";import{AsyncLocalStorage as p}from"node:async_hooks";import{pipeline as f}from"node:stream/promises";import"node:https";import m from"node:os";import{once as h}from"node:events";import{Transform as w}from"node:stream";import v from"node:fs/promises";import y from"node:net";import{setTimeout as g}from"node:timers/promises";import{resolveUserPath as b}from"./9612.js";import{SCREENSHOT_ACTION_FLAG_KEYS as A,SCROLL_DIRECTIONS as S,leaseScopeToHeartbeatRequest as I,parseScrollDirection as _,leaseScopeToReleaseRequest as M,isStringMember as x,leaseScopeFromRequest as N,isReactNativeCollapsedWarningWrapperWithVisibleBanner as D,intersectArea as P,resolveClickButton as k,deriveMobileSnapshotHiddenContentHints as E,inferVerticalScrollIndicatorDirections as C,isScrollableType as R,normalizeScrollDurationMs as O,withSuccessText as T,honoredScrollDurationMs as L,runScrollEdgePasses as F,readViewportDimension as $,findMissingProxyLeaseFields as U,annotateCoveredSnapshotNodes as B,parseSwipePreset as G,analyzeReactNativeOverlay as q,readLocationCoordinate as V,getClickButtonValidationError as j,areRectsApproximatelyEqual as K,isSystemScrollIndicatorLabel as H,formatScrollEdgeMessage as W,isProxyLeaseScope as z,SWIPE_PATTERNS as X,successText as J,assertExclusiveScrollDistanceInputs as Z,screenshotOptionsFromFlags as Y,captureScrollEdgeState as Q,normalizeSnapshotTree as ee,isReactNativeCollapsedWarningWrapperCandidate as et,screenshotFlagsFromOptions as er,snapshotCaptureAnnotationsFrom as en,requireIntInRange as ei,inferGestureReferenceFrame as ea,parseStringMember as eo,parseDeviceRotation as es,buildScrollGesturePlan as el,buildSwipePresetGesturePlan as ed}from"./2948.js";import{runCmdSync as ec,resolveExecutableOverridePath as eu,updateDiagnosticsScope as ep,runCmdStreaming as ef,whichCmd as em,parseBooleanLiteral as eh,withDiagnosticsScope as ew,runCmdBackground as ev,getDiagnosticsMeta as ey,flushDiagnosticsToSessionFile as eg,withDiagnosticTimer as eb,countDiagnosticEventsByPhase as eA,runCmd as eS,emitDiagnostic as eI}from"./8875.js";import{deviceFieldsFromPublicPlatform as e_,resolveAppleSimulatorSetPathForSelector as eM,snapshotPresentationOptionsFromFlags as ex,findNodeByRef as eN,resolveDevice as eD,commandRpcParamsSchema as eP,isTvOsDevice as ek,isMacOs as eE,normalizeRef as eC,publicPlatformString as eR,resolveApplePlatformName as eO,isMobilePlatform as eT,matchesPlatformSelector as eL,isApplePlatform as eF,centerOfRect as e$,isIosFamily as eU,buildSnapshotPresentationKey as eB,attachRefs as eG}from"./6849.js";import{prewarmPngWorker as eq,isKeyboardAction as eV,formatScriptArg as ej,encodePngAsync as eK,decodePngAsync as eH,appendScriptSeriesFlags as eW,terminatePngWorker as ez,formatScriptStringLiteral as eX,formatPortableActionLine as eJ,timingSafeStringEqual as eZ,createAgentDevice as eY,localCommandPolicy as eQ,isTouchTargetCommand as e0,CLOUD_WEBDRIVER_PROVIDERS as e1,isClickLikeCommand as e2,findMistargetedTypeRefToken as e3}from"./7871.js";import{readProcessStartTime as e5,readProcessCommand as e4,isProcessGroupAlive as e6,isAgentDeviceDaemonProcess as e8,isProcessAlive as e9}from"./9414.js";import{retriableForErrorCode as e7,toAppErrorCode as te,asAppError as tt,normalizeError as tr,AppError as tn}from"./485.js";import{consumeTextLines as ti,normalizeTenantId as ta,resolveSessionIsolationMode as to,readScreenshotResultData as ts,shellQuoteIfNeeded as tl,serializeDaemonRpcResponseEnvelope as td,buildDaemonHealthPayload as tc,serializeDaemonResponseEnvelope as tu,shouldStreamRequestProgress as tp,resolveDaemonPaths as tf,resolveDaemonServerMode as tm,readNodeHttpRequestBody as th,recordSnapshotTiming as tw,resolveDaemonCodeSignature as tv,serializeDaemonProgressEnvelope as ty}from"./5913.js";import{sleep as tg}from"./5560.js";import{readVersion as tb,findProjectRoot as tA}from"./1404.js";import{runAndroidAdb as tS,resolveIosSimulatorDeviceSetPath as tI,getAndroidBlockingDialogFocus as t_,withRetry as tM,Deadline as tx,isEnvTruthy as tN,openAndroidApp as tD,classifyBootFailure as tP,streamAndroidLogcatWithAdb as tk,resolveAndroidAdbProvider as tE,installAndroidAdbPackage as tC,bootFailureHint as tR,androidDeviceForSerial as tO,parseSerialAllowlist as tT,retryWithPolicy as tL,getAndroidAppState as tF,captureAndroidLogcatWithAdb as t$,resolveAndroidSerialAllowlist as tU,isDeepLinkTarget as tB,resolveAndroidAdbExecutor as tG}from"./3340.js";import{isRecord as tq,PUBLIC_COMMANDS as tV,GESTURE_SUBCOMMAND_ERROR as tj,stripUndefined as tK,splitNonEmptyTrimmedLines as tH,commandDescriptors as tW,deriveCapabilityMatrix as tz,deriveDaemonCommandDescriptors as tX}from"./1986.js";import{findNearestAncestor as tJ,normalizeType as tZ,pruneGroupNodes as tY,findNodeByLabel as tQ,resolveRefLabel as t0}from"./893.js";import{mapManagedAgentBrowserError as t1,acquireProcessLock as t2,resolveAgentBrowserTool as t3}from"./8391.js";import{applyCommandDefaults as t5}from"./9581.js";var t4,t6,t8={};r.r(t8),r.d(t8,{IH:()=>hL,ug:()=>hF,sE:()=>hN,Bx:()=>hP,hQ:()=>hD,WX:()=>hT,Co:()=>hE,wg:()=>hO,withAppLogProvider:()=>h_});var t9={};r.r(t9),r.d(t9,{bu:()=>pE,abortAllIosRunnerSessions:()=>md,detachIosSimulatorRunnerSessionsForShutdown:()=>mc,hv:()=>mn,Nr:()=>mY,xN:()=>mX,gE:()=>mJ,FS:()=>pP,runAppleRunnerCommand:()=>mz,F8:()=>mo,stopAllIosRunnerSessions:()=>mu,yA:()=>ml});var t7={};r.r(t7),r.d(t7,{v:()=>mM,M:()=>mx,withAppleRunnerProvider:()=>mN});var re={};r.r(re),r.d(re,{qx:()=>oG,Ly:()=>oj,Gr:()=>oU,vT:()=>oq,Cc:()=>oV,withAppleToolProvider:()=>oB});var rt={};r.r(rt),r.d(rt,{IO:()=>o9,LB:()=>o8,xY:()=>se,eN:()=>o7,runMacOsPressAction:()=>sn,runMacOsReadTextAction:()=>sr,rR:()=>si,r5:()=>st,Vi:()=>o4});var rr={};r.r(rr),r.d(rr,{readLinuxTextAtPoint:()=>s_,r:()=>sI});var rn={};function ri(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}r.r(rn),r.d(rn,{uK:()=>sl,nE:()=>sc,withLinuxToolProvider:()=>sd});let ra=["platform","device","udid","serial","out","verbose","metroHost","metroPort","bundleUrl","launchUrl","snapshotInteractiveOnly","snapshotDepth","snapshotScope","snapshotRaw",...A,"relaunch","saveScript","noRecord","fps","quality","hideTouches","count","intervalMs","delayMs","holdMs","jitterPx","doubleTap","clickButton","pauseMs","pattern"];function ro(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 rs(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}class rl{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let r=a.dirname(t);o.existsSync(r)||o.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&&rd(e.command))return e2(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=ro(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(!rd(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=${eR(t.device)} device=${eX(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,e2(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(ej(r)),rc(e,t),eW(e,t),e.join(" ");if(1===t.positionals.length)return e.push(ej(r)),eW(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(ej(r)),rc(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(ej(n)),eW(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(ej(r)),e.push(ej(n)),n.startsWith("@")&&rc(e,t),e.join(" ")}(t,r):void 0);return n||eJ(e)}(e));return`${n.join("\n")}
2
- `}(e);return o.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 b(e.saveScriptPath,{cwd:void 0});o.existsSync(this.sessionsDir)||o.mkdirSync(this.sessionsDir,{recursive:!0});let t=ri(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return a.join(this.sessionsDir,`${t}-${r}.ad`)}}function rd(e){return e0(e)||"fill"===e||"get"===e}function rc(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(ej(r))}class ru{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new rl(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=b(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 ra)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=ri(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return a.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return a.join(this.sessionsDir,ri(e))}ensureSessionDir(e){let t=this.resolveSessionDir(e);return o.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return a.join(this.resolveSessionDir(e),"app.log")}resolveAppLogPidPath(e){return a.join(this.resolveSessionDir(e),"app-log.pid")}static expandHome(e,t){return b(e,{cwd:t})}}function rp(e){return a.join(e,"runner.log")}function rf(e,t){let r=ri(t&&t.length>0?t:"unknown");return a.join(e,"requests",`${r}.ndjson`)}let rm="app-log.pid";function rh(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 rw(e,t){if(!e)return;let r=a.dirname(e);o.existsSync(r)||o.mkdirSync(r,{recursive:!0});let n={pid:t,startTime:e5(t)??void 0,command:e4(t)??void 0};o.writeFileSync(e,`${JSON.stringify(n)}
3
- `)}function rv(e){if(e&&o.existsSync(e))try{o.unlinkSync(e)}catch{}}let ry=new Set,rg=new Map,rb="request_canceled",rA="request canceled";function rS(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 rI(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++}}(rg);let t=new AbortController;rg.set(e,t),ry.has(e)&&t.abort()}function r_(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++}}(ry),ry.add(e),rg.get(e)?.abort())}function rM(e){e&&(ry.delete(e),rg.delete(e))}function rx(e){return!!e&&ry.has(e)}function rN(e){if(e)return rg.get(e)?.signal}function rD(){return new tn("COMMAND_FAILED",rA,{reason:rb})}function rP(e){if(rx(e))throw rD()}function rk(e){return e instanceof tn&&"COMMAND_FAILED"===e.code&&(e.details?.reason===rb||e.message===rA)}let rE=new Map;function rC(e){let t=n.randomUUID(),r=setTimeout(()=>{rR(t)},9e5);return r.unref(),rE.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:r}),t}function rR(e){let t=rE.get(e);if(t&&(clearTimeout(t.timer),rE.delete(e),t.deleteAfterDownload))try{o.rmSync(t.artifactPath,{force:!0})}catch{}}let rO=new Map;function rT(e,t){let r=rO.get(e);if(!r)throw new tn("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new tn("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function rL(e){let t=rO.get(e);t&&(clearTimeout(t.timer),rO.delete(e),o.rmSync(t.tempDir,{recursive:!0,force:!0}))}let rF=new p,r$=new p;async function rU(e,t){return await rF.run(e,t)}function rB(e){rF.getStore()?.(e)}async function rG(e,t){return await r$.run(e,t)}function rq(){return r$.getStore()}function rV(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rj(e,t){e.statusCode=rV(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}async function rK(e){let t=await rH(e);await eS("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=a.join(e.tempDir,t);if(!o.existsSync(r))throw new tn("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function rH(e){let t=await eS("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new tn("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 tn("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(rW),i=e.expectedRootName??function(e,t){let r=new Set;for(let t of e){let[e]=t.split("/");e&&r.add(e)}let n=[...r];if("ios"===t){let e=n.filter(e=>e.toLowerCase().endsWith(".app")),t=e[0];if(void 0!==t&&1===e.length)return t;if(0===e.length)throw new tn("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new tn("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 tn("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 tn("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 tn("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await eS("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new tn("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rW(e){if(e.includes("\0"))throw new tn("INVALID_ARGS",`Invalid archive entry: ${e}`);if(a.posix.isAbsolute(e))throw new tn("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=a.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new tn("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function rz(e){let t=e.trim(),r=a.basename(t);if(!r||"."===r||".."===r)throw new tn("INVALID_ARGS",`Invalid artifact filename: ${e}`);return r}function rX(e){let 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"}(e);return o.mkdtempSync(a.join(m.tmpdir(),`agent-device-artifact-${t}-`))}function rJ(e){if(void 0===e)return;let t=Number(e);if(Number.isFinite(t)&&t>0x80000000)throw new tn("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}function rZ(e,t){return new Promise((r,n)=>{let i,a=!1,s=0,l=o.createWriteStream(t),d=e=>{if(!a){if(a=!0,i&&clearTimeout(i),e)return void rY(l,t).finally(()=>n(e));r()}},c=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new tn("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 w({transform(e,t,r){c();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new tn("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{d(new tn("COMMAND_FAILED","Artifact transfer was interrupted"))}),c(),f(e,u,l).then(()=>d(),e=>d(e))})}async function rY(e,t){if(e.destroy(),!e.closed)try{await h(e,"close")}catch{}await o.promises.rm(t,{force:!0}).catch(()=>{})}let rQ=new Map,r0=new Map;async function r1(e){let t=r4(e.uploadId,e.tenantId),r=r6(t),n=function(e,t){var r,n;let i,a=Array.isArray(e)?e[0]:e;if(!a)return;let o=(i=a.match(/^bytes (\d+)-(\d+)\/(\d+)$/))?{start:Number(i[1]),end:Number(i[2]),size:Number(i[3])}:null;if(!o||(r=o,n=t,!(Number.isSafeInteger(r.start)&&Number.isSafeInteger(r.end)&&Number.isSafeInteger(r.size))||!(r.start>=0)||!(r.end>=r.start)||r.size!==n))throw new tn("INVALID_ARGS","Invalid content-range header");return{start:o.start,end:o.end}}(e.req.headers["content-range"],t.sizeBytes);if(n&&n.start!==r||!n&&r>0)return{complete:!1,offset:r};rJ(e.req.headers["content-length"]),await f(e.req,o.createWriteStream(t.payloadPath,{flags:"a"})),r3(t);let i=r6(t);return{complete:i>=t.sizeBytes,offset:i}}async function r2(e,t){let r=r4(e,t),n=r6(r);if(n!==r.sizeBytes)throw new tn("INVALID_ARGS","Upload is incomplete",{uploadId:e,offset:n,sizeBytes:r.sizeBytes});let i=await r8(r.payloadPath);if(i!==r.sha256)throw r5(r.id),new tn("INVALID_ARGS","Upload hash mismatch",{uploadId:e,expectedSha256:r.sha256,actualSha256:i});if(rQ.delete(r.id),r0.delete(r.key),clearTimeout(r.timer),"file"===r.artifactType){let e=a.join(r.tempDir,r.fileName);return o.renameSync(r.payloadPath,e),{artifactPath:e,tempDir:r.tempDir}}let s=await rK({archivePath:r.payloadPath,tempDir:r.tempDir,platform:"android"===r.platform?"android":"ios",expectedRootName:r.fileName});return o.rmSync(r.payloadPath,{force:!0}),{artifactPath:s,tempDir:r.tempDir}}function r3(e){clearTimeout(e.timer),e.timer=setTimeout(()=>r5(e.id),3e5),e.timer.unref()}function r5(e){let t=rQ.get(e);t&&(clearTimeout(t.timer),rQ.delete(e),r0.delete(t.key),o.rmSync(t.tempDir,{recursive:!0,force:!0}))}function r4(e,t){let r=rQ.get(e);if(!r)throw new tn("INVALID_ARGS",`Upload not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new tn("UNAUTHORIZED","Upload belongs to a different tenant");return r}function r6(e){return o.existsSync(e.payloadPath)?Math.min(o.statSync(e.payloadPath).size,e.sizeBytes):0}async function r8(e){let t=n.createHash("sha256");return await f(o.createReadStream(e),async function*(e){for await(let r of e)t.update(r),yield r}),t.digest("hex")}async function r9(e){let t=e.headers["x-artifact-type"],r=e.headers["x-artifact-filename"];if(!t||!r)throw new tn("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==t&&"app-bundle"!==t)throw new tn("INVALID_ARGS",`Invalid x-artifact-type: ${t}. Must be "file" or "app-bundle".`);rJ(e.headers["content-length"]);let n=rz(r),i=rX("upload");try{if("file"===t){let t=a.join(i,n);return await rZ(e,t),{artifactPath:t,tempDir:i}}let r=a.join(i,"artifact.tar");await rZ(e,r);let s=await rK({archivePath:r,tempDir:i,platform:"ios",expectedRootName:n});return o.rmSync(r,{force:!0}),{artifactPath:s,tempDir:i}}catch(e){throw o.rmSync(i,{recursive:!0,force:!0}),e}}let r7="/upload/direct/";async function ne(e,t,r,n,i){switch(e.kind){case"preflight":await nr(t,r,n,i);return;case"direct":await nn(e.uploadId,t,r,n);return;case"finalize":await ni(t,r,n);return;case"upload":await nt(t,r,n);return}}async function nt(e,t,r){try{let n=await r({req:e,res:t,daemonRequest:{command:"upload",positionals:[]}});if(!n)return;no(t,await r9(e),n.tenantId)}catch(e){rj(t,tr(e))}}async function nr(e,t,r,i){try{var o,s,l,d,c,u,p;let f,m,h,w,v,y,g=await r({req:e,res:t,daemonRequest:{command:"upload",positionals:["preflight"]}});if(!g)return;let b=(s=await ns(e,65536),{sha256:nl(s,"sha256"),uploadAttemptId:nl(s,"uploadAttemptId"),fileName:nl(s,"fileName"),sizeBytes:function(e,t){let r=e[t];if("number"!=typeof r||!Number.isSafeInteger(r))throw new tn("INVALID_ARGS",`${t} must be an integer`);return r}(s,"sizeBytes"),artifactType:function(e){let t=nl(e,"artifactType");if("file"===t||"app-bundle"===t)return t;throw new tn("INVALID_ARGS",'artifactType must be "file" or "app-bundle"')}(s),platform:nd(s,"platform"),contentType:nd(s,"contentType")}),A=(o={baseUrl:function(e){let t="string"==typeof e.headers.host?e.headers.host:"";if(!t)throw new tn("INVALID_ARGS","Missing host header");let r=e.headers["x-forwarded-proto"],n=Array.isArray(r)?r[0]:r;return`${n||"http"}://${t}`}(e),tokenHeaders:(l=i,{authorization:`Bearer ${l}`,"x-agent-device-token":l}),...b,tenantId:g.tenantId},function(e){if(!/^[a-f0-9]{64}$/i.test(e.sha256))throw new tn("INVALID_ARGS","Invalid upload sha256");if(!Number.isSafeInteger(e.sizeBytes)||e.sizeBytes<0)throw new tn("INVALID_ARGS","Invalid upload sizeBytes");if(rJ(String(e.sizeBytes)),rz(e.fileName),!e.uploadAttemptId.trim())throw new tn("INVALID_ARGS","uploadAttemptId is required")}(o),w=[(d=o).tenantId??"",d.uploadAttemptId,d.sha256.toLowerCase(),String(d.sizeBytes),rz(d.fileName),d.artifactType,d.platform??""].join("\0"),y=((v=r0.get(w))?rQ.get(v):void 0)??(c=o,u=w,f=n.randomUUID(),m=rX("upload"),(h={id:f,key:u,tempDir:m,payloadPath:a.join(m,"payload"),fileName:rz(c.fileName),sizeBytes:c.sizeBytes,sha256:c.sha256.toLowerCase(),artifactType:c.artifactType,platform:c.platform,tenantId:c.tenantId,timer:setTimeout(()=>r5(f),3e5)}).timer.unref(),rQ.set(f,h),r0.set(u,f),h),r3(y),{uploadId:y.id,cacheHit:!1,upload:{url:new URL(`upload/direct/${y.id}`,(p=o.baseUrl).endsWith("/")?p:`${p}/`).toString(),headers:{...o.tokenHeaders,"content-type":o.contentType||"application/octet-stream"}}});na(t,{ok:!0,...A})}catch(e){rj(t,tr(e))}}async function nn(e,t,r,n){try{let i=await n({req:t,res:r,daemonRequest:{command:"upload",positionals:["direct",e]}});if(!i)return;let a=await r1({uploadId:e,req:t,tenantId:i.tenantId});if(a.complete){r.statusCode=200,r.end("ok");return}r.statusCode=308,a.offset>0&&r.setHeader("range",`bytes=0-${a.offset-1}`),r.setHeader("x-upload-offset",String(a.offset)),r.end()}catch(e){rj(r,tr(e))}}async function ni(e,t,r){try{var n;let i=await r({req:e,res:t,daemonRequest:{command:"upload",positionals:["finalize"]}});if(!i)return;let a=(n=await ns(e,65536),{uploadId:nl(n,"uploadId")});no(t,await r2(a.uploadId,i.tenantId),i.tenantId)}catch(e){rj(t,tr(e))}}function na(e,t){e.statusCode=200,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function no(e,t,r){var i;let a,o;na(e,{ok:!0,uploadId:(i={artifactPath:t.artifactPath,tempDir:t.tempDir,tenantId:r},a=n.randomUUID(),(o=setTimeout(()=>{rL(a)},3e5)).unref(),rO.set(a,{artifactPath:i.artifactPath,tempDir:i.tempDir,tenantId:i.tenantId,timer:o}),a)})}async function ns(e,t){let r=(await th(e,t,"Request body is too large.")).toString("utf8");try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("expected object");return e}catch(e){throw new tn("INVALID_ARGS","Invalid JSON request body",{},e)}}function nl(e,t){let r=nd(e,t)?.trim();if(!r)throw new tn("INVALID_ARGS",`${t} is required`);return r}function nd(e,t){let r=e[t];return"string"==typeof r?r:void 0}let nc=new Set(["replay","test"]),nu=new Set(["agent_device.command","agent-device.command"]),np=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),nf=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"},nh=new Set([...nu,...np,...nf,...Object.keys(nm)]);function nw(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function nv(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function ny(e,t){e.destroyed||(e.write(td(t)),e.end())}function ng(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 nb(e,t){let r=e[t];return"string"==typeof r?r:void 0}function nA(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function nS(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new tn("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function nI(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new tn("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function n_(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=tr(new tn("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:nw(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=tr(new tn(te(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:nw(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=ta(r.tenantId);if(!e){let e=tr(new tn("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:nw(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function nM(){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=a.isAbsolute(t)?t:a.resolve(t);try{e=await import(u(n).href)}catch(e){throw new tn("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:n,error:e instanceof Error?e.message:String(e)})}let i=e[r];if("function"!=typeof i)throw new tn("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:n,exportName:r});return i}async function nx(e){let t=await nM(),{handleRequest:r,token:n}=e;return d.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify(tc("agent-device-daemon")));return}if(function(e){var t;let{req:r,res:n,authorize:i,token:a}=e,o="POST"===(t=r).method&&"/upload/preflight"===t.url?{kind:"preflight"}:"PUT"===t.method&&t.url?.startsWith(r7)?{kind:"direct",uploadId:t.url.slice(r7.length).replace(/\?.*$/,"")}:"POST"===t.method&&"/upload/finalize"===t.url?{kind:"finalize"}:"POST"===t.method&&"/upload"===t.url?{kind:"upload"}:null;return null!==o&&(ne(o,r,n,i,a),!0)}({req:e,res:i,token:ng({},e.headers),authorize:async e=>await nP({req:e.req,res:e.res,authHook:t,expectedToken:n,daemonRequest:e.daemonRequest})}))return;if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void nN(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||nv(i,nw(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{nv(i,nw(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void nv(i,nw(n.id??null,-32600,"Invalid Request"),400);if(!nh.has(n.method))return void nv(i,nw(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void nv(i,nw(n.id??null,-32602,"Invalid params"),400);let s=!1;try{var l,d;let a=n.params,c=function(e,t,r){if(nu.has(e))return n=function(e){try{return eP.parse(e)}catch(t){let e=t instanceof Error?function(e){let t=e.indexOf(": ");if(-1===t||!e.startsWith("$"))return e;let r=e.slice(0,t).replace(/^\$\.?/,""),n=e.slice(t+2);return r?`${r}: ${n}`:n}(t.message):"invalid command params";throw new tn("INVALID_ARGS",`Invalid params: ${e}`)}}(t),{token:ng(n,r),session:n.session??"default",command:n.command??"",positionals:n.positionals??[],flags:n.flags,runtime:n.runtime,meta:n.meta};if(np.has(e)){var n;let e,i=nb(t,"platform");if("ios"!==i&&"android"!==i)throw new tn("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:ng(t,r),session:nb(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:i},meta:{requestId:nb(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new tn("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new tn("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 tn("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 tn("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 tn("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=nS(e,"owner"),n=nS(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new tn("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new tn("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new tn("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:nI(e,"artifactId")}:(a&&(t=nI(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:nS(e,"artifactName")})}(t);throw new tn("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:nA(t,"retentionMs")}}}if(nf.has(e)){let e=nb(t,"materializationId")?.trim();if(!e)throw new tn("INVALID_ARGS","Invalid params: materializationId is required");return{token:ng(t,r),session:nb(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:nb(t,"requestId"),materializationId:e}}}let i=nm[e];if(i)return{token:ng(t,r),session:nb(t,"session")??"default",command:i,positionals:[],meta:{tenantId:nb(t,"tenantId")??nb(t,"tenant"),runId:nb(t,"runId"),leaseId:nb(t,"leaseId"),leaseTtlMs:nA(t,"ttlMs"),leaseBackend:nb(t,"backend"),leaseProvider:nb(t,"leaseProvider")??nb(t,"provider"),deviceKey:nb(t,"deviceKey"),clientId:nb(t,"clientId")}};throw new tn("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(l=n.method,nu.has(l)&&("string"!=typeof c.command||0===c.command.length))return void nv(i,nw(n.id??null,-32602,"Invalid params: command is required"),400);o=rS(c.meta?.requestId,n.id),c.meta={...c.meta,requestId:o},rI(o);let u=await n_(t,{headers:e.headers,rpcRequest:n,daemonRequest:c});if(!u.ok)return void nv(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"||nc.has(d.command))),f=!1,m=()=>{s||i.writableFinished||f||(f=!0,r_(o),eI({level:"warn",phase:"request_client_disconnected",data:{requestId:o,abortIosRunnerSessions:p}}),p&&nD(o))};if(e.on("aborted",m),i.on("close",()=>{i.headersSent&&m()}),(e.aborted||i.destroyed&&i.headersSent)&&m(),tp(c)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await rU(e=>{!i.destroyed&&i.write(ty(e))},async()=>await r(c));s=!0;let t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:nw(n.id??null,-32e3,e.error.message,e.error);ny(i,t);return}let h=await r(c);if(s=!0,h.ok)return void nv(i,{jsonrpc:"2.0",id:n.id??null,result:h});nv(i,nw(n.id??null,-32e3,h.error.message,h.error),rV(h.error.code))}catch(r){s=!0;let e=tr(r),t="INVALID_ARGS"===e.code?-32602:-32e3;if(i.headersSent)return void ny(i,nw(n.id??null,t,e.message,e));nv(i,nw(n.id??null,t,e.message,e),rV(e.code))}finally{rM(o)}})})}async function nN(e,t,r,n){let i=e.url?.slice("/artifacts/".length)??"";if(!i){t.statusCode=400,t.end("Missing artifact id");return}try{let a=await nP({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[i]}});if(!a)return;let s=function(e,t){let r=rE.get(e);if(!r)throw new tn("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new tn("UNAUTHORIZED","Artifact belongs to a different tenant");if(!o.existsSync(r.artifactPath))throw rR(e),new tn("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(i,a.tenantId),l=o.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=tr(e);t.statusCode=rV(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rR(i)}),l.pipe(t)}catch(e){rj(t,tr(e))}}async function nD(e){try{let t=Date.now()+15e3;for(;rx(e)&&Date.now()<t;){let{abortAllIosRunnerSessions:t}=await Promise.resolve(t9);if(await t(),!rx(e))break;await tg(200)}}catch(e){eI({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e)}})}}async function nP(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=ng({},n.headers),d=(t=l,!(r=o)||eZ(t,r)?null:tr(new tn("UNAUTHORIZED","Invalid token")));if(d)return rj(i,d),null;let c=await n_(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 nk(e){return{provider:e.provider,providerSessionId:e.providerSessionId,status:e.artifacts.length>0?"ready":"pending",cloudArtifacts:e.artifacts,...e.artifacts.length>0?{}:{message:e.pendingMessage}}}let nE={support:"supported"},nC={support:"unsupported"},nR={lease:nE,inventory:{support:"partial",note:"Inventory exposes only the leased cloud device, not the provider catalog."},install:{support:"partial",note:"Requires provider-specific upload or a path visible to the remote Appium server."},open:nE,close:nE,snapshot:{support:"partial",note:"Uses Appium page source XML, not agent-device native snapshot backends."},screenshot:nE,tap:nE,doubleTap:nE,longPress:nE,swipe:nE,scroll:{support:"partial",note:"Implemented as viewport-relative W3C pointer gestures."},fill:nE,type:nE,back:nE,home:{support:"partial",note:"Uses provider/Appium mobile pressButton support where available."},rotate:{support:"partial",note:"Uses provider/Appium mobile rotate support where available."},appSwitcher:{support:"partial",note:"Uses provider/Appium mobile pressButton support where available."},"clipboard.read":{support:"partial",note:"Uses provider/Appium clipboard extension support where available."},"clipboard.write":{support:"partial",note:"Uses provider/Appium clipboard extension support where available."},settings:nC,pinch:nC,rotateGesture:nC,transformGesture:nC,logs:nC,record:nC,artifacts:nC,portReverse:nC,nativeSnapshotBackend:{support:"unsupported",note:"Cloud WebDriver cannot upload or run agent-device native runner/helper backends."}};function nO(e){return{provider:e.provider,platform:e.platform,snapshotBackend:"ios"===e.platform?"xctest":"android",snapshotSource:"appium-page-source",operations:function(e,t){let r={...e};for(let[n,i]of Object.entries(t??{}))r[n]="string"==typeof i?{...e[n],support:i}:{...e[n],...i};return r}(nR,e.overrides)}}function nT(e,t){return"unsupported"!==e.operations[t].support}function nL(e,t){let r=e.operations[t],n=r.note?` ${r.note}`:"";return`${e.provider} WebDriver runtime does not support ${t}.${n}`}function nF(){return{"x-agent-device-client":"agent-device-cli","x-agent-device-version":tb()}}function n$(e){return`Basic ${Buffer.from(`${e.username}:${e.accessKey}`).toString("base64")}`}class nU{endpoint;headers;requestPolicy;sessionId;constructor(e){this.endpoint=function(e){if(e.pathname.endsWith("/"))return e;let t=new URL(e);return t.pathname=`${t.pathname}/`,t}(new URL(e.endpoint)),this.headers={...nF(),...e.auth?{Authorization:n$(e.auth)}:{},...e.headers},this.requestPolicy={timeoutMs:e.requestPolicy?.timeoutMs??3e4,retryAttempts:e.requestPolicy?.retryAttempts??1,retryDelayMs:e.requestPolicy?.retryDelayMs??250}}async createSession(e){var t;let r=function(e){if(!e||"object"!=typeof e)throw new tn("COMMAND_FAILED","WebDriver create-session response was empty.");let t="string"==typeof e.sessionId?e.sessionId:"string"==typeof e.session_id?e.session_id:void 0;if(!t)throw new tn("COMMAND_FAILED","WebDriver create-session response missed sessionId.",{response:e});return{sessionId:t,capabilities:e.capabilities&&"object"==typeof e.capabilities?e.capabilities:{}}}(await this.requestValue("POST","/session",{capabilities:"alwaysMatch"in(t=e)||"firstMatch"in t?t:{alwaysMatch:t}}));return this.sessionId=r.sessionId,r}async deleteSession(){let e=this.requireSessionId();await this.requestValue("DELETE",`/session/${e}`),this.sessionId=void 0}async installApp(e){await this.sessionRequest("POST","/appium/device/install_app",{appPath:e})}async activateApp(e){try{await this.sessionRequest("POST","/appium/device/activate_app",{appId:e})}catch{await this.executeScript("mobile: activateApp",[{appId:e,bundleId:e}])}}async terminateApp(e){try{await this.sessionRequest("POST","/appium/device/terminate_app",{appId:e})}catch{await this.executeScript("mobile: terminateApp",[{appId:e,bundleId:e}])}}async performActions(e){await this.sessionRequest("POST","/actions",{actions:e})}async releaseActions(){await this.sessionRequest("DELETE","/actions",void 0,{retryAttempts:0})}async sendKeys(e){await this.sessionRequest("POST","/keys",{value:Array.from(e)})}async hideKeyboard(){await this.sessionRequest("POST","/appium/device/hide_keyboard",void 0,{retryAttempts:0})}async back(){await this.sessionRequest("POST","/back")}async source(){let e=await this.sessionRequest("GET","/source");if("string"!=typeof e)throw new tn("COMMAND_FAILED","WebDriver source response was not a string",{valueType:typeof e});return e}async screenshot(e){let t=await this.sessionRequest("GET","/screenshot");if("string"!=typeof t)throw new tn("COMMAND_FAILED","WebDriver screenshot response was not base64 text",{valueType:typeof t});await v.writeFile(e,Buffer.from(t,"base64"))}async windowRect(){var e=await this.sessionRequest("GET","/window/rect");if(!e||"object"!=typeof e)throw new tn("COMMAND_FAILED","WebDriver window rect response was empty.");let t={x:nB(e,"x"),y:nB(e,"y"),width:nB(e,"width"),height:nB(e,"height")};if(void 0===t.x||void 0===t.y||void 0===t.width||void 0===t.height)throw new tn("COMMAND_FAILED","WebDriver window rect response was invalid.",{response:e});return t}async executeScript(e,t=[]){return await this.sessionRequest("POST","/execute/sync",{script:e,args:t})}async sessionRequest(e,t,r,n){let i=this.requireSessionId();return await this.requestValue(e,`/session/${i}${t}`,r,n)}requireSessionId(){if(!this.sessionId)throw new tn("SESSION_NOT_FOUND","WebDriver session has not been created yet.");return this.sessionId}async requestValue(e,t,r,n){let i,a=n?.retryAttempts??this.requestPolicy.retryAttempts;for(let n=0;n<=a;n+=1)try{return await this.requestValueOnce(e,t,r)}catch(e){if(i=e,!function(e){if(e instanceof tn){let t=e.details?.status;return"number"==typeof t&&t>=500}return e instanceof TypeError||e instanceof Error&&"TimeoutError"===e.name}(e)||n>=a)throw e;await tg(this.requestPolicy.retryDelayMs)}throw i}async requestValueOnce(e,t,r){var n,i,a;let o=await fetch(new URL(function(e){let t=0;for(;t<e.length&&47===e.charCodeAt(t);)t+=1;return 0===t?e:e.slice(t)}(t),this.endpoint),{method:e,headers:{Accept:"application/json",...void 0===r?{}:{"Content-Type":"application/json"},...this.headers},body:void 0===r?void 0:JSON.stringify(r),signal:AbortSignal.timeout(this.requestPolicy.timeoutMs)}),s=await o.text(),l=s?function(e){try{return JSON.parse(e)}catch(t){throw new tn("COMMAND_FAILED","WebDriver response was not valid JSON.",{text:e},t)}}(s):{};if(!o.ok){let e;throw n=o.status,new tn("COMMAND_FAILED",(e=(i=l)&&"object"==typeof i&&"value"in i?i.value:i)&&"object"==typeof e&&"string"==typeof e.message?e.message:`WebDriver request failed with HTTP ${n}.`,{status:n,response:i})}return(a=l)&&"object"==typeof a&&"value"in a?a.value:a}}function nB(e,t){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:void 0}function nG(e){if(!e)return;let t=/\[(-?\d+),(-?\d+)\]\[(-?\d+),(-?\d+)\]/.exec(e);if(!t)return;let r=Number(t[1]),n=Number(t[2]);return{x:r,y:n,width:Math.max(0,Number(t[3])-r),height:Math.max(0,Number(t[4])-n)}}let nq=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),nV=new Set([" "," ","\n","\r"]),nj=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function nK(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new nW(e).parse()}function nH(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)}nH(r.children,t)}}class nW{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(nj.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?nz(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])&&nq.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,nz(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])&&nV.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function nz(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}}})}function nX(e){let t=nK(e),r=[];for(let e of t)!function e(t,r,n,i=0){let a=0===Object.keys(r.attributes).length?n:function(e,t,r,n){let i=e.length;return e.push(function(e,t,r,n,i){var a;let o=function(e){let t=nG(e.bounds??null);if(t)return t;let r=nQ(e.x),n=nQ(e.y),i=nQ(e.width),a=nQ(e.height);if(void 0!==r&&void 0!==n&&void 0!==i&&void 0!==a)return{x:r,y:n,width:i,height:a}}(r),s=nY(r.enabled,!0),l=nY(r.displayed??r.visible,!0);return{index:e,type:t,role:(a=t,nZ(r.class)??nZ(a.replace(/^XCUIElementType/,"").toLowerCase())),label:nJ(r,["content-desc","label","text","name"]),value:nZ(r.value),identifier:nJ(r,["resource-id","id","accessibility-id","name"]),rect:o,enabled:s,selected:nY(r.selected),focused:nY(r.focused),visibleToUser:l,hittable:l&&s&&void 0!==o&&o.width>0&&o.height>0,depth:i,parentIndex:n}}(i,t.name,t.attributes,r,n)),i}(t,r,n,i),o=a===n?i:i+1;for(let n of r.children)e(t,n,a,o)}(r,e);return r}function nJ(e,t){for(let r of t){let t=nZ(e[r]);if(void 0!==t)return t}}function nZ(e){return e||void 0}function nY(e,t=!1){return void 0===e?t:"true"===e||"1"===e}function nQ(e){if(void 0===e||""===e)return;let t=Number(e);return Number.isFinite(t)?t:void 0}class n0{client;backend;capabilities;constructor(e,t,r){this.client=e,this.backend=t,this.capabilities=r}async open(e,t){if(this.requireSupport("open"),t?.url)return void await this.client.executeScript("mobile: deepLink",[{url:t.url,package:e}]);let r=t?.appBundleId??e;r&&await this.client.activateApp(r)}async openDevice(){this.requireSupport("open"),await this.client.executeScript("mobile: activateApp",[{}])}async close(e){this.requireSupport("close"),e&&await this.client.terminateApp(e)}async tap(e,t){return this.requireSupport("tap"),await this.pointerGesture("tap",[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pointerUp",button:0}]),{backend:"webdriver",x:e,y:t}}async doubleTap(e,t){return this.requireSupport("doubleTap"),await this.pointerGesture("doubleTap",[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pointerUp",button:0},{type:"pause",duration:80},{type:"pointerDown",button:0},{type:"pointerUp",button:0}]),{backend:"webdriver",x:e,y:t}}async swipe(e,t,r,n,i=400){return this.requireSupport("swipe"),await this.pointerGesture("swipe",[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pointerMove",duration:i,x:r,y:n},{type:"pointerUp",button:0}]),{backend:"webdriver",x1:e,y1:t,x2:r,y2:n,durationMs:i}}async pan(e,t,r,n,i){return await this.swipe(e,t,r,n,i)}async fling(e,t,r,n,i=150){return await this.swipe(e,t,r,n,i)}async longPress(e,t,r=600){return this.requireSupport("longPress"),await this.pointerGesture("longPress",[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pause",duration:r},{type:"pointerUp",button:0}]),{backend:"webdriver",x:e,y:t,durationMs:r}}async focus(e,t){return await this.tap(e,t)}async type(e){this.requireSupport("type"),await this.client.sendKeys(e)}async fill(e,t,r,n){return this.requireSupport("fill"),await this.tap(e,t),await this.type(r),{backend:"webdriver",x:e,y:t,text:r}}async scroll(e,t){this.requireSupport("scroll");let r=t?.durationMs??350;await this.client.hideKeyboard().catch(()=>void 0);let n=await this.scrollGestureFrame(),i=el({direction:e,amount:t?.amount,pixels:t?.pixels,referenceWidth:n.width,referenceHeight:n.height}),a={...i,x1:i.x1+n.x,y1:i.y1+n.y,x2:i.x2+n.x,y2:i.y2+n.y};return await this.swipe(a.x1,a.y1,a.x2,a.y2,r),{backend:"webdriver",...a,distance:i.pixels,durationMs:r}}async pinch(e,t,r){this.unsupported("pinch")}async screenshot(e,t){this.requireSupport("screenshot"),await this.client.screenshot(e)}async snapshot(e){return this.requireSupport("snapshot"),{backend:this.backend,nodes:nX(await this.client.source())}}async back(e){this.requireSupport("back"),await this.client.back()}async home(){this.requireSupport("home"),await this.client.executeScript("mobile: pressButton",[{name:"home"}])}async rotate(e){this.requireSupport("rotate"),await this.client.executeScript("mobile: rotate",[{orientation:e}])}async rotateGesture(e,t,r,n){this.unsupported("rotateGesture")}async transformGesture(e){this.unsupported("transformGesture")}async appSwitcher(){this.requireSupport("appSwitcher"),await this.client.executeScript("mobile: pressButton",[{name:"appSwitch"}])}async readClipboard(){this.requireSupport("clipboard.read");let e=await this.client.executeScript("mobile: getClipboard",[{}]);return"string"==typeof e?e:""}async writeClipboard(e){this.requireSupport("clipboard.write"),await this.client.executeScript("mobile: setClipboard",[{content:e}])}async setSetting(e,t,r,n){this.unsupported("settings")}async pointerGesture(e,t){await this.client.performActions([{type:"pointer",id:e,parameters:{pointerType:"touch"},actions:t}]),await this.client.releaseActions().catch(()=>void 0)}async scrollGestureFrame(){let e=await this.client.source().then(e=>{let t;return(t=nX(e).flatMap(e=>{var t,r;let n;return(t=e,n=t.type?.toLowerCase()??"",!1!==t.visibleToUser&&(n.includes("scrollview")||n.includes("listview")||n.includes("recyclerview"))&&(r=e.rect)&&r.width>=50&&r.height>=50)?[e.rect]:[]}).sort((e,t)=>t.width*t.height-e.width*e.height)[0])?{x:t.x,y:t.y,width:t.width,height:t.height}:void 0}).catch(()=>void 0);return e||await this.client.windowRect()}requireSupport(e){nT(this.capabilities,e)||this.unsupported(e)}unsupported(e){throw new tn("UNSUPPORTED_OPERATION",nL(this.capabilities,e),{provider:this.capabilities.provider,platform:this.capabilities.platform,operation:e})}}function n1(e,t,r={}){return{platformName:"ios"===e?"iOS":"Android","appium:deviceName":t,...r}}class n2{provider;leaseLifecycle;cloudArtifacts;deviceInventoryProvider;capabilities;sessionsByLeaseId=new Map;releasedProviderSessionIdsByLeaseId=new Map;options;constructor(e){this.options=e,this.provider=e.provider,this.capabilities=nO({provider:e.provider,platform:e.platform,overrides:e.capabilityOverrides}),this.leaseLifecycle={allocate:async(e,t)=>await this.allocate(e,t?.req),heartbeat:async e=>this.heartbeat(e),release:async e=>await this.release(e)},this.cloudArtifacts={listCloudArtifacts:async e=>await this.listCloudArtifacts(e)},this.deviceInventoryProvider=async e=>{if(e.leaseProvider!==this.provider)return null;if(!e.leaseId)return[];let t=this.sessionsByLeaseId.get(e.leaseId);return t?[t.device]:[]}}ownsDevice(e){return[...this.sessionsByLeaseId.values()].some(t=>t.device.id===e.id)}getInteractor(e){return[...this.sessionsByLeaseId.values()].find(t=>t.device.id===e.id)?.interactor}async installApp(e,t,r,n){let i,a,o=this.findSessionForDevice(e);if(!o)return;let s=await this.uploadAppIfNeeded(o,e,t,r,n);return await o.client.installApp(s?.appReference??r),i=s?.bundleId??n?.appIdentifierHint,{bundleId:i,packageName:a=s?.packageName??n?.packageNameHint,appName:s?.appName,launchTarget:function(...e){return e.find(e=>void 0!==e)}(s?.launchTarget,i,a)}}async installInstallablePath(e,t,r){return await this.installApp(e,"",t,r)}async shutdown(){await Promise.allSettled([...this.sessionsByLeaseId.values()].map(async e=>await this.closeSession(e))),this.sessionsByLeaseId.clear()}async allocate(e,t){var r;if(e.leaseProvider!==this.provider)return;if(this.sessionsByLeaseId.has(e.leaseId))return this.heartbeat(e);let n=await this.prepareSession(e,t),i=new nU({endpoint:n.endpoint,auth:n.auth,headers:n.headers,requestPolicy:this.options.requestPolicy}),a=await this.createSessionWithPreparedCleanup(i,n),o=this.deviceForLease(e,n),s=n.providerSessionId??a.sessionId,l=this.capabilitiesForPlatform(n.platform);return this.sessionsByLeaseId.set(e.leaseId,{lease:e,device:o,client:i,prepared:n,capabilities:l,webDriverSessionId:a.sessionId,providerSessionId:s,interactor:new n0((r={client:i,backend:"ios"===n.platform?"xctest":"android",capabilities:l}).client,r.backend,r.capabilities)}),{provider:this.provider,deviceId:o.id,sessionId:a.sessionId,providerSessionId:s,capabilities:l,...n.providerData}}async createSessionWithPreparedCleanup(e,t){try{return await e.createSession(t.webdriverCapabilities)}catch(e){throw await n5(t,e),e}}heartbeat(e){if(e.leaseProvider===this.provider&&this.sessionsByLeaseId.has(e.leaseId))return{provider:this.provider}}async release(e){if(e.leaseProvider!==this.provider)return;let t=this.sessionsByLeaseId.get(e.leaseId);if(!t)return;this.sessionsByLeaseId.delete(e.leaseId),this.releasedProviderSessionIdsByLeaseId.set(e.leaseId,t.providerSessionId);let r=await this.closeSession(t),n=await this.safeListArtifacts(t);return{provider:this.provider,providerSessionId:t.providerSessionId,...r.cleanup,...r.warnings.length>0?{warnings:r.warnings}:{},...n?{cloudArtifacts:n}:{}}}async listCloudArtifacts(e){if(e.provider!==this.provider)return;let t=e.leaseId?this.sessionsByLeaseId.get(e.leaseId):void 0;if(t)return await this.safeListArtifacts(t);let r=e.providerSessionId??(e.leaseId?this.releasedProviderSessionIdsByLeaseId.get(e.leaseId):void 0);if(r&&this.options.listArtifacts)return await this.options.listArtifacts({provider:this.provider,providerSessionId:r})}async prepareSession(e,t){let r=this.baseSessionForLease(e);return this.options.prepareSession?await this.options.prepareSession({lease:e,req:t,base:r}):r}capabilitiesForPlatform(e){return nO({provider:this.provider,platform:e,overrides:this.options.capabilityOverrides})}baseSessionForLease(e){let t="function"==typeof this.options.webdriverCapabilities?this.options.webdriverCapabilities(e):this.options.webdriverCapabilities??{};return{provider:this.provider,endpoint:this.options.endpoint,platform:this.options.platform,deviceName:this.options.deviceName,auth:this.options.auth,headers:this.options.headers,webdriverCapabilities:n1(this.options.platform,this.options.deviceName,t)}}deviceForLease(e,t){return{...e_(t.platform),id:t.deviceId??this.options.deviceId?.(e)??`${this.provider}:${t.platform}:${e.leaseId}`,name:t.deviceName,kind:"device",target:"mobile",booted:!0}}findSessionForDevice(e){return[...this.sessionsByLeaseId.values()].find(t=>t.device.id===e.id)}async uploadAppIfNeeded(e,t,r,n,i){if(!nT(e.capabilities,"install"))throw new tn("UNSUPPORTED_OPERATION",nL(e.capabilities,"install"),{provider:this.provider,deviceId:t.id,platform:eR(t)});let a=e.prepared.uploadApp??this.options.uploadApp;if(a)return await a({provider:this.provider,lease:e.lease,device:t,app:r,appPath:n,options:i})}async closeSession(e){let t,r=[];try{await e.client.deleteSession()}catch(e){r.push({code:"WEBDRIVER_SESSION_DELETE_FAILED",message:n3(e)})}try{t=await e.prepared.cleanup?.()}catch(e){r.push({code:"PROVIDER_CLEANUP_FAILED",message:n3(e)})}return{cleanup:t,warnings:r}}async safeListArtifacts(e){let t=e.prepared.listArtifacts??this.options.listArtifacts;if(t)try{return await t({provider:this.provider,lease:e.lease,device:e.device,webDriverSessionId:e.webDriverSessionId,providerSessionId:e.providerSessionId})}catch(t){var r;return{provider:(r={provider:this.provider,providerSessionId:e.providerSessionId,error:t}).provider,providerSessionId:r.providerSessionId,status:"unavailable",cloudArtifacts:[],message:r.error instanceof Error?r.error.message:String(r.error)}}}}function n3(e){return e instanceof Error?e.message:String(e)}async function n5(e,t){try{await e.cleanup?.()}catch(e){t instanceof tn&&(t.details={...t.details,cleanupError:n3(e)})}}async function n4(e,t,r){if(!t)return;let n=(await Promise.all([r.listArtifacts(t,"FILE"),r.listArtifacts(t,"LOG")])).flat().flatMap(r=>{var n,i,a;let o;return n=e,i=t,"string"!=typeof(o=(a=r).url)||0===o.length?[]:[{provider:n,providerSessionId:i,kind:function(e){switch(e){case"VIDEO":return"video";case"APPIUM_SERVER_OUTPUT":return"appium-log";case"DEVICE_LOG":return"device-log";case"MESSAGE_LOG":case"UNKNOWN":return"automation-log";default:return"raw"}}(a.type),name:a.name??a.type??"AWS Device Farm artifact",url:o,providerArtifactId:a.arn,extension:a.extension,availability:"ready",metadata:{awsType:a.type,...a.metadata?{awsMetadata:a.metadata}:{}}}]});return nk({provider:e,providerSessionId:t,artifacts:n,pendingMessage:"AWS Device Farm artifacts are not ready yet."})}e1.awsDeviceFarm;let n6={install:{support:"unsupported",note:"Pass appArn when creating the remote access session; local artifact upload/install is not implemented."},portReverse:{support:"unsupported",note:"AWS Device Farm remote access does not expose agent-device port reverse."},artifacts:{support:"supported",note:"AWS Device Farm remote access exposes provider-hosted video, Appium logs, and device logs after session completion."}};function n8(e={}){var t;let r,n,i=(r=(t=e).region?["--region",t.region]:[],n=t.awsCommand??"aws",async(e,t)=>await n7(n,["devicefarm",e,...r,...t,"--output","json"]));return{createRemoteAccessSession:async e=>ie(await i("create-remote-access-session",["--project-arn",e.projectArn,"--device-arn",e.deviceArn,"--name",e.name,...e.appArn?["--app-arn",e.appArn]:[],...e.interactionMode?["--interaction-mode",e.interactionMode]:[],...e.configuration?["--configuration",JSON.stringify(e.configuration)]:[]])),getRemoteAccessSession:async e=>ie(await i("get-remote-access-session",["--arn",e])),stopRemoteAccessSession:async e=>ie(await i("stop-remote-access-session",["--arn",e])),listArtifacts:async(e,t)=>{var r=await i("list-artifacts",["--arn",e,"--type",t]);if(!r||"object"!=typeof r)return[];let n=r.artifacts;return Array.isArray(n)?n:[]}}}async function n9(e,t){let r=t.startupTimeoutMs??12e4,n=t.pollIntervalMs??5e3,i=Date.now(),a=await t.client.getRemoteAccessSession(e);for(;Date.now()-i<r;){if("RUNNING"===a.status)return a;if("ERRORED"===a.status||"STOPPED"===a.status||"COMPLETED"===a.status)throw new tn("COMMAND_FAILED","AWS Device Farm remote access session did not start.",{sessionArn:e,status:a.status,result:a.result});await tg(n),a=await t.client.getRemoteAccessSession(e)}throw new tn("COMMAND_FAILED","Timed out waiting for AWS Device Farm remote access.",{sessionArn:e,status:a.status,result:a.result,timeoutMs:r})}async function n7(e,t){return JSON.parse((await eS(e,t,{maxBuffer:0xa00000})).stdout)}function ie(e){if(!e||"object"!=typeof e)throw new tn("COMMAND_FAILED","AWS Device Farm response was not an object.",{response:e});let t=e.remoteAccessSession;if(!t||"object"!=typeof t)throw new tn("COMMAND_FAILED","AWS Device Farm response missed remoteAccessSession.",{response:e});return t}e1.browserStack;let it="https://api-cloud.browserstack.com/app-automate/upload",ir={install:{support:"partial",note:"Local app artifacts are uploaded to BrowserStack App Automate, then installed with Appium."},portReverse:{support:"unsupported",note:"Use BrowserStack Local for network tunneling; agent-device port reverse is not available."},artifacts:{support:"supported",note:"BrowserStack session details expose provider-hosted video, Appium logs, device logs, and dashboard links."}};async function ii(e,t,r){var n,i,a;if(!t)return;let o=await io(t,r),s=[is(n=e,i=t,a=o,"video_url","video","Session video"),is(n,i,a,"appium_logs_url","appium-log","Appium logs"),is(n,i,a,"device_logs_url","device-log","Device logs"),is(n,i,a,"browser_url","provider-session","BrowserStack dashboard"),is(n,i,a,"public_url","provider-session","Public session link")].filter(e=>void 0!==e);return nk({provider:e,providerSessionId:t,artifacts:s,pendingMessage:"BrowserStack artifacts are not ready yet."})}async function ia(e,t){let r=await v.readFile(e),n=new FormData;n.set("file",new Blob([r]),a.basename(e));let i=await fetch(t.endpoint??it,{method:"POST",headers:{...nF(),Authorization:n$(t)},body:n}),o=await i.json(),s=function(e){if(!e||"object"!=typeof e)return;let t=e.app_url;return"string"==typeof t?t:void 0}(o);if(!i.ok||!s)throw new tn("COMMAND_FAILED","BrowserStack app upload failed.",{status:i.status,response:o});return s}async function io(e,t){let r=new URL(`${function(e){let t=e.length-1;for(;t>=0&&47===e.charCodeAt(t);)t-=1;return t===e.length-1?e:e.slice(0,t+1)}(String(t.endpoint??"https://api-cloud.browserstack.com/app-automate/sessions"))}/${e}.json`),n=await fetch(r,{headers:{...nF(),Authorization:n$(t)}}),i=await n.json();if(!n.ok||!i||"object"!=typeof i)throw new tn("COMMAND_FAILED","BrowserStack session details lookup failed.",{status:n.status,response:i});let a=i.automation_session??i;return a&&"object"==typeof a?a:{}}function is(e,t,r,n,i,a){let o=r[n];if("string"==typeof o&&0!==o.length)return{provider:e,providerSessionId:t,kind:i,name:a,url:o,availability:"ready"}}let il=[{provider:e1.browserStack,createRuntime:e=>new n2({provider:e1.browserStack,platform:"android",deviceName:"BrowserStack device",endpoint:e.BROWSERSTACK_WEBDRIVER_ENDPOINT??"https://hub-cloud.browserstack.com/wd/hub/",capabilityOverrides:ir,listArtifacts:async({provider:t,providerSessionId:r})=>{let n=ih(e,"BROWSERSTACK_USERNAME","BrowserStack artifact lookup"),i=ih(e,"BROWSERSTACK_ACCESS_KEY","BrowserStack artifact lookup");return await ii(t,r,{username:n,accessKey:i,endpoint:e.BROWSERSTACK_SESSION_DETAILS_ENDPOINT})},prepareSession:async({req:t,lease:r,base:n})=>{var i,a;let o=ic(t,"BrowserStack"),s=ih(e,"BROWSERSTACK_USERNAME","BrowserStack"),l=ih(e,"BROWSERSTACK_ACCESS_KEY","BrowserStack"),d=iu(o,"BrowserStack"),c=ip(o,"device","BrowserStack requires --device <name>."),u=ip(o,"providerOsVersion","BrowserStack requires --provider-os-version <version>."),p=await id({app:ip(o,"providerApp","BrowserStack requires --provider-app <bs://app-id-or-local-path>."),cwd:o.meta?.cwd,username:s,accessKey:l,uploadEndpoint:e.BROWSERSTACK_APP_UPLOAD_ENDPOINT});return{...n,platform:d,deviceName:c,auth:{username:s,accessKey:l},uploadApp:(i={username:s,accessKey:l,endpoint:e.BROWSERSTACK_APP_UPLOAD_ENDPOINT??it},async({appPath:e,options:t})=>({appReference:await ia(e,i),bundleId:t?.appIdentifierHint,packageName:t?.packageNameHint,launchTarget:t?.appIdentifierHint??t?.packageNameHint})),webdriverCapabilities:{device:(a={deviceName:c,osVersion:u,app:p,projectName:im(o,"providerProject"),buildName:im(o,"providerBuild")??r.runId,sessionName:im(o,"providerSessionName")??r.leaseId,configured:n1(d,c)}).deviceName,os_version:a.osVersion,...a.app?{app:a.app}:{},"bstack:options":{...a.projectName?{projectName:a.projectName}:{},buildName:a.buildName,sessionName:a.sessionName},...a.configured??{}}}}}),listArtifactsFromEnv:async(e,t)=>{let r=ih(t,"BROWSERSTACK_USERNAME","BrowserStack artifact lookup"),n=ih(t,"BROWSERSTACK_ACCESS_KEY","BrowserStack artifact lookup");return await ii(e1.browserStack,e,{username:r,accessKey:n,endpoint:t.BROWSERSTACK_SESSION_DETAILS_ENDPOINT})}},{provider:e1.awsDeviceFarm,createRuntime:e=>new n2({provider:e1.awsDeviceFarm,endpoint:"http://127.0.0.1/",platform:"android",deviceName:"AWS Device Farm device",capabilityOverrides:n6,listArtifacts:async({provider:t,providerSessionId:r})=>{let n=n8({region:e.AWS_REGION??e.AWS_DEFAULT_REGION??iv(r??"")});return await n4(t,r,n)},prepareSession:async({req:t,lease:r,base:n})=>{let i=ic(t,"AWS Device Farm"),a=iu(i,"AWS Device Farm"),o={client:n8({region:im(i,"awsRegion")??e.AWS_REGION??e.AWS_DEFAULT_REGION}),projectArn:iw(i,e,"awsProjectArn","AGENT_DEVICE_AWS_DEVICE_FARM_PROJECT_ARN","AWS_DEVICE_FARM_PROJECT_ARN"),deviceArn:iw(i,e,"awsDeviceArn","AGENT_DEVICE_AWS_DEVICE_FARM_DEVICE_ARN","AWS_DEVICE_FARM_DEVICE_ARN"),appArn:im(i,"awsAppArn")??e.AGENT_DEVICE_AWS_DEVICE_FARM_APP_ARN??e.AWS_DEVICE_FARM_APP_ARN,platform:a,deviceName:im(i,"device")??"AWS Device Farm device",sessionName:im(i,"providerSessionName")??r.leaseId,interactionMode:function(e){let t=im(e,"awsInteractionMode");if("INTERACTIVE"===t||"NO_VIDEO"===t||"VIDEO_ONLY"===t)return t}(i)};return await (async({lease:e,base:t})=>{var r,n,i;let a,s,l=await o.client.createRemoteAccessSession({projectArn:o.projectArn,deviceArn:o.deviceArn,appArn:o.appArn,name:(r=o.sessionName,("function"==typeof r?r(e):r)??`agent-device-${e.leaseId}`),interactionMode:o.interactionMode,configuration:o.configuration}),d=await n9(l.arn,o),c=(a=(n=d).endpoints&&"object"==typeof n.endpoints?Object.values(n.endpoints):[],(s=[n.remoteDriverEndpoint,n.endpoint,...a,n.remoteDebugUrl,n.remoteRecordAppUrl].filter(e=>"string"==typeof e&&e.length>0).find(e=>!/^wss?:\/\//i.test(e)))?(i=s,/^https?:\/\//i.test(i)?i:`http://${i}`):void 0);if(!c)throw new tn("COMMAND_FAILED","AWS Device Farm did not expose a WebDriver endpoint.",{sessionArn:d.arn,status:d.status});let u=d.device?.name??o.deviceName,p="function"==typeof o.webdriverCapabilities?o.webdriverCapabilities(e):o.webdriverCapabilities??{};return{...t,endpoint:c,platform:o.platform,deviceName:u,webdriverCapabilities:n1(o.platform,u,p),cleanup:async()=>(await o.client.stopRemoteAccessSession(d.arn),{awsDeviceFarmSessionArn:d.arn}),providerSessionId:d.arn,providerData:{awsDeviceFarmSessionArn:d.arn}}})({lease:r,req:t,base:n})}}),listArtifactsFromEnv:async(e,t)=>{let r=n8({region:t.AWS_REGION??t.AWS_DEFAULT_REGION??iv(e)});return await n4(e1.awsDeviceFarm,e,r)}}];async function id(e){var t;if((t=e.app).startsWith("bs://")||/^https?:\/\//.test(t))return e.app;let r=a.resolve(e.cwd??process.cwd(),e.app);if(!o.existsSync(r))throw new tn("INVALID_ARGS","BrowserStack --provider-app must be a bs:// app id, URL, or existing local app path.",{providerApp:e.app});return await ia(r,{username:e.username,accessKey:e.accessKey,endpoint:e.uploadEndpoint})}function ic(e,t){if(e)return e;throw new tn("INVALID_ARGS",`${t} lease allocation requires provider profile flags on the request.`)}function iu(e,t){let r=e.flags?.platform;if("android"===r||"ios"===r)return r;throw new tn("INVALID_ARGS",`${t} requires --platform ios|android.`)}function ip(e,t,r){let n=im(e,t);if(n)return n;throw new tn("INVALID_ARGS",r)}function im(e,t){let r=e.flags?.[t];return"string"==typeof r&&r.length>0?r:void 0}function ih(e,t,r){let n=e[t];if(n)return n;throw new tn("INVALID_ARGS",`${r} requires ${t} in the environment.`)}function iw(e,t,r,n,i){let a=im(e,r)??t[n]??t[i];if(a)return a;throw new tn("INVALID_ARGS",`AWS Device Farm requires --${String(r).replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)} or ${i}.`)}function iv(e){return/^arn:[^:]+:devicefarm:([^:]+):/.exec(e)?.[1]}async function iy(e,t){if(e.providerSessionId){var r;return await (r=e.provider,il.find(e=>e.provider===r))?.listArtifactsFromEnv(e.providerSessionId,t)}}let ig=[],ib=new p;async function iA(e,t){return await ib.run([...e],t)}function iS(e){return iN().some(t=>t.ownsDevice(e))}async function iI(e,t,r,n){for(let i of iN()){if(!i.ownsDevice(e))continue;if(!i.installApp)throw iE(i,e,"install");let a=await i.installApp?.(e,t,r,n);if(a)return a;throw iE(i,e,"install")}}async function i_(e,t,r){for(let n of iN()){if(!n.ownsDevice(e))continue;if(!n.installInstallablePath)throw iE(n,e,"install_from_source");let i=await n.installInstallablePath?.(e,t,r);if(i)return i;throw iE(n,e,"install_from_source")}}async function iM(e){for(let t of iN()){if(!ik(t,e.provider))continue;let r=await t.configurePortReverse?.(e);if(r)return r}}async function ix(e){for(let t of iN()){if(!ik(t,e.provider))continue;let r=await t.removePortReverse?.(e);if(r)return r}}function iN(){return ib.getStore()??ig}async function iD(e,t){for(let r of e){if(!ik(r,t.provider))continue;let e=await r.cloudArtifacts?.listCloudArtifacts?.(t);if(e)return e}}async function iP(e,t,r,n){for(let i of e){if(!ik(i,r.leaseProvider))continue;let e=i.leaseLifecycle[t],a=e?await e(r,n):void 0;if(a)return a}}function ik(e,t){return e.provider===t}function iE(e,t,r){throw new tn("UNSUPPORTED_OPERATION",`Provider device runtime ${e.provider} does not support ${r} for this device.`,{provider:e.provider,deviceId:t.id,platform:eR(t)})}let iC="default";function iR(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function iO(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function iT(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 tn("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}function iL(e){if(void 0===e)return;let t=e.trim();if(!t||t.length>256||!/^[\x20-\x7E]+$/.test(t))throw new tn("INVALID_ARGS","Invalid device key. Use 1-256 printable characters.");return t}function iF(e){return iU(e,"client id",128)}function i$(e){return iU(e,"lease provider",64)}function iU(e,t,r){if(void 0===e)return;let n=e.trim();if(!n||n.length>r||!/^[a-zA-Z0-9._-]+$/.test(n))throw new tn("INVALID_ARGS",`Invalid ${t}. Use 1-${String(r)} chars: letters, numbers, dot, underscore, hyphen.`);return n}class iB{leases=new Map;runBindings=new Map;deviceBindings=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={backend:iT(e.leaseBackend),leaseProvider:i$(e.leaseProvider),deviceKey:iL(e.deviceKey),clientId:iF(e.clientId),tenantId:function(e){let t=ta(e);if(!t)throw new tn("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return t}(e.tenantId),runId:function(e){let t=iR(e);if(!t)throw new tn("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return t}(e.runId),ttlMs:e.ttlMs};this.cleanupExpiredLeases();let r=this.resolveLeaseTtlMs(t.ttlMs),n=this.refreshExistingRunBinding(t,r);if(n)return n;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=this.createLease(t,r);return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}refreshExistingRunBinding(e,t){let r=this.bindingKey(e),n=this.runBindings.get(r);if(!n)return;let i=this.leases.get(n);return i?(this.canReuseRunBinding(i,e)||(i.deviceKey&&this.throwDeviceBusy(i),this.assertOptionalLeaseIdentityMatch(i,e)),this.refreshLease(i,t)):void this.runBindings.delete(r)}createLease(e,t){let r=this.now();return{leaseId:n.randomBytes(16).toString("hex"),tenantId:e.tenantId,runId:e.runId,backend:e.backend,...e.leaseProvider?{leaseProvider:e.leaseProvider}:{},...e.deviceKey?{deviceKey:e.deviceKey}:{},...e.clientId?{clientId:e.clientId}:{},createdAt:r,heartbeatAt:r,expiresAt:r+t}}heartbeatLease(e){let t=this.normalizeRequiredLeaseId(e.leaseId);this.cleanupExpiredLeases();let r=this.getActiveLease(t);this.assertRequiredScopeForDeviceAwareLease(r,e),this.assertOptionalScopeMatch(r,e);let n=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(r,n)}releaseLease(e){let t=this.normalizeRequiredLeaseId(e.leaseId);this.cleanupExpiredLeases();let r=this.leases.get(t);return r?(this.assertRequiredScopeForDeviceAwareLease(r,e),this.assertOptionalScopeMatch(r,e),this.leases.delete(t),this.unbindLease(r),{released:!0,lease:{...r}}):{released:!1}}assertLeaseAdmission(e){let t=iT(e.leaseBackend),r=ta(e.tenantId);if(!r)throw new tn("INVALID_ARGS","tenant isolation requires tenant id.");let n=iR(e.runId);if(!n)throw new tn("INVALID_ARGS","tenant isolation requires run id.");let i=iO(e.leaseId);if(!i)throw new tn("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.getActiveLease(i);this.assertOptionalScopeMatch(a,{tenantId:r,runId:n,leaseBackend:t,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}consumeExpiredLeases(){let e=this.now(),t=[];for(let r of this.leases.values())r.expiresAt>e||(this.leases.delete(r.leaseId),this.unbindLease(r),t.push({...r}));return t}consumeExpiredLease(e){let t=iO(e);if(!t)return;let r=this.leases.get(t);if(!(!r||r.expiresAt>this.now()))return this.leases.delete(r.leaseId),this.unbindLease(r),{...r}}cleanupExpiredLeases(){this.consumeExpiredLeases()}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 tn("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 tn("INVALID_ARGS",`Lease ttlMs must be between ${this.minLeaseTtlMs} and ${this.maxLeaseTtlMs}.`);return t}normalizeRequiredLeaseId(e){let t=iO(e);if(!t)throw new tn("INVALID_ARGS","Invalid lease id.");return t}getActiveLease(e){let t=this.leases.get(e);if(t)return t;throw new tn("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"})}refreshLease(e,t){let r=this.now(),n={...e,heartbeatAt:r,expiresAt:r+t};return this.leases.set(n.leaseId,n),this.bindLease(n),{...n}}bindLease(e){this.runBindings.set(this.bindingKey({tenantId:e.tenantId,runId:e.runId,backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey}),e.leaseId);let t=this.deviceBindingKey(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e){this.runBindings.delete(this.bindingKey({tenantId:e.tenantId,runId:e.runId,backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey}));let t=this.deviceBindingKey(e);t&&this.deviceBindings.delete(t)}bindingKey(e){return JSON.stringify([e.tenantId,e.runId,e.backend,e.leaseProvider??iC,e.deviceKey??"*"])}deviceBindingKey(e){if(e.deviceKey)return JSON.stringify([e.backend,e.leaseProvider??iC,e.deviceKey])}assertDeviceAvailable(e){let t=this.deviceBindingKey({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let r=this.deviceBindings.get(t);if(!r)return;let n=this.leases.get(r);n?this.throwDeviceBusy(n):this.deviceBindings.delete(t)}canReuseRunBinding(e,t){return e.clientId===t.clientId}throwDeviceBusy(e){throw new tn("COMMAND_FAILED","Device is already leased",{reason:"DEVICE_LEASE_BUSY",deviceKey:e.deviceKey,backend:e.backend,leaseProvider:e.leaseProvider,expiresAt:e.expiresAt,hint:"Retry after the lease expires or close the owning session."})}assertRequiredScopeForDeviceAwareLease(e,t){(e.leaseProvider??e.deviceKey??e.clientId)&&(t.tenantId&&t.runId&&[[e.leaseProvider,t.leaseProvider],[e.deviceKey,t.deviceKey],[e.clientId,t.clientId]].every(([e,t])=>!e||!!t)||this.throwScopeRequired())}assertOptionalScopeMatch(e,t){let r=this.normalizeOptionalScopeMatchRequest(t);(r.tenantId&&e.tenantId!==r.tenantId||r.runId&&e.runId!==r.runId||r.leaseBackend&&e.backend!==r.leaseBackend)&&this.throwScopeMismatch(),this.assertOptionalLeaseIdentityMatch(e,r)}normalizeOptionalScopeMatchRequest(e){let t=ta(e.tenantId),r=iR(e.runId);if(e.tenantId&&!t)throw new tn("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(e.runId&&!r)throw new tn("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return{tenantId:t,runId:r,leaseBackend:e.leaseBackend?iT(e.leaseBackend):void 0,leaseProvider:i$(e.leaseProvider),deviceKey:iL(e.deviceKey),clientId:iF(e.clientId)}}assertOptionalLeaseIdentityMatch(e,t){t.leaseProvider&&e.leaseProvider!==t.leaseProvider&&this.throwScopeMismatch(),t.deviceKey&&e.deviceKey!==t.deviceKey&&this.throwScopeMismatch(),t.clientId&&e.clientId!==t.clientId&&this.throwScopeMismatch()}throwScopeMismatch(){throw new tn("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}throwScopeRequired(){throw new tn("UNAUTHORIZED","Lease owner scope is required",{reason:"LEASE_SCOPE_REQUIRED"})}}let iG=["android","apple","linux"],iq={platform:"web",id:"agent-browser-chrome",name:"Agent Browser Chrome",kind:"device",target:"desktop",booted:!0};async function iV(e){if("web"===e.platform)return[iq];if(iK(e)){let{listMacosDevices:e}=await import("./devices~1.js");return await e()}if("linux"===e.platform){let{listLinuxDevices:e}=await import("./devices~2.js");return await e()}if("android"===e.platform){let{listAndroidDevices:t}=await import("./3340.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 t=[];for(let r of iG)try{t.push(...await iV({...e,platform:r}))}catch{}return t}function ij(e){let t={android:{available:0,booted:0},apple:{available:0,booted:0},linux:{available:0,booted:0},web:{available:0,booted:0}};for(let n of e){var r;let e=eU(r=n)||eE(r)?"apple":r.platform;t[e].available+=1,!0===n.booted&&(t[e].booted+=1)}return t}function iK(e){return"macos"===e.platform||"apple"===e.platform&&"desktop"===e.target}let iH=new p,iW=new p;async function iz(e,t,r){var n,i;let a=await iX(e,t,r);if(n=t,i=a,!iJ(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 tn("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function iX(e,t,r){try{return await eD(e,t,r)}catch(e){var n;if(n=e,!iJ(t)&&n instanceof tn&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function iJ(e){return!!(e.udid||e.serial||e.deviceName)}async function iZ(e,t={}){var r;let n=iY(e),{iosSimulatorSetPath:i,...a}=n,o=(r=n,JSON.stringify({request:r,options:t})),s={simulatorSetPath:i,allowStoppedAndroidAvdPlaceholders:t.allowStoppedAndroidAvdPlaceholders},l={platform:n.platform,target:e.target,cacheHit:!1};return await eb("resolve_target_device",async()=>{let e=function(e){let t=iH.getStore(),r=t?.get(e);if(r)return{...r}}(o);if(e)return l.cacheHit=!0,e;let t=await i3(n);if(t)return i5(a)?i4(o,await iz(t,a,{simulatorSetPath:i})):i4(o,await eD(t,a,s));let r=await iV(n);return i5(a)?i4(o,await iz(r,a,{simulatorSetPath:i})):i4(o,await eD(r,a,s))},l)}function iY(e){let t=e.platform;if(e.target&&!t)throw new tn("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let r=eM({simulatorSetPath:tI(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=tU(e.androidDeviceAllowlist);return{platform:t,target:e.target,deviceName:e.device,udid:e.udid,serial:e.serial,leaseId:e.leaseId,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0}}async function iQ(e){return iH.getStore()?await e():await iH.run(new Map,e)}async function i0(e,t){return e?await iW.run(e,t):await t()}async function i1(e,t){return await i0(e,async()=>await iQ(t))}async function i2(e){return await i3(e)??await iV(e)}async function i3(e){let t=iW.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function i5(e){return eF(e.platform)}function i4(e,t){return iH.getStore()?.set(e,{...t}),t}let i6=new Map;function i8(e){return i6.get(e)}let i9={appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1,multiTouchSynthesis:!0},i7={ios:i9,ipados:i9,visionos:i9,tvos:{appAndDeviceLifecycle:!0,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1,multiTouchSynthesis:!1,multiTouchUnsupportedHint:"tvOS has no touch input — this gesture is supported on Android and the iOS simulator only."},macos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!0,multiTouchSynthesis:!1,multiTouchUnsupportedHint:"macOS automation has no multi-touch input — this gesture is supported on Android and the iOS simulator only."},watchos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1,multiTouchSynthesis:!1}};function ae(e){return eF(e.platform)?i7[e.appleOs?e.appleOs:"macos"===e.platform?"macos":ek(e)?"tvos":"ios"]:void 0}function at(e){return"darwin"===process.platform&&(eE(e)||eU(e)&&"simulator"===e.kind||"android"===e.platform&&"emulator"===e.kind)}function ar(e){return"web"===e.platform||at(e)}let an=e=>{let t=ae(e);return!t||t.appAndDeviceLifecycle},ai=e=>{let t=ae(e);return t&&t.physicalDeviceSurfaces||"simulator"===e.kind},aa=e=>{let t=ae(e);return t?t.multiTouchSynthesis&&"simulator"===e.kind:"android"===e.platform},ao=e=>{let t=ae(e);if(t){if(t.multiTouchUnsupportedHint)return t.multiTouchUnsupportedHint;if("device"===e.kind)return"Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices."}},as=[{id:"apple",platforms:["apple"],familySelector:"apple",capability:{bucket:"apple",supportsByDefault:{[tV.boot]:an,[tV.install]:an,[tV.reinstall]:an,[tV.installFromSource]:an,[tV.push]:an,[tV.home]:an,[tV.appSwitcher]:an,[tV.clipboard]:e=>"android"===e.platform||"linux"===e.platform||ai(e),[tV.keyboard]:e=>{let t=ae(e);return t?t.keyboard:"android"===e.platform},[tV.rotate]:e=>{let t=ae(e);return t?t.orientation:"android"===e.platform},[tV.alert]:e=>"android"===e.platform||ai(e),[tV.settings]:e=>"android"===e.platform||ai(e),[tV.audio]:ar,pinch:aa,"rotate-gesture":aa,"transform-gesture":aa},unsupportedHintByDefault:{pinch:ao,"rotate-gesture":ao,"transform-gesture":ao}},appLog:{resolveBackend:e=>eE(e)?"macos":"device"===e.kind?"ios-device":"ios-simulator"},perf:{supportsMetrics:()=>!0},recording:{resolveBackendTag:e=>eE(e)?"macos":"device"===e.kind?"ios-device":"ios-simulator"},providers:{platformGatedResolvers:["appleRunnerProvider","appleToolProvider"]},createInteractor:async(e,t)=>{let{createAppleInteractor:r}=await import("./interactor.js");return r(e,t)},discoverDevices:async e=>{if(iK(e)){let{listMacosDevices:e}=await import("./devices~1.js");return await e()}let{listAppleDevices:t}=await import("./devices.js");return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}},{id:"android",platforms:["android"],capability:{bucket:"android",supportsByDefault:{[tV.audio]:ar}},appLog:{resolveBackend:()=>"android"},perf:{supportsMetrics:()=>!0},recording:{resolveBackendTag:()=>"android"},providers:{platformGatedResolvers:["androidAdbProvider"]},createInteractor:async e=>{let{createAndroidInteractor:t}=await import("./android.js");return t(e)},discoverDevices:async e=>{let{listAndroidDevices:t}=await import("./3340.js");return await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0})}},{id:"linux",platforms:["linux"],capability:{bucket:"linux"},providers:{platformGatedResolvers:["linuxToolProvider"]},createInteractor:async()=>{let{createLinuxInteractor:e}=await import("./linux.js");return e()},discoverDevices:async()=>{let{listLinuxDevices:e}=await import("./devices~2.js");return await e()}},{id:"web",platforms:["web"],capability:{bucket:"web"},recording:{resolveBackendTag:()=>"web"},providers:{platformGatedResolvers:["webProvider"]},createInteractor:async()=>{let{createWebInteractor:e}=await import("./web.js");return e()},discoverDevices:async()=>[iq]}],al=!1;function ad(){if(!al){for(let e of as)for(let t of e.platforms){if(i6.has(t))throw Error(`PlatformPlugin already registered for platform "${t}"`);i6.set(t,e)}al=!0}}ad();let ac={device:!0},au=new Set(["open","close","record","audio","find","get","is","network","screenshot","snapshot","wait","click","fill","focus","press","scroll","type","viewport"]),ap=function(e){let t={};for(let[r,n]of Object.entries(e))t[r]=au.has(r)?{...n,web:ac}:n;for(let t of au)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}(tz(tW));function af(e,t){let r=ap[e];if(!r)return!0;let n=i8(t.platform);if(!n)return!1;let i=r[n.capability.bucket];if(!i)return!1;let a=n.capability.supportsByDefault?.[e];return(!a||!!a(t))&&!0===i[t.kind??"unknown"]}let am=["role","type","subrole","label","value","identifier","enabled","selected","focused","hittable"];function ah(e,t){if("digest"!==t)return e;let r=e.node;if(!r||"object"!=typeof r)return e;if("string"==typeof e.text){let{node:t,...r}=e;return r}return{...e,node:function(e){let t={ref:e.ref};for(let r of am){let n=e[r];void 0!==n&&(t[r]=n)}return t}(r)}}let aw={snapshot:function(e,t){if("digest"!==t)return e;let r=Array.isArray(e.nodes)?e.nodes:[],n=r.filter(e=>!0===e.hittable&&"covered"!==e.interactionBlocked).slice(0,12).map(e=>({ref:e.ref,label:e.label??e.value??e.identifier}));return{nodeCount:r.length,refs:n,truncated:e.truncated,...void 0!==e.visibility?{visibility:e.visibility}:{},...void 0!==e.snapshotQuality?{snapshotQuality:e.snapshotQuality}:{}}},screenshot:function(e,t){if("digest"!==t)return e;let r=Array.isArray(e.overlayRefs)?e.overlayRefs:[],n=r.slice(0,12).map(e=>({ref:e.ref,label:e.label}));return{..."string"==typeof e.path?{path:e.path}:{},overlayCount:r.length,overlayRefs:n,...void 0!==e.artifacts?{artifacts:e.artifacts}:{}}},find:ah,get:ah},av="No active session. Run open first.";function ay(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}function ag(){return ay("SESSION_NOT_FOUND",av)}function ab(e,t,r){if(af(e,t))return null;let n=r?.hint?i8(t.platform)?.capability.unsupportedHintByDefault?.[e]?.(t):void 0;return{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:r?.message??`${e} is not supported on this device`,...n?{hint:n}:{}}}}let aA=["platform","target","device","udid","serial"],aS=[...aA,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function aI(e){return aM(e,aA)}function a_(e){return"string"==typeof e&&e.trim().length>0}function aM(e,t){return!!e&&t.some(t=>a_(e[t]))}let ax=function(e){let t=new Map;for(let r of e){if(t.has(r.command))throw Error(`Duplicate daemon command descriptor: ${r.command}`);t.set(r.command,r)}return{descriptorsByCommand:t}}(tX(tW));function aN(e){return aP(e)?.sessionKind}function aD(e){return aP(e)?.leaseAdmissionExempt===!0}function aP(e){return ax.descriptorsByCommand.get(e)}function ak(e,t){return i8(t.platform)?.providers?.platformGatedResolvers.includes(e)??!1}ad();let aE=[{resolverKey:"androidAdbProvider",resolve(e,t){let r=e.androidAdbProvider;if(!r||!ak("androidAdbProvider",t.device))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("./3340.js");aL(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&ak("appleRunnerProvider",t.device)?{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(t7);aL(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&&ak("appleToolProvider",t.device)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(re);aL(t,e.appleTool,r)}},{resolverKey:"linuxToolProvider",resolve(e,t){let r=e.linuxToolProvider;return r&&ak("linuxToolProvider",t.device)?{linuxTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.linuxTool?.provider)return;let{withLinuxToolProvider:r}=await Promise.resolve(rn);aL(t,e.linuxTool,r)}},{resolverKey:"webProvider",resolve(e,t){let r=e.webProvider;return r&&ak("webProvider",t.device)?{web:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.web?.provider)return;let{withWebProvider:r}=await import("./provider.js");aL(t,e.web,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(t8);aL(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");aL(t,e.recording,r)}}];async function aC(e,t){let r=await aR(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await aT(r);return await aF(i,async()=>await t(n))}async function aR(e){var t,r,n;if(t=e.providers,!aE.some(e=>!!t[e.resolverKey]))return{};let i=await aO(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return aE.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function aO(e,t){switch(function(e,t){var r;let n,i;if(t.hasExistingSession)return aP(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(r=e,"function"==typeof(i=aP(r.command)?.skipSessionlessProviderDevice)&&i(r))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(n=aP(e.command)?.allowSessionlessDefaultDevice)&&n(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:aI(e.flags)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await iZ(e.flags??{});case"skip":return}}async function aT(e){let t=[];for(let r of aE)await r.appendWrapper(e,t);return t}function aL(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function aF(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function a$(e,t){if(iS(e)){let t=function(e){for(let t of iN()){if(!t.ownsDevice(e))continue;let r=t.getInteractor(e);if(r)return r}}(e);if(t)return t;throw new tn("UNSUPPORTED_OPERATION","Provider device runtime does not have an active interactor for this device.",{deviceId:e.id,platform:eR(e)})}return await (function(e){let t=i6.get(e);if(!t)throw new tn("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e}`);return t})(e.platform).createInteractor(e,t)}ad();let aU=/^[A-Za-z0-9_.:-]{1,64}$/,aB="--launch-console is supported only for iOS simulator app launches",aG="--launch-console requires a direct app launch and cannot be used with URL opens",aq=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function aV(e,t){if(t<=0)return[0,0];let[r,n]=aq[e%aq.length];return[r*t,n*t]}async function aj(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await tg(t)}async function aK(e,t){let{x:r,y:n}=aY(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,...J(`Long pressed (${r}, ${n})`)}}async function aH(e,t){let{x:r,y:n}=aY(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...J(`Focused (${r}, ${n})`)}}async function aW(e,t,r){let n=e3(t[0]);if(n)throw new tn("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 tn("INVALID_ARGS","type requires text");let a=ei(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...J(ou("Typed",i))}}async function az(e,t,r){if(r?.directElementSelector)return await aX(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 tn("INVALID_ARGS","fill requires x y text");let o=ei(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...J(ou("Filled",a))}}async function aX(e,t,r,n){if(!e.fillElementSelector)throw new tn("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new tn("INVALID_ARGS","fill requires text");let a=ei(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...J(ou("Filled",i))}}async function aJ(e,t,r,n){var i,a;if(n?.directElementSelector&&eU(e))return await aZ(t,n.directElementSelector);let{x:o,y:s}=aY(r,"press requires x y");if(eE(e)&&n?.surface&&"app"!==n.surface)return await aQ(o,s,n);let l=k(n);if("primary"!==l)return await a0(e,o,s,l,n);let d=(a=n,{count:a2(a?.count,1,"count",1,200),intervalMs:a2(a?.intervalMs,0,"interval-ms",0,1e4),holdMs:a2(a?.holdMs,0,"hold-ms",0,1e4),jitterPx:a2(a?.jitterPx,0,"jitter-px",0,100),doubleTap:!!a?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new tn("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new tn("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(d),i=d.count,eF(e.platform)&&i>1)?await a5(e,o,s,d,n):await a4(t,o,s,d)}async function aZ(e,t){if(!e.tapElementSelector)throw new tn("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...J(`Tapped ${t.raw}`)}}function aY(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new tn("INVALID_ARGS",t,r);return{x:n,y:i}}async function aQ(e,t,r){let n=k(r);if("primary"!==n)throw new tn("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(rt);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...J(od({x:e,y:t}))}}async function a0(e,t,r,n,i){if(function(e,t,r){let n=j({commandLabel:"click",platform:eR(e),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 a1(t,r,n);let{runAppleRunnerCommand:a}=await Promise.resolve(t9);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},a6(i)),{x:t,y:r,button:n,...J(od({x:t,y:r,button:n}))}}async function a1(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,...J(od({x:e,y:t,button:r}))}}function a2(e,t,r,n,i){return ei(void 0===e?t:e,r,n,i)}async function a3(e,t,r){let n,i,{runAppleRunnerCommand:a}=await Promise.resolve(t9),{MAX_RUNNER_SEQUENCE_STEPS:o,buildRunnerSequenceCommand:s,parseRunnerSequenceResult:l}=await import("./runner-sequence.js"),d=function(e,t,r=2e4){if(0===e.length)return[];let n=t>0?t:e.length,i=[],a=[],o=0;for(let t of e){let e=(t.durationMs??0)+(t.pauseMs??0)+250,s=a.length>0&&o+e>r,l=a.length>=n;(s||l)&&(i.push(a),a=[],o=0),a.push(t),o+=e}return a.length>0&&i.push(a),i}(t,o),c=0,u=[],p=0;for(let t of d){let o,d=await a(e,s(t,r?.appBundleId),a6(r));n??=d,i=d;try{o=l(d)}catch(e){throw function(e,t){if(0===t||!(e instanceof tn)||!e.details)return e;let r=e.details.failedStepIndex;if("number"!=typeof r)return e;let n=e.details.completedSteps;return new tn(e.code,e.message,{...e.details,failedStepIndex:r+t,chunkStepIndex:r,..."number"==typeof n?{completedSteps:t+n}:{}},e.cause)}(e,p)}c+=o.completedSteps,u.push(...o.results),p+=t.length}return{...n??{},completedSteps:c,sequenceResults:u,...i?.gestureEndUptimeMs!==void 0?{gestureEndUptimeMs:i.gestureEndUptimeMs}:{}}}async function a5(e,t,r,n,i){var a,o,s,l;let d,c,u=await a3(e,(a=e,o=t,s=r,c="tap"==(d=(l=n).doubleTap?"doubleTap":l.holdMs>0?"longPress":"tap")&&eU(a)&&!ek(a),Array.from({length:l.count},(e,t)=>{let[r,n]=aV(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,...J(od({x:t,y:r}))}}async function a4(e,t,r,n){let i;return await aj(n.count,n.intervalMs,async a=>{let[o,s]=aV(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}}),T({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},od({x:t,y:r}))}function a6(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir}}async function a8(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 tn("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await a7({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function a9(e,t,r,n){let i=G(r[0]),a=r[1]?Number(r[1]):300,o=ea((await t.snapshot({appBundleId:n?.appBundleId})).nodes??[]);if(!o)throw new tn("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=ed(i,o,{platform:e.platform});return await a7({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function a7(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:d}=e,c=ei(l,"durationMs",16,1e4),u=ei(n?.count??1,"count",1,200),p=ei(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if(!x(X,f))throw new tn("INVALID_ARGS",`Invalid pattern: ${f}`);if(eF(t.platform)&&u>1){let e=await a3(t,function(e){let{device:t,x1:r,y1:n,x2:i,y2:a,count:o,pauseMs:s,pattern:l,effectiveDurationMs:d}=e,c=eU(t)&&!ek(t);return Array.from({length:o},(e,t)=>{let u="ping-pong"===l&&t%2==1,p=t===o-1;return{kind:"drag",x:u?i:r,y:u?a:n,x2:u?r:i,y2:u?n:a,durationMs:d,...c?{synthesized:!0}:{},...!p&&s>0?{pauseMs:s}:{}}})}({device:t,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,...J(oc(u,f))}}return await aj(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)}),T({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}`:oc(u,f))}async function oe(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 tn("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=ei(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??{},...J(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function ot(e,t){let r=eo(S,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 tn("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new tn("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=ei(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,...J(`Flung ${r}`)}}async function or(e,t,r){var n,i,a,o,s,l,d,c;let u,p=t[0],f=t[1]?Number(t[1]):void 0,m=r?.pixels,h=r?.durationMs;if(!p)throw new tn("INVALID_ARGS","scroll requires direction");n=f,i=m,a=h,function(e){if(void 0!==e&&!Number.isFinite(e))throw new tn("INVALID_ARGS","scroll amount must be a number")}(n),O(a),Z({amount:n,pixels:i});let w="bottom"===(o=p)?{direction:"down",edge:"bottom"}:"top"===o?{direction:"up",edge:"top"}:{direction:_(o)},v={amount:f,pixels:m,durationMs:h},{interactionResult:y,completedPasses:g}=await on(e,r,w,v);return T((s=w,l=v,d=g,u=L(c=y),{direction:s.direction,...s.edge?{edge:s.edge,passes:d}:{},...void 0!==l.amount?{amount:l.amount}:{},...void 0!==l.pixels?{pixels:l.pixels}:{},...void 0!==u?{durationMs:u}:{},...c}),W(w.direction,w.edge,g,f,m))}async function on(e,t,r,n){if(r.edge){let i=r.edge,a=await F({edge:i,captureState:async r=>await oi(e,t,i,r),scroll:async()=>await e.scroll(r.direction,n)});return{interactionResult:a.result??{},completedPasses:a.passes}}return{interactionResult:await e.scroll(r.direction,n)??{},completedPasses:1}}async function oi(e,t,r,n){if("function"!=typeof e.snapshot)throw new tn("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await Q({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,scope:e})).nodes??[]})}async function oa(e,t,r,n){if("tv"===e.target)throw new tn("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if(eE(e)&&n?.surface&&"app"!==n.surface)throw new tn("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 tn("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...J(`Pinched to scale ${i}`)}}async function oo(e,t,r){if("tv"===e.target)throw new tn("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if(eE(e))throw new tn("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 tn("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 tn("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 tn("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 tn("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,...J(`Rotated gesture ${n} degrees`)}}async function os(e,t,r){if("tv"===e.target)throw new tn("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n=eU(e)&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new tn("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 tn("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new tn("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:ei(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...J(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function ol(e,t,r){let{x:n,y:i}=aY(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(rr);return{action:"read",text:await e(n,i,r?.surface)}}if(eE(e)&&r?.surface&&"app"!==r.surface){let{runMacOsReadTextAction:e}=await Promise.resolve(rt);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runAppleRunnerCommand:a}=await Promise.resolve(t9),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,iosXctestrunFile:r?.iosXctestrunFile,iosXctestDerivedDataPath:r?.iosXctestDerivedDataPath,iosXctestEnvDir:r?.iosXctestEnvDir});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function od(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function oc(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function ou(e,t){return`${e} ${Array.from(t).length} chars`}function op(e,t){let r,n=t?.subject??"Payload",i=e.trim();if(!i)throw new tn("INVALID_ARGS",`${n} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!o.statSync(a).isFile())throw new tn("INVALID_ARGS",`${n} path is not a file: ${a}`);return{kind:"file",path:a}}catch(t){if(t instanceof tn)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new tn("INVALID_ARGS",`${n} file is not readable: ${a}`);if(e&&"ENOENT"!==e)throw new tn("COMMAND_FAILED",`Unable to read ${n} file: ${a}`,{cause:String(t)})}if((r=i.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:i};throw new tn("INVALID_ARGS",`${n} file not found: ${a}`)}async function of(e){let t=op(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await om(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new tn("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof tn)throw t;throw new tn("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function om(e){try{return await l.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new tn("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new tn("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new tn("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new tn("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function oh(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath,iosXctestrunFile:i?.iosXctestrunFile,iosXctestDerivedDataPath:i?.iosXctestDerivedDataPath,iosXctestEnvDir:i?.iosXctestEnvDir,runnerLeaseContext:i?.runnerLeaseContext},o=await a$(e,a);return eI({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await eb("platform_command",async()=>await ov(e,o,t,r,n,i,a),{command:t,platform:e.platform})}let ow={open:({device:e,interactor:t,positionals:r,context:n})=>oy(e,t,r,n),close:async({device:e,interactor:t,positionals:r})=>{let n=r[0];return n?(await t.close(n),{app:n,...J(`Closed: ${n}`)}):("web"===e.platform&&await t.close(""),{closed:"session",...J("Closed session")})},press:({device:e,interactor:t,positionals:r,context:n})=>aJ(e,t,r,n),swipe:({device:e,interactor:t,positionals:r,context:n})=>a8(e,t,r,n),"swipe-preset":({device:e,interactor:t,positionals:r,context:n})=>a9(e,t,r,n),pan:({interactor:e,positionals:t})=>oe(e,t),fling:({interactor:e,positionals:t})=>ot(e,t),longpress:({interactor:e,positionals:t})=>aK(e,t),focus:({interactor:e,positionals:t})=>aH(e,t),type:({interactor:e,positionals:t,context:r})=>aW(e,t,r),fill:({interactor:e,positionals:t,context:r})=>az(e,t,r),scroll:({interactor:e,positionals:t,context:r})=>or(e,t,r),pinch:({device:e,interactor:t,positionals:r,context:n})=>oa(e,t,r,n),"rotate-gesture":({device:e,interactor:t,positionals:r})=>oo(e,t,r),"transform-gesture":({device:e,interactor:t,positionals:r})=>os(e,t,r),"trigger-app-event":({device:e,interactor:t,positionals:r,context:n})=>og(e,t,r,n),screenshot:({interactor:e,positionals:t,outPath:r,context:n})=>ob(e,t,r,n),viewport:({interactor:e,positionals:t})=>oA(e,t),back:async({interactor:e,context:t})=>(await e.back(t?.backMode),{action:"back",mode:t?.backMode??"in-app",...J("Back")}),home:async({interactor:e})=>(await e.home(),{action:"home",...J("Home")}),rotate:async({interactor:e,positionals:t})=>{let r=es(t[0]);return await e.rotate(r),{action:"rotate",orientation:r,...J(`Rotated to ${r}`)}},"app-switcher":async({interactor:e})=>(await e.appSwitcher(),{action:"app-switcher",...J("Opened app switcher")}),clipboard:({interactor:e,positionals:t})=>oS(e,t),keyboard:({device:e,positionals:t,context:r,runnerCtx:n})=>oI(e,t,r,n),settings:({device:e,interactor:t,positionals:r,context:n})=>ox(e,t,r,n),push:({device:e,positionals:t,context:r})=>oN(e,t,r),snapshot:({interactor:e,context:t})=>oD(e,t),read:({device:e,positionals:t,context:r})=>ol(e,t,r)};async function ov(e,t,r,n,i,a,o){let s=Object.hasOwn(ow,r)?ow[r]:void 0;if(!s)throw new tn("INVALID_ARGS",`Unknown command: ${r}`);return await s({device:e,interactor:t,positionals:n,outPath:i,context:a,runnerCtx:o})}async function oy(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new tn("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new tn("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new tn("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...J("Opened device")}}if(o&&(!eU(e)||"simulator"!==e.kind))throw new tn("UNSUPPORTED_OPERATION",aB);if("linux"===e.platform&&s&&s.length>0)throw new tn("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(tB(i))throw new tn("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!tB(a))throw new tn("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new tn("INVALID_ARGS",aG);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...J(`Opened: ${i}`)}}if(o&&tB(i))throw new tn("INVALID_ARGS",aG);if(n?.clearAppState){if(tB(i))throw new tn("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,terminateRunningApp:n?.terminateRunningApp}),{app:i,...o?{launchConsole:o}:{},...J(`Opened: ${i}`)}}async function og(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new tn("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!aU.test(t))throw new tn("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 tn("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 tn("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 tn("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof tn)throw t;throw new tn("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=eR(e),o=(i=(eU(n=e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:eE(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(!o)throw new tn("UNSUPPORTED_OPERATION",`No app event URL template configured for ${a}.`,{hint:`Set AGENT_DEVICE_${a.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let s=r?JSON.stringify(r):"",l=o.replaceAll("{event}",encodeURIComponent(t)).replaceAll("{payload}",encodeURIComponent(s)).replaceAll("{platform}",encodeURIComponent(a));if(l.length>4096)throw new tn("INVALID_ARGS","trigger-app-event URL exceeds maximum supported length",{hint:"Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.",length:l.length,maxLength:4096});return l}(e,i,a);return await t.open(o,{appBundleId:n?.appBundleId}),{event:i,eventUrl:o,transport:"deep-link",...J(`Triggered app event: ${i}`)}}async function ob(e,t,r,n){let i=t[0]??r??`./screenshot-${Date.now()}.png`;await l.mkdir(a.dirname(i),{recursive:!0});let o=Y(n);return await e.screenshot(i,{appBundleId:n?.appBundleId,fullscreen:o.fullscreen,normalizeStatusBar:o.normalizeStatusBar,stabilize:o.stabilize,surface:n?.surface,skipIosSimulatorBootCheck:n?.skipIosSimulatorBootCheck}),{path:i,...J(`Saved screenshot: ${i}`)}}async function oA(e,t){if(2!==t.length)throw new tn("INVALID_ARGS","viewport requires exactly two arguments: <width> <height>");let r=$(t[0],"width"),n=$(t[1],"height");if(!e.setViewport)throw new tn("UNSUPPORTED_OPERATION","viewport is not supported by this backend");return await e.setViewport(r,n),{width:r,height:n,...J(`Viewport set: ${r}x${n}`)}}async function oS(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new tn("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new tn("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new tn("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,...J("Clipboard updated")}}async function oI(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!eV(i))throw new tn("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new tn("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await o_(e,i);if(eU(e))return await oM(e,i,r,n);throw new tn("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function o_(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...J("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./9624.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("./9624.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 oM(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new tn("UNSUPPORTED_OPERATION","keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS");if("enter"===t||"return"===t){let{runAppleRunnerCommand:t}=await Promise.resolve(t9),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...J("Keyboard enter pressed")}}let{runAppleRunnerCommand:i}=await Promise.resolve(t9),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...J(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function ox(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new tn("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new tn("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?T({setting:i,state:"clear",...s},oP(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...J(`Cleared user data for ${r}`)}}if(!a)throw new tn("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:V(o,"latitude"),longitude:V(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?T({setting:i,state:a,...u},oP(u)??`Updated setting: ${i}`):{setting:i,state:a,...J(`Updated setting: ${i}`)}}async function oN(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new tn("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await of(i);if(eU(e)){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...J(`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,...J(`Pushed notification to ${n}`)}}async function oD(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,includeRects:t?.snapshotIncludeRects,surface:t?.surface})}function oP(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}function ok(e,t=e=>e){let r=new p;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 oE(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function oC(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 tn("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 tn("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 tn("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 tn("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 tn("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await oR(e,t,r)}}async function oR(e,t,r){let n=["/Applications","/System/Applications",a.join(m.homedir(),"Applications")],i=new Set;for(let t of n){let r=await l.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&&i.add(t)}}return oE((await Promise.all(Array.from(i).map(async e=>{let r=await oO(e,t).catch(()=>({})),n=r.bundleId;return n?{bundleId:n,name:r.appName??a.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function oO(e,t){for(let r of[a.join(e,"Contents","Info.plist"),a.join(e,"Info.plist")]){let e=await t(r),n=oT(e,"CFBundleIdentifier"),i=oT(e,"CFBundleDisplayName"),a=oT(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function oT(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let oL={runCommand:eS,simctl:{run:async(e,t)=>await eS("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await eS("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await oK(eS,e)},macosHost:oC(eS,async e=>await oK(eS,e)),whichCommand:em},oF=ok(oL,function(e){return"function"==typeof e?o$({runCommand:e}):o$(e)});function o$(e={}){let t={...oL,...e},r=e.plist??{readJson:async e=>await oK(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??oC(t.runCommand,async e=>await r.readJson(e))}}function oU(e){return oF.resolve(e)}async function oB(e,t){return await oF.run(e,t)}function oG(){return oF.hasScope()}async function oq(e,t,r){return await oU().runCommand(e,t,r)}async function oV(e,t){let r=oU(),[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 oq("xcrun",e,t)}async function oj(e){return await oU().plist?.readJson(e)??null}async function oK(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 oH="agent-device-macos-helper",oW="AGENT_DEVICE_MACOS_HELPER_BIN",oz=a.join(m.homedir(),".agent-device","macos-helper","current"),oX=a.join(oz,"manifest.json"),oJ=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function oZ(e){let t=e.trim();if(!oJ.test(t))throw new tn("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function oY(e,t){t.bundleId&&e.push("--bundle-id",oZ(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function oQ(){return function(e){let t=a.dirname(e);for(;;){let e=a.join(t,"macos-helper");if(s(a.join(e,"Package.swift")))return e;let r=a.dirname(t);if(r===t)break;t=r}throw new tn("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(c(import.meta.url))}async function o0(e){let t=await l.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=a.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await o0(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function o1(e){let t=await o0(e),r=i("sha256");for(let n of t)r.update(a.relative(e,n)),r.update("\0"),r.update(await l.readFile(n)),r.update("\0");let n=await oq("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return r.update("swift-version"),r.update("\0"),r.update(n.stdout||n.stderr||`exit:${n.exitCode}`),r.update("\0"),r.digest("hex")}async function o2(){try{let e=JSON.parse(await l.readFile(oX,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function o3(){let e=await eu(process.env[oW],oW);if(e)return e;let t=oQ(),r=await o1(t),n=a.join(oz,oH);try{if(await o2()===r)return await l.access(n),n}catch{}let i=a.join(oQ(),".build","release",oH);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await oq("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await l.mkdir(oz,{recursive:!0});let o=`${n}.tmp`;return await l.copyFile(i,o),await l.rename(o,n),await l.chmod(n,493),await l.writeFile(oX,`${JSON.stringify({fingerprint:r},null,2)}
4
- `,"utf8"),n}async function o5(){let e=process.env[oW]?.trim();if(e){let t=await eu(e,oW);if(t)return t}if(oG())return oH;if("darwin"!==process.platform)throw new tn("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await o3()}async function o4(e){return ev(await o5(),["audio-probe","--duration-ms",String(e.durationMs),"--bucket-ms",String(e.bucketMs),"--out",e.statusPath],{allowFailure:!0,captureOutput:!0})}async function o6(e){let t={allowFailure:!0,timeoutMs:3e4},r=oU().macosHelper,n=r?oH:await o5(),i=r?await r.run(e,t):await oq(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 tn("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 o8(){return await o6(["app","frontmost"])}async function o9(e){return await o6(["app","quit","--bundle-id",oZ(e)])}async function o7(e,t){return await o6(["permission",e,t])}async function se(e,t={}){let r=["alert",e];return oY(r,t),await o6(r)}async function st(e,t={}){let r=["snapshot","--surface",e];return oY(r,t),await o6(r)}async function sr(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return oY(n,r),await o6(n)}async function sn(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return oY(n,r),await o6(n)}async function si(e,t={}){let r=["screenshot","--out",e];return oY(r,t),t.fullscreen&&r.push("--fullscreen"),await o6(r)}let sa={"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"},so={runCommand:eS,whichCommand:em,desktop:su(eS,em),clipboard:sp(eS,em),screenshot:sf(eS,em)},ss=ok(so,function(e={}){let t={...so,...e};return{...t,desktop:e.desktop??su(t.runCommand,t.whichCommand),clipboard:e.clipboard??sp(t.runCommand,t.whichCommand),screenshot:e.screenshot??sf(t.runCommand,t.whichCommand)}});function sl(e){return ss.resolve(e)}async function sd(e,t){return await ss.run(e,t)}async function sc(e,t,r){return await sl().runCommand(e,t,r)}function su(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 tg(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 sp(e,t){return{async readText(){let r=sw[await sg(t,sm)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=sv[await sg(t,sm)](r);await e(n.cmd,n.args,n.options)}}}function sf(e,t){return{async capture(r){let n=sy[await sg(t,sh)](r);await e(n.cmd,n.args,n.options)}}}let sm={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."},sh={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."},sw={"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}}},sv={"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}})},sy={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 sg(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 tn("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let sb="atspi-dump.py",sA=null;async function sS(e,t={}){let r,n=sl().accessibility;if(n)return await n.captureTree(e,t);if("linux"!==process.platform)throw new tn("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await sl().whichCommand("python3"))throw new tn("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let i=t.maxNodes??1500,s=t.maxDepth??12,l=t.maxApps??24,d=[function(){if(sA)return sA;let e=a.dirname(c(import.meta.url));for(let t=0;t<5;t++){let r=a.join(e,"src","platforms","linux",sb);if(o.existsSync(r))return sA=r,r;if(0===t){let t=a.join(e,sb);if(o.existsSync(t))return sA=t,t}e=a.dirname(e)}throw new tn("TOOL_MISSING",`Cannot find ${sb}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(i),"--max-depth",String(s),"--max-apps",String(l)],u=await sc("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 tn("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new tn("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new tn("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new tn("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=sa[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 sI(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 sS(t);return{nodes:r.nodes,truncated:r.truncated}}async function s_(e,t,r){let{nodes:n}=await sI(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:sM(e.rect)-sM(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 sM(e){return(e?.width??0)*(e?.height??0)}let sx=[250,400,600];function sN(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?sE(n?.nodes??[]):void 0,routeComparable:i}}function sD(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 sP(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function sk(e){return"press"===e||"click"===e||"back"===e||"open"===e}function sE(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 sC(e){return N(e)}function sR(e,t){let r=sC(e),n=t?.lease??t?.deviceLease??void 0;return tK({tenantId:r.tenantId??n?.tenantId,runId:r.runId??n?.runId,leaseId:r.leaseId??n?.leaseId,leaseTtlMs:r.leaseTtlMs,leaseBackend:r.leaseBackend??n?.leaseBackend,leaseProvider:r.leaseProvider??n?.leaseProvider,deviceKey:r.deviceKey??n?.deviceKey,clientId:r.clientId??n?.clientId})}function sO(e){return"string"==typeof e&&e.trim().length>0?e.trim():void 0}function sT(e,t,r,n,i,a){let o,s;return{requestId:i??ey().requestId,appBundleId:r,runnerLeaseContext:(o=({meta:a}).meta,Object.keys(s=tK({leaseId:sO(o?.leaseId),clientId:sO(o?.clientId),tenantId:sO(o?.tenantId),runId:sO(o?.runId),leaseProvider:sO(o?.leaseProvider),deviceKey:sO(o?.deviceKey)})).length>0?s:void 0),activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,iosXctestrunFile:t?.iosXctestrunFile,iosXctestDerivedDataPath:t?.iosXctestDerivedDataPath,iosXctestEnvDir:t?.iosXctestEnvDir,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...er(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,durationMs:t?.durationMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:k(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function sL(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!eT(r.device))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=sB(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:sU(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function sF(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function s$(e){let{session:t,pending:r,snapshot:n}=e,i=sG(r.preSignature,sB(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await oh(t.device,r.command,r.positionals,r.flags?.out,{...sT(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 sU(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function sB(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 sG(e,t){return 0===e.length||0===t.length?"ambiguous":sq(e,t)?"unchanged":"changed"}function sq(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 sV(e,t,r=[],n){var i,a,o;eT(e.device)&&(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 sj(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function sK(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!eT(t.device)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=sB(e.readSnapshot(o).nodes);for(;a<2||Date.now()-i<1500;){await tg(200),a+=1;let l=await r(),d=sB(e.readSnapshot(l).nodes);if(sq(s,d))return sj(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 sj(t),eI({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}let sH=new WeakMap;function sW(e,t){if(!e[t])return[];let r=sJ(e)[t]??t+1;return e.slice(t+1,r)}function sz(e,t,r){let n=sJ(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function sX(e,t,r){let n=sJ(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function sJ(e){let t=sH.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 sH.set(e,r),r}function sZ(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 sY(e,t){let r=tZ(e.type??""),n=e.label?.trim();return!!(sQ(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function sQ(e){return"button"===tZ(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function s0(e){let t=tZ(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function s1(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function s2(e){let t;for(let i of e){var r,n;let e=tZ(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||s3(r)>s3(n)))&&(t=i.rect)}return t}function s3(e){return e?e.width*e.height:0}function s5(e){let t=tZ(e.type??"");return"scrollview"===t||"scrollarea"===t}function s4(e,t){return!0===e||!!t||void 0}function s6(e,t,r,n){sX(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=tZ(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function s8(e,t,r,n){sX(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=tZ((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function s9(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===tZ(n.type??"")&&t(n,i,r)}}function s7(e,t,r,n){for(let i of e)(sY(i,t)||n&&lt(i,n))&&r.add(i.index)}function le(e,t,r){if("button"!==tZ(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&K(e.rect,t.rect)}function lt(e,t){return"button"===tZ(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&K(e.rect,t.rect)}let lr=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=s2(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"===tZ(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),sX(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==tZ(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&&H(t))})(r)&&function(e,t,r){var n,i,a,o;s0(e.type)||r.suppressedIndexes.add(e.index);let s=C(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&s0(e.type)?e:null)??sZ(e,t,e=>s0(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,s1(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:s4(i.hiddenContentAbove,o.above),hiddenContentBelow:s4(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"!==tZ(n.type??""))continue;if("Search"===n.label){s8(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=sz(e,r,e=>"searchfield"===tZ(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),s8(e,r,i.index,t))}})(e,o),r=e,n=o,s9(r,(e,t,i)=>{sz(r,i,r=>{let n;return("button"===(n=tZ(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(K(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=tZ(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,s9(i,(e,t,r)=>{let n;et(e)&&D(e,(n=[],sX(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=tZ(r.type??"");if("statictext"===a||"link"===a)return s6(e,t,n,i);if("other"===a){if(function(e,t,r){return!!sz(e,t,e=>{let t=tZ(e.type??"");return("link"===t||"searchfield"===t||s0(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);s6(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=s2(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==tZ(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)||!sZ(e,t,s5)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=s3(e),i=s3(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&s1(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=tZ(r.type??"");if("button"===a)return s7(sW(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=sW(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==tZ(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=>le(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&s1(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&&(le(a,t,r)||lt(a,t)||function(e,t){if("switch"!==tZ(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||sY(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=>le(e,t,r));if(!i){e.some(sQ)&&s7(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&s1(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),s7(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function ln(e){let t=await li(e);if(t)return t;let r=await lp(e);return sP(e.session),{snapshot:r.snapshot,...r.annotations}}async function li(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!eT(e.device)||Date.now()-t.markedAt>3e4?void sF(e):t}(e.session);if(t&&e.session)return await la({...e,session:e.session},t);if(eT(e.device)&&e.session?.postGestureStabilization)return await lc({...e,session:e.session});let r=sD(e.session);if(r&&"android"===e.device.platform)return await ll(e,r)}async function la(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await lo(e,t,await lu(e)),l=await s$({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await lo(e,t,await lu(e)),l=await s$({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(sF(i),s=await sK({session:i,initial:s,capture:async()=>await lu(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.annotations.freshness?.staleAfterRetries!==!0&&sP(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 lo(e,t,r){let n=r;return"unchanged"!==sG(t.preSignature,sB(n.snapshot.nodes))?n:(await tg(500),n=await lu(e))}async function ls(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await sI(r?.surface);return lh({nodes:e.nodes,truncated:e.truncated,backend:"linux-atspi"},{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o})}return eE(t)&&r?.surface&&"app"!==r.surface?lh(await st(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await oh(t,"snapshot",[],i,{...sT(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath),snapshotIncludeRects:e.includeRects})}async function ll(e,t){let r=await ld(e,t);return{snapshot:r.snapshot,...r.annotations}}async function ld(e,t){let r=await lp(e),n=lf(r,t,e),i=0,a=t.markedAt+1500;for(let o of sx){if(!n)break;let s=a-Date.now();if(s<=0)break;await tg(Math.min(o,s)),r=await lp(e),i+=1,n=lf(r,t,e)}n||sP(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,...en({freshness:o})}}}async function lc(e){let t=await sK({session:e.session,capture:async()=>await lu(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,...t.annotations}}async function lu(e){let t=sD(e.session);return t&&"android"===e.device.platform?await ld(e,t):await lp(e)}async function lp(e){var t;let r=Date.now(),n=await ls(e);return tw(e.session,{durationMs:Date.now()-r,backend:n.backend,platform:eR(e.device)}),{data:n,snapshot:lm(n,void 0===(t=e).snapshotScope?t.flags:{...t.flags,snapshotScope:t.snapshotScope}),annotations:en(n)}}function lf(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&&sk(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=sE(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 lm(e,t){var r,n,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=ee(s?o:tY(o)),d=t?.snapshotScope&&e?.backend!=="macos-helper"?lw(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 lr)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=eG(s?c:B(c)),p=en(e).quality;return{nodes:u,truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,...p?{snapshotQuality:p}:{},presentationKey:eB(ex(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function lh(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=lw(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:lv(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=lv(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function lw(e,t){let r=tQ(eG(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 lv(a,i)}function lv(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 ly(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return ay("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=eC(e.trim());if(!n)return ay("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=eN(e.nodes,n);if(r=t?t0(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:ay("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function lg(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function lb(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 lA(e){let{session:t,sessionName:r,outPath:n,outputPlacement:i,dispatchContext:o}=e,s=eY({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:eR(t.device),captureScreenshot:async(e,i,a)=>{let o={...n,...er(a),surface:a?.surface,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck??(eU(t.device)&&"simulator"===t.device.kind)};return"out"===r?ts(await oh(t.device,"screenshot",[],i,o)):ts(await oh(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:i,dispatchContext:o}),artifacts:{resolveInput:async()=>{throw new tn("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await l.mkdtemp(a.join(m.tmpdir(),"agent-device-screenshot-")),r=a.join(t,"screenshot.png")),await l.mkdir(a.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await l.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await l.mkdtemp(a.join(m.tmpdir(),`${e.prefix}-`));return{path:a.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await l.rm(t,{recursive:!0,force:!0})}}}},sessions:lb({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eQ()});return await s.capture.screenshot({session:r,requestId:o.requestId,appBundleId:t.appBundleId,...Y(o),surface:t.surface,...n?{out:{kind:"path",path:n}}:{}})}function*lS(e){let t=/<node\b[^>]*>/g,r=t.exec(e);for(;r;)yield lI(r[0]),r=t.exec(e)}function lI(e){let t,r,n,i,a,o=(t=function(e){let t=new Map,r=e.indexOf(" "),n=e.lastIndexOf(">");if(r<0||n<=r)return t;let i=r;for(;i<n;){let r=function(e,t,r){var n,i;if((t=lM(e,t,r))>=r||"/"===(n=e[t])||">"===n)return;let a=t;t=function(e,t,r){for(var n;t<r&&!("="===(n=e[t]??"")||"/"===n||">"===n||lx(n));)t+=1;return t}(e,t,r);let o=e.slice(a,t);if(t=lM(e,t,r),!o||"="!==e[t])return;t=lM(e,t+1,r);let s=e[t];if('"'!==(i=s)&&"'"!==i)return;let l=t+1,d=e.indexOf(s,l);if(!(d<0)&&!(d>=r))return{name:o,value:function(e){let t="",r=0;for(;r<e.length;){let n=e.indexOf("&",r);if(n<0){t+=e.slice(r);break}t+=e.slice(r,n);let i=e.indexOf(";",n+1);if(i<0){t+=e.slice(n);break}t+=function(e){switch(e){case"amp":return"&";case"lt":return"<";case"gt":return">";case"quot":return'"';case"apos":return"'";default:return function(e){if(!e.startsWith("#"))return;let t=e[1]?.toLowerCase()==="x"?16:10,r=16===t?e.slice(2):e.slice(1);if(!r||!function(e,t){for(let r of e){let e=r.charCodeAt(0),n=e>=48&&e<=57;if(10===t){if(!n)return!1;continue}let i=e>=65&&e<=70,a=e>=97&&e<=102;if(!n&&!i&&!a)return!1}return!0}(r,t))return;let n=Number.parseInt(r,t);if(Number.isFinite(n))try{return String.fromCodePoint(n)}catch{return}}(e)}}(e.slice(n+1,i))??e.slice(n,i+1),r=i+1}return t}(e.slice(l,d)),nextCursor:d+1}}(e,i,n);if(!r)break;t.set(r.name,r.value),i=r.nextCursor}return t}(e),r=e=>{let r=lN(t,e);if(null!==r)return"true"===r},n=(e,r)=>{let n=(e=>{let r=lN(t,e);if(null===r||""===r.trim())return;let n=Number(r);return Number.isFinite(n)?n:void 0})(r);return void 0===n?{}:{[e]:n}},i=(e,t)=>{let n=r(t);return void 0===n?{}:{[e]:n}},{text:lN(t,"text"),desc:lN(t,"content-desc"),resourceId:lN(t,"resource-id"),packageName:lN(t,"package"),className:lN(t,"class"),bounds:lN(t,"bounds"),clickable:r("clickable"),enabled:r("enabled"),focusable:r("focusable"),focused:r("focused"),password:r("password"),...i("visibleToUser","visible-to-user"),...n("drawingOrder","drawing-order"),...i("scrollable","scrollable"),...i("canScrollForward","can-scroll-forward"),...i("canScrollBackward","can-scroll-backward"),...n("windowIndex","window-index"),...n("windowType","window-type"),...n("windowLayer","window-layer"),...i("windowActive","window-active"),...i("windowFocused","window-focused"),...void 0===(a=nG(lN(t,"window-bounds")))?{}:{windowRect:a}}),s=nG(o.bounds);return{...o,...s?{rect:s}:{}}}function l_(e,t,r){let n={nodes:[],sourceNodes:[],...void 0!==t?{maxNodes:t}:{},maxDepth:r.depth??1/0,options:r,analysis:function(e){let t=0,r=0,n=[...e.children];for(;n.length>0;){let e=n.pop();t+=1,r=Math.max(r,e.depth),n.push(...e.children)}return{rawNodeCount:t,maxDepth:r}}(e),interactiveDescendantMemo:new Map,truncated:!1},i=r.scope?function(e,t){let r=t.toLowerCase(),n=[...e.children],i=0;for(;i<n.length;){let e=n[i++],t=e.label?.toLowerCase()??"",a=e.value?.toLowerCase()??"",o=e.identifier?.toLowerCase()??"";if(t.includes(r)||a.includes(r)||o.includes(r))return e;n.push(...e.children)}return null}(e,r.scope):null;for(let t of i?[i]:e.children)if(function e(t,r,n,i,a=!1,o=!1){if(void 0!==t.maxNodes&&t.nodes.length>=t.maxNodes){t.truncated=!0;return}if(n>t.maxDepth)return;let s=t.options.raw||function(e,t,r,n,i){var a,o,s;if(!1===e.visibleToUser)return!1;let l=function(e){let t=lR(e.type),r=!!(e.label&&e.label.trim().length>0),n=!!(e.identifier&&e.identifier.trim().length>0);return{type:t,hasMeaningfulText:r&&!lO(e.label??""),hasMeaningfulId:n&&!lO(e.identifier??""),isStructural:function(e){let t=e.split(".").pop()??e;return t.includes("layout")||"viewgroup"===t||"view"===t}(t),isVisual:"imageview"===t||"imagebutton"===t}}(e);return t.interactiveOnly?function(e,t,r,n,i){var a,o,s,l,d;return!((a=e).rect&&(a.rect.width<=0||a.rect.height<=0))&&(!!(e.hittable||R(t.type)&&n)||(o=t,s=r,l=n,d=i,(!!o.hasMeaningfulText||!!o.hasMeaningfulId)&&!o.isVisual&&(!o.isStructural||!!d)&&(s||l||d)))}(e,l,r,n,i):!l.isStructural&&!l.isVisual||(a=e,o=l,s=n,!!a.hittable||!!o.hasMeaningfulText||!!o.hasMeaningfulId||s)}(r,t.options,a,function e(t,r){let n=t.interactiveDescendantMemo.get(r);if(void 0!==n)return n;for(let n of r.children)if(!1!==n.visibleToUser&&(n.hittable||e(t,n)))return t.interactiveDescendantMemo.set(r,!0),!0;return t.interactiveDescendantMemo.set(r,!1),!1}(t,r),o)?function(e,t,r,n){let i=e.nodes.length;return e.sourceNodes.push(t),e.nodes.push({index:i,type:t.type??void 0,label:t.label??void 0,value:t.value??void 0,identifier:t.identifier??void 0,bundleId:t.packageName??void 0,rect:t.rect,enabled:t.enabled,visibleToUser:t.visibleToUser,hittable:t.hittable,depth:r,parentIndex:n,...t.hiddenContentAbove?{hiddenContentAbove:!0}:{},...t.hiddenContentBelow?{hiddenContentBelow:!0}:{}}),i}(t,r,n,i):i,l=a||!!r.hittable,d=o||function(e){if(!e)return!1;let t=lR(e);return t.includes("recyclerview")||t.includes("listview")||t.includes("gridview")}(r.type);for(let i of r.children)if(e(t,i,n+1,s,l,d),t.truncated)return}(n,t,0),n.truncated)break;let a={nodes:n.nodes,sourceNodes:n.sourceNodes,analysis:n.analysis};return n.truncated?{...a,truncated:!0}:a}function lM(e,t,r){for(;t<r&&lx(e[t]??"");)t+=1;return t}function lx(e){return" "===e||"\n"===e||"\r"===e||" "===e}function lN(e,t){return e.get(t)??null}function lD(e){let t={type:null,label:null,value:null,identifier:null,packageName:null,depth:-1,children:[]},r=[t],n=/<node\b[^>]*>|<\/node>/g,i=n.exec(e);for(;i;){let t=i[0];if(t.startsWith("</node")){r.length>1&&r.pop(),i=n.exec(e);continue}let a=lI(t),o=r[r.length-1],s={type:a.className,label:a.text||a.desc,value:a.text,identifier:a.resourceId,packageName:a.packageName,rect:a.rect,enabled:a.enabled,visibleToUser:a.visibleToUser,drawingOrder:a.drawingOrder,hittable:a.clickable??a.focusable,scrollable:a.scrollable,canScrollForward:a.canScrollForward,canScrollBackward:a.canScrollBackward,windowIndex:a.windowIndex,windowType:a.windowType,windowLayer:a.windowLayer,windowActive:a.windowActive,windowFocused:a.windowFocused,windowRect:a.windowRect,depth:o.depth+1,parentIndex:void 0,children:[]};o.children.push(s),t.endsWith("/>")||r.push(s),i=n.exec(e)}return function e(t){let r=0;for(let n of t.children)!1!==n.visibleToUser&&(e(n),t.children[r]=n,r+=1);r<t.children.length&&(t.children.length=r)}(t),function(e){let t,r=e.children.filter(lk);if(r.length<2)return;let n=r.filter(e=>lE(e)&&lC(e));if(0===n.length)return;let i=(t=n.map(e=>e.windowLayer).filter(e=>void 0!==e)).length>0?Math.max(...t):void 0;e.children=e.children.filter(e=>!lE(e)||!!lC(e)&&(void 0===i||e.windowLayer===i))}(t),function e(t,r){for(let n of t.children)e(n,r);if(t.children.length<2)return;let n=t.children,i=n.filter(e=>{var t,n;return t=e,n=r,!1!==t.visibleToUser&&void 0!==t.drawingOrder&&lP(t)&&(function(e){if(!1===e.visibleToUser)return!1;if(e.hittable)return!0;let t=e.label?.trim()??"";if(t&&!lO(t))return!0;let r=e.identifier?.trim()??"";return!(!r||lO(r))}(t)||function e(t,r){let n=r.actionableContentMemo.get(t);if(void 0!==n)return n;let i=t.children.some(t=>!1!==t.visibleToUser&&(!!t.hittable||e(t,r)));return r.actionableContentMemo.set(t,i),i}(t,n))});0!==i.length&&(t.children=n.filter(e=>!function(e,t){if(!1===e.visibleToUser||void 0===e.drawingOrder||!lP(e))return!1;for(let r of t)if(r!==e&&!(r.drawingOrder<=e.drawingOrder)&&function(e,t){let r=t.width*t.height;return r<=0?0:P(e,t)/r}(r.rect,e.rect)>=.9)return!0;return!1}(e,i)))}(t,{actionableContentMemo:new WeakMap}),function(e){let t=[...e.children];for(;t.length>0;){let e=t.pop();t.push(...e.children),function(e){if(!e.scrollable||!R(e.type)||`${e.type??""}`.toLowerCase().includes("horizontalscrollview"))return!1;let t=function(e){if(!e.rect||0===e.children.length)return null;let t=e.children.map(e=>e.rect).filter(e=>void 0!==e);if(0===t.length)return null;let r=Math.min(...t.map(e=>e.x)),n=Math.max(...t.map(e=>e.x+e.width)),i=Math.min(...t.map(e=>e.y)),a=Math.max(...t.map(e=>e.y+e.height));return{horizontal:Math.max(0,n-r-e.rect.width),vertical:Math.max(0,a-i-e.rect.height)}}(e);return!t||!(t.horizontal>t.vertical)||!(t.horizontal>16)}(e)&&(e.canScrollBackward&&(e.hiddenContentAbove=!0),e.canScrollForward&&(e.hiddenContentBelow=!0))}}(t),t}function lP(e){return!!(e.rect&&e.rect.width>0&&e.rect.height>0)}function lk(e){return void 0!==e.windowIndex||void 0!==e.windowType}function lE(e){return 1===e.windowType}function lC(e){return!0===e.windowActive||!0===e.windowFocused}function lR(e){return e?e.toLowerCase():""}function lO(e){let t=e.trim();return!!t&&/^[\w.]+:id\/[\w.-]+$/i.test(t)}function lT(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function lL(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 lF(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}function l$(e){var t;let r={status:[],results:[],currentStatus:null,currentResult:null};for(let t of e.split(/\r?\n/))!function(e,t){if(e.startsWith("INSTRUMENTATION_STATUS: ")){t.currentStatus??={},lG(e.slice(24),t.currentStatus);return}if(e.startsWith("INSTRUMENTATION_STATUS_CODE: "))return lU(t);if(e.startsWith("INSTRUMENTATION_RESULT: ")){t.currentResult??={},lG(e.slice(24),t.currentResult);return}e.startsWith("INSTRUMENTATION_CODE: ")&&lB(t)}(t,r);return lU(t=r),lB(t),{status:r.status,results:r.results}}function lU(e){e.currentStatus&&(e.status.push(e.currentStatus),e.currentStatus=null)}function lB(e){e.currentResult&&(e.results.push(e.currentResult),e.currentResult=null)}function lG(e,t){let r=e.indexOf("=");r<0||(t[e.slice(0,r)]=e.slice(r+1))}function lq(e){if(void 0===e)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function lV(e){return"true"===e||"false"!==e&&void 0}function lj(e,t,r){if("number"!=typeof e||!Number.isInteger(e))throw new tn("INVALID_ARGS",`Android ${r} manifest ${t} must be an integer.`);return e}function lK(e,t,r,n){if(e!==r)throw new tn("INVALID_ARGS",`Android ${n} manifest ${t} must be "${r}".`);return r}let lH="android-snapshot-helper-v1",lW="uiautomator-xml",lz={"-r":"replace","-t":"allowTestPackages","-d":"allowDowngrade","-g":"grantPermissions"};async function lX(e){let t=await lQ(e.apkPath);if(t!==e.manifest.sha256)throw new tn("COMMAND_FAILED","Android snapshot helper APK checksum mismatch",{apkPath:e.apkPath,expectedSha256:e.manifest.sha256,actualSha256:t})}function lJ(e,t){return lj(e,t,"snapshot helper")}function lZ(e,t,r){return lK(e,t,r,"snapshot helper")}function lY(e){let t=function(e,t){if(!Array.isArray(e)||!e.every(e=>"string"==typeof e))throw new tn("INVALID_ARGS",`Android snapshot helper manifest ${t} must be a string array.`);return e}(e,"installArgs");if("install"!==t[0])throw new tn("INVALID_ARGS",'Android snapshot helper manifest installArgs must start with "install".');if(t.some(e=>e.includes("\0")))throw new tn("INVALID_ARGS","Android snapshot helper manifest installArgs must not contain null bytes.");let r=t.slice(1).find(e=>void 0===l2(e));if(r)throw new tn("INVALID_ARGS",`Android snapshot helper manifest installArgs contains unsupported install flag "${r}".`);return t}async function lQ(e){return await new Promise((t,r)=>{let i=n.createHash("sha256"),a=o.createReadStream(e);a.on("error",r),a.on("data",e=>i.update(e)),a.on("end",()=>t(i.digest("hex")))})}function l0(e,t){if("string"!=typeof e||0===e.trim().length)throw new tn("INVALID_ARGS",`Android snapshot helper manifest ${t} is required.`);return e}function l1(e){return"string"==typeof e&&e.trim().length>0?e:void 0}function l2(e){if(Object.hasOwn(lz,e))return lz[e]}async function l3(e){let t=l5(e),r=await e.adb(l6(t),{allowFailure:!0,timeoutMs:t.commandTimeoutMs}),{output:n,cleanupDone:i}=await l8(e,t,r);if(t.outputPath&&!i&&await dt(e.adb,t.outputPath),0!==r.exitCode)throw new tn("COMMAND_FAILED","Android snapshot helper failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode,helper:n.metadata});return n}function l5(e){let t=l4(e.timeoutMs,8e3),r=l4(e.packageName,"com.callstack.agentdevice.snapshothelper");return{waitForIdleTimeoutMs:l4(e.waitForIdleTimeoutMs,500),waitForIdleQuietMs:l4(e.waitForIdleQuietMs,100),timeoutMs:t,commandTimeoutMs:l4(e.commandTimeoutMs,t+5e3),maxDepth:l4(e.maxDepth,128),maxNodes:l4(e.maxNodes,5e3),packageName:r,runner:l4(e.instrumentationRunner,`${r}/.SnapshotInstrumentation`),...e.outputPath?{outputPath:e.outputPath}:{},...void 0!==e.emitChunks?{emitChunks:e.emitChunks}:{}}}function l4(e,t){return void 0===e?t:e}function l6(e){return["shell","am","instrument","-w","-e","waitForIdleTimeoutMs",String(e.waitForIdleTimeoutMs),"-e","waitForIdleQuietMs",String(e.waitForIdleQuietMs),"-e","timeoutMs",String(e.timeoutMs),"-e","maxDepth",String(e.maxDepth),"-e","maxNodes",String(e.maxNodes),...e.outputPath?["-e","outputPath",e.outputPath]:[],...void 0!==e.emitChunks?["-e","emitChunks",String(e.emitChunks)]:[],e.runner]}async function l8(e,t,r){try{var n;let e,t;return{output:(n=`${r.stdout}
5
- ${r.stderr}`,e=l$(n),t=dr(e.results),{xml:function(e,t){if(0===e.length)throw new tn("COMMAND_FAILED","Android snapshot helper did not return XML chunks",{helper:t});let r=function(e){let t=e[0]?.count??e.length;if(t<1||e.length!==t||e.some(e=>e.count!==t))throw new tn("COMMAND_FAILED","Android snapshot helper returned incomplete XML chunks",{expectedChunks:t,actualChunks:e.length});return t}(e),n=Buffer.concat(function(e,t){let r=[];for(let n=0;n<t;n+=1){let i=e.get(n);if(void 0===i)throw new tn("COMMAND_FAILED","Android snapshot helper returned incomplete XML chunks",{missingChunkIndex:n,expectedChunks:t});r.push(Buffer.from(i,"base64"))}return r}(function(e,t){let r=new Map;for(let n of e){if(void 0===n.index||n.index<0||n.index>=t)throw new tn("COMMAND_FAILED","Android snapshot helper returned invalid chunk index",{chunkIndex:n.index,expectedChunks:t});if(r.has(n.index))throw new tn("COMMAND_FAILED","Android snapshot helper returned duplicate XML chunks",{chunkIndex:n.index});r.set(n.index,n.payloadBase64)}return r}(e,r),r)).toString("utf8");if(!n.includes("<hierarchy")||!n.includes("</hierarchy>"))throw new tn("COMMAND_FAILED","Android snapshot helper output did not contain XML",{xml:n});return n}(function(e){let t=[];for(let r of e){if(r.agentDeviceProtocol!==lH||r.outputFormat!==lW)continue;let{payloadBase64:e}=r;void 0!==e&&t.push({index:di(r.chunkIndex),count:di(r.chunkCount),payloadBase64:e})}return t}(e.status),t),metadata:{...dn(t),transport:"instrumentation"}}),cleanupDone:!1}}catch(n){return await l9(e,t,r,n)}}async function l9(e,t,r,n){if(n instanceof tn&&0!==r.exitCode&&n.details?.helper)throw n;let i=await l7(e,t,r);if(i)return{output:i,cleanupDone:!0};throw new tn("COMMAND_FAILED",0===r.exitCode?"Android snapshot helper output could not be parsed":"Android snapshot helper failed before returning parseable output",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode},n)}async function l7(e,t,r){if(0===r.exitCode&&t.outputPath){var n;return await de(e.adb,t.outputPath,function(e){try{let t=l$(e);return dn(dr(t.results))}catch{return null}}(`${r.stdout}
6
- ${r.stderr}`)??{outputFormat:lW,waitForIdleTimeoutMs:(n=t).waitForIdleTimeoutMs,waitForIdleQuietMs:n.waitForIdleQuietMs,timeoutMs:n.timeoutMs,maxDepth:n.maxDepth,maxNodes:n.maxNodes,transport:"instrumentation"})}}async function de(e,t,r){let n;try{var i;n=await e((i=t,["shell","sh","-c",'cat "$1"; status=$?; rm -f "$1"; exit "$status"',"agent-device-snapshot-helper-output",i]),{allowFailure:!0,timeoutMs:5e3})}catch{return}if(0!==n.exitCode)return;let a=n.stdout.trim();if(a.includes("<hierarchy")&&a.includes("</hierarchy>"))return{xml:a,metadata:r}}async function dt(e,t){try{await e(["shell","rm","-f",t],{allowFailure:!0,timeoutMs:5e3})}catch{}}function dr(e){let t=e.find(e=>e.agentDeviceProtocol===lH);if(!t)throw new tn("COMMAND_FAILED","Android snapshot helper did not return a final result");if("true"!==t.ok){var r;throw new tn("COMMAND_FAILED",(r=t).message&&"null"!==r.message?r.message:r.errorType||"Android snapshot helper returned an error",{errorType:t.errorType,helper:t})}return t}function dn(e){var t;return{helperApiVersion:e.helperApiVersion,outputFormat:lW,waitForIdleTimeoutMs:di(e.waitForIdleTimeoutMs),waitForIdleQuietMs:di(e.waitForIdleQuietMs),timeoutMs:di(e.timeoutMs),maxDepth:di(e.maxDepth),maxNodes:di(e.maxNodes),rootPresent:da(e.rootPresent),captureMode:"interactive-windows"===(t=e.captureMode)||"active-window"===t?t:void 0,windowCount:di(e.windowCount),nodeCount:di(e.nodeCount),truncated:da(e.truncated),elapsedMs:di(e.elapsedMs)}}let di=lq,da=lV,ds=new Map,dl=new Map;async function dd(e){var t,r,n;let i;if(!(void 0===(i=process.env.AGENT_DEVICE_ANDROID_SNAPSHOT_HELPER_SESSION)||!/^(0|false|no|off)$/i.test(i))||!e.adbProvider?.spawn)return;let a=l5(e),o=e.deviceKey??"android:default",s=(t=o,r=a,n=e,JSON.stringify({deviceKey:t,packageName:r.packageName,runner:r.runner,helperVersion:n.helperVersion,helperVersionCode:n.helperVersionCode,waitForIdleTimeoutMs:r.waitForIdleTimeoutMs,waitForIdleQuietMs:r.waitForIdleQuietMs,timeoutMs:r.timeoutMs,maxDepth:r.maxDepth,maxNodes:r.maxNodes}));if(dl.get(o)===s)return;let l=ds.get(o);if(l&&l.identity!==s&&(await dc(o),l=void 0),!l)try{l=await df({deviceKey:o,identity:s,options:e,resolved:a})}catch(e){dl.set(o,s),eI({level:"warn",phase:"android_snapshot_helper_session_disabled",data:{deviceKey:o,reason:e instanceof Error?e.message:String(e)}});return}try{let e=l.capturedCount>0,t=await dh(l,a);return l.capturedCount+=1,{xml:t.xml,metadata:{...t.metadata,transport:"persistent-session",sessionReused:e}}}catch(e){throw await dc(o),e}}async function dc(e){let t=ds.get(e);if(t){ds.delete(e);try{await dw(t,`quit ${Date.now()}`,1e3)}catch{}try{await t.process.kill("SIGTERM")}catch{}await dm(t.process,2e3);try{await dv(t)}catch{}eI({phase:"android_snapshot_helper_session_stop",data:{deviceKey:e,port:t.port,capturedCount:t.capturedCount,lifetimeMs:Date.now()-t.startedAtMs}})}}async function du(e){await dc(dp(e))}function dp(e){return`${e.platform}:${e.id}`}async function df(e){let t=await new Promise((e,t)=>{let r=y.createServer();r.unref(),r.on("error",t),r.listen(0,"127.0.0.1",()=>{let n=r.address();if(!n||"string"==typeof n)return void r.close(()=>t(Error("Failed to allocate a local TCP port")));let i=n.port;r.close(()=>e(i))})});await e.options.adb(["forward",`tcp:${t}`,`tcp:${t}`],{allowFailure:!1,timeoutMs:5e3});let r=l6({...e.resolved,outputPath:void 0,emitChunks:!1}),n=r[r.length-1];if(!n)throw new tn("INVALID_ARGS","Android snapshot helper runner was not resolved");let i=[...r.slice(0,-1),"-e","sessionPort",String(t),n],a=e.options.adbProvider.spawn(i,{allowFailure:!0,captureOutput:!1}),o={identity:e.identity,deviceKey:e.deviceKey,port:t,adb:e.options.adb,process:a,startedAtMs:Date.now(),capturedCount:0};try{var s;return await (s=a,new Promise((e,t)=>{let r="",n=setTimeout(()=>{t(new tn("COMMAND_FAILED","Android snapshot helper session did not become ready",{output:r,timeoutMs:1e4}))},1e4),i=t=>{(r+=t.toString()).includes(`agentDeviceProtocol=${lH}`)&&r.includes("sessionReady=true")&&(clearTimeout(n),e())};s.stdout?.on("data",i),s.stderr?.on("data",i),s.once("exit",(e,i)=>{clearTimeout(n),t(new tn("COMMAND_FAILED","Android snapshot helper session exited before ready",{output:r,exitCode:e,signal:i}))}),s.on("error",e=>{clearTimeout(n),t(e)})})),ds.set(e.deviceKey,o),eI({phase:"android_snapshot_helper_session_ready",data:{deviceKey:e.deviceKey,port:t,packageName:e.resolved.packageName,runner:e.resolved.runner}}),o}catch(e){await dv(o);try{a.kill("SIGTERM")}catch{}throw await dm(a,2e3),e}}function dm(e,t){return new Promise(r=>{let n=setTimeout(r,t);e.once("close",()=>{clearTimeout(n),r()}),e.once("exit",()=>{clearTimeout(n),r()})})}async function dh(e,t){let r=`snapshot-${Date.now()}-${Math.random().toString(16).slice(2)}`,n=Math.min(t.commandTimeoutMs,Math.max(t.timeoutMs+1e4,3e3));return function(e,t){var r;let{headers:n,xml:i}=function(e){let t=e.indexOf("\n\n");if(t<0)throw new tn("COMMAND_FAILED","Android snapshot helper session returned malformed output",{response:e});return{headers:function(e){let t={};for(let r of e.split(/\r?\n/)){let e=r.indexOf("=");e<0||(t[r.slice(0,e)]=r.slice(e+1))}return t}(e.slice(0,t)),xml:e.slice(t+2)}}(e);return function(e,t){if(e.agentDeviceProtocol!==lH)throw new tn("COMMAND_FAILED","Android snapshot helper session returned wrong protocol",{headers:e});if(e.outputFormat!==lW)throw new tn("COMMAND_FAILED","Android snapshot helper session returned wrong output format",{headers:e});if(e.requestId!==t)throw new tn("COMMAND_FAILED","Android snapshot helper session returned stale output",{headers:e,requestId:t});if("true"!==e.ok)throw new tn("COMMAND_FAILED",e.message||e.errorType||"Android snapshot helper session returned an error",{helper:e})}(n,t),function(e,t){let r=lq(e.byteLength);if(void 0!==r&&Buffer.byteLength(t,"utf8")!==r)throw new tn("COMMAND_FAILED","Android snapshot helper session returned truncated XML",{headers:e,actualByteLength:Buffer.byteLength(t,"utf8")});if(!t.includes("<hierarchy")||!t.includes("</hierarchy>"))throw new tn("COMMAND_FAILED","Android snapshot helper session did not return XML",{headers:e,xml:t})}(n,i),{xml:i,metadata:{helperApiVersion:(r=n).helperApiVersion,outputFormat:lW,waitForIdleTimeoutMs:lq(r.waitForIdleTimeoutMs),waitForIdleQuietMs:lq(r.waitForIdleQuietMs),timeoutMs:lq(r.timeoutMs),maxDepth:lq(r.maxDepth),maxNodes:lq(r.maxNodes),rootPresent:lV(r.rootPresent),captureMode:"interactive-windows"===r.captureMode||"active-window"===r.captureMode?r.captureMode:void 0,windowCount:lq(r.windowCount),nodeCount:lq(r.nodeCount),truncated:lV(r.truncated),elapsedMs:lq(r.elapsedMs)}}}(await dw(e,`snapshot ${r}`,n),r)}function dw(e,t,r){return new Promise((n,i)=>{let a=y.connect({host:"127.0.0.1",port:e.port}),o=[],s=setTimeout(()=>{a.destroy(),i(new tn("COMMAND_FAILED","Android snapshot helper session request timed out",{command:t,timeoutMs:r,port:e.port}))},r);a.on("connect",()=>{a.write(`${t}
7
- `)}),a.on("data",e=>{o.push(Buffer.from(e))}),a.on("error",e=>{clearTimeout(s),i(e)}),a.on("close",()=>{clearTimeout(s),n(Buffer.concat(o).toString("utf8"))})})}async function dv(e){await e.process.stdin?.end(),await e.process.stdout?.destroy(),await e.process.stderr?.destroy(),await dy(e)}async function dy(e){await e.adb(["forward","--remove",`tcp:${e.port}`],{allowFailure:!0,timeoutMs:5e3})}let dg=new Map;function db(e,t,r){return e?`${e}\0${t}\0${r}`:void 0}function dA(e){e&&dg.delete(e)}async function dS(e){var t,r,n;let{adb:i,artifact:a}=e,o=e.installPolicy??"missing-or-outdated",s=a.manifest.packageName,l=a.manifest.versionCode;if("never"===o)return{packageName:s,versionCode:l,installed:!1,reason:"skipped"};let d=db(e.deviceKey,s,l),c=d?dg.get(d):void 0;if(d&&"always"!==o&&void 0!==c)return{packageName:s,versionCode:l,installedVersionCode:c,installed:!1,reason:"current"};let u=await dI(i,s,e.timeoutMs),p=(t=o,r=u,n=l,"never"===t?"skipped":"always"===t?"forced":void 0===r?"missing":r<n?"outdated":"current");if("current"===p){if(void 0===u)throw Error("Expected installed versionCode for current Android snapshot helper");return d&&dg.set(d,u),{packageName:s,versionCode:l,installedVersionCode:u,installed:!1,reason:p}}await lX(a);let f=await d_(i,e.adbProvider??i,a.apkPath,function(e){let t={};for(let r of e.slice(1)){let e=l2(r);if(!e)throw new tn("INVALID_ARGS",`Android snapshot helper manifest installArgs contains unsupported install flag "${r}".`);t[e]=!0}return t}(lY(a.manifest.installArgs)),{packageName:s,timeoutMs:e.timeoutMs});if(0!==f.exitCode)throw dA(d),new tn("COMMAND_FAILED","Failed to install Android snapshot helper",{packageName:s,versionCode:l,stdout:f.stdout,stderr:f.stderr,exitCode:f.exitCode});return d&&dg.set(d,l),{packageName:s,versionCode:l,installedVersionCode:u,installed:!0,reason:p}}async function dI(e,t,r){let n=await e(["shell","cmd","package","list","packages","--show-versioncode",t],{allowFailure:!0,timeoutMs:r});if(0===n.exitCode){var i=`${n.stdout}
8
- ${n.stderr}`,a=t;let e=`package:${a}`;for(let t of i.split(/\r?\n/)){if(!t.startsWith(e)||t.length>e.length&&!/\s/.test(t[e.length]??""))continue;let r=/(?:^|\s)versionCode:(\d+)(?:\s|$)/.exec(t);if(r)return Number(r[1])}return}}async function d_(e,t,r,n,i){var a;let o=async()=>await tC(r,{allowFailure:!0,provider:t,...n,timeoutMs:i.timeoutMs}),s=await o();if(0===s.exitCode||(a=s,!`${a.stdout}
9
- ${a.stderr}`.includes("INSTALL_FAILED_UPDATE_INCOMPATIBLE")))return s;let l=await e(["uninstall",i.packageName],{allowFailure:!0,timeoutMs:i.timeoutMs}),d=await o();return 0===d.exitCode?d:{...d,stderr:[d.stderr,l.stderr?`Previous uninstall stderr after INSTALL_FAILED_UPDATE_INCOMPATIBLE: ${l.stderr}`:""].filter(Boolean).join("\n")}}let dM=new Set(["android","com.android.systemui"]);function dx(e,t,r,n){var i,a;return{reason:r,fallbackReason:n,diagnostics:(i=e,a=t,{helperNodeCount:i.nodeCount,helperWindowRootCount:i.windowRootCount,helperApplicationWindowRootCount:i.applicationWindowRootCount,helperMeaningfulNodeCount:i.meaningfulNodeCount,helperApplicationMeaningfulNodeCount:i.applicationMeaningfulNodeCount,helperNonSystemMeaningfulNodeCount:i.nonSystemMeaningfulNodeCount,...void 0!==i.foregroundAppPackage?{helperForegroundAppPackage:i.foregroundAppPackage,helperForegroundAppMeaningfulNodeCount:i.foregroundAppMeaningfulNodeCount,helperForegroundAppMeaningfulNodeThreshold:2}:{},helperWindowTypes:i.windowTypes,...a.captureMode?{helperCaptureMode:a.captureMode}:{}})}}function dN(e){return null!==e&&""!==e.trim()}let dD=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function dP(e,t={}){let r=tE(e,t.helperAdb).exec;return(await dO(e,t,r)).xml}async function dk(e,t={}){let r=tE(e,t.helperAdb).exec,n=await dO(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=function(e,t,r){let{sourceNodes:n,...i}=l_(lD(e),t,r);return i}(i,void 0,t),s=dE(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 dK(e,o.nodes,i,r),o.nodes),{...o,...dC(s),androidSnapshot:n.metadata}}let o=lD(i),s=l_(o,void 0,t),l=dE(s.truncated,n.metadata);a&&await dR({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:d,...c}=s;return{...c,...dC(l),androidSnapshot:n.metadata}}function dE(e,t){return!0===e||!0===t.helperTruncated||e}function dC(e){return!0===e?{truncated:!0}:{}}async function dR(e){if(dW(e.interactiveSnapshot.nodes).size>0||dH(e.xml))return;let t=l_(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await dK(e.device,t.nodes,e.xml,e.adb);dQ(r,t,e.interactiveSnapshot),0===r.size&&dQ(E(eG(t.nodes)),t,e.interactiveSnapshot)}async function dO(e,t,r){let n=await eb("android_snapshot_helper_artifact_resolution",async()=>await dV(t.helperArtifact));return n.artifact?await dT(e,t,r,n.artifact):(eI({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await dj(e,n.fallbackReason,r))}async function dT(e,t,r,n){let i=dp(e),a=tE(e,t.helperAdb),o="daemon-session"!==t.helperSessionScope;try{var s,l,d;let o=await dL(t,r,a,n,i);o.installed&&await dc(i);let c=(s=await dF({options:t,adb:r,adbProvider:a,artifact:n,helperDeviceKey:i}),l=n,d=o.reason,{xml:s.xml,metadata:{backend:"android-helper",helperVersion:l.manifest.version,helperApiVersion:s.metadata.helperApiVersion,helperTransport:s.metadata.transport,helperSessionReused:s.metadata.sessionReused,installReason:d,waitForIdleTimeoutMs:s.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:s.metadata.waitForIdleQuietMs,timeoutMs:s.metadata.timeoutMs,maxDepth:s.metadata.maxDepth,maxNodes:s.metadata.maxNodes,rootPresent:s.metadata.rootPresent,captureMode:s.metadata.captureMode,windowCount:s.metadata.windowCount,nodeCount:s.metadata.nodeCount,helperTruncated:s.metadata.truncated,elapsedMs:s.metadata.elapsedMs}}),u=function(e,t,r={}){if("android-helper"!==t.backend)return;let n=function(e,t){var r,n;let i=(r=t,{nodeCount:0,windowRootCount:0,applicationWindowRootCount:0,meaningfulNodeCount:0,applicationMeaningfulNodeCount:0,nonSystemMeaningfulNodeCount:0,...void 0!==r?{foregroundAppPackage:r,foregroundAppMeaningfulNodeCount:0}:{},windowTypes:new Set});for(let t of lS(e))!function(e,t){var r,n;e.nodeCount+=1,r=e,n=t,void 0!==n.windowType&&(r.currentWindowType=n.windowType,r.windowRootCount+=1,r.windowTypes.add(n.windowType),1===n.windowType&&(r.applicationWindowRootCount+=1)),function(e,t){var r,n;r=t,!1!==r.visibleToUser&&(dN(r.text)||dN(r.desc)||dN(r.resourceId))&&(e.meaningfulNodeCount+=1,1===e.currentWindowType&&(e.applicationMeaningfulNodeCount+=1),n=t.packageName,null===n||dM.has(n)||(e.nonSystemMeaningfulNodeCount+=1),void 0!==e.foregroundAppPackage&&t.packageName===e.foregroundAppPackage&&(e.foregroundAppMeaningfulNodeCount=(e.foregroundAppMeaningfulNodeCount??0)+1))}(e,t)}(i,t);return{nodeCount:(n=i).nodeCount,windowRootCount:n.windowRootCount,applicationWindowRootCount:n.applicationWindowRootCount,meaningfulNodeCount:n.meaningfulNodeCount,applicationMeaningfulNodeCount:n.applicationMeaningfulNodeCount,nonSystemMeaningfulNodeCount:n.nonSystemMeaningfulNodeCount,...void 0!==n.foregroundAppPackage?{foregroundAppPackage:n.foregroundAppPackage,foregroundAppMeaningfulNodeCount:n.foregroundAppMeaningfulNodeCount??0}:{},windowTypes:[...n.windowTypes].sort((e,t)=>e-t).slice(0,8)}}(e,r.foregroundAppPackage);if(0===n.nodeCount||0===t.nodeCount||!1===t.rootPresent)return dx(n,t,"empty-helper-output","Android snapshot helper returned no accessibility nodes");let i=n.foregroundAppMeaningfulNodeCount;return void 0!==i&&(0===i||i<2&&n.meaningfulNodeCount>i)?dx(n,t,"content-poor-app-window","Android snapshot helper returned insufficient foreground app content"):void 0===i&&n.applicationWindowRootCount>0&&n.applicationMeaningfulNodeCount<2||void 0===i&&0===n.windowRootCount&&(t.windowCount??0)>1&&n.nonSystemMeaningfulNodeCount<2?dx(n,t,"content-poor-app-window","Android snapshot helper returned insufficient application window content"):n.windowRootCount>0&&0===n.applicationWindowRootCount?dx(n,t,"system-window-only","Android snapshot helper returned only non-application windows"):void 0}(c.xml,c.metadata,{foregroundAppPackage:t.appBundleId});if(!u)return c;return await d$({contentRecovery:u,helperDeviceKey:i,artifact:n,device:e,adb:r})}catch(t){return await dU({error:t,helperDeviceKey:i,artifact:n,device:e,adb:r})}finally{o&&await dc(i)}}async function dL(e,t,r,n,i){let a=await eb("android_snapshot_helper_install",async()=>await dS({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 dF(e){let{options:t,adb:r,adbProvider:n,artifact:i,helperDeviceKey:a}=e,o={adb:r,adbProvider:n,deviceKey:a,helperVersion:i.manifest.version,helperVersionCode:i.manifest.versionCode,packageName:i.manifest.packageName,instrumentationRunner:i.manifest.instrumentationRunner,waitForIdleTimeoutMs:t.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await eb("android_snapshot_helper_session_capture",async()=>await dd(o),{packageName:i.manifest.packageName,version:i.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){eI({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:tr(e).message}}),await dB(r,i.manifest.packageName)}return await eb("android_snapshot_helper_capture",async()=>await l3(o),{packageName:i.manifest.packageName,version:i.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function d$(e){return eI({level:"warn",phase:"android_snapshot_helper_content_fallback",data:{reason:e.contentRecovery.reason,fallbackReason:e.contentRecovery.fallbackReason,...e.contentRecovery.diagnostics}}),await dB(e.adb,e.artifact.manifest.packageName),await dj(e.device,e.contentRecovery.fallbackReason,e.adb)}async function dU(e){var t;let r=function(e){var t;let r=tr(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=dq(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=dG(e);return new tn(te(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(r)throw r;let n=dG(e.error);return eI({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:n}}),await dc(e.helperDeviceKey),await dB(e.adb,e.artifact.manifest.packageName),dA(db((t={deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}).deviceKey,t.packageName,t.versionCode)),await dj(e.device,n,e.adb)}async function dB(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await tg(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:tr(e).message}})}}function dG(e){let t=tr(e),r=dq(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 dq(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 dV(e){if(e)return{artifact:e};let t=tb(),r=a.join(tA(),"android-snapshot-helper","dist"),n=a.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await v.access(n)}catch{return{}}try{let e=function(e){var t,r;if(!e||"object"!=typeof e||Array.isArray(e))throw new tn("INVALID_ARGS","Android snapshot helper manifest must be an object.");return{name:lZ(e.name,"name","android-snapshot-helper"),version:l0(e.version,"version"),releaseTag:l1(e.releaseTag),assetName:l1(e.assetName),apkUrl:(t=e.apkUrl,r="apkUrl",null===t?null:l0(t,r)),sha256:function(e){let t=l0(e,"sha256").trim().toLowerCase();if(64!==t.length||!function(e){for(let t of e){let e=t.charCodeAt(0),r=e>=48&&e<=57,n=e>=97&&e<=102;if(!r&&!n)return!1}return!0}(t))throw new tn("INVALID_ARGS","Android snapshot helper manifest sha256 must be a 64-character hex string.");return t}(e.sha256),checksumName:l1(e.checksumName),packageName:l0(e.packageName,"packageName"),versionCode:lJ(e.versionCode,"versionCode"),instrumentationRunner:l0(e.instrumentationRunner,"instrumentationRunner"),minSdk:lJ(e.minSdk,"minSdk"),targetSdk:void 0===e.targetSdk?void 0:lJ(e.targetSdk,"targetSdk"),outputFormat:lZ(e.outputFormat,"outputFormat",lW),statusProtocol:lZ(e.statusProtocol,"statusProtocol",lH),installArgs:lY(e.installArgs)}}(JSON.parse(await v.readFile(n,"utf8"))),t=a.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await v.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:tr(e).message}}}async function dj(e,t,r){let n;try{n=await eb("android_snapshot_stock_capture",async()=>await dz(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new tn(te((r=tr(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 dK(e,t,r,n){if(!t.some(e=>R(e.type)))return new Map;let i=dW(t);if(i.size>0||dH(r))return i;let a=await dY(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(R(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=>lF(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||!R(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=>lF(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=lT(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(!lL(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(!lL(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?lT(o):a.length>0?lT(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 dH(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function dW(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 dz(e,t=tG(e)){try{return await tM(()=>dX(t),{shouldRetry:dZ})}catch(t){var r,n;let e;if((r=t)instanceof tn&&"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 tn("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 dX(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=dJ(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}
10
- ${r}`,i=/dumped to:\s*(\S+)/i.exec(n),i?.[1]);if(0!==l.exitCode&&!d)throw new tn("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=dJ(c.stdout,c.stderr);if(!u)throw new tn("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:c.stdout,stderr:c.stderr});return u}function dJ(e,t){let r=`${e}
11
- ${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 dZ(e){if(!(e instanceof tn)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return dD.some(e=>r.includes(e))}async function dY(e,t=tG(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),r=`${e.stdout}
12
- ${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function dQ(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 d0=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,d1=/^close app$/i,d2="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function d3(e){let t,{session:r}=e;if("android"!==r.device.platform||!r.recording)return{status:"absent"};try{t=await d7(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=ct(t);if(!n?.rect)return{status:"absent"};try{let e=await ce(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 cr(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 tD(r.device,r.appBundleId),!await cn(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 d5(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await t_(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await d4(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 d8({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 d8({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${d9(a)}. Automatic recovery failed.`,hint:d2})}throw d8({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${d9(a)}.`,hint:d2})}async function d4(e){try{return await d6(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 d6(e){if(!e.appBundleId)return!1;let t=ct(await d7(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await ce(e,t);if(!r.ok)return!1;await tD(e.device,e.appBundleId);let n=await cn(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 d8(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new tn("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function d9(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function d7(e){return eG(tY((await dk(e.device,{interactiveOnly:!1})).nodes))}async function ce(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=e$(t.rect),i=await tS(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 ct(e,t={}){if(!1===t.requireDialogSignal||co(e))return e.find(e=>ca(e).some(e=>d1.test(e))&&e.rect)}async function cr(e){for(let t=0;t<12;t+=1){if(!co(await d7(e)))return!0;await tg(500)}return!co(await d7(e))}async function cn(e,t,r={}){for(let n=0;n<12;n+=1){if(await ci(e,t,r))return!0;await tg(500)}return await ci(e,t,r)}async function ci(e,t,r){return!(r.requireNoBlockingDialog&&await t_(e.device))&&(await tF(e.device)).package===t}function ca(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 co(e){return e.some(e=>{let t=ca(e).join(" ").trim();return t.length>0&&d0.test(t)})}function cs(e){return!!(e&&e.width>0&&e.height>0)}function cl(e){return e.width*e.height}function cd(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 cc=[255,59,48,255],cu=[255,214,10,255],cp=[0,0,0,255],cf=["scroll","list","recyclerview","edittext","textfield"],cm=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],ch={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 cw(e){let t=await l.readFile(e.screenshotPath),r=await eH(t,"screenshot"),n=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)cg(r)&&cs(r.rect)&&(!t||cl(r.rect)>cl(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&&cs(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 cs(e.rect)&&!("image"===tZ((t=e).type??"")&&!cA(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(cS)||cI(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!cs(r.rect)||cg(r))return!1;let n=tZ(r.type??"");return!(cf.some(e=>n.includes(e))||t&&cl(r.rect)>.25*cl(t))}(e,t,r)||(cy(r)?n:n&&function(e){let t=tZ(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 cy(e)&&!cg(e)}(s=n)?s:null,tJ(o,s,e=>(function(e){return cy(e)&&!cg(e)})(e)),s.hittable?s:null,tJ(o,s,e=>!0===e.hittable)].find(cb)??null);if(!l?.rect||!cs(l.rect))continue;let d=function(e,t,r){let n=c_(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=c_(n);if(!i)continue;let a=function(e){let t=0;return tZ(e.type??"").includes("text")&&(t+=2),cS(e.label)&&(t+=2),cS(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||c_(t)}(n,l,e.nodes),c=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),cy(t)&&(n+=3),cy(e)&&(n+=2),r&&(n+=2),cI(t.identifier)&&(n+=1),cA(t.value)&&(n+=1),n}(n,l,d),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=cy,i=e=>!!c_(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=tZ(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&cs(t.rect)&&cd(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=cv(e,i,u,t,r);if(!cs(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=q(e.nodes).primaryAction;if(!a?.ref||!a.rect||!cs(a.rect))return;let o=cv(e,t,a.rect,n,i);if(!cs(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)=>cl(e.overlayRect)-cl(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(cd(e.overlayRect,r.overlayRect)||cd(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}cl(r.overlayRect)<cl(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(cE).slice(0,n.maxRefs??24).sort(ck).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:e$(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)cN(e,t.x,t.x+t.width-1,t.y+n,r),cN(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),cD(e,t.x+n,t.y,t.y+t.height-1,r),cD(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(i=r,(a=e).overlayRect,cc),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=cx(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:cx(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)cP(e,t+o,r+a,i)})(e,i,o,n,cu),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=ch[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]&&cP(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,cp)}(i,a.overlayRect,a.ref)}return await l.writeFile(e.screenshotPath,await eK(r)),n}function cv(e,t,r,n,i){if("android"===e.backend||!t)return cM(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 cM({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 cy(e){let t=[e.type,e.role,e.subrole].map(e=>tZ(e??"")).join(" ");return cm.some(e=>t.includes(e))}function cg(e){let t=[e.type,e.role,e.subrole].map(e=>tZ(e??"")).join(" ");return t.includes("application")||t.includes("window")}function cb(e){return!!(e?.rect&&cs(e.rect)&&!cg(e))}function cA(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function cS(e){var t;let r;return!!cA(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function cI(e){var t;return"string"==typeof e&&!!cS(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function c_(e){let t=[e.label,e.value].find(cS);return t?t.trim():cI(e.identifier)?e.identifier.trim():void 0}function cM(e,t,r){let n=cx(e.x,0,Math.max(0,t-1)),i=cx(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:cx(e.width,1,a),height:cx(e.height,1,o)}}function cx(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function cN(e,t,r,n,i){for(let a=t;a<=r;a+=1)cP(e,a,n,i)}function cD(e,t,r,n,i){for(let a=r;a<=n;a+=1)cP(e,t,a,i)}function cP(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 ck(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 cE(e,t){return t.score!==e.score?t.score-e.score:ck(e,t)}function cC(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 cR=new WeakMap;function cO(e){if(!e)return;let t=cR.get(e);if(t)return t;let r=cT(e.nodes??[]);if(r)return cR.set(e,r),r}let cT=ea,cL={referenceWidth:1e3,referenceHeight:1e3};function cF(e,t,r,n,i={},a=Date.now(),o=Date.now()){var s,l,d,c,u,p,f,m,h;let w,v,y,g=e.recording;if(!g)return;let b={...i,...n??{}},A=cK(b.effectiveDurationMs)??cK(b.durationMs),S={recordingStartedAt:g.startedAt,gestureClockOriginAtMs:g.gestureClockOriginAtMs,gestureClockOriginUptimeMs:g.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===g.platform?g.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:cK(b.gestureStartUptimeMs),gestureEndUptimeMs:cK(b.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},I="number"==typeof(s={gestureStartUptimeMs:cK(b.gestureStartUptimeMs),gestureEndUptimeMs:cK(b.gestureEndUptimeMs),reportedDurationMs:A,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),_=eU(e.device)&&void 0===cK(b.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=cH(cK(t.count),1)??1,r=!0===t.doubleTap,n=cH(cK(t.holdMs),1);return 1===e&&!r&&void 0===n}case"react-native":return"dismiss-overlay"===t.action;default:return!1}}(t,b)?function(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return cC(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...S,gestureDurationMs:I}):cC(S),M=(l=e.snapshot,w=cK((d=b).referenceWidth),v=cK(d.referenceHeight),void 0!==w&&w>0&&void 0!==v&&v>0?{referenceWidth:w,referenceHeight:v}:cO(l)),x=(c=t,u=r,p=b,f=_,m=I,h=M,y=c$[c],y?.(u,p,f,m,h)??[]);0!==x.length&&(g.gestureEvents.push(...x),eI({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:x.length,tMs:_,gestureDurationMs:I,kinds:x.map(e=>e.kind)}}))}let c$={click:(e,t,r,n,i)=>cU(e,t,r,i),press:(e,t,r,n,i)=>cU(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?cU(e,t,r,i):[],fill:(e,t,r,n,i)=>cB(e,t,r,i),focus:(e,t,r,n,i)=>cB(e,t,r,i),longpress:function(e,t,r,n,i){let a=cW(t,e);if(!a)return[];let{x:o,y:s}=a;return[cV(r,o,s,cJ(n,[cK(t.durationMs),cK(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=cz(t,e),o=cj(t.contentDirection)??cj(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:c}=a,u=cJ(n,[],250),p=cK(t.amount)??cK(e[1]),f=cK(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:cG,fling:cG,swipe:cG,pinch:function(e,t,r,n,i){let a=cW(t,e,1),o=cK(t.scale)??cK(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:cJ(n,[],280)}]}};function cU(e,t,r,n){let i=cW(t,e);if(!i)return[];let{x:a,y:o}=i,s=cH(cK(t.count),1)??1,l=cH(cK(t.intervalMs),0)??0,d=!0===t.doubleTap,c=cH(cK(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(cV(t,a,o,c,n));continue}u.push(cq(t,a,o,n)),d&&u.push(cq(t+90,a,o,n))}return u}function cB(e,t,r,n){let i=cW(t,e);if(!i)return[];let{x:a,y:o}=i;return[cq(r,a,o,n)]}function cG(e,t,r,n,i){let a=cz(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,c=cJ(n,[cK(t.effectiveDurationMs),cK(t.durationMs),cK(e[4])],250),u=cH(cK(t.count),1)??1,p=cH(cK(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,v,y,g,b,A,S,I;let _,{startX:M,startY:x,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 v=r+t*(c+p),y=M,g=x,b=N,A=D,S=c,"back-swipe"===(_=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,g,b,A,I=i))?{kind:_,tMs:v,x:y,y:g,x2:b,y2:A,...I,durationMs:S,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,b,I)}:{kind:_,tMs:v,x:y,y:g,x2:b,y2:A,...I,durationMs:S}})}function cq(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function cV(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function cj(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 cK(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 cH(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function cW(e,t,r=0){let n=cK(e.x)??cK(t[r]),i=cK(e.y)??cK(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function cz(e,t){let r=cX(e.x1,e.x,t[0]),n=cX(e.y1,e.y,t[1]),i=cX(e.x2,t[2]),a=cX(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 cX(...e){return e.map(cK).find(e=>void 0!==e)}function cJ(e,t,r){return cH(e,1)??t.map(e=>cH(e,1)).find(e=>void 0!==e)??r}let cZ={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function cY(e){var t,r,n,i,a,o,s;let l,d,c,u,p,{req:f,session:m,logPath:h,sessionStore:w,contextFromFlags:v}=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?cZ[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:tj}}(f);if(!y.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:y.message}};let{platformCommand:g,dispatchRequest:b,recordedCommand:A}=y,S=await c0(m,g);if(S)return S;let I=await cQ(m,g);if("response"in I)return I.response;let{resolvedPositionals:_,resolvedOut:M,recordedPositionals:x,recordedFlags:N}="screenshot"===(t=b).command?(d=(n=(r=t).positionals??[],i=r.meta?.cwd,(l=n[0])?[ru.expandHome(l,i),...n.slice(1)]:n),u=(c=(a=r.flags?.out,o=r.meta?.cwd,a?ru.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(),P={...v(f.flags,m.appBundleId,m.trace?.outPath),surface:m.surface},k=await c1({session:m,sessionName:e.sessionName,logPath:h,command:g,request:b,positionals:_,out:M,dispatchContext:P}),E=await cQ(m,g,"after-command");if("response"in E)return E.response;"status"in I&&"recovered"===I.status&&(!k||"object"==typeof k)&&((k??={}).warning=I.warning);let C=Date.now(),R=A===g?x:f.positionals??[],O=A===g?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=cO(e.snapshot),a={...n??{}},o=cj(a.direction)??cj(r[0]);if(!o)return n;let s=cK(a.amount)??cK(r[1]),l=cK(a.pixels),d=cz(a,[]),c=cK(a.referenceWidth),u=cK(a.referenceHeight),p=void 0!==c&&c>0&&void 0!==u&&u>0?{referenceWidth:c,referenceHeight:u}:i??cL;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=el({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);cF(t,n,a,p,u,d,c),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:g,recordedCommand:A,resolvedPositionals:_,recordedPositionals:R,recordedFlags:O,data:k,actionStartedAt:D,actionFinishedAt:C,flags:f.flags??{}}),sk(g)&&sN(m,g),sV(m,g,_,f.flags),{ok:!0,data:k??{}}}async function cQ(e,t,r="before-command"){if("android"!==e.device.platform||aP(t)?.androidBlockingDialogGuard!==!0||iS(e.device))return{status:"clear"};try{return await d5({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:tr(e)}}}}async function c0(e,t){let r=ab(t,e.device,{hint:!0});return r||("android"!==e.device.platform||iS(e.device)||!e.recording||"record"===t||"failed"!==(await d3({session:e})).status?null:{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}})}async function c1(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await oh(r.device,n,a,o,{...s});let l=await lA({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 c2(r,l,e.logPath),l}async function c2(e,t,r){let n={snapshotInteractiveOnly:!0},i=lm(await ls({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);lg(e,i);let a=await cw({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let c3=ul(()=>import("./lease.js")),c5=ul(()=>import("./session.js").then(e=>e.session_namespaceObject)),c4=ul(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),c6=ul(()=>import("./react-native.js")),c8=ul(()=>import("./record-trace.js")),c9=ul(()=>import("./find.js")),c7=ul(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function ue(e){var t;switch(t=e.req.command,aP(t)?.route??"generic"){case"lease":return await ut(e);case"session":return await ur(e);case"snapshot":return await un(e);case"reactNative":return await ui(e);case"recordTrace":return await ua(e);case"find":return await uo(e);case"interaction":return await us(e);case"generic":return null}}async function ut(e){let{handleLeaseCommands:t}=await c3();return ud(e.req.command,"lease",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,cloudArtifactProvider:e.cloudArtifactProvider}))}async function ur(e){let{handleSessionCommands:t}=await c5();return ud(e.req.command,"session",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,invoke:e.invoke,invokeReplayAction:e.invokeReplayAction,androidAdbExecutor:e.androidAdbExecutor}))}async function un(e){let{handleSnapshotCommands:t}=await c4();return ud(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function ui(e){let{handleReactNativeCommands:t}=await c6();return ud(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function ua(e){let{handleRecordTraceCommands:t}=await c8();return ud(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function uo(e){let{handleFindCommands:t}=await c9();return ud(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function us(e){let{handleInteractionCommands:t}=await c7();return ud(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function ul(e){let t;return()=>t??=e()}function ud(e,t,r){if(r)return r;throw new tn("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let uc=new p;async function uu(e,t,r){let n=uc.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>uc.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function up(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function uf(e,t){var r,n,i,a;let o,s,l,d,c,u;return e.recording?(r=e,n=t,o=tl(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=tl(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 um(e,t){if(!t)return[];let r=[],n=e.device,i=t.platform;if(i&&!eL(n,i)&&r.push({key:"platform",value:t.platform}),t.target&&t.target!==(n.target??"mobile")&&r.push({key:"target",value:t.target}),t.udid&&(!eU(n)||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();eU(n)&&"simulator"===n.kind&&e===i||r.push({key:"iosSimulatorDeviceSet",value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=tT(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function uh(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 uw="default";function uv(e){return e.session||uw}function uy(e){if(e.meta?.sessionExplicit===!0||(e.session||uw)!==uw||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=a.resolve(e);try{return o.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(o.existsSync(a.join(t,".git")))return t;let e=a.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 ug(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function ub(e,t){let r=uy(e);return!!r&&!!t.sessionScope&&!ug(t,r)}function uA(e,t){if("open"!==e.command)return;let r=U(t);if(0!==r.length)throw new tn("INVALID_ARGS","Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.",{missing:r})}function uS(e,t,r){if(t&&r&&t!==r)throw new tn("UNAUTHORIZED",`Lease does not match session owner (${e})`,{reason:"LEASE_SESSION_MISMATCH",field:e})}async function uI(e){let t=e.sessionStore.get(e.sessionName),r=t?.lease;return!!t&&!!r&&!!e.leaseRegistry.consumeExpiredLease(r.leaseId)&&(eI({level:"info",phase:"leased_session_expired",data:{reason:"LEASE_EXPIRED",leaseId:r.leaseId,session:t.name,deviceKey:r.deviceKey}}),await e.teardownSession(t,t.name).catch(e=>{eI({level:"debug",phase:"leased_session_expiry_cleanup_failed",data:{reason:"LEASE_EXPIRED",leaseId:r.leaseId,session:t.name,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.delete(t.name),!0)}function u_(e){return function(e,t){let r=sC(e),n=r.leaseId??t?.leaseId,i=r.tenantId??t?.tenantId,a=r.runId??t?.runId;if(i&&a&&n)return tK({tenantId:i,runId:a,leaseId:n,leaseBackend:r.leaseBackend??t?.backend,leaseProvider:r.leaseProvider??t?.leaseProvider,deviceKey:r.deviceKey??t?.deviceKey,clientId:r.clientId??t?.clientId,expiresAt:t?.expiresAt})}(e.req,e.req.internal?.admittedLease)??e.existingLease}async function uM(e){let t=e.session.lease;if(!t)return;let r=e.leaseRegistry.releaseLease(M({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}));return eI({level:"info",phase:"session_lease_released",data:{session:e.session.name,leaseId:t.leaseId,released:r.released}}),r.lease?await e.leaseLifecycleProvider?.release?.(r.lease):void 0}function ux(e,t){var r,n,i,a,o,s,l,d,c,u,p;let f,m,h=e.meta?.lockPolicy;if(!h)return e;let w={...e.flags??{}},v=(r=e.command,aP(r)?.lockPolicySelectorOverride===!0),y=v?[]:t?um(t,w):(n=w,i=e.meta?.lockPlatform,f=[],void 0!==n.platform&&i&&(a=n.platform,o=i,a&&o&&a!==o&&("apple"===a?!eF(o):"apple"!==o||!eF(a)))&&f.push({key:"platform",value:n.platform}),i&&(s=f,l=n,d=i,(m=l.target)&&function(e,t){switch(t){case"android":case"ios":return"desktop"===e;case"macos":case"linux":case"web":return"desktop"!==e;case"apple":return!1;default:return uD(t)}}(m,d)&&s.push({key:"target",value:m}),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"===r.platform?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":case"web":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return uD(e)}}(r,t)){let r=t[n];a_(r)&&e.push({key:n,value:r})}}(f,n,i)),f),g=e.meta?.lockPlatform;if(0===y.length){return c=v,u=t,p=w,!g||u||void 0!==p.platform||c&&aM(p,aS)||(w.platform=g),{...e,flags:w}}if("strip"===h)return function(e,t,r,n){if(n){uN(e,t),e.platform=eR(n.device);return}uN(e,t),r&&void 0===e.platform&&(e.platform=r)}(w,y,g,t),{...e,flags:w};throw new tn("INVALID_ARGS",function(e,t,r){let n=t.map(uh).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${up(r)}, but this request selected ${n}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:"";return`${e.command} is using a bound-session lock${a}, but this request selected ${n}.`}(e,y,t),{session:e.session,conflicts:y.map(uh),hint:function(e,t){if(t)return uf(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${tl(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 uN(e,t){for(let r of t)delete e[r.key]}function uD(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function uP(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[uk(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return ux(e)}catch{return e}}(n);if("open"===(r=l).command||aI(r.flags))try{let e=await iZ(l.flags??{});s.add(uk(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=uE(e)-uE(t);return 0!==r?r:e.localeCompare(t)})}function uk(e){return`device:${e}`}function uE(e){return+!e.startsWith("session:")}function uC(e,t={}){let r=tI(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function uR(e,t){return eU(e)&&"simulator"===e.kind?uC(t,{simulatorSetPath:e.simulatorSetPath}):["simctl",...t]}function uO(e,t,r){return oV(uR(e,t),r)}let uT="If runner build products look stale or corrupted, run `pnpm clean:xcuitest` in a local checkout, or remove ~/.agent-device/apple-runner/derived, then retry.";function uL(e){if(!(e instanceof tn)||"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 uF(e){return!(e instanceof tn)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function u$(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new tn("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:tP({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:tR("IOS_RUNNER_CONNECT_TIMEOUT")})}async function uU(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=tP({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new tn("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}
13
- ${t}
14
- ${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.":`${tR("IOS_RUNNER_CONNECT_TIMEOUT")} ${uT}`)})}function uB(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${n.randomUUID()}`}}function uG(e){if(rx(e))throw rD()}let uq=new Map;async function uV(e,t,r,n,i=45e3,a,o){let s=tx.fromTimeoutMs(i),{getEndpoints:l}=uJ(e,t),{endpoints:d}=await l(s.remainingMs()),c=null,u=Math.max(1,Math.ceil(i/250));try{return await tL(async({deadline:s})=>{let u=await uj({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 rD();return new tn("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:uF},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||rk(e))throw rD();c||(c=e)}if(o?.aborted)throw rD();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw u$({port:t,endpoints:d,logPath:n,lastError:c});let a=await u2(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw u$({port:t,endpoints:d,logPath:n,lastError:c})}async function uj(e){await uK(e);let t=await uH(e);if(t.response)return t.response;let r=await uW(e);return r||await uz(e,t.usedCachedTunnelIp)}async function uK(e){if(e.attemptDeadline?.isExpired())throw new tn("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 uU({session:e.session,port:e.port,logPath:e.logPath})}async function uH(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 uZ(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,uq.delete(i))}}),usedCachedTunnelIp:r}}async function uW(e){return"simulator"===e.device.kind&&e.session?.ready?await uY(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function uz(e,t){var r;if("device"!==e.device.kind||!t)return null;r=e.device.id,uq.delete(r);let n=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(n.endpoints),await uZ(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 uX(e,t,r,n=45e3,i){if(i?.aborted)throw rD();let a=tx.fromTimeoutMs(n),{getEndpoints:o}=uJ(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new tn("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let d=a.remainingMs();if(d<=0)throw new tn("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await u0(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function uJ(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await uQ({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 uZ(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 tn("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await u0(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||rk(e))throw rD();s(t,e)}return null}async function uY(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 u2(e,t,r,s,i);return new Response(n.body,{status:n.status})}catch(e){if(i?.aborted||rk(e))throw rD();return o(e),null}}async function uQ(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=uq.get(t))?e.expiresAt<=Date.now()?(uq.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 u1(i.id,a);return l(d),d&&(r=i.id,n=d,uq.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function u0(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 u1(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,n=a.join(m.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),i=await oV(["devicectl","device","info","details","--device",e,"--json-output",n,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==i.exitCode||!o.existsSync(n))return null;let a=JSON.parse(o.readFileSync(n,"utf8"));if(a.info?.outcome&&"success"!==a.info.outcome)return null;let s=(a.result?.connectionProperties?.tunnelIPAddress??a.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{u8(n)}}async function u2(e,t,r,n,i){let a=JSON.stringify(r),o=uR(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 oV(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=tP({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new tn("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:tR(e)})}return{status:200,body:l}}async function u3(){return await new Promise((e,t)=>{let r=y.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 tn("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function u5(e,t,r,n){t&&u6(t,e),r&&u6(r,e),n&&process.stderr.write(e)}let u4=new Map;function u6(e,t){let r=(u4.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await o.promises.mkdir(a.dirname(e),{recursive:!0}),await o.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{u4.get(e)===r&&u4.delete(e)});u4.set(e,r)}function u8(e){try{o.existsSync(e)&&o.unlinkSync(e)}catch{}}let u9=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function u7(e,t,r){if(!eE(e))return;if(0===t.length)throw new tn("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(!o.existsSync(e))throw new tn("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await pe(e)){await oq("codesign",["--remove-signature",e],{allowFailure:!0});try{await oq("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof tn?n:new tn("COMMAND_FAILED",String(n));throw new tn("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 pe(e){return 0===(await oq("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let pt=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function pr(e){var t;let r=await pn(e);if(!r||0===r.length)return null;let n=a.dirname(e),i=new Set,s=function(e,t){let r=[],n=new Set,i=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){i.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);r.push(a.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(a.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(n),hostRelativePaths:i}}(r,n);for(let e of s.testRootPaths){if(!o.existsSync(e))return null;i.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>o.existsSync(a.join(t,e)));return r?a.join(r,e):null})){if(!e)return null;i.add(e)}return Array.from(i)}async function pn(e){let t=await oj(e);if(t){var r,n,i=t;let e=new Set;for(let t of[i,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!tq(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(tq))}return r}(i),...Object.values(i).filter(e=>tq(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(pt.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=o.readFileSync(e,"utf8"),n=nK(r),t=new Set,nH(n,(e,r)=>{if(pt.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}}let pi=["CFBundleIcons","CFBundleIcons~ipad"];async function pa(e){let t=e.filter(pc);if(0===t.length)return;let r=e.filter(e=>pp(e)&&!pu(e));for(let e of t){let t=function(e,t){let r=a.dirname(e);return t.find(e=>a.dirname(e)===r&&"AgentDeviceRunner.app"===a.basename(e))??t.find(t=>a.dirname(t)===r&&t!==e)??null}(e,r);t&&await po(t,e)}}async function po(e,t){var r;let n,i=function(e,t){let r=!1;for(let i of o.readdirSync(e,{withFileTypes:!0})){var n;if(i.isFile()&&(n=i.name,/^AppIcon.*\.png$/.test(n)||"Assets.car"===n))(function(e,t){if(o.existsSync(t)){let r=o.readFileSync(e),n=o.readFileSync(t);return!r.equals(n)&&(o.copyFileSync(e,t),!0)}return o.copyFileSync(e,t),!0})(a.join(e,i.name),a.join(t,i.name))&&(r=!0)}return r}(e,t),s=await ps(e,t);(i||s)&&(await pd(t),r=t,n=new Date,o.utimesSync(r,n,n))}async function ps(e,t){var r,n;let i=a.join(e,"Info.plist"),o=a.join(t,"Info.plist"),s=await oj(i),l=await oj(o);if(!s||!l)return!1;let d=(r=s,n=l,pi.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 pl(o,e.key,e.value,e.shouldInsert);return!0}async function pl(e,t,r,n){let i=await oq("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new tn("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function pd(e){let t=await oq("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new tn("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function pc(e){return pp(e)&&pu(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function pu(e){return a.basename(e).endsWith("-Runner.app")}function pp(e){return a.basename(e).endsWith(".app")}let pf={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"]}}},visionOS:{sdkName:{simulator:"xrsimulator",device:"xros"},derivedBaseName:{simulator:"visionos-simulator",device:"visionos-device"},xctestrunHints:{simulator:{preferred:["xrsimulator"],disallowed:["xros","iphoneos","iphonesimulator","appletvos","appletvsimulator","macos"]},device:{preferred:["xros"],disallowed:["xrsimulator","iphoneos","iphonesimulator","appletvos","appletvsimulator","macos"]}}}};function pm(e){if(!eF(e.platform))throw new tn("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return eE(e)?"macOS":eO(e.target,e.appleOs)}function ph(e){return"simulator"===e?"simulator":"device"}function pw(){return"arm64"===process.arch?"arm64":"x86_64"}let pv="XCTestDevices",py=".agent-device-backup",pg=".agent-device-xctestdevices-backup-",pb=a.join(m.homedir(),".agent-device","apple-runner"),pA=".agent-device-runner-cache.json",pS={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},pI=["-IDEPackageSupportDisableManifestSandbox=1","-IDEPackageSupportDisablePluginExecutionSandbox=1","ENABLE_USER_SCRIPT_SANDBOXING=NO"],p_=new Map,pM=new Set,px=new Map,pN=new Set;function pD(e){return e?.trim()??""}function pP(e=process.env){return pD(e.AGENT_DEVICE_IOS_BUNDLE_ID)||pD(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function pk(e=process.env){let t=pD(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${pP(e)}.uitests`}let pE=function(e=process.env){let t=pP(e),r=pk(e);return Array.from(new Set([pD(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function pC(e=m.homedir()){return a.join(e,"Library","Developer","XCTestDevices")}async function pR(e,t={}){if(!eU(e)||"simulator"!==e.kind)return null;let r=tI(e.simulatorSetPath);if(!r)return null;let n=a.resolve(r),i=a.resolve(t.xctestDeviceSetPath??pC()),s=a.resolve(t.backupPath??function(e=pC()){return`${e}${py}`}(i)),l=a.resolve(t.lockDirPath??function(e=m.homedir()){return a.join(e,".agent-device","xctest-device-set.lock")}()),d=t.ownerStartTime??e5(process.pid),c=await pL({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(pO({xctestDeviceSetPath:i,backupPath:s}),function(e,t){if(a.resolve(e)===a.resolve(t))return!0;try{return o.realpathSync.native(e)===o.realpathSync.native(t)}catch{return!1}}(n,i))return await c(),null;o.mkdirSync(n,{recursive:!0}),o.existsSync(i)&&o.renameSync(i,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,n=a.dirname(r),i=a.join(n,`${pv}.agent-device-link-${process.pid}-${Date.now()}`);o.mkdirSync(n,{recursive:!0});try{o.symlinkSync(t,i,"dir"),o.renameSync(i,r)}catch(e){throw o.existsSync(i)&&pT(i),e}}({requestedSetPath:n,xctestDeviceSetPath:i})}catch(e){throw pO({xctestDeviceSetPath:i,backupPath:s}),await c(),new tn("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:n,xctestDeviceSetPath:i,backupPath:s,error:String(e)})}let u=!1;return{release:async()=>{if(!u){u=!0;try{pO({xctestDeviceSetPath:i,backupPath:s})}finally{await c()}}}}}function pO(e){let{xctestDeviceSetPath:t,backupPath:r}=e,n=[r,...function(e){let t=a.dirname(e),r=a.basename(e).replace(py,""),n=r===pv?pg:`${r}${pg}`;try{return o.readdirSync(t).filter(e=>e.startsWith(n)).sort().map(e=>a.join(t,e))}catch{return[]}}(r)],i=n.find(e=>o.existsSync(e)),s=o.existsSync(t)&&o.lstatSync(t).isSymbolicLink();if(i){if(s&&pT(t),o.existsSync(t))if(!s)return void eI({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:i}});else i!==r?o.rmSync(i,{recursive:!0,force:!0}):o.rmSync(r,{recursive:!0,force:!0});else o.mkdirSync(a.dirname(t),{recursive:!0}),o.renameSync(i,t);for(let e of n)e!==i&&o.existsSync(e)&&o.rmSync(e,{recursive:!0,force:!0});return}s&&(eI({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),pT(t))}function pT(e){!o.existsSync(e)||o.lstatSync(e).isSymbolicLink()&&o.unlinkSync(e)}async function pL(e){return await t2({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 pF(e){var t;return await pL({lockDirPath:(t=e,a.join(a.dirname(t),`${a.basename(t)}.lock`)),owner:{pid:process.pid,startTime:e5(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function p$(e,t){let r=function(e){var t;let r,i,s=e.iosXctestrunFile?.trim();if(!s)return null;let l=a.resolve(s);if(!o.existsSync(l))throw new tn("COMMAND_FAILED","Configured iOS XCTest runner .xctestrun file not found",{configKey:"iosXctestrunFile",xctestrunPath:l});let d=e.iosXctestDerivedDataPath?.trim(),c=d?a.resolve(d):(t=l,(r=n.createHash("sha1")).update(t),i=r.digest("hex").slice(0,12),a.join(m.tmpdir(),"agent-device-ios-xctest-derived",i));return fc("reuse","external_xctestrun",{derived:c,xctestrunPath:l}),{xctestrunPath:l,derived:c,cache:"external",artifact:"valid",buildMs:0,xctestrunPathSource:"external"}}(t);if(r)return r;let i=tA(),s=pK(e,i),l=fr(e,s);return await uu(p_,l,async()=>{let r=await pF(l);try{return await pU({device:e,options:t,projectRoot:i,expectedCacheMetadata:s,derived:l,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await r()}})}async function pU(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(tN(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||pM.has(t))&&(fc("clean",r?"forced_rebuild":"forced_clean",{derived:t}),fl(t),pV(t),pM.delete(t));let l=await fd({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>p3(e,n),xctestrunReferencesProjectRoot:p4,resolveExistingXctestrunProductPaths:pr}),d="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&fc("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let c=await pB({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:d});return c||(l.xctestrunPath&&(fl(s),pV(s)),await pG({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:d,reason:l.reason}))}async function pB(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await pq(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function pG(e){let{device:t,options:r,projectRoot:n,expectedCacheMetadata:i,derived:s,cache:l,reason:d}=e,c=a.join(n,"apple-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!o.existsSync(c))throw new tn("COMMAND_FAILED","iOS runner project not found",{projectPath:c});let u=Date.now();rB({type:"command",status:"progress",message:"Building Apple runner..."}),await ft(t,c,s,r);let p=Math.max(0,Date.now()-u),f=p3(s,t);if(!f)throw new tn("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await pr(f);if(!m)throw new tn("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await u7(t,m,f),await pa(m),pW(s,pZ(i,f,m)),fc("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:d}}async function pq(e,t,r,n){try{var i,a,o,s;return await u7(e,n.productPaths,n.xctestrunPath),fc("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,pW(i,pZ(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof tn))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&u9.has(t)}(e))throw e;return fc("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function pV(e){try{if(!o.existsSync(e))return;if("derived"!==a.basename(e))return void o.rmSync(e,{recursive:!0,force:!0});for(let r of o.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,pj.has(t)&&o.rmSync(a.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let pj=new Set([pA,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function pK(e,t=tA()){let r,i=pm(e);return{schemaVersion:2,packageVersion:tb(),runnerSourceFingerprint:function(e){let t=a.join(e,"apple-runner","AgentDeviceRunner"),r=function(e){if(!o.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of o.readdirSync(e,{withFileTypes:!0})){var n,i;let o=a.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(o);continue}s.isFile()&&(n=s.name,i=o,"project.pbxproj"===n?i.includes(`${a.sep}.xcodeproj${a.sep}`):[".jpg",".json",".png",".swift",".m",".h",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(a.extname(n)))&&t.push(o)}}return t.sort((e,t)=>e.localeCompare(t))}(t),i=function(e,t){let r=n.createHash("sha256");for(let n of t){let t=a.relative(e,n),i=o.statSync(n);r.update(t),r.update("\0"),r.update(String(i.size)),r.update("\0"),r.update(String(Math.trunc(i.mtimeMs))),r.update("\0")}return r.digest("hex")}(t,r),s=p2.get(t);if(s?.fileStatsFingerprint===i)return s.sourceFingerprint;let l=n.createHash("sha256");for(let e of r){let r=a.relative(t,e);l.update(r),l.update("\0"),l.update(o.readFileSync(e)),l.update("\0")}let d=l.digest("hex");return p2.set(t,{fileStatsFingerprint:i,sourceFingerprint:d}),d}(t),...function(e,t){var r;let n=(r=pH("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=pf[e].sdkName[ph(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:pH("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:pH("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(i,e.kind),platformName:i,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(r=pm(e))?`platform=macOS,arch=${pw()}`:"simulator"===e.kind?`generic/platform=${r} Simulator`:`generic/platform=${r}`,runnerBundleBuildSettings:fa(process.env),runnerSigningBuildSettings:fi(process.env,"device"===e.kind,e),runnerPerformanceBuildSettings:fo(),runnerSandboxBuildArgs:fs()}}function pH(e,t){let r=JSON.stringify([e,t]),n=px.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 px.set(r,i),i}catch{return px.set(r,"unknown"),"unknown"}}function pW(e,t){o.mkdirSync(e,{recursive:!0}),o.writeFileSync(a.join(e,pA),`${JSON.stringify(t,null,2)}
15
- `)}async function pz(e,t){if("external"===e.cache)return void fc("preserve","external_bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t});pM.add(e.derived);let r=await pF(e.derived);try{fc("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),fl(e.derived),pV(e.derived)}finally{await r()}}function pX(e){let{artifacts:t,packageVersion:r,...n}=e;return n}function pJ(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 pZ(e,t,r){let n=function(e,t){let r=pQ(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=pQ(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 pY(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function pQ(e){try{let t=o.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function p0(e,t){let r=pQ(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function p1(e,t){let r=a.relative(a.resolve(t),a.resolve(e));return""!==r&&!r.startsWith("..")&&!a.isAbsolute(r)}let p2=new Map;function p3(e,t){if(!o.existsSync(e))return null;let r=[],n=[e];for(;n.length>0;){let e=n.pop();for(let t of o.readdirSync(e,{withFileTypes:!0})){let i=a.join(e,t.name);if(t.isDirectory()){n.push(i);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=o.statSync(i);r.push({path:i,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,r)=>{if(t){let n=p5(r.path,t)-p5(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function p5(e,t){let r=0,n=e.toLowerCase();a.basename(n).startsWith("agentdevicerunner.env.")&&(r-=1e3),n.includes(`${a.sep}macos${a.sep}`)&&(r-=5e3);let i=pf[pm(t)].xctestrunHints[ph(t.kind)];return i.preferred.length>0&&(i.preferred.some(e=>n.includes(e))?r+=2e3:r-=500),i.disallowed.some(e=>n.includes(e))&&(r-=2500),r}function p4(e,t){try{let r=o.readFileSync(e,"utf8"),n=new Set([t]);try{n.add(o.realpathSync(t))}catch{}for(let e of n)if(r.includes(e))return!0;return!1}catch{return!1}}async function p6(e,t,r,n={}){let i=n.iosXctestEnvDir?.trim(),s=i?a.resolve(i):a.dirname(e);o.mkdirSync(s,{recursive:!0});let l=r.replace(/[^a-zA-Z0-9._-]/g,"_"),d=a.join(s,`AgentDeviceRunner.env.${l}.json`),c=a.join(s,`AgentDeviceRunner.env.${l}.xctestrun`),u=await p8(e);return p7(u,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})}),p7(u,e=>Object.assign(e,pS),{requireTestBundlePath:!0}),await p9(u,d,c),{xctestrunPath:c,jsonPath:d}}async function p8(e){let t=await oq("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new tn("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 tn("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function p9(e,t,r){o.writeFileSync(t,JSON.stringify(e,null,2));let n=await oq("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new tn("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:r,stderr:n.stderr})}function p7(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=fe(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=fe(r,{requireTestBundlePath:!0});e&&t(e)}}function fe(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function ft(e,t,r,n){let i=fa(process.env),a=fi(process.env,"device"===e.kind,e),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=fo(),l=fs(),d=await pR(e);try{let d;await ef("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",fn(e),"1","-destination",(d=pm(e),"macOS"===d?`platform=macOS,arch=${pw()}`:"simulator"===e.kind?`platform=${d} Simulator,id=${e.id}`:`generic/platform=${d}`),"-derivedDataPath",r,...s,...l,...i,...o,...a],{detached:!0,timeoutMs:n.buildTimeoutMs,onSpawn:e=>{pN.add(e),e.on("close",()=>{pN.delete(e)})},onStdoutChunk:e=>{u5(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{u5(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof tn?a:new tn("COMMAND_FAILED",String(a)),i=(e=r.details?JSON.stringify(r.details):"",((t=`${r.message}
16
- ${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)??uT);throw new tn("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await d?.release()}}function fr(e,t){let r,i=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(i)return a.resolve(i);let o=(r=n.createHash("sha256").update(pJ(pX(t))).digest("hex"),`cache-${r.slice(0,16)}`),s=function(e){return a.join(pb,"derived",pf[pm(e)].derivedBaseName[ph(e.kind)])}(e);return a.join(s,o)}function fn(e){return eE(e)||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function fi(e=process.env,t=!1,r={platform:"apple"}){if(eE(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 fa(e=process.env){let t=pP(e),r=pk(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function fo(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO","ONLY_ACTIVE_ARCH=YES","ENABLE_PREVIEWS=NO","ENABLE_DEBUG_DYLIB=NO"]}function fs(){return[...pI,`OTHER_SWIFT_FLAGS=${tN(process.env.AGENT_DEVICE_XCUITEST_INCLUDE_UNIT_TESTS)?"$(inherited) -disable-sandbox -D AGENT_DEVICE_RUNNER_UNIT_TESTS":"$(inherited) -disable-sandbox"}`]}function fl(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,n;if(r=e,t=a.resolve(tA(),".tmp"),""===(n=a.relative(t,a.resolve(r)))||n.startsWith("..")||a.isAbsolute(n))throw new tn("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 ${a.join(tA(),".tmp")}.`})}}async function fd(e){var t,r;let n,i=(t=e.derived,r=e.expectedCacheMetadata,(n=function(e){try{let t=JSON.parse(o.readFileSync(a.join(e,pA),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?pJ(pX(n))!==pJ(pX(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:n}:{ok:!1,reason:"cache_metadata_missing"}),s=i.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(pY))||!p1(n.xctestrunPath,e)||!p0(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!p1(t.path,e)||!p0(t.path,t))return null;i.push(t.path)}return{xctestrunPath:n.xctestrunPath,productPaths:i}}(e.derived,i.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?i.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:u,source:c}:{reason:i.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 fc(e,t,r){eI({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let fu={readOnly:!1,readinessProbe:!1,readinessPreflightSkipEligibleAfterHealthyMutation:!1},fp={...fu,readOnly:!0},ff={...fp,readinessProbe:!0},fm={...fu,readinessPreflightSkipEligibleAfterHealthyMutation:!0},fh=Object.fromEntries(Object.entries({tap:"preflightSkippableTouchMutation",mouseClick:"default",longPress:"preflightSkippableTouchMutation",drag:"preflightSkippableTouchMutation",remotePress:"default",type:"default",swipe:"preflightSkippableTouchMutation",scroll:"preflightSkippableTouchMutation",desktopScroll:"preflightSkippableTouchMutation",findText:"readOnly",querySelector:"readOnly",readText:"readOnly",snapshot:"readOnly",screenshot:"readOnly",back:"default",backInApp:"default",backSystem:"default",home:"default",rotate:"default",rotateGesture:"default",transformGesture:"default",appSwitcher:"default",keyboardDismiss:"default",keyboardReturn:"default",alert:"readOnly",pinch:"default",sequence:"preflightSkippableTouchMutation",recordStart:"default",recordStop:"default",status:"readOnlyReadinessProbe",uptime:"readOnlyReadinessProbe",shutdown:"default"}).map(([e,t])=>[e,function(e){switch(e){case"default":return fu;case"readOnly":return fp;case"readOnlyReadinessProbe":return ff;case"preflightSkippableTouchMutation":return fm}}(t)]));function fw(e){return fh[e].readOnly}function fv(e){return fh[e].readinessPreflightSkipEligibleAfterHealthyMutation}let fy=process.pid,fg=e5(process.pid),fb=(t4=fy,t6=fg,(t=n.createHash("sha256")).update(String(t4)),t.update("\0"),t.update(t6??"unknown-start"),`owner-${t4}-${t.digest("hex").slice(0,8)}`);function fA(e){return{schemaVersion:1,deviceId:e.deviceId,ownerToken:fb,ownerPid:fy,ownerStartTime:fg,ownerStateDir:fN(),sessionId:e.sessionId,runnerPid:e.runnerPid??null,port:e.port,xctestrunPath:e.xctestrunPath,jsonPath:e.jsonPath,createdAtMs:Date.now()}}function fS(t){e=t?.trim()||void 0}async function fI(e,t){let r=await t2({lockDirPath:`${fE(e)}.lock`,owner:{pid:fy,startTime:fg,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await r()}}function f_(e){try{let a;var t,r,n=JSON.parse(o.readFileSync(fE(e),"utf8")),i=e;if(!n||"object"!=typeof n||Array.isArray(n)||1!==n.schemaVersion||n.deviceId!==i)return null;let s=(t=n,a={ownerToken:fC(t.ownerToken),ownerPid:fO(t.ownerPid),sessionId:fC(t.sessionId),port:fO(t.port),xctestrunPath:fC(t.xctestrunPath),jsonPath:fC(t.jsonPath),createdAtMs:(r=t.createdAtMs,"number"==typeof r&&Number.isFinite(r)?r:null)},Object.values(a).some(e=>null===e)?null:a);return s?{schemaVersion:1,deviceId:i,...s,ownerStartTime:fR(n.ownerStartTime),ownerStateDir:fR(n.ownerStateDir)??void 0,runnerPid:fO(n.runnerPid)}:null}catch{return null}}function fM(e){var t;return e?e.ownerToken===fb?{type:"owned",lease:e}:e9((t=e).ownerPid)&&(!t.ownerStartTime||e5(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function fx(e,t,r){let n=fM(f_(e));if("empty"===n.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===n.type){var i,o,s,l,d,c,u,p,f;let m,h,w,v;if(i=n.lease,(m=fN())&&i.ownerStateDir&&a.resolve(m)===a.resolve(i.ownerStateDir))return void await fT(n.lease,"same-state-dir",t);if(o=n.lease,(s=r)&&"proxy"===s.leaseProvider&&s.leaseId&&s.clientId&&function(e,t){if(!e)return!1;if(e===t)return!0;let[,,r]=e.split(":",3);return r===t}(s.deviceKey,o.deviceId))return void await fT(n.lease,"logical-lease-takeover",t);throw new tn("COMMAND_FAILED",r?`iOS runner for ${e} is busy after device lease admission`:`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,logicalLeaseContext:r,ownerPid:n.lease.ownerPid,ownerStartTime:n.lease.ownerStartTime,ownerStateDir:n.lease.ownerStateDir,ownerToken:n.lease.ownerToken,sessionId:n.lease.sessionId,hint:(l=n.lease,d=r,w=(c=l,h=`Runner owner: PID ${c.ownerPid}`,c.ownerStateDir?`${h} with AGENT_DEVICE_STATE_DIR=${c.ownerStateDir}`:`${h}.`),v=(u=l).ownerStateDir?`If it is stuck, stop the owning agent-device daemon for ${p=u.ownerStateDir,`AGENT_DEVICE_STATE_DIR=${f=p,`'${f.replaceAll("'","'\\''")}'`}`} and retry.`:"If it is stuck, stop the owning agent-device daemon and retry.",d?[v,w,"The device is busy because another active device lease owns it, or the runner is owned by another daemon/process after lease admission. Retry after the owning session closes or after the five-minute inactivity lease expires."].join(" "):[v,w,"If the runner is still active, wait for it to finish. Do not run prepare ios-runner from another daemon/client to recover this."].join(" "))})}await fT(n.lease,n.type,t)}function fN(){return e||process.env.AGENT_DEVICE_STATE_DIR?.trim()||void 0}async function fD(e,t){let r=fM(f_(e));"owned"===r.type&&await fT(r.lease,"owned",t)}function fP(e){e&&function(e){let t=f_(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{o.unlinkSync(fE(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function fk(e){let t=fE(e.deviceId);o.mkdirSync(a.dirname(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;o.writeFileSync(r,JSON.stringify(e,null,2),"utf8"),o.renameSync(r,t)}function fE(e){let t;return a.join((t=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim())?a.resolve(t):a.join(m.homedir(),".agent-device","apple-runner","leases"),`${e.replaceAll(/[^A-Za-z0-9._-]/g,"-")||"unknown-device"}.json`)}function fC(e){return"string"==typeof e&&e.length>0?e:null}function fR(e){return"string"==typeof e?e:null}function fO(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function fT(e,t,r){eI({level:"stale"===t||"same-state-dir"===t||"logical-lease-takeover"===t?"warn":"debug",phase:"ios_runner_lease_cleanup",data:{deviceId:e.deviceId,ownerPid:e.ownerPid,ownerStateDir:e.ownerStateDir,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),fP(e)}function fL(e,t){return`${e}:${t}:${Date.now()}`}function fF(e){return"number"==typeof e&&Number.isFinite(e)&&e>0?Math.floor(e):void 0}function f$(e=process.env){return!1!==eh(e.AGENT_DEVICE_IOS_RUNNER_DETACH??"")}async function fU(e,t){let r;if("simulator"!==e.kind||!f$()||tI(e.simulatorSetPath))return null;let n="stale"===(r=fM(f_(e.id))).type?r.lease:null;if(!n)return null;let i=t=>(eI({level:"debug",phase:"ios_runner_lease_adoption_skipped",data:{deviceId:e.id,runnerPid:n.runnerPid,port:n.port,reason:t}}),null),o=n.runnerPid;if(!o)return i("runner_pid_missing");if(!e9(o))return i("runner_process_dead");let s=function(e){try{return fr(e,pK(e))}catch{return null}}(e);if(!s)return i("expected_derived_unresolved");if(!n.xctestrunPath.startsWith(`${s}${a.sep}`))return i("artifact_fingerprint_mismatch");if(!await fB(e,n.port))return i("probe_failed");let l=function(e,t,r,n,i){var a;let o,s,l=fL(e.id,t.port),d={xctestrunPath:t.xctestrunPath,derived:n,cache:"exact",artifact:"valid",buildMs:0,xctestrunPathSource:"manifest",reason:"adopted_from_lease"},{child:c,wait:u}=(o={pid:a=r,exitCode:null},s=new Promise(e=>{let t=setInterval(()=>{e9(a)||(clearInterval(t),o.exitCode=-1,e({stdout:"",stderr:"",exitCode:-1}))},1e3);t.unref?.()}),{child:o,wait:s});return{sessionId:l,device:e,deviceId:e.id,port:t.port,xctestrunPath:t.xctestrunPath,xctestrunArtifact:d,jsonPath:t.jsonPath,testPromise:u,child:c,ready:!0,startupTimeoutMs:fF(i.startupTimeoutMs),lease:fA({deviceId:e.id,sessionId:l,runnerPid:r,port:t.port,xctestrunPath:t.xctestrunPath,jsonPath:t.jsonPath})}}(e,n,o,s,t);try{fk(l.lease)}catch{return null}return eI({level:"info",phase:"ios_runner_lease_adopted",data:{deviceId:e.id,sessionId:l.sessionId,runnerPid:o,port:n.port,previousOwnerPid:n.ownerPid}}),l}async function fB(e,t){try{let r=await uX(e,t,uB({command:"uptime"}),500),n=JSON.parse(await r.text());return n?.ok===!0}catch{return!1}}let fG={cleanupRunnerProcessTree:fQ,cleanupRunnerXcodebuildProcesses:f0,cleanupTempFile:u8};async function fq(e,t={}){var r;!1!==t.graceful?await fH(e):await fQ(e.child.pid,"SIGTERM"),await fW(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(fJ(r)||e6(r))&&await fQ(e.child.pid,"SIGKILL"),await fz(e)}async function fV(e){await fD(e,fG)}async function fj(e){let t=Array.from(pN);await fZ(e,"SIGINT"),await fY(t,"SIGINT"),await fZ(e,"SIGTERM"),await fY(t,"SIGTERM"),await fZ(e,"SIGKILL"),await fY(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await fz(e)}))}async function fK(){let e=Array.from(pN);await Promise.allSettled(e.map(async e=>{try{await fQ(e.pid,"SIGTERM"),await fQ(e.pid,"SIGKILL")}finally{pN.delete(e)}}))}async function fH(e){try{await uV(e.device,e.port,uB({command:"shutdown"}),void 0,15e3)}catch{await fQ(e.child.pid,"SIGTERM")}}async function fW(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function fz(e){await fX(e.device),u8(e.xctestrunPath),u8(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{fP(e.lease)}}async function fX(e){"simulator"===e.kind&&await Promise.allSettled(pE.map(async t=>{try{await oV(uR(e,["terminate",e.id,t]),{allowFailure:!0,timeoutMs:2e3})}catch(r){eI({level:"warn",phase:"ios_runner_simulator_app_terminate_failed",data:{deviceId:e.id,bundleId:t,timeoutMs:2e3,error:r instanceof Error?r.message:String(r)}})}}))}function fJ(e){return!!e&&e9(e)}async function fZ(e,t){await Promise.allSettled(e.map(async e=>{await fQ(e.child.pid,t)}))}async function fY(e,t){await Promise.allSettled(e.map(async e=>{await fQ(e.pid,t),"SIGKILL"===t&&pN.delete(e)}))}async function fQ(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 oq("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function f0(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${f1(e)}-${f1(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${f1(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await oq("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 f1(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function f2(e){let t=await f3(e.logPath);return t?new tn(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 f3(e){if(!e)return;let t=await f5(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")?{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 f5(e,t){let r;try{let n=await v.stat(e),i=Math.max(0,n.size-t),a=n.size-i;if(a<=0)return;r=await v.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 f4=new Map,f6=new Map,f8=new Map;async function f9(e,t){return ms(e.id),await uu(f6,e.id,async()=>{let r=f4.get(e.id);if(r){let t=await me(e,r);if(t)return t}return await fI(e.id,async()=>await f7(e,t))})}async function f7(e,t){let r,n,i,a={},o=function(e,t){if(!e)return;let r=Object.entries({leaseId:mI(e.leaseId),clientId:mI(e.clientId),tenantId:mI(e.tenantId),runId:mI(e.runId),leaseProvider:mI(e.leaseProvider),deviceKey:mI(e.deviceKey)??t}).filter(([,e])=>void 0!==e);return r.length>0?Object.fromEntries(r):void 0}(t.runnerLeaseContext,e.id);eI({level:"debug",phase:"ios_runner_session_startup",data:{deviceId:e.id,logicalLeaseContext:o}});let s=await mS(a,"adopt_detached_runner",async()=>await fU(e,{startupTimeoutMs:t.startupTimeoutMs}));if(s)return s.startupTimings=a,s.logicalLeaseContext=o,f4.set(e.id,s),s;await mS(a,"cleanup_stale_xcodebuild",async()=>{await fx(e.id,fG,o)}),await mS(a,"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()):mp(t))}),await mS(a,"verify_developer_mode",async()=>{await mf(e)}),t.cleanStaleBundles?await mS(a,"cleanup_stale_bundles",async()=>{await mt(e)}):(a.cleanup_stale_bundles=0,eI({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let l=await mS(a,"ensure_xctestrun",async()=>await p$(e,t));a.build_xctestrun=l.buildMs;let d=await mS(a,"allocate_port",async()=>await u3()),{xctestrunPath:c,jsonPath:u}=await mS(a,"prepare_xctestrun_env",async()=>await p6(l.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(d)},`session-${e.id}-${fb}-${d}`,{iosXctestEnvDir:t.iosXctestEnvDir})),p=await mS(a,"simulator_set_redirect",async()=>await pR(e)),f=["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",fn(e),"1","-destination-timeout",String(20),"-xctestrun",c,"-derivedDataPath",l.derived,"-destination","macOS"===(i=pm(e))?`platform=macOS,arch=${pw()}`:"simulator"===e.kind?`platform=${i} Simulator,id=${e.id}`:`platform=${i},id=${e.id}`];try{l.buildMs>0&&rB({type:"command",status:"progress",message:"Starting XCTest runner..."}),{child:r,wait:n}=await mS(a,"launch_xcodebuild",()=>ev("xcodebuild",f,{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(d)},detached:!0}))}catch(e){throw await p?.release(),e}r.stdout?.on("data",e=>{u5(e,t.logPath,t.traceLogPath,t.verbose)}),r.stderr?.on("data",e=>{u5(e,t.logPath,t.traceLogPath,t.verbose)});let m=fL(e.id,d),h=fA({deviceId:e.id,sessionId:m,runnerPid:r.pid,port:d,xctestrunPath:c,jsonPath:u}),w={sessionId:m,device:e,deviceId:e.id,port:d,xctestrunPath:c,xctestrunArtifact:l,jsonPath:u,testPromise:n,child:r,ready:!1,startupTimeoutMs:fF(t.startupTimeoutMs),startupTimings:a,logicalLeaseContext:o,simulatorSetRedirect:p??void 0,lease:h};try{fk(h)}catch(t){throw await ma(e.id,w,{graceful:!1,waitTimeoutMs:1e3}),t}return f4.set(e.id,w),w}async function me(e,t){if(!fJ(t.child.pid))return await mS({},"stop_stale_session",async()=>{await ma(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=t.xctestrunArtifact;if(r?.cache==="external")return eI({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,cache:r.cache,logicalLeaseContext:t.logicalLeaseContext}}),t;let n=fr(e,pK(e));return r?.derived!==n?(eI({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:r?.derived,expectedDerived:n}}),await mS({},"stop_stale_artifact_session",async()=>{await ma(e.id,t)}),null):(eI({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,logicalLeaseContext:t.logicalLeaseContext}}),t)}async function mt(e){if("simulator"===e.kind)for(let t of pE){let r=await mr(e,t);if(!r||function(e){if(0===e.exitCode)return!0;let t=`${e.stdout}
17
- ${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 mr(e,t){try{return await oV(uR(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 mn(e){let t=f4.get(e);return t?{sessionId:t.sessionId,alive:fJ(t.child.pid)}:null}async function mi(e,t){await uu(f6,e.deviceId,async()=>{f4.get(e.deviceId)===e&&(eI({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await ma(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function ma(e,t,r={}){let n=t??f4.get(e);n&&(await fq(n,r),f4.get(e)===n&&f4.delete(e))}function mo(e){ms(e);let t=function(e=process.env){let t=e.AGENT_DEVICE_IOS_RUNNER_IDLE_STOP_MS?.trim();if(t){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.floor(e)}return 3e5}();if(t<=0||!f4.has(e))return;let r=setTimeout(()=>{f8.delete(e),eI({level:"info",phase:"ios_runner_idle_stop",data:{deviceId:e,idleMs:t}}),ml(e).catch(t=>{eI({level:"warn",phase:"ios_runner_idle_stop_failed",data:{deviceId:e,error:t instanceof Error?t.message:String(t)}})})},t);r.unref?.(),f8.set(e,r),eI({level:"debug",phase:"ios_runner_idle_stop_scheduled",data:{deviceId:e,idleMs:t}})}function ms(e){let t=f8.get(e);t&&(clearTimeout(t),f8.delete(e))}async function ml(e){ms(e),await uu(f6,e,async()=>{await fI(e,async()=>{await ma(e),await fV(e)})})}async function md(){let e=Array.from(f4.values());for(let t of(await fj(e),e))f4.get(t.deviceId)===t&&f4.delete(t.deviceId)}async function mc(){if(!f$())return 0;let e=0;for(let[r,n]of f4)if("simulator"===n.device.kind&&!n.simulatorSetRedirect&&n.lease&&fJ(n.child.pid)){try{var t;fk({...t=n.lease,ownerToken:`detached-${t.ownerToken}`})}catch{continue}f4.delete(r),ms(r),e+=1,eI({level:"info",phase:"ios_runner_session_detached",data:{deviceId:r,sessionId:n.sessionId,runnerPid:n.child.pid,port:n.port}})}return e}async function mu(){await md();let e=Array.from(f4.keys());await Promise.allSettled(e.map(async e=>{await ml(e)})),await fK()}async function mp(e){await oV(uR(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}async function mf(e){if(!eU(e)||"device"!==e.kind)return;let t=await oq("DevToolsSecurity",["-status"],{allowFailure:!0,timeoutMs:2e3}),r=`${t.stdout}
18
- ${t.stderr}`;if(/developer mode is currently disabled/i.test(r))throw new tn("COMMAND_FAILED","Developer mode is disabled for Apple development tools",{hint:"Run `sudo DevToolsSecurity -enable`, then retry the iOS runner. UI test runners start suspended until Xcode/testmanagerd can attach.",devToolsSecurityStatus:r.trim()})}function mm(e){if(!eF(e.platform))throw new tn("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new tn("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function mh(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,logicalLeaseContext:o.logicalLeaseContext,timings:o.startupTimings}}));let f=uB(r),m=fw(f.command),h=tx.fromTimeoutMs(i),w=function(e,t){let r=fw(t.command);if(!e.ready)return r?{action:"skip",reason:"read_only_startup_command"}:{action:"run",reason:"startup"};if(fh[t.command].readinessProbe)return{action:"skip",reason:"readiness_probe_command"};if(!fv(t.command))return{action:"run",reason:"conservative_command"};let n=e.lastHealthyMutation;if(!n)return{action:"run",reason:"no_recent_healthy_mutation"};if(t.appBundleId!==n.appBundleId)return{action:"run",reason:"app_activation_uncertain"};let i=Date.now()-n.atMs;return i>5e3?{action:"run",reason:"healthy_mutation_stale",lastHealthyMutationAgeMs:i}:{action:"skip",reason:"recent_healthy_mutation",lastHealthyMutationAgeMs:i}}(t,f);"run"===w.action?await my({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 mv({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,timeoutMs:i,signal:a,readOnlyCommand:m})}catch(e){throw mw(e,t,w)}try{let e=await mg(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 mi(t,r)):fv(f.command)&&(t.lastHealthyMutation={atMs:Date.now(),appBundleId:f.appBundleId}),e}catch(r){let e=function(e){if(e instanceof tn){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 mi(t,e),r;if((u=r)instanceof tn&&u.details?.runner!==void 0)throw r;throw mw(r,t,w)}}function mw(e,t,r){return"skip"!==r.action||"recent_healthy_mutation"!==r.reason?e:(t.lastHealthyMutation=void 0,mb(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:r.reason,runnerReadinessPreflightSkippedAgeMs:r.lastHealthyMutationAgeMs}))}async function mv(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 tn("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 eb("ios_runner_command_send",async()=>l?await uV(t,r.port,n,i,d,r,s):await uX(t,r.port,n,d,s),c)}async function my(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(mA(r),a.remainingMs());try{let e=await eb("ios_runner_readiness_preflight",async()=>await uV(t,r.port,uB({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:r.ready,timeoutMs:l});await mg(e,r,i)}catch(e){throw mb(e,{runnerReadinessPreflightFailed:!0})}}async function mg(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new tn("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?te(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 f2({error:new tn(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 mb(e,t){let r=e instanceof tn?e:new tn("COMMAND_FAILED",e instanceof Error?e.message:String(e),void 0,e);return new tn(r.code,r.message,{...r.details??{},...t},r.cause??e)}function mA(e){return e.startupTimeoutMs??45e3}async function mS(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})}}function mI(e){return"string"==typeof e&&e.trim().length>0?e.trim():void 0}let m_=new p;function mM(e,t={}){return{runCommand:e,...t}}function mx(e,t,r,n={}){if(r)return mD(r);let i=function(e,t={}){let r=m_.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?mD(i.provider):mD(t)}async function mN(e,t,r){if(!e)return await r();let n={provider:mD(e),deviceId:t.deviceId,requestId:t.requestId};return await m_.run(n,r)}function mD(e){return"function"==typeof e?{runCommand:e}:e}async function mP(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await mC(t,r,n,i,a,o);return await mk(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function mk(e,t){var r,n,i,a;if(!e)return await mE(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,mT({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,mT({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await mE(t,e.reason,e.lifecycleState,e.error)}async function mE(e,t,r,n){throw mT({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 mC(e,t,r,n,i,a){var o,s,l,d,c,u,p,f,m,h,w,v;let y,g,b,A,S;if("status"===r.command||!r.commandId?.trim())return;let I=mO(n);try{y=await mh(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),...I}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let _="string"==typeof y.lifecycleState?y.lifecycleState:"";return eI({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:_,...I}}),o=y,s=_,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(fw(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let s=mO(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new tn("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,`${mR(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,g="string"==typeof u.lifecycleErrorCode?u.lifecycleErrorCode:void 0,b="string"==typeof u.lifecycleErrorMessage?u.lifecycleErrorMessage:"Runner command failed",A="string"==typeof u.lifecycleErrorHint?u.lifecycleErrorHint:void 0,S=mO(f),new tn(te(g),b,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...S,hint:A??(h=p.command,w=S,`${mR(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(fw(t.command))return r;let s=mO(r);return new tn("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,`${mR(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 tn("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:(v=l.command,`The runner did not confirm that "${v}" 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 mR(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 mO(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 mT(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 mL(e,t){let r;uG(t.requestId);let n=rN(t.requestId),i=uB({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await mF({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new tn("COMMAND_FAILED","iOS runner prepare failed")}async function mF(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await f9(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles,...mK(n,"runner_session")}),d=Date.now()-s;try{var c,u;let e=await mj(t,l,r,n,i,d,{recoveryReason:o});return{kind:"prepared",result:(c=t,u=e,mW(c,u),u)}}catch(e){return await m$({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function m$(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:d}=e,c=d instanceof tn?d:new tn("COMMAND_FAILED",String(d));if(1===l&&(t=c,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&mG(t)))return{kind:"prepared",result:await mU({device:n,session:i,command:a,options:o,signal:s,error:c})};if(!mG(c))throw d;let u=c.message||"runner_health_failed";if(l>=2)throw await mB(i,"prepare_runner_health_failed"),d;return uG(o.requestId),await mi(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 mU(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 mi(s,"prepare_cached_runner_health_failed"),await pz(s.xctestrunArtifact,p);let f=Date.now(),m=await f9(o,{...d,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0,...mK(d,"runner_rebuild")}),h=Date.now()-f;try{let e=await mj(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,mW(t,r),r}catch(r){let e;await mB(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof tn?n:new tn("COMMAND_FAILED",String(n)),new tn(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 mW(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 mB(e,t){try{await mi(e,t)}catch{}}function mG(e){let t;return!rk(e)&&(uL(e)||uF(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function mq(e,t,r){let n;uG(r.requestId);let i=rN(r.requestId);try{let a=(n=await f9(e,r)).ready?45e3:mA(n);return await mh(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof tn?o:new tn("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&uF(a)&&n)return uG(r.requestId),await mV({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&&(uL(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return uG(r.requestId),await mV({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&&uL(a))return await mP({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:mi});throw o}}async function mV(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await mi(e.session,a);let o=await f9(t,{...n,cleanStaleBundles:!0});try{let a=await mh(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 tn?a:new tn("COMMAND_FAILED",String(a));if(uL(e))return await mP({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:mi});throw a}}async function mj(e,t,r,n,i,a,o){var s,l,d,c,u;let p,f,m=Date.now(),h=mH(n.prepareDeadline,n.healthTimeoutMs,"runner_health");return s=await mh(e,t,r,n.logPath,h,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 mK(e,t){if(!e.prepareDeadline)return{};let r=mH(e.prepareDeadline,e.buildTimeoutMs,t);return{buildTimeoutMs:r,startupTimeoutMs:r}}function mH(e,t,r){if(!e)return t??45e3;let n=Math.floor(e.remainingMs());if(n<=0)throw new tn("COMMAND_FAILED","prepare ios-runner timed out",{phase:r,reason:"prepare_deadline_expired"});return n}function mW(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 mz(e,t,r={}){mm(e),uG(r.requestId);let n=uB(t),i=mQ(e,r);return fw(n.command)?tM(()=>(uG(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(uG(r.requestId),uL(e))}):i.runCommand(e,n,r)}function mX(e,t={}){if(eU(e))return mZ({device:e,options:t,failurePhase:"ios_runner_cache_prewarm_failed",task:async t=>{await p$(e,t)}})}function mJ(e,t={}){if(!eU(e))return;let r=mQ(e,t).prewarm;return r?mZ({device:e,options:t,failurePhase:"ios_runner_session_prewarm_failed",task:async t=>{await r(e,t)}}):void eI({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}function mZ(e){let{device:t,options:r,failurePhase:n,task:i}=e,{propagateError:a=!1,...o}=r;return i(o).catch(e=>{if(eI({level:"warn",phase:n,data:{deviceId:t.id,error:e instanceof Error?e.message:String(e)}}),a)throw e})}async function mY(e,t){mm(e),uG(t.requestId);let r=uB({command:"uptime"}),n=mQ(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 mQ(e,t){return mx(e,m0,void 0,{requestId:t.requestId})}let m0=mM(mq,{prepare:mL,prewarm:async(e,t)=>{await mL(e,{...t,healthTimeoutMs:45e3})}});async function m1(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function m2(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}
19
- `)},flush:()=>{n&&(i(n),n="")}}}function m3(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 m5(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new tn("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function m4(e,t){let r=(await tG(tO(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function m6(e,t){var r,n;let i;m5(t);let a=await m4(e,t),o=tG(tO(e)),s=await t$(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 m8(e,t,r,n,i){let a,o,s="recovering",l=!1,d=(async()=>{try{for(;!l;){let d=await m4(e,t);if(!d){s="recovering",await tg(1e3);continue}let c=tE(tO(e)),u=tk(c,{pid:d});a=u;let p=m2(r,{redactionPatterns:n});if(o=m3(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&rw(i,u.pid),s="active",await o,rv(i),a=void 0,o=void 0,l)break;s="recovering",await tg(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),rv(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:d,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await m1(o),a&&!a.killed&&a.kill("SIGKILL"),await m1(d),rv(i)}}}function m9(e,t){let r=ht(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=ht(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 m7(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=uC(["spawn",t,"log","show","--style","compact","--info","--predicate",m9(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 oV(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")}
20
- `,recoveredLineCount:l.length}}async function he(e,t,r,n,i,a){let o=await hr({deviceId:e,appBundleId:t,simulatorSetPath:i});return ha({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return uC(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",m9(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function ht(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function hr(e){let{deviceId:t,appBundleId:r,simulatorSetPath:n}=e,i=await oV(uC(["get_app_container",t,r,"app"],{simulatorSetPath:n}),{allowFailure:!0,timeoutMs:4e3});if(0!==i.exitCode)return;let o=i.stdout.trim();if(!o)return;let s=a.join(o,"Info.plist"),l=await eS("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function hn(e,t,r,n){return ha({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",m9(e)],stream:t,redactionPatterns:r,pidPath:n})}async function hi(e,t,r,n){return ha({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function ha(e){let t="active",r=ev(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=m2(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&rw(e.pidPath,n.pid);let a=m3(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),rv(e.pidPath),r),r=>{throw t="failed",rv(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await m1(a),n.killed||n.kill("SIGKILL"),await m1(a),rv(e.pidPath)}}}let ho=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),hs=/https?:\/\/[^\s"'<>\])]+/i,hl=[/\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 hd(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>hu(e)));for(let e of t.entries){let t=hu(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function hc(e,t){let r=hA(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=hA(t?.maxPayloadChars,2048,64,16384),o=hA(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=hv(s,["method","httpMethod"]),d=hv(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=ho.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=hs.exec(o),h=d??m?.[0];if(!h)return null;let w=c??hf(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 v={method:f,url:h,status:w,timestamp:hm(o),packetId:hh(o)??void 0,durationMs:hw(o)??void 0,raw:hb(o,a),line:r};if("android"===n&&function(e,t,r){let n=hp(t,r,5),i=e.packetId??n.map(e=>hh(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?hp(t,r,12).filter(e=>hh(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>hm(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>hf(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>hw(e)).find(e=>"number"==typeof e))}(v,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 hg(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(v.headers=hb(e,a))}if("body"===i||"all"===i){let e=hy(o,s,["requestBody","body","payload","request"]),t=hy(o,s,["responseBody","response"]);e&&(v.requestBody=hb(e,a)),t&&(v.responseBody=hb(t,a))}return v}(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 hu(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function hp(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 hf(e){for(let t of hl){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function hm(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 hh(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function hw(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 hv(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 hy(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return hg(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 hg(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function hb(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function hA(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}ad();let hS={start:async e=>await hC(e)},hI=ok(hS,function(e={}){return{...hS,...e}});async function h_(e,t){return await hI.run(e,t)}function hM(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 hx(e){let t=a.dirname(e);o.existsSync(t)||o.mkdirSync(t,{recursive:!0}),function(e,t){if(o.existsSync(e)&&!(o.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}`;o.existsSync(t)&&(o.existsSync(n)&&o.unlinkSync(n),o.renameSync(t,n))}}(e,{maxBytes:hM("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:hM("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function hN(e){if(!o.existsSync(e))return{exists:!1,sizeBytes:0};let t=o.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}function hD(e){return i8(e.platform)?.appLog?.resolveBackend(e)??"android"}async function hP(e){var t,r,n,i;let a,s,l,d,{device:c,appBundleId:u,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:v,maxScanLines:y}=e,g=hD(c),b=(t={backend:g,maxEntries:h,include:w,maxPayloadChars:v,maxScanLines:y},a=hA(t?.maxEntries,25,1,200),s=t?.include??"summary",l=hA(t?.maxPayloadChars,2048,64,16384),d=hA(t?.maxScanLines,4e3,100,2e4),o.existsSync(m)?hc(o.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:a,maxPayloadChars:l,maxScanLines:d}}),A=[],S=await hk({device:c,appBundleId:u,appLogPath:m,appLogState:p});if(S){let e=await m6(c.id,u);if(e){let t=hc(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:v,maxScanLines:y});t.entries.length>0&&(b=hd(t,b,h),A.push((r=S,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(eU(c)&&"simulator"===c.kind&&u&&0===b.entries.length){let e=await hR({deviceId:c.id,appBundleId:u,startedAt:f,simulatorSetPath:c.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:v,maxScanLines:y});e&&(e.dump.entries.length>0?(b=hd(e.dump,b,h),A.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&&A.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?A.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===A.length&&(eU(c)&&"simulator"===c.kind?A.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."):A.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===b.entries.length&&A.push(eU(i=c)&&"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.":eU(i)?"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:g,dump:b,notes:A}}async function hk(e){let{device:t,appBundleId:r,appLogPath:n,appLogState:i}=e;if("android"!==t.platform||!r)return null;if(void 0!==i&&"active"!==i)return{reason:"inactive"};if("active"!==i)return null;let s=function(e){let t=function(e){if(!e||!o.existsSync(e))return null;try{return rh(o.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}(a.join(a.dirname(n),rm));if(!s)return null;let l=await m4(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function hE(e,t,r,n){return await hI.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function hC({device:e,appBundleId:t,outPath:r,pidPath:n}){hx(r);let i=o.createWriteStream(r,{flags:"a"}),a=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(eU(e))return"device"===e.kind?await hi(e.id,i,a,n):await he(e.id,t,i,a,e.simulatorSetPath,n);if("android"===e.platform)return m5(t),await m8(e.id,t,i,a,n);if(eE(e))return await hn(t,i,a,n);throw i.end(),new tn("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function hR(e){let t=await m7({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:hc(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 hO(e){await e.stop(),await m1(e.wait)}async function hT(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 tS(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await tS(e,["shell","pidof",t],{allowFailure:!0,timeoutMs:1e3})).stdout.trim().length>0}catch{r.androidPidVisible=!1}}if(eU(e)&&"simulator"===e.kind)try{let e=await oV(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if(eU(e)&&"device"===e.kind)try{let e=await oV(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if(eE(e))try{let e=await eS("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function hL(e,t){hx(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
21
- `;o.appendFileSync(e,r,"utf8")}function hF(e){let t=a.dirname(e),r=a.basename(e);o.existsSync(t)||o.mkdirSync(t,{recursive:!0}),o.existsSync(e)?o.truncateSync(e,0):o.writeFileSync(e,"","utf8");let n=0;for(let e of o.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let i=e.slice(r.length+1);if(/^\d+$/.test(i))try{o.unlinkSync(a.join(t,e)),n+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:n}}function h$(e,t){for(let r of e){if(t(r))return r;let e=h$(r.children,t);if(e)return e}}function hU(e,t){let r=[];for(let n of e)t(n)&&r.push(n),r.push(...hU(n.children,t));return r}function hB(e,t){let r=h$(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 hG(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 hq(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.numberValue??null:hG(e):null}function hV(e){return Math.round(10*e)/10}async function hj(e,t,r={}){let n=["devicectl",...e],i=await oV(n,{allowFailure:!0,timeoutMs:r.timeoutMs??2e4});if(0===i.exitCode)return;let a=String(i.stdout??""),o=String(i.stderr??"");throw new tn("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:n,exitCode:i.exitCode,stdout:a,stderr:o,deviceId:t.deviceId,hint:hX(a,o)??hz})}async function hK(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 hW(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"})),oE(r,t)}async function hH(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 hW(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 hW(e,t){let r=a.join(m.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=[...t.args,"--json-output",r],i=await oV(n,{allowFailure:!0,timeoutMs:2e4});try{if(0!==i.exitCode){let r=String(i.stdout??""),a=String(i.stderr??"");throw new tn("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:n,exitCode:i.exitCode,stdout:r,stderr:a,deviceId:e.id,hint:hX(r,a)??hz})}return JSON.parse(await l.readFile(r,"utf8"))}catch(r){if(r instanceof tn)throw r;throw new tn("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await l.unlink(r).catch(()=>{})}}let hz="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function hX(e,t){let r=`${e}
22
- ${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 hJ(e,t){try{let r=await oj(e),n=r?.[t];if("string"==typeof n&&n.length>0)return n}catch{}try{let r=await oq("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 l.readFile(e,"utf8"),n=t,nH(nK(r),(e,t)=>{void 0===i&&e===n&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}let hZ="xctrace-animation-hitches";function hY(e,t){let r=nK(e),n=hB(r,t);return{rows:0===n.length?[]:hU(r,e=>"row"===e.name),schema:n}}function hQ(e,t){for(let r of e)hQ(r.children,t),r.attributes.id&&t.set(r.attributes.id,{numberValue:hG(r),process:h0(r)})}function h0(e){if(!e||e.children.some(e=>"sentinel"===e.name))return null;let t=hG(h$(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 h1="ps-process-snapshot",h2="ps-process-snapshot",h3="xctrace-activity-monitor",h5="xctrace-activity-monitor",h4="leaks-output-graph",h6="Memory graph captured with leaks --outputGraph for host-visible Apple app processes.";async function h8(e,t){if(eU(e)&&"device"===e.kind)return await ww(e,t);let r=await wh(e,t),n=await wS(e,r);if(0===n.length)throw new tn("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 wD({usagePercent:n.reduce((e,t)=>e+t.cpuPercent,0),residentMemoryKb:n.reduce((e,t)=>e+t.rssKb,0),measuredAt:i,matchedProcesses:[r.executableName],cpuMethod:h1,memoryMethod:h2})}async function h9(e,t,r){let n,i=wa(e);if(!i.memgraph)return{available:!1,kind:"memgraph",reason:i.reason,hint:i.hint,support:i};let o=await w_(e,t,i);if(!1===o.available)return o;let{process:s}=o;await l.mkdir(a.dirname(r),{recursive:!0});let d=await we(r);try{n=await h7(e,r,s.pid)}catch(n){throw await wt(r,d),function(e,t,r,n,i){if(i instanceof tn){let o=i.details??{};return new tn(i.code,`Failed to capture Apple memgraph for ${t}`,{...o,kind:"memgraph",appBundleId:t,pid:r.pid,processName:a.basename(wN(r.command)),path:n,hint:wM(e,"string"==typeof o.stdout?o.stdout:"","string"==typeof o.stderr&&o.stderr.length>0?o.stderr:i.message)},i)}return new tn("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:r.pid,processName:a.basename(wN(r.command)),path:n,hint:"Retry perf memory snapshot. If it still fails, run with --debug and inspect leaks output."},i)}(e,t,s,r,n)}if(0!==n.exitCode)throw await wt(r,d),new tn("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:s.pid,processName:a.basename(wN(s.command)),path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:wM(e,n.stdout,n.stderr)});let c=await l.stat(r).catch(()=>null);if(!c?.isFile()||c.size<=0)throw await wt(r,d),new tn("COMMAND_FAILED","Apple memgraph artifact is missing or empty",{kind:"memgraph",appBundleId:t,pid:s.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:h4,appBundleId:t,pid:s.pid,processName:a.basename(wN(s.command)),support:i}}async function h7(e,t,r){return eE(e)?await oq("leaks",[`--outputGraph=${t}`,String(r)],{allowFailure:!0,timeoutMs:12e4}):await oV(uR(e,["spawn",e.id,"leaks",`--outputGraph=${t}`,String(r)]),{allowFailure:!0,timeoutMs:12e4})}async function we(e){return await l.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function wt(e,t){t||await l.rm(e,{force:!0}).catch(()=>{})}async function wr(e,t){var r;let n,i,o,s,l,d;if(!eU(e)||"device"!==e.kind)throw new tn("COMMAND_FAILED","Apple frame-health sampling is currently available only on connected iOS devices.",{metric:"fps",platform:eR(e),deviceKind:e.kind});let u=await wv(e,t),p=await wo(e,t,u);return n=hY((r={hitchesXml:p.hitchesXml,frameLifetimesXml:p.frameLifetimesXml,displayInfoXml:p.displayInfoXml,processIds:u.map(e=>e.pid),processNames:rs(u.map(e=>a.basename(c(e.executable)))),windowStartedAt:p.windowStartedAt,windowEndedAt:p.windowEndedAt,measuredAt:p.windowEndedAt}).frameLifetimesXml,"hitches-frame-lifetimes").rows.length,i=function(e){if(!e)return;let{rows:t,schema:r}=hY(e,"device-display-info"),n=r.indexOf("max-refresh-rate");if(n<0)return;let i=new Map;for(let e of t){hQ(e.children,i);let t=hq(e.children[n],i);if(null!==t&&t>0)return t}}(r.displayInfoXml),s=(o=(function(e){let t,r,n=nK(e),i=Object.values(r={start:(t=hB(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 hU(n,e=>"row"===e.name).map(e=>(function(e,t,r){var n,i,a;let o;if(hQ(e.children,r),!0===(n=e.children[t.isSystem],null===(o=hq(n,r))?null:0!==o))return null;let s=hq(e.children[t.start],r),l=hq(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:h0(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))),d=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:hV(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?hV(s/n*100):0,droppedFrameCount:s,totalFrameCount:n,sampleWindowMs:l,windowStartedAt:r.windowStartedAt,windowEndedAt:r.windowEndedAt,measuredAt:r.measuredAt,method:hZ,matchedProcesses:[...new Set(o.map(e=>e.processName).filter(e=>"string"==typeof e&&e.length>0))],frameDeadlineMs:void 0===i?void 0:hV(1e3/i),refreshRateHz:i,worstWindows:d.length>0?d:void 0}}function wn(e){return eU(e)&&"device"===e.kind?{method:hZ,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:hZ,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 wi(e){let t=wn(e);if(eU(e)&&"device"===e.kind)return{fps:t,memory:{method:h5,description:"Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"kB"},cpu:{method:h3,description:"Recent CPU usage snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"percent"}};let r=eE(e)?"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:h2,description:`Resident memory snapshot from ${r}`,unit:"kB"},cpu:{method:h1,description:`Recent CPU usage snapshot from ${r}`,unit:"percent"}}}function wa(e){return eU(e)&&"device"===e.kind?{platform:eR(e),deviceKind:e.kind,memgraph:!1,method:h4,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."}:eU(e)&&"simulator"===e.kind?{platform:eR(e),deviceKind:e.kind,memgraph:!0,method:h4,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."}:eE(e)?{platform:eR(e),deviceKind:e.kind,memgraph:!0,method:h4,reason:"macOS app processes are host-visible to leaks --outputGraph.",hint:"Grant Terminal/agent process permissions if macOS denies process inspection."}:{platform:eR(e),deviceKind:e.kind,memgraph:!1,method:h4,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 wo(e,t,r){let n=await l.mkdtemp(a.join(m.tmpdir(),"agent-device-ios-frame-perf-")),i=a.join(n,"animation-hitches.trace"),o=a.join(n,"hitches.xml"),s=a.join(n,"frame-lifetimes.xml"),d=a.join(n,"display-info.xml");try{let n=await ws({device:e,appBundleId:t,tracePath:i,template:"Animation Hitches",duration:"2s",targetPids:r.map(e=>e.pid),validateTraceOutput:!0,failureMessage:`Failed to record iOS frame-health sample for ${t}`});await wp(e,t,i,"hitches",o),await wp(e,t,i,"hitches-frame-lifetimes",s);let a=await wf(e,t,i,"device-display-info",d);return{windowStartedAt:n.startedAt,windowEndedAt:n.endedAt,hitchesXml:await l.readFile(o,"utf8"),frameLifetimesXml:await l.readFile(s,"utf8"),displayInfoXml:a?await l.readFile(d,"utf8"):void 0}}finally{await l.rm(n,{recursive:!0,force:!0}).catch(()=>{})}}async function ws(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 wl(s,e.tracePath);if(0===l.result.exitCode)return e.validateTraceOutput&&await wu(e,l.result.stdout,l.result.stderr),{startedAt:l.startedAt,endedAt:l.endedAt,capturedAtMs:l.capturedAtMs};throw new tn("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:wk(l.result.stdout,l.result.stderr)})}async function wl(e,t){let r;for(let n=1;n<=3;n+=1){await wc(t,n,1500);let i=new Date().toISOString(),a=await oV(e,{allowFailure:!0,timeoutMs:6e4});if(r={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},0===a.exitCode||!wd(a))break}return r}function wd(e){let t=`${e.stdout}
23
- ${e.stderr}`.toLowerCase();return t.includes("_lockkperf")||t.includes("could not lock kperf")||t.includes("likely another session just started")}async function wc(e,t,r){t<=1||(await l.rm(e,{recursive:!0,force:!0}).catch(()=>{}),await new Promise(e=>setTimeout(e,r)))}async function wu(e,t,r){let n=await l.stat(e.tracePath).catch(()=>null);if(!(n?.isDirectory()===!0?(await l.readdir(e.tracePath).catch(()=>[])).length>0:(n?.size??0)>0))throw new tn("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 wp(e,t,r,n,i){let a=["xctrace","export","--input",r,"--xpath",`/trace-toc/run/data/table[@schema="${n}"]`,"--output",i],o=await oV(a,{allowFailure:!0,timeoutMs:15e3});if(0!==o.exitCode)throw new tn("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:wk(o.stdout,o.stderr)})}async function wf(e,t,r,n,i){try{return await wp(e,t,r,n,i),!0}catch{return!1}}async function wm(e){let t=nK(e),r=hB(t,"activity-monitor-process-live");if(0===r.length)throw new tn("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 tn("COMMAND_FAILED","xctrace activity-monitor-process-live export is missing expected columns");let s=hU(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=h$(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:hG(e),processName:wP(e)})}let r=hq(t[n],d),s=(c=t[i],u=d,c?c.attributes.ref?u.get(c.attributes.ref)?.processName??null:wP(c):null);null!==r&&Number.isFinite(r)&&s&&l.push({pid:r,processName:s,cpuTimeNs:hq(t[a],d),residentMemoryBytes:hq(t[o],d)})}return l}async function wh(e,t){let r=eE(e)?await wb(t):await wA(e,t),n=eE(e)?a.join(r,"Contents","Info.plist"):a.join(r,"Info.plist"),i=await hJ(n,"CFBundleExecutable");if(!i)throw new tn("COMMAND_FAILED",`Failed to resolve executable for ${t}`,{appBundleId:t,appPath:r});return{executableName:i,executablePath:eE(e)?a.join(r,"Contents","MacOS",i):a.join(r,i)}}async function ww(e,t){let r=await wv(e,t),n=await wy(e,t),i=await wy(e,t),a=wg(await wm(n.xml),r,t,e),o=wg(await wm(i.xml),r,t,e),s=i.capturedAtMs-n.capturedAtMs;if(s<=0)throw new tn("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 tn("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 wD({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:h3,memoryMethod:h5})}async function wv(e,t){let r=(await hK(e,"all")).find(e=>e.bundleId===t);if(!r)throw new tn("APP_NOT_INSTALLED",`No iOS device app found for ${t}`,{appBundleId:t,deviceId:e.id});if(!r.url)throw new tn("COMMAND_FAILED",`Missing app bundle URL for ${t}`,{appBundleId:t,deviceId:e.id});let n=r.url.replace(/\/$/,""),i=c(n),a=(await hH(e)).filter(e=>e.executable.startsWith(`${n}/`));if(0===a.length)throw new tn("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 wy(e,t){let r=await l.mkdtemp(a.join(m.tmpdir(),"agent-device-ios-perf-")),n=a.join(r,"sample.trace"),i=a.join(r,"activity-monitor-process-live.xml");try{let r=await ws({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 wp(e,t,n,"activity-monitor-process-live",i),{capturedAtMs:r.capturedAtMs,xml:await l.readFile(i,"utf8")}}finally{await l.rm(r,{recursive:!0,force:!0}).catch(()=>{})}}function wg(e,t,r,n){let i=new Set(t.map(e=>e.pid)),o=new Set(t.map(e=>a.basename(c(e.executable)))),s=e.filter(e=>i.has(e.pid)||o.has(e.processName));if(0===s.length)throw new tn("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:wE(t.cpuTimeNs,e.cpuTimeNs),residentMemoryBytes:wE(t.residentMemoryBytes,e.residentMemoryBytes)})}let d=[...l.values()],u=d.map(e=>e.cpuTimeNs).filter(e=>null!==e),p=d.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:rs(d.map(e=>e.processName))}}async function wb(e){let t=`kMDItemCFBundleIdentifier == "${e.replaceAll('"','\\"')}"`,r=await oq("mdfind",[t],{allowFailure:!0,timeoutMs:15e3});if(0!==r.exitCode)throw new tn("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 tn("APP_NOT_INSTALLED",`No macOS app found for ${e}`,{appBundleId:e});return n}async function wA(e,t){let r=uR(e,["get_app_container",e.id,t,"app"]),n=await oV(r,{allowFailure:!0,timeoutMs:15e3});if(0!==n.exitCode)throw new tn("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 tn("APP_NOT_INSTALLED",`No iOS simulator app container found for ${t}`,{appBundleId:t});return i}async function wS(e,t){let r=eE(e)?["-axo","pid=,%cpu=,rss=,command="]:uR(e,["spawn",e.id,"ps","-axo","pid=,%cpu=,rss=,command="]);return(function(e){let t=[];for(let r of tH(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})((eE(e)?await oq("ps",r,{timeoutMs:15e3}):await wx(r)).stdout).filter(e=>(function(e,t){let r=wN(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 a.basename(r)===t.executableName})(e.command,t))}async function wI(e,t,r){let n=(await wS(e,r)).sort((e,t)=>t.rssKb-e.rssKb)[0];if(n)return n;throw new tn("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 w_(e,t,r){try{let r=await wh(e,t);return{available:!0,process:await wI(e,t,r)}}catch(t){if(function(e,t){if(!eU(e)||"simulator"!==e.kind||!(t instanceof tn))return!1;let r=t.details??{},n=Array.isArray(r.args)?r.args.join(" "):"",i="string"==typeof r.stderr?r.stderr:"",a=`${t.message}
24
- ${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 wM(e,t,r){let n=`${t}
25
- ${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")?eE(e)?"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 wx(e){let t=await oV(e,{allowFailure:!0,timeoutMs:15e3});return 0===t.exitCode?t:await oq("ps",["-axo","pid=,%cpu=,rss=,command="],{timeoutMs:15e3})}function wN(e){let[t=""]=e.trim().split(/\s+/,1);return t}function wD(e){return{cpu:{usagePercent:hV(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 wP(e){let t=e?.attributes.fmt?.trim()??"";return t?t.replace(/\s+\(\d+\)$/,"").trim():null}function wk(e,t){let r=hX(e,t);if(r)return r;let n=`${e}
26
- ${t}`.toLowerCase();return n.includes("no device matched")||n.includes("failed to find device")?hz: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 wE(e,t){return null===e?t:null===t?e:Math.max(e,t)}async function wC(e){var t;let r=await wL(e.device,e.appBundleId);await l.mkdir(a.dirname(e.outPath),{recursive:!0});let n=["xctrace","record","--template",(t={device:e.device,template:e.template,targetPids:r.pids,outPath:e.outPath}).template,...eU(t.device)?["--device",t.device.id]:[],...t.targetPids.flatMap(e=>["--attach",String(e)]),"--output",t.outPath,"--quiet","--no-prompt"],i=new Date().toISOString(),o=await wF(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:eR(e.device),targetPids:r.pids,targetProcesses:r.processNames,startedAt:i,child:o.child,wait:o.wait}}async function wR(e,t=e.outPath){t!==e.outPath&&await l.mkdir(a.dirname(t),{recursive:!0});let r=await wU(e,{failOnForcedKill:!0});if(0!==r.exitCode)throw new tn("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:wk(r.stdout,r.stderr)});return t!==e.outPath&&await l.rename(e.outPath,t).catch(async()=>{await l.cp(e.outPath,t,{recursive:!0}),await l.rm(e.outPath,{recursive:!0,force:!0})}),await wG(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 wO(e){return await wU(e,{failOnForcedKill:!1})}async function wT(e){let t=await l.mkdtemp(a.join(m.tmpdir(),"agent-device-xctrace-report-")),r=a.join(t,"trace-toc.xml");try{var n;let t,i,o,s=["xctrace","export","--input",e.tracePath,"--xpath","/trace-toc","--output",r],d=await oV(s,{allowFailure:!0,timeoutMs:15e3});if(0!==d.exitCode)throw new tn("COMMAND_FAILED","Failed to export Apple xctrace report metadata",{cmd:"xcrun",args:s,exitCode:d.exitCode,stdout:d.stdout,stderr:d.stderr,tracePath:e.tracePath,hint:wk(d.stdout,d.stderr)});let c=(n={...e,tocXml:await l.readFile(r,"utf8")},t=nK(n.tocXml),i=hU(t,e=>"run"===e.name),o=rs(hU(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:i.length,tableSchemas:o}});return await l.mkdir(a.dirname(e.outPath),{recursive:!0}),await l.writeFile(e.outPath,`${JSON.stringify(c,null,2)}
27
- `,"utf8"),c}finally{await l.rm(t,{recursive:!0,force:!0}).catch(()=>{})}}async function wL(e,t){if(!eF(e.platform))throw new tn("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(eU(e)&&"device"===e.kind){let r=await wv(e,t);return{pids:r.map(e=>e.pid),processNames:rs(r.map(e=>a.basename(c(e.executable))))}}let r=await wh(e,t),n=await wS(e,r);if(0===n.length)throw new tn("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 wF(e,t,r){let n;for(let r=1;r<=3;r+=1){await wc(t,r,1500);let i=ev("xcrun",e,{allowFailure:!0}),a=await w$(i.wait);if(!a)return i;if(n=a,!wd(a))break}let i=n??{stdout:"",stderr:"",exitCode:1};throw new tn("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:wk(i.stdout,i.stderr)})}async function w$(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function wU(e,t){e.child.kill("SIGINT");let r=await wB(e.wait,45e3);if(r)return r;e.child.kill("SIGKILL");let n=await wB(e.wait,5e3);if(n&&!t.failOnForcedKill)return n;if(n)throw new tn("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 tn("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 wB(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function wG(e,t){let r=await l.stat(e).catch(()=>null);if(!(r?.isDirectory()===!0?(await l.readdir(e).catch(()=>[])).length>0:(r?.size??0)>0))throw new tn("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 wq(e){let t=e.replaceAll(",","").match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let r=Number(t[0]);return Number.isFinite(r)?r:null}function wV(e){return Math.round(10*e)/10}let wj="adb-shell-dumpsys-gfxinfo-framestats",wK="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 wH(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 wW(e){return 0===e.length?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function wz(e,t){if(void 0!==e&&void 0!==t)return Math.max(0,Math.round((t-e)/1e6))}function wX(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:wq(i)??void 0}async function wJ(e,t,r={}){var n,i,a,o,s,l,d,c;let u=tG(e,r.adb);try{let d,c,p,f,m,h,w,v,y,g,b,A=(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 tn("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=wX(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=wq(i)??void 0,s=Number(a);if(void 0===o||!Number.isFinite(s)||r<0)return;let l=wX(t,"Uptime"),d=wX(t,"Stats since");return{droppedFramePercent:hV(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=wH(e,t,"Flags"),n=wH(e,t,"IntendedVsync"),i=wH(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 tn("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 tn("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=wW(t),a=n?.statsSinceNs,o=a??i.firstFrameNs,s=wz(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}),v=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=wW(e);return wz(t.firstFrameNs,t.lastFrameNs)}(f),a=p,o=f,s=v,d=a?.totalFrameCount??o.length,c=a?.droppedFrameCount??s.length,g={totalFrameCount:d,droppedFrameCount:c,droppedFramePercent:a?.droppedFramePercent??(d>0?hV(c/d*100):0)},b=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:wV(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:v,timing:w,measuredAtMs:h,summary:p}),{...g,sampleWindowMs:y,...(l=m,{frameDeadlineMs:void 0===l?void 0:wV(l/1e6),refreshRateHz:void 0===l?void 0:wV(1e9/l)}),windowStartedAt:w.windowStartedAt,windowEndedAt:w.windowEndedAt,timestampSource:w.timestampSource,measuredAt:i,method:wj,source:p?"android-gfxinfo-summary":"framestats-rows",worstWindows:b&&b.length>0?b:void 0});return await wZ(e,t,r),A}catch(e){throw d=t,(c=e)instanceof tn?new tn(c.code,c.message,{...c.details??{},metric:"fps",package:d},c):new tn("COMMAND_FAILED",`Failed to sample Android fps for ${d}`,{metric:"fps",package:d},c)}}async function wZ(e,t,r={}){let n=tG(e,r.adb);try{await n(["shell","dumpsys","gfxinfo",t,"reset"],{allowFailure:!0,timeoutMs:3e3})}catch{}}function wY(e,t,r,n){if(n instanceof tn){var i,a,o,s,l;let d,c=n.details??{};return new tn(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.":wQ("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.":wQ(i))},n)}return new tn("COMMAND_FAILED",`Failed to ${e} Android ${t} for ${r}`,{action:e,package:r,tool:t,hint:wQ(t)},n)}function wQ(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 w0(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 w1(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 w1(e,t,r){try{let n=await wJ(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 w2="adb-shell-simpleperf",w3="adb-shell-perfetto",w5="/data/local/tmp";async function w4(e,t,r){let n=tG(e,r.adb);await vr(n,t),await vi(n,t),await vn(n,t);let i=await ve(t.outPath);await w9(n,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await w0(e,t,i,o,{adb:n});return{...t,action:"stop",platform:"android",state:"stopped",stoppedAt:a,durationMs:o,sizeBytes:i,method:"simpleperf"===t.kind?w2:w3,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function w6(e,t,r={}){let n=tG(e,r.adb);try{"running"===t.state&&(await vr(n,t),await vi(n,t).catch(()=>{}))}finally{await w9(n,t.remotePath)}}function w8(e,t,r=w5){let n=e.replace(/[^A-Za-z0-9_.-]/g,"_");return`${r}/agent-device-${n}-${Date.now()}-${t}`}async function w9(e,t){try{await e(["shell",`rm -f ${vt(t)}`],{allowFailure:!0,timeoutMs:15e3})}catch{}}async function w7(e,t){await l.mkdir(a.dirname(e),{recursive:!0}),await l.writeFile(e,`${JSON.stringify(t,null,2)}
28
- `)}async function ve(e){try{return(await l.stat(e)).size}catch(t){throw new tn("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 vt(e){return`'${e.replace(/'/g,"'\\''")}'`}async function vr(e,t){try{var r;await e(["shell",(r=t.profilerPid,`pid=${vt(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 wY("stop",t.kind,t.packageName,e)}}async function vn(e,t){await l.mkdir(a.dirname(t.outPath),{recursive:!0});try{await e(["pull",t.remotePath,t.outPath],{timeoutMs:3e4})}catch(e){throw new tn("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 vi(e,t){let r;for(let n=0;n<12;n+=1){let n=await va(e,t.remotePath);if(void 0!==n&&n>0&&n===r)return;r=n,await g(250)}throw new tn("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 va(e,t){let r=vt(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 vo(e,t){try{let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=vl(r.stdout);if(0===r.exitCode&&n)return n}catch{}throw new tn("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 vs(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 tn("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 vl(e){return e.trim().split(/\s+/).find(e=>/^\d+$/.test(e))}async function vd(e,t,r,n={}){let i,a=tG(e,n.adb),o=await vo(a,t);await vs(a,"perfetto",t);let s=w8(t,"app.perfetto-trace","/data/misc/perfetto-traces");try{await wZ(e,t,{adb:a}),i=await vu(a,s,t)}catch(e){throw await w9(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:w3,message:`Started Android Perfetto trace for ${t}`}}async function vc(e,t,r,n={}){return await w4(e,{...t,outPath:r},n)}async function vu(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=vl(n.stdout);if(i)return i;throw new tn("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 wY("start","perfetto",r,e)}}async function vp(e,t,r,n={}){let i,a=tG(e,n.adb),o=await vo(a,t);await vs(a,"simpleperf",t);let s=w8(t,"cpu.perf.data");try{i=await vh(a,o,s,t)}catch(e){throw await w9(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:w2,message:`Started Android Simpleperf CPU profile for ${t}`}}async function vf(e,t,r,n={}){return await w4(e,{...t,outPath:r},n)}async function vm(e,t,r,n={}){let i=tG(e,n.adb);await vs(i,"simpleperf",t.packageName);let a=await vw(i,t),o=new Date().toISOString(),s=function(e){let t=[];for(let r of tH(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:hV(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 w7(r,l);let d=await ve(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:w2,message:`Wrote Android Simpleperf report for ${t.packageName}`}}async function vh(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(vt).join(" "),d=`${w5}/agent-device-${s}-${Date.now()}.err`,`err=${vt(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=vl(c.stdout);if(u)return u;throw new tn("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 wY("start","simpleperf",n,e)}}async function vw(e,t){try{return await e(["shell","simpleperf","report","-i",t.remotePath,"--stdio","--sort","comm,dso,symbol"],{timeoutMs:3e4})}catch(e){throw wY("report","simpleperf",t.packageName,e)}}let vv="adb-shell-dumpsys-cpuinfo",vy="Aggregated CPU usage for app processes matched from adb shell dumpsys cpuinfo.",vg="adb-shell-dumpsys-meminfo",vb="Memory snapshot from adb shell dumpsys meminfo <package>. Values are reported in kilobytes.",vA="adb-shell-am-dumpheap",vS="Java heap dump captured with adb shell am dumpheap, pulled to a local artifact path.";async function vI(e,t,r={}){let n=tG(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 tH(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:hV(i),measuredAt:r,method:vv,matchedProcesses:[...n]}}(e.stdout,t,new Date().toISOString())}catch(e){throw vP("cpu",t,e)}}async function v_(e,t,r={}){let n=tG(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 tn("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=vk(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!==wq(e));if(!r)break;return wq(r)??void 0}}(e);if(void 0===i)throw new tn("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:vk(e,"TOTAL RSS"),measuredAt:r,method:vg,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?wq(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 vP("memory",t,e)}}async function vM(e,t,r,n={}){let i,o=tG(e,n.adb),s=await vD(o,t),d=(i=t.replace(/[^a-zA-Z0-9._-]/g,"_"),`/data/local/tmp/agent-device-${i}-${Date.now()}.hprof`);await l.mkdir(a.dirname(r),{recursive:!0});let c=await vx(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 tn("COMMAND_FAILED",`Failed to capture Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:s,remotePath:d,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,hint:(u=e.stdout,p=e.stderr,(r=`${u}
29
- ${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 vN(r,c),new tn("COMMAND_FAILED",`Failed to pull Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:s,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 l.stat(r).catch(()=>null);if(!i?.isFile()||i.size<=0)throw await vN(r,c),new tn("COMMAND_FAILED","Android heap dump artifact is missing or empty",{kind:"android-hprof",package:t,pid:s,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:vA,packageName:t,pid:s,remotePath:d}}finally{await o(["shell","rm","-f",d],{allowFailure:!0,timeoutMs:15e3}).catch(()=>{})}}async function vx(e){return await l.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function vN(e,t){t||await l.rm(e,{force:!0}).catch(()=>{})}async function vD(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 tn("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 vP(e,t,r){return r instanceof tn?new tn(r.code,r.message,{...r.details??{},metric:e,package:t},r):new tn("COMMAND_FAILED",`Failed to sample Android ${e} for ${t}`,{metric:e,package:t},r)}function vk(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:wq(i)??void 0}let vE=new Map;async function vC(e){let t=await v.mkdtemp(a.join(m.tmpdir(),"agent-device-materialized-"));try{let r=await vT(e.installablePath,a.join(t,"installable")),i=e.archivePath?await vT(e.archivePath,a.join(t,"archive")):void 0,o=n.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{vR(o)},s);return vE.set(o,{rootPath:t,installablePath:r,archivePath:i,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:d}),{materializationId:o,installablePath:r,...i?{archivePath:i}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await v.rm(t,{recursive:!0,force:!0}),e}}async function vR(e,t){let r=vE.get(e);if(!r)throw new tn("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new tn("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),vE.delete(e),await v.rm(r.rootPath,{recursive:!0,force:!0})}async function vO(e){let t=Array.from(vE.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await vR(e)}))}async function vT(e,t){let r=await v.stat(e);await v.mkdir(t,{recursive:!0});let n=a.join(t,a.basename(e));return r.isDirectory()?await v.cp(e,n,{recursive:!0}):await v.copyFile(e,n),n}function vL(e){let t=e.state??"stopped";return{audio:"probe",state:t,active:"running"===t,heard:!1,source:e.source,backend:e.backend,durationMs:e.durationMs,elapsedMs:e.elapsedMs??0,bucketMs:e.bucketMs,sampleCount:0,mediaElementCount:e.mediaElementCount,sourceCount:e.sourceCount??0,rmsDbfs:[],peakDbfs:[],reason:e.reason,notes:e.notes}}function vF(e,t){var r,n,i,a;let o=(r=e)&&"object"==typeof r&&!Array.isArray(r)?r:{},s="running"===o.state?"running":"stopped",l=vU(o.rmsDbfs),d=vU(o.peakDbfs),c=[...function(e){if(Array.isArray(e))return e.filter(e=>"string"==typeof e)}(o.notes)??[],...t.notes??[]];return{audio:"probe",state:s,active:"running"===s&&(n=o.active,i=t.activeFallback??!0,"boolean"==typeof n?n:i),heard:!0===o.heard,source:t.source,backend:vB(o.backend)??t.backend,durationMs:v$(o.durationMs,t.durationMs),elapsedMs:v$(o.elapsedMs,t.elapsedMs),bucketMs:v$(o.bucketMs,t.bucketMs),sampleCount:v$(o.sampleCount,l.length),mediaElementCount:void 0===t.mediaElementCount?"number"==typeof(a=o.mediaElementCount)&&Number.isFinite(a)?a:void 0:v$(o.mediaElementCount,t.mediaElementCount),sourceCount:v$(o.sourceCount,t.sourceCount??0),rmsDbfs:l,peakDbfs:d,startedAt:vB(o.startedAt),stoppedAt:vB(o.stoppedAt),reason:vB(o.reason),notes:c.length>0?c:void 0}}function v$(e,t){return"number"==typeof e&&Number.isFinite(e)?e:t}function vU(e){if(!Array.isArray(e))return[];let t=[];for(let r of e)"number"==typeof r&&Number.isFinite(r)&&t.push(r);return t}function vB(e){return"string"==typeof e?e:void 0}async function vG(e){let{session:t,probeAction:r,backend:n}=e;if("start"===r){await vq(t,"restarted");let r=a.join(e.sessionStore.ensureSessionDir(e.sessionName),"audio-probe.json"),i=await n.start({durationMs:e.durationMs,bucketMs:e.bucketMs,statusPath:r});return t.audioProbe={platform:n.platform,source:n.source,backend:n.backend,sourceCount:n.sourceCount,notes:n.notes(t.device),child:i.child,wait:i.wait,statusPath:r,startedAt:Date.now(),durationMs:e.durationMs,bucketMs:e.bucketMs},i.wait.catch(()=>{}),await vV(t)}if("stop"===r)return await vq(t,"stopped")??vK(e,"stopped","not-started");let i=await vj(t);return i?("stopped"===i.state&&(t.audioProbe=void 0),i):vK(e,"stopped","not-started")}async function vq(e,t="session-cleanup"){var r,n,i;let a,o=e.audioProbe;if(!o)return;let s=await vj(e);return o.child.kill("SIGTERM"),await o.wait.catch(()=>{}),e.audioProbe=void 0,r=s,n=o,i=t,a=Math.min(n.durationMs,Math.max(0,Date.now()-n.startedAt)),{...r??vL({source:n.source,backend:n.backend,durationMs:n.durationMs,bucketMs:n.bucketMs,sourceCount:n.sourceCount,notes:n.notes}),state:"stopped",active:!1,elapsedMs:a,stoppedAt:new Date().toISOString(),reason:i}}async function vV(e){let t=Date.now()+5e3;for(;Date.now()<t;){let t=await vj(e);if(t)return t;let r=await Promise.race([e.audioProbe?.wait.then(e=>e,e=>e),tg(100).then(()=>void 0)]);if(r instanceof Error)throw r;if(r){let e=r.stderr?.trim()||r.stdout?.trim()||`host audio probe helper exited with code ${r.exitCode??1}`;throw new tn("COMMAND_FAILED",`failed to start host audio probe: ${e}`)}}throw new tn("COMMAND_FAILED","failed to start host audio probe")}async function vj(e){let t=e.audioProbe;if(t)try{var r,n;let e=await v.readFile(t.statusPath,"utf8");return r=JSON.parse(e),n=t,vF(r,{source:n.source,backend:n.backend,durationMs:n.durationMs,elapsedMs:Date.now()-n.startedAt,bucketMs:n.bucketMs,activeFallback:!0,sourceCount:n.sourceCount,notes:n.notes})}catch(e){if("ENOENT"===e.code)return;throw e}}function vK(e,t,r){return vL({state:t,source:e.backend.source,backend:e.backend.backend,durationMs:e.durationMs,bucketMs:e.bucketMs,sourceCount:0,reason:r,notes:[...e.backend.notes(e.session.device),"No active host audio probe is running."]})}async function vH(e){if(await ml(e.device.id),!eE(e.device))return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await se("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 vW(e){e.appLog&&await hO(e.appLog)}async function vz(e){e.applePerf?.active&&(await wO(e.applePerf.active),e.applePerf={...e.applePerf??{},active:void 0})}async function vX(e){let t=e.nativePerf?.android;t&&(await w6(e.device,t),e.nativePerf={...e.nativePerf??{},android:void 0})}async function vJ(e){"android"===e.device.platform&&await du(e.device)}async function vZ(e,t){await vW(e),await vq(e,"session-teardown"),await vz(e),await vX(e),await vJ(e),eF(e.device.platform)&&await vH(e),await vO(t).catch(()=>{})}let vY=new WeakMap;async function vQ(e){var t,r,n;let i,a,{sessionStore:o,leaseRegistry:s}=e,l=(i={...(r=function(e){let t=to(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=ta(r);if(r&&!n)throw new tn("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new tn("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??{}},t5(r.command,i)?{...r,flags:i}:r),d=l.command,c=function(e){var t,r;let n=e.session||uw;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=uy(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(l),u=ey(),p=o.resolveSessionDir(c),f=rf(p,l.meta?.requestId??u.requestId),m=rp(p);ep({session:c,logPath:f}),eI({level:"info",phase:"request_start",data:{publicSession:l.session,effectiveSession:c,command:l.command,tenant:l.meta?.tenantId,isolation:l.meta?.sessionIsolation,requestLogPath:f,runnerLogPath:m}}),aD((t=l).command)||uA(t,sC(t));let h=aP(d)?.sessionExecutionLockExempt!==!0?await uP({req:l,sessionName:c,sessionStore:o}):[],w=(n=s,(a=vY.get(n))||(a=new Map,vY.set(n,a)),a),v={req:l,command:d,sessionName:c,requestLogPath:f,runnerLogPath:m,throwIfCanceled:()=>rP(l.meta?.requestId),runAdmitted:async e=>(rP(l.meta?.requestId),await uI({sessionName:c,sessionStore:o,leaseRegistry:s,teardownSession:vZ}),v.req=l=function(e){let{sessionName:t,sessionStore:r,leaseRegistry:n}=e,i=r.get(t),a=function(e,t,r){var n,i;if(aD(e.command))return;let a=sC(e);uA(e,a);let o=r?.lease;if(!o&&e.meta?.sessionIsolation!=="tenant"&&(!a.leaseId||!a.tenantId&&!a.runId))return;n=a,(i=o)&&(uS("leaseId",n.leaseId,i.leaseId),uS("tenantId",n.tenantId,i.tenantId),uS("runId",n.runId,i.runId),uS("leaseProvider",n.leaseProvider,i.leaseProvider),uS("clientId",n.clientId,i.clientId),uS("deviceKey",n.deviceKey,i.deviceKey));let s=sR(e,r),l={...s,leaseTtlMs:s.leaseTtlMs??(z(s)?3e5:void 0)};return t.assertLeaseAdmission(I(s)),t.heartbeatLease(I(l))}(e.req,n,i);if(!a)return e.req;let o={...e.req,internal:{...e.req.internal,admittedLease:a}};return i?.lease&&r.set(t,{...i,lease:{...i.lease,leaseBackend:a.backend,expiresAt:a.expiresAt}}),o}({req:l,sessionName:c,sessionStore:o,leaseRegistry:s}),await e()),runLocked:async e=>(rP(l.meta?.requestId),0===h.length)?await v.runAdmitted(e):await v0(w,h,async()=>await v.runAdmitted(e))};return v}async function v0(e,t,r){let[n,...i]=t;return n?await uu(e,n,async()=>await v0(e,i,r)):await r()}function v1(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function v2(e,t){return v1(e)?e[t]:void 0}function v3(e,t){let r=v2(e,t);return"string"==typeof r?r:void 0}function v5(e,t){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:void 0}let v4=[v8,v9,v7,ye,yt,yr,yn,yi,ya,yo,ys,yl,yd,yc,yu,yp,yf];function v6(e){return void 0!==e&&Number.isFinite(e)?String(Math.trunc(e)):"undefined"}function v8(e){return!Number.isFinite(e)||e<=0?-90:Math.max(-90,Math.min(0,Math.round(20*Math.log10(e))))}function v9(e,t){e.notes.includes(t)||e.notes.push(t)}function v7(){return Array.from(document.querySelectorAll("audio,video"))}function ye(e,t){if(!e||"stopped"===e.state)return e;for(let r of(clearInterval(e.timer),clearTimeout(e.timeout),e.timer=void 0,e.timeout=void 0,e.state="stopped",e.active=!1,e.reason=t,e.stoppedAt=Date.now(),e.analysers))try{r.analyser.disconnect(),r.source.disconnect(),r.audible&&r.source.connect(e.context.destination)}catch{}if(e.resumeOnGesture){for(let t of["click","pointerdown","keydown"])window.removeEventListener(t,e.resumeOnGesture,!0);e.resumeOnGesture=void 0}return e}function yt(e){let t=window.AudioContext||window.webkitAudioContext;if(!t)return;let r=window[e];if(r&&"closed"!==r.state)return r;let n=new t;return window[e]=n,n}function yr(e,t,r){if(t.currentSrc||t.src||0!==t.readyState)try{window[r]||(window[r]=new WeakMap);let n=window[r].get(t);return n||(n=e.context.createMediaElementSource(t),window[r].set(t,n)),n.disconnect(),{source:n,audible:!0}}catch{return}}function yn(e,t){if(t&&"function"==typeof t.getAudioTracks&&0!==t.getAudioTracks().length)return{source:e.context.createMediaStreamSource(t),audible:!1}}function yi(e,t){if("function"==typeof t.captureStream)return yn(e,t.captureStream())}function ya(e,t){let r=e.context.createAnalyser();r.fftSize=2048,t.source.connect(r),r.connect(t.audible?e.context.destination:e.sink),e.analysers.push({...t,analyser:r,buffer:new Float32Array(r.fftSize)})}function yo(e,t){let r=v7();for(let n of(e.mediaElementCount=r.length,r)){if(e.seen.has(n))continue;let r=yn(e,n.srcObject)??yi(e,n)??yr(e,n,t);if(!r){v9(e,"Some media elements do not expose capturable audio to Web Audio.");continue}e.seen.add(n),ya(e,r)}e.sourceCount=e.analysers.length,0===e.sourceCount&&v9(e,"No capturable page media audio sources were found yet.")}function ys(e){let t=0,r=0,n=0;for(let i of e.analysers)for(let e of(i.analyser.getFloatTimeDomainData(i.buffer),i.buffer))t+=e*e,r+=1,n=Math.max(n,Math.abs(e));return{rms:r>0?Math.sqrt(t/r):0,peak:n}}function yl(e){let t=Math.ceil(e.durationMs/e.bucketMs)+2;e.rmsDbfs.length>t&&e.rmsDbfs.splice(0,e.rmsDbfs.length-t),e.peakDbfs.length>t&&e.peakDbfs.splice(0,e.peakDbfs.length-t)}function yd(e,t){if(!e||"running"!==e.state)return;yo(e,t);let r=ys(e),n=v8(r.rms),i=v8(r.peak);e.rmsDbfs.push(n),e.peakDbfs.push(i),e.heard=e.heard||n>-90||i>-90,yl(e),Date.now()-e.startedAt>=e.durationMs&&ye(e,"duration")}function yc(e,t){return{audio:"probe",state:"stopped",active:!1,heard:!1,source:"media-elements",backend:"agent-browser",durationMs:Number(e.durationMs)||1e4,elapsedMs:0,bucketMs:Number(e.bucketMs)||1e3,sampleCount:0,mediaElementCount:v7().length,sourceCount:0,rmsDbfs:[],peakDbfs:[],notes:t}}function yu(e,t,r,n){return e?{audio:"probe",state:e.state,active:"running"===e.state,heard:e.heard,source:"media-elements",backend:"agent-browser",durationMs:e.durationMs,elapsedMs:Math.max(0,Math.min((e.stoppedAt||Date.now())-e.startedAt,e.durationMs)),bucketMs:e.bucketMs,sampleCount:e.rmsDbfs.length,mediaElementCount:v7().length,sourceCount:e.sourceCount,rmsDbfs:e.rmsDbfs.slice(),peakDbfs:e.peakDbfs.slice(),startedAt:new Date(e.startedAt).toISOString(),stoppedAt:e.stoppedAt?new Date(e.stoppedAt).toISOString():void 0,reason:e.reason,notes:[r,n,...e.notes]}:yc(t,[r,n])}function yp(e,t,r,n,i,a,o){t&&ye(t,"restarted");let s=yt(n);if(!s)return yc(e,["Web Audio API is not available in this browser context."]);let l=s.createGain();l.gain.value=0,l.connect(s.destination);let d={state:"running",active:!0,context:s,sink:l,seen:new WeakSet,analysers:[],mediaElementCount:0,sourceCount:0,durationMs:Math.max(100,Number(e.durationMs)||1e4),bucketMs:Math.max(100,Number(e.bucketMs)||1e3),startedAt:Date.now(),stoppedAt:void 0,reason:void 0,heard:!1,rmsDbfs:[],peakDbfs:[],notes:[]};try{s.resume()}catch{v9(d,"AudioContext could not be resumed by the probe.")}for(let e of(d.resumeOnGesture=()=>{try{s.resume()}catch{v9(d,"AudioContext could not be resumed from a user gesture.")}},["click","pointerdown","keydown"]))window.addEventListener(e,d.resumeOnGesture,{capture:!0,once:!0});return yo(d,i),d.timer=setInterval(()=>yd(d,i),d.bucketMs),d.timeout=setTimeout(()=>ye(d,"duration"),d.durationMs),window[r]=d,yu(d,e,a,o)}function yf(e){let t="__agentDeviceAudioProbe",r="__agentDeviceAudioProbeSources",n="Audio probe samples HTML media elements exposed to Web Audio; it is not whole-tab or system audio capture.",i="URL-backed media elements may be routed through the probe AudioContext while they are observed.",a=window[t];return(a&&"running"===a.state&&Date.now()-a.startedAt>=a.durationMs&&(yd(a,r),ye(a,"duration")),"start"===e.action)?yp(e,a,t,"__agentDeviceAudioProbeContext",r,n,i):("stop"===e.action?(a&&yd(a,r),ye(a,"manual")):a&&yd(a,r),yu(a,e,n,i))}function ym(e){return v1(e)}function yh(e){if(!v1(e))return;let t={};for(let[r,n]of Object.entries(e))"string"==typeof n&&(t[r]=n);return Object.keys(t).length>0?t:void 0}async function yw(e,t){var r;let n,i=function(e,t){let r=new Map(t.map(e=>[e.ref,e])),n=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){var o,s;let e=(o=t,yy(o.match(/\bref=['"]?(@?e\d+)['"]?/i)?.[1]??o.match(/@?(e\d+)\b/i)?.[1]));if(!e)continue;i.add(e);let l=r.get(e)?.data,d=(s=t,Math.floor((s.match(/^\s*/)?.[0].length??0)/2)),c=function(e,t,r){var n;let i=function(e){let t=e.replace(/\[[^\]]*ref[^\]]*\]/gi,"").replace(/@?e\d+\b/gi,"").replace(/^[\s|├└─>*-]+/g,"").trim();return t.match(/^([A-Za-z][\w-]*)\b/)?.[1]}(e)??yg(t,["role","type"]);return{index:0,type:i,role:i,label:(n=e,n.match(/"([^"]+)"/)?.[1]??n.match(/'([^']+)'/)?.[1]??yg(t,["label","name","text"])),value:function(e){var t;return t=e,(t.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(yA)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(yA)}(e)??yg(t,["value"]),depth:r,enabled:yb(t,["enabled"]),focused:yb(t,["focused"])}}(t,l,d),u=function(e,t){for(let r=t-1;r>=0;r-=1){let t=e.get(r);if(void 0!==t)return t}}(a,d);void 0!==u&&(c.parentIndex=u),n.push({ref:e,node:{...c,index:n.length}}),a.set(d,n.length-1)}for(let e of t)i.has(e.ref)||n.push({ref:e.ref,node:{...function(e){let t=yg(e,["role","type"]);return{index:0,type:t,role:t,label:yg(e,["label","name","text"]),value:yg(e,["value"]),enabled:yb(e,["enabled"]),focused:yb(e,["focused"])}}(e.data),index:n.length}});return n}(v3(e,"snapshot")??"",Array.isArray(r=v2(e,"refs"))?r.flatMap(e=>{let t=v1(e)?e:void 0,r=yy(yg(t,["ref","id"])??String(e));return r?[{ref:r,data:t}]:[]}):v1(r)?Object.entries(r).flatMap(([e,t])=>{let r=yy(e);return r?[{ref:r,data:v1(t)?t:void 0}]:[]}):[]);return t&&await yv(i,t),{nodes:i.map((e,t)=>({...e.node,index:t})),truncated:"boolean"==typeof(n=v2(e,"truncated"))?n:void 0}}async function yv(e,t){for(let r=0;r<e.length;r+=8){let n=e.slice(r,r+8);for(let[e,r]of(await Promise.all(n.map(e=>t(e.ref)))).entries())r&&(n[e].node.rect=r)}}function yy(e){let t=e?.trim().replace(/^@/,"");return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function yg(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.length>0)return t}}function yb(e,t){if(e)for(let r of t){let t=e[r];if("boolean"==typeof t)return t}}function yA(e){return"string"==typeof e}let yS="agent-browser",yI="Run `agent-device web setup` to install the managed web backend.";function y_(e={}){let t=e.session?.trim(),r=async r=>await yP(r,{session:t,options:e});return{async open(e){await r(["open",e])},async close(){await r(["close"])},async startRecording(e){await r(["record","start",e])},async stopRecording(){await r(["record","stop"])},snapshot:async e=>await yN(r,e),async screenshot(e,t){await r(["screenshot",...t?.fullscreen?["--full"]:[],e])},async setViewport(e,t){await r(["set","viewport",String(e),String(t)])},async click(e,t){await yx(r,e,t)},async clickRef(e){await r(["click",yC(e)])},async fill(e,t,n){await yx(r,e,t),await r(["press","darwin"===process.platform?"Meta+a":"Control+a"]),await r(["keyboard","type",n])},async fillRef(e,t){await r(["fill",yC(e),t])},async typeText(e){await r(["keyboard","type",e])},scroll:async(e,t)=>(await yM(r,e,t),t?.durationMs!==void 0?{durationMs:t.durationMs}:{}),dumpNetwork:async e=>(function(e,t={}){var r,n;let i,a=Array.isArray(i=v1(r=e)&&Array.isArray(r.requests)?r.requests:r)?i.filter(ym).map(e=>({headers:yh(e.headers),method:v3(e,"method"),mimeType:v3(e,"mimeType"),requestId:v3(e,"requestId"),resourceType:v3(e,"resourceType"),responseHeaders:yh(e.responseHeaders),status:v5(e,"status"),timestamp:function(e){if("number"==typeof e||"string"==typeof e)return e}(e.timestamp),url:v3(e,"url")})):[],o="number"==typeof(n=t.limit)&&Number.isInteger(n)?Math.max(1,Math.min(n,200)):25,s="headers"===t.include||"all"===t.include,l=a.slice(-o).reverse().map(e=>{var t,r;let n,i;return t=e,r=s,n=void 0===t.timestamp?void 0:function e(t){if("string"==typeof t){let r=Number(t);return Number.isFinite(r)?e(r):t}let r=new Date(t>1e10?t:1e3*t);return Number.isNaN(r.getTime())?String(t):r.toISOString()}(t.timestamp),i=tK({requestId:t.requestId,resourceType:t.resourceType,mimeType:t.mimeType}),tK({timestamp:n,method:t.method,url:t.url,status:t.status,requestHeaders:r?t.headers:void 0,responseHeaders:r?t.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}),d="body"===t.include||"all"===t.include?["agent-browser network requests does not expose request or response bodies."]:void 0;return{entries:l,backend:"agent-browser",redacted:!1,...d?{notes:d}:{}}})(await r(["network","requests"]),e),probeAudio:async e=>{var t;let n,i,a,o,s;return{...s=vF(v1(t=await r(["eval",(n=v4.map(e=>`${e.toString()};`).join(""),i=function(e){switch(e){case"start":return"'start'";case"stop":return"'stop'";default:return"'status'"}}(e.action),a=v6(e.durationMs),o=v6(e.bucketMs),`(()=>{${n}return ${yf.name}({action:${i},durationMs:${a},bucketMs:${o}})})()`)]))?v1(t.result)?t.result:t:{},{source:"media-elements",backend:"agent-browser",durationMs:0,elapsedMs:0,bucketMs:1e3,activeFallback:!1,mediaElementCount:0,sourceCount:0}),source:"media-elements",mediaElementCount:s.mediaElementCount??0}}}}async function yM(e,t,r){for(let i of function(e){var t,r,n,i;let a,o,s,l=e?.pixels??e?.amount,d=e?.durationMs;if(void 0===d||d<=0)return[{distance:l,delayAfterMs:0}];let c=Math.max(1,Math.min(20,Math.ceil(d/50))),u=d/Math.max(1,c-1);return(t=e,r=c,a=t?.pixels??t?.amount??300,t?.amount!==void 0&&void 0===t.pixels?Array.from({length:r},()=>a/r):(o=Math.floor((n=Math.round(a))/(i=r)),s=n-o*i,Array.from({length:i},(e,t)=>t<s?o+1:o))).map((e,t)=>({distance:e,delayAfterMs:t<c-1?u:0}))}(r)){var n;await e(["scroll",t,...void 0===(n=i.distance)?[]:[String(n)]]),i.delayAfterMs>0&&await tg(i.delayAfterMs)}}async function yx(e,t,r){await e(["mouse","move",String(Math.round(t)),String(Math.round(r))]),await e(["mouse","down"]),await e(["mouse","up"])}async function yN(e,t){var r;let n=await e((r=t,["snapshot",...r?.interactiveOnly?["--interactive"]:[],...r?.raw?[]:["--compact"],..."number"==typeof r?.depth?["--depth",String(r.depth)]:[],...r?.scope?["--selector",r.scope]:[]]));return await yw(n,t?.includeRects?async t=>await yD(e,t):void 0)}async function yD(e,t){try{return function(e){let t=v1(e)&&v1(e.box)?e.box:e;if(v1(t)){var r,n;let e,i,a,o,s,l,d;return r=t,e=v5(r,"x"),i=v5(r,"y"),a=v5(r,"width"),yR(e,i,a,v5(r,"height"))??(n=t,o=v5(n,"left"),s=v5(n,"top"),l=v5(n,"right"),d=v5(n,"bottom"),yR(o,s,yO(l,o),yO(d,s)))}}(await e(["get","box",yC(t)]))}catch(t){var r;let e;if(e=(r=t)instanceof Error?r.message:String(r),!/\bstale\b/i.test(e)&&/\bbox\b|not visible|not found|no element/i.test(e))return;throw t}}async function yP(e,t){let{session:r,options:n}=t,i=[...e,"--json",...r?["--session",r]:[]],a=await yk(i,n);var o,s=function(e,t,r,n){try{return JSON.parse(e)}catch(a){let i=0!==n;throw new tn("COMMAND_FAILED",i?"agent-browser command failed":"agent-browser returned invalid JSON",{cmd:yS,args:r,...i?{exitCode:n}:{},stdout:e.slice(0,500),stderr:t.slice(0,500),hint:yI},a instanceof Error?a:void 0)}}(a.stdout,a.stderr,i,a.exitCode),l=a,d=i;if(!v1(s))return s;if(!1===(s.success??s.ok)){throw new tn("string"==typeof(o=s.code)&&o.length>0?o:"COMMAND_FAILED",function(e){let t=e.error;if("string"==typeof t&&t.trim())return t.trim();if(v1(t)){let e=v3(t,"message")??v3(t,"error");if(e)return e}return v3(e,"message")??"agent-browser command failed"}(s),{cmd:yS,args:d,hint:v3(s,"hint")??yI,agentBrowserError:s.error})}if(0!==l.exitCode)throw new tn("COMMAND_FAILED","agent-browser command failed",{cmd:yS,args:d,exitCode:l.exitCode,stdout:l.stdout.slice(0,500),stderr:l.stderr.slice(0,500),hint:v3(s,"hint")??yI});return Object.hasOwn(s,"data")?s.data:s}async function yk(e,t){let r="",n="",i=0;try{let a=await t3({stateDir:t.stateDir}),o=await eS(a.command,e,{allowFailure:!0,env:a.env,timeoutMs:3e4});r=o.stdout,n=o.stderr,i=o.exitCode}catch(r){var a,o;let t;throw a=r,o=e,"TOOL_MISSING"===(t=t1(a)).code?new tn("TOOL_MISSING",t.message,{...t.details??{},cmd:yS,args:o,hint:yE(t)},t):"COMMAND_FAILED"===t.code?new tn("COMMAND_FAILED",t.message,{...t.details??{},cmd:yS,args:o,hint:yE(t)},t):t}return{stdout:r,stderr:n,exitCode:i}}function yE(e){return"string"==typeof e.details?.hint?e.details.hint:yI}function yC(e){return e.startsWith("@")?e:`@${e}`}function yR(e,t,r,n){if(void 0!==e&&void 0!==t&&void 0!==r&&void 0!==n)return{x:e,y:t,width:r,height:n}}function yO(e,t){return void 0===e||void 0===t?void 0:e-t}function yT(){return{ok:!1,error:tr(new tn("UNAUTHORIZED","Invalid token"))}}async function yL(e){let{lockedScope:t,logPath:r,sessionStore:n}=e,i=n.get(t.sessionName);if(!i)return t.finalize(ag());let a=await cY({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function yF(e){eI({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=ey(),r=eg({force:!0})??void 0;return{ok:!1,error:tr(e,{diagnosticId:t.diagnosticId,logPath:r})}}let y$=["ios_runner_command_send","ios_runner_readiness_preflight"];async function yU(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 yB(e){o.existsSync(e)&&o.unlinkSync(e)}function yG(e){if(!o.existsSync(e))return null;try{let t=JSON.parse(o.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function yq(e){let t=yG(e);if(!t||t.pid===process.pid)try{o.existsSync(e)&&o.unlinkSync(e)}catch{}}function yV(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function yj(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 tn("COMMAND_FAILED",t))})})}(async function(e={}){let t,r,i=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}=tf(i.AGENT_DEVICE_STATE_DIR),h=tm(i.AGENT_DEVICE_DAEMON_SERVER_MODE);fS(c),function(e){if(o.existsSync(e))for(let t of o.readdirSync(e,{withFileTypes:!0})){if(!t.isDirectory())continue;let r=a.join(e,t.name,rm);if(o.existsSync(r))try{let e=rh(o.readFileSync(r,"utf8"));if(e&&function(e){let t,r=e5(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=e4(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{rv(r)}}}(m);let w=new ru(m),v=new iB({maxActiveSimulatorLeases:yV(i.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:yV(i.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:yV(i.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:yV(i.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),g=tb(),b=n.randomBytes(24).toString("hex"),A=e5(process.pid)??void 0,S=tv(),I=function(e=process.env){return il.map(t=>t.createRuntime(e))}(i),_={leaseLifecycleProvider:function(e){if(0!==e.length)return{allocate:async(t,r)=>await iP(e,"allocate",t,r),heartbeat:async(t,r)=>await iP(e,"heartbeat",t,r),release:async(t,r)=>await iP(e,"release",t,r)}}(I),cloudArtifactProvider:function(e){if(0!==e.length)return{listCloudArtifacts:async t=>await iD(e,t)}}(I),deviceInventoryProvider:function(e){if(0!==e.length)return async t=>{for(let r of e){if(!ik(r,t.leaseProvider))continue;let e=await r.deviceInventoryProvider(t);if(e)return e}return null}}(I),providerDeviceRuntimeScope:async e=>await iA(I,e)},M=function(...e){let t=e.filter(e=>void 0!==e);if(0!==t.length)return{listCloudArtifacts:async e=>{for(let r of t){let t=await r.listCloudArtifacts?.(e);if(t)return t}}}}(_.cloudArtifactProvider,function(e=process.env){return{listCloudArtifacts:async t=>await iy(t,e)}}(i)),x=function(e){let{logPath:t,stateDir:r,token:n,androidAdbProvider:i,appleRunnerProvider:o,appleToolProvider:s,linuxToolProvider:l,webProvider:d,appLogProvider:c,recordingProvider:u,deviceInventoryProvider:p,leaseLifecycleProvider:f,cloudArtifactProvider:m,providerDeviceRuntimeScope:h,trackDownloadableArtifact:w}=e,{sessionStore:v,leaseRegistry:y}=e;async function g(e){let r=Date.now(),n=!!(e.meta?.debug||e.flags?.verbose);return await ew({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:n,logPath:t},async()=>{var t,n;let i,a,o,s=await b(e);return s.ok?function(e,t,r){var n,i;let a,o,s=function(e,t){let r=e.meta?.responseLevel??"default";if("default"===r)return t;let n=aw[e.command];return n?{ok:!0,data:n(t.data??{},r)}:t}(e,t);if(!e.meta?.includeCost)return s;let l=(n=t.data,i=r,a={wallClockMs:Date.now()-i,runnerRoundTrips:eA(y$)},Array.isArray(o=n?.nodes)&&(a.nodeCount=o.length),a);return{ok:!0,data:{...s.data??{},cost:l}}}(e,s,r):{ok:!1,error:(t=e.command,a=(i="UNSUPPORTED_OPERATION"===(n=s.error).code||"UNSUPPORTED_PLATFORM"===n.code?function(e){let t=ap[e];if(!t)return[];let r=[];for(let e of["apple","android","linux","web"]){let n=t[e];n&&Object.values(n).some(e=>!0===e)&&r.push(e)}return r}(t):[]).length>0?i.join(", "):void 0,o=e7(n.code),void 0===a&&void 0===o?n:{...n,...void 0!==o?{retriable:o}:{},...void 0!==a?{supportedOn:a}:{}})}})}async function b(e){if(!eZ(e.token,n))return yT();try{return await i1(p,async()=>{let t=await vQ({req:e,sessionStore:v,leaseRegistry:y});return await A(t)})}catch(e){return yF(e)}}async function A(e,t){let n=async()=>{var n;let p,f=function(e){var t,r,n;let i,{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)&&eU(t.device)&&"ios"!==r.platform&&!1!==r.showTouches))return;let n=e.recording,i=mn(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=(i=(t={req:o.req,sessionName:o.sessionName,sessionStore:s}).sessionStore.get(t.sessionName),{req:ux(t.req,i),existingSession:i}),p=u.req;c=u.existingSession;let f=e=>(function(e,t,r){let n=ey();if(!t.ok){eI({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=eg({force:!0})??void 0;return{ok:!1,error:tr(new tn(te(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"}),eg(),{ok:!0,data:function(e,t,r){var n,i;let o;if(!t)return t;let s=(n=e,o=Array.isArray((i=t).artifacts)?[...i.artifacts]:[],"screenshot"!==n.command||o.some(e=>e?.field==="path")||"string"!=typeof i.path||o.push({field:"path",path:i.path,localPath:n.meta?.clientArtifactPaths?.path,fileName:a.basename(n.meta?.clientArtifactPaths?.path??i.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,aP(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,aP(n)?.selectorValidationExempt!==!0)&&function(e,t){let r=um(e,t);if(0!==r.length)throw new tn("INVALID_ARGS",`Session "${e.name}" is already bound to ${up(e)}, but this request selected ${r.map(uh).join(", ")}.`,{session:e.name,conflicts:r.map(uh),hint:uf(e,"selector-conflict")})}(c,p.flags);let m=(e,t,r)=>{var n,i,a,o,s;let l;return n=d,i=e,a=t,o=r,s=p.meta,{...sT(n,i,a,o,l=ey().requestId,s),requestId:l}};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:v,trackDownloadableArtifact:w});if("response"===f.type)return f.response;let m=f.scope,y=async e=>{let r=async()=>await S({lockedScope:m,providerScope:e,allowReplayActions:void 0===t});return h?await h(r):await r()};return t?await y(t):await aC({req:m.req,existingSession:m.existingSession,providers:{androidAdbProvider:i,appleRunnerProvider:o,appleToolProvider:s,linuxToolProvider:l,webProvider:d??((n=m,n.existingSession?.device.platform==="web"||n.req.flags?.platform==="web")?(p=r,({req:e,session:t})=>y_({session:t?.name??e.session,stateDir:p})):void 0),appLogProvider:c,recordingProvider:u}},y)};return t?await e.runAdmitted(n):await e.runLocked(n)}async function S(e){var t,r;let{lockedScope:i,providerScope:a,allowReplayActions:o}=e,s=await ue({req:i.req,sessionName:i.sessionName,logPath:i.logPath,sessionStore:v,leaseRegistry:y,leaseLifecycleProvider:f,cloudArtifactProvider:m,invoke:g,invokeReplayAction:o?(t=i,r=a,async e=>{var i,a,o;if(i=e,a=t,i.session!==a.sessionName||(o=i.command,aP(o)?.replayScopedAction!==!0))return await g(e);if(!eZ(e.token,n))return yT();try{let n=await vQ({req:e,sessionStore:v,leaseRegistry:y});return n.sessionName===t.sessionName?await A(n,r):await g(e)}catch(e){return yF(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await yL({lockedScope:i,logPath:i.logPath,sessionStore:v})}return g}({logPath:f,stateDir:c,token:b,sessionStore:w,leaseRegistry:v,leaseLifecycleProvider:_.leaseLifecycleProvider,cloudArtifactProvider:M,deviceInventoryProvider:_.deviceInventoryProvider,providerDeviceRuntimeScope:_.providerDeviceRuntimeScope,trackDownloadableArtifact:rC}),N=async e=>{await ew({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{eI({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),eg({force:!0})})},D=async e=>{let t=vZ(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
30
- `)});await Promise.race([t,tg(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
31
- `)})]),w.writeSessionLog(e),w.delete(e.name)},P=async()=>{let e=w.toArray();await Promise.all(e.map(D))},k=async()=>{let e,t,r=[];if("http"!==h){let t,n,i=(t=new Set,(n=y.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))r_(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(t9);if(await e(),n<=0)break;await tg(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=ti(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=tp(n),a=rS(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),rI(a),rx(a))throw rD();r=await rU(o?t=>{e.destroyed||e.write(ty(t))}:void 0,async()=>await x(n))}catch(e){r={ok:!1,error:tr(e)}}finally{n-=1,a&&(i.delete(a),rM(a))}e.destroyed||e.write(o?tu(r):`${JSON.stringify(r)}
32
- `)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await yj(i,"Failed to bind socket server")}if("socket"!==h){let e=await nx({handleRequest:x,token:b});r.push(e),t=await yj(e,"Failed to bind HTTP server")}return{servers:r,socketPort:e,httpPort:t}};if(!function(e,t,r){o.existsSync(e)||o.mkdirSync(e,{recursive:!0});let n=JSON.stringify(r,null,2),i=()=>{try{return o.writeFileSync(t,n,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(i())return!0;let a=yG(t);if(a?.pid&&a.pid!==process.pid&&e8(a.pid,a.processStartTime))return!1;try{o.unlinkSync(t)}catch{}return i()}(c,p,{pid:process.pid,version:g,startedAt:Date.now(),processStartTime:A}))return l.write("Daemon lock is held by another process; exiting.\n"),fS(void 0),d(0),null;let E=[];try{let e,n=await k();E=n.servers,t=n.socketPort,r=n.httpPort,C=t,R=r,O={socketPort:C,httpPort:R,token:b,version:g,codeSignature:S,processStartTime:A},o.existsSync(c)||o.mkdirSync(c,{recursive:!0}),o.writeFileSync(f,""),e=O.socketPort&&O.httpPort?"dual":O.httpPort?"http":"socket",o.writeFileSync(u,JSON.stringify({port:O.socketPort,httpPort:O.httpPort,transport:e,token:O.token,pid:process.pid,version:O.version,codeSignature:O.codeSignature,processStartTime:O.processStartTime,stateDir:c},null,2),{mode:384}),o.chmodSync(u,384),C&&s.write(`AGENT_DEVICE_DAEMON_PORT=${C}
33
- `),R&&s.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${R}
34
- `)}catch(t){var C,R,O;let e=tt(t);for(let t of(l.write(`Daemon error: ${e.message}
35
- `),E))try{t.close(()=>{})}catch{}return yB(u),yq(p),fS(void 0),d(1),null}eq();let T=!1,L=async(e={})=>{if(T)return;T=!0,e.cause&&await N(e.cause),await yU(E);let{detachIosSimulatorRunnerSessionsForShutdown:t,stopAllIosRunnerSessions:r}=await Promise.resolve(t9);try{await t()}catch{}await P(),await Promise.allSettled(I.map(async e=>await e.shutdown())),await r(),await Promise.race([ez().catch(()=>{}),tg(1e3)]),yB(u),yq(p),fS(void 0),d(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{L()}),process.on("SIGTERM",()=>{L()}),process.on("SIGHUP",()=>{L()}),process.on("uncaughtException",e=>{let t=e instanceof tn?e:tt(e);l.write(`Daemon error: ${t.message}
36
- `),L({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof tn?t:tt(t);l.write(`Daemon error: ${r.message}
37
- `),L({exitCode:1,cause:t})})),{httpPort:r,shutdown:L,socketPort:t,token:b}})().catch(e=>{let t=tt(e);process.stderr.write(`Daemon error: ${t.message}
38
- `),process.exit(1)});export{vy as ANDROID_CPU_SAMPLE_DESCRIPTION,vv as ANDROID_CPU_SAMPLE_METHOD,wK as ANDROID_FRAME_SAMPLE_DESCRIPTION,wj as ANDROID_FRAME_SAMPLE_METHOD,vS as ANDROID_HPROF_SNAPSHOT_DESCRIPTION,vA as ANDROID_HPROF_SNAPSHOT_METHOD,vb as ANDROID_MEMORY_SAMPLE_DESCRIPTION,vg as ANDROID_MEMORY_SAMPLE_METHOD,h6 as APPLE_MEMGRAPH_SNAPSHOT_DESCRIPTION,h4 as APPLE_MEMGRAPH_SNAPSHOT_METHOD,hz as IOS_DEVICECTL_DEFAULT_HINT,pE as IOS_RUNNER_CONTAINER_BUNDLE_IDS,aG as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,aB as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,iG as LOCAL_DEVICE_INVENTORY_PLATFORM_SELECTORS,iB as LeaseRegistry,av as NO_ACTIVE_SESSION_MESSAGE,ru as SessionStore,lS as androidUiNodes,cw as annotateScreenshotWithRefs,h_ as withAppLogProvider,hL as appendAppLogMarker,wn as buildAppleFrameSamplingMetadata,wa as buildAppleMemorySnapshotSupport,wi as buildAppleSamplingMetadata,iY as buildDeviceInventoryRequestFromFlags,uf as buildSessionRecoveryHint,uC as buildSimctlArgs,uR as buildSimctlArgsForDevice,lm as buildSnapshotState,vM as captureAndroidHeapSnapshot,dP as captureAndroidUiHierarchyXml,h9 as captureAppleMemorySnapshot,ln as captureSnapshot,vR as cleanupRetainedMaterializedPaths,vO as cleanupRetainedMaterializedPathsForSession,rL as cleanupUploadedArtifact,hF as clearAppLogFiles,rM as clearRequestCanceled,iM as configureProviderPortReverse,sT as context_contextFromFlags,ij as countDeviceInventoryByGroup,y_ as createAgentBrowserWebProvider,lb as createDaemonRuntimeSessionStore,mM as createLocalAppleRunnerProvider,rD as createRequestCanceledError,ok as createScopedProvider,oh as dispatchCommand,rB as emitRequestProgress,d5 as ensureAndroidBlockingSystemDialogReady,ay as errorResponse,oE as filterAppleAppsByBundlePrefix,sD as getActiveAndroidSnapshotFreshness,hN as getAppLogPathMetadata,rN as getRequestSignal,mn as getRunnerSessionSnapshot,aN as getSessionCommandKind,cO as getSnapshotReferenceFrame,aI as hasExplicitDeviceSelector,oG as hasScopedAppleToolProvider,sn as runMacOsPressAction,sr as runMacOsReadTextAction,ro as inferFillText,iI as installProviderDeviceApp,i_ as installProviderDeviceInstallablePath,iS as isActiveProviderDevice,af as isCommandSupportedOnDevice,at as isHostSystemAudioProbeDevice,ub as isImplicitSessionScopeConflict,sk as isNavigationSensitiveAction,rx as isRequestCanceled,i2 as listDeviceInventory,hK as listIosDeviceApps,um as listSessionSelectorConflicts,sN as markAndroidSnapshotFreshness,sL as markPendingInteractionOutcome,sV as markPostGestureStabilization,r_ as markRequestCanceled,ag as noActiveSessionError,l$ as parseInstrumentationRecords,mY as prepareIosRunner,rT as prepareUploadedArtifact,mX as prewarmAppleRunnerCache,mJ as prewarmIosRunnerSession,o9 as quitMacOsApp,lj as readAndroidHelperManifestInteger,lK as readAndroidHelperManifestLiteral,oj as readApplePlistJson,hJ as readInfoPlistString,lq as readInstrumentationResultNumber,rq as readReplayTestActionProgress,hP as readSessionNetworkCapture,cF as recordTouchVisualizationEvent,d3 as recoverAndroidBlockingSystemDialog,ad as registerBuiltinPlatformPlugins,rI as registerRequestAbort,uM as releaseSessionLease,ix as removeProviderPortReverse,ab as requireCommandSupported,wZ as resetAndroidFramePerfStats,mx as resolveAppleRunnerProvider,oU as resolveAppleToolProvider,o8 as resolveFrontmostMacOsApp,uy as resolveImplicitSessionScope,hX as resolveIosDevicectlHint,sC as resolveLeaseScope,sl as resolveLinuxToolProvider,hD as resolveLogBackend,op as resolvePayloadInput,uv as resolvePublicSessionName,sR as resolveRequestOrSessionLeaseScope,rS as resolveRequestTrackingId,pP as resolveRunnerAppBundleId,u_ as resolveSessionLeaseForRequest,rf as resolveSessionRequestLogPath,rp as resolveSessionRunnerLogPath,ly as resolveSnapshotScope,iZ as resolveTargetDevice,vC as retainMaterializedPaths,hT as runAppLogDoctor,oq as runAppleToolCommand,vG as runHostSystemAudioProbeCommand,hj as runIosDevicectl,sc as runLinuxToolCommand,se as runMacOsAlertAction,o7 as runMacOsPermissionAction,si as runMacOsScreenshotAction,st as runMacOsSnapshotAction,uO as runSimctlForDevice,oV as runXcrun,mz as runAppleRunnerCommand,mN as withAppleRunnerProvider,md as abortAllIosRunnerSessions,mc as detachIosSimulatorRunnerSessionsForShutdown,mu as stopAllIosRunnerSessions,vI as sampleAndroidCpuPerf,wJ as sampleAndroidFramePerf,v_ as sampleAndroidMemoryPerf,wr as sampleAppleFramePerf,h8 as sampleApplePerfMetrics,mo as scheduleIosRunnerIdleStop,ug as sessionMatchesScope,lg as setSessionSnapshot,dk as snapshotAndroid,sI as snapshotLinux,s_ as readLinuxTextAtPoint,vd as startAndroidPerfettoTrace,vp as startAndroidSimpleperfProfile,hE as startAppLog,wC as startAppleXctracePerfCapture,o4 as startMacOsAudioProbeProcess,vc as stopAndroidPerfettoTrace,vf as stopAndroidSimpleperfProfile,hO as stopAppLog,vH as stopAppleRunnerForClose,wR as stopAppleXctracePerfCapture,ml as stopIosRunnerSession,vX as stopSessionAndroidNativePerfCapture,vJ as stopSessionAndroidSnapshotHelper,vW as stopSessionAppLog,vz as stopSessionApplePerfCapture,vq as stopSessionAudioProbe,sU as stripInternalInteractionFlags,oB as withAppleToolProvider,sd as withLinuxToolProvider,i8 as tryGetPlugin,rs as uniqueStrings,uu as withKeyedLock,rG as withReplayTestActionProgress,vm as writeAndroidSimpleperfReport,wT as writeAppleXctracePerfReport};