agent-device 0.18.3 → 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 (215) hide show
  1. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.3.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.3.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.3.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.3.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 +58 -37
  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 -1786
  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/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.3.apk.sha256 +0 -1
  149. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.3.apk.sha256 +0 -1
  150. package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +0 -443
  151. package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -169
  152. package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +0 -220
  153. package/dist/src/1404.js +0 -1
  154. package/dist/src/1986.js +0 -1
  155. package/dist/src/2748.js +0 -1
  156. package/dist/src/2948.js +0 -30
  157. package/dist/src/3006.js +0 -1
  158. package/dist/src/314.js +0 -1
  159. package/dist/src/3340.js +0 -8
  160. package/dist/src/4418.js +0 -1
  161. package/dist/src/4428.js +0 -3
  162. package/dist/src/485.js +0 -1
  163. package/dist/src/4917.js +0 -1
  164. package/dist/src/495.js +0 -5
  165. package/dist/src/5448.js +0 -3
  166. package/dist/src/5484.js +0 -1
  167. package/dist/src/5643.js +0 -1
  168. package/dist/src/587.js +0 -1
  169. package/dist/src/5913.js +0 -4
  170. package/dist/src/6849.js +0 -1
  171. package/dist/src/6918.js +0 -1
  172. package/dist/src/6967.js +0 -1
  173. package/dist/src/760.js +0 -1
  174. package/dist/src/7871.js +0 -1
  175. package/dist/src/8184.js +0 -1
  176. package/dist/src/8225.js +0 -1
  177. package/dist/src/8391.js +0 -1
  178. package/dist/src/8404.js +0 -2
  179. package/dist/src/8414.js +0 -2
  180. package/dist/src/8875.js +0 -4
  181. package/dist/src/893.js +0 -1
  182. package/dist/src/8936.js +0 -1
  183. package/dist/src/9414.js +0 -1
  184. package/dist/src/9581.js +0 -22
  185. package/dist/src/9612.js +0 -1
  186. package/dist/src/9624.js +0 -1
  187. package/dist/src/9722.js +0 -39
  188. package/dist/src/devices~1.js +0 -1
  189. package/dist/src/devices~2.js +0 -1
  190. package/dist/src/input-actions~1.js +0 -1
  191. package/dist/src/rslib-runtime.js +0 -1
  192. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +0 -0
  193. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +0 -0
  194. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  195. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
  196. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
  197. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
  198. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +0 -0
  199. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +0 -0
  200. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
  201. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
  202. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +0 -0
  203. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +0 -0
  204. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +0 -0
  205. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
  206. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
  207. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +0 -0
  208. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +0 -0
  209. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
  210. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +0 -0
  211. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
  212. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
  213. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
  214. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
  215. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
package/dist/src/9722.js DELETED
@@ -1,39 +0,0 @@
1
- let e,t,r;import{__webpack_require__ as n}from"./rslib-runtime.js";import i,{createHash as a}from"node:crypto";import o from"node:path";import s,{existsSync as l,promises as d}from"node:fs";import c from"node:http";import{fileURLToPath as u,pathToFileURL as p}from"node:url";import{AsyncLocalStorage as f}from"node:async_hooks";import m from"node:os";import{pipeline as h}from"node:stream/promises";import"node:https";import{once as w}from"node:events";import{Transform as v}from"node:stream";import y from"node:fs/promises";import g from"node:net";import{setTimeout as b}from"node:timers/promises";import{resolveUserPath as A}from"./9612.js";import{SCREENSHOT_ACTION_FLAG_KEYS as S,SCROLL_DIRECTIONS as I,leaseScopeToHeartbeatRequest as _,parseScrollDirection as M,leaseScopeToReleaseRequest as x,isStringMember as N,leaseScopeFromRequest as D,isReactNativeCollapsedWarningWrapperWithVisibleBanner as P,intersectArea as k,resolveClickButton as E,deriveMobileSnapshotHiddenContentHints as C,inferVerticalScrollIndicatorDirections as R,isScrollableType as O,normalizeScrollDurationMs as T,withSuccessText as L,honoredScrollDurationMs as F,runScrollEdgePasses as $,readViewportDimension as U,findMissingProxyLeaseFields as B,annotateCoveredSnapshotNodes as G,parseSwipePreset as q,analyzeReactNativeOverlay as V,readLocationCoordinate as j,getClickButtonValidationError as K,areRectsApproximatelyEqual as H,isSystemScrollIndicatorLabel as W,formatScrollEdgeMessage as z,isProxyLeaseScope as X,SWIPE_PATTERNS as J,successText as Z,assertExclusiveScrollDistanceInputs as Y,screenshotOptionsFromFlags as Q,captureScrollEdgeState as ee,normalizeSnapshotTree as et,isReactNativeCollapsedWarningWrapperCandidate as er,screenshotFlagsFromOptions as en,snapshotCaptureAnnotationsFrom as ei,requireIntInRange as ea,inferGestureReferenceFrame as eo,parseStringMember as es,parseDeviceRotation as el,buildScrollGesturePlan as ed,buildSwipePresetGesturePlan as ec}from"./2948.js";import{runCmdSync as eu,resolveExecutableOverridePath as ep,updateDiagnosticsScope as ef,runCmdStreaming as em,whichCmd as eh,parseBooleanLiteral as ew,withDiagnosticsScope as ev,runCmdBackground as ey,getDiagnosticsMeta as eg,flushDiagnosticsToSessionFile as eb,withDiagnosticTimer as eA,countDiagnosticEventsByPhase as eS,runCmd as eI,emitDiagnostic as e_}from"./8875.js";import{deviceFieldsFromPublicPlatform as eM,resolveAppleSimulatorSetPathForSelector as ex,snapshotPresentationOptionsFromFlags as eN,findNodeByRef as eD,resolveDevice as eP,commandRpcParamsSchema as ek,isTvOsDevice as eE,isMacOs as eC,normalizeRef as eR,publicPlatformString as eO,resolveApplePlatformName as eT,isMobilePlatform as eL,matchesPlatformSelector as eF,isApplePlatform as e$,centerOfRect as eU,isIosFamily as eB,buildSnapshotPresentationKey as eG,attachRefs as eq}from"./6849.js";import{prewarmPngWorker as eV,isKeyboardAction as ej,formatScriptArg as eK,encodePngAsync as eH,decodePngAsync as eW,appendScriptSeriesFlags as ez,terminatePngWorker as eX,formatScriptStringLiteral as eJ,formatPortableActionLine as eZ,timingSafeStringEqual as eY,createAgentDevice as eQ,localCommandPolicy as e0,isTouchTargetCommand as e1,CLOUD_WEBDRIVER_PROVIDERS as e2,isClickLikeCommand as e3,findMistargetedTypeRefToken as e5}from"./7871.js";import{readProcessStartTime as e4,readProcessCommand as e6,isProcessGroupAlive as e8,isAgentDeviceDaemonProcess as e9,isProcessAlive as e7}from"./9414.js";import{retriableForErrorCode as te,toAppErrorCode as tt,asAppError as tr,normalizeError as tn,AppError as ti}from"./485.js";import{consumeTextLines as ta,normalizeTenantId as to,resolveSessionIsolationMode as ts,readScreenshotResultData as tl,shellQuoteIfNeeded as td,serializeDaemonRpcResponseEnvelope as tc,buildDaemonHealthPayload as tu,serializeDaemonResponseEnvelope as tp,shouldStreamRequestProgress as tf,resolveDaemonPaths as tm,resolveDaemonServerMode as th,readNodeHttpRequestBody as tw,recordSnapshotTiming as tv,resolveDaemonCodeSignature as ty,serializeDaemonProgressEnvelope as tg}from"./5913.js";import{sleep as tb}from"./5560.js";import{readVersion as tA,findProjectRoot as tS}from"./1404.js";import{runAndroidAdb as tI,resolveIosSimulatorDeviceSetPath as t_,getAndroidBlockingDialogFocus as tM,withRetry as tx,Deadline as tN,isEnvTruthy as tD,openAndroidApp as tP,classifyBootFailure as tk,streamAndroidLogcatWithAdb as tE,resolveAndroidAdbProvider as tC,installAndroidAdbPackage as tR,bootFailureHint as tO,androidDeviceForSerial as tT,parseSerialAllowlist as tL,retryWithPolicy as tF,getAndroidAppState as t$,captureAndroidLogcatWithAdb as tU,resolveAndroidSerialAllowlist as tB,isDeepLinkTarget as tG,resolveAndroidAdbExecutor as tq}from"./3340.js";import{isRecord as tV,PUBLIC_COMMANDS as tj,GESTURE_SUBCOMMAND_ERROR as tK,stripUndefined as tH,splitNonEmptyTrimmedLines as tW,commandDescriptors as tz,deriveCapabilityMatrix as tX,deriveDaemonCommandDescriptors as tJ}from"./1986.js";import{findNearestAncestor as tZ,normalizeType as tY,pruneGroupNodes as tQ,findNodeByLabel as t0,resolveRefLabel as t1}from"./893.js";import{mapManagedAgentBrowserError as t2,acquireProcessLock as t3,resolveAgentBrowserTool as t5}from"./8391.js";import{applyCommandDefaults as t4}from"./9581.js";var t6,t8,t9={};n.r(t9),n.d(t9,{IH:()=>h6,ug:()=>h8,sE:()=>hY,Bx:()=>h0,hQ:()=>hQ,WX:()=>hG,Co:()=>h2,wg:()=>h4,withAppLogProvider:()=>hX});var t7={};n.r(t7),n.d(t7,{bu:()=>pq,abortAllIosRunnerSessions:()=>mS,detachIosSimulatorRunnerSessionsForShutdown:()=>mI,hv:()=>mw,zc:()=>p2,Nr:()=>ht,xN:()=>m9,gE:()=>m7,FS:()=>pB,runAppleRunnerCommand:()=>m8,F8:()=>mg,stopAllIosRunnerSessions:()=>m_,yA:()=>mA});var re={};n.r(re),n.d(re,{v:()=>m$,M:()=>mU,withAppleRunnerProvider:()=>mB});var rt={};n.r(rt),n.d(rt,{qx:()=>oY,Ly:()=>o1,Gr:()=>oJ,vT:()=>oQ,Cc:()=>o0,withAppleToolProvider:()=>oZ});var rr={};n.r(rr),n.d(rr,{IO:()=>sd,LB:()=>sl,xY:()=>su,eN:()=>sc,runMacOsPressAction:()=>sm,runMacOsReadTextAction:()=>sf,rR:()=>sh,r5:()=>sp,Vi:()=>so});var rn={};n.r(rn),n.d(rn,{readLinuxTextAtPoint:()=>sT,r:()=>sO});var ri={};function ra(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}n.r(ri),n.d(ri,{uK:()=>sg,nE:()=>sA,withLinuxToolProvider:()=>sb});let ro=["platform","device","udid","serial","out","verbose","metroHost","metroPort","bundleUrl","launchUrl","snapshotInteractiveOnly","snapshotDepth","snapshotScope","snapshotRaw",...S,"relaunch","saveScript","noRecord","fps","quality","hideTouches","count","intervalMs","delayMs","holdMs","jitterPx","doubleTap","clickButton","pauseMs","pattern"];function rs(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 rl(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}class rd{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let r=o.dirname(t);s.existsSync(r)||s.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&&rc(e.command))return e3(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=rs(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(!rc(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=${eO(t.device)} device=${eJ(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,e3(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(eK(r)),ru(e,t),ez(e,t),e.join(" ");if(1===t.positionals.length)return e.push(eK(r)),ez(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(eK(r)),ru(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(eK(n)),ez(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(eK(r)),e.push(eK(n)),n.startsWith("@")&&ru(e,t),e.join(" ")}(t,r):void 0);return n||eZ(e)}(e));return`${n.join("\n")}
2
- `}(e);return s.writeFileSync(t,n),{written:!0,path:t}}catch(r){return e_({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 A(e.saveScriptPath,{cwd:void 0});s.existsSync(this.sessionsDir)||s.mkdirSync(this.sessionsDir,{recursive:!0});let t=ra(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return o.join(this.sessionsDir,`${t}-${r}.ad`)}}function rc(e){return e1(e)||"fill"===e||"get"===e}function ru(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(eK(r))}class rp{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new rd(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=A(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 ro)void 0!==e[r]&&(t[r]=e[r]);return t}(t.flags),result:t.result}),e_({level:"debug",phase:"record_action",data:{command:t.command,session:e.name}}))}writeSessionLog(e){let t=this.scriptWriter.write(e);t.written&&e_({level:"info",phase:"session_script_written",data:{session:e.name,path:t.path}})}defaultTracePath(e){let t=ra(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return o.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return o.join(this.sessionsDir,ra(e))}ensureSessionDir(e){let t=this.resolveSessionDir(e);return s.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return o.join(this.resolveSessionDir(e),"app.log")}resolveAppLogPidPath(e){return o.join(this.resolveSessionDir(e),"app-log.pid")}static expandHome(e,t){return A(e,{cwd:t})}}function rf(e){return o.join(e,"runner.log")}function rm(e,t){let r=ra(t&&t.length>0?t:"unknown");return o.join(e,"requests",`${r}.ndjson`)}let rh="app-log.pid";function rw(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 rv(e,t){if(!e)return;let r=o.dirname(e);s.existsSync(r)||s.mkdirSync(r,{recursive:!0});let n={pid:t,startTime:e4(t)??void 0,command:e6(t)??void 0};s.writeFileSync(e,`${JSON.stringify(n)}
3
- `)}function ry(e){if(e&&s.existsSync(e))try{s.unlinkSync(e)}catch{}}let rg=new Set,rb=new Map,rA="request_canceled",rS="request canceled";function rI(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 r_(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++}}(rb);let t=new AbortController;rb.set(e,t),rg.has(e)&&t.abort()}function rM(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++}}(rg),rg.add(e),rb.get(e)?.abort())}function rx(e){e&&(rg.delete(e),rb.delete(e))}function rN(e){return!!e&&rg.has(e)}function rD(e){if(e)return rb.get(e)?.signal}function rP(){return new ti("COMMAND_FAILED",rS,{reason:rA})}function rk(e){if(rN(e))throw rP()}function rE(e){return e instanceof ti&&"COMMAND_FAILED"===e.code&&(e.details?.reason===rA||e.message===rS)}let rC=new f,rR=new f;async function rO(e,t){return await rC.run(e,t)}function rT(e){rC.getStore()?.(e)}async function rL(e,t){return await rR.run(e,t)}function rF(){return rR.getStore()}function r$(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rU(e,t){e.statusCode=r$(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}let rB=new Map;function rG(e){let t=i.randomUUID(),r=Date.now(),n=setTimeout(()=>{rX(t)},9e5);return n.unref(),rB.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,createdAt:r,timer:n}),t}async function rq(e,t){let{entry:r,stat:n}=function(e,t){let r,n=rB.get(e);if(!n)throw new ti("INVALID_ARGS",`Artifact not found: ${e}`);if(n.tenantId&&n.tenantId!==t)throw new ti("UNAUTHORIZED","Artifact belongs to a different tenant");try{r=s.statSync(n.artifactPath)}catch{throw rX(e),new ti("COMMAND_FAILED",`Artifact file is missing: ${n.artifactPath}`)}return{entry:n,stat:r}}(e,t),i=await rK(e,r,n);if(!i)throw new ti("COMMAND_FAILED",`Artifact path is not a regular file or directory: ${r.artifactPath}`);return i}async function rV(e){let t=[];for(let[i,a]of rB){var r,n;let o;if(r=a,n=e,r.tenantId&&r.tenantId!==n)continue;try{o=s.statSync(a.artifactPath)}catch{rX(i);continue}let l=await rj(i,a,o);l&&t.push({id:i,filename:l.fileName??i,mimeType:l.mimeType,sizeBytes:l.sizeBytes,createdAt:new Date(a.createdAt).toISOString(),expiresAt:new Date(a.createdAt+9e5).toISOString()})}return t}async function rj(e,t,r){try{return await rK(e,t,r)}catch{return null}}async function rK(e,t,r){if(r.isFile())return{artifactPath:t.artifactPath,fileName:rz(t.fileName,e),mimeType:"application/octet-stream",sizeBytes:r.size};if(!r.isDirectory())return null;let n=await rH(e,t);return{artifactPath:n.archivePath,fileName:n.fileName,mimeType:"application/gzip",sizeBytes:n.sizeBytes}}async function rH(e,t){if(t.directoryArchive&&s.existsSync(t.directoryArchive.archivePath))return t.directoryArchive;if(t.directoryArchivePromise)return await t.directoryArchivePromise;let r=rW(e,t);t.directoryArchivePromise=r;try{return await r}finally{t.directoryArchivePromise===r&&(t.directoryArchivePromise=void 0)}}async function rW(e,t){var r;let n;rJ(t);let a=(n=(r=rz(t.fileName,o.basename(t.artifactPath)||e)).toLowerCase()).endsWith(".tar.gz")||n.endsWith(".tgz")?r:`${r}.tar.gz`,l=s.mkdtempSync(o.join(m.tmpdir(),`agent-device-download-${i.randomUUID()}-`)),d=o.join(l,a);try{await eI("tar",["czf",d,"-C",o.dirname(t.artifactPath),"--",o.basename(t.artifactPath)],{env:{...process.env,COPYFILE_DISABLE:"1"}});let r={archivePath:d,tempDir:l,fileName:a,sizeBytes:s.statSync(d).size};if(rB.get(e)!==t)throw s.rmSync(l,{recursive:!0,force:!0}),new ti("INVALID_ARGS",`Artifact not found: ${e}`);return t.directoryArchive=r,r}catch(e){if(s.rmSync(l,{recursive:!0,force:!0}),e instanceof ti)throw e;throw new ti("COMMAND_FAILED",`Failed to archive downloadable artifact: ${t.artifactPath}`,{artifactPath:t.artifactPath},e instanceof Error?e:void 0)}}function rz(e,t){var r;let n=e?.trim();return n&&!((r=n).includes("/")||r.includes("\\")||r.includes("\0")||r.includes("\r")||r.includes("\n"))?n:t}function rX(e){let t=rB.get(e);if(t&&(clearTimeout(t.timer),rB.delete(e),rJ(t),t.deleteAfterDownload))try{s.rmSync(t.artifactPath,{recursive:!0,force:!0})}catch{}}function rJ(e){if(e.directoryArchive)try{s.rmSync(e.directoryArchive.tempDir,{recursive:!0,force:!0})}catch{}finally{e.directoryArchive=void 0}}let rZ=new Map;function rY(e,t){let r=rZ.get(e);if(!r)throw new ti("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new ti("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function rQ(e){let t=rZ.get(e);t&&(clearTimeout(t.timer),rZ.delete(e),s.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function r0(e){let t=await r1(e);await eI("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=o.join(e.tempDir,t);if(!s.existsSync(r))throw new ti("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function r1(e){let t=await eI("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new ti("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 ti("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(r2),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 ti("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new ti("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 ti("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 ti("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 ti("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await eI("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new ti("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function r2(e){if(e.includes("\0"))throw new ti("INVALID_ARGS",`Invalid archive entry: ${e}`);if(o.posix.isAbsolute(e))throw new ti("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=o.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new ti("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function r3(e){let t=e.trim(),r=o.basename(t);if(!r||"."===r||".."===r)throw new ti("INVALID_ARGS",`Invalid artifact filename: ${e}`);return r}function r5(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 s.mkdtempSync(o.join(m.tmpdir(),`agent-device-artifact-${t}-`))}function r4(e){if(void 0===e)return;let t=Number(e);if(Number.isFinite(t)&&t>0x80000000)throw new ti("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}function r6(e,t){return new Promise((r,n)=>{let i,a=!1,o=0,l=s.createWriteStream(t),d=e=>{if(!a){if(a=!0,i&&clearTimeout(i),e)return void r8(l,t).finally(()=>n(e));r()}},c=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new ti("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 v({transform(e,t,r){c();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(o+=n)>0x80000000?r(new ti("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{d(new ti("COMMAND_FAILED","Artifact transfer was interrupted"))}),c(),h(e,u,l).then(()=>d(),e=>d(e))})}async function r8(e,t){if(e.destroy(),!e.closed)try{await w(e,"close")}catch{}await s.promises.rm(t,{force:!0}).catch(()=>{})}let r9=new Map,r7=new Map;async function ne(e){let t=ni(e.uploadId,e.tenantId),r=na(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 ti("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};r4(e.req.headers["content-length"]),await h(e.req,s.createWriteStream(t.payloadPath,{flags:"a"})),nr(t);let i=na(t);return{complete:i>=t.sizeBytes,offset:i}}async function nt(e,t){let r=ni(e,t),n=na(r);if(n!==r.sizeBytes)throw new ti("INVALID_ARGS","Upload is incomplete",{uploadId:e,offset:n,sizeBytes:r.sizeBytes});let i=await no(r.payloadPath);if(i!==r.sha256)throw nn(r.id),new ti("INVALID_ARGS","Upload hash mismatch",{uploadId:e,expectedSha256:r.sha256,actualSha256:i});if(r9.delete(r.id),r7.delete(r.key),clearTimeout(r.timer),"file"===r.artifactType){let e=o.join(r.tempDir,r.fileName);return s.renameSync(r.payloadPath,e),{artifactPath:e,tempDir:r.tempDir}}let a=await r0({archivePath:r.payloadPath,tempDir:r.tempDir,platform:"android"===r.platform?"android":"ios",expectedRootName:r.fileName});return s.rmSync(r.payloadPath,{force:!0}),{artifactPath:a,tempDir:r.tempDir}}function nr(e){clearTimeout(e.timer),e.timer=setTimeout(()=>nn(e.id),3e5),e.timer.unref()}function nn(e){let t=r9.get(e);t&&(clearTimeout(t.timer),r9.delete(e),r7.delete(t.key),s.rmSync(t.tempDir,{recursive:!0,force:!0}))}function ni(e,t){let r=r9.get(e);if(!r)throw new ti("INVALID_ARGS",`Upload not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new ti("UNAUTHORIZED","Upload belongs to a different tenant");return r}function na(e){return s.existsSync(e.payloadPath)?Math.min(s.statSync(e.payloadPath).size,e.sizeBytes):0}async function no(e){let t=i.createHash("sha256");return await h(s.createReadStream(e),async function*(e){for await(let r of e)t.update(r),yield r}),t.digest("hex")}async function ns(e){let t=e.headers["x-artifact-type"],r=e.headers["x-artifact-filename"];if(!t||!r)throw new ti("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==t&&"app-bundle"!==t)throw new ti("INVALID_ARGS",`Invalid x-artifact-type: ${t}. Must be "file" or "app-bundle".`);r4(e.headers["content-length"]);let n=r3(r),i=r5("upload");try{if("file"===t){let t=o.join(i,n);return await r6(e,t),{artifactPath:t,tempDir:i}}let r=o.join(i,"artifact.tar");await r6(e,r);let a=await r0({archivePath:r,tempDir:i,platform:"ios",expectedRootName:n});return s.rmSync(r,{force:!0}),{artifactPath:a,tempDir:i}}catch(e){throw s.rmSync(i,{recursive:!0,force:!0}),e}}let nl="/upload/direct/";async function nd(e,t,r,n,i){switch(e.kind){case"preflight":await nu(t,r,n,i);return;case"direct":await np(e.uploadId,t,r,n);return;case"finalize":await nf(t,r,n);return;case"upload":await nc(t,r,n);return}}async function nc(e,t,r){try{let n=await r({req:e,res:t,daemonRequest:{command:"upload",positionals:[]}});if(!n)return;nh(t,await ns(e),n.tenantId)}catch(e){rU(t,tn(e))}}async function nu(e,t,r,n){try{var a,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 nw(e,65536),{sha256:nv(s,"sha256"),uploadAttemptId:nv(s,"uploadAttemptId"),fileName:nv(s,"fileName"),sizeBytes:function(e,t){let r=e[t];if("number"!=typeof r||!Number.isSafeInteger(r))throw new ti("INVALID_ARGS",`${t} must be an integer`);return r}(s,"sizeBytes"),artifactType:function(e){let t=nv(e,"artifactType");if("file"===t||"app-bundle"===t)return t;throw new ti("INVALID_ARGS",'artifactType must be "file" or "app-bundle"')}(s),platform:ny(s,"platform"),contentType:ny(s,"contentType")}),A=(a={baseUrl:function(e){let t="string"==typeof e.headers.host?e.headers.host:"";if(!t)throw new ti("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=n,{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 ti("INVALID_ARGS","Invalid upload sha256");if(!Number.isSafeInteger(e.sizeBytes)||e.sizeBytes<0)throw new ti("INVALID_ARGS","Invalid upload sizeBytes");if(r4(String(e.sizeBytes)),r3(e.fileName),!e.uploadAttemptId.trim())throw new ti("INVALID_ARGS","uploadAttemptId is required")}(a),w=[(d=a).tenantId??"",d.uploadAttemptId,d.sha256.toLowerCase(),String(d.sizeBytes),r3(d.fileName),d.artifactType,d.platform??""].join("\0"),y=((v=r7.get(w))?r9.get(v):void 0)??(c=a,u=w,f=i.randomUUID(),m=r5("upload"),(h={id:f,key:u,tempDir:m,payloadPath:o.join(m,"payload"),fileName:r3(c.fileName),sizeBytes:c.sizeBytes,sha256:c.sha256.toLowerCase(),artifactType:c.artifactType,platform:c.platform,tenantId:c.tenantId,timer:setTimeout(()=>nn(f),3e5)}).timer.unref(),r9.set(f,h),r7.set(u,f),h),nr(y),{uploadId:y.id,cacheHit:!1,upload:{url:new URL(`upload/direct/${y.id}`,(p=a.baseUrl).endsWith("/")?p:`${p}/`).toString(),headers:{...a.tokenHeaders,"content-type":a.contentType||"application/octet-stream"}}});nm(t,{ok:!0,...A})}catch(e){rU(t,tn(e))}}async function np(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 ne({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){rU(r,tn(e))}}async function nf(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 nw(e,65536),{uploadId:nv(n,"uploadId")});nh(t,await nt(a.uploadId,i.tenantId),i.tenantId)}catch(e){rU(t,tn(e))}}function nm(e,t){e.statusCode=200,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function nh(e,t,r){var n;let a,o;nm(e,{ok:!0,uploadId:(n={artifactPath:t.artifactPath,tempDir:t.tempDir,tenantId:r},a=i.randomUUID(),(o=setTimeout(()=>{rQ(a)},3e5)).unref(),rZ.set(a,{artifactPath:n.artifactPath,tempDir:n.tempDir,tenantId:n.tenantId,timer:o}),a)})}async function nw(e,t){let r=(await tw(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 ti("INVALID_ARGS","Invalid JSON request body",{},e)}}function nv(e,t){let r=ny(e,t)?.trim();if(!r)throw new ti("INVALID_ARGS",`${t} is required`);return r}function ny(e,t){let r=e[t];return"string"==typeof r?r:void 0}async function ng(e,t,r,n,i){switch(e.kind){case"inventory":await nA(t,r,n);return;case"download":await nb(e.artifactId,t,r,n,i);return}}async function nb(e,t,r,n,i){if(!e){r.statusCode=400,r.end("Missing artifact id");return}try{let a=await n({req:t,res:r,daemonRequest:{command:"download_artifact",positionals:[e]}});if(!a)return;let o=await rq(e,a.tenantId),l=!0===i.retainArtifacts,d=s.createReadStream(o.artifactPath);r.statusCode=200,r.setHeader("content-type",o.mimeType),r.setHeader("content-length",String(o.sizeBytes)),o.fileName&&r.setHeader("content-disposition",`attachment; filename="${o.fileName.replace(/"/g,"")}"`),d.on("error",e=>{if(r.headersSent)r.destroy(e);else{let t=tn(e);r.statusCode=r$(t.code),r.end(t.message)}});let c=!1,u=()=>{c||l||(c=!0,rX(e))};d.on("end",u),r.on("finish",u),r.on("close",()=>{r.writableFinished&&u()}),d.pipe(r)}catch(e){rU(r,tn(e))}}async function nA(e,t,r){try{let n=await r({req:e,res:t,daemonRequest:{command:"list_artifacts",positionals:[]}});if(!n)return;t.statusCode=200,t.setHeader("content-type","application/json"),t.end(JSON.stringify({artifacts:await rV(n.tenantId)}))}catch(e){rU(t,tn(e))}}let nS=new Set(["replay","test"]),nI=new Set(["agent_device.command","agent-device.command"]),n_=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),nM=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),nx={"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"},nN=new Set([...nI,...n_,...nM,...Object.keys(nx)]);function nD(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function nP(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function nk(e,t){e.destroyed||(e.write(tc(t)),e.end())}function nE(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 nC(e,t){let r=e[t];return"string"==typeof r?r:void 0}function nR(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function nO(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new ti("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function nT(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new ti("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function nL(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=tn(new ti("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:nD(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=tn(new ti(tt(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:nD(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=to(r.tenantId);if(!e){let e=tn(new ti("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:nD(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function nF(){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=o.isAbsolute(t)?t:o.resolve(t);try{e=await import(p(n).href)}catch(e){throw new ti("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 ti("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:n,exportName:r});return i}async function n$(e){let t=await nF(),{handleRequest:r,token:n,retainArtifacts:i=!1}=e;return c.createServer((e,a)=>{if("GET"===e.method&&"/health"===e.url){a.statusCode=200,a.setHeader("content-type","application/json"),a.end(JSON.stringify(tu("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(nl)?{kind:"direct",uploadId:t.url.slice(nl.length).replace(/\?.*$/,"")}:"POST"===t.method&&"/upload/finalize"===t.url?{kind:"finalize"}:"POST"===t.method&&"/upload"===t.url?{kind:"upload"}:null;return null!==o&&(nd(o,r,n,i,a),!0)}({req:e,res:a,token:nE({},e.headers),authorize:async e=>await nB({req:e.req,res:e.res,authHook:t,expectedToken:n,daemonRequest:e.daemonRequest})})||function(e){let{req:t,res:r,authorize:n,retainArtifacts:i}=e,a=function(e){let t,r;if("GET"!==e.method)return null;let n=(r=(t=e.url||"/").indexOf("?"))>=0?t.slice(0,r)||"/":t;return"/artifacts"===n||"/artifacts/"===n?{kind:"inventory"}:n.startsWith("/artifacts/")?{kind:"download",artifactId:function(e){let t=e.slice(11);if(!t||t.includes("/"))return"";try{return decodeURIComponent(t)}catch{return""}}(n)}:null}(t);return null!==a&&(ng(a,t,r,n,{retainArtifacts:i}),!0)}({req:e,res:a,retainArtifacts:i,authorize:async e=>await nB({req:e.req,res:e.res,authHook:t,expectedToken:n,daemonRequest:e.daemonRequest})}))return;if("POST"!==e.method||"/rpc"!==e.url){a.statusCode=404,a.end("Not found");return}let o="";e.setEncoding("utf8"),e.on("data",t=>{(o+=t).length>1048576&&e.destroy(Error("request too large"))}),e.on("error",()=>{a.headersSent||nP(a,nD(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,i;try{n=JSON.parse(o)}catch{nP(a,nD(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void nP(a,nD(n.id??null,-32600,"Invalid Request"),400);if(!nN.has(n.method))return void nP(a,nD(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void nP(a,nD(n.id??null,-32602,"Invalid params"),400);let s=!1;try{var l,d;let o=n.params,c=function(e,t,r){if(nI.has(e))return n=function(e){try{return ek.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 ti("INVALID_ARGS",`Invalid params: ${e}`)}}(t),{token:nE(n,r),session:n.session??"default",command:n.command??"",positionals:n.positionals??[],flags:n.flags,runtime:n.runtime,meta:n.meta};if(n_.has(e)){var n;let e,i=nC(t,"platform");if("ios"!==i&&"android"!==i)throw new ti("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:nE(t,r),session:nC(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:i},meta:{requestId:nC(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new ti("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new ti("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 ti("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 ti("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 ti("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=nO(e,"owner"),n=nO(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new ti("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new ti("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new ti("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:nT(e,"artifactId")}:(a&&(t=nT(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:nO(e,"artifactName")})}(t);throw new ti("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:nR(t,"retentionMs")}}}if(nM.has(e)){let e=nC(t,"materializationId")?.trim();if(!e)throw new ti("INVALID_ARGS","Invalid params: materializationId is required");return{token:nE(t,r),session:nC(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:nC(t,"requestId"),materializationId:e}}}let i=nx[e];if(i)return{token:nE(t,r),session:nC(t,"session")??"default",command:i,positionals:[],meta:{tenantId:nC(t,"tenantId")??nC(t,"tenant"),runId:nC(t,"runId"),leaseId:nC(t,"leaseId"),leaseTtlMs:nR(t,"ttlMs"),leaseBackend:nC(t,"backend"),leaseProvider:nC(t,"leaseProvider")??nC(t,"provider"),deviceKey:nC(t,"deviceKey"),clientId:nC(t,"clientId")}};throw new ti("INVALID_ARGS",`Method not found: ${e}`)}(n.method,o,e.headers);if(l=n.method,nI.has(l)&&("string"!=typeof c.command||0===c.command.length))return void nP(a,nD(n.id??null,-32602,"Invalid params: command is required"),400);i=rI(c.meta?.requestId,n.id),c.meta={...c.meta,requestId:i},r_(i);let u=await nL(t,{headers:e.headers,rpcRequest:n,daemonRequest:c});if(!u.ok)return void nP(a,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"||nS.has(d.command))),f=!1,m=()=>{s||a.writableFinished||f||(f=!0,rM(i),e_({level:"warn",phase:"request_client_disconnected",data:{requestId:i,abortIosRunnerSessions:p}}),p&&nU(i))};if(e.on("aborted",m),a.on("close",()=>{a.headersSent&&m()}),(e.aborted||a.destroyed&&a.headersSent)&&m(),tf(c)){a.statusCode=200,a.setHeader("content-type","application/x-ndjson");let e=await rO(e=>{!a.destroyed&&a.write(tg(e))},async()=>await r(c));s=!0;let t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:nD(n.id??null,-32e3,e.error.message,e.error);nk(a,t);return}let h=await r(c);if(s=!0,h.ok)return void nP(a,{jsonrpc:"2.0",id:n.id??null,result:h});nP(a,nD(n.id??null,-32e3,h.error.message,h.error),r$(h.error.code))}catch(r){s=!0;let e=tn(r),t="INVALID_ARGS"===e.code?-32602:-32e3;if(a.headersSent)return void nk(a,nD(n.id??null,t,e.message,e));nP(a,nD(n.id??null,t,e.message,e),r$(e.code))}finally{rx(i)}})})}async function nU(e){try{let t=Date.now()+15e3;for(;rN(e)&&Date.now()<t;){let{abortAllIosRunnerSessions:t}=await Promise.resolve(t7);if(await t(),!rN(e))break;await tb(200)}}catch(e){e_({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e)}})}}async function nB(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=nE({},n.headers),d=(t=l,!(r=o)||eY(t,r)?null:tn(new ti("UNAUTHORIZED","Invalid token")));if(d)return rU(i,d),null;let c=await nL(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 nG(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 nq={support:"supported"},nV={support:"unsupported"},nj={lease:nq,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:nq,close:nq,snapshot:{support:"partial",note:"Uses Appium page source XML, not agent-device native snapshot backends."},screenshot:nq,tap:nq,doubleTap:nq,longPress:nq,swipe:nq,scroll:{support:"partial",note:"Implemented as viewport-relative W3C pointer gestures."},fill:nq,type:nq,back:nq,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:nV,pinch:nV,rotateGesture:nV,transformGesture:nV,logs:nV,record:nV,artifacts:nV,portReverse:nV,nativeSnapshotBackend:{support:"unsupported",note:"Cloud WebDriver cannot upload or run agent-device native runner/helper backends."}};function nK(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}(nj,e.overrides)}}function nH(e,t){return"unsupported"!==e.operations[t].support}function nW(e,t){let r=e.operations[t],n=r.note?` ${r.note}`:"";return`${e.provider} WebDriver runtime does not support ${t}.${n}`}function nz(){return{"x-agent-device-client":"agent-device-cli","x-agent-device-version":tA()}}function nX(e){return`Basic ${Buffer.from(`${e.username}:${e.accessKey}`).toString("base64")}`}class nJ{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={...nz(),...e.auth?{Authorization:nX(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 ti("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 ti("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 ti("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 ti("COMMAND_FAILED","WebDriver screenshot response was not base64 text",{valueType:typeof t});await y.writeFile(e,Buffer.from(t,"base64"))}async windowRect(){var e=await this.sessionRequest("GET","/window/rect");if(!e||"object"!=typeof e)throw new ti("COMMAND_FAILED","WebDriver window rect response was empty.");let t={x:nZ(e,"x"),y:nZ(e,"y"),width:nZ(e,"width"),height:nZ(e,"height")};if(void 0===t.x||void 0===t.y||void 0===t.width||void 0===t.height)throw new ti("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 ti("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 ti){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 tb(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 ti("COMMAND_FAILED","WebDriver response was not valid JSON.",{text:e},t)}}(s):{};if(!o.ok){let e;throw n=o.status,new ti("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 nZ(e,t){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:void 0}function nY(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_.:-"),n0=new Set([" "," ","\n","\r"]),n1=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function n2(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new n5(e).parse()}function n3(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)}n3(r.children,t)}}class n5{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(n1.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?n4(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,n4(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])&&n0.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function n4(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 n6(e){let t=n2(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=nY(e.bounds??null);if(t)return t;let r=ie(e.x),n=ie(e.y),i=ie(e.width),a=ie(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=n7(r.enabled,!0),l=n7(r.displayed??r.visible,!0);return{index:e,type:t,role:(a=t,n9(r.class)??n9(a.replace(/^XCUIElementType/,"").toLowerCase())),label:n8(r,["content-desc","label","text","name"]),value:n9(r.value),identifier:n8(r,["resource-id","id","accessibility-id","name"]),rect:o,enabled:s,selected:n7(r.selected),focused:n7(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 n8(e,t){for(let r of t){let t=n9(e[r]);if(void 0!==t)return t}}function n9(e){return e||void 0}function n7(e,t=!1){return void 0===e?t:"true"===e||"1"===e}function ie(e){if(void 0===e||""===e)return;let t=Number(e);return Number.isFinite(t)?t:void 0}class it{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=ed({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:n6(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=n6(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){nH(this.capabilities,e)||this.unsupported(e)}unsupported(e){throw new ti("UNSUPPORTED_OPERATION",nW(this.capabilities,e),{provider:this.capabilities.provider,platform:this.capabilities.platform,operation:e})}}function ir(e,t,r={}){return{platformName:"ios"===e?"iOS":"Android","appium:deviceName":t,...r}}class ii{provider;leaseLifecycle;cloudArtifacts;deviceInventoryProvider;capabilities;sessionsByLeaseId=new Map;releasedProviderSessionIdsByLeaseId=new Map;options;constructor(e){this.options=e,this.provider=e.provider,this.capabilities=nK({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 nJ({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 it((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 io(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 nK({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:ir(this.options.platform,this.options.deviceName,t)}}deviceForLease(e,t){return{...eM(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(!nH(e.capabilities,"install"))throw new ti("UNSUPPORTED_OPERATION",nW(e.capabilities,"install"),{provider:this.provider,deviceId:t.id,platform:eO(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:ia(e)})}try{t=await e.prepared.cleanup?.()}catch(e){r.push({code:"PROVIDER_CLEANUP_FAILED",message:ia(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 ia(e){return e instanceof Error?e.message:String(e)}async function io(e,t){try{await e.cleanup?.()}catch(e){t instanceof ti&&(t.details={...t.details,cleanupError:ia(e)})}}async function is(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 nG({provider:e,providerSessionId:t,artifacts:n,pendingMessage:"AWS Device Farm artifacts are not ready yet."})}e2.awsDeviceFarm;let il={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 id(e={}){var t;let r,n,i=(r=(t=e).region?["--region",t.region]:[],n=t.awsCommand??"aws",async(e,t)=>await iu(n,["devicefarm",e,...r,...t,"--output","json"]));return{createRemoteAccessSession:async e=>ip(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=>ip(await i("get-remote-access-session",["--arn",e])),stopRemoteAccessSession:async e=>ip(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 ic(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 ti("COMMAND_FAILED","AWS Device Farm remote access session did not start.",{sessionArn:e,status:a.status,result:a.result});await tb(n),a=await t.client.getRemoteAccessSession(e)}throw new ti("COMMAND_FAILED","Timed out waiting for AWS Device Farm remote access.",{sessionArn:e,status:a.status,result:a.result,timeoutMs:r})}async function iu(e,t){return JSON.parse((await eI(e,t,{maxBuffer:0xa00000})).stdout)}function ip(e){if(!e||"object"!=typeof e)throw new ti("COMMAND_FAILED","AWS Device Farm response was not an object.",{response:e});let t=e.remoteAccessSession;if(!t||"object"!=typeof t)throw new ti("COMMAND_FAILED","AWS Device Farm response missed remoteAccessSession.",{response:e});return t}e2.browserStack;let im="https://api-cloud.browserstack.com/app-automate/upload",ih={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 iw(e,t,r){var n,i,a;if(!t)return;let o=await iy(t,r),s=[ig(n=e,i=t,a=o,"video_url","video","Session video"),ig(n,i,a,"appium_logs_url","appium-log","Appium logs"),ig(n,i,a,"device_logs_url","device-log","Device logs"),ig(n,i,a,"browser_url","provider-session","BrowserStack dashboard"),ig(n,i,a,"public_url","provider-session","Public session link")].filter(e=>void 0!==e);return nG({provider:e,providerSessionId:t,artifacts:s,pendingMessage:"BrowserStack artifacts are not ready yet."})}async function iv(e,t){let r=await y.readFile(e),n=new FormData;n.set("file",new Blob([r]),o.basename(e));let i=await fetch(t.endpoint??im,{method:"POST",headers:{...nz(),Authorization:nX(t)},body:n}),a=await i.json(),s=function(e){if(!e||"object"!=typeof e)return;let t=e.app_url;return"string"==typeof t?t:void 0}(a);if(!i.ok||!s)throw new ti("COMMAND_FAILED","BrowserStack app upload failed.",{status:i.status,response:a});return s}async function iy(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:{...nz(),Authorization:nX(t)}}),i=await n.json();if(!n.ok||!i||"object"!=typeof i)throw new ti("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 ig(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 ib=[{provider:e2.browserStack,createRuntime:e=>new ii({provider:e2.browserStack,platform:"android",deviceName:"BrowserStack device",endpoint:e.BROWSERSTACK_WEBDRIVER_ENDPOINT??"https://hub-cloud.browserstack.com/wd/hub/",capabilityOverrides:ih,listArtifacts:async({provider:t,providerSessionId:r})=>{let n=ix(e,"BROWSERSTACK_USERNAME","BrowserStack artifact lookup"),i=ix(e,"BROWSERSTACK_ACCESS_KEY","BrowserStack artifact lookup");return await iw(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=iS(t,"BrowserStack"),s=ix(e,"BROWSERSTACK_USERNAME","BrowserStack"),l=ix(e,"BROWSERSTACK_ACCESS_KEY","BrowserStack"),d=iI(o,"BrowserStack"),c=i_(o,"device","BrowserStack requires --device <name>."),u=i_(o,"providerOsVersion","BrowserStack requires --provider-os-version <version>."),p=await iA({app:i_(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??im},async({appPath:e,options:t})=>({appReference:await iv(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:ir(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=ix(t,"BROWSERSTACK_USERNAME","BrowserStack artifact lookup"),n=ix(t,"BROWSERSTACK_ACCESS_KEY","BrowserStack artifact lookup");return await iw(e2.browserStack,e,{username:r,accessKey:n,endpoint:t.BROWSERSTACK_SESSION_DETAILS_ENDPOINT})}},{provider:e2.awsDeviceFarm,createRuntime:e=>new ii({provider:e2.awsDeviceFarm,endpoint:"http://127.0.0.1/",platform:"android",deviceName:"AWS Device Farm device",capabilityOverrides:il,listArtifacts:async({provider:t,providerSessionId:r})=>{let n=id({region:e.AWS_REGION??e.AWS_DEFAULT_REGION??iD(r??"")});return await is(t,r,n)},prepareSession:async({req:t,lease:r,base:n})=>{let i=iS(t,"AWS Device Farm"),a=iI(i,"AWS Device Farm"),o={client:id({region:iM(i,"awsRegion")??e.AWS_REGION??e.AWS_DEFAULT_REGION}),projectArn:iN(i,e,"awsProjectArn","AGENT_DEVICE_AWS_DEVICE_FARM_PROJECT_ARN","AWS_DEVICE_FARM_PROJECT_ARN"),deviceArn:iN(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 ic(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 ti("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:ir(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=id({region:t.AWS_REGION??t.AWS_DEFAULT_REGION??iD(e)});return await is(e2.awsDeviceFarm,e,r)}}];async function iA(e){var t;if((t=e.app).startsWith("bs://")||/^https?:\/\//.test(t))return e.app;let r=o.resolve(e.cwd??process.cwd(),e.app);if(!s.existsSync(r))throw new ti("INVALID_ARGS","BrowserStack --provider-app must be a bs:// app id, URL, or existing local app path.",{providerApp:e.app});return await iv(r,{username:e.username,accessKey:e.accessKey,endpoint:e.uploadEndpoint})}function iS(e,t){if(e)return e;throw new ti("INVALID_ARGS",`${t} lease allocation requires provider profile flags on the request.`)}function iI(e,t){let r=e.flags?.platform;if("android"===r||"ios"===r)return r;throw new ti("INVALID_ARGS",`${t} requires --platform ios|android.`)}function i_(e,t,r){let n=iM(e,t);if(n)return n;throw new ti("INVALID_ARGS",r)}function iM(e,t){let r=e.flags?.[t];return"string"==typeof r&&r.length>0?r:void 0}function ix(e,t,r){let n=e[t];if(n)return n;throw new ti("INVALID_ARGS",`${r} requires ${t} in the environment.`)}function iN(e,t,r,n,i){let a=iM(e,r)??t[n]??t[i];if(a)return a;throw new ti("INVALID_ARGS",`AWS Device Farm requires --${String(r).replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)} or ${i}.`)}function iD(e){return/^arn:[^:]+:devicefarm:([^:]+):/.exec(e)?.[1]}async function iP(e,t){if(e.providerSessionId){var r;return await (r=e.provider,ib.find(e=>e.provider===r))?.listArtifactsFromEnv(e.providerSessionId,t)}}let ik=[],iE=new f;async function iC(e,t){return await iE.run([...e],t)}function iR(e){return i$().some(t=>t.ownsDevice(e))}async function iO(e,t,r,n){for(let i of i$()){if(!i.ownsDevice(e))continue;if(!i.installApp)throw iq(i,e,"install");let a=await i.installApp?.(e,t,r,n);if(a)return a;throw iq(i,e,"install")}}async function iT(e,t,r){for(let n of i$()){if(!n.ownsDevice(e))continue;if(!n.installInstallablePath)throw iq(n,e,"install_from_source");let i=await n.installInstallablePath?.(e,t,r);if(i)return i;throw iq(n,e,"install_from_source")}}async function iL(e){for(let t of i$()){if(!iG(t,e.provider))continue;let r=await t.configurePortReverse?.(e);if(r)return r}}async function iF(e){for(let t of i$()){if(!iG(t,e.provider))continue;let r=await t.removePortReverse?.(e);if(r)return r}}function i$(){return iE.getStore()??ik}async function iU(e,t){for(let r of e){if(!iG(r,t.provider))continue;let e=await r.cloudArtifacts?.listCloudArtifacts?.(t);if(e)return e}}async function iB(e,t,r,n){for(let i of e){if(!iG(i,r.leaseProvider))continue;let e=i.leaseLifecycle[t],a=e?await e(r,n):void 0;if(a)return a}}function iG(e,t){return e.provider===t}function iq(e,t,r){throw new ti("UNSUPPORTED_OPERATION",`Provider device runtime ${e.provider} does not support ${r} for this device.`,{provider:e.provider,deviceId:t.id,platform:eO(t)})}let iV="default";function ij(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function iK(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function iH(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 ti("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}function iW(e){if(void 0===e)return;let t=e.trim();if(!t||t.length>256||!/^[\x20-\x7E]+$/.test(t))throw new ti("INVALID_ARGS","Invalid device key. Use 1-256 printable characters.");return t}function iz(e){return iJ(e,"client id",128)}function iX(e){return iJ(e,"lease provider",64)}function iJ(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 ti("INVALID_ARGS",`Invalid ${t}. Use 1-${String(r)} chars: letters, numbers, dot, underscore, hyphen.`);return n}class iZ{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:iH(e.leaseBackend),leaseProvider:iX(e.leaseProvider),deviceKey:iW(e.deviceKey),clientId:iz(e.clientId),tenantId:function(e){let t=to(e);if(!t)throw new ti("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return t}(e.tenantId),runId:function(e){let t=ij(e);if(!t)throw new ti("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:i.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=iH(e.leaseBackend),r=to(e.tenantId);if(!r)throw new ti("INVALID_ARGS","tenant isolation requires tenant id.");let n=ij(e.runId);if(!n)throw new ti("INVALID_ARGS","tenant isolation requires run id.");let i=iK(e.leaseId);if(!i)throw new ti("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=iK(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 ti("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 ti("INVALID_ARGS",`Lease ttlMs must be between ${this.minLeaseTtlMs} and ${this.maxLeaseTtlMs}.`);return t}normalizeRequiredLeaseId(e){let t=iK(e);if(!t)throw new ti("INVALID_ARGS","Invalid lease id.");return t}getActiveLease(e){let t=this.leases.get(e);if(t)return t;throw new ti("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??iV,e.deviceKey??"*"])}deviceBindingKey(e){if(e.deviceKey)return JSON.stringify([e.backend,e.leaseProvider??iV,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 ti("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=to(e.tenantId),r=ij(e.runId);if(e.tenantId&&!t)throw new ti("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(e.runId&&!r)throw new ti("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return{tenantId:t,runId:r,leaseBackend:e.leaseBackend?iH(e.leaseBackend):void 0,leaseProvider:iX(e.leaseProvider),deviceKey:iW(e.deviceKey),clientId:iz(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 ti("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}throwScopeRequired(){throw new ti("UNAUTHORIZED","Lease owner scope is required",{reason:"LEASE_SCOPE_REQUIRED"})}}let iY=["android","apple","linux"],iQ={platform:"web",id:"agent-browser-chrome",name:"Agent Browser Chrome",kind:"device",target:"desktop",booted:!0};async function i0(e){if("web"===e.platform)return[iQ];if(i2(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 iY)try{t.push(...await i0({...e,platform:r}))}catch{}return t}function i1(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=eB(r=n)||eC(r)?"apple":r.platform;t[e].available+=1,!0===n.booted&&(t[e].booted+=1)}return t}function i2(e){return"macos"===e.platform||"apple"===e.platform&&"desktop"===e.target}let i3=new f,i5=new f;async function i4(e,t,r){var n,i;let a=await i6(e,t,r);if(n=t,i=a,!i8(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 ti("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function i6(e,t,r){try{return await eP(e,t,r)}catch(e){var n;if(n=e,!i8(t)&&n instanceof ti&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function i8(e){return!!(e.udid||e.serial||e.deviceName)}async function i9(e,t={}){var r;let n=i7(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 eA("resolve_target_device",async()=>{let e=function(e){let t=i3.getStore(),r=t?.get(e);if(r)return{...r}}(o);if(e)return l.cacheHit=!0,e;let t=await ai(n);if(t)return aa(a)?ao(o,await i4(t,a,{simulatorSetPath:i})):ao(o,await eP(t,a,s));let r=await i0(n);return aa(a)?ao(o,await i4(r,a,{simulatorSetPath:i})):ao(o,await eP(r,a,s))},l)}function i7(e){let t=e.platform;if(e.target&&!t)throw new ti("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let r=ex({simulatorSetPath:t_(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=tB(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 ae(e){return i3.getStore()?await e():await i3.run(new Map,e)}async function at(e,t){return e?await i5.run(e,t):await t()}async function ar(e,t){return await at(e,async()=>await ae(t))}async function an(e){return await ai(e)??await i0(e)}async function ai(e){let t=i5.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function aa(e){return e$(e.platform)}function ao(e,t){return i3.getStore()?.set(e,{...t}),t}let as=new Map;function al(e){return as.get(e)}let ad={appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1,multiTouchSynthesis:!0},ac={ios:ad,ipados:ad,visionos:ad,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 au(e){return e$(e.platform)?ac[e.appleOs?e.appleOs:"macos"===e.platform?"macos":eE(e)?"tvos":"ios"]:void 0}function ap(e){return"darwin"===process.platform&&(eC(e)||eB(e)&&"simulator"===e.kind||"android"===e.platform&&"emulator"===e.kind)}function af(e){return"web"===e.platform||ap(e)}let am=e=>{let t=au(e);return!t||t.appAndDeviceLifecycle},ah=e=>{let t=au(e);return t&&t.physicalDeviceSurfaces||"simulator"===e.kind},aw=e=>{let t=au(e);return t?t.multiTouchSynthesis&&"simulator"===e.kind:"android"===e.platform},av=e=>{let t=au(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."}},ay=[{id:"apple",platforms:["apple"],familySelector:"apple",capability:{bucket:"apple",supportsByDefault:{[tj.boot]:am,[tj.install]:am,[tj.reinstall]:am,[tj.installFromSource]:am,[tj.push]:am,[tj.home]:am,[tj.appSwitcher]:am,[tj.clipboard]:e=>"android"===e.platform||"linux"===e.platform||ah(e),[tj.keyboard]:e=>{let t=au(e);return t?t.keyboard:"android"===e.platform},[tj.rotate]:e=>{let t=au(e);return t?t.orientation:"android"===e.platform},[tj.alert]:e=>"android"===e.platform||ah(e),[tj.settings]:e=>"android"===e.platform||ah(e),[tj.audio]:af,pinch:aw,"rotate-gesture":aw,"transform-gesture":aw},unsupportedHintByDefault:{pinch:av,"rotate-gesture":av,"transform-gesture":av}},appLog:{resolveBackend:e=>eC(e)?"macos":"device"===e.kind?"ios-device":"ios-simulator"},perf:{supportsMetrics:()=>!0},recording:{resolveBackendTag:e=>eC(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(i2(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:{[tj.audio]:af}},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]}],ag=!1;function ab(){if(!ag){for(let e of ay)for(let t of e.platforms){if(as.has(t))throw Error(`PlatformPlugin already registered for platform "${t}"`);as.set(t,e)}ag=!0}}ab();let aA={device:!0},aS=new Set(["open","close","record","audio","find","get","is","network","screenshot","snapshot","wait","click","fill","focus","press","scroll","type","viewport"]),aI=function(e){let t={};for(let[r,n]of Object.entries(e))t[r]=aS.has(r)?{...n,web:aA}:n;for(let t of aS)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}(tX(tz));function a_(e,t){let r=aI[e];if(!r)return!0;let n=al(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 ax(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 aN={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:ax,get:ax},aD="No active session. Run open first.";function aP(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}function ak(){return aP("SESSION_NOT_FOUND",aD)}function aE(e,t,r){if(a_(e,t))return null;let n=r?.hint?al(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 aC=["platform","target","device","udid","serial"],aR=[...aC,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function aO(e){return aL(e,aC)}function aT(e){return"string"==typeof e&&e.trim().length>0}function aL(e,t){return!!e&&t.some(t=>aT(e[t]))}let aF=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}}(tJ(tz));function a$(e){return aB(e)?.sessionKind}function aU(e){return aB(e)?.leaseAdmissionExempt===!0}function aB(e){return aF.descriptorsByCommand.get(e)}function aG(e,t){return al(t.platform)?.providers?.platformGatedResolvers.includes(e)??!1}ab();let aq=[{resolverKey:"androidAdbProvider",resolve(e,t){let r=e.androidAdbProvider;if(!r||!aG("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");aW(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&aG("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(re);aW(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&&aG("appleToolProvider",t.device)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(rt);aW(t,e.appleTool,r)}},{resolverKey:"linuxToolProvider",resolve(e,t){let r=e.linuxToolProvider;return r&&aG("linuxToolProvider",t.device)?{linuxTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.linuxTool?.provider)return;let{withLinuxToolProvider:r}=await Promise.resolve(ri);aW(t,e.linuxTool,r)}},{resolverKey:"webProvider",resolve(e,t){let r=e.webProvider;return r&&aG("webProvider",t.device)?{web:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.web?.provider)return;let{withWebProvider:r}=await import("./provider.js");aW(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(t9);aW(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");aW(t,e.recording,r)}}];async function aV(e,t){let r=await aj(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await aH(r);return await az(i,async()=>await t(n))}async function aj(e){var t,r,n;if(t=e.providers,!aq.some(e=>!!t[e.resolverKey]))return{};let i=await aK(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return aq.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function aK(e,t){switch(function(e,t){var r;let n,i;if(t.hasExistingSession)return aB(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(r=e,"function"==typeof(i=aB(r.command)?.skipSessionlessProviderDevice)&&i(r))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(n=aB(e.command)?.allowSessionlessDefaultDevice)&&n(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:aO(e.flags)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await i9(e.flags??{});case"skip":return}}async function aH(e){let t=[];for(let r of aq)await r.appendWrapper(e,t);return t}function aW(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function az(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function aX(e,t){if(iR(e)){let t=function(e){for(let t of i$()){if(!t.ownsDevice(e))continue;let r=t.getInteractor(e);if(r)return r}}(e);if(t)return t;throw new ti("UNSUPPORTED_OPERATION","Provider device runtime does not have an active interactor for this device.",{deviceId:e.id,platform:eO(e)})}return await (function(e){let t=as.get(e);if(!t)throw new ti("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e}`);return t})(e.platform).createInteractor(e,t)}ab();let aJ=/^[A-Za-z0-9_.:-]{1,64}$/,aZ="--launch-console is supported only for iOS simulator app launches",aY="--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 a0(e,t){if(t<=0)return[0,0];let[r,n]=aQ[e%aQ.length];return[r*t,n*t]}async function a1(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await tb(t)}async function a2(e,t){let{x:r,y:n}=a7(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,...Z(`Long pressed (${r}, ${n})`)}}async function a3(e,t){let{x:r,y:n}=a7(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...Z(`Focused (${r}, ${n})`)}}async function a5(e,t,r){let n=e5(t[0]);if(n)throw new ti("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 ti("INVALID_ARGS","type requires text");let a=ea(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...Z(oS("Typed",i))}}async function a4(e,t,r){if(r?.directElementSelector)return await a6(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 ti("INVALID_ARGS","fill requires x y text");let o=ea(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...Z(oS("Filled",a))}}async function a6(e,t,r,n){if(!e.fillElementSelector)throw new ti("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new ti("INVALID_ARGS","fill requires text");let a=ea(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...Z(oS("Filled",i))}}async function a8(e,t,r,n){var i,a;if(n?.directElementSelector&&eB(e))return await a9(t,n.directElementSelector);let{x:o,y:s}=a7(r,"press requires x y");if(eC(e)&&n?.surface&&"app"!==n.surface)return await oe(o,s,n);let l=E(n);if("primary"!==l)return await ot(e,o,s,l,n);let d=(a=n,{count:on(a?.count,1,"count",1,200),intervalMs:on(a?.intervalMs,0,"interval-ms",0,1e4),holdMs:on(a?.holdMs,0,"hold-ms",0,1e4),jitterPx:on(a?.jitterPx,0,"jitter-px",0,100),doubleTap:!!a?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new ti("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new ti("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(d),i=d.count,e$(e.platform)&&i>1)?await oa(e,o,s,d,n):await oo(t,o,s,d)}async function a9(e,t){if(!e.tapElementSelector)throw new ti("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...Z(`Tapped ${t.raw}`)}}function a7(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new ti("INVALID_ARGS",t,r);return{x:n,y:i}}async function oe(e,t,r){let n=E(r);if("primary"!==n)throw new ti("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(rr);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...Z(ob({x:e,y:t}))}}async function ot(e,t,r,n,i){if(function(e,t,r){let n=K({commandLabel:"click",platform:eO(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 or(t,r,n);let{runAppleRunnerCommand:a}=await Promise.resolve(t7);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},os(i)),{x:t,y:r,button:n,...Z(ob({x:t,y:r,button:n}))}}async function or(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,...Z(ob({x:e,y:t,button:r}))}}function on(e,t,r,n,i){return ea(void 0===e?t:e,r,n,i)}async function oi(e,t,r){let n,i,{runAppleRunnerCommand:a}=await Promise.resolve(t7),{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),os(r));n??=d,i=d;try{o=l(d)}catch(e){throw function(e,t){if(0===t||!(e instanceof ti)||!e.details)return e;let r=e.details.failedStepIndex;if("number"!=typeof r)return e;let n=e.details.completedSteps;return new ti(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 oa(e,t,r,n,i){var a,o,s,l;let d,c,u=await oi(e,(a=e,o=t,s=r,c="tap"==(d=(l=n).doubleTap?"doubleTap":l.holdMs>0?"longPress":"tap")&&eB(a)&&!eE(a),Array.from({length:l.count},(e,t)=>{let[r,n]=a0(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,...Z(ob({x:t,y:r}))}}async function oo(e,t,r,n){let i;return await a1(n.count,n.intervalMs,async a=>{let[o,s]=a0(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}}),L({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},ob({x:t,y:r}))}function os(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 ol(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 ti("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await oc({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function od(e,t,r,n){let i=q(r[0]),a=r[1]?Number(r[1]):300,o=eo((await t.snapshot({appBundleId:n?.appBundleId})).nodes??[]);if(!o)throw new ti("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=ec(i,o,{platform:e.platform});return await oc({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function oc(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:d}=e,c=ea(l,"durationMs",16,1e4),u=ea(n?.count??1,"count",1,200),p=ea(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if(!N(J,f))throw new ti("INVALID_ARGS",`Invalid pattern: ${f}`);if(e$(t.platform)&&u>1){let e=await oi(t,function(e){let{device:t,x1:r,y1:n,x2:i,y2:a,count:o,pauseMs:s,pattern:l,effectiveDurationMs:d}=e,c=eB(t)&&!eE(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,...Z(oA(u,f))}}return await a1(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)}),L({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}`:oA(u,f))}async function ou(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 ti("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=ea(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??{},...Z(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function op(e,t){let r=es(I,t[0],{message:"fling direction must be up, down, left, or right"}),n=Number(t[1]),i=Number(t[2]);if(![n,i].every(Number.isFinite))throw new ti("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new ti("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=ea(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,...Z(`Flung ${r}`)}}async function of(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 ti("INVALID_ARGS","scroll requires direction");n=f,i=m,a=h,function(e){if(void 0!==e&&!Number.isFinite(e))throw new ti("INVALID_ARGS","scroll amount must be a number")}(n),T(a),Y({amount:n,pixels:i});let w="bottom"===(o=p)?{direction:"down",edge:"bottom"}:"top"===o?{direction:"up",edge:"top"}:{direction:M(o)},v={amount:f,pixels:m,durationMs:h},{interactionResult:y,completedPasses:g}=await om(e,r,w,v);return L((s=w,l=v,d=g,u=F(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}),z(w.direction,w.edge,g,f,m))}async function om(e,t,r,n){if(r.edge){let i=r.edge,a=await $({edge:i,captureState:async r=>await oh(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 oh(e,t,r,n){if("function"!=typeof e.snapshot)throw new ti("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await ee({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,scope:e})).nodes??[]})}async function ow(e,t,r,n){if("tv"===e.target)throw new ti("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if(eC(e)&&n?.surface&&"app"!==n.surface)throw new ti("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 ti("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...Z(`Pinched to scale ${i}`)}}async function ov(e,t,r){if("tv"===e.target)throw new ti("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if(eC(e))throw new ti("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 ti("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 ti("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 ti("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 ti("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,...Z(`Rotated gesture ${n} degrees`)}}async function oy(e,t,r){if("tv"===e.target)throw new ti("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n=eB(e)&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new ti("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 ti("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new ti("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:ea(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...Z(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function og(e,t,r){let{x:n,y:i}=a7(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(rn);return{action:"read",text:await e(n,i,r?.surface)}}if(eC(e)&&r?.surface&&"app"!==r.surface){let{runMacOsReadTextAction:e}=await Promise.resolve(rr);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runAppleRunnerCommand:a}=await Promise.resolve(t7),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 ob(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function oA(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function oS(e,t){return`${e} ${Array.from(t).length} chars`}function oI(e,t){let r,n=t?.subject??"Payload",i=e.trim();if(!i)throw new ti("INVALID_ARGS",`${n} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!s.statSync(a).isFile())throw new ti("INVALID_ARGS",`${n} path is not a file: ${a}`);return{kind:"file",path:a}}catch(t){if(t instanceof ti)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new ti("INVALID_ARGS",`${n} file is not readable: ${a}`);if(e&&"ENOENT"!==e)throw new ti("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 ti("INVALID_ARGS",`${n} file not found: ${a}`)}async function o_(e){let t=oI(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 ti("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof ti)throw t;throw new ti("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function oM(e){try{return await d.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new ti("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new ti("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new ti("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new ti("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function ox(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 aX(e,a);return e_({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await eA("platform_command",async()=>await oD(e,o,t,r,n,i,a),{command:t,platform:e.platform})}let oN={open:({device:e,interactor:t,positionals:r,context:n})=>oP(e,t,r,n),close:async({device:e,interactor:t,positionals:r})=>{let n=r[0];return n?(await t.close(n),{app:n,...Z(`Closed: ${n}`)}):("web"===e.platform&&await t.close(""),{closed:"session",...Z("Closed session")})},press:({device:e,interactor:t,positionals:r,context:n})=>a8(e,t,r,n),swipe:({device:e,interactor:t,positionals:r,context:n})=>ol(e,t,r,n),"swipe-preset":({device:e,interactor:t,positionals:r,context:n})=>od(e,t,r,n),pan:({interactor:e,positionals:t})=>ou(e,t),fling:({interactor:e,positionals:t})=>op(e,t),longpress:({interactor:e,positionals:t})=>a2(e,t),focus:({interactor:e,positionals:t})=>a3(e,t),type:({interactor:e,positionals:t,context:r})=>a5(e,t,r),fill:({interactor:e,positionals:t,context:r})=>a4(e,t,r),scroll:({interactor:e,positionals:t,context:r})=>of(e,t,r),pinch:({device:e,interactor:t,positionals:r,context:n})=>ow(e,t,r,n),"rotate-gesture":({device:e,interactor:t,positionals:r})=>ov(e,t,r),"transform-gesture":({device:e,interactor:t,positionals:r})=>oy(e,t,r),"trigger-app-event":({device:e,interactor:t,positionals:r,context:n})=>ok(e,t,r,n),screenshot:({interactor:e,positionals:t,outPath:r,context:n})=>oE(e,t,r,n),viewport:({interactor:e,positionals:t})=>oC(e,t),back:async({interactor:e,context:t})=>(await e.back(t?.backMode),{action:"back",mode:t?.backMode??"in-app",...Z("Back")}),home:async({interactor:e})=>(await e.home(),{action:"home",...Z("Home")}),rotate:async({interactor:e,positionals:t})=>{let r=el(t[0]);return await e.rotate(r),{action:"rotate",orientation:r,...Z(`Rotated to ${r}`)}},"app-switcher":async({interactor:e})=>(await e.appSwitcher(),{action:"app-switcher",...Z("Opened app switcher")}),clipboard:({interactor:e,positionals:t})=>oR(e,t),keyboard:({device:e,positionals:t,context:r,runnerCtx:n})=>oO(e,t,r,n),settings:({device:e,interactor:t,positionals:r,context:n})=>oF(e,t,r,n),push:({device:e,positionals:t,context:r})=>o$(e,t,r),snapshot:({interactor:e,context:t})=>oU(e,t),read:({device:e,positionals:t,context:r})=>og(e,t,r)};async function oD(e,t,r,n,i,a,o){let s=Object.hasOwn(oN,r)?oN[r]:void 0;if(!s)throw new ti("INVALID_ARGS",`Unknown command: ${r}`);return await s({device:e,interactor:t,positionals:n,outPath:i,context:a,runnerCtx:o})}async function oP(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new ti("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new ti("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new ti("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...Z("Opened device")}}if(o&&(!eB(e)||"simulator"!==e.kind))throw new ti("UNSUPPORTED_OPERATION",aZ);if("linux"===e.platform&&s&&s.length>0)throw new ti("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(tG(i))throw new ti("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!tG(a))throw new ti("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new ti("INVALID_ARGS",aY);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...Z(`Opened: ${i}`)}}if(o&&tG(i))throw new ti("INVALID_ARGS",aY);if(n?.clearAppState){if(tG(i))throw new ti("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}:{},...Z(`Opened: ${i}`)}}async function ok(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new ti("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!aJ.test(t))throw new ti("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 ti("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 ti("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 ti("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof ti)throw t;throw new ti("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=eO(e),o=(i=(eB(n=e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:eC(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 ti("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 ti("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",...Z(`Triggered app event: ${i}`)}}async function oE(e,t,r,n){let i=t[0]??r??`./screenshot-${Date.now()}.png`;await d.mkdir(o.dirname(i),{recursive:!0});let a=Q(n);return await e.screenshot(i,{appBundleId:n?.appBundleId,fullscreen:a.fullscreen,normalizeStatusBar:a.normalizeStatusBar,stabilize:a.stabilize,surface:n?.surface,skipIosSimulatorBootCheck:n?.skipIosSimulatorBootCheck}),{path:i,...Z(`Saved screenshot: ${i}`)}}async function oC(e,t){if(2!==t.length)throw new ti("INVALID_ARGS","viewport requires exactly two arguments: <width> <height>");let r=U(t[0],"width"),n=U(t[1],"height");if(!e.setViewport)throw new ti("UNSUPPORTED_OPERATION","viewport is not supported by this backend");return await e.setViewport(r,n),{width:r,height:n,...Z(`Viewport set: ${r}x${n}`)}}async function oR(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new ti("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new ti("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new ti("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,...Z("Clipboard updated")}}async function oO(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!ej(i))throw new ti("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new ti("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await oT(e,i);if(eB(e))return await oL(e,i,r,n);throw new ti("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function oT(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...Z("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 oL(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new ti("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(t7),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...Z("Keyboard enter pressed")}}let{runAppleRunnerCommand:i}=await Promise.resolve(t7),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...Z(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function oF(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new ti("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new ti("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");e_({level:"debug",phase:"settings_apply",data:{setting:i,state:"clear",appBundleId:r,platform:e.platform}});let s=await t.setSetting(i,"clear",r);return s&&"object"==typeof s?L({setting:i,state:"clear",...s},oB(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...Z(`Cleared user data for ${r}`)}}if(!a)throw new ti("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:j(o,"latitude"),longitude:j(s,"longitude")}:void 0;e_({level:"debug",phase:"settings_apply",data:l?{setting:i,state:a,latitude:o,longitude:s,platform:e.platform}:"permission"===i?{setting:i,state:a,permissionTarget:o,permissionMode:s,platform:e.platform}:{setting:i,state:a,appBundleId:d,platform:e.platform}});let u=await t.setSetting(i,a,d,c);return u&&"object"==typeof u?L({setting:i,state:a,...u},oB(u)??`Updated setting: ${i}`):{setting:i,state:a,...Z(`Updated setting: ${i}`)}}async function o$(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new ti("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await o_(i);if(eB(e)){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...Z(`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,...Z(`Pushed notification to ${n}`)}}async function oU(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 oB(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}function oG(e,t=e=>e){let r=new f;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 oq(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function oV(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 ti("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 ti("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 ti("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 ti("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 ti("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await oj(e,t,r)}}async function oj(e,t,r){let n=["/Applications","/System/Applications",o.join(m.homedir(),"Applications")],i=new Set;for(let t of n){let r=await d.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 oq((await Promise.all(Array.from(i).map(async e=>{let r=await oK(e,t).catch(()=>({})),n=r.bundleId;return n?{bundleId:n,name:r.appName??o.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function oK(e,t){for(let r of[o.join(e,"Contents","Info.plist"),o.join(e,"Info.plist")]){let e=await t(r),n=oH(e,"CFBundleIdentifier"),i=oH(e,"CFBundleDisplayName"),a=oH(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function oH(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let oW={runCommand:eI,simctl:{run:async(e,t)=>await eI("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await eI("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await o2(eI,e)},macosHost:oV(eI,async e=>await o2(eI,e)),whichCommand:eh},oz=oG(oW,function(e){return"function"==typeof e?oX({runCommand:e}):oX(e)});function oX(e={}){let t={...oW,...e},r=e.plist??{readJson:async e=>await o2(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??oV(t.runCommand,async e=>await r.readJson(e))}}function oJ(e){return oz.resolve(e)}async function oZ(e,t){return await oz.run(e,t)}function oY(){return oz.hasScope()}async function oQ(e,t,r){return await oJ().runCommand(e,t,r)}async function o0(e,t){let r=oJ(),[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 o1(e){return await oJ().plist?.readJson(e)??null}async function o2(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 o3="agent-device-macos-helper",o5="AGENT_DEVICE_MACOS_HELPER_BIN",o4=o.join(m.homedir(),".agent-device","macos-helper","current"),o6=o.join(o4,"manifest.json"),o8=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function o9(e){let t=e.trim();if(!o8.test(t))throw new ti("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function o7(e,t){t.bundleId&&e.push("--bundle-id",o9(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function se(){return function(e){let t=o.dirname(e);for(;;){let e=o.join(t,"macos-helper");if(l(o.join(e,"Package.swift")))return e;let r=o.dirname(t);if(r===t)break;t=r}throw new ti("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(u(import.meta.url))}async function st(e){let t=await d.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=o.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await st(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function sr(e){let t=await st(e),r=a("sha256");for(let n of t)r.update(o.relative(e,n)),r.update("\0"),r.update(await d.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 sn(){try{let e=JSON.parse(await d.readFile(o6,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function si(){let e=await ep(process.env[o5],o5);if(e)return e;let t=se(),r=await sr(t),n=o.join(o4,o3);try{if(await sn()===r)return await d.access(n),n}catch{}let i=o.join(se(),".build","release",o3);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 d.mkdir(o4,{recursive:!0});let a=`${n}.tmp`;return await d.copyFile(i,a),await d.rename(a,n),await d.chmod(n,493),await d.writeFile(o6,`${JSON.stringify({fingerprint:r},null,2)}
4
- `,"utf8"),n}async function sa(){let e=process.env[o5]?.trim();if(e){let t=await ep(e,o5);if(t)return t}if(oY())return o3;if("darwin"!==process.platform)throw new ti("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await si()}async function so(e){return ey(await sa(),["audio-probe","--duration-ms",String(e.durationMs),"--bucket-ms",String(e.bucketMs),"--out",e.statusPath],{allowFailure:!0,captureOutput:!0})}async function ss(e){let t={allowFailure:!0,timeoutMs:3e4},r=oJ().macosHelper,n=r?o3:await sa(),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 ti("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 sl(){return await ss(["app","frontmost"])}async function sd(e){return await ss(["app","quit","--bundle-id",o9(e)])}async function sc(e,t){return await ss(["permission",e,t])}async function su(e,t={}){let r=["alert",e];return o7(r,t),await ss(r)}async function sp(e,t={}){let r=["snapshot","--surface",e];return o7(r,t),await ss(r)}async function sf(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return o7(n,r),await ss(n)}async function sm(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return o7(n,r),await ss(n)}async function sh(e,t={}){let r=["screenshot","--out",e];return o7(r,t),t.fullscreen&&r.push("--fullscreen"),await ss(r)}let sw={"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"},sv={runCommand:eI,whichCommand:eh,desktop:sS(eI,eh),clipboard:sI(eI,eh),screenshot:s_(eI,eh)},sy=oG(sv,function(e={}){let t={...sv,...e};return{...t,desktop:e.desktop??sS(t.runCommand,t.whichCommand),clipboard:e.clipboard??sI(t.runCommand,t.whichCommand),screenshot:e.screenshot??s_(t.runCommand,t.whichCommand)}});function sg(e){return sy.resolve(e)}async function sb(e,t){return await sy.run(e,t)}async function sA(e,t,r){return await sg().runCommand(e,t,r)}function sS(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=>{e_({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await tb(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 sI(e,t){return{async readText(){let r=sN[await sk(t,sM)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=sD[await sk(t,sM)](r);await e(n.cmd,n.args,n.options)}}}function s_(e,t){return{async capture(r){let n=sP[await sk(t,sx)](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."},sx={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."},sN={"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}}},sD={"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}})},sP={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 sk(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 ti("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let sE="atspi-dump.py",sC=null;async function sR(e,t={}){let r,n=sg().accessibility;if(n)return await n.captureTree(e,t);if("linux"!==process.platform)throw new ti("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await sg().whichCommand("python3"))throw new ti("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let i=t.maxNodes??1500,a=t.maxDepth??12,l=t.maxApps??24,d=[function(){if(sC)return sC;let e=o.dirname(u(import.meta.url));for(let t=0;t<5;t++){let r=o.join(e,"src","platforms","linux",sE);if(s.existsSync(r))return sC=r,r;if(0===t){let t=o.join(e,sE);if(s.existsSync(t))return sC=t,t}e=o.dirname(e)}throw new ti("TOOL_MISSING",`Cannot find ${sE}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(i),"--max-depth",String(a),"--max-apps",String(l)],c=await sA("python3",d,{allowFailure:!0,timeoutMs:3e4});if(0!==c.exitCode){let e=c.stderr.trim();if(e.includes("No module named")||e.includes("gi.require_version"))throw new ti("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new ti("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${c.exitCode}): ${e||c.stdout}`)}try{r=JSON.parse(c.stdout)}catch{throw new ti("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${c.stdout.slice(0,200)}`)}if(r.error)throw new ti("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=sw[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 sO(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&e_({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await sR(t);return{nodes:r.nodes,truncated:r.truncated}}async function sT(e,t,r){let{nodes:n}=await sO(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:sL(e.rect)-sL(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 sL(e){return(e?.width??0)*(e?.height??0)}let sF=[250,400,600];function s$(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?sq(n?.nodes??[]):void 0,routeComparable:i}}function sU(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 sB(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function sG(e){return"press"===e||"click"===e||"back"===e||"open"===e}function sq(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 sV(e){return D(e)}function sj(e,t){let r=sV(e),n=t?.lease??t?.deviceLease??void 0;return tH({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 sK(e){return"string"==typeof e&&e.trim().length>0?e.trim():void 0}function sH(e,t,r,n,i,a){let o,s;return{requestId:i??eg().requestId,appBundleId:r,runnerLeaseContext:(o=({meta:a}).meta,Object.keys(s=tH({leaseId:sK(o?.leaseId),clientId:sK(o?.clientId),tenantId:sK(o?.tenantId),runId:sK(o?.runId),leaseProvider:sK(o?.leaseProvider),deviceKey:sK(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,...en(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:E(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function sW(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!eL(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=sZ(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:sJ(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function sz(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function sX(e){let{session:t,pending:r,snapshot:n}=e,i=sY(r.preSignature,sZ(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await ox(t.device,r.command,r.positionals,r.flags?.out,{...sH(e.logPath,r.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),e_({level:"info",phase:"interaction_no_change_retry",data:{action:r.action,attemptsRemaining:r.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function sJ(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function sZ(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 sY(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 s0(e,t,r=[],n){var i,a,o;eL(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 s1(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function s2(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!eL(t.device)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=sZ(e.readSnapshot(o).nodes);for(;a<2||Date.now()-i<1500;){await tb(200),a+=1;let l=await r(),d=sZ(e.readSnapshot(l).nodes);if(sQ(s,d))return s1(t),e_({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 s1(t),e_({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}let s3=new WeakMap;function s5(e,t){if(!e[t])return[];let r=s8(e)[t]??t+1;return e.slice(t+1,r)}function s4(e,t,r){let n=s8(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function s6(e,t,r){let n=s8(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function s8(e){let t=s3.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 s3.set(e,r),r}function s9(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 s7(e,t){let r=tY(e.type??""),n=e.label?.trim();return!!(le(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function le(e){return"button"===tY(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function lt(e){let t=tY(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function lr(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function ln(e){let t;for(let i of e){var r,n;let e=tY(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||li(r)>li(n)))&&(t=i.rect)}return t}function li(e){return e?e.width*e.height:0}function la(e){let t=tY(e.type??"");return"scrollview"===t||"scrollarea"===t}function lo(e,t){return!0===e||!!t||void 0}function ls(e,t,r,n){s6(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=tY(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function ll(e,t,r,n){s6(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=tY((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function ld(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===tY(n.type??"")&&t(n,i,r)}}function lc(e,t,r,n){for(let i of e)(s7(i,t)||n&&lp(i,n))&&r.add(i.index)}function lu(e,t,r){if("button"!==tY(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&H(e.rect,t.rect)}function lp(e,t){return"button"===tY(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&H(e.rect,t.rect)}let lf=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=ln(e),n=r?r.y+r.height:null;if(null!==n)for(let r=0;r<e.length;r+=1){var i,a;let o=e[r];o&&(i=o,a=n,i.rect&&"keyboard"===tY(i.type??"")&&i.rect.y>=a)&&(t.add(o.index),function(e,t,r,n){let i=new Map(t.map(e=>[e.index,e])),a="number"==typeof e.parentIndex?i.get(e.parentIndex):void 0;for(;a?.rect&&a.rect.y>=n;)r.add(a.index),a="number"==typeof a.parentIndex?i.get(a.parentIndex):void 0}(o,e,t,n),s6(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==tY(r.type??"")||!0===r.hittable||r.label?.trim()||r.value?.trim())&&r.identifier?.trim()&&t.add(r.index)}(e,o);let s=new Map(e.map(e=>[e.index,e]));for(let r of e)(function(e){let t=e.label?.trim();return!!(t&&W(t))})(r)&&function(e,t,r){var n,i,a,o;lt(e.type)||r.suppressedIndexes.add(e.index);let s=R(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&lt(e.type)?e:null)??s9(e,t,e=>lt(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,lr(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:lo(i.hiddenContentAbove,o.above),hiddenContentBelow:lo(i.hiddenContentBelow,o.below)}))}(r,s,t);(function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r];if(!n||"searchfield"!==tY(n.type??""))continue;if("Search"===n.label){ll(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=s4(e,r,e=>"searchfield"===tY(e.type??"")&&"Search"===e.label);i&&(t.add(n.index),function(e,t,r){let n=new Map(t.map(e=>[e.index,e])),i=e;for(;"number"==typeof i.parentIndex;){let e=n.get(i.parentIndex);if(!e||"Toolbar"!==e.label)return;r.add(e.index),i=e}}(n,e,t),ll(e,r,i.index,t))}})(e,o),r=e,n=o,ld(r,(e,t,i)=>{s4(r,i,r=>{let n;return("button"===(n=tY(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(H(r.rect,e.rect)||function(e,t){var r,n,i,a,o;let s;if(t.label?.trim()!==e.label?.trim())return!1;let l=tY(t.type??"");return r=e,n=l,s=r.label?.trim(),"button"===n&&("Dismiss"===s||"Back"===s)||"textfield"===l||(i=e,a=l,o=t,"button"===a&&!!i.rect&&!!o.rect&&0===i.rect.x&&0===i.rect.y&&i.rect.width>=300&&i.rect.height>=600&&o.rect.width<i.rect.width)}(e,r))})&&n.add(e.index)}),i=e,a=o,ld(i,(e,t,r)=>{let n;er(e)&&P(e,(n=[],s6(i,r,e=>{n.push(e)}),n))&&a.add(e.index)}),function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();!(!n||t.has(n.index))&&i&&function(e,t,r,n,i){let a=tY(r.type??"");if("statictext"===a||"link"===a)return ls(e,t,n,i);if("other"===a){if(function(e,t,r){return!!s4(e,t,e=>{let t=tY(e.type??"");return("link"===t||"searchfield"===t||lt(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);ls(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=ln(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==tY(e.type??"")||!1===e.enabled||!e.rect||!function(e){let t=e?.trim();return!(!t||/^(toolbar|window|application)$/i.test(t)||t.startsWith("!,")||/debugger|fast refresh/i.test(t))}(e.label)||!s9(e,t,la)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=li(e),i=li(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&lr(t.replacements,i,{type:"Cell"})},function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n?.rect&&i&&function(e,t,r,n,i){let a=tY(r.type??"");if("button"===a)return lc(s5(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=s5(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==tY(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r})(e,t,r));if(!i)return!1;let a=e.find(e=>lu(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&lr(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&&(lu(a,t,r)||lp(a,t)||function(e,t){if("switch"!==tY(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||s7(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=>lu(e,t,r));if(!i){e.some(le)&&lc(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&lr(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),lc(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function lm(e){let t=await lh(e);if(t)return t;let r=await lI(e);return sB(e.session),{snapshot:r.snapshot,...r.annotations}}async function lh(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!eL(e.device)||Date.now()-t.markedAt>3e4?void sz(e):t}(e.session);if(t&&e.session)return await lw({...e,session:e.session},t);if(eL(e.device)&&e.session?.postGestureStabilization)return await lA({...e,session:e.session});let r=sU(e.session);if(r&&"android"===e.device.platform)return await lg(e,r)}async function lw(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await lv(e,t,await lS(e)),l=await sX({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await lv(e,t,await lS(e)),l=await sX({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(sz(i),s=await s2({session:i,initial:s,capture:async()=>await lS(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.annotations.freshness?.staleAfterRetries!==!0&&sB(i),"unchanged"===l.change)?e_({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}}):e_({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 lv(e,t,r){let n=r;return"unchanged"!==sY(t.preSignature,sZ(n.snapshot.nodes))?n:(await tb(500),n=await lS(e))}async function ly(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await sO(r?.surface);return lx({nodes:e.nodes,truncated:e.truncated,backend:"linux-atspi"},{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o})}return eC(t)&&r?.surface&&"app"!==r.surface?lx(await sp(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await ox(t,"snapshot",[],i,{...sH(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath),snapshotIncludeRects:e.includeRects})}async function lg(e,t){let r=await lb(e,t);return{snapshot:r.snapshot,...r.annotations}}async function lb(e,t){let r=await lI(e),n=l_(r,t,e),i=0,a=t.markedAt+1500;for(let o of sF){if(!n)break;let s=a-Date.now();if(s<=0)break;await tb(Math.min(o,s)),r=await lI(e),i+=1,n=l_(r,t,e)}n||sB(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,...ei({freshness:o})}}}async function lA(e){let t=await s2({session:e.session,capture:async()=>await lS(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,...t.annotations}}async function lS(e){let t=sU(e.session);return t&&"android"===e.device.platform?await lb(e,t):await lI(e)}async function lI(e){var t;let r=Date.now(),n=await ly(e);return tv(e.session,{durationMs:Date.now()-r,backend:n.backend,platform:eO(e.device)}),{data:n,snapshot:lM(n,void 0===(t=e).snapshotScope?t.flags:{...t.flags,snapshotScope:t.snapshotScope}),annotations:ei(n)}}function l_(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&&sG(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=sq(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=et(s?o:tQ(o)),d=t?.snapshotScope&&e?.backend!=="macos-helper"?lN(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 lf)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=eq(s?c:G(c)),p=ei(e).quality;return{nodes:u,truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,...p?{snapshotQuality:p}:{},presentationKey:eG(eN(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function lx(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=lN(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:lD(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=lD(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function lN(e,t){let r=t0(eq(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 lD(a,i)}function lD(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 lP(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return aP("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=eR(e.trim());if(!n)return aP("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=eD(e.nodes,n);if(r=t?t1(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:aP("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function lk(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function lE(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?e_({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function lC(e){let{session:t,sessionName:r,outPath:n,outputPlacement:i,dispatchContext:a}=e,s=eQ({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:eO(t.device),captureScreenshot:async(e,i,a)=>{let o={...n,...en(a),surface:a?.surface,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck??(eB(t.device)&&"simulator"===t.device.kind)};return"out"===r?tl(await ox(t.device,"screenshot",[],i,o)):tl(await ox(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:i,dispatchContext:a}),artifacts:{resolveInput:async()=>{throw new ti("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await d.mkdtemp(o.join(m.tmpdir(),"agent-device-screenshot-")),r=o.join(t,"screenshot.png")),await d.mkdir(o.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await d.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await d.mkdtemp(o.join(m.tmpdir(),`${e.prefix}-`));return{path:o.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await d.rm(t,{recursive:!0,force:!0})}}}},sessions:lE({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:e0()});return await s.capture.screenshot({session:r,requestId:a.requestId,appBundleId:t.appBundleId,...Q(a),surface:t.surface,...n?{out:{kind:"path",path:n}}:{}})}function*lR(e){let t=/<node\b[^>]*>/g,r=t.exec(e);for(;r;)yield lO(r[0]),r=t.exec(e)}function lO(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=lL(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||lF(n));)t+=1;return t}(e,t,r);let o=e.slice(a,t);if(t=lL(e,t,r),!o||"="!==e[t])return;t=lL(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=l$(t,e);if(null!==r)return"true"===r},n=(e,r)=>{let n=(e=>{let r=l$(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:l$(t,"text"),desc:l$(t,"content-desc"),resourceId:l$(t,"resource-id"),packageName:l$(t,"package"),className:l$(t,"class"),bounds:l$(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=nY(l$(t,"window-bounds")))?{}:{windowRect:a}}),s=nY(o.bounds);return{...o,...s?{rect:s}:{}}}function lT(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=lj(e.type),r=!!(e.label&&e.label.trim().length>0),n=!!(e.identifier&&e.identifier.trim().length>0);return{type:t,hasMeaningfulText:r&&!lK(e.label??""),hasMeaningfulId:n&&!lK(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||O(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=lj(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 lL(e,t,r){for(;t<r&&lF(e[t]??"");)t+=1;return t}function lF(e){return" "===e||"\n"===e||"\r"===e||" "===e}function l$(e,t){return e.get(t)??null}function lU(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=lO(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(lG);if(r.length<2)return;let n=r.filter(e=>lq(e)&&lV(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=>!lq(e)||!!lV(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&&lB(t)&&(function(e){if(!1===e.visibleToUser)return!1;if(e.hittable)return!0;let t=e.label?.trim()??"";if(t&&!lK(t))return!0;let r=e.identifier?.trim()??"";return!(!r||lK(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||!lB(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:k(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||!O(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 lB(e){return!!(e.rect&&e.rect.width>0&&e.rect.height>0)}function lG(e){return void 0!==e.windowIndex||void 0!==e.windowType}function lq(e){return 1===e.windowType}function lV(e){return!0===e.windowActive||!0===e.windowFocused}function lj(e){return e?e.toLowerCase():""}function lK(e){let t=e.trim();return!!t&&/^[\w.]+:id\/[\w.-]+$/i.test(t)}function lH(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function lW(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 lz(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}function lX(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??={},lY(e.slice(24),t.currentStatus);return}if(e.startsWith("INSTRUMENTATION_STATUS_CODE: "))return lJ(t);if(e.startsWith("INSTRUMENTATION_RESULT: ")){t.currentResult??={},lY(e.slice(24),t.currentResult);return}e.startsWith("INSTRUMENTATION_CODE: ")&&lZ(t)}(t,r);return lJ(t=r),lZ(t),{status:r.status,results:r.results}}function lJ(e){e.currentStatus&&(e.status.push(e.currentStatus),e.currentStatus=null)}function lZ(e){e.currentResult&&(e.results.push(e.currentResult),e.currentResult=null)}function lY(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 l0(e){return"true"===e||"false"!==e&&void 0}function l1(e,t,r){if("number"!=typeof e||!Number.isInteger(e))throw new ti("INVALID_ARGS",`Android ${r} manifest ${t} must be an integer.`);return e}function l2(e,t,r,n){if(e!==r)throw new ti("INVALID_ARGS",`Android ${n} manifest ${t} must be "${r}".`);return r}let l3="android-snapshot-helper-v1",l5="uiautomator-xml",l4={"-r":"replace","-t":"allowTestPackages","-d":"allowDowngrade","-g":"grantPermissions"};async function l6(e){let t=await de(e.apkPath);if(t!==e.manifest.sha256)throw new ti("COMMAND_FAILED","Android snapshot helper APK checksum mismatch",{apkPath:e.apkPath,expectedSha256:e.manifest.sha256,actualSha256:t})}function l8(e,t){return l1(e,t,"snapshot helper")}function l9(e,t,r){return l2(e,t,r,"snapshot helper")}function l7(e){let t=function(e,t){if(!Array.isArray(e)||!e.every(e=>"string"==typeof e))throw new ti("INVALID_ARGS",`Android snapshot helper manifest ${t} must be a string array.`);return e}(e,"installArgs");if("install"!==t[0])throw new ti("INVALID_ARGS",'Android snapshot helper manifest installArgs must start with "install".');if(t.some(e=>e.includes("\0")))throw new ti("INVALID_ARGS","Android snapshot helper manifest installArgs must not contain null bytes.");let r=t.slice(1).find(e=>void 0===dn(e));if(r)throw new ti("INVALID_ARGS",`Android snapshot helper manifest installArgs contains unsupported install flag "${r}".`);return t}async function de(e){return await new Promise((t,r)=>{let n=i.createHash("sha256"),a=s.createReadStream(e);a.on("error",r),a.on("data",e=>n.update(e)),a.on("end",()=>t(n.digest("hex")))})}function dt(e,t){if("string"!=typeof e||0===e.trim().length)throw new ti("INVALID_ARGS",`Android snapshot helper manifest ${t} is required.`);return e}function dr(e){return"string"==typeof e&&e.trim().length>0?e:void 0}function dn(e){if(Object.hasOwn(l4,e))return l4[e]}async function di(e){let t=da(e),r=await e.adb(dl(t),{allowFailure:!0,timeoutMs:t.commandTimeoutMs}),{output:n,cleanupDone:i}=await dd(e,t,r);if(t.outputPath&&!i&&await df(e.adb,t.outputPath),0!==r.exitCode)throw new ti("COMMAND_FAILED","Android snapshot helper failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode,helper:n.metadata});return n}function da(e){let t=ds(e.timeoutMs,8e3),r=ds(e.packageName,"com.callstack.agentdevice.snapshothelper");return{waitForIdleTimeoutMs:ds(e.waitForIdleTimeoutMs,500),waitForIdleQuietMs:ds(e.waitForIdleQuietMs,100),timeoutMs:t,commandTimeoutMs:ds(e.commandTimeoutMs,t+5e3),maxDepth:ds(e.maxDepth,128),maxNodes:ds(e.maxNodes,5e3),packageName:r,runner:ds(e.instrumentationRunner,`${r}/.SnapshotInstrumentation`),...e.outputPath?{outputPath:e.outputPath}:{},...void 0!==e.emitChunks?{emitChunks:e.emitChunks}:{}}}function ds(e,t){return void 0===e?t:e}function dl(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 dd(e,t,r){try{var n;let e,t;return{output:(n=`${r.stdout}
5
- ${r.stderr}`,e=lX(n),t=dm(e.results),{xml:function(e,t){if(0===e.length)throw new ti("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 ti("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 ti("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 ti("COMMAND_FAILED","Android snapshot helper returned invalid chunk index",{chunkIndex:n.index,expectedChunks:t});if(r.has(n.index))throw new ti("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 ti("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!==l3||r.outputFormat!==l5)continue;let{payloadBase64:e}=r;void 0!==e&&t.push({index:dw(r.chunkIndex),count:dw(r.chunkCount),payloadBase64:e})}return t}(e.status),t),metadata:{...dh(t),transport:"instrumentation"}}),cleanupDone:!1}}catch(n){return await dc(e,t,r,n)}}async function dc(e,t,r,n){if(n instanceof ti&&0!==r.exitCode&&n.details?.helper)throw n;let i=await du(e,t,r);if(i)return{output:i,cleanupDone:!0};throw new ti("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 du(e,t,r){if(0===r.exitCode&&t.outputPath){var n;return await dp(e.adb,t.outputPath,function(e){try{let t=lX(e);return dh(dm(t.results))}catch{return null}}(`${r.stdout}
6
- ${r.stderr}`)??{outputFormat:l5,waitForIdleTimeoutMs:(n=t).waitForIdleTimeoutMs,waitForIdleQuietMs:n.waitForIdleQuietMs,timeoutMs:n.timeoutMs,maxDepth:n.maxDepth,maxNodes:n.maxNodes,transport:"instrumentation"})}}async function dp(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 df(e,t){try{await e(["shell","rm","-f",t],{allowFailure:!0,timeoutMs:5e3})}catch{}}function dm(e){let t=e.find(e=>e.agentDeviceProtocol===l3);if(!t)throw new ti("COMMAND_FAILED","Android snapshot helper did not return a final result");if("true"!==t.ok){var r;throw new ti("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 dh(e){var t;return{helperApiVersion:e.helperApiVersion,outputFormat:l5,waitForIdleTimeoutMs:dw(e.waitForIdleTimeoutMs),waitForIdleQuietMs:dw(e.waitForIdleQuietMs),timeoutMs:dw(e.timeoutMs),maxDepth:dw(e.maxDepth),maxNodes:dw(e.maxNodes),rootPresent:dv(e.rootPresent),captureMode:"interactive-windows"===(t=e.captureMode)||"active-window"===t?t:void 0,windowCount:dw(e.windowCount),nodeCount:dw(e.nodeCount),truncated:dv(e.truncated),elapsedMs:dw(e.elapsedMs)}}let dw=lQ,dv=l0,dy=new Map,dg=new Map;async function db(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=da(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(dg.get(o)===s)return;let l=dy.get(o);if(l&&l.identity!==s&&(await dA(o),l=void 0),!l)try{l=await d_({deviceKey:o,identity:s,options:e,resolved:a})}catch(e){dg.set(o,s),e_({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 dx(l,a);return l.capturedCount+=1,{xml:t.xml,metadata:{...t.metadata,transport:"persistent-session",sessionReused:e}}}catch(e){throw await dA(o),e}}async function dA(e){let t=dy.get(e);if(t){dy.delete(e);try{await dN(t,`quit ${Date.now()}`,1e3)}catch{}try{await t.process.kill("SIGTERM")}catch{}await dM(t.process,2e3);try{await dD(t)}catch{}e_({phase:"android_snapshot_helper_session_stop",data:{deviceKey:e,port:t.port,capturedCount:t.capturedCount,lifetimeMs:Date.now()-t.startedAtMs}})}}async function dS(e){await dA(dI(e))}function dI(e){return`${e.platform}:${e.id}`}async function d_(e){let t=await new Promise((e,t)=>{let r=g.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=dl({...e.resolved,outputPath:void 0,emitChunks:!1}),n=r[r.length-1];if(!n)throw new ti("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 ti("COMMAND_FAILED","Android snapshot helper session did not become ready",{output:r,timeoutMs:1e4}))},1e4),i=t=>{(r+=t.toString()).includes(`agentDeviceProtocol=${l3}`)&&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 ti("COMMAND_FAILED","Android snapshot helper session exited before ready",{output:r,exitCode:e,signal:i}))}),s.on("error",e=>{clearTimeout(n),t(e)})})),dy.set(e.deviceKey,o),e_({phase:"android_snapshot_helper_session_ready",data:{deviceKey:e.deviceKey,port:t,packageName:e.resolved.packageName,runner:e.resolved.runner}}),o}catch(e){await dD(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 dx(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 ti("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!==l3)throw new ti("COMMAND_FAILED","Android snapshot helper session returned wrong protocol",{headers:e});if(e.outputFormat!==l5)throw new ti("COMMAND_FAILED","Android snapshot helper session returned wrong output format",{headers:e});if(e.requestId!==t)throw new ti("COMMAND_FAILED","Android snapshot helper session returned stale output",{headers:e,requestId:t});if("true"!==e.ok)throw new ti("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 ti("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 ti("COMMAND_FAILED","Android snapshot helper session did not return XML",{headers:e,xml:t})}(n,i),{xml:i,metadata:{helperApiVersion:(r=n).helperApiVersion,outputFormat:l5,waitForIdleTimeoutMs:lQ(r.waitForIdleTimeoutMs),waitForIdleQuietMs:lQ(r.waitForIdleQuietMs),timeoutMs:lQ(r.timeoutMs),maxDepth:lQ(r.maxDepth),maxNodes:lQ(r.maxNodes),rootPresent:l0(r.rootPresent),captureMode:"interactive-windows"===r.captureMode||"active-window"===r.captureMode?r.captureMode:void 0,windowCount:lQ(r.windowCount),nodeCount:lQ(r.nodeCount),truncated:l0(r.truncated),elapsedMs:lQ(r.elapsedMs)}}}(await dN(e,`snapshot ${r}`,n),r)}function dN(e,t,r){return new Promise((n,i)=>{let a=g.connect({host:"127.0.0.1",port:e.port}),o=[],s=setTimeout(()=>{a.destroy(),i(new ti("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 dD(e){await e.process.stdin?.end(),await e.process.stdout?.destroy(),await e.process.stderr?.destroy(),await dP(e)}async function dP(e){await e.adb(["forward","--remove",`tcp:${e.port}`],{allowFailure:!0,timeoutMs:5e3})}let dk=new Map;function dE(e,t,r){return e?`${e}\0${t}\0${r}`:void 0}function dC(e){e&&dk.delete(e)}async function dR(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=dE(e.deviceKey,s,l),c=d?dk.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 dO(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&&dk.set(d,u),{packageName:s,versionCode:l,installedVersionCode:u,installed:!1,reason:p}}await l6(a);let f=await dT(i,e.adbProvider??i,a.apkPath,function(e){let t={};for(let r of e.slice(1)){let e=dn(r);if(!e)throw new ti("INVALID_ARGS",`Android snapshot helper manifest installArgs contains unsupported install flag "${r}".`);t[e]=!0}return t}(l7(a.manifest.installArgs)),{packageName:s,timeoutMs:e.timeoutMs});if(0!==f.exitCode)throw dC(d),new ti("COMMAND_FAILED","Failed to install Android snapshot helper",{packageName:s,versionCode:l,stdout:f.stdout,stderr:f.stderr,exitCode:f.exitCode});return d&&dk.set(d,l),{packageName:s,versionCode:l,installedVersionCode:u,installed:!0,reason:p}}async function dO(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 dT(e,t,r,n,i){var a;let o=async()=>await tR(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 dL=new Set(["android","com.android.systemui"]);function dF(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 d$(e){return null!==e&&""!==e.trim()}let dU=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function dB(e,t={}){let r=tC(e,t.helperAdb).exec;return(await dK(e,t,r)).xml}async function dG(e,t={}){let r=tC(e,t.helperAdb).exec,n=await dK(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=function(e,t,r){let{sourceNodes:n,...i}=lT(lU(e),t,r);return i}(i,void 0,t),s=dq(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 d2(e,o.nodes,i,r),o.nodes),{...o,...dV(s),androidSnapshot:n.metadata}}let o=lU(i),s=lT(o,void 0,t),l=dq(s.truncated,n.metadata);a&&await dj({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:d,...c}=s;return{...c,...dV(l),androidSnapshot:n.metadata}}function dq(e,t){return!0===e||!0===t.helperTruncated||e}function dV(e){return!0===e?{truncated:!0}:{}}async function dj(e){if(d5(e.interactiveSnapshot.nodes).size>0||d3(e.xml))return;let t=lT(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await d2(e.device,t.nodes,e.xml,e.adb);ce(r,t,e.interactiveSnapshot),0===r.size&&ce(C(eq(t.nodes)),t,e.interactiveSnapshot)}async function dK(e,t,r){let n=await eA("android_snapshot_helper_artifact_resolution",async()=>await d0(t.helperArtifact));return n.artifact?await dH(e,t,r,n.artifact):(e_({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await d1(e,n.fallbackReason,r))}async function dH(e,t,r,n){let i=dI(e),a=tC(e,t.helperAdb),o="daemon-session"!==t.helperSessionScope;try{var s,l,d;let o=await dW(t,r,a,n,i);o.installed&&await dA(i);let c=(s=await dz({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 lR(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&&(d$(r.text)||d$(r.desc)||d$(r.resourceId))&&(e.meaningfulNodeCount+=1,1===e.currentWindowType&&(e.applicationMeaningfulNodeCount+=1),n=t.packageName,null===n||dL.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 dF(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)?dF(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?dF(n,t,"content-poor-app-window","Android snapshot helper returned insufficient application window content"):n.windowRootCount>0&&0===n.applicationWindowRootCount?dF(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 dX({contentRecovery:u,helperDeviceKey:i,artifact:n,device:e,adb:r})}catch(t){return await dJ({error:t,helperDeviceKey:i,artifact:n,device:e,adb:r})}finally{o&&await dA(i)}}async function dW(e,t,r,n,i){let a=await eA("android_snapshot_helper_install",async()=>await dR({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 e_({phase:"android_snapshot_helper_install_decision",data:{packageName:a.packageName,versionCode:a.versionCode,installedVersionCode:a.installedVersionCode,installed:a.installed,reason:a.reason}}),a}async function dz(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 eA("android_snapshot_helper_session_capture",async()=>await db(o),{packageName:i.manifest.packageName,version:i.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){e_({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:tn(e).message}}),await dZ(r,i.manifest.packageName)}return await eA("android_snapshot_helper_capture",async()=>await di(o),{packageName:i.manifest.packageName,version:i.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function dX(e){return e_({level:"warn",phase:"android_snapshot_helper_content_fallback",data:{reason:e.contentRecovery.reason,fallbackReason:e.contentRecovery.fallbackReason,...e.contentRecovery.diagnostics}}),await dZ(e.adb,e.artifact.manifest.packageName),await d1(e.device,e.contentRecovery.fallbackReason,e.adb)}async function dJ(e){var t;let r=function(e){var t;let r=tn(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=dY(e);return new ti(tt(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=dY(e.error);return e_({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:n}}),await dA(e.helperDeviceKey),await dZ(e.adb,e.artifact.manifest.packageName),dC(dE((t={deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}).deviceKey,t.packageName,t.versionCode)),await d1(e.device,n,e.adb)}async function dZ(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await tb(150),e_({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){e_({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:tn(e).message}})}}function dY(e){let t=tn(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 d0(e){if(e)return{artifact:e};let t=tA(),r=o.join(tS(),"android-snapshot-helper","dist"),n=o.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await y.access(n)}catch{return{}}try{let e=function(e){var t,r;if(!e||"object"!=typeof e||Array.isArray(e))throw new ti("INVALID_ARGS","Android snapshot helper manifest must be an object.");return{name:l9(e.name,"name","android-snapshot-helper"),version:dt(e.version,"version"),releaseTag:dr(e.releaseTag),assetName:dr(e.assetName),apkUrl:(t=e.apkUrl,r="apkUrl",null===t?null:dt(t,r)),sha256:function(e){let t=dt(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 ti("INVALID_ARGS","Android snapshot helper manifest sha256 must be a 64-character hex string.");return t}(e.sha256),checksumName:dr(e.checksumName),packageName:dt(e.packageName,"packageName"),versionCode:l8(e.versionCode,"versionCode"),instrumentationRunner:dt(e.instrumentationRunner,"instrumentationRunner"),minSdk:l8(e.minSdk,"minSdk"),targetSdk:void 0===e.targetSdk?void 0:l8(e.targetSdk,"targetSdk"),outputFormat:l9(e.outputFormat,"outputFormat",l5),statusProtocol:l9(e.statusProtocol,"statusProtocol",l3),installArgs:l7(e.installArgs)}}(JSON.parse(await y.readFile(n,"utf8"))),t=o.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await y.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:tn(e).message}}}async function d1(e,t,r){let n;try{n=await eA("android_snapshot_stock_capture",async()=>await d4(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new ti(tt((r=tn(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 d2(e,t,r,n){if(!t.some(e=>O(e.type)))return new Map;let i=d5(t);if(i.size>0||d3(r))return i;let a=await d7(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(O(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=>lz(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||!O(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=>lz(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=lH(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(!lW(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(!lW(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?lH(o):a.length>0?lH(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 d3(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function d5(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 d4(e,t=tq(e)){try{return await tx(()=>d6(t),{shouldRetry:d9})}catch(t){var r,n;let e;if((r=t)instanceof ti&&"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 ti("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 d6(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=d8(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 ti("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=d8(c.stdout,c.stderr);if(!u)throw new ti("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:c.stdout,stderr:c.stderr});return u}function d8(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 d9(e){if(!(e instanceof ti)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return dU.some(e=>r.includes(e))}async function d7(e,t=tq(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 ce(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 ct=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,cr=/^close app$/i,cn="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function ci(e){let t,{session:r}=e;if("android"!==r.device.platform||!r.recording)return{status:"absent"};try{t=await cc(r)}catch(e){return e_({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=cp(t);if(!n?.rect)return{status:"absent"};try{let e=await cu(r,n);if(!e.ok)return e_({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 cf(r))return e_({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 tP(r.device,r.appBundleId),!await cm(r,r.appBundleId)))return e_({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 e_({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 e_({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 ca(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await tM(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await co(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 cl({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 cl({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${cd(a)}. Automatic recovery failed.`,hint:cn})}throw cl({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${cd(a)}.`,hint:cn})}async function co(e){try{return await cs(e)}catch(t){return e_({level:"warn",phase:"android_app_anr_recovery_failed",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}async function cs(e){if(!e.appBundleId)return!1;let t=cp(await cc(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await cu(e,t);if(!r.ok)return!1;await tP(e.device,e.appBundleId);let n=await cm(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&e_({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 cl(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new ti("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function cd(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function cc(e){return eq(tQ((await dG(e.device,{interactiveOnly:!1})).nodes))}async function cu(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=eU(t.rect),i=await tI(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 cp(e,t={}){if(!1===t.requireDialogSignal||cv(e))return e.find(e=>cw(e).some(e=>cr.test(e))&&e.rect)}async function cf(e){for(let t=0;t<12;t+=1){if(!cv(await cc(e)))return!0;await tb(500)}return!cv(await cc(e))}async function cm(e,t,r={}){for(let n=0;n<12;n+=1){if(await ch(e,t,r))return!0;await tb(500)}return await ch(e,t,r)}async function ch(e,t,r){return!(r.requireNoBlockingDialog&&await tM(e.device))&&(await t$(e.device)).package===t}function cw(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 cv(e){return e.some(e=>{let t=cw(e).join(" ").trim();return t.length>0&&ct.test(t)})}function cy(e){return!!(e&&e.width>0&&e.height>0)}function cg(e){return e.width*e.height}function cb(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 cA=[255,59,48,255],cS=[255,214,10,255],cI=[0,0,0,255],c_=["scroll","list","recyclerview","edittext","textfield"],cM=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],cx={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 cN(e){let t=await d.readFile(e.screenshotPath),r=await eW(t,"screenshot"),n=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)ck(r)&&cy(r.rect)&&(!t||cg(r.rect)>cg(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&&cy(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 cy(e.rect)&&!("image"===tY((t=e).type??"")&&!cC(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(cR)||cO(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!cy(r.rect)||ck(r))return!1;let n=tY(r.type??"");return!(c_.some(e=>n.includes(e))||t&&cg(r.rect)>.25*cg(t))}(e,t,r)||(cP(r)?n:n&&function(e){let t=tY(e.type??"");return t.includes("statictext")||t.includes("image")||t.includes("text")||t.includes("other")}(r))}(e,i,n))continue;let l=(o=e.nodes,[function(e){return cP(e)&&!ck(e)}(s=n)?s:null,tZ(o,s,e=>(function(e){return cP(e)&&!ck(e)})(e)),s.hittable?s:null,tZ(o,s,e=>!0===e.hittable)].find(cE)??null);if(!l?.rect||!cy(l.rect))continue;let d=function(e,t,r){let n=cT(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=cT(n);if(!i)continue;let a=function(e){let t=0;return tY(e.type??"").includes("text")&&(t+=2),cR(e.label)&&(t+=2),cR(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||cT(t)}(n,l,e.nodes),c=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),cP(t)&&(n+=3),cP(e)&&(n+=2),r&&(n+=2),cO(t.identifier)&&(n+=1),cC(t.value)&&(n+=1),n}(n,l,d),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=cP,i=e=>!!cT(e),(!t.rect||!0!==t.hittable||n(t)||i(t)?null:function(e,t,r){let n=e.rect,i=function(e,t,r){let n=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r.get(n.parentIndex);if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(t,e,i)&&function(e,t){let r=tY(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&cy(t.rect)&&cb(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=cD(e,i,u,t,r);if(!cy(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=V(e.nodes).primaryAction;if(!a?.ref||!a.rect||!cy(a.rect))return;let o=cD(e,t,a.rect,n,i);if(!cy(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)=>cg(e.overlayRect)-cg(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(cb(e.overlayRect,r.overlayRect)||cb(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}cg(r.overlayRect)<cg(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(cq).slice(0,n.maxRefs??24).sort(cG).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:eU(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)c$(e,t.x,t.x+t.width-1,t.y+n,r),c$(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),cU(e,t.x+n,t.y,t.y+t.height-1,r),cU(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(i=r,(a=e).overlayRect,cA),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=cF(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:cF(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)cB(e,t+o,r+a,i)})(e,i,o,n,cS),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=cx[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]&&cB(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,cI)}(i,a.overlayRect,a.ref)}return await d.writeFile(e.screenshotPath,await eH(r)),n}function cD(e,t,r,n,i){if("android"===e.backend||!t)return cL(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 cL({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 cP(e){let t=[e.type,e.role,e.subrole].map(e=>tY(e??"")).join(" ");return cM.some(e=>t.includes(e))}function ck(e){let t=[e.type,e.role,e.subrole].map(e=>tY(e??"")).join(" ");return t.includes("application")||t.includes("window")}function cE(e){return!!(e?.rect&&cy(e.rect)&&!ck(e))}function cC(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function cR(e){var t;let r;return!!cC(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function cO(e){var t;return"string"==typeof e&&!!cR(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function cT(e){let t=[e.label,e.value].find(cR);return t?t.trim():cO(e.identifier)?e.identifier.trim():void 0}function cL(e,t,r){let n=cF(e.x,0,Math.max(0,t-1)),i=cF(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:cF(e.width,1,a),height:cF(e.height,1,o)}}function cF(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function c$(e,t,r,n,i){for(let a=t;a<=r;a+=1)cB(e,a,n,i)}function cU(e,t,r,n,i){for(let a=r;a<=n;a+=1)cB(e,t,a,i)}function cB(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 cG(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 cq(e,t){return t.score!==e.score?t.score-e.score:cG(e,t)}function cV(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 cj=new WeakMap;function cK(e){if(!e)return;let t=cj.get(e);if(t)return t;let r=cH(e.nodes??[]);if(r)return cj.set(e,r),r}let cH=eo,cW={referenceWidth:1e3,referenceHeight:1e3};function cz(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=c2(b.effectiveDurationMs)??c2(b.durationMs),S={recordingStartedAt:g.startedAt,gestureClockOriginAtMs:g.gestureClockOriginAtMs,gestureClockOriginUptimeMs:g.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===g.platform?g.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:c2(b.gestureStartUptimeMs),gestureEndUptimeMs:c2(b.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},I="number"==typeof(s={gestureStartUptimeMs:c2(b.gestureStartUptimeMs),gestureEndUptimeMs:c2(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),_=eB(e.device)&&void 0===c2(b.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=c3(c2(t.count),1)??1,r=!0===t.doubleTap,n=c3(c2(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 cV(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...S,gestureDurationMs:I}):cV(S),M=(l=e.snapshot,w=c2((d=b).referenceWidth),v=c2(d.referenceHeight),void 0!==w&&w>0&&void 0!==v&&v>0?{referenceWidth:w,referenceHeight:v}:cK(l)),x=(c=t,u=r,p=b,f=_,m=I,h=M,y=cX[c],y?.(u,p,f,m,h)??[]);0!==x.length&&(g.gestureEvents.push(...x),e_({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 cX={click:(e,t,r,n,i)=>cJ(e,t,r,i),press:(e,t,r,n,i)=>cJ(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?cJ(e,t,r,i):[],fill:(e,t,r,n,i)=>cZ(e,t,r,i),focus:(e,t,r,n,i)=>cZ(e,t,r,i),longpress:function(e,t,r,n,i){let a=c5(t,e);if(!a)return[];let{x:o,y:s}=a;return[c0(r,o,s,c8(n,[c2(t.durationMs),c2(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=c4(t,e),o=c1(t.contentDirection)??c1(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:c}=a,u=c8(n,[],250),p=c2(t.amount)??c2(e[1]),f=c2(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:cY,fling:cY,swipe:cY,pinch:function(e,t,r,n,i){let a=c5(t,e,1),o=c2(t.scale)??c2(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:c8(n,[],280)}]}};function cJ(e,t,r,n){let i=c5(t,e);if(!i)return[];let{x:a,y:o}=i,s=c3(c2(t.count),1)??1,l=c3(c2(t.intervalMs),0)??0,d=!0===t.doubleTap,c=c3(c2(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(c0(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 cZ(e,t,r,n){let i=c5(t,e);if(!i)return[];let{x:a,y:o}=i;return[cQ(r,a,o,n)]}function cY(e,t,r,n,i){let a=c4(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,c=c8(n,[c2(t.effectiveDurationMs),c2(t.durationMs),c2(e[4])],250),u=c3(c2(t.count),1)??1,p=c3(c2(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 c0(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function c1(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 c2(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 c3(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function c5(e,t,r=0){let n=c2(e.x)??c2(t[r]),i=c2(e.y)??c2(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function c4(e,t){let r=c6(e.x1,e.x,t[0]),n=c6(e.y1,e.y,t[1]),i=c6(e.x2,t[2]),a=c6(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 c6(...e){return e.map(c2).find(e=>void 0!==e)}function c8(e,t,r){return c3(e,1)??t.map(e=>c3(e,1)).find(e=>void 0!==e)??r}let c9={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function c7(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?c9[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:tK}}(f);if(!y.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:y.message}};let{platformCommand:g,dispatchRequest:b,recordedCommand:A}=y,S=await ut(m,g);if(S)return S;let I=await ue(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])?[rp.expandHome(l,i),...n.slice(1)]:n),u=(c=(a=r.flags?.out,o=r.meta?.cwd,a?rp.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 ur({session:m,sessionName:e.sessionName,logPath:h,command:g,request:b,positionals:_,out:M,dispatchContext:P}),E=await ue(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=cK(e.snapshot),a={...n??{}},o=c1(a.direction)??c1(r[0]);if(!o)return n;let s=c2(a.amount)??c2(r[1]),l=c2(a.pixels),d=c4(a,[]),c=c2(a.referenceWidth),u=c2(a.referenceHeight),p=void 0!==c&&c>0&&void 0!==u&&u>0?{referenceWidth:c,referenceHeight:u}:i??cW;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=ed({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);cz(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??{}}),sG(g)&&s$(m,g),s0(m,g,_,f.flags),{ok:!0,data:k??{}}}async function ue(e,t,r="before-command"){if("android"!==e.device.platform||aB(t)?.androidBlockingDialogGuard!==!0||iR(e.device))return{status:"clear"};try{return await ca({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:tn(e)}}}}async function ut(e,t){let r=aE(t,e.device,{hint:!0});return r||("android"!==e.device.platform||iR(e.device)||!e.recording||"record"===t||"failed"!==(await ci({session:e})).status?null:{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}})}async function ur(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await ox(r.device,n,a,o,{...s});let l=await lC({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 un(r,l,e.logPath),l}async function un(e,t,r){let n={snapshotInteractiveOnly:!0},i=lM(await ly({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);lk(e,i);let a=await cN({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let ui=ug(()=>import("./lease.js")),ua=ug(()=>import("./session.js").then(e=>e.session_namespaceObject)),uo=ug(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),us=ug(()=>import("./react-native.js")),ul=ug(()=>import("./record-trace.js")),ud=ug(()=>import("./find.js")),uc=ug(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function uu(e){var t;switch(t=e.req.command,aB(t)?.route??"generic"){case"lease":return await up(e);case"session":return await uf(e);case"snapshot":return await um(e);case"reactNative":return await uh(e);case"recordTrace":return await uw(e);case"find":return await uv(e);case"interaction":return await uy(e);case"generic":return null}}async function up(e){let{handleLeaseCommands:t}=await ui();return ub(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 uf(e){let{handleSessionCommands:t}=await ua();return ub(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 um(e){let{handleSnapshotCommands:t}=await uo();return ub(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function uh(e){let{handleReactNativeCommands:t}=await us();return ub(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function uw(e){let{handleRecordTraceCommands:t}=await ul();return ub(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function uv(e){let{handleFindCommands:t}=await ud();return ub(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function uy(e){let{handleInteractionCommands:t}=await uc();return ub(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function ug(e){let t;return()=>t??=e()}function ub(e,t,r){if(r)return r;throw new ti("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let uA=new f;async function uS(e,t,r){let n=uA.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>uA.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function uI(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function u_(e,t){var r,n,i,a;let o,s,l,d,c,u;return e.recording?(r=e,n=t,o=td(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=td(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&&!eF(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&&(!eB(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();eB(n)&&"simulator"===n.kind&&e===i||r.push({key:"iosSimulatorDeviceSet",value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=tL(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function ux(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 uN="default";function uD(e){return e.session||uN}function uP(e){if(e.meta?.sessionExplicit===!0||(e.session||uN)!==uN||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=o.resolve(e);try{return s.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(s.existsSync(o.join(t,".git")))return t;let e=o.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(t){var r;return{kind:"cwd",id:(r=t,i.createHash("sha256").update(r).digest("hex").slice(0,16))}}}function uk(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function uE(e,t){let r=uP(e);return!!r&&!!t.sessionScope&&!uk(t,r)}function uC(e,t){if("open"!==e.command)return;let r=B(t);if(0!==r.length)throw new ti("INVALID_ARGS","Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.",{missing:r})}function uR(e,t,r){if(t&&r&&t!==r)throw new ti("UNAUTHORIZED",`Lease does not match session owner (${e})`,{reason:"LEASE_SESSION_MISMATCH",field:e})}async function uO(e){let t=e.sessionStore.get(e.sessionName),r=t?.lease;return!!t&&!!r&&!!e.leaseRegistry.consumeExpiredLease(r.leaseId)&&(e_({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=>{e_({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 uT(e){return function(e,t){let r=sV(e),n=r.leaseId??t?.leaseId,i=r.tenantId??t?.tenantId,a=r.runId??t?.runId;if(i&&a&&n)return tH({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 uL(e){let t=e.session.lease;if(!t)return;let r=e.leaseRegistry.releaseLease(x({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}));return e_({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 uF(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,aB(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?!e$(o):"apple"!==o||!e$(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 uU(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 uU(e)}}(r,t)){let r=t[n];aT(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&&aL(p,aR)||(w.platform=g),{...e,flags:w}}if("strip"===h)return function(e,t,r,n){if(n){u$(e,t),e.platform=eO(n.device);return}u$(e,t),r&&void 0===e.platform&&(e.platform=r)}(w,y,g,t),{...e,flags:w};throw new ti("INVALID_ARGS",function(e,t,r){let n=t.map(ux).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${uI(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(ux),hint:function(e,t){if(t)return u_(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${td(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 u$(e,t){for(let r of t)delete e[r.key]}function uU(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function uB(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[uG(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return uF(e)}catch{return e}}(n);if("open"===(r=l).command||aO(r.flags))try{let e=await i9(l.flags??{});s.add(uG(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=uq(e)-uq(t);return 0!==r?r:e.localeCompare(t)})}function uG(e){return`device:${e}`}function uq(e){return+!e.startsWith("session:")}function uV(e,t={}){let r=t_(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function uj(e,t){return eB(e)&&"simulator"===e.kind?uV(t,{simulatorSetPath:e.simulatorSetPath}):["simctl",...t]}function uK(e,t,r){return o0(uj(e,t),r)}let uH="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 uW(e){if(!(e instanceof ti)||"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 uz(e){return!(e instanceof ti)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function uX(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new ti("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:tk({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:tO("IOS_RUNNER_CONNECT_TIMEOUT")})}async function uJ(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=tk({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new ti("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.":`${tO("IOS_RUNNER_CONNECT_TIMEOUT")} ${uH}`)})}function uZ(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${i.randomUUID()}`}}function uY(e){if(rN(e))throw rP()}let uQ=new Map;async function u0(e,t,r,n,i=45e3,a,o){let s=tN.fromTimeoutMs(i),{getEndpoints:l}=u8(e,t),{endpoints:d}=await l(s.remainingMs()),c=null,u=Math.max(1,Math.ceil(i/250));try{return await tF(async({deadline:s})=>{let u=await u1({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 rP();return new ti("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:uz},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||rE(e))throw rP();c||(c=e)}if(o?.aborted)throw rP();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw uX({port:t,endpoints:d,logPath:n,lastError:c});let a=await pn(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw uX({port:t,endpoints:d,logPath:n,lastError:c})}async function u1(e){await u2(e);let t=await u3(e);if(t.response)return t.response;let r=await u5(e);return r||await u4(e,t.usedCachedTunnelIp)}async function u2(e){if(e.attemptDeadline?.isExpired())throw new ti("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 uJ({session:e.session,port:e.port,logPath:e.logPath})}async function u3(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 u9(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 u5(e){return"simulator"===e.device.kind&&e.session?.ready?await u7(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function u4(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 u9(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 u6(e,t,r,n=45e3,i){if(i?.aborted)throw rP();let a=tN.fromTimeoutMs(n),{getEndpoints:o}=u8(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new ti("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let d=a.remainingMs();if(d<=0)throw new ti("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await pt(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function u8(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await pe({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 u9(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 ti("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await pt(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||rE(e))throw rP();s(t,e)}return null}async function u7(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 pn(e,t,r,s,i);return new Response(n.body,{status:n.status})}catch(e){if(i?.aborted||rE(e))throw rP();return o(e),null}}async function pe(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 pr(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 pt(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 pr(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,n=o.join(m.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),i=await o0(["devicectl","device","info","details","--device",e,"--json-output",n,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==i.exitCode||!s.existsSync(n))return null;let a=JSON.parse(s.readFileSync(n,"utf8"));if(a.info?.outcome&&"success"!==a.info.outcome)return null;let o=(a.result?.connectionProperties?.tunnelIPAddress??a.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return o&&o.length>0?o:null}catch{return null}finally{pl(n)}}async function pn(e,t,r,n,i){let a=JSON.stringify(r),o=uj(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 o0(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=tk({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new ti("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:tO(e)})}return{status:200,body:l}}async function pi(){return await new Promise((e,t)=>{let r=g.createServer();r.listen(0,"127.0.0.1",()=>{let n=r.address();if("object"==typeof n&&n?.port){let t=n.port;r.close(()=>e(t))}else r.close(()=>t(new ti("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function pa(e,t,r,n){t&&ps(t,e),r&&ps(r,e),n&&process.stderr.write(e)}let po=new Map;function ps(e,t){let r=(po.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await s.promises.mkdir(o.dirname(e),{recursive:!0}),await s.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{po.get(e)===r&&po.delete(e)});po.set(e,r)}function pl(e){try{s.existsSync(e)&&s.unlinkSync(e)}catch{}}let pd=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function pc(e,t,r){if(!eC(e))return;if(0===t.length)throw new ti("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(!s.existsSync(e))throw new ti("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await pu(e)){await oQ("codesign",["--remove-signature",e],{allowFailure:!0});try{await oQ("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof ti?n:new ti("COMMAND_FAILED",String(n));throw new ti("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 pu(e){return 0===(await oQ("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let pp=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function pf(e){var t;let r=await pm(e);if(!r||0===r.length)return null;let n=o.dirname(e),i=new Set,a=function(e,t){let r=[],n=new Set,i=[];for(let a of e){if(a.startsWith("__TESTHOST__/")){i.push(a.slice(13));continue}if(!a.startsWith("__TESTROOT__/"))continue;let e=a.slice(13);r.push(o.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(o.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(n),hostRelativePaths:i}}(r,n);for(let e of a.testRootPaths){if(!s.existsSync(e))return null;i.add(e)}for(let e of(t=a).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>s.existsSync(o.join(t,e)));return r?o.join(r,e):null})){if(!e)return null;i.add(e)}return Array.from(i)}async function pm(e){let t=await o1(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(!tV(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(tV))}return r}(i),...Object.values(i).filter(e=>tV(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(pp.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=s.readFileSync(e,"utf8"),n=n2(r),t=new Set,n3(n,(e,r)=>{if(pp.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 ph=["CFBundleIcons","CFBundleIcons~ipad"];async function pw(e){let t=e.filter(pA);if(0===t.length)return;let r=e.filter(e=>pI(e)&&!pS(e));for(let e of t){let t=function(e,t){let r=o.dirname(e);return t.find(e=>o.dirname(e)===r&&"AgentDeviceRunner.app"===o.basename(e))??t.find(t=>o.dirname(t)===r&&t!==e)??null}(e,r);t&&await pv(t,e)}}async function pv(e,t){var r;let n,i=function(e,t){let r=!1;for(let i of s.readdirSync(e,{withFileTypes:!0})){var n;if(i.isFile()&&(n=i.name,/^AppIcon.*\.png$/.test(n)||"Assets.car"===n))(function(e,t){if(s.existsSync(t)){let r=s.readFileSync(e),n=s.readFileSync(t);return!r.equals(n)&&(s.copyFileSync(e,t),!0)}return s.copyFileSync(e,t),!0})(o.join(e,i.name),o.join(t,i.name))&&(r=!0)}return r}(e,t),a=await py(e,t);(i||a)&&(await pb(t),r=t,n=new Date,s.utimesSync(r,n,n))}async function py(e,t){var r,n;let i=o.join(e,"Info.plist"),a=o.join(t,"Info.plist"),s=await o1(i),l=await o1(a);if(!s||!l)return!1;let d=(r=s,n=l,ph.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 pg(a,e.key,e.value,e.shouldInsert);return!0}async function pg(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 ti("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function pb(e){let t=await oQ("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new ti("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function pA(e){return pI(e)&&pS(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function pS(e){return o.basename(e).endsWith("-Runner.app")}function pI(e){return o.basename(e).endsWith(".app")}let p_={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(!e$(e.platform))throw new ti("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return eC(e)?"macOS":eT(e.target,e.appleOs)}function px(e){return"simulator"===e?"simulator":"device"}function pN(){return"arm64"===process.arch?"arm64":"x86_64"}let pD="XCTestDevices",pP=".agent-device-backup",pk=".agent-device-xctestdevices-backup-",pE=o.join(m.homedir(),".agent-device","apple-runner"),pC=".agent-device-runner-cache.json",pR={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},pO=["-IDEPackageSupportDisableManifestSandbox=1","-IDEPackageSupportDisablePluginExecutionSandbox=1","ENABLE_USER_SCRIPT_SANDBOXING=NO"],pT=new Map,pL=new Set,pF=new Map,p$=new Set;function pU(e){return e?.trim()??""}function pB(e=process.env){return pU(e.AGENT_DEVICE_IOS_BUNDLE_ID)||pU(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function pG(e=process.env){let t=pU(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${pB(e)}.uitests`}let pq=function(e=process.env){let t=pB(e),r=pG(e);return Array.from(new Set([pU(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function pV(e=m.homedir()){return o.join(e,"Library","Developer","XCTestDevices")}async function pj(e,t={}){if(!eB(e)||"simulator"!==e.kind)return null;let r=t_(e.simulatorSetPath);if(!r)return null;let n=o.resolve(r),i=o.resolve(t.xctestDeviceSetPath??pV()),a=o.resolve(t.backupPath??function(e=pV()){return`${e}${pP}`}(i)),l=o.resolve(t.lockDirPath??function(e=m.homedir()){return o.join(e,".agent-device","xctest-device-set.lock")}()),d=t.ownerStartTime??e4(process.pid),c=await pW({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(pK({xctestDeviceSetPath:i,backupPath:a}),function(e,t){if(o.resolve(e)===o.resolve(t))return!0;try{return s.realpathSync.native(e)===s.realpathSync.native(t)}catch{return!1}}(n,i))return await c(),null;s.mkdirSync(n,{recursive:!0}),s.existsSync(i)&&s.renameSync(i,a),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,n=o.dirname(r),i=o.join(n,`${pD}.agent-device-link-${process.pid}-${Date.now()}`);s.mkdirSync(n,{recursive:!0});try{s.symlinkSync(t,i,"dir"),s.renameSync(i,r)}catch(e){throw s.existsSync(i)&&pH(i),e}}({requestedSetPath:n,xctestDeviceSetPath:i})}catch(e){throw pK({xctestDeviceSetPath:i,backupPath:a}),await c(),new ti("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:n,xctestDeviceSetPath:i,backupPath:a,error:String(e)})}let u=!1;return{release:async()=>{if(!u){u=!0;try{pK({xctestDeviceSetPath:i,backupPath:a})}finally{await c()}}}}}function pK(e){let{xctestDeviceSetPath:t,backupPath:r}=e,n=[r,...function(e){let t=o.dirname(e),r=o.basename(e).replace(pP,""),n=r===pD?pk:`${r}${pk}`;try{return s.readdirSync(t).filter(e=>e.startsWith(n)).sort().map(e=>o.join(t,e))}catch{return[]}}(r)],i=n.find(e=>s.existsSync(e)),a=s.existsSync(t)&&s.lstatSync(t).isSymbolicLink();if(i){if(a&&pH(t),s.existsSync(t))if(!a)return void e_({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:i}});else i!==r?s.rmSync(i,{recursive:!0,force:!0}):s.rmSync(r,{recursive:!0,force:!0});else s.mkdirSync(o.dirname(t),{recursive:!0}),s.renameSync(i,t);for(let e of n)e!==i&&s.existsSync(e)&&s.rmSync(e,{recursive:!0,force:!0});return}a&&(e_({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),pH(t))}function pH(e){!s.existsSync(e)||s.lstatSync(e).isSymbolicLink()&&s.unlinkSync(e)}async function pW(e){return await t3({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 pz(e){var t;return await pW({lockDirPath:(t=e,o.join(o.dirname(t),`${o.basename(t)}.lock`)),owner:{pid:process.pid,startTime:e4(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function pX(e,t){let r=function(e){var t;let r,n,a=e.iosXctestrunFile?.trim();if(!a)return null;let l=o.resolve(a);if(!s.existsSync(l))throw new ti("COMMAND_FAILED","Configured iOS XCTest runner .xctestrun file not found",{configKey:"iosXctestrunFile",xctestrunPath:l});let d=e.iosXctestDerivedDataPath?.trim(),c=d?o.resolve(d):(t=l,(r=i.createHash("sha1")).update(t),n=r.digest("hex").slice(0,12),o.join(m.tmpdir(),"agent-device-ios-xctest-derived",n));return fI("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 n=tS(),a=p5(e,n),l=fh(e,a);return await uS(pT,l,async()=>{let r=await pz(l);try{return await pJ({device:e,options:t,projectRoot:n,expectedCacheMetadata:a,derived:l,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await r()}})}async function pJ(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(tD(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||pL.has(t))&&(fI("clean",r?"forced_rebuild":"forced_clean",{derived:t}),fA(t),p0(t),pL.delete(t));let l=await p3({device:n,derived:s,projectRoot:a,expectedCacheMetadata:o}),d="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&fI("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let c=await pZ({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:d});return c||(l.xctestrunPath&&(fA(s),p0(s)),await pY({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:d,reason:l.reason}))}async function pZ(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 pY(e){let{device:t,options:r,projectRoot:n,expectedCacheMetadata:i,derived:a,cache:l,reason:d}=e,c=o.join(n,"apple-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!s.existsSync(c))throw new ti("COMMAND_FAILED","iOS runner project not found",{projectPath:c});let u=Date.now();rT({type:"command",status:"progress",message:"Building Apple runner..."}),await fm(t,c,a,r);let p=Math.max(0,Date.now()-u),f=fo(a,t);if(!f)throw new ti("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await pf(f);if(!m)throw new ti("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await pc(t,m,f),await pw(m),p6(a,fe(i,f,m)),fI("build","built_new",{derived:a,xctestrunPath:f}),{xctestrunPath:f,derived:a,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 pc(e,n.productPaths,n.xctestrunPath),fI("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,p6(i,fe(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof ti))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&pd.has(t)}(e))throw e;return fI("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function p0(e){try{if(!s.existsSync(e))return;if("derived"!==o.basename(e))return void s.rmSync(e,{recursive:!0,force:!0});for(let r of s.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,p1.has(t)&&s.rmSync(o.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let p1=new Set([pC,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);async function p2(e){try{let t=tS(),r=p5(e,t),n=fh(e,r),i=await p3({device:e,derived:n,projectRoot:t,expectedCacheMetadata:r});return"reuse_ready"===i.reason}catch{return!1}}function p3(e){let{device:t,derived:r,projectRoot:n,expectedCacheMetadata:i}=e;return fS({derived:r,projectRoot:n,expectedCacheMetadata:i,findXctestrun:e=>fo(e,t),xctestrunReferencesProjectRoot:fl,resolveExistingXctestrunProductPaths:pf})}function p5(e,t=tS()){let r,n=pM(e);return{schemaVersion:2,packageVersion:tA(),runnerSourceFingerprint:function(e){let t=o.join(e,"apple-runner","AgentDeviceRunner"),r=function(e){if(!s.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let a of s.readdirSync(e,{withFileTypes:!0})){var n,i;let s=o.join(e,a.name);if(a.isDirectory()){if("xcuserdata"===a.name)continue;r.push(s);continue}a.isFile()&&(n=a.name,i=s,"project.pbxproj"===n?i.includes(`${o.sep}.xcodeproj${o.sep}`):[".jpg",".json",".png",".swift",".m",".h",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(o.extname(n)))&&t.push(s)}}return t.sort((e,t)=>e.localeCompare(t))}(t),n=function(e,t){let r=i.createHash("sha256");for(let n of t){let t=o.relative(e,n),i=s.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),a=fa.get(t);if(a?.fileStatsFingerprint===n)return a.sourceFingerprint;let l=i.createHash("sha256");for(let e of r){let r=o.relative(t,e);l.update(r),l.update("\0"),l.update(s.readFileSync(e)),l.update("\0")}let d=l.digest("hex");return fa.set(t,{fileStatsFingerprint:n,sourceFingerprint:d}),d}(t),...function(e,t){var r;let n=(r=p4("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=p_[e].sdkName[px(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:p4("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:p4("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(n,e.kind),platformName:n,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(r=pM(e))?`platform=macOS,arch=${pN()}`:"simulator"===e.kind?`generic/platform=${r} Simulator`:`generic/platform=${r}`,runnerBundleBuildSettings:fy(process.env),runnerSigningBuildSettings:fv(process.env,"device"===e.kind,e),runnerPerformanceBuildSettings:fg(),runnerSandboxBuildArgs:fb()}}function p4(e,t){let r=JSON.stringify([e,t]),n=pF.get(r);if(void 0!==n)return n;try{let n=eu(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return pF.set(r,i),i}catch{return pF.set(r,"unknown"),"unknown"}}function p6(e,t){s.mkdirSync(e,{recursive:!0}),s.writeFileSync(o.join(e,pC),`${JSON.stringify(t,null,2)}
15
- `)}async function p8(e,t){if("external"===e.cache)return void fI("preserve","external_bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t});pL.add(e.derived);let r=await pz(e.derived);try{fI("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),fA(e.derived),p0(e.derived)}finally{await r()}}function p9(e){let{artifacts:t,packageVersion:r,...n}=e;return n}function p7(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 fe(e,t,r){let n=function(e,t){let r=fr(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=fr(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 ft(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function fr(e){try{let t=s.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function fn(e,t){let r=fr(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function fi(e,t){let r=o.relative(o.resolve(t),o.resolve(e));return""!==r&&!r.startsWith("..")&&!o.isAbsolute(r)}let fa=new Map;function fo(e,t){if(!s.existsSync(e))return null;let r=[],n=[e];for(;n.length>0;){let e=n.pop();for(let t of s.readdirSync(e,{withFileTypes:!0})){let i=o.join(e,t.name);if(t.isDirectory()){n.push(i);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=s.statSync(i);r.push({path:i,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,r)=>{if(t){let n=fs(r.path,t)-fs(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function fs(e,t){let r=0,n=e.toLowerCase();o.basename(n).startsWith("agentdevicerunner.env.")&&(r-=1e3),n.includes(`${o.sep}macos${o.sep}`)&&(r-=5e3);let i=p_[pM(t)].xctestrunHints[px(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 fl(e,t){try{let r=s.readFileSync(e,"utf8"),n=new Set([t]);try{n.add(s.realpathSync(t))}catch{}for(let e of n)if(r.includes(e))return!0;return!1}catch{return!1}}async function fd(e,t,r,n={}){let i=n.iosXctestEnvDir?.trim(),a=i?o.resolve(i):o.dirname(e);s.mkdirSync(a,{recursive:!0});let l=r.replace(/[^a-zA-Z0-9._-]/g,"_"),d=o.join(a,`AgentDeviceRunner.env.${l}.json`),c=o.join(a,`AgentDeviceRunner.env.${l}.xctestrun`),u=await fc(e);return fp(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})}),fp(u,e=>Object.assign(e,pR),{requireTestBundlePath:!0}),await fu(u,d,c),{xctestrunPath:c,jsonPath:d}}async function fc(e){let t=await oQ("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new ti("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 ti("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function fu(e,t,r){s.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 ti("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:r,stderr:n.stderr})}function fp(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=ff(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=ff(r,{requireTestBundlePath:!0});e&&t(e)}}function ff(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function fm(e,t,r,n){let i=fy(process.env),a=fv(process.env,"device"===e.kind,e),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=fg(),l=fb(),d=await pj(e);try{let d;await em("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",fw(e),"1","-destination",(d=pM(e),"macOS"===d?`platform=macOS,arch=${pN()}`:"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=>{p$.add(e),e.on("close",()=>{p$.delete(e)})},onStdoutChunk:e=>{pa(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{pa(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof ti?a:new ti("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)??uH);throw new ti("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await d?.release()}}function fh(e,t){let r,n=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(n)return o.resolve(n);let a=(r=i.createHash("sha256").update(p7(p9(t))).digest("hex"),`cache-${r.slice(0,16)}`),s=function(e){return o.join(pE,"derived",p_[pM(e)].derivedBaseName[px(e.kind)])}(e);return o.join(s,a)}function fw(e){return eC(e)||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function fv(e=process.env,t=!1,r={platform:"apple"}){if(eC(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 fy(e=process.env){let t=pB(e),r=pG(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function fg(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO","ONLY_ACTIVE_ARCH=YES","ENABLE_PREVIEWS=NO","ENABLE_DEBUG_DYLIB=NO"]}function fb(){return[...pO,`OTHER_SWIFT_FLAGS=${tD(process.env.AGENT_DEVICE_XCUITEST_INCLUDE_UNIT_TESTS)?"$(inherited) -disable-sandbox -D AGENT_DEVICE_RUNNER_UNIT_TESTS":"$(inherited) -disable-sandbox"}`]}function fA(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,n;if(r=e,t=o.resolve(tS(),".tmp"),""===(n=o.relative(t,o.resolve(r)))||n.startsWith("..")||o.isAbsolute(n))throw new ti("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 ${o.join(tS(),".tmp")}.`})}}async function fS(e){var t,r;let n,i=(t=e.derived,r=e.expectedCacheMetadata,(n=function(e){try{let t=JSON.parse(s.readFileSync(o.join(e,pC),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?p7(p9(n))!==p7(p9(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:n}:{ok:!1,reason:"cache_metadata_missing"}),a=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(ft))||!fi(n.xctestrunPath,e)||!fn(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!fi(t.path,e)||!fn(t.path,t))return null;i.push(t.path)}return{xctestrunPath:n.xctestrunPath,productPaths:i}}(e.derived,i.metadata):null,l=a?.xctestrunPath??e.findXctestrun(e.derived);if(!l)return{reason:"missing_xctestrun",xctestrunPath:null};let d=a?.xctestrunPath===l,c=d?"manifest":"scan",u=d?a.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 fI(e,t,r){e_({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let f_={readOnly:!1,readinessProbe:!1,readinessPreflightSkipEligibleAfterHealthyMutation:!1},fM={...f_,readOnly:!0},fx={...fM,readinessProbe:!0},fN={...f_,readinessPreflightSkipEligibleAfterHealthyMutation:!0},fD=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 f_;case"readOnly":return fM;case"readOnlyReadinessProbe":return fx;case"preflightSkippableTouchMutation":return fN}}(t)]));function fP(e){return fD[e].readOnly}function fk(e){return fD[e].readinessPreflightSkipEligibleAfterHealthyMutation}let fE=process.pid,fC=e4(process.pid),fR=(t6=fE,t8=fC,(r=i.createHash("sha256")).update(String(t6)),r.update("\0"),r.update(t8??"unknown-start"),`owner-${t6}-${r.digest("hex").slice(0,8)}`);function fO(e){return{schemaVersion:1,deviceId:e.deviceId,ownerToken:fR,ownerPid:fE,ownerStartTime:fC,ownerStateDir:fB(),sessionId:e.sessionId,runnerPid:e.runnerPid??null,port:e.port,xctestrunPath:e.xctestrunPath,jsonPath:e.jsonPath,createdAtMs:Date.now()}}function fT(t){e=t?.trim()||void 0}async function fL(e,t){let r=await t3({lockDirPath:`${fj(e)}.lock`,owner:{pid:fE,startTime:fC,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await r()}}function fF(e){try{let a;var t,r,n=JSON.parse(s.readFileSync(fj(e),"utf8")),i=e;if(!n||"object"!=typeof n||Array.isArray(n)||1!==n.schemaVersion||n.deviceId!==i)return null;let o=(t=n,a={ownerToken:fK(t.ownerToken),ownerPid:fW(t.ownerPid),sessionId:fK(t.sessionId),port:fW(t.port),xctestrunPath:fK(t.xctestrunPath),jsonPath:fK(t.jsonPath),createdAtMs:(r=t.createdAtMs,"number"==typeof r&&Number.isFinite(r)?r:null)},Object.values(a).some(e=>null===e)?null:a);return o?{schemaVersion:1,deviceId:i,...o,ownerStartTime:fH(n.ownerStartTime),ownerStateDir:fH(n.ownerStateDir)??void 0,runnerPid:fW(n.runnerPid)}:null}catch{return null}}function f$(e){var t;return e?e.ownerToken===fR?{type:"owned",lease:e}:e7((t=e).ownerPid)&&(!t.ownerStartTime||e4(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function fU(e,t,r){let n=f$(fF(e));if("empty"===n.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===n.type){var i,a,s,l,d,c,u,p,f;let m,h,w,v;if(i=n.lease,(m=fB())&&i.ownerStateDir&&o.resolve(m)===o.resolve(i.ownerStateDir))return void await fz(n.lease,"same-state-dir",t);if(a=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,a.deviceId))return void await fz(n.lease,"logical-lease-takeover",t);throw new ti("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 fz(n.lease,n.type,t)}function fB(){return e||process.env.AGENT_DEVICE_STATE_DIR?.trim()||void 0}async function fG(e,t){let r=f$(fF(e));"owned"===r.type&&await fz(r.lease,"owned",t)}function fq(e){e&&function(e){let t=fF(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{s.unlinkSync(fj(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function fV(e){let t=fj(e.deviceId);s.mkdirSync(o.dirname(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;s.writeFileSync(r,JSON.stringify(e,null,2),"utf8"),s.renameSync(r,t)}function fj(e){let t;return o.join((t=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim())?o.resolve(t):o.join(m.homedir(),".agent-device","apple-runner","leases"),`${e.replaceAll(/[^A-Za-z0-9._-]/g,"-")||"unknown-device"}.json`)}function fK(e){return"string"==typeof e&&e.length>0?e:null}function fH(e){return"string"==typeof e?e:null}function fW(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function fz(e,t,r){e_({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),fq(e)}function fX(e,t){return`${e}:${t}:${Date.now()}`}function fJ(e){return"number"==typeof e&&Number.isFinite(e)&&e>0?Math.floor(e):void 0}function fZ(e=process.env){return!1!==ew(e.AGENT_DEVICE_IOS_RUNNER_DETACH??"")}async function fY(e,t){let r;if("simulator"!==e.kind||!fZ()||t_(e.simulatorSetPath))return null;let n="stale"===(r=f$(fF(e.id))).type?r.lease:null;if(!n)return null;let i=t=>(e_({level:"debug",phase:"ios_runner_lease_adoption_skipped",data:{deviceId:e.id,runnerPid:n.runnerPid,port:n.port,reason:t}}),null),a=n.runnerPid;if(!a)return i("runner_pid_missing");if(!e7(a))return i("runner_process_dead");let s=function(e){try{return fh(e,p5(e))}catch{return null}}(e);if(!s)return i("expected_derived_unresolved");if(!n.xctestrunPath.startsWith(`${s}${o.sep}`))return i("artifact_fingerprint_mismatch");if(!await fQ(e,n.port))return i("probe_failed");let l=function(e,t,r,n,i){var a;let o,s,l=fX(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(()=>{e7(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:fJ(i.startupTimeoutMs),lease:fO({deviceId:e.id,sessionId:l,runnerPid:r,port:t.port,xctestrunPath:t.xctestrunPath,jsonPath:t.jsonPath})}}(e,n,a,s,t);try{fV(l.lease)}catch{return null}return e_({level:"info",phase:"ios_runner_lease_adopted",data:{deviceId:e.id,sessionId:l.sessionId,runnerPid:a,port:n.port,previousOwnerPid:n.ownerPid}}),l}async function fQ(e,t){try{let r=await u6(e,t,uZ({command:"uptime"}),500),n=JSON.parse(await r.text());return n?.ok===!0}catch{return!1}}let f0={cleanupRunnerProcessTree:mr,cleanupRunnerXcodebuildProcesses:mn,cleanupTempFile:pl};async function f1(e,t={}){var r;!1!==t.graceful?await f4(e):await mr(e.child.pid,"SIGTERM"),await f6(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(f7(r)||e8(r))&&await mr(e.child.pid,"SIGKILL"),await f8(e)}async function f2(e){await fG(e,f0)}async function f3(e){let t=Array.from(p$);await me(e,"SIGINT"),await mt(t,"SIGINT"),await me(e,"SIGTERM"),await mt(t,"SIGTERM"),await me(e,"SIGKILL"),await mt(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await f8(e)}))}async function f5(){let e=Array.from(p$);await Promise.allSettled(e.map(async e=>{try{await mr(e.pid,"SIGTERM"),await mr(e.pid,"SIGKILL")}finally{p$.delete(e)}}))}async function f4(e){try{await u0(e.device,e.port,uZ({command:"shutdown"}),void 0,15e3)}catch{await mr(e.child.pid,"SIGTERM")}}async function f6(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function f8(e){await f9(e.device),pl(e.xctestrunPath),pl(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{fq(e.lease)}}async function f9(e){"simulator"===e.kind&&await Promise.allSettled(pq.map(async t=>{try{await o0(uj(e,["terminate",e.id,t]),{allowFailure:!0,timeoutMs:2e3})}catch(r){e_({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 f7(e){return!!e&&e7(e)}async function me(e,t){await Promise.allSettled(e.map(async e=>{await mr(e.child.pid,t)}))}async function mt(e,t){await Promise.allSettled(e.map(async e=>{await mr(e.pid,t),"SIGKILL"===t&&p$.delete(e)}))}async function mr(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 mn(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${mi(e)}-${mi(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${mi(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await oQ("pkill",[`-${t}`,"-f",r],{allowFailure:!0,timeoutMs:2e3})}catch(r){e_({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:t,error:r instanceof Error?r.message:String(r)}})}}function mi(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function ma(e){let t=await mo(e.logPath);return t?new ti(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 mo(e){if(!e)return;let t=await ms(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 ms(e,t){let r;try{let n=await y.stat(e),i=Math.max(0,n.size-t),a=n.size-i;if(a<=0)return;r=await y.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 ml=new Map,md=new Map,mc=new Map;async function mu(e,t){return mb(e.id),await uS(md,e.id,async()=>{let r=ml.get(e.id);if(r){let t=await mf(e,r);if(t)return t}return await fL(e.id,async()=>await mp(e,t))})}async function mp(e,t){let r,n,i,a={},o=function(e,t){if(!e)return;let r=Object.entries({leaseId:mL(e.leaseId),clientId:mL(e.clientId),tenantId:mL(e.tenantId),runId:mL(e.runId),leaseProvider:mL(e.leaseProvider),deviceKey:mL(e.deviceKey)??t}).filter(([,e])=>void 0!==e);return r.length>0?Object.fromEntries(r):void 0}(t.runnerLeaseContext,e.id);e_({level:"debug",phase:"ios_runner_session_startup",data:{deviceId:e.id,logicalLeaseContext:o}});let s=await mT(a,"adopt_detached_runner",async()=>await fY(e,{startupTimeoutMs:t.startupTimeoutMs}));if(s)return s.startupTimings=a,s.logicalLeaseContext=o,ml.set(e.id,s),s;await mT(a,"cleanup_stale_xcodebuild",async()=>{await fU(e.id,f0,o)}),await mT(a,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(e_({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):mM(t))}),await mT(a,"verify_developer_mode",async()=>{await mx(e)}),t.cleanStaleBundles?await mT(a,"cleanup_stale_bundles",async()=>{await mm(e)}):(a.cleanup_stale_bundles=0,e_({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let l=await mT(a,"ensure_xctestrun",async()=>await pX(e,t));a.build_xctestrun=l.buildMs;let d=await mT(a,"allocate_port",async()=>await pi()),{xctestrunPath:c,jsonPath:u}=await mT(a,"prepare_xctestrun_env",async()=>await fd(l.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(d)},`session-${e.id}-${fR}-${d}`,{iosXctestEnvDir:t.iosXctestEnvDir})),p=await mT(a,"simulator_set_redirect",async()=>await pj(e)),f=["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",fw(e),"1","-destination-timeout",String(20),"-xctestrun",c,"-derivedDataPath",l.derived,"-destination","macOS"===(i=pM(e))?`platform=macOS,arch=${pN()}`:"simulator"===e.kind?`platform=${i} Simulator,id=${e.id}`:`platform=${i},id=${e.id}`];try{l.buildMs>0&&rT({type:"command",status:"progress",message:"Starting XCTest runner..."}),{child:r,wait:n}=await mT(a,"launch_xcodebuild",()=>ey("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=>{pa(e,t.logPath,t.traceLogPath,t.verbose)}),r.stderr?.on("data",e=>{pa(e,t.logPath,t.traceLogPath,t.verbose)});let m=fX(e.id,d),h=fO({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:fJ(t.startupTimeoutMs),startupTimings:a,logicalLeaseContext:o,simulatorSetRedirect:p??void 0,lease:h};try{fV(h)}catch(t){throw await my(e.id,w,{graceful:!1,waitTimeoutMs:1e3}),t}return ml.set(e.id,w),w}async function mf(e,t){if(!f7(t.child.pid))return await mT({},"stop_stale_session",async()=>{await my(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=t.xctestrunArtifact;if(r?.cache==="external")return e_({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=fh(e,p5(e));return r?.derived!==n?(e_({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:r?.derived,expectedDerived:n}}),await mT({},"stop_stale_artifact_session",async()=>{await my(e.id,t)}),null):(e_({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,logicalLeaseContext:t.logicalLeaseContext}}),t)}async function mm(e){if("simulator"===e.kind)for(let t of pq){let r=await mh(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 mh(e,t){try{return await o0(uj(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(r){e_({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 mw(e){let t=ml.get(e);return t?{sessionId:t.sessionId,alive:f7(t.child.pid)}:null}async function mv(e,t){await uS(md,e.deviceId,async()=>{ml.get(e.deviceId)===e&&(e_({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await my(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function my(e,t,r={}){let n=t??ml.get(e);n&&(await f1(n,r),ml.get(e)===n&&ml.delete(e))}function mg(e){mb(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||!ml.has(e))return;let r=setTimeout(()=>{mc.delete(e),e_({level:"info",phase:"ios_runner_idle_stop",data:{deviceId:e,idleMs:t}}),mA(e).catch(t=>{e_({level:"warn",phase:"ios_runner_idle_stop_failed",data:{deviceId:e,error:t instanceof Error?t.message:String(t)}})})},t);r.unref?.(),mc.set(e,r),e_({level:"debug",phase:"ios_runner_idle_stop_scheduled",data:{deviceId:e,idleMs:t}})}function mb(e){let t=mc.get(e);t&&(clearTimeout(t),mc.delete(e))}async function mA(e){mb(e),await uS(md,e,async()=>{await fL(e,async()=>{await my(e),await f2(e)})})}async function mS(){let e=Array.from(ml.values());for(let t of(await f3(e),e))ml.get(t.deviceId)===t&&ml.delete(t.deviceId)}async function mI(){if(!fZ())return 0;let e=0;for(let[r,n]of ml)if("simulator"===n.device.kind&&!n.simulatorSetRedirect&&n.lease&&f7(n.child.pid)){try{var t;fV({...t=n.lease,ownerToken:`detached-${t.ownerToken}`})}catch{continue}ml.delete(r),mb(r),e+=1,e_({level:"info",phase:"ios_runner_session_detached",data:{deviceId:r,sessionId:n.sessionId,runnerPid:n.child.pid,port:n.port}})}return e}async function m_(){await mS();let e=Array.from(ml.keys());await Promise.allSettled(e.map(async e=>{await mA(e)})),await f5()}async function mM(e){await o0(uj(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}async function mx(e){if(!eB(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 ti("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 mN(e){if(!e$(e.platform))throw new ti("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new ti("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function mD(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,e_({level:"info",phase:"ios_runner_session_startup_timings",durationMs:Object.values(o.startupTimings).reduce((e,t)=>e+t,0),data:{command:s,sessionId:o.sessionId,ready:o.ready,logicalLeaseContext:o.logicalLeaseContext,timings:o.startupTimings}}));let f=uZ(r),m=fP(f.command),h=tN.fromTimeoutMs(i),w=function(e,t){let r=fP(t.command);if(!e.ready)return r?{action:"skip",reason:"read_only_startup_command"}:{action:"run",reason:"startup"};if(fD[t.command].readinessProbe)return{action:"skip",reason:"readiness_probe_command"};if(!fk(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 mE({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,signal:a,decision:w}):(l=f,d=t,c=w,e_({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 mk({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,timeoutMs:i,signal:a,readOnlyCommand:m})}catch(e){throw mP(e,t,w)}try{let e=await mC(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 mv(t,r)):fk(f.command)&&(t.lastHealthyMutation={atMs:Date.now(),appBundleId:f.appBundleId}),e}catch(r){let e=function(e){if(e instanceof ti){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 mv(t,e),r;if((u=r)instanceof ti&&u.details?.runner!==void 0)throw r;throw mP(r,t,w)}}function mP(e,t,r){return"skip"!==r.action||"recent_healthy_mutation"!==r.reason?e:(t.lastHealthyMutation=void 0,mR(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:r.reason,runnerReadinessPreflightSkippedAgeMs:r.lastHealthyMutationAgeMs}))}async function mk(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 ti("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 eA("ios_runner_command_send",async()=>l?await u0(t,r.port,n,i,d,r,s):await u6(t,r.port,n,d,s),c)}async function mE(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(mO(r),a.remainingMs());try{let e=await eA("ios_runner_readiness_preflight",async()=>await u0(t,r.port,uZ({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:r.ready,timeoutMs:l});await mC(e,r,i)}catch(e){throw mR(e,{runnerReadinessPreflightFailed:!0})}}async function mC(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new ti("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?tt(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 ma({error:new ti(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&&e_({level:"debug",phase:"ios_runner_gesture_fallback",data:{fallback:e,message:"string"==typeof a.gestureFallbackMessage?a.gestureFallbackMessage:void 0,hint:"string"==typeof a.gestureFallbackHint?a.gestureFallbackHint:void 0}}),t}return{}}function mR(e,t){let r=e instanceof ti?e:new ti("COMMAND_FAILED",e instanceof Error?e.message:String(e),void 0,e);return new ti(r.code,r.message,{...r.details??{},...t},r.cause??e)}function mO(e){return e.startupTimeoutMs??45e3}async function mT(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,e_({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}function mL(e){return"string"==typeof e&&e.trim().length>0?e.trim():void 0}let mF=new f;function m$(e,t={}){return{runCommand:e,...t}}function mU(e,t,r,n={}){if(r)return mG(r);let i=function(e,t={}){let r=mF.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?mG(i.provider):mG(t)}async function mB(e,t,r){if(!e)return await r();let n={provider:mG(e),deviceId:t.deviceId,requestId:t.requestId};return await mF.run(n,r)}function mG(e){return"function"==typeof e?{runCommand:e}:e}async function mq(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await mK(t,r,n,i,a,o);return await mV(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function mV(e,t){var r,n,i,a;if(!e)return await mj(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,mz({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,mz({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await mj(t,e.reason,e.lifecycleState,e.error)}async function mj(e,t,r,n){throw mz({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 mK(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=mW(n);try{y=await mD(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return e_({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 e_({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(fP(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let s=mW(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new ti("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,`${mH(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=mW(f),new ti(tt(g),b,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...S,hint:A??(h=p.command,w=S,`${mH(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(fP(t.command))return r;let s=mW(r);return new ti("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,`${mH(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 ti("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 mH(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 mW(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 mz(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;e_({level:"retained"===i?"warn":"debug",phase:"ios_runner_command_invalidation_decision",data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:void 0!==o,sessionId:r.sessionId,transportError:n.message}})}async function mX(e,t){let r;uY(t.requestId);let n=rD(t.requestId),i=uZ({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await mJ({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new ti("COMMAND_FAILED","iOS runner prepare failed")}async function mJ(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await mu(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles,...m5(n,"runner_session")}),d=Date.now()-s;try{var c,u;let e=await m3(t,l,r,n,i,d,{recoveryReason:o});return{kind:"prepared",result:(c=t,u=e,m6(c,u),u)}}catch(e){return await mZ({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function mZ(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:d}=e,c=d instanceof ti?d:new ti("COMMAND_FAILED",String(d));if(1===l&&(t=c,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&m0(t)))return{kind:"prepared",result:await mY({device:n,session:i,command:a,options:o,signal:s,error:c})};if(!m0(c))throw d;let u=c.message||"runner_health_failed";if(l>=2)throw await mQ(i,"prepare_runner_health_failed"),d;return uY(o.requestId),await mv(i,"prepare_runner_health_retry"),e_({level:"warn",phase:"ios_runner_prepare_health_retry",data:{command:a.command,commandId:a.commandId,sessionId:i.sessionId,attempt:l,maxAttempts:2,reason:u}}),{kind:"retry",recoveryReason:u}}async function mY(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 mv(s,"prepare_cached_runner_health_failed"),await p8(s.xctestrunArtifact,p);let f=Date.now(),m=await mu(o,{...d,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0,...m5(d,"runner_rebuild")}),h=Date.now()-f;try{let e=await m3(o,m,l,d,c,h,{recoveryReason:p});return e_({level:"info",phase:"ios_runner_prepare_bad_cache_recovered",data:{command:l.command,commandId:l.commandId,sessionId:m.sessionId,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,reason:p}}),t=o,r=e,m6(t,r),r}catch(r){let e;await mQ(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof ti?n:new ti("COMMAND_FAILED",String(n)),new ti(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 m6(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 mQ(e,t){try{await mv(e,t)}catch{}}function m0(e){let t;return!rE(e)&&(uW(e)||uz(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function m1(e,t,r){let n;uY(r.requestId);let i=rD(r.requestId);try{let a=(n=await mu(e,r)).ready?45e3:mO(n);return await mD(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof ti?o:new ti("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&uz(a)&&n)return uY(r.requestId),await m2({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&&(uW(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return uY(r.requestId),await m2({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&&uW(a))return await mq({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:mv});throw o}}async function m2(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await mv(e.session,a);let o=await mu(t,{...n,cleanStaleBundles:!0});try{let a=await mD(t,o,r,n.logPath,45e3,i);return e.recoveredDiagnosticPhase&&e_({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 ti?a:new ti("COMMAND_FAILED",String(a));if(uW(e))return await mq({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:mv});throw a}}async function m3(e,t,r,n,i,a,o){var s,l,d,c,u;let p,f,m=Date.now(),h=m4(n.prepareDeadline,n.healthTimeoutMs,"runner_health");return s=await mD(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 m5(e,t){if(!e.prepareDeadline)return{};let r=m4(e.prepareDeadline,e.buildTimeoutMs,t);return{buildTimeoutMs:r,startupTimeoutMs:r}}function m4(e,t,r){if(!e)return t??45e3;let n=Math.floor(e.remainingMs());if(n<=0)throw new ti("COMMAND_FAILED","prepare ios-runner timed out",{phase:r,reason:"prepare_deadline_expired"});return n}function m6(e,t){e_({level:t.failureReason?"warn":"info",phase:"apple_runner_prepare",data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}async function m8(e,t,r={}){mN(e),uY(r.requestId);let n=uZ(t),i=hr(e,r);return fP(n.command)?tx(()=>(uY(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(uY(r.requestId),uW(e))}):i.runCommand(e,n,r)}function m9(e,t={}){if(eB(e))return he({device:e,options:t,failurePhase:"ios_runner_cache_prewarm_failed",task:async t=>{await pX(e,t)}})}function m7(e,t={}){if(!eB(e))return;let r=hr(e,t).prewarm;return r?he({device:e,options:t,failurePhase:"ios_runner_session_prewarm_failed",task:async t=>{await r(e,t)}}):void e_({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}function he(e){let{device:t,options:r,failurePhase:n,task:i}=e,{propagateError:a=!1,...o}=r;return i(o).catch(e=>{if(e_({level:"warn",phase:n,data:{deviceId:t.id,error:e instanceof Error?e.message:String(e)}}),a)throw e})}async function ht(e,t){mN(e),uY(t.requestId);let r=uZ({command:"uptime"}),n=hr(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 hr(e,t){return mU(e,hn,void 0,{requestId:t.requestId})}let hn=m$(m1,{prepare:mX,prewarm:async(e,t)=>{await mX(e,{...t,healthTimeoutMs:45e3})}});async function hi(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function ha(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 ho(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 hs(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new ti("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function hl(e,t){let r=(await tq(tT(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function hd(e,t){var r,n;let i;hs(t);let a=await hl(e,t),o=tq(tT(e)),s=await tU(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 hc(e,t,r,n,i){let a,o,s="recovering",l=!1,d=(async()=>{try{for(;!l;){let d=await hl(e,t);if(!d){s="recovering",await tb(1e3);continue}let c=tC(tT(e)),u=tE(c,{pid:d});a=u;let p=ha(r,{redactionPatterns:n});if(o=ho(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&rv(i,u.pid),s="active",await o,ry(i),a=void 0,o=void 0,l)break;s="recovering",await tb(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),ry(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:d,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await hi(o),a&&!a.killed&&a.kill("SIGKILL"),await hi(d),ry(i)}}}let hu={message:"iOS physical-device app console capture is not supported by the installed devicectl.",hint:"This devicectl does not expose process launch --console. Markers can still be written to app.log, but app output is not being captured. Use an iOS simulator for agent-device app logs or inspect physical-device logs in Console.app/Xcode until this Xcode toolchain exposes scriptable console capture."},hp={message:"Could not verify iOS physical-device app console capture support.",hint:"Retry logs clear --restart. If the probe keeps failing, run logs doctor and inspect the request diagnostics for the devicectl help command."},hf=hv(hu),hm=hv(hp);function hh(e,t){let r=hb(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=hb(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 hw(){if(t)return t;try{var e,r,n;let i,a,o=(i=(e=await o0(["devicectl","device","process","launch","--help"],{allowFailure:!0,timeoutMs:5e3})).stderr.trim()||void 0,0!==e.exitCode?{supported:!1,reason:"probe-failed",stderr:i}:(r=e.stdout,n=e.stderr,a=`${r}
20
- ${n}`,/\bUSAGE:\s+devicectl device process launch\b/i.test(a)&&/--console\b/.test(a)&&/--terminate-existing\b/.test(a))?{supported:!0,stderr:i}:{supported:!1,reason:"unsupported",stderr:i});return o.supported&&(t=o),o}catch(e){return{supported:!1,reason:"probe-failed",stderr:e instanceof Error?e.message:void 0}}}function hv(e){return`${e.message} ${e.hint}`}async function hy(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=uV(["spawn",t,"log","show","--style","compact","--info","--predicate",hh(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 o0(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")}
21
- `,recoveredLineCount:l.length}}async function hg(e,t,r,n,i,a){let o=await hA({deviceId:e,appBundleId:t,simulatorSetPath:i});return h_({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return uV(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",hh(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function hb(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function hA(e){let{deviceId:t,appBundleId:r,simulatorSetPath:n}=e,i=await o0(uV(["get_app_container",t,r,"app"],{simulatorSetPath:n}),{allowFailure:!0,timeoutMs:4e3});if(0!==i.exitCode)return;let a=i.stdout.trim();if(!a)return;let s=o.join(a,"Info.plist"),l=await eI("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function hS(e,t,r,n){return h_({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",hh(e)],stream:t,redactionPatterns:r,pidPath:n})}async function hI(e,t,r,n,i){let a=await hw();if(!a.supported){var o;throw r.end(),"probe-failed"===(o=a).reason?new ti("COMMAND_FAILED",hp.message,{backend:"ios-device",hint:hp.hint,stderr:o.stderr}):new ti("UNSUPPORTED_OPERATION",hu.message,{backend:"ios-device",hint:hu.hint,stderr:o.stderr})}return h_({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","process","launch","--device",e,"--console","--terminate-existing",t],stream:r,redactionPatterns:n,pidPath:i,stopSignals:["SIGKILL"]})}function h_(e){let t="active",r=ey(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=ha(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&rv(e.pidPath,n.pid);let a=ho(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(t=0===r.exitCode?"ended":"failed",ry(e.pidPath),r),r=>{throw t="failed",ry(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{for(let t of e.stopSignals??["SIGINT","SIGKILL"])n.kill(t),await hi(a);ry(e.pidPath)}}}let hM=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),hx=/https?:\/\/[^\s"'<>\])]+/i,hN=[/\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=>hk(e)));for(let e of t.entries){let t=hk(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function hP(e,t){let r=hB(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=hB(t?.maxPayloadChars,2048,64,16384),o=hB(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=hL(s,["method","httpMethod"]),d=hL(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=hM.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=hx.exec(o),h=d??m?.[0];if(!h)return null;let w=c??hC(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:hR(o),packetId:hO(o)??void 0,durationMs:hT(o)??void 0,raw:hU(o,a),line:r};if("android"===n&&function(e,t,r){let n=hE(t,r,5),i=e.packetId??n.map(e=>hO(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?hE(t,r,12).filter(e=>hO(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>hR(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>hC(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>hT(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 h$(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(v.headers=hU(e,a))}if("body"===i||"all"===i){let e=hF(o,s,["requestBody","body","payload","request"]),t=hF(o,s,["responseBody","response"]);e&&(v.requestBody=hU(e,a)),t&&(v.responseBody=hU(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 hk(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function hE(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 hC(e){for(let t of hN){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function hR(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 hO(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function hT(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 hL(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 hF(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return h$(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 h$(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function hU(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function hB(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}async function hG(e,t){let r={},n=t?[]:["No app bundle is tracked in this session. Run open <app> first for app-scoped logs."];if("android"===e.platform&&Object.assign(r,await hq(e,t)),eB(e)&&"simulator"===e.kind&&Object.assign(r,await hV()),eB(e)&&"device"===e.kind){let e=await hj();Object.assign(r,e.checks),n.push(...e.notes)}return eC(e)&&Object.assign(r,await hK()),{checks:r,notes:n}}async function hq(e,t){let r={};return r.adbAvailable=await hH(async()=>0===(await tI(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3})).exitCode),t&&(r.androidPidVisible=await hH(async()=>(await tI(e,["shell","pidof",t],{allowFailure:!0,timeoutMs:1e3})).stdout.trim().length>0)),r}async function hV(){return{simctlAvailable:await hH(async()=>0===(await o0(["simctl","help"],{allowFailure:!0})).exitCode)}}async function hj(){let e={},t=[];if(e.devicectlAvailable=await hH(async()=>0===(await o0(["devicectl","--version"],{allowFailure:!0})).exitCode),!e.devicectlAvailable)return{checks:e,notes:t};let r=await hw();return e.devicectlConsoleCapture=r.supported,r.supported||("probe-failed"===r.reason?t.push(hm):t.push(hf)),{checks:e,notes:t}}async function hK(){return{logAvailable:await hH(async()=>0===(await eI("log",["help"],{allowFailure:!0})).exitCode)}}async function hH(e){try{return await e()}catch{return!1}}ab();let hW={start:async e=>await h3(e)},hz=oG(hW,function(e={}){return{...hW,...e}});async function hX(e,t){return await hz.run(e,t)}function hJ(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 hZ(e){let t=o.dirname(e);s.existsSync(t)||s.mkdirSync(t,{recursive:!0}),function(e,t){if(s.existsSync(e)&&!(s.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}`;s.existsSync(t)&&(s.existsSync(n)&&s.unlinkSync(n),s.renameSync(t,n))}}(e,{maxBytes:hJ("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:hJ("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function hY(e){if(!s.existsSync(e))return{exists:!1,sizeBytes:0};let t=s.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}function hQ(e){return al(e.platform)?.appLog?.resolveBackend(e)??"android"}async function h0(e){var t,r,n,i;let a,o,l,d,{device:c,appBundleId:u,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:v,maxScanLines:y}=e,g=hQ(c),b=(t={backend:g,maxEntries:h,include:w,maxPayloadChars:v,maxScanLines:y},a=hB(t?.maxEntries,25,1,200),o=t?.include??"summary",l=hB(t?.maxPayloadChars,2048,64,16384),d=hB(t?.maxScanLines,4e3,100,2e4),s.existsSync(m)?hP(s.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:o,limits:{maxEntries:a,maxPayloadChars:l,maxScanLines:d}}),A=[],S=await h1({device:c,appBundleId:u,appLogPath:m,appLogState:p});if(S){let e=await hd(c.id,u);if(e){let t=hP(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(eB(c)&&"simulator"===c.kind&&u&&0===b.entries.length){let e=await h5({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&&(eB(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(eB(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.":eB(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 h1(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 a=function(e){let t=function(e){if(!e||!s.existsSync(e))return null;try{return rw(s.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}(o.join(o.dirname(n),rh));if(!a)return null;let l=await hl(t.id,r);return l&&l!==a?{reason:"stale-active",trackedPid:a}:null}async function h2(e,t,r,n){return await hz.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function h3({device:e,appBundleId:t,outPath:r,pidPath:n}){hZ(r);let i=s.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(eB(e))return"device"===e.kind?await hI(e.id,t,i,a,n):await hg(e.id,t,i,a,e.simulatorSetPath,n);if("android"===e.platform)return hs(t),await hc(e.id,t,i,a,n);if(eC(e))return await hS(t,i,a,n);throw i.end(),new ti("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function h5(e){let t=await hy({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:hP(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 h4(e){await e.stop(),await hi(e.wait)}function h6(e,t){hZ(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
22
- `;s.appendFileSync(e,r,"utf8")}function h8(e){let t=o.dirname(e),r=o.basename(e);s.existsSync(t)||s.mkdirSync(t,{recursive:!0}),s.existsSync(e)?s.truncateSync(e,0):s.writeFileSync(e,"","utf8");let n=0;for(let e of s.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let i=e.slice(r.length+1);if(/^\d+$/.test(i))try{s.unlinkSync(o.join(t,e)),n+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:n}}function h9(e,t){for(let r of e){if(t(r))return r;let e=h9(r.children,t);if(e)return e}}function h7(e,t){let r=[];for(let n of e)t(n)&&r.push(n),r.push(...h7(n.children,t));return r}function we(e,t){let r=h9(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 wt(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 wr(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.numberValue??null:wt(e):null}function wn(e){return Math.round(10*e)/10}async function wi(e,t,r={}){let n=["devicectl",...e],i=await o0(n,{allowFailure:!0,timeoutMs:r.timeoutMs??2e4});if(0===i.exitCode)return;let a=String(i.stdout??""),o=String(i.stderr??"");throw new ti("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:n,exitCode:i.exitCode,stdout:a,stderr:o,deviceId:t.deviceId,hint:wd(a,o)??wl})}async function wa(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 ws(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"})),oq(r,t)}async function wo(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 ws(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 ws(e,t){let r=o.join(m.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=[...t.args,"--json-output",r],i=await o0(n,{allowFailure:!0,timeoutMs:2e4});try{if(0!==i.exitCode){let r=String(i.stdout??""),a=String(i.stderr??"");throw new ti("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:n,exitCode:i.exitCode,stdout:r,stderr:a,deviceId:e.id,hint:wd(r,a)??wl})}return JSON.parse(await d.readFile(r,"utf8"))}catch(r){if(r instanceof ti)throw r;throw new ti("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await d.unlink(r).catch(()=>{})}}let wl="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function wd(e,t){let r=`${e}
23
- ${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 wc(e,t){try{let r=await o1(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 d.readFile(e,"utf8"),n=t,n3(n2(r),(e,t)=>{void 0===i&&e===n&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}let wu="xctrace-animation-hitches";function wp(e,t){let r=n2(e),n=we(r,t);return{rows:0===n.length?[]:h7(r,e=>"row"===e.name),schema:n}}function wf(e,t){for(let r of e)wf(r.children,t),r.attributes.id&&t.set(r.attributes.id,{numberValue:wt(r),process:wm(r)})}function wm(e){if(!e||e.children.some(e=>"sentinel"===e.name))return null;let t=wt(h9(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 wh="ps-process-snapshot",ww="ps-process-snapshot",wv="xctrace-activity-monitor",wy="xctrace-activity-monitor",wg="leaks-output-graph",wb="Memory graph captured with leaks --outputGraph for host-visible Apple app processes.";async function wA(e,t){if(eB(e)&&"device"===e.kind)return await wB(e,t);let r=await wU(e,t),n=await wH(e,r);if(0===n.length)throw new ti("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 wY({usagePercent:n.reduce((e,t)=>e+t.cpuPercent,0),residentMemoryKb:n.reduce((e,t)=>e+t.rssKb,0),measuredAt:i,matchedProcesses:[r.executableName],cpuMethod:wh,memoryMethod:ww})}async function wS(e,t,r){let n,i=wP(e);if(!i.memgraph)return{available:!1,kind:"memgraph",reason:i.reason,hint:i.hint,support:i};let a=await wz(e,t,i);if(!1===a.available)return a;let{process:s}=a;await d.mkdir(o.dirname(r),{recursive:!0});let l=await w_(r);try{n=await wI(e,r,s.pid)}catch(n){throw await wM(r,l),function(e,t,r,n,i){if(i instanceof ti){let a=i.details??{};return new ti(i.code,`Failed to capture Apple memgraph for ${t}`,{...a,kind:"memgraph",appBundleId:t,pid:r.pid,processName:o.basename(wZ(r.command)),path:n,hint:wX(e,"string"==typeof a.stdout?a.stdout:"","string"==typeof a.stderr&&a.stderr.length>0?a.stderr:i.message)},i)}return new ti("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:r.pid,processName:o.basename(wZ(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 wM(r,l),new ti("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:s.pid,processName:o.basename(wZ(s.command)),path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:wX(e,n.stdout,n.stderr)});let c=await d.stat(r).catch(()=>null);if(!c?.isFile()||c.size<=0)throw await wM(r,l),new ti("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:wg,appBundleId:t,pid:s.pid,processName:o.basename(wZ(s.command)),support:i}}async function wI(e,t,r){return eC(e)?await oQ("leaks",[`--outputGraph=${t}`,String(r)],{allowFailure:!0,timeoutMs:12e4}):await o0(uj(e,["spawn",e.id,"leaks",`--outputGraph=${t}`,String(r)]),{allowFailure:!0,timeoutMs:12e4})}async function w_(e){return await d.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function wM(e,t){t||await d.rm(e,{force:!0}).catch(()=>{})}async function wx(e,t){var r;let n,i,a,s,l,d;if(!eB(e)||"device"!==e.kind)throw new ti("COMMAND_FAILED","Apple frame-health sampling is currently available only on connected iOS devices.",{metric:"fps",platform:eO(e),deviceKind:e.kind});let c=await wG(e,t),p=await wk(e,t,c);return n=wp((r={hitchesXml:p.hitchesXml,frameLifetimesXml:p.frameLifetimesXml,displayInfoXml:p.displayInfoXml,processIds:c.map(e=>e.pid),processNames:rl(c.map(e=>o.basename(u(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}=wp(e,"device-display-info"),n=r.indexOf("max-refresh-rate");if(n<0)return;let i=new Map;for(let e of t){wf(e.children,i);let t=wr(e.children[n],i);if(null!==t&&t>0)return t}}(r.displayInfoXml),s=(a=(function(e){let t,r,n=n2(e),i=Object.values(r={start:(t=we(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 h7(n,e=>"row"===e.name).map(e=>(function(e,t,r){var n,i,a;let o;if(wf(e.children,r),!0===(n=e.children[t.isSystem],null===(o=wr(n,r))?null:0!==o))return null;let s=wr(e.children[t.start],r),l=wr(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:wm(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:wn(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)}(a,Date.parse(r.windowStartedAt)),{droppedFramePercent:n>0?wn(s/n*100):0,droppedFrameCount:s,totalFrameCount:n,sampleWindowMs:l,windowStartedAt:r.windowStartedAt,windowEndedAt:r.windowEndedAt,measuredAt:r.measuredAt,method:wu,matchedProcesses:[...new Set(a.map(e=>e.processName).filter(e=>"string"==typeof e&&e.length>0))],frameDeadlineMs:void 0===i?void 0:wn(1e3/i),refreshRateHz:i,worstWindows:d.length>0?d:void 0}}function wN(e){return eB(e)&&"device"===e.kind?{method:wu,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:wu,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 wD(e){let t=wN(e);if(eB(e)&&"device"===e.kind)return{fps:t,memory:{method:wy,description:"Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"kB"},cpu:{method:wv,description:"Recent CPU usage snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"percent"}};let r=eC(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:ww,description:`Resident memory snapshot from ${r}`,unit:"kB"},cpu:{method:wh,description:`Recent CPU usage snapshot from ${r}`,unit:"percent"}}}function wP(e){return eB(e)&&"device"===e.kind?{platform:eO(e),deviceKind:e.kind,memgraph:!1,method:wg,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."}:eB(e)&&"simulator"===e.kind?{platform:eO(e),deviceKind:e.kind,memgraph:!0,method:wg,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."}:eC(e)?{platform:eO(e),deviceKind:e.kind,memgraph:!0,method:wg,reason:"macOS app processes are host-visible to leaks --outputGraph.",hint:"Grant Terminal/agent process permissions if macOS denies process inspection."}:{platform:eO(e),deviceKind:e.kind,memgraph:!1,method:wg,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 wk(e,t,r){let n=await d.mkdtemp(o.join(m.tmpdir(),"agent-device-ios-frame-perf-")),i=o.join(n,"animation-hitches.trace"),a=o.join(n,"hitches.xml"),s=o.join(n,"frame-lifetimes.xml"),l=o.join(n,"display-info.xml");try{let n=await wE({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 wL(e,t,i,"hitches",a),await wL(e,t,i,"hitches-frame-lifetimes",s);let o=await wF(e,t,i,"device-display-info",l);return{windowStartedAt:n.startedAt,windowEndedAt:n.endedAt,hitchesXml:await d.readFile(a,"utf8"),frameLifetimesXml:await d.readFile(s,"utf8"),displayInfoXml:o?await d.readFile(l,"utf8"):void 0}}finally{await d.rm(n,{recursive:!0,force:!0}).catch(()=>{})}}async function wE(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 wC(s,e.tracePath);if(0===l.result.exitCode)return e.validateTraceOutput&&await wT(e,l.result.stdout,l.result.stderr),{startedAt:l.startedAt,endedAt:l.endedAt,capturedAtMs:l.capturedAtMs};throw new ti("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:w0(l.result.stdout,l.result.stderr)})}async function wC(e,t){let r;for(let n=1;n<=3;n+=1){await wO(t,n,1500);let i=new Date().toISOString(),a=await o0(e,{allowFailure:!0,timeoutMs:6e4});if(r={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},0===a.exitCode||!wR(a))break}return r}function wR(e){let t=`${e.stdout}
24
- ${e.stderr}`.toLowerCase();return t.includes("_lockkperf")||t.includes("could not lock kperf")||t.includes("likely another session just started")}async function wO(e,t,r){t<=1||(await d.rm(e,{recursive:!0,force:!0}).catch(()=>{}),await new Promise(e=>setTimeout(e,r)))}async function wT(e,t,r){let n=await d.stat(e.tracePath).catch(()=>null);if(!(n?.isDirectory()===!0?(await d.readdir(e.tracePath).catch(()=>[])).length>0:(n?.size??0)>0))throw new ti("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 wL(e,t,r,n,i){let a=["xctrace","export","--input",r,"--xpath",`/trace-toc/run/data/table[@schema="${n}"]`,"--output",i],o=await o0(a,{allowFailure:!0,timeoutMs:15e3});if(0!==o.exitCode)throw new ti("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:w0(o.stdout,o.stderr)})}async function wF(e,t,r,n,i){try{return await wL(e,t,r,n,i),!0}catch{return!1}}async function w$(e){let t=n2(e),r=we(t,"activity-monitor-process-live");if(0===r.length)throw new ti("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 ti("COMMAND_FAILED","xctrace activity-monitor-process-live export is missing expected columns");let s=h7(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=h9(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:wt(e),processName:wQ(e)})}let r=wr(t[n],d),s=(c=t[i],u=d,c?c.attributes.ref?u.get(c.attributes.ref)?.processName??null:wQ(c):null);null!==r&&Number.isFinite(r)&&s&&l.push({pid:r,processName:s,cpuTimeNs:wr(t[a],d),residentMemoryBytes:wr(t[o],d)})}return l}async function wU(e,t){let r=eC(e)?await wj(t):await wK(e,t),n=eC(e)?o.join(r,"Contents","Info.plist"):o.join(r,"Info.plist"),i=await wc(n,"CFBundleExecutable");if(!i)throw new ti("COMMAND_FAILED",`Failed to resolve executable for ${t}`,{appBundleId:t,appPath:r});return{executableName:i,executablePath:eC(e)?o.join(r,"Contents","MacOS",i):o.join(r,i)}}async function wB(e,t){let r=await wG(e,t),n=await wq(e,t),i=await wq(e,t),a=wV(await w$(n.xml),r,t,e),o=wV(await w$(i.xml),r,t,e),s=i.capturedAtMs-n.capturedAtMs;if(s<=0)throw new ti("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 ti("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 wY({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:wv,memoryMethod:wy})}async function wG(e,t){let r=(await wa(e,"all")).find(e=>e.bundleId===t);if(!r)throw new ti("APP_NOT_INSTALLED",`No iOS device app found for ${t}`,{appBundleId:t,deviceId:e.id});if(!r.url)throw new ti("COMMAND_FAILED",`Missing app bundle URL for ${t}`,{appBundleId:t,deviceId:e.id});let n=r.url.replace(/\/$/,""),i=u(n),a=(await wo(e)).filter(e=>e.executable.startsWith(`${n}/`));if(0===a.length)throw new ti("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 wq(e,t){let r=await d.mkdtemp(o.join(m.tmpdir(),"agent-device-ios-perf-")),n=o.join(r,"sample.trace"),i=o.join(r,"activity-monitor-process-live.xml");try{let r=await wE({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 wL(e,t,n,"activity-monitor-process-live",i),{capturedAtMs:r.capturedAtMs,xml:await d.readFile(i,"utf8")}}finally{await d.rm(r,{recursive:!0,force:!0}).catch(()=>{})}}function wV(e,t,r,n){let i=new Set(t.map(e=>e.pid)),a=new Set(t.map(e=>o.basename(u(e.executable)))),s=e.filter(e=>i.has(e.pid)||a.has(e.processName));if(0===s.length)throw new ti("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:w1(t.cpuTimeNs,e.cpuTimeNs),residentMemoryBytes:w1(t.residentMemoryBytes,e.residentMemoryBytes)})}let d=[...l.values()],c=d.map(e=>e.cpuTimeNs).filter(e=>null!==e),p=d.map(e=>e.residentMemoryBytes).filter(e=>null!==e);return{cpuTimeNs:c.length>0?c.reduce((e,t)=>e+t,0):null,residentMemoryBytes:p.length>0?p.reduce((e,t)=>e+t,0):null,matchedProcesses:rl(d.map(e=>e.processName))}}async function wj(e){let t=`kMDItemCFBundleIdentifier == "${e.replaceAll('"','\\"')}"`,r=await oQ("mdfind",[t],{allowFailure:!0,timeoutMs:15e3});if(0!==r.exitCode)throw new ti("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 ti("APP_NOT_INSTALLED",`No macOS app found for ${e}`,{appBundleId:e});return n}async function wK(e,t){let r=uj(e,["get_app_container",e.id,t,"app"]),n=await o0(r,{allowFailure:!0,timeoutMs:15e3});if(0!==n.exitCode)throw new ti("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 ti("APP_NOT_INSTALLED",`No iOS simulator app container found for ${t}`,{appBundleId:t});return i}async function wH(e,t){let r=eC(e)?["-axo","pid=,%cpu=,rss=,command="]:uj(e,["spawn",e.id,"ps","-axo","pid=,%cpu=,rss=,command="]);return(function(e){let t=[];for(let r of tW(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})((eC(e)?await oQ("ps",r,{timeoutMs:15e3}):await wJ(r)).stdout).filter(e=>(function(e,t){let r=wZ(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 o.basename(r)===t.executableName})(e.command,t))}async function wW(e,t,r){let n=(await wH(e,r)).sort((e,t)=>t.rssKb-e.rssKb)[0];if(n)return n;throw new ti("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 wz(e,t,r){try{let r=await wU(e,t);return{available:!0,process:await wW(e,t,r)}}catch(t){if(function(e,t){if(!eB(e)||"simulator"!==e.kind||!(t instanceof ti))return!1;let r=t.details??{},n=Array.isArray(r.args)?r.args.join(" "):"",i="string"==typeof r.stderr?r.stderr:"",a=`${t.message}
25
- ${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 wX(e,t,r){let n=`${t}
26
- ${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")?eC(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 wJ(e){let t=await o0(e,{allowFailure:!0,timeoutMs:15e3});return 0===t.exitCode?t:await oQ("ps",["-axo","pid=,%cpu=,rss=,command="],{timeoutMs:15e3})}function wZ(e){let[t=""]=e.trim().split(/\s+/,1);return t}function wY(e){return{cpu:{usagePercent:wn(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 wQ(e){let t=e?.attributes.fmt?.trim()??"";return t?t.replace(/\s+\(\d+\)$/,"").trim():null}function w0(e,t){let r=wd(e,t);if(r)return r;let n=`${e}
27
- ${t}`.toLowerCase();return n.includes("no device matched")||n.includes("failed to find device")?wl: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 w1(e,t){return null===e?t:null===t?e:Math.max(e,t)}async function w2(e){var t;let r=await w6(e.device,e.appBundleId);await d.mkdir(o.dirname(e.outPath),{recursive:!0});let n=["xctrace","record","--template",(t={device:e.device,template:e.template,targetPids:r.pids,outPath:e.outPath}).template,...eB(t.device)?["--device",t.device.id]:[],...t.targetPids.flatMap(e=>["--attach",String(e)]),"--output",t.outPath,"--quiet","--no-prompt"],i=new Date().toISOString(),a=await w8(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:eO(e.device),targetPids:r.pids,targetProcesses:r.processNames,startedAt:i,child:a.child,wait:a.wait}}async function w3(e,t=e.outPath){t!==e.outPath&&await d.mkdir(o.dirname(t),{recursive:!0});let r=await w7(e,{failOnForcedKill:!0});if(0!==r.exitCode)throw new ti("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:w0(r.stdout,r.stderr)});return t!==e.outPath&&await d.rename(e.outPath,t).catch(async()=>{await d.cp(e.outPath,t,{recursive:!0}),await d.rm(e.outPath,{recursive:!0,force:!0})}),await vt(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 w5(e){return await w7(e,{failOnForcedKill:!1})}async function w4(e){let t=await d.mkdtemp(o.join(m.tmpdir(),"agent-device-xctrace-report-")),r=o.join(t,"trace-toc.xml");try{var n;let t,i,a,s=["xctrace","export","--input",e.tracePath,"--xpath","/trace-toc","--output",r],l=await o0(s,{allowFailure:!0,timeoutMs:15e3});if(0!==l.exitCode)throw new ti("COMMAND_FAILED","Failed to export Apple xctrace report metadata",{cmd:"xcrun",args:s,exitCode:l.exitCode,stdout:l.stdout,stderr:l.stderr,tracePath:e.tracePath,hint:w0(l.stdout,l.stderr)});let c=(n={...e,tocXml:await d.readFile(r,"utf8")},t=n2(n.tocXml),i=h7(t,e=>"run"===e.name),a=rl(h7(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:a}});return await d.mkdir(o.dirname(e.outPath),{recursive:!0}),await d.writeFile(e.outPath,`${JSON.stringify(c,null,2)}
28
- `,"utf8"),c}finally{await d.rm(t,{recursive:!0,force:!0}).catch(()=>{})}}async function w6(e,t){if(!e$(e.platform))throw new ti("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(eB(e)&&"device"===e.kind){let r=await wG(e,t);return{pids:r.map(e=>e.pid),processNames:rl(r.map(e=>o.basename(u(e.executable))))}}let r=await wU(e,t),n=await wH(e,r);if(0===n.length)throw new ti("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 w8(e,t,r){let n;for(let r=1;r<=3;r+=1){await wO(t,r,1500);let i=ey("xcrun",e,{allowFailure:!0}),a=await w9(i.wait);if(!a)return i;if(n=a,!wR(a))break}let i=n??{stdout:"",stderr:"",exitCode:1};throw new ti("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:w0(i.stdout,i.stderr)})}async function w9(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function w7(e,t){e.child.kill("SIGINT");let r=await ve(e.wait,45e3);if(r)return r;e.child.kill("SIGKILL");let n=await ve(e.wait,5e3);if(n&&!t.failOnForcedKill)return n;if(n)throw new ti("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 ti("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 ve(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function vt(e,t){let r=await d.stat(e).catch(()=>null);if(!(r?.isDirectory()===!0?(await d.readdir(e).catch(()=>[])).length>0:(r?.size??0)>0))throw new ti("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 vr(e){let t=e.replaceAll(",","").match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let r=Number(t[0]);return Number.isFinite(r)?r:null}function vn(e){return Math.round(10*e)/10}let vi="adb-shell-dumpsys-gfxinfo-framestats",va="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 vo(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 vs(e){return 0===e.length?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function vl(e,t){if(void 0!==e&&void 0!==t)return Math.max(0,Math.round((t-e)/1e6))}function vd(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:vr(i)??void 0}async function vc(e,t,r={}){var n,i,a,o,s,l,d,c;let u=tq(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 ti("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=vd(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=vr(i)??void 0,s=Number(a);if(void 0===o||!Number.isFinite(s)||r<0)return;let l=vd(t,"Uptime"),d=vd(t,"Stats since");return{droppedFramePercent:wn(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=vo(e,t,"Flags"),n=vo(e,t,"IntendedVsync"),i=vo(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 ti("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 ti("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=vs(t),a=n?.statsSinceNs,o=a??i.firstFrameNs,s=vl(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=vs(e);return vl(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?wn(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:vn(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:vn(l/1e6),refreshRateHz:void 0===l?void 0:vn(1e9/l)}),windowStartedAt:w.windowStartedAt,windowEndedAt:w.windowEndedAt,timestampSource:w.timestampSource,measuredAt:i,method:vi,source:p?"android-gfxinfo-summary":"framestats-rows",worstWindows:b&&b.length>0?b:void 0});return await vu(e,t,r),A}catch(e){throw d=t,(c=e)instanceof ti?new ti(c.code,c.message,{...c.details??{},metric:"fps",package:d},c):new ti("COMMAND_FAILED",`Failed to sample Android fps for ${d}`,{metric:"fps",package:d},c)}}async function vu(e,t,r={}){let n=tq(e,r.adb);try{await n(["shell","dumpsys","gfxinfo",t,"reset"],{allowFailure:!0,timeoutMs:3e3})}catch{}}function vp(e,t,r,n){if(n instanceof ti){var i,a,o,s,l;let d,c=n.details??{};return new ti(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.":vf("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.":vf(i))},n)}return new ti("COMMAND_FAILED",`Failed to ${e} Android ${t} for ${r}`,{action:e,package:r,tool:t,hint:vf(t)},n)}function vf(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 vm(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 vh(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 vh(e,t,r){try{let n=await vc(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 vw="adb-shell-simpleperf",vv="adb-shell-perfetto",vy="/data/local/tmp";async function vg(e,t,r){let n=tq(e,r.adb);await vx(n,t),await vD(n,t),await vN(n,t);let i=await v_(t.outPath);await vS(n,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await vm(e,t,i,o,{adb:n});return{...t,action:"stop",platform:"android",state:"stopped",stoppedAt:a,durationMs:o,sizeBytes:i,method:"simpleperf"===t.kind?vw:vv,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function vb(e,t,r={}){let n=tq(e,r.adb);try{"running"===t.state&&(await vx(n,t),await vD(n,t).catch(()=>{}))}finally{await vS(n,t.remotePath)}}function vA(e,t,r=vy){let n=e.replace(/[^A-Za-z0-9_.-]/g,"_");return`${r}/agent-device-${n}-${Date.now()}-${t}`}async function vS(e,t){try{await e(["shell",`rm -f ${vM(t)}`],{allowFailure:!0,timeoutMs:15e3})}catch{}}async function vI(e,t){await d.mkdir(o.dirname(e),{recursive:!0}),await d.writeFile(e,`${JSON.stringify(t,null,2)}
29
- `)}async function v_(e){try{return(await d.stat(e)).size}catch(t){throw new ti("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 vM(e){return`'${e.replace(/'/g,"'\\''")}'`}async function vx(e,t){try{var r;await e(["shell",(r=t.profilerPid,`pid=${vM(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 vp("stop",t.kind,t.packageName,e)}}async function vN(e,t){await d.mkdir(o.dirname(t.outPath),{recursive:!0});try{await e(["pull",t.remotePath,t.outPath],{timeoutMs:3e4})}catch(e){throw new ti("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 vD(e,t){let r;for(let n=0;n<12;n+=1){let n=await vP(e,t.remotePath);if(void 0!==n&&n>0&&n===r)return;r=n,await b(250)}throw new ti("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 vP(e,t){let r=vM(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 vk(e,t){try{let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=vC(r.stdout);if(0===r.exitCode&&n)return n}catch{}throw new ti("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 vE(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 ti("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 vC(e){return e.trim().split(/\s+/).find(e=>/^\d+$/.test(e))}async function vR(e,t,r,n={}){let i,a=tq(e,n.adb),o=await vk(a,t);await vE(a,"perfetto",t);let s=vA(t,"app.perfetto-trace","/data/misc/perfetto-traces");try{await vu(e,t,{adb:a}),i=await vT(a,s,t)}catch(e){throw await vS(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:vv,message:`Started Android Perfetto trace for ${t}`}}async function vO(e,t,r,n={}){return await vg(e,{...t,outPath:r},n)}async function vT(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=vC(n.stdout);if(i)return i;throw new ti("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 vp("start","perfetto",r,e)}}async function vL(e,t,r,n={}){let i,a=tq(e,n.adb),o=await vk(a,t);await vE(a,"simpleperf",t);let s=vA(t,"cpu.perf.data");try{i=await vU(a,o,s,t)}catch(e){throw await vS(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:vw,message:`Started Android Simpleperf CPU profile for ${t}`}}async function vF(e,t,r,n={}){return await vg(e,{...t,outPath:r},n)}async function v$(e,t,r,n={}){let i=tq(e,n.adb);await vE(i,"simpleperf",t.packageName);let a=await vB(i,t),o=new Date().toISOString(),s=function(e){let t=[];for(let r of tW(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:wn(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 vI(r,l);let d=await v_(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:vw,message:`Wrote Android Simpleperf report for ${t.packageName}`}}async function vU(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(vM).join(" "),d=`${vy}/agent-device-${s}-${Date.now()}.err`,`err=${vM(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=vC(c.stdout);if(u)return u;throw new ti("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 vp("start","simpleperf",n,e)}}async function vB(e,t){try{return await e(["shell","simpleperf","report","-i",t.remotePath,"--stdio","--sort","comm,dso,symbol"],{timeoutMs:3e4})}catch(e){throw vp("report","simpleperf",t.packageName,e)}}let vG="adb-shell-dumpsys-cpuinfo",vq="Aggregated CPU usage for app processes matched from adb shell dumpsys cpuinfo.",vV="adb-shell-dumpsys-meminfo",vj="Memory snapshot from adb shell dumpsys meminfo <package>. Values are reported in kilobytes.",vK="adb-shell-am-dumpheap",vH="Java heap dump captured with adb shell am dumpheap, pulled to a local artifact path.";async function vW(e,t,r={}){let n=tq(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 tW(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:wn(i),measuredAt:r,method:vG,matchedProcesses:[...n]}}(e.stdout,t,new Date().toISOString())}catch(e){throw vQ("cpu",t,e)}}async function vz(e,t,r={}){let n=tq(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 ti("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=v0(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!==vr(e));if(!r)break;return vr(r)??void 0}}(e);if(void 0===i)throw new ti("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:v0(e,"TOTAL RSS"),measuredAt:r,method:vV,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?vr(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 vQ("memory",t,e)}}async function vX(e,t,r,n={}){let i,a=tq(e,n.adb),s=await vY(a,t),l=(i=t.replace(/[^a-zA-Z0-9._-]/g,"_"),`/data/local/tmp/agent-device-${i}-${Date.now()}.hprof`);await d.mkdir(o.dirname(r),{recursive:!0});let c=await vJ(r);try{let e=await a(["shell","am","dumpheap",t,l],{allowFailure:!0,timeoutMs:12e4});if(0!==e.exitCode){var u,p;let r;throw new ti("COMMAND_FAILED",`Failed to capture Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:s,remotePath:l,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,hint:(u=e.stdout,p=e.stderr,(r=`${u}
30
- ${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 a(["pull",l,r],{allowFailure:!0,timeoutMs:12e4});if(0!==n.exitCode)throw await vZ(r,c),new ti("COMMAND_FAILED",`Failed to pull Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:s,remotePath:l,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 d.stat(r).catch(()=>null);if(!i?.isFile()||i.size<=0)throw await vZ(r,c),new ti("COMMAND_FAILED","Android heap dump artifact is missing or empty",{kind:"android-hprof",package:t,pid:s,path:r,remotePath:l,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:vK,packageName:t,pid:s,remotePath:l}}finally{await a(["shell","rm","-f",l],{allowFailure:!0,timeoutMs:15e3}).catch(()=>{})}}async function vJ(e){return await d.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function vZ(e,t){t||await d.rm(e,{force:!0}).catch(()=>{})}async function vY(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 ti("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 vQ(e,t,r){return r instanceof ti?new ti(r.code,r.message,{...r.details??{},metric:e,package:t},r):new ti("COMMAND_FAILED",`Failed to sample Android ${e} for ${t}`,{metric:e,package:t},r)}function v0(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:vr(i)??void 0}let v1=new Map;async function v2(e){let t=await y.mkdtemp(o.join(m.tmpdir(),"agent-device-materialized-"));try{let r=await v4(e.installablePath,o.join(t,"installable")),n=e.archivePath?await v4(e.archivePath,o.join(t,"archive")):void 0,a=i.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{v3(a)},s);return v1.set(a,{rootPath:t,installablePath:r,archivePath:n,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:d}),{materializationId:a,installablePath:r,...n?{archivePath:n}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await y.rm(t,{recursive:!0,force:!0}),e}}async function v3(e,t){let r=v1.get(e);if(!r)throw new ti("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new ti("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),v1.delete(e),await y.rm(r.rootPath,{recursive:!0,force:!0})}async function v5(e){let t=Array.from(v1.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await v3(e)}))}async function v4(e,t){let r=await y.stat(e);await y.mkdir(t,{recursive:!0});let n=o.join(t,o.basename(e));return r.isDirectory()?await y.cp(e,n,{recursive:!0}):await y.copyFile(e,n),n}function v6(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 v8(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=v7(o.rmsDbfs),d=v7(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:ye(o.backend)??t.backend,durationMs:v9(o.durationMs,t.durationMs),elapsedMs:v9(o.elapsedMs,t.elapsedMs),bucketMs:v9(o.bucketMs,t.bucketMs),sampleCount:v9(o.sampleCount,l.length),mediaElementCount:void 0===t.mediaElementCount?"number"==typeof(a=o.mediaElementCount)&&Number.isFinite(a)?a:void 0:v9(o.mediaElementCount,t.mediaElementCount),sourceCount:v9(o.sourceCount,t.sourceCount??0),rmsDbfs:l,peakDbfs:d,startedAt:ye(o.startedAt),stoppedAt:ye(o.stoppedAt),reason:ye(o.reason),notes:c.length>0?c:void 0}}function v9(e,t){return"number"==typeof e&&Number.isFinite(e)?e:t}function v7(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 ye(e){return"string"==typeof e?e:void 0}async function yt(e){let{session:t,probeAction:r,backend:n}=e;if("start"===r){await yr(t,"restarted");let r=o.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 yn(t)}if("stop"===r)return await yr(t,"stopped")??ya(e,"stopped","not-started");let i=await yi(t);return i?("stopped"===i.state&&(t.audioProbe=void 0),i):ya(e,"stopped","not-started")}async function yr(e,t="session-cleanup"){var r,n,i;let a,o=e.audioProbe;if(!o)return;let s=await yi(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??v6({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 yn(e){let t=Date.now()+5e3;for(;Date.now()<t;){let t=await yi(e);if(t)return t;let r=await Promise.race([e.audioProbe?.wait.then(e=>e,e=>e),tb(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 ti("COMMAND_FAILED",`failed to start host audio probe: ${e}`)}}throw new ti("COMMAND_FAILED","failed to start host audio probe")}async function yi(e){let t=e.audioProbe;if(t)try{var r,n;let e=await y.readFile(t.statusPath,"utf8");return r=JSON.parse(e),n=t,v8(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 ya(e,t,r){return v6({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 yo(e){if(await mA(e.device.id),!eC(e.device))return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await su("dismiss",t).catch(t=>{e_({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function ys(e){e.appLog&&await h4(e.appLog)}async function yl(e){e.applePerf?.active&&(await w5(e.applePerf.active),e.applePerf={...e.applePerf??{},active:void 0})}async function yd(e){let t=e.nativePerf?.android;t&&(await vb(e.device,t),e.nativePerf={...e.nativePerf??{},android:void 0})}async function yc(e){"android"===e.device.platform&&await dS(e.device)}async function yu(e,t){await ys(e),await yr(e,"session-teardown"),await yl(e),await yd(e),await yc(e),e$(e.device.platform)&&await yo(e),await v5(t).catch(()=>{})}let yp=new WeakMap;async function yf(e){var t,r,n;let i,a,{sessionStore:o,leaseRegistry:s}=e,l=(i={...(r=function(e){let t=ts(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=to(r);if(r&&!n)throw new ti("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new ti("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??{}},t4(r.command,i)?{...r,flags:i}:r),d=l.command,c=function(e){var t,r;let n=e.session||uN;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=uP(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(l),u=eg(),p=o.resolveSessionDir(c),f=rm(p,l.meta?.requestId??u.requestId),m=rf(p);ef({session:c,logPath:f}),e_({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}}),aU((t=l).command)||uC(t,sV(t));let h=aB(d)?.sessionExecutionLockExempt!==!0?await uB({req:l,sessionName:c,sessionStore:o}):[],w=(n=s,(a=yp.get(n))||(a=new Map,yp.set(n,a)),a),v={req:l,command:d,sessionName:c,requestLogPath:f,runnerLogPath:m,throwIfCanceled:()=>rk(l.meta?.requestId),runAdmitted:async e=>(rk(l.meta?.requestId),await uO({sessionName:c,sessionStore:o,leaseRegistry:s,teardownSession:yu}),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(aU(e.command))return;let a=sV(e);uC(e,a);let o=r?.lease;if(!o&&e.meta?.sessionIsolation!=="tenant"&&(!a.leaseId||!a.tenantId&&!a.runId))return;n=a,(i=o)&&(uR("leaseId",n.leaseId,i.leaseId),uR("tenantId",n.tenantId,i.tenantId),uR("runId",n.runId,i.runId),uR("leaseProvider",n.leaseProvider,i.leaseProvider),uR("clientId",n.clientId,i.clientId),uR("deviceKey",n.deviceKey,i.deviceKey));let s=sj(e,r),l={...s,leaseTtlMs:s.leaseTtlMs??(X(s)?3e5:void 0)};return t.assertLeaseAdmission(_(s)),t.heartbeatLease(_(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=>(rk(l.meta?.requestId),0===h.length)?await v.runAdmitted(e):await ym(w,h,async()=>await v.runAdmitted(e))};return v}async function ym(e,t,r){let[n,...i]=t;return n?await uS(e,n,async()=>await ym(e,i,r)):await r()}function yh(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function yw(e,t){return yh(e)?e[t]:void 0}function yv(e,t){let r=yw(e,t);return"string"==typeof r?r:void 0}function yy(e,t){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:void 0}let yg=[yA,yS,yI,y_,yM,yx,yN,yD,yP,yk,yE,yC,yR,yO,yT,yL,yF];function yb(e){return void 0!==e&&Number.isFinite(e)?String(Math.trunc(e)):"undefined"}function yA(e){return!Number.isFinite(e)||e<=0?-90:Math.max(-90,Math.min(0,Math.round(20*Math.log10(e))))}function yS(e,t){e.notes.includes(t)||e.notes.push(t)}function yI(){return Array.from(document.querySelectorAll("audio,video"))}function y_(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 yM(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 yx(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 yD(e,t){if("function"==typeof t.captureStream)return yN(e,t.captureStream())}function yP(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 yk(e,t){let r=yI();for(let n of(e.mediaElementCount=r.length,r)){if(e.seen.has(n))continue;let r=yN(e,n.srcObject)??yD(e,n)??yx(e,n,t);if(!r){yS(e,"Some media elements do not expose capturable audio to Web Audio.");continue}e.seen.add(n),yP(e,r)}e.sourceCount=e.analysers.length,0===e.sourceCount&&yS(e,"No capturable page media audio sources were found yet.")}function yE(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 yC(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 yR(e,t){if(!e||"running"!==e.state)return;yk(e,t);let r=yE(e),n=yA(r.rms),i=yA(r.peak);e.rmsDbfs.push(n),e.peakDbfs.push(i),e.heard=e.heard||n>-90||i>-90,yC(e),Date.now()-e.startedAt>=e.durationMs&&y_(e,"duration")}function yO(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:yI().length,sourceCount:0,rmsDbfs:[],peakDbfs:[],notes:t}}function yT(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:yI().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]}:yO(t,[r,n])}function yL(e,t,r,n,i,a,o){t&&y_(t,"restarted");let s=yM(n);if(!s)return yO(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{yS(d,"AudioContext could not be resumed by the probe.")}for(let e of(d.resumeOnGesture=()=>{try{s.resume()}catch{yS(d,"AudioContext could not be resumed from a user gesture.")}},["click","pointerdown","keydown"]))window.addEventListener(e,d.resumeOnGesture,{capture:!0,once:!0});return yk(d,i),d.timer=setInterval(()=>yR(d,i),d.bucketMs),d.timeout=setTimeout(()=>y_(d,"duration"),d.durationMs),window[r]=d,yT(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&&(yR(a,r),y_(a,"duration")),"start"===e.action)?yL(e,a,t,"__agentDeviceAudioProbeContext",r,n,i):("stop"===e.action?(a&&yR(a,r),y_(a,"manual")):a&&yR(a,r),yT(a,e,n,i))}function y$(e){return yh(e)}function yU(e){if(!yh(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 yB(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,yq(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)??yV(t,["role","type"]);return{index:0,type:i,role:i,label:(n=e,n.match(/"([^"]+)"/)?.[1]??n.match(/'([^']+)'/)?.[1]??yV(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(yK)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(yK)}(e)??yV(t,["value"]),depth:r,enabled:yj(t,["enabled"]),focused:yj(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=yV(e,["role","type"]);return{index:0,type:t,role:t,label:yV(e,["label","name","text"]),value:yV(e,["value"]),enabled:yj(e,["enabled"]),focused:yj(e,["focused"])}}(e.data),index:n.length}});return n}(yv(e,"snapshot")??"",Array.isArray(r=yw(e,"refs"))?r.flatMap(e=>{let t=yh(e)?e:void 0,r=yq(yV(t,["ref","id"])??String(e));return r?[{ref:r,data:t}]:[]}):yh(r)?Object.entries(r).flatMap(([e,t])=>{let r=yq(e);return r?[{ref:r,data:yh(t)?t:void 0}]:[]}):[]);return t&&await yG(i,t),{nodes:i.map((e,t)=>({...e.node,index:t})),truncated:"boolean"==typeof(n=yw(e,"truncated"))?n:void 0}}async function yG(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 yq(e){let t=e?.trim().replace(/^@/,"");return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function yV(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.length>0)return t}}function yj(e,t){if(e)for(let r of t){let t=e[r];if("boolean"==typeof t)return t}}function yK(e){return"string"==typeof e}let yH="agent-browser",yW="Run `agent-device web setup` to install the managed web backend.";function yz(e={}){let t=e.session?.trim(),r=async r=>await yQ(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 yZ(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 yJ(r,e,t)},async clickRef(e){await r(["click",y2(e)])},async fill(e,t,n){await yJ(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",y2(e),t])},async typeText(e){await r(["keyboard","type",e])},scroll:async(e,t)=>(await yX(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=yh(r=e)&&Array.isArray(r.requests)?r.requests:r)?i.filter(y$).map(e=>({headers:yU(e.headers),method:yv(e,"method"),mimeType:yv(e,"mimeType"),requestId:yv(e,"requestId"),resourceType:yv(e,"resourceType"),responseHeaders:yU(e.responseHeaders),status:yy(e,"status"),timestamp:function(e){if("number"==typeof e||"string"==typeof e)return e}(e.timestamp),url:yv(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=tH({requestId:t.requestId,resourceType:t.resourceType,mimeType:t.mimeType}),tH({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=v8(yh(t=await r(["eval",(n=yg.map(e=>`${e.toString()};`).join(""),i=function(e){switch(e){case"start":return"'start'";case"stop":return"'stop'";default:return"'status'"}}(e.action),a=yb(e.durationMs),o=yb(e.bucketMs),`(()=>{${n}return ${yF.name}({action:${i},durationMs:${a},bucketMs:${o}})})()`)]))?yh(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 yX(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 tb(i.delayAfterMs)}}async function yJ(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 yZ(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 yB(n,t?.includeRects?async t=>await yY(e,t):void 0)}async function yY(e,t){try{return function(e){let t=yh(e)&&yh(e.box)?e.box:e;if(yh(t)){var r,n;let e,i,a,o,s,l,d;return r=t,e=yy(r,"x"),i=yy(r,"y"),a=yy(r,"width"),y3(e,i,a,yy(r,"height"))??(n=t,o=yy(n,"left"),s=yy(n,"top"),l=yy(n,"right"),d=yy(n,"bottom"),y3(o,s,y5(l,o),y5(d,s)))}}(await e(["get","box",y2(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 yQ(e,t){let{session:r,options:n}=t,i=[...e,"--json",...r?["--session",r]:[]],a=await y0(i,n);var o,s=function(e,t,r,n){try{return JSON.parse(e)}catch(a){let i=0!==n;throw new ti("COMMAND_FAILED",i?"agent-browser command failed":"agent-browser returned invalid JSON",{cmd:yH,args:r,...i?{exitCode:n}:{},stdout:e.slice(0,500),stderr:t.slice(0,500),hint:yW},a instanceof Error?a:void 0)}}(a.stdout,a.stderr,i,a.exitCode),l=a,d=i;if(!yh(s))return s;if(!1===(s.success??s.ok)){throw new ti("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(yh(t)){let e=yv(t,"message")??yv(t,"error");if(e)return e}return yv(e,"message")??"agent-browser command failed"}(s),{cmd:yH,args:d,hint:yv(s,"hint")??yW,agentBrowserError:s.error})}if(0!==l.exitCode)throw new ti("COMMAND_FAILED","agent-browser command failed",{cmd:yH,args:d,exitCode:l.exitCode,stdout:l.stdout.slice(0,500),stderr:l.stderr.slice(0,500),hint:yv(s,"hint")??yW});return Object.hasOwn(s,"data")?s.data:s}async function y0(e,t){let r="",n="",i=0;try{let a=await t5({stateDir:t.stateDir}),o=await eI(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=t2(a)).code?new ti("TOOL_MISSING",t.message,{...t.details??{},cmd:yH,args:o,hint:y1(t)},t):"COMMAND_FAILED"===t.code?new ti("COMMAND_FAILED",t.message,{...t.details??{},cmd:yH,args:o,hint:y1(t)},t):t}return{stdout:r,stderr:n,exitCode:i}}function y1(e){return"string"==typeof e.details?.hint?e.details.hint:yW}function y2(e){return e.startsWith("@")?e:`@${e}`}function y3(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 y5(e,t){return void 0===e||void 0===t?void 0:e-t}function y4(){return{ok:!1,error:tn(new ti("UNAUTHORIZED","Invalid token"))}}async function y6(e){let{lockedScope:t,logPath:r,sessionStore:n}=e,i=n.get(t.sessionName);if(!i)return t.finalize(ak());let a=await c7({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function y8(e){e_({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=eg(),r=eb({force:!0})??void 0;return{ok:!1,error:tn(e,{diagnosticId:t.diagnosticId,logPath:r})}}let y9=["ios_runner_command_send","ios_runner_readiness_preflight"];async function y7(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 ge(e){s.existsSync(e)&&s.unlinkSync(e)}function gt(e){if(!s.existsSync(e))return null;try{let t=JSON.parse(s.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function gr(e){let t=gt(e);if(!t||t.pid===process.pid)try{s.existsSync(e)&&s.unlinkSync(e)}catch{}}function gn(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function gi(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 ti("COMMAND_FAILED",t))})})}(async function(e={}){let t,r,n=e.env??process.env,a=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}=tm(n.AGENT_DEVICE_STATE_DIR),h=th(n.AGENT_DEVICE_DAEMON_SERVER_MODE),w=tD(n.AGENT_DEVICE_RETAIN_ARTIFACTS);fT(c),function(e){if(s.existsSync(e))for(let t of s.readdirSync(e,{withFileTypes:!0})){if(!t.isDirectory())continue;let r=o.join(e,t.name,rh);if(s.existsSync(r))try{let e=rw(s.readFileSync(r,"utf8"));if(e&&function(e){let t,r=e4(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=e6(e.pid);return!!n&&!!((t=n.toLowerCase().replaceAll("\\","/")).includes("log stream")||t.includes("logcat")||t.includes("devicectl device process launch"))&&(!e.command||n===e.command)}(e))try{process.kill(e.pid,"SIGTERM")}catch{}}catch{}finally{ry(r)}}}(m);let v=new rp(m),y=new iZ({maxActiveSimulatorLeases:gn(n.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:gn(n.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:gn(n.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:gn(n.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),b=tA(),A=i.randomBytes(24).toString("hex"),S=e4(process.pid)??void 0,I=ty(),_=function(e=process.env){return ib.map(t=>t.createRuntime(e))}(n),M={leaseLifecycleProvider:function(e){if(0!==e.length)return{allocate:async(t,r)=>await iB(e,"allocate",t,r),heartbeat:async(t,r)=>await iB(e,"heartbeat",t,r),release:async(t,r)=>await iB(e,"release",t,r)}}(_),cloudArtifactProvider:function(e){if(0!==e.length)return{listCloudArtifacts:async t=>await iU(e,t)}}(_),deviceInventoryProvider:function(e){if(0!==e.length)return async t=>{for(let r of e){if(!iG(r,t.leaseProvider))continue;let e=await r.deviceInventoryProvider(t);if(e)return e}return null}}(_),providerDeviceRuntimeScope:async e=>await iC(_,e)},x=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}}}}(M.cloudArtifactProvider,function(e=process.env){return{listCloudArtifacts:async t=>await iP(t,e)}}(n)),N=function(e){let{logPath:t,stateDir:r,token:n,androidAdbProvider:i,appleRunnerProvider:a,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 ev({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=aN[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:eS(y9)},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=aI[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=te(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(!eY(e.token,n))return y4();try{return await ar(p,async()=>{let t=await yf({req:e,sessionStore:v,leaseRegistry:y});return await A(t)})}catch(e){return y8(e)}}async function A(e,t){let n=async()=>{var n;let p,f=function(e){var t,r,n;let i,{scope:a,sessionStore:s,trackDownloadableArtifact:l}=e,d=a.runnerLogPath;a.throwIfCanceled();let c=s.get(a.sessionName);c&&(!function(e){var t;let r;if(!((r=(t=e).recording)&&eB(t.device)&&"ios"!==r.platform&&!1!==r.showTouches))return;let n=e.recording,i=mw(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(a.sessionName,c));let u=(i=(t={req:a.req,sessionName:a.sessionName,sessionStore:s}).sessionStore.get(t.sessionName),{req:uF(t.req,i),existingSession:i}),p=u.req;c=u.existingSession;let f=e=>(function(e,t,r){let n=eg();if(!t.ok){e_({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=eb({force:!0})??void 0;return{ok:!1,error:tn(new ti(tt(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 e_({level:"info",phase:"request_success"}),eb(),{ok:!0,data:function(e,t,r){var n,i;let a;if(!t)return t;let s=(n=e,a=Array.isArray((i=t).artifacts)?[...i.artifacts]:[],"screenshot"!==n.command||a.some(e=>e?.field==="path")||"string"!=typeof i.path||a.push({field:"path",path:i.path,localPath:n.meta?.clientArtifactPaths?.path,fileName:o.basename(n.meta?.clientArtifactPaths?.path??i.path)}),a.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=a.command,aB(r)?.allowInvalidRecording!==!0))return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:c.recording.invalidatedReason}})};c&&!p.meta?.lockPolicy&&(n=a.command,aB(n)?.selectorValidationExempt!==!0)&&function(e,t){let r=uM(e,t);if(0!==r.length)throw new ti("INVALID_ARGS",`Session "${e.name}" is already bound to ${uI(e)}, but this request selected ${r.map(ux).join(", ")}.`,{session:e.name,conflicts:r.map(ux),hint:u_(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,{...sH(n,i,a,o,l=eg().requestId,s),requestId:l}};return{type:"scope",scope:{req:p,sessionName:a.sessionName,logPath:d,existingSession:c,finalize:f,contextFromFlags:m,handlerContextFromFlags:(e,t,r)=>({...m(e,t,r),surface:s.get(a.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 aV({req:m.req,existingSession:m.existingSession,providers:{androidAdbProvider:i,appleRunnerProvider:a,appleToolProvider:s,linuxToolProvider:l,webProvider:d??((n=m,n.existingSession?.device.platform==="web"||n.req.flags?.platform==="web")?(p=r,({req:e,session:t})=>yz({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 uu({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,aB(o)?.replayScopedAction!==!0))return await g(e);if(!eY(e.token,n))return y4();try{let n=await yf({req:e,sessionStore:v,leaseRegistry:y});return n.sessionName===t.sessionName?await A(n,r):await g(e)}catch(e){return y8(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await y6({lockedScope:i,logPath:i.logPath,sessionStore:v})}return g}({logPath:f,stateDir:c,token:A,sessionStore:v,leaseRegistry:y,leaseLifecycleProvider:M.leaseLifecycleProvider,cloudArtifactProvider:x,deviceInventoryProvider:M.deviceInventoryProvider,providerDeviceRuntimeScope:M.providerDeviceRuntimeScope,trackDownloadableArtifact:rG}),D=async e=>{await ev({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{e_({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),eb({force:!0})})},P=async e=>{let t=yu(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
31
- `)});await Promise.race([t,tb(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
32
- `)})]),v.writeSessionLog(e),v.delete(e.name)},k=async()=>{let e=v.toArray();await Promise.all(e.map(P))},E=async()=>{let e,t,r=[];if("http"!==h){let t,n,i=(t=new Set,(n=g.createServer(e=>{t.add(e),e.on("close",()=>t.delete(e));let r="",n=0,i=new Set,a=!1,o=()=>{if(!a&&0!==n){for(let e of(a=!0,i))rM(e);e_({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(t7);if(await e(),n<=0)break;await tb(200)}}catch(e){e_({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=ta(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=tf(n),a=rI(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),r_(a),rN(a))throw rP();r=await rO(o?t=>{e.destroyed||e.write(tg(t))}:void 0,async()=>await N(n))}catch(e){r={ok:!1,error:tn(e)}}finally{n-=1,a&&(i.delete(a),rx(a))}e.destroyed||e.write(o?tp(r):`${JSON.stringify(r)}
33
- `)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await gi(i,"Failed to bind socket server")}if("socket"!==h){let e=await n$({handleRequest:N,token:A,retainArtifacts:w});r.push(e),t=await gi(e,"Failed to bind HTTP server")}return{servers:r,socketPort:e,httpPort:t}};if(!function(e,t,r){s.existsSync(e)||s.mkdirSync(e,{recursive:!0});let n=JSON.stringify(r,null,2),i=()=>{try{return s.writeFileSync(t,n,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(i())return!0;let a=gt(t);if(a?.pid&&a.pid!==process.pid&&e9(a.pid,a.processStartTime))return!1;try{s.unlinkSync(t)}catch{}return i()}(c,p,{pid:process.pid,version:b,startedAt:Date.now(),processStartTime:S}))return l.write("Daemon lock is held by another process; exiting.\n"),fT(void 0),d(0),null;let C=[];try{let e,n=await E();C=n.servers,t=n.socketPort,r=n.httpPort,R=t,O=r,T={socketPort:R,httpPort:O,token:A,version:b,codeSignature:I,processStartTime:S},s.existsSync(c)||s.mkdirSync(c,{recursive:!0}),s.writeFileSync(f,""),e=T.socketPort&&T.httpPort?"dual":T.httpPort?"http":"socket",s.writeFileSync(u,JSON.stringify({port:T.socketPort,httpPort:T.httpPort,transport:e,token:T.token,pid:process.pid,version:T.version,codeSignature:T.codeSignature,processStartTime:T.processStartTime,stateDir:c},null,2),{mode:384}),s.chmodSync(u,384),R&&a.write(`AGENT_DEVICE_DAEMON_PORT=${R}
34
- `),O&&a.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${O}
35
- `)}catch(t){var R,O,T;let e=tr(t);for(let t of(l.write(`Daemon error: ${e.message}
36
- `),C))try{t.close(()=>{})}catch{}return ge(u),gr(p),fT(void 0),d(1),null}eV();let L=!1,F=async(e={})=>{if(L)return;L=!0,e.cause&&await D(e.cause),await y7(C);let{detachIosSimulatorRunnerSessionsForShutdown:t,stopAllIosRunnerSessions:r}=await Promise.resolve(t7);try{await t()}catch{}await k(),await Promise.allSettled(_.map(async e=>await e.shutdown())),await r(),await Promise.race([eX().catch(()=>{}),tb(1e3)]),ge(u),gr(p),fT(void 0),d(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{F()}),process.on("SIGTERM",()=>{F()}),process.on("SIGHUP",()=>{F()}),process.on("uncaughtException",e=>{let t=e instanceof ti?e:tr(e);l.write(`Daemon error: ${t.message}
37
- `),F({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof ti?t:tr(t);l.write(`Daemon error: ${r.message}
38
- `),F({exitCode:1,cause:t})})),{httpPort:r,shutdown:F,socketPort:t,token:A}})().catch(e=>{let t=tr(e);process.stderr.write(`Daemon error: ${t.message}
39
- `),process.exit(1)});export{vq as ANDROID_CPU_SAMPLE_DESCRIPTION,vG as ANDROID_CPU_SAMPLE_METHOD,va as ANDROID_FRAME_SAMPLE_DESCRIPTION,vi as ANDROID_FRAME_SAMPLE_METHOD,vH as ANDROID_HPROF_SNAPSHOT_DESCRIPTION,vK as ANDROID_HPROF_SNAPSHOT_METHOD,vj as ANDROID_MEMORY_SAMPLE_DESCRIPTION,vV as ANDROID_MEMORY_SAMPLE_METHOD,wb as APPLE_MEMGRAPH_SNAPSHOT_DESCRIPTION,wg as APPLE_MEMGRAPH_SNAPSHOT_METHOD,wl as IOS_DEVICECTL_DEFAULT_HINT,pq as IOS_RUNNER_CONTAINER_BUNDLE_IDS,aY as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,aZ as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,iY as LOCAL_DEVICE_INVENTORY_PLATFORM_SELECTORS,iZ as LeaseRegistry,aD as NO_ACTIVE_SESSION_MESSAGE,rp as SessionStore,lR as androidUiNodes,cN as annotateScreenshotWithRefs,hX as withAppLogProvider,h6 as appendAppLogMarker,wN as buildAppleFrameSamplingMetadata,wP as buildAppleMemorySnapshotSupport,wD as buildAppleSamplingMetadata,i7 as buildDeviceInventoryRequestFromFlags,u_ as buildSessionRecoveryHint,uV as buildSimctlArgs,uj as buildSimctlArgsForDevice,lM as buildSnapshotState,vX as captureAndroidHeapSnapshot,dB as captureAndroidUiHierarchyXml,wS as captureAppleMemorySnapshot,lm as captureSnapshot,v3 as cleanupRetainedMaterializedPaths,v5 as cleanupRetainedMaterializedPathsForSession,rQ as cleanupUploadedArtifact,h8 as clearAppLogFiles,rx as clearRequestCanceled,iL as configureProviderPortReverse,sH as context_contextFromFlags,i1 as countDeviceInventoryByGroup,yz as createAgentBrowserWebProvider,lE as createDaemonRuntimeSessionStore,m$ as createLocalAppleRunnerProvider,rP as createRequestCanceledError,oG as createScopedProvider,ox as dispatchCommand,rT as emitRequestProgress,ca as ensureAndroidBlockingSystemDialogReady,aP as errorResponse,oq as filterAppleAppsByBundlePrefix,sU as getActiveAndroidSnapshotFreshness,hY as getAppLogPathMetadata,rD as getRequestSignal,mw as getRunnerSessionSnapshot,a$ as getSessionCommandKind,cK as getSnapshotReferenceFrame,p2 as hasCachedAppleRunnerArtifact,aO as hasExplicitDeviceSelector,oY as hasScopedAppleToolProvider,sm as runMacOsPressAction,sf as runMacOsReadTextAction,rs as inferFillText,iO as installProviderDeviceApp,iT as installProviderDeviceInstallablePath,iR as isActiveProviderDevice,a_ as isCommandSupportedOnDevice,ap as isHostSystemAudioProbeDevice,uE as isImplicitSessionScopeConflict,sG as isNavigationSensitiveAction,rN as isRequestCanceled,an as listDeviceInventory,rV as listDownloadableArtifacts,wa as listIosDeviceApps,uM as listSessionSelectorConflicts,s$ as markAndroidSnapshotFreshness,sW as markPendingInteractionOutcome,s0 as markPostGestureStabilization,rM as markRequestCanceled,ak as noActiveSessionError,lX as parseInstrumentationRecords,ht as prepareIosRunner,rY as prepareUploadedArtifact,m9 as prewarmAppleRunnerCache,m7 as prewarmIosRunnerSession,sd as quitMacOsApp,l1 as readAndroidHelperManifestInteger,l2 as readAndroidHelperManifestLiteral,o1 as readApplePlistJson,wc as readInfoPlistString,lQ as readInstrumentationResultNumber,rF as readReplayTestActionProgress,h0 as readSessionNetworkCapture,cz as recordTouchVisualizationEvent,ci as recoverAndroidBlockingSystemDialog,ab as registerBuiltinPlatformPlugins,r_ as registerRequestAbort,uL as releaseSessionLease,iF as removeProviderPortReverse,aE as requireCommandSupported,vu as resetAndroidFramePerfStats,mU as resolveAppleRunnerProvider,oJ as resolveAppleToolProvider,sl as resolveFrontmostMacOsApp,uP as resolveImplicitSessionScope,wd as resolveIosDevicectlHint,sV as resolveLeaseScope,sg as resolveLinuxToolProvider,hQ as resolveLogBackend,oI as resolvePayloadInput,uD as resolvePublicSessionName,sj as resolveRequestOrSessionLeaseScope,rI as resolveRequestTrackingId,pB as resolveRunnerAppBundleId,uT as resolveSessionLeaseForRequest,rm as resolveSessionRequestLogPath,rf as resolveSessionRunnerLogPath,lP as resolveSnapshotScope,i9 as resolveTargetDevice,v2 as retainMaterializedPaths,hG as runAppLogDoctor,oQ as runAppleToolCommand,yt as runHostSystemAudioProbeCommand,wi as runIosDevicectl,sA as runLinuxToolCommand,su as runMacOsAlertAction,sc as runMacOsPermissionAction,sh as runMacOsScreenshotAction,sp as runMacOsSnapshotAction,uK as runSimctlForDevice,o0 as runXcrun,m8 as runAppleRunnerCommand,mB as withAppleRunnerProvider,mS as abortAllIosRunnerSessions,mI as detachIosSimulatorRunnerSessionsForShutdown,m_ as stopAllIosRunnerSessions,vW as sampleAndroidCpuPerf,vc as sampleAndroidFramePerf,vz as sampleAndroidMemoryPerf,wx as sampleAppleFramePerf,wA as sampleApplePerfMetrics,mg as scheduleIosRunnerIdleStop,uk as sessionMatchesScope,lk as setSessionSnapshot,dG as snapshotAndroid,sO as snapshotLinux,sT as readLinuxTextAtPoint,vR as startAndroidPerfettoTrace,vL as startAndroidSimpleperfProfile,h2 as startAppLog,w2 as startAppleXctracePerfCapture,so as startMacOsAudioProbeProcess,vO as stopAndroidPerfettoTrace,vF as stopAndroidSimpleperfProfile,h4 as stopAppLog,yo as stopAppleRunnerForClose,w3 as stopAppleXctracePerfCapture,mA as stopIosRunnerSession,yd as stopSessionAndroidNativePerfCapture,yc as stopSessionAndroidSnapshotHelper,ys as stopSessionAppLog,yl as stopSessionApplePerfCapture,yr as stopSessionAudioProbe,sJ as stripInternalInteractionFlags,oZ as withAppleToolProvider,sb as withLinuxToolProvider,al as tryGetPlugin,rl as uniqueStrings,uS as withKeyedLock,rL as withReplayTestActionProgress,v$ as writeAndroidSimpleperfReport,w4 as writeAppleXctracePerfReport};