agent-device 0.18.2 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.2.apk → agent-device-android-multitouch-helper-0.19.0.apk} +0 -0
  2. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.0.apk.sha256 +1 -0
  3. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.2.manifest.json → agent-device-android-multitouch-helper-0.19.0.manifest.json} +4 -4
  4. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.2.apk → agent-device-android-snapshot-helper-0.19.0.apk} +0 -0
  5. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.0.apk.sha256 +1 -0
  6. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.2.manifest.json → agent-device-android-snapshot-helper-0.19.0.manifest.json} +6 -6
  7. package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +28 -0
  8. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +9 -120
  9. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +132 -66
  10. package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +155 -0
  11. package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +67 -0
  12. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +20 -74
  13. package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +64 -0
  14. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +0 -177
  15. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +81 -48
  16. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +102 -129
  17. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +208 -46
  18. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +82 -11
  19. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +72 -0
  20. package/dist/src/agent-browser-tool.js +1 -0
  21. package/dist/src/android-adb.d.ts +64 -234
  22. package/dist/src/android-adb.js +1 -1
  23. package/dist/src/android.js +1 -5
  24. package/dist/src/app-lifecycle.js +7 -0
  25. package/dist/src/apple-runner-options.js +1 -0
  26. package/dist/src/apps.js +5 -11
  27. package/dist/src/artifacts.d.ts +4 -3
  28. package/dist/src/artifacts.js +1 -1
  29. package/dist/src/audio-probe.js +1 -1
  30. package/dist/src/batch.d.ts +2 -177
  31. package/dist/src/batch.js +1 -1
  32. package/dist/src/cli-help.js +64 -38
  33. package/dist/src/cli-output.js +1 -1
  34. package/dist/src/cli-runner.js +2 -0
  35. package/dist/src/cli.js +12 -41
  36. package/dist/src/client-metro-companion.js +1 -0
  37. package/dist/src/client.js +3 -0
  38. package/dist/src/command-metadata.js +1 -0
  39. package/dist/src/command-schema.js +22 -0
  40. package/dist/src/command-surface.js +1 -1
  41. package/dist/src/contracts.d.ts +2 -213
  42. package/dist/src/contracts.js +1 -1
  43. package/dist/src/debug-symbols.js +5 -3
  44. package/dist/src/device-input-state.js +2 -0
  45. package/dist/src/device-rotation.js +14 -0
  46. package/dist/src/devices.js +1 -1
  47. package/dist/src/devices2.js +1 -0
  48. package/dist/src/devices3.js +1 -0
  49. package/dist/src/find.js +1 -1
  50. package/dist/src/finders.d.ts +2 -81
  51. package/dist/src/finders.js +1 -1
  52. package/dist/src/generic.js +1 -1
  53. package/dist/src/handler-utils.js +1 -1
  54. package/dist/src/helper.js +2 -0
  55. package/dist/src/host-process.js +2 -0
  56. package/dist/src/index.d.ts +1265 -1768
  57. package/dist/src/index.js +1 -1
  58. package/dist/src/input-actions.js +3 -1
  59. package/dist/src/input-actions2.js +1 -0
  60. package/dist/src/install-source.d.ts +13 -14
  61. package/dist/src/install-source.js +1 -1
  62. package/dist/src/install-source2.js +1 -0
  63. package/dist/src/interaction-snapshot.js +1 -0
  64. package/dist/src/interaction.js +1 -1
  65. package/dist/src/interactor.js +2 -1
  66. package/dist/src/internal/bin.d.ts +1 -1
  67. package/dist/src/internal/bin.js +2 -5
  68. package/dist/src/internal/companion-tunnel.d.ts +1 -1
  69. package/dist/src/internal/companion-tunnel.js +1 -1
  70. package/dist/src/internal/daemon.d.ts +1 -1
  71. package/dist/src/internal/daemon.js +16 -1
  72. package/dist/src/internal/png-worker.d.ts +29 -26
  73. package/dist/src/internal/png-worker.js +1 -1
  74. package/dist/src/internal/update-check-entry.d.ts +1 -1
  75. package/dist/src/internal/update-check-entry.js +1 -1
  76. package/dist/src/io.d.ts +2 -85
  77. package/dist/src/io.js +1 -1
  78. package/dist/src/lease.js +1 -1
  79. package/dist/src/linux.js +1 -1
  80. package/dist/src/logcat.js +6 -0
  81. package/dist/src/manifest.js +1 -0
  82. package/dist/src/metro.d.ts +70 -113
  83. package/dist/src/metro.js +1 -1
  84. package/dist/src/metro2.js +1 -0
  85. package/dist/src/notifications.js +1 -1
  86. package/dist/src/output-path.js +1 -0
  87. package/dist/src/path-resolution.js +1 -0
  88. package/dist/src/png-worker-contract.js +1 -0
  89. package/dist/src/points.js +4 -0
  90. package/dist/src/project-runtime.js +1 -0
  91. package/dist/src/provider.js +1 -1
  92. package/dist/src/providers.js +1 -0
  93. package/dist/src/react-native.js +1 -1
  94. package/dist/src/record-trace-recording.js +2 -5
  95. package/dist/src/record-trace.js +1 -1
  96. package/dist/src/recording-provider.js +1 -1
  97. package/dist/src/registry.js +37 -0
  98. package/dist/src/remote-config.d.ts +2 -83
  99. package/dist/src/reporting.js +9 -0
  100. package/dist/src/rolldown-runtime.js +1 -0
  101. package/dist/src/runner-client.js +1 -0
  102. package/dist/src/runner-provider.js +1 -0
  103. package/dist/src/runner-sequence.js +1 -1
  104. package/dist/src/runtime-transport.js +1 -0
  105. package/dist/src/runtime.js +3 -0
  106. package/dist/src/scoped-provider.js +1 -0
  107. package/dist/src/sdk-android-adb.d.ts +144 -0
  108. package/dist/src/sdk-android-adb.js +4 -0
  109. package/dist/src/sdk-app-inventory.d.ts +4 -0
  110. package/dist/src/sdk-app-inventory.js +1 -0
  111. package/dist/src/sdk-batch-runner.d.ts +40 -0
  112. package/dist/src/sdk-batch-runner.js +2 -0
  113. package/dist/src/sdk-batch.js +2 -0
  114. package/dist/src/sdk-contracts.d.ts +386 -0
  115. package/dist/src/sdk-contracts.js +2 -0
  116. package/dist/src/sdk-finders.d.ts +61 -0
  117. package/dist/src/sdk-finders.js +1 -0
  118. package/dist/src/sdk-io.d.ts +79 -0
  119. package/dist/src/sdk-io.js +1 -0
  120. package/dist/src/sdk-remote-config.d.ts +140 -0
  121. package/dist/src/sdk-remote-config.js +1 -0
  122. package/dist/src/sdk-selectors.js +1 -0
  123. package/dist/src/selector-runtime.js +1 -1
  124. package/dist/src/selectors.d.ts +39 -137
  125. package/dist/src/selectors.js +1 -1
  126. package/dist/src/selectors2.js +1 -0
  127. package/dist/src/server.js +3 -2
  128. package/dist/src/session.js +10 -11
  129. package/dist/src/setting-state.js +1 -0
  130. package/dist/src/simctl.js +1 -0
  131. package/dist/src/simulator.js +1 -2
  132. package/dist/src/snapshot-diagnostics.js +3 -0
  133. package/dist/src/snapshot-helper.js +5 -0
  134. package/dist/src/snapshot-quality.js +1 -0
  135. package/dist/src/snapshot.js +1 -2
  136. package/dist/src/snapshot2.js +2 -0
  137. package/dist/src/{5560.js → timeouts.js} +1 -1
  138. package/dist/src/tool-provider.js +3 -0
  139. package/dist/src/tool-provider2.js +1 -0
  140. package/dist/src/ttl-memo.js +1 -0
  141. package/dist/src/update-check.js +1 -0
  142. package/dist/src/url.js +1 -0
  143. package/dist/src/version.js +1 -0
  144. package/dist/src/web.js +1 -1
  145. package/dist/src/xml.js +2 -0
  146. package/package.json +12 -19
  147. package/server.json +2 -2
  148. package/skills/agent-device/SKILL.md +2 -0
  149. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.2.apk.sha256 +0 -1
  150. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.2.apk.sha256 +0 -1
  151. package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +0 -443
  152. package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -169
  153. package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +0 -220
  154. package/dist/src/1404.js +0 -1
  155. package/dist/src/1986.js +0 -1
  156. package/dist/src/2748.js +0 -1
  157. package/dist/src/2948.js +0 -30
  158. package/dist/src/3006.js +0 -1
  159. package/dist/src/314.js +0 -1
  160. package/dist/src/3340.js +0 -8
  161. package/dist/src/4418.js +0 -1
  162. package/dist/src/4428.js +0 -3
  163. package/dist/src/485.js +0 -1
  164. package/dist/src/4917.js +0 -1
  165. package/dist/src/495.js +0 -5
  166. package/dist/src/5448.js +0 -3
  167. package/dist/src/5484.js +0 -1
  168. package/dist/src/5643.js +0 -1
  169. package/dist/src/587.js +0 -1
  170. package/dist/src/5913.js +0 -4
  171. package/dist/src/6849.js +0 -1
  172. package/dist/src/6918.js +0 -1
  173. package/dist/src/6967.js +0 -1
  174. package/dist/src/760.js +0 -1
  175. package/dist/src/7871.js +0 -1
  176. package/dist/src/8184.js +0 -1
  177. package/dist/src/8225.js +0 -1
  178. package/dist/src/8391.js +0 -1
  179. package/dist/src/8404.js +0 -2
  180. package/dist/src/8414.js +0 -2
  181. package/dist/src/8875.js +0 -4
  182. package/dist/src/893.js +0 -1
  183. package/dist/src/8936.js +0 -1
  184. package/dist/src/9414.js +0 -1
  185. package/dist/src/9581.js +0 -22
  186. package/dist/src/9612.js +0 -1
  187. package/dist/src/9624.js +0 -1
  188. package/dist/src/9722.js +0 -38
  189. package/dist/src/devices~1.js +0 -1
  190. package/dist/src/devices~2.js +0 -1
  191. package/dist/src/input-actions~1.js +0 -1
  192. package/dist/src/rslib-runtime.js +0 -1
  193. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +0 -0
  194. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +0 -0
  195. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  196. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
  197. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
  198. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
  199. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +0 -0
  200. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +0 -0
  201. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
  202. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
  203. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +0 -0
  204. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +0 -0
  205. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +0 -0
  206. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
  207. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
  208. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +0 -0
  209. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +0 -0
  210. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
  211. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +0 -0
  212. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
  213. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
  214. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
  215. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
  216. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
@@ -1,7 +1,6 @@
1
- import{__webpack_require__ as e}from"./rslib-runtime.js";import t from"node:fs";import r from"node:path";import a from"node:vm";import{setTimeout as n}from"node:timers/promises";import{access as i}from"node:fs/promises";import{asAppError as o,normalizeError as s,AppError as l}from"./485.js";import{runXcrun as u,installProviderDeviceInstallablePath as d,LOCAL_DEVICE_INVENTORY_PLATFORM_SELECTORS as p,APPLE_MEMGRAPH_SNAPSHOT_DESCRIPTION as c,dispatchCommand as f,sessionMatchesScope as m,appendAppLogMarker as h,countDeviceInventoryByGroup as g,startAndroidSimpleperfProfile as w,installProviderDeviceApp as v,sampleAppleFramePerf as y,captureAppleMemorySnapshot as A,isHostSystemAudioProbeDevice as b,getSessionCommandKind as S,inferFillText as I,scheduleIosRunnerIdleStop as _,startAndroidPerfettoTrace as k,stopIosRunnerSession as N,captureAndroidHeapSnapshot as D,stopAppleXctracePerfCapture as x,resolvePublicSessionName as R,writeAppleXctracePerfReport as M,registerBuiltinPlatformPlugins as P,stopSessionApplePerfCapture as L,cleanupUploadedArtifact as O,resolveSessionRequestLogPath as $,ANDROID_FRAME_SAMPLE_METHOD as C,buildAppleFrameSamplingMetadata as E,createRequestCanceledError as V,stopAppleRunnerForClose as F,isActiveProviderDevice as q,registerRequestAbort as T,errorResponse as U,runHostSystemAudioProbeCommand as G,readReplayTestActionProgress as H,configureProviderPortReverse as B,releaseSessionLease as K,removeProviderPortReverse as j,withKeyedLock as z,buildSessionRecoveryHint as W,resolveTargetDevice as J,getAppLogPathMetadata as Y,sampleAndroidMemoryPerf as X,requireCommandSupported as Q,uniqueStrings as Z,setSessionSnapshot as ee,stopSessionAudioProbe as et,ANDROID_HPROF_SNAPSHOT_DESCRIPTION as er,sampleAndroidCpuPerf as ea,ANDROID_HPROF_SNAPSHOT_METHOD as en,buildDeviceInventoryRequestFromFlags as ei,startAppleXctracePerfCapture as eo,buildAppleSamplingMetadata as es,cleanupRetainedMaterializedPathsForSession as el,clearAppLogFiles as eu,tryGetPlugin as ed,getSnapshotReferenceFrame as ep,prepareIosRunner as ec,hasExplicitDeviceSelector as ef,stopSessionAndroidNativePerfCapture as em,readSessionNetworkCapture as eh,cleanupRetainedMaterializedPaths as eg,isImplicitSessionScopeConflict as ew,resolveSessionRunnerLogPath as ev,ANDROID_CPU_SAMPLE_DESCRIPTION as ey,buildSnapshotState as eA,resolveLogBackend as eb,resolveSessionLeaseForRequest as eS,stopAndroidSimpleperfProfile as eI,context_contextFromFlags as e_,listDeviceInventory as ek,SessionStore as eN,ANDROID_CPU_SAMPLE_METHOD as eD,buildAppleMemorySnapshotSupport as ex,stopAndroidPerfettoTrace as eR,isRequestCanceled as eM,resolveRequestTrackingId as eP,retainMaterializedPaths as eL,runAppLogDoctor as eO,resolvePayloadInput as e$,prepareUploadedArtifact as eC,LeaseRegistry as eE,getRunnerSessionSnapshot as eV,listSessionSelectorConflicts as eF,stopSessionAppLog as eq,stopSessionAndroidSnapshotHelper as eT,withReplayTestActionProgress as eU,resetAndroidFramePerfStats as eG,ANDROID_FRAME_SAMPLE_DESCRIPTION as eH,markRequestCanceled as eB,stopAppLog as eK,resolveImplicitSessionScope as ej,APPLE_MEMGRAPH_SNAPSHOT_METHOD as ez,ANDROID_MEMORY_SAMPLE_DESCRIPTION as eW,writeAndroidSimpleperfReport as eJ,prewarmIosRunnerSession as eY,clearRequestCanceled as eX,buildSimctlArgsForDevice as eQ,resolveFrontmostMacOsApp as eZ,isCommandSupportedOnDevice as e0,sampleApplePerfMetrics as e1,sampleAndroidFramePerf as e3,ANDROID_MEMORY_SAMPLE_METHOD as e2,getRequestSignal as e5,markAndroidSnapshotFreshness as e4,startAppLog as e8,emitRequestProgress as e6}from"./9722.js";import{isMacOs as e7,resolveAppleSimulatorSetPathForSelector as e9,publicPlatformString as te,NETWORK_INCLUDE_MODES as tt,isMobilePlatform as tr,matchesPlatformSelector as ta,isApplePlatform as tn,matchesDeviceSelector as ti,isIosFamily as to}from"./6849.js";import{ensureDeviceReady as ts,buildAppleRunnerRequestOptions as tl,buildAppleRunnerSessionOptions as tu,createAppleRunnerCachePrewarmOnColdBoot as td,createAppleRunnerCacheColdBootPrewarmForOpen as tp}from"./8414.js";import{isPerfAction as tc,isPerfSubject as tf,pointFromPercent as tm,PERF_AREA_ERROR_MESSAGE as th,buildSwipeGesturePlan as tg,PERF_ACTION_ERROR_MESSAGE as tw,buildSnapshotDisplayLines as tv,formatDoctorCheckDetailLines as ty,isPerfKind as tA,isPerfMemoryKind as tb,pointInsideRect as tS,successText as tI,clampGesturePoint as t_,resolveDeployResultTarget as tk,PERF_MEMORY_KIND_ERROR_MESSAGE as tN,PERF_KIND_ERROR_MESSAGE as tD,isPerfArea as tx,formatDoctorCheckSummaryLine as tR,LOG_ACTION_VALUES as tM,withSuccessText as tP,clampToRange as tL,parseSessionSurface as tO,resolveInstallFromSourceResultTarget as t$,readReactNativeOverlayActionNodes as tC,detectReactNativeOverlay as tE,PERF_SUBJECT_ERROR_MESSAGE as tV}from"./2948.js";import{recordSessionAction as tF}from"./handler-utils.js";import{trimRuntimeValue as tq,resolveRuntimeTransportHints as tT}from"./8936.js";import{resolveAndroidAdbExecutor as tU,runAndroidAdb as tG,resolveIosSimulatorDeviceSetPath as tH,classifyAndroidAppTarget as tB,resolveIosDeviceDeepLinkBundleId as tK,isInfrastructureBootFailureReason as tj,Deadline as tz,isWebUrl as tW,resolveAndroidSerialAllowlist as tJ,isDeepLinkTarget as tY,formatAndroidInstalledPackageRequiredMessage as tX,listAndroidApps as tQ}from"./3340.js";import{getDiagnosticsMeta as tZ,runCmd as t0,runCmdSync as t1,emitDiagnostic as t3}from"./8875.js";import{shutdownSimulator as t2,getSimulatorState as t5}from"./simulator.js";import{runBatch as t4,mergeParentFlags as t8}from"./6918.js";import{assertResolvedAppsFilter as t6}from"./2748.js";import{listIosApps as t7}from"./apps.js";import{resolveWebProvider as t9}from"./provider.js";import{unsupportedCommand as re,readEnvMap as rt,parseReplayScriptDetailed as rr,readReplayShellEnvSource as ra,normalizeCommandList as rn,normalizePlatform as ri,readReplayCliEnvEntries as ro,parseMaestroYamlDocuments as rs,parseAbsolutePoint as rl,readReplayScriptMetadata as ru,parseReplayCliEnvEntries as rd,collectReplayShellEnv as rp,support_action as rc,isPlainRecord as rf,requireAppId as rm,assertOnlyKeys as rh,resolveMaestroString as rg,requireStringValue as rw,parseMaestroPoint as rv,unsupportedMaestroSyntax as ry,readTimeoutMs as rA,writeReplayScript as rb,buildReplayVarScope as rS,resolveReplayAction as rI,mergeReplayVarScopeValues as r_}from"./4428.js";import{readSnapshotDiagnosticsSummary as rk,summarizeSnapshotTimingSamples as rN,mergeSnapshotDiagnostics as rD}from"./5913.js";import{resolveSelectorChain as rx,extractNodeText as rR,findSnapshotAncestor as rM,isDescendantOfSnapshotNode as rP,splitIsSelectorArgs as rL,buildSelectorChainForNode as rO,buildSnapshotNodeByIndex as r$,matchesSelector as rC,normalizeType as rE}from"./893.js";import{formatScriptActionSummary as rV,evaluateIsPredicate as rF,isTouchTargetCommand as rq}from"./7871.js";import{splitSelectorFromArgs as rT,normalizeText as rU,tryParseSelectorChain as rG,parseSelectorChain as rH}from"./587.js";import{sleep as rB}from"./5560.js";import{handleRecordCommand as rK}from"./record-trace-recording.js";import{recordingExtensionForPlatform as rj,defaultRecordingPath as rz}from"./5643.js";import{detectProjectRuntimeKind as rW}from"./760.js";import{INTERNAL_COMMANDS as rJ,PUBLIC_COMMANDS as rY}from"./1986.js";import{readVersion as rX}from"./1404.js";var rQ={};async function rZ(e){var t;let r="ios"===(t=e.flags?.platform)||"android"===t?t:void 0;if(e.session){if(r&&e.session.device.platform!==r)throw new l("INVALID_ARGS",`install_from_source requested platform ${r}, but session is bound to ${e.session.device.platform}`);return await ts(e.session.device),e.session.device}if(!r)throw new l("INVALID_ARGS",'install_from_source requires platform "ios" or "android" when no session is provided');let a=await J(e.flags??{});return await ts(a),a}async function r0(e){let{prepared:t,retention:r,req:a,session:n,sessionName:i}=e;if(r.enabled)return await eL({archivePath:t.archivePath,installablePath:t.installablePath,tenantId:a.meta?.tenantId,sessionName:n?i:void 0,ttlMs:r.ttlMs})}function r1(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function r3(e){let{req:t,sessionName:r,sessionStore:a}=e,n=a.get(r);try{let e,i,o=(e=function(e){let t=e.meta?.installSource;if(!t)throw new l("INVALID_ARGS","install_from_source requires a source payload");switch(t.kind){case"url":if(!t.url||0===t.url.trim().length)throw new l("INVALID_ARGS","install_from_source url source requires a non-empty url");return t;case"path":if(!t.path||0===t.path.trim().length)throw new l("INVALID_ARGS","install_from_source path source requires a non-empty path");return t;case"github-actions-artifact":throw new l("UNSUPPORTED_OPERATION","install_from_source github-actions-artifact sources require a compatible remote daemon");default:throw new l("UNSUPPORTED_OPERATION",`install_from_source ${String(t.kind)} sources require a compatible remote daemon`)}}(t),(i=t.meta?.uploadedArtifactId)&&"path"===e.kind?{source:{kind:"path",path:eC(i,t.meta?.tenantId)},cleanup:()=>{O(i)}}:{source:e,cleanup:()=>{}}),s=function(e){let t=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!t)return{enabled:!1};if(void 0!==r&&r<=0)throw new l("INVALID_ARGS","install_from_source retentionMs must be a positive integer");return{enabled:!0,ttlMs:r}}(t),u=await rZ({session:n,flags:t.flags}),d=Q("install",u,{message:"install_from_source is not supported on this device"});if(d)return d;let p=e5(t.meta?.requestId);if(to(u)){let{prepareIosInstallArtifact:e}=await import("./apps.js"),i=await e(o.source,{signal:p});return await r2({prepared:i,retention:s,req:t,resolvedSourceCleanup:()=>o.cleanup(),session:n,sessionName:r,sessionStore:a,buildResult:async e=>await r5(u,i,e)})}let{prepareAndroidInstallArtifact:c}=await import("./3340.js"),f=await c(o.source,{signal:p});return await r2({prepared:f,retention:s,req:t,resolvedSourceCleanup:()=>o.cleanup(),session:n,sessionName:r,sessionStore:a,buildResult:async e=>await r4(u,f,e)})}catch(e){return{ok:!1,error:s(e)}}}async function r2(e){let t;try{var r;t=await r0(e);let a=await e.buildResult(t),n=tP(a,(r=a,`Installed: ${t$(r)}`));return!function(e){let{session:t,sessionStore:r,req:a,data:n}=e;tF(r,t,a,"install_source",n,{positionals:[]})}({session:e.session,sessionStore:e.sessionStore,req:e.req,data:n}),{ok:!0,data:n}}catch(r){throw t&&await eg(t.materializationId,e.req.meta?.tenantId).catch(()=>{}),r}finally{await e.prepared.cleanup(),e.resolvedSourceCleanup()}}async function r5(e,t,r){var a,n,i;let o,s,u=await d(e,t.installablePath,{appIdentifierHint:t.bundleId});if(!u){let{installIosInstallablePath:r}=await import("./apps.js");await r(e,t.installablePath)}return a=t,n=u,i=r,o=function(e,t){let r=t?.bundleId??e.bundleId;if(r)return r;throw new l("COMMAND_FAILED","Installed iOS app identity could not be resolved from the artifact")}(a,n),s=n?.appName??a.appName,{...r1(i),bundleId:o,...r8(s),launchTarget:n?.launchTarget??o}}async function r4(e,t,r){let a=await d(e,t.installablePath,{packageNameHint:t.packageName}),n=await r6(e,t,a),{inferAndroidAppName:i}=await import("./3340.js"),o=i(n);return{...r1(r),packageName:n,...r8(a?.appName??o),launchTarget:a?.launchTarget??n}}function r8(e){return e?{appName:e}:{}}async function r6(e,t,r){let a=r?.packageName??r?.launchTarget;if(a)return a;let{installAndroidInstallablePathAndResolvePackageName:n}=await import("./3340.js"),i=await n(e,t.installablePath,t.packageName);if(!i)throw new l("COMMAND_FAILED","Installed Android app identity could not be resolved from the artifact or device state");return i}async function r7(e){let{req:t}=e;try{let e=t.meta?.materializationId?.trim();if(!e)throw new l("INVALID_ARGS","release_materialized_paths requires a materializationId");return await eg(e,t.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:s(e)}}}function r9(e){return to(e)&&"simulator"===e.kind}function ae(e,t,r){return t||ef(r)?null:U("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}async function at(e,t){r9(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function ar(e){let t=ef(e.flags)||!e.session?await J(e.flags??{},{allowStoppedAndroidAvdPlaceholders:e.allowStoppedAndroidAvdPlaceholders}):await aa(e.session.device);return!1!==e.ensureReady&&await ts(t),t}async function aa(e){if(!to(e)||"simulator"!==e.kind||"darwin"!==process.platform)return e;if(eV(e.id)?.alive)return{...e,booted:!0};let t={platform:"ios",target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await J(t)}catch(e){if(!(e instanceof l)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await J({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function an(e){let t=e.flags?.device?.trim();return t||(e.resolvedDevice?.platform==="android"&&"emulator"===e.resolvedDevice.kind?e.resolvedDevice.name:e.sessionDevice?.platform==="android"&&"emulator"===e.sessionDevice.kind?e.sessionDevice.name:void 0)}e.r(rQ),e.d(rQ,{handleSessionCommands:()=>lD});let ai="shared_prefs/ReactNativeDevPrefs.xml",ao="debug_http_host",as="dev_server_https",al="RCT_jsLocation",au="RCT_packager_scheme",ad="React Native runtime hints require adb run-as access to the app sandbox. Verify the app is debuggable and the selected package/device are correct.",ap='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function ac(e){return void 0!==tT(e)}async function af(e){let{device:t,appId:r,runtime:a}=e;if(q(t)||!r)return;let n=tT(a);if(n){if("android"===t.platform)return void await ah(t,r,n);to(t)&&"simulator"===t.kind&&await ay(t,r,n)}}async function am(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await ag(t,r);to(t)&&"simulator"===t.kind&&await aA(t,r)}}async function ah(e,t,r){var a,n,i,o,s,l;let u,d;a_(t);let p=(a=await aw(e,t),n=ao,i=`${r.host}:${r.port}`,u=` <string name="${ak(n)}">${ak(i)}</string>`,aS(aI(a,n),u));o=p,s=as,l="https"===r.scheme,d=` <boolean name="${ak(s)}" value="${l?"true":"false"}" />`,p=aS(aI(o,s),d),await av(e,t,p)}async function ag(e,t){a_(t);let r=await aw(e,t),a=aI(r,ao),n=aI(a,as);n!==r&&await av(e,t,n)}async function aw(e,t){let r=await tG(e,["shell","run-as",t,"cat",ai],{allowFailure:!0});return 0!==r.exitCode?ap:ab(r.stdout)}async function av(e,t,r){let a=["shell","run-as",t,"id"],n=await tG(e,a,{allowFailure:!0});if(0!==n.exitCode){let e=aN(n.stdout,n.stderr);throw new l("COMMAND_FAILED",e?`Failed to access Android app sandbox for ${t}`:`Failed to probe Android app sandbox for ${t}`,{package:t,cmd:"adb",args:a,stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode,hint:e?ad:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await tG(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await tG(e,["shell","run-as",t,"tee",ai],{stdin:r.trimEnd()})}catch(a){let e=o(a);if("TOOL_MISSING"===e.code)throw e;let r=aN("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new l("COMMAND_FAILED",r?`Failed to access Android app sandbox for ${t}`:`Failed to write Android runtime hints for ${t}`,{...e.details??{},package:t,cmd:"adb",phase:"write-runtime-hints",hint:r?ad:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function ay(e,t,r){await u(eQ(e,["spawn",e.id,"defaults","write",t,al,"-string",`${r.host}:${r.port}`])),await u(eQ(e,["spawn",e.id,"defaults","write",t,au,"-string",r.scheme]))}async function aA(e,t){await u(eQ(e,["spawn",e.id,"defaults","delete",t,al]),{allowFailure:!0}),await u(eQ(e,["spawn",e.id,"defaults","delete",t,au]),{allowFailure:!0})}function ab(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
2
- `:ap}function aS(e,t){return ab(e).replace("</map>",`${t}
3
- </map>`)}function aI(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return ab(e).replace(RegExp(`^\\s*<string name="${r}">[\\s\\S]*?<\\/string>\\n?`,"m"),"").replace(RegExp(`^\\s*<boolean name="${r}" value="(?:true|false)"\\s*\\/?>\\n?`,"m"),"")}function a_(e){if("binary"!==tB(e))return;let t=tX(e);throw new l("INVALID_ARGS",t,{package:e,hint:t})}function ak(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function aN(e,t){let r=`${e}
4
- ${t}`.toLowerCase();return["run-as: package not debuggable","run-as: permission denied","run-as: package is unknown","run-as: unknown package","is unknown","is not an application","could not set capabilities"].some(e=>r.includes(e))}let aD=["platform","metroHost","metroPort","bundleUrl","launchUrl"];function ax(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>void 0!==e&&""!==e).length:0}function aR(e,t){if(void 0!==e){if("string"!=typeof e)throw new l("INVALID_ARGS",`Invalid open runtime ${t}: expected string.`);return tq(e)}}function aM(e){if(void 0!==e){if(!Number.isInteger(e)||e<1||e>65535)throw new l("INVALID_ARGS",`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function aP(e){if("ios"===e||"android"===e)return e}async function aL(e){let{replacedStoredRuntime:t,previousRuntime:r,runtime:a,session:n}=e;!t||!n?.appBundleId||!ac(r)||ac(a)||await am({device:n.device,appId:n.appBundleId})}async function aO(e){var t,r,a;let{req:n,sessionName:i,sessionStore:o}=e,s=(n.positionals?.[0]??"show").toLowerCase();if("port-reverse"===(t=s)||"port-reverse-remove"===t)return await aC(n,s);if("set"!==(r=s)&&"show"!==r&&"clear"!==r)return U("INVALID_ARGS","runtime requires set, show, clear, port-reverse, or port-reverse-remove");let l=o.get(i),u=o.getRuntimeHints(i);return"clear"===s?await a$(i,o,l,u):"show"===s?{ok:!0,data:{session:i,configured:!!(a=u),runtime:a}}:function(e){var t,r;let{req:a,sessionName:n,sessionStore:i,session:o,current:s}=e,l=o?te(o.device):void 0,u=aP(a.flags?.platform??s?.platform??l);if(!u)return U("INVALID_ARGS","runtime set only supports iOS and Android sessions. Pass --platform ios|android or open an iOS/Android session first.");if(void 0!==l&&l!==u)return U("INVALID_ARGS",`runtime set targets ${u}, but session "${n}" is already bound to ${l}.`);let d={platform:(t=a.flags,r={platform:u,metroHost:tq(t?.metroHost),metroPort:aM(t?.metroPort),bundleUrl:tq(t?.bundleUrl),launchUrl:tq(t?.launchUrl)}).platform??s?.platform,metroHost:r.metroHost??s?.metroHost,metroPort:r.metroPort??s?.metroPort,bundleUrl:r.bundleUrl??s?.bundleUrl,launchUrl:r.launchUrl??s?.launchUrl};return 0===ax(d)?U("INVALID_ARGS","runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url."):(i.setRuntimeHints(n,d),{ok:!0,data:{session:n,configured:!0,runtime:d}})}({req:n,sessionName:i,sessionStore:o,session:l,current:u})}async function a$(e,t,r,a){ac(a)&&r?.appBundleId&&await am({device:r.device,appId:r.appBundleId});let n=t.clearRuntimeHints(e);return{ok:!0,data:{session:e,cleared:n}}}async function aC(e,t){let r=function(e){var t,r;let a,n,i,o,s=(t=e,a=t.flags?.leaseId,n=t.flags?.leaseProvider,a?n?{ok:!0,leaseId:a,provider:n}:{ok:!1,response:U("INVALID_ARGS","runtime port-reverse requires a lease provider.")}:{ok:!1,response:U("INVALID_ARGS","runtime port-reverse requires a resolved remote lease.")});if(!s.ok)return s;let l=(r=e,i=aV(r.flags?.devicePort),o=aV(r.flags?.hostPort??r.flags?.devicePort),i&&o?{ok:!0,devicePort:i,hostPort:o}:{ok:!1,response:U("INVALID_ARGS","runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.")});if(!l.ok)return l;let u=e.flags?.portReverseName?.trim()||"runtime";return{ok:!0,options:{leaseId:s.leaseId,provider:s.provider,devicePort:l.devicePort,hostPort:l.hostPort,name:u}}}(e);if(!r.ok)return r.response;let a=await aE(t,r.options);return a?{ok:!0,data:{action:t,...a}}:U("UNSUPPORTED_OPERATION","No active provider device runtime supports port reverse for this lease.")}async function aE(e,t){return"port-reverse"===e?await B(t):await j(t)}function aV(e){if("number"==typeof e&&Number.isInteger(e)&&!(e<1)&&!(e>65535))return e}let aF="open-command-roundtrip",aq="Not implemented for this platform in this release.";function aT(e){let{existingSession:t,sessionName:r,sessionScope:a,device:n,surface:i,appBundleId:o,appName:s,saveScript:l}=e;return t?{...t,device:n,surface:i,appBundleId:o,appName:s,recordSession:t.recordSession||l,snapshot:void 0}:{name:r,sessionScope:a,device:n,createdAt:Date.now(),surface:i,appBundleId:o,appName:s,recordSession:l,actions:[]}}let aU=new Set(["app","desktop","frontmost-app"]);async function aG(e){if("app"===e||"desktop"===e||"menubar"===e)return{};let t=await eZ();return{appBundleId:t.bundleId,appName:t.appName}}async function aH(e,t,r){if(tn(e.platform)&&t)return tY(t)?e7(e)?void 0:"device"===e.kind?tK(r,t):tW(t)?void 0:r??await aB(e,t):await aK(e,t)}async function aB(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:r}=await import("./apps.js");return await r(e,t)}catch{return}}async function aK(e,t){try{let{resolveIosApp:r}=await import("./apps.js");return await r(e,t)}catch{return}}async function aj(e,t){if(!("android"!==e.platform||!t||tY(t)))try{let{resolveAndroidApp:r}=await import("./3340.js"),a=await r(e,t);return"package"===a.type?a.value:void 0}catch{return}}async function az(e,t,r){if(r||"android"!==e.platform||!t||!tY(t))return r;try{let{getAndroidAppState:t}=await import("./3340.js"),a=await t(e);return a.package?.trim()||r}catch{return r}}async function aW(e,t,r,a){return await aH(e,t,r)??await a(e,t)??("android"===e.platform&&t&&tY(t)?r:void 0)}function aJ(e){return U("INVALID_ARGS",e)}function aY(e,t,r,a){try{return function(e){let{device:t,surfaceFlag:r,openTarget:a,existingSurface:n}=e;if((e7(t)||"linux"===t.platform)&&!r)return n??"app";if("linux"===t.platform){if(!r)return"app";let e=tO(r);if(!aU.has(e))throw new l("INVALID_ARGS",`Linux supports --surface app, desktop, and frontmost-app (got "${r}")`);if("app"!==e&&a)throw new l("INVALID_ARGS",`open --surface ${e} does not accept an app target`);return e}if(!e7(t)){if(r)throw new l("INVALID_ARGS","surface is only supported on macOS and Linux");return"app"}let i=r?tO(r):"app";if("app"!==i&&"menubar"!==i&&a)throw new l("INVALID_ARGS",`open --surface ${i} does not accept an app target`);return i}({device:e,surfaceFlag:t,openTarget:r,existingSurface:a})}catch(e){return U(e instanceof l?e.code:"INVALID_ARGS",String(e.message))}}function aX(e){let{shouldRelaunch:t,openTarget:r,surface:a,device:n}=e;return t?r&&tY(r)?aJ("open --relaunch does not support URL targets."):"app"!==a?aJ("open --relaunch is supported only for app surfaces."):"android"===n.platform&&r&&"binary"===tB(r)?aJ(tX(r)):null:null}async function aQ(e){let{req:t,sessionName:r,sessionStore:a,device:n,surface:i,openTarget:s,existingSession:u,onIosSimulatorColdBootStart:d}=e;await ts(n,{deviceHub:t.flags?.deviceHub===!0,onIosSimulatorColdBootStart:d});let{appBundleId:p,appName:c}=await aZ({device:n,surface:i,openTarget:s,existingAppBundleId:u?.appBundleId}),f=function(e){try{return{ok:!0,data:function(e){let{req:t,sessionStore:r,sessionName:a,device:n}=e,i=r.getRuntimeHints(a),o=function(e){let{runtime:t,sessionName:r,platform:a}=e;if(void 0===t)return;if(!t||"object"!=typeof t||Array.isArray(t))throw new l("INVALID_ARGS","open runtime must be an object.");let n=Object.keys(t).find(e=>!aD.includes(e));if(n)throw new l("INVALID_ARGS",`Invalid open runtime field: ${n}. Supported fields are ${aD.join(", ")}.`);return{platform:function(e,t,r){if(void 0===e)return r;if("ios"!==e&&"android"!==e)throw new l("INVALID_ARGS",`Invalid open runtime platform: ${String(e)}. Use "ios" or "android".`);if(r&&e!==r)throw new l("INVALID_ARGS",`open runtime targets ${e}, but session "${t}" is bound to ${r}.`);return e}(t.platform,r,a),metroHost:aR(t.metroHost,"metroHost"),metroPort:function(e){if(void 0!==e){if("number"!=typeof e)throw new l("INVALID_ARGS","Invalid open runtime metroPort: expected integer.");return aM(e)}}(t.metroPort),bundleUrl:aR(t.bundleUrl,"bundleUrl"),launchUrl:aR(t.launchUrl,"launchUrl")}}({runtime:t.runtime,sessionName:a,platform:aP(te(n))});return void 0===t.runtime?{runtime:function(e,t,r){let a=e.getRuntimeHints(t);if(!a)return;let n=r?te(r):void 0,i=aP(n);if(a.platform&&r&&!i)throw new l("INVALID_ARGS",`Session runtime hints are only supported on iOS and Android sessions, but session "${t}" is bound to ${n}.`);if(a.platform&&i&&a.platform!==i)throw new l("INVALID_ARGS",`Session runtime hints target ${a.platform}, but session "${t}" is bound to ${n}. Clear the runtime hints or use a different session.`);return i&&a.platform!==i?{...a,platform:i}:a}(r,a,n),previousRuntime:i,replacedStoredRuntime:!1}:{runtime:o&&ax(o)>0?o:void 0,previousRuntime:i,replacedStoredRuntime:!0}}(e)}}catch(t){let e=o(t);return U(e.code,e.message,e.details)}}({req:t,sessionStore:a,sessionName:r,device:n});if(!f.ok)return{type:"response",response:f};if(u){let{runtime:e,previousRuntime:t,replacedStoredRuntime:r}=f.data;await aL({replacedStoredRuntime:r,previousRuntime:t,runtime:e,session:u})}return{type:"details",details:{appBundleId:p,appName:c,runtime:f.data.runtime}}}async function aZ(e){let{device:t,surface:r,openTarget:a,existingAppBundleId:n}=e,i=await aG(r);return{appBundleId:i.appBundleId??await aW(t,a,n,aj),appName:i.appName??a}}let a0=new Map;async function a1(e){let{device:t,closeTarget:r,outFlag:a,context:n}=e;tn(t.platform)&&!r9(t)&&await N(t.id),await f(t,"close",[r],a,n),await at(t,300)}async function a3(e){var t,r;let a,{runtime:n,device:i,req:o,logPath:s,appBundleId:l,traceLogPath:u,openPositionals:d}=e,p=n?.launchUrl;if(!p||0===d.length||d.length>1)return;let c=d[0]?.trim();!c||tY(c)||await f(i,"open",[p],o.flags?.out,{...(t=s,r=o.flags,a=e_(t,r,l,u),delete a.launchConsole,delete a.launchArgs,a)})}async function a2(e){var t,r,a,n;let i,{req:o,sessionName:s,sessionStore:l,logPath:u,device:d,openTarget:p,openPositionals:c,appName:m,surface:h,appBundleId:g,runtime:w,existingSession:v}=e,y=o.flags?.relaunch===!0,A=v?.trace?.outPath,b=g,S=Date.now(),I={},_=to(d)&&"app"===h&&c.length>0&&!!b,k=tu({req:o,logPath:u,appBundleId:b,traceLogPath:A}),N=o.flags?.maestro?.prewarmRunnerBeforeOpen===!0,D=!1,x=!1,M=(e=k)=>{D=!0,I.runnerPrewarmKind="session",I.runnerPrewarmScheduled=!0,i=eY(d,e)},P=async()=>{if(!i||x)return;x=!0;let e=Date.now();await i,I.runnerPrewarmWaited=!0,I.runnerPrewarmDurationMs=Math.max(0,Date.now()-e)};_&&r9(d)&&!N&&M();let L=y&&!!p&&1===c.length&&r9(d)&&o.flags?.clearAppState!==!0;if(y&&p&&!L){let e=b??p,t=Date.now();await a1({device:d,closeTarget:e,outFlag:o.flags?.out,context:{...e_(u,o.flags,b??v?.appBundleId,A)}}),I.relaunchCloseDurationMs=Math.max(0,Date.now()-t)}let O=Date.now();await af({device:d,appId:b,runtime:w}),I.runtimeHintsDurationMs=Math.max(0,Date.now()-O),_&&N&&(M({...k,propagateError:!0}),await P());let C=Date.now(),E=await a5({req:o,sessionName:s,sessionStore:l,device:d,surface:h,sessionAppBundleId:b,appName:m,existingSession:v});if("response"===E.type)return E.response;let F=E.session??v;await f(d,"open",c,o.flags?.out,{...e_(u,o.flags,b),...L?{terminateRunningApp:!0}:{}}),I.openDispatchDurationMs=Math.max(0,Date.now()-C);let q=Date.now();await a3({runtime:w,device:d,req:o,logPath:u,appBundleId:b,traceLogPath:A,openPositionals:c}),I.launchUrlDurationMs=Math.max(0,Date.now()-q),_&&!D&&M(),y?await P():i&&!x&&(I.runnerPrewarmWaited=!1),b=await az(d,p,b),"android"===d.platform&&b&&await eG(d,b);let T=p?(t=b,{durationMs:Math.max(0,Date.now()-C),measuredAt:new Date().toISOString(),method:aF,appTarget:p,appBundleId:t}):void 0,G=Date.now();if(await at(d,300),I.postOpenSettleDurationMs=Math.max(0,Date.now()-G),eM(o.meta?.requestId)){let e=V();return U(e.code,e.message,e.details)}v&&e4(v,"open",v.snapshot);let H=aT({existingSession:F,sessionName:v?.name??R(o),sessionScope:v?.sessionScope??ej(o),device:d,surface:h,appBundleId:b,appName:m,saveScript:!!o.flags?.saveScript});H.lease=eS({req:o,existingLease:v?.lease}),void 0!==o.runtime&&(r=l,a=s,(n=w)&&(0===ax(n)?r.clearRuntimeHints(a):r.setRuntimeHints(a,n)));let B=l.ensureSessionDir(s),K=$(B,o.meta?.requestId??tZ().requestId);I.totalDurationMs=Math.max(0,Date.now()-S),t3({level:"info",phase:"open_timing",durationMs:I.totalDurationMs,data:I});let j=function(e){let{sessionName:t,sessionStateDir:r,runnerLogPath:a,requestLogPath:n,appName:i,appBundleId:o,surface:s,startup:l,timing:u,device:d,runtime:p,runtimeHintCount:c}=e,f={session:t,surface:s,sessionStateDir:r,runnerLogPath:a,requestLogPath:n};return i&&(f.appName=i),o&&(f.appBundleId=o),l&&(f.startup=l),u&&(f.timing=u),p&&c(p)>0&&(f.runtime=p),d&&(f.platform=te(d),f.target=d.target??"mobile",f.device=d.name,f.id=d.id,f.kind=d.kind,"android"===d.platform&&(f.serial=d.id)),d&&to(d)&&(f.device_udid=d.id,f.ios_simulator_device_set=d.simulatorSetPath??null),{...f,...tI(`Opened: ${i??o??t}`)}}({sessionName:H.name,sessionStateDir:B,runnerLogPath:ev(B),requestLogPath:K,appName:m,appBundleId:b,surface:h,startup:T,timing:I,device:d,runtime:w,runtimeHintCount:ax});return l.recordAction(H,{command:"open",positionals:c,flags:o.flags??{},runtime:void 0!==o.runtime?w:void 0,result:j}),l.set(s,H),{ok:!0,data:j}}async function a5(e){let{req:t,sessionName:r,sessionStore:a,device:n,surface:i,sessionAppBundleId:o,appName:s,existingSession:l}=e,u=t.internal?.openLifecycle?.beforeDispatch;if(!u)return{type:"session",session:l};let d=aT({existingSession:l,sessionName:l?.name??R(t),sessionScope:l?.sessionScope??ej(t),device:n,surface:i,appBundleId:o,appName:s,saveScript:!!t.flags?.saveScript});d.lease=eS({req:t,existingLease:l?.lease}),a.set(r,d);let p=await u(d);return p&&!p.ok?{type:"response",response:p}:{type:"session",session:a.get(r)??d}}async function a4(e){let{req:t,sessionName:r,logPath:a,sessionStore:n}=e,i=n.get(r);if(i){let e=t.flags?.relaunch===!0,o=t.positionals?.[0],s=o??(e?i.appName:void 0),l=aY(i.device,t.flags?.surface,s,i.surface);if("string"!=typeof l)return l;if(!s&&"app"===l)return e?aJ("open --relaunch requires an app name or an active session app."):aJ("Session already active. Close it first or pass a new --session name.");let u=aX({shouldRelaunch:e,openTarget:s,surface:l,device:i.device});if(u)return u;let d=await aa(i.device),p=await aQ({req:t,sessionName:r,sessionStore:n,device:d,surface:l,openTarget:s,existingSession:i,onIosSimulatorColdBootStart:tp({req:t,logPath:a,device:d,surface:l,openTarget:s,traceLogPath:i.trace?.outPath})});return"response"===p.type?p.response:await a2({req:t,sessionName:r,sessionStore:n,logPath:a,device:d,openTarget:s,openPositionals:o?t.positionals??[]:s?[s]:[],appBundleId:p.details.appBundleId,appName:p.details.appName,runtime:p.details.runtime,surface:l,existingSession:i})}let o=t.flags?.relaunch===!0,s=t.positionals?.[0];if(o&&!s)return aJ("open --relaunch requires an app argument.");let l=function(e){let{shouldRelaunch:t,openTarget:r,platform:a}=e;return t?r&&tY(r)?aJ("open --relaunch does not support URL targets."):"android"===a&&r&&"binary"===tB(r)?aJ(tX(r)):null:null}({shouldRelaunch:o,openTarget:s,platform:t.flags?.platform==="android"?"android":void 0});if(l)return l;let u=await J(t.flags??{}),d=aY(u,t.flags?.surface,s);if("string"!=typeof d)return d;let p=aX({shouldRelaunch:o,openTarget:s,surface:d,device:u});return p||await z(a0,u.id,async()=>{let e=n.toArray().find(e=>e.device.id===u.id);if(e)return ew(t,e)?U("DEVICE_IN_USE","Device is already in use by another workspace session.",{deviceId:u.id,deviceName:u.name,hint:"Use a different device selector, wait for the other workspace to close its session, or run agent-device devices to choose another target."}):U("DEVICE_IN_USE",`Device is already in use by session "${e.name}".`,{session:e.name,deviceId:u.id,deviceName:u.name,hint:W(e,"device-in-use")});let i=await aQ({req:t,sessionName:r,sessionStore:n,device:u,surface:d,openTarget:s,onIosSimulatorColdBootStart:tp({req:t,logPath:a,device:u,surface:d,openTarget:s})});return"response"===i.type?i.response:await a2({req:t,sessionName:r,sessionStore:n,logPath:a,device:u,openTarget:s,openPositionals:t.positionals??[],appBundleId:i.details.appBundleId,appName:i.details.appName,runtime:i.details.runtime,surface:d})})}async function a8(e){if(!1===e.booted)return{success:!0,exitCode:0,stdout:"",stderr:""};try{return r9(e)?await a6(e):await a9(e)}catch(t){let e=s(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function a6(e){let t=await t2(e);return t.success?t:"Shutdown"===await a7(e)?{...t,success:!0,exitCode:0}:t}async function a7(e){try{return await t5(e)}catch{return null}}async function a9(e){let t=await tG(e,["emu","kill"],{allowFailure:!0,timeoutMs:15e3});return{success:0===t.exitCode,exitCode:t.exitCode,stdout:String(t.stdout??""),stderr:String(t.stderr??"")}}async function ne(e){let{device:t,shutdownRequested:r}=e;if(r&&(r9(t)||"android"===t.platform&&"emulator"===t.kind))return await a8(t)}async function nt(e){let t,{req:r,sessionName:a,logPath:n,sessionStore:i,leaseRegistry:o,leaseLifecycleProvider:s}=e,l=i.get(a);if(!l)return await nr(r,n);try{var u,d,p;(await eq(l),await et(l,"session-close"),await L(l),await em(l),await eT(l),u=r,d=l,p=u,(p.positionals?.length??0)>0||"web"===d.device.platform)&&(tn(l.device.platform)&&!r9(l.device)&&await F(l),await f(l.device,"close",r.positionals??[],r.flags?.out,{...e_(n,r.flags,l.appBundleId,l.trace?.outPath)}),await at(l.device,300));tn(l.device.platform)&&(!r9(l.device)||r.flags?.shutdown||l.recording||l.lease||l.device.simulatorSetPath)?await F(l):tn(l.device.platform)&&(t3({level:"debug",phase:"ios_runner_retained_after_close",data:{session:l.name,deviceId:l.device.id}}),_(l.device.id));let e=i.getRuntimeHints(a);ac(e)&&l.appBundleId&&await am({device:l.device,appId:l.appBundleId}).catch(()=>{}),tF(i,l,r,"close",{session:l.name,...tI(`Closed: ${l.name}`)}),r.flags?.saveScript&&(l.recordSession=!0),i.writeSessionLog(l),await el(a).catch(()=>{})}finally{try{t=await K({session:l,leaseRegistry:o,leaseLifecycleProvider:s})}finally{i.delete(a)}}let c=await ne({device:l.device,shutdownRequested:r.flags?.shutdown});return c?{ok:!0,data:tP({session:l.name,shutdown:c,...t?{provider:t}:{}},`Closed: ${l.name}`)}:{ok:!0,data:{session:l.name,...tI(`Closed: ${l.name}`),...t?{provider:t}:{}}}}async function nr(e,t){if(!e.positionals||0===e.positionals.length)return U("SESSION_NOT_FOUND","No active session");let r=await ar({session:void 0,flags:e.flags,ensureReady:!0});return await f(r,"close",e.positionals,e.flags?.out,{...e_(t,e.flags)}),await at(r,300),{ok:!0,data:{app:e.positionals[0],...tI(`Closed: ${e.positionals[0]}`)}}}let na={ios:async(e,t,r)=>{let a=await v(e,t,r,{relaunch:!0,appIdentifierHint:t});if(a)return{bundleId:a.bundleId??a.launchTarget??t};let{reinstallIosApp:n}=await import("./apps.js");return await n(e,t,r)},android:async(e,t,r)=>{let a=await v(e,t,r,{relaunch:!0,packageNameHint:t});if(a)return{package:a.packageName??a.launchTarget??t};let{reinstallAndroidApp:n}=await import("./3340.js");return await n(e,t,r)}},nn={ios:async(e,t,r)=>{let a=await v(e,t,r,{appIdentifierHint:t});if(a)return{bundleId:a.bundleId,appName:a.appName,launchTarget:a.launchTarget};let{installIosApp:n}=await import("./apps.js"),i=await n(e,r,{appIdentifierHint:t});return{bundleId:i.bundleId,appName:i.appName,launchTarget:i.launchTarget}},android:async(e,t,r)=>{let a=await v(e,t,r,{packageNameHint:t});if(a)return{package:a.packageName,appName:a.appName,launchTarget:a.launchTarget};let{installAndroidApp:n}=await import("./3340.js"),i=await n(e,r);return{package:i.packageName,appName:i.appName,launchTarget:i.launchTarget}}};async function ni(e){let{req:r,command:a,sessionName:n,sessionStore:i,deployOps:o}=e,s=i.get(n),l=r.flags??{},u=ae(a,s,l);if(u)return u;let d=function(e,t){let r=t[0]?.trim(),a=t[1]?.trim();if("install"===e){let e=a??r;return e?{ok:!0,app:a?r??"":"",appPathInput:e}:{ok:!1,response:U("INVALID_ARGS","install requires: install <path-to-app-binary>")}}return r&&a?{ok:!0,app:r,appPathInput:a}:{ok:!1,response:U("INVALID_ARGS","reinstall requires: reinstall <app> <path-to-app-binary>")}}(a,r.positionals??[]);if(!d.ok)return d.response;let{app:p,appPathInput:c}=d,f=r.meta?.uploadedArtifactId;try{var m,h,g,w,v,y,A;let e,n,u=f?eC(f,r.meta?.tenantId):eN.expandHome(c);if(!t.existsSync(u))return U("INVALID_ARGS",`App binary not found: ${u}`);let d=await ar({session:s,flags:l,ensureReady:!1}),b=Q(a,d);if(b)return b;let S=to(d)?(m=p,h=u,e=(g=await o.ios(d,p,u)).bundleId,{app:m||e||g.launchTarget||h,appPath:h,platform:"ios",...e?{appId:e,bundleId:e}:{},appName:g.appName,launchTarget:g.launchTarget}):(w=p,v=u,n=(y=await o.android(d,p,u)).package,{app:w||n||y.launchTarget||v,appPath:v,platform:"android",...n?{appId:n,package:n,packageName:n}:{},appName:y.appName,launchTarget:y.launchTarget}),I=tP(S,(A=S,`Installed: ${A.appName??tk(A)}`));return tF(i,s,r,a,I),{ok:!0,data:I}}finally{f&&O(f)}}async function no(e,t,r){return await t4(e,t,r)}async function ns(e){let{req:t,sessionName:r,sessionStore:a}=e;if("session_list"===t.command){let e=ej(t);return{ok:!0,data:{sessions:a.toArray().filter(t=>m(t,e)).map(e=>{let t=a.resolveSessionDir(e.name);return{name:e.name,sessionStateDir:t,runnerLogPath:ev(t),platform:te(e.device),...tn(e.device.platform)&&e.device.appleOs?{appleOs:e.device.appleOs}:{},target:e.device.target??"mobile",surface:e.surface??"app",device:e.device.name,id:e.device.id,device_id:e.device.id,createdAt:e.createdAt,...tn(e.device.platform)&&!e7(e.device)&&{device_udid:e.device.id,ios_simulator_device_set:e.device.simulatorSetPath??null}}})}}}if("devices"===t.command)try{let e=tJ(t.flags?.androidDeviceAllowlist),r=t.flags?.platform,a=e9({simulatorSetPath:tH(t.flags?.iosSimulatorDeviceSet),platform:r,target:t.flags?.target}),n=await ek({platform:r,target:t.flags?.target,deviceName:t.flags?.device,udid:t.flags?.udid,serial:t.flags?.serial,iosSimulatorSetPath:a,androidSerialAllowlist:e?Array.from(e).sort():void 0}),i=r?n.filter(e=>{var t,a;return t=e,a=r,ta(t,a)}):n,o=(t.flags?.target?i.filter(e=>(e.target??"mobile")===t.flags?.target):i).map(({simulatorSetPath:e,appleOs:t,...r})=>({...r,platform:te({platform:r.platform,appleOs:t}),...tn(r.platform)&&t?{appleOs:t}:{}}));return{ok:!0,data:{devices:o}}}catch(t){let e=o(t);return U(e.code,e.message,e.details)}if("apps"===t.command){let e=a.get(r),n=t.flags??{},i=ae(t.command,e,n);if(i)return i;let o=await ar({session:e,flags:n,ensureReady:!0}),s=Q("apps",o);if(s)return s;let l=t6(t.flags?.appsFilter);return tn(o.platform)?{ok:!0,data:{apps:(await t7(o,l)).map(e=>e.name&&e.name!==e.bundleId?`${e.name} (${e.bundleId})`:e.bundleId)}}:{ok:!0,data:{apps:(await tQ(o,l)).map(e=>e.name&&e.name!==e.package?`${e.name} (${e.package})`:e.package)}}}return null}async function nl(e){let{ensureAndroidEmulatorBooted:t}=await import("./3340.js");return await t(e)}let nu='iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).',nd='macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").';async function np(e){let{req:t,sessionName:r,sessionStore:a}=e,n=a.get(r),i=t.flags??{},o=i.platform;if(!n&&"string"==typeof i?.session&&i.session.trim().length>0)return U("SESSION_NOT_FOUND","ios"===o?`No active session "${r}". Run open with --session ${r} first.`:`No active session "${r}". Run open with --session ${r} first, or omit --session to query by device selector.`);let s=ae("appstate",n,i);if(s)return s;let l=tn(n?.device.platform)&&!!n&&0===eF(n,i).length;if("ios"===o&&!l)return U("SESSION_NOT_FOUND",nu);if("macos"===o&&!l)return U("SESSION_NOT_FOUND",nd);if(l&&n){let e=n.appName??n.appBundleId;if(!n.appName&&!n.appBundleId){if(e7(n.device)&&n.surface&&"app"!==n.surface&&"frontmost-app"!==n.surface)return{ok:!0,data:{platform:te(n.device),appName:n.surface,appBundleId:n.appBundleId,source:"session",surface:n.surface}};let e=e7(n.device)?"macOS":"iOS";return U("COMMAND_FAILED",`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}return{ok:!0,data:{platform:te(n.device),appName:e??"unknown",appBundleId:n.appBundleId,source:"session",surface:n.surface??"app",...to(n.device)?{device_udid:n.device.id,ios_simulator_device_set:n.device.simulatorSetPath??null}:{}}}}let u=await ar({session:n,flags:i,ensureReady:!0});if(to(u))return U("SESSION_NOT_FOUND",nu);if(e7(u))return U("SESSION_NOT_FOUND",nd);if("web"===u.platform)return U("UNSUPPORTED_OPERATION","appstate is not supported on web.");let{getAndroidAppState:d}=await import("./3340.js"),p=await d(u);return{ok:!0,data:{platform:"android",package:p.package,activity:p.activity}}}async function nc(e){let{req:t,sessionName:r,logPath:a,sessionStore:n}=e;if("boot"===t.command){let e,i=n.get(r),s=t.flags??{},l=ae(t.command,i,s);if(l)return l;let u="android"===(s.platform??i?.device.platform),d=!0===s.headless;if(d&&!u)return U("INVALID_ARGS","boot --headless is supported only for Android emulators.");let p=an({flags:s,sessionDevice:i?.device}),c=u&&!!p,f=!1;try{e=await ar({session:i,flags:s,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0})}catch(r){let t=o(r);if(u&&d&&!p&&"DEVICE_NOT_FOUND"===t.code)return U("INVALID_ARGS","boot --headless requires --device <avd-name> (or an Android emulator session target).");if(!c||"DEVICE_NOT_FOUND"!==t.code||!p)throw r;e=await nl({avdName:p,serial:s.serial,headless:d}),f=!0}if(s.target&&(e.target??"mobile")!==s.target)return U("DEVICE_NOT_FOUND",`No ${e.platform} device found matching --target ${s.target}.`);if(u&&d){if("android"!==e.platform||"emulator"!==e.kind)return U("INVALID_ARGS","boot --headless is supported only for Android emulators.");if(!f){let t=an({flags:s,sessionDevice:i?.device,resolvedDevice:e});if(!t)return U("INVALID_ARGS","boot --headless requires --device <avd-name> (or an Android emulator session target).");e=await nl({avdName:t,serial:s.serial,headless:!0})}await ts(e)}else"android"===e.platform&&"emulator"===e.kind&&!0!==e.booted?(e=await nl({avdName:e.name,serial:s.serial,headless:!1}),await ts(e)):("android"!==e.platform||!0!==e.booted)&&await ts(e,{onIosSimulatorColdBootStart:td({req:t,logPath:a,device:e,enabled:!0})});let m=Q("boot",e);return m||{ok:!0,data:{platform:te(e),target:e.target??"mobile",device:e.name,id:e.id,kind:e.kind,booted:!0,...tn(e.platform)&&e.appleOs?{appleOs:e.appleOs}:{}}}}if("shutdown"===t.command){var i;let e,a=n.get(r),o=t.flags??{},s=ae(t.command,a,o);if(s)return s;let l=await ar({ensureReady:!1,flags:o,session:a}),u=Q("shutdown",l,{message:"shutdown is supported only for Apple simulators and Android emulators."});if(u)return u;if(a&&a.device.platform===l.platform&&a.device.id===l.id)return U("DEVICE_IN_USE","Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.",{hint:`Run agent-device close --shutdown --session ${r}`,session:r,platform:te(l),target:l.target??"mobile",device:l.name,id:l.id,kind:l.kind});let d=await a8(l);return d.success?{ok:!0,data:{platform:te(l),target:l.target??"mobile",device:l.name,id:l.id,kind:l.kind,shutdown:d,...tn(l.platform)&&l.appleOs?{appleOs:l.appleOs}:{}}}:U(d.error?.code??"COMMAND_FAILED",(i=d,(e=i.error?.message??i.stderr.trim()).length>0?e:"Shutdown failed"),{platform:te(l),target:l.target??"mobile",device:l.name,id:l.id,kind:l.kind,shutdown:d})}return"appstate"===t.command?await np({req:t,sessionName:r,sessionStore:n}):null}async function nf(e,t={}){var r,a,n;let i,o,s,l,u=(s=(o=(i=function(e){let t=[];for(let r of e){if("open"!==r.command)continue;let e=r.result?.startup;e&&"object"==typeof e&&"number"==typeof e.durationMs&&Number.isFinite(e.durationMs)&&"string"==typeof e.measuredAt&&0!==e.measuredAt.trim().length&&e.method===aF&&t.push({durationMs:Math.max(0,Math.round(e.durationMs)),measuredAt:e.measuredAt,method:aF,appTarget:"string"==typeof e.appTarget&&e.appTarget.length>0?e.appTarget:void 0,appBundleId:"string"==typeof e.appBundleId&&e.appBundleId.length>0?e.appBundleId:void 0})}return t.slice(-20)}((r=e).actions)).at(-1))?{available:!0,lastDurationMs:o.durationMs,lastMeasuredAt:o.measuredAt,method:aF,sampleCount:i.length,samples:i}:{available:!1,reason:"No startup sample captured yet. Run open <app|url> in this session first.",method:aF},{session:r.name,platform:te(r.device),device:r.device.name,deviceId:r.device.id,metrics:{startup:s,...{fps:ng(),memory:{available:!1,reason:aq},cpu:{available:!1,reason:aq}}},sampling:{startup:{method:aF,description:"Elapsed wall-clock time around dispatching the open command for the active session app target.",unit:"ms"},..."android"===(a=r).device.platform?{memory:{method:e2,description:eW,unit:"kB"},cpu:{method:eD,description:ey,unit:"percent"},fps:{method:C,description:eH,unit:"percent",primaryField:"droppedFramePercent",window:"since previous Android gfxinfo reset or app process start",resetsAfterRead:!0,relatedActionsLimit:12}}:es(a.device)}});return nb(e)&&(e.appBundleId?"android"===e.device.platform?await nw(u,e,e.appBundleId,t):await nv(u,e,e.appBundleId):(n=u,l=nS(e),n.metrics.fps={available:!1,reason:l},n.metrics.memory={available:!1,reason:l},n.metrics.cpu={available:!1,reason:l})),u}async function nm(e,t={}){var r,a;let n={session:(r=e).name,platform:te(r.device),device:r.device.name,deviceId:r.device.id,metrics:{fps:ng()},sampling:{fps:"android"===(a=r).device.platform?{method:C,description:eH,unit:"percent",primaryField:"droppedFramePercent",window:"since previous Android gfxinfo reset or app process start",resetsAfterRead:!0,relatedActionsLimit:12}:E(a.device)}};return nb(e)&&(e.appBundleId?await nA(n,e,e.appBundleId,t):n.metrics.fps={available:!1,reason:nS(e)}),n}async function nh(e,t){var r,a;let n={session:(r=e).name,platform:te(r.device),device:r.device.name,deviceId:r.device.id,sampling:{memory:"android"===(a=r).device.platform?{method:e2,description:eW,unit:"kB",topConsumerLimit:5}:es(a.device).memory,snapshot:"android"===r.device.platform?{method:en,description:er,defaultKind:"android-hprof",artifactOnly:!0}:{method:ez,description:c,defaultKind:"memgraph",artifactOnly:!0}}};if(!nb(e)){if("snapshot"===t.action){let r=nx(e,t.kind);return n.artifact=nR(e,r),n.support=nP(n.artifact.support)??nM(e),n}return n.metrics={memory:{available:!1,reason:aq}},n}return"sample"===t.action?n.metrics={memory:await nk(e,t)}:(n.artifact=await nD(e,t),n.support=nP(n.artifact.support)??nM(e)),n}function ng(){return{available:!1,reason:"Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions."}}async function nw(e,t,r,a){let n=await nI(t,r,a);ny(e,t,n)}async function nv(e,t,r){let a=await n_(t,r);ny(e,t,a)}function ny(e,t,r){e.metrics.memory=nO(r.memory),e.metrics.cpu=nO(r.cpu),e.metrics.fps=n$(nO(r.fps),t)}async function nA(e,t,r,a){let n="android"===t.device.platform?await nL(e3(t.device,r,{adb:a.androidAdb})):await nL(y(t.device,r));e.metrics.fps=n$(nO(n),t)}function nb(e){return ed(e.device.platform)?.perf?.supportsMetrics(e.device)??!1}function nS(e){return"android"===e.device.platform?"No Android app package is associated with this session. Run open <app> first.":"No Apple app bundle ID is associated with this session. Run open <app> first."}async function nI(e,t,r){let a={adb:r.androidAdb},[n,i,o]=await Promise.allSettled([X(e.device,t,a),ea(e.device,t,a),e3(e.device,t,a)]);return{memory:n,cpu:i,fps:o}}async function n_(e,t){let r=await nL(y(e.device,t)),a=await nL(e1(e.device,t));if("fulfilled"===a.status){let e=a.value;return{memory:{status:"fulfilled",value:e.memory},cpu:{status:"fulfilled",value:e.cpu},fps:r}}return{memory:{status:"rejected",reason:a.reason},cpu:{status:"rejected",reason:a.reason},fps:r}}async function nk(e,t){return e.appBundleId?nO("android"===e.device.platform?await nL(X(e.device,e.appBundleId,{adb:t.androidAdb})):await nL(nN(e))):{available:!1,reason:nS(e)}}async function nN(e){if(!e.appBundleId)throw new l("INVALID_ARGS",nS(e));return(await e1(e.device,e.appBundleId)).memory}async function nD(e,t){if(!e.appBundleId)throw new l("INVALID_ARGS",nS(e),{hint:"Run open <app> first so perf memory snapshot can resolve the app process."});let a=nx(e,t.kind),n=function(e,t){if(e.out)return eN.expandHome(e.out,e.cwd);let a=new Date().toISOString().replace(/[:.]/g,"-"),n=e.sessionStore.ensureSessionDir(e.sessionName);return r.join(n,"artifacts",`memory-${t}-${a}.${"android-hprof"===t?"hprof":"memgraph"===t?"memgraph":"artifact"}`)}(t,a);return"android"===e.device.platform?"android-hprof"!==a?nR(e,a):await D(e.device,e.appBundleId,n,{adb:t.androidAdb}):"memgraph"!==a?nR(e,a):await A(e.device,e.appBundleId,n)}function nx(e,t){return t||("android"===e.device.platform?"android-hprof":"memgraph")}function nR(e,t){var r,a;let n=nM(e),i=(r=e,a=t,"android"===r.device.platform?{reason:`Android perf memory snapshot supports android-hprof, not ${a}.`,hint:"Use perf memory snapshot --kind android-hprof for Android Java heap artifacts."}:tn(r.device.platform)?{reason:`Apple perf memory snapshot supports memgraph, not ${a}.`,hint:"Use perf memory snapshot --kind memgraph for supported Apple app sessions."}:{reason:`Memory snapshot artifacts are not supported on ${r.device.platform}.`,hint:"Use perf memory sample where supported, or run the snapshot against Android, iOS simulator, or macOS."});return{available:!1,kind:t,reason:i.reason,hint:i.hint,support:n}}function nM(e){return"android"===e.device.platform?{platform:e.device.platform,defaultKind:"android-hprof",androidHprof:!0,memgraph:!1,heapprofd:!1,heapprofdDecision:"Deferred until Android Perfetto/heapprofd plumbing is available in the perf trace slice."}:tn(e.device.platform)?{...ex(e.device),androidHprof:!1,heapprofd:!1,heapprofdDecision:"Deferred because heapprofd is Android/Perfetto-specific and outside this memory artifact slice."}:{platform:e.device.platform,defaultKind:"memgraph",androidHprof:!1,memgraph:!1,heapprofd:!1,reason:"Memory snapshot artifacts are available only on Android, iOS simulator, and macOS.",hint:"Use perf memory sample where supported, or switch to a platform with memory artifact support.",heapprofdDecision:"Deferred because heapprofd is Android/Perfetto-specific and outside this memory artifact slice."}}function nP(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:void 0}async function nL(e){try{return{status:"fulfilled",value:await e}}catch(e){return{status:"rejected",reason:e}}}function nO(e){if("fulfilled"===e.status)return{available:!0,...e.value};let t=s(e.reason);return{available:!1,reason:t.message,error:t}}function n$(e,t){var r,a;let n,i;if(!0!==e.available)return e;let o=(r=t.actions,n=nC((a=e).windowStartedAt),i=nC(a.windowEndedAt)??nC(a.measuredAt),void 0===n||void 0===i?[]:r.filter(e=>e.ts>=n&&e.ts<=i).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:function(e){let t=e.result;if(t)for(let e of["refLabel","ref","appName","appBundleId"]){let r=t[e];if("string"==typeof r&&r.length>0)return r}}(e)})).slice(-12));return 0===o.length?e:{...e,relatedActions:o}}function nC(e){if("string"!=typeof e)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}async function nE(e){var t,r,a,n,i,o,l,u,d,p;let c,f,m,h,g,w,v=(t=e.req,r=e.area,c=(a=t,n=r,"string"==typeof a.flags?.out&&a.flags.out.length>0?a.flags.out:(a.positionals??[])["cpu"===n?5:4]||void 0),"cpu"===r?(i=t,o=c,f=nV(i,1),m=nV(i,2),h=nV(i,3),tf(f)?"start"!==(l=m)&&"stop"!==l&&"report"!==l?U("INVALID_ARGS","perf cpu profile action must be start, stop, or report"):"simpleperf"!==h?U("INVALID_ARGS","perf cpu profile requires --kind simpleperf"):{ok:!0,area:"cpu",subject:f,action:m,kind:h,outPath:o}:U("INVALID_ARGS",tV)):(u=t,d=c,g=nV(u,1),w=nV(u,2),"start"!==(p=g)&&"stop"!==p?U("INVALID_ARGS","perf trace action must be start or stop"):tA(w)?"perfetto"!==w?U("INVALID_ARGS","perf trace requires --kind perfetto"):{ok:!0,area:"trace",action:g,kind:w,outPath:d}:U("INVALID_ARGS",tD)));if(!v.ok)return v;let{session:y}=e;if("android"!==y.device.platform)return U("UNSUPPORTED_OPERATION","Android native perf collectors are supported only on Android sessions.");if(!y.appBundleId)return U("COMMAND_FAILED","No Android app package is associated with this session.",{hint:"Run open <app> first so perf can resolve the package and process identity."});try{let t="cpu"===v.area?await nT(e,y,y.appBundleId,v):await nU(e,y,y.appBundleId,v);return{ok:!0,data:t}}catch(e){return{ok:!1,error:s(e)}}}function nV(e,t){return(e.positionals?.[t]??"").toLowerCase()}function nF(e,t){var r;return e.sessionStore.set(e.sessionName,{...e.session,nativePerf:{android:t}}),{action:(r=t).action,platform:"android",type:r.type,kind:r.kind,packageName:r.packageName,appPid:r.appPid,profilerPid:r.profilerPid,state:r.state,startedAt:new Date(r.startedAt).toISOString(),stoppedAt:"number"==typeof r.stoppedAt?new Date(r.stoppedAt).toISOString():void 0,durationMs:r.durationMs,outPath:r.outPath,sizeBytes:r.sizeBytes,remotePath:r.remotePath,method:r.method,summary:r.summary,message:r.message}}function nq(e,t,a){var n,i,o;let s;return t?eN.expandHome(t,e.req.meta?.cwd):(n=e.sessionStore,i=e.sessionName,o=a,s=new Date().toISOString().replace(/[:.]/g,"-"),r.join(n.ensureSessionDir(i),`${s}-${o}`))}async function nT(e,t,r,a){if("start"===a.action){nG(t);let n=nq(e,a.outPath,"cpu.perf.data"),i=await w(t.device,r,n,{adb:e.androidAdbExecutor});return nF(e,i)}let n=nB(t,"cpu-profile",a.kind);if("report"===a.action){await function(e){if("running"===e.state)throw new l("COMMAND_FAILED","Stop the Android Simpleperf CPU profile before generating a report.",{hint:"Run perf cpu profile stop --kind simpleperf, then retry perf cpu profile report --kind simpleperf."})}(n);let r=nq(e,a.outPath,"cpu-report.json");return await eJ(t.device,n,r,{adb:e.androidAdbExecutor})}let i=nH(e,a.outPath,n),o=await eI(t.device,n,i,{adb:e.androidAdbExecutor});return nF(e,o)}async function nU(e,t,r,a){if("start"===a.action){nG(t);let n=nq(e,a.outPath,"app.perfetto-trace"),i=await k(t.device,r,n,{adb:e.androidAdbExecutor});return nF(e,i)}let n=nB(t,"trace",a.kind),i=nH(e,a.outPath,n),o=await eR(t.device,n,i,{adb:e.androidAdbExecutor});return nF(e,o)}function nG(e){let t=e.nativePerf?.android;if(t?.state==="running")throw new l("COMMAND_FAILED",`Android ${t.kind} ${t.type} is already running for this session.`,{hint:"cpu-profile"===t.type?"Run perf cpu profile stop --kind simpleperf before starting another Android native perf capture.":"Run perf trace stop --kind perfetto before starting another Android native perf capture."})}function nH(e,t,r){return t?nq(e,t,r.outPath):r.outPath}function nB(e,t,r){let a=e.nativePerf?.android;if(a?.type===t&&a.kind===r)return a;throw new l("COMMAND_FAILED",`No Android ${r} ${t} is active for this session.`,{hint:"cpu-profile"===t?"Run perf cpu profile start --kind simpleperf first, then stop or report in the same session.":"Run perf trace start --kind perfetto first, then stop in the same session."})}async function nK(e){if(!b(e))return;let{macOsScreenCaptureKitAudioProbeBackend:t}=await import("./audio-probe.js");return t}P();let nj=["probe"],nz=["start","status","stop"],nW=`audio probe requires ${nz.join(", ")}`;async function nJ(e){let t=function(e){var t;let r,a=(r=(t=e).sessionStore.get(t.sessionName))?e0("audio",r.device)?{ok:!0,session:r}:U("UNSUPPORTED_OPERATION","audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts"):U("SESSION_NOT_FOUND","audio requires an active session");if(!a.ok)return a;let n=function(e){let t,r;if(t=(e.positionals?.[0]??"probe").toLowerCase(),nj.includes(t)?!"probe":!void 0)return U("INVALID_ARGS","audio requires probe");let a=(r=(e.positionals?.[1]??"status").toLowerCase(),nz.includes(r)?r:void 0);return a?{ok:!0,probeAction:a}:U("INVALID_ARGS",nW)}(e.req);if(!n.ok)return n;let i=function(e,t){if("start"!==t&&e.positionals&&e.positionals.length>2)return U("INVALID_ARGS","audio probe duration and bucket are only supported with audio probe start");let r=nX(e.positionals?.[2],{defaultValue:1e4,min:100,max:12e4,message:"audio probe duration must be an integer in range 100..120000 ms"});if(r instanceof Error)return U("INVALID_ARGS",r.message);let a=nX(e.positionals?.[3],{defaultValue:1e3,min:100,max:1e4,message:"audio probe bucket must be an integer in range 100..10000 ms"});return a instanceof Error?U("INVALID_ARGS",a.message):{ok:!0,timing:{durationMs:r,bucketMs:a}}}(e.req,n.probeAction);return i.ok?{ok:!0,session:a.session,probeAction:n.probeAction,...i.timing}:i}(e);if(!t.ok)return t;let r=await nK(t.session.device);if(r)return await nY(e,t,r);let a=t9();if(!a.probeAudio)return U("UNSUPPORTED_OPERATION","audio is not supported by this web provider");try{return{ok:!0,data:await a.probeAudio({action:t.probeAction,durationMs:t.durationMs,bucketMs:t.bucketMs})}}catch(e){return{ok:!1,error:s(e)}}}async function nY(e,t,r){try{return{ok:!0,data:await G({session:t.session,sessionName:e.sessionName,sessionStore:e.sessionStore,backend:r,probeAction:t.probeAction,durationMs:t.durationMs,bucketMs:t.bucketMs})}}catch(e){return{ok:!1,error:s(e)}}}function nX(e,t){if(void 0===e)return t.defaultValue;let r=Number.parseInt(e,10);return!Number.isInteger(r)||String(r)!==e||r<t.min||r>t.max?Error(t.message):r}async function nQ(e,t){let r,a,n=(r=e.req.positionals??[],"cpu"===(a=r[0]?.toLowerCase())?function(e){if(e[1]?.toLowerCase()!=="profile")return U("INVALID_ARGS","perf cpu requires profile");let t=nZ(e[2],"perf cpu profile",!0);if(!t.ok)return t;let r=n0(e[3]);return r.ok?{ok:!0,area:"cpu",mode:"cpu-profile",action:t.value,kind:"xctrace",template:e[4]||void 0,outPath:e[5]||void 0,tracePath:e[6]||void 0}:r}(r):"trace"===a?function(e){let t=nZ(e[1],"perf trace",!1);if(!t.ok)return t;let r=n0(e[2]);return r.ok?{ok:!0,area:"trace",mode:"trace",action:t.value,kind:"xctrace",template:e[3]||void 0,outPath:e[4]||void 0,tracePath:e[5]||void 0}:r}(r):U("INVALID_ARGS",th));if(!n.ok)return n;if("android"===t.device.platform)return U("UNSUPPORTED_OPERATION","Android native profiling belongs to the Android perf rollout; Apple xctrace perf supports iOS and macOS sessions only.");if(!tn(t.device.platform))return U("UNSUPPORTED_OPERATION",`Apple xctrace perf is not supported on ${t.device.platform}.`);if(!t.appBundleId)return U("INVALID_ARGS","Apple xctrace perf requires an active app session. Run open <app> first.");try{if("start"===n.action)return await n1(e,t,n);if("stop"===n.action)return await n3(e,t,n);return await n2(e,t,n)}catch(e){return{ok:!1,error:s(e)}}}function nZ(e,t,r){let a=e?.toLowerCase();return"start"===a||"stop"===a||r&&"report"===a?{ok:!0,value:a}:U("INVALID_ARGS",r?`${t} requires start, stop, or report`:`${t} requires start or stop`)}function n0(e){return e?.toLowerCase()==="xctrace"?{ok:!0}:U("INVALID_ARGS","perf native collection currently supports --kind xctrace")}async function n1(e,t,r){if(t.applePerf?.active)return U("INVALID_ARGS","Apple xctrace perf capture already in progress");let a=r.template??("cpu-profile"===r.mode?"Time Profiler":"Animation Hitches"),n=n4(e,r),i=await eo({device:t.device,appBundleId:t.appBundleId,mode:r.mode,template:a,outPath:n});t.applePerf={...t.applePerf??{},active:i},e.sessionStore.set(e.sessionName,t);let o=n8("started",i);return n5(e,t,o),{ok:!0,data:o}}async function n3(e,t,r){var a,n,i,s,l,u,d;let p,c=t.applePerf?.active;if(!c)return U("INVALID_ARGS","no active Apple xctrace perf capture");let f=r.outPath?eN.expandHome(r.outPath,e.req.meta?.cwd):c.outPath;try{p=await x(c,f)}catch(r){throw a=r,o(a).details?.captureCleanedUp===!0&&(n=e,(i=t).applePerf={...i.applePerf??{},active:void 0},n.sessionStore.set(n.sessionName,i)),r}s=e,l=t,u=p,l.applePerf={...l.applePerf??{},active:void 0,lastMode:u.mode,..."cpu-profile"===(d=u).mode?{lastProfileTracePath:d.outPath,lastProfileTemplate:d.template}:{lastTracePath:d.outPath}},s.sessionStore.set(s.sessionName,l);let m=n8("stopped",p);return n5(e,t,m),{ok:!0,data:m}}async function n2(e,t,r){var a;let n;if("cpu-profile"!==r.mode)return U("INVALID_ARGS","perf trace does not support report");if(t.applePerf?.active)return U("INVALID_ARGS","perf cpu profile report requires a stopped profile trace; stop the active capture first.");let i=n4(e,r),o=(a=t,(n=r.tracePath??a.applePerf?.lastProfileTracePath??a.applePerf?.active?.outPath)?{ok:!0,value:n}:U("INVALID_ARGS","perf cpu profile report requires a stopped profile trace or tracePath option"));if(!o.ok)return o;let s={perf:"reported",...await M({tracePath:eN.expandHome(o.value,e.req.meta?.cwd),outPath:i,mode:r.mode,template:t.applePerf?.lastProfileTemplate??r.template,appBundleId:t.appBundleId})};return n5(e,t,s),{ok:!0,data:s}}function n5(e,t,r){tF(e.sessionStore,t,e.req,"perf",r)}function n4(e,t){if(t.outPath)return eN.expandHome(t.outPath,e.req.meta?.cwd);let r=e.sessionStore.ensureSessionDir(e.sessionName),a=new Date().toISOString().replace(/[:.]/g,"-"),n="report"===t.action?"json":"trace";return`${r}/perf-${t.mode}-${a}.${n}`}function n8(e,t){return{perf:e,kind:t.kind,mode:t.mode,template:t.template,outPath:t.outPath,appBundleId:t.appBundleId,deviceId:t.deviceId,platform:t.platform,targetPids:t.targetPids,targetProcesses:t.targetProcesses,startedAt:t.startedAt,endedAt:t.endedAt}}let n6=`logs requires ${tM.slice(0,-1).join(", ")}, or ${tM.at(-1)}`,n7=["dump","log"],n9=`network requires ${n7.join(" or ")}`,ie=`network include mode must be one of: ${tt.join(", ")}`,it={path:({session:e,sessionName:t,sessionStore:r})=>(function(e,t,r){let a=r.resolveAppLogPath(t),n=Y(a);return{ok:!0,data:{path:a,active:!!e.appLog,state:e.appLog?.getState()??"inactive",backend:e.appLog?.backend??eb(e.device),sizeBytes:n.sizeBytes,modifiedAt:n.modifiedAt,startedAt:e.appLog?.startedAt?new Date(e.appLog.startedAt).toISOString():void 0,hint:'Grep the file for token-efficient debugging, e.g. grep -n "Error\\|Exception" <path>'}}})(e,t,r),doctor:({session:e,sessionName:t,sessionStore:r})=>il(e,t,r),mark:({req:e,sessionName:t,sessionStore:r})=>{var a,n,i;let o,s;return a=e,n=t,i=r,o=a.positionals?.slice(1).join(" ")??"",h(s=i.resolveAppLogPath(n),o),{ok:!0,data:{path:s,marked:!0}}},clear:({session:e,sessionName:t,sessionStore:r,restart:a})=>iu(e,t,r,a),start:({session:e,sessionName:t,sessionStore:r})=>id(e,t,r),stop:({session:e,sessionName:t,sessionStore:r})=>ip(e,t,r)};async function ir(e){let{req:t}=e;return"perf"===t.command?ia(e):"logs"===t.command?is(e):"network"===t.command?ic(e):"audio"===t.command?await nJ(e):null}async function ia(e){var t;let{req:r,sessionName:a,sessionStore:n,androidAdbExecutor:i}=e,o=n.get(a);if(!o)return U("SESSION_NOT_FOUND","perf requires an active session. Run open first.");let u=(r.positionals?.[0]??"metrics").toLowerCase();if("cpu"===(t=u)||"trace"===t)return"android"===o.device.platform?await nE({req:r,sessionName:a,sessionStore:n,session:o,androidAdbExecutor:i,area:u}):await nQ(e,o);let d=function(e){var t,r,a,n,i,o,u,d,p,c;let f,m,h=tx(f=(e.positionals?.[0]??"metrics").toString().toLowerCase())?f:void 0;if(!h)return U("INVALID_ARGS",th);if("cpu"===h||"trace"===h)return{ok:!0,native:!0};let g=tc(m=(e.positionals?.[1]??"sample").toString().toLowerCase())?m:void 0;if(!g)return U("INVALID_ARGS",tw);let w=function(e){if(void 0!==e)return"string"==typeof e&&tA(e)?e:new l("INVALID_ARGS",tD)}(e.flags?.kind);if(w instanceof l)return{ok:!1,error:s(w)};let v=(t=h,r=g,("memory"===t?io(r)?void 0:U("INVALID_ARGS","perf memory requires sample or snapshot"):"sample"!==r?U("INVALID_ARGS","perf metrics and perf frames only support sample"):void 0)??(a=e,n=h,i=g,o=w,function(e,t,r){if(e&&("memory"!==t||"snapshot"!==r))return U("INVALID_ARGS","--out is only supported with perf memory snapshot")}(a.flags?.out,n,i)??(u=o,d=n,p=i,u?"memory"!==d||"snapshot"!==p?U("INVALID_ARGS","--kind is only supported with perf memory snapshot"):tb(u)?void 0:U("INVALID_ARGS",tN):void 0)));return v||{ok:!0,native:!1,area:h,action:g,kind:w,out:"string"==typeof(c=e.flags?.out)&&c.length>0?c:void 0}}(r);if(!d.ok)return d;if(d.native)return await nQ(e,o);try{return{ok:!0,data:await ii(e,o,d)}}catch(e){return{ok:!1,error:s(e)}}}async function ii(e,t,r){let{sessionName:a,sessionStore:n,androidAdbExecutor:i}=e;return"memory"===r.area?await nh(t,{action:function(e){if(io(e))return e;throw new l("INVALID_ARGS","perf memory requires sample or snapshot")}(r.action),kind:r.kind,out:r.out,cwd:e.req.meta?.cwd,sessionName:a,sessionStore:n,androidAdb:i}):"frames"===r.area?await nm(t,{androidAdb:i}):await nf(t,{androidAdb:i})}function io(e){return"sample"===e||"snapshot"===e}async function is(e){var t;let r,a,{req:n,sessionName:i,sessionStore:o}=e,s=o.get(i);if(!s)return U("SESSION_NOT_FOUND","logs requires an active session");let l=Q("logs",s.device);if(l)return l;let u=(t=n,r=(t.positionals?.[0]??"path").toLowerCase(),a=!!t.flags?.restart,tM.includes(r)?a&&"clear"!==r?U("INVALID_ARGS","logs --restart is only supported with logs clear"):{ok:!0,action:r,restart:a}:U("INVALID_ARGS",n6));return u.ok?await it[u.action]({...e,session:s,restart:u.restart}):u}async function il(e,t,r){let a=r.resolveAppLogPath(t),n=await eO(e.device,e.appBundleId);return{ok:!0,data:{path:a,active:!!e.appLog,state:e.appLog?.getState()??"inactive",checks:n.checks,notes:n.notes}}}async function iu(e,t,r,a){if(e.appLog&&!a)return U("INVALID_ARGS","logs clear requires logs to be stopped first; run logs stop");let n=r.resolveAppLogPath(t);if(!a)return{ok:!0,data:eu(n)};let i=e.appBundleId;if(!i)return U("INVALID_ARGS","logs clear --restart requires an app session; run open <app> first");e.appLog&&await eK(e.appLog);let o=eu(n),l=r.resolveAppLogPidPath(t);try{let a=await e8(e.device,i,n,l);return r.set(t,{...e,appLog:{platform:e.device.platform,backend:a.backend,outPath:n,startedAt:a.startedAt,getState:a.getState,stop:a.stop,wait:a.wait}}),{ok:!0,data:{...o,restarted:!0}}}catch(a){return r.set(t,{...e,appLog:void 0}),{ok:!1,error:s(a)}}}async function id(e,t,r){if(e.appLog)return U("INVALID_ARGS","app log already streaming; run logs stop first");if(!e.appBundleId)return U("INVALID_ARGS","logs start requires an app session; run open <app> first");let a=r.resolveAppLogPath(t),n=r.resolveAppLogPidPath(t);try{let i=await e8(e.device,e.appBundleId,a,n);return r.set(t,{...e,appLog:{platform:e.device.platform,backend:i.backend,outPath:a,startedAt:i.startedAt,getState:i.getState,stop:i.stop,wait:i.wait}}),{ok:!0,data:{path:a,started:!0}}}catch(e){return{ok:!1,error:s(e)}}}async function ip(e,t,r){if(!e.appLog)return U("INVALID_ARGS","no app log stream active");let a=e.appLog.outPath;return await eK(e.appLog),r.set(t,{...e,appLog:void 0}),{ok:!0,data:{path:a,stopped:!0}}}async function ic(e){let t=function(e){let{req:t,sessionName:r,sessionStore:a}=e,n=a.get(r);if(!n)return U("SESSION_NOT_FOUND","network requires an active session");let i=Q("network",n.device);if(i)return i;let o=(t.positionals?.[0]??"dump").toLowerCase();if(!n7.includes(o))return U("INVALID_ARGS",n9);let s=t.positionals?.[1]?Number.parseInt(t.positionals[1],10):25;if(!Number.isInteger(s)||s<1||s>200)return U("INVALID_ARGS","network dump limit must be an integer in range 1..200");let l=function(e){let t=e.positionals?.[2]?.toLowerCase(),r=e.flags?.networkInclude;if(t&&r&&t!==r)return U("INVALID_ARGS","network include mode was provided both positionally and via --include with different values");let a=(r??t??"summary").toLowerCase();return tt.includes(a)?{ok:!0,include:a}:U("INVALID_ARGS",ie)}(t);return l.ok?{ok:!0,session:n,maxEntries:s,include:l.include}:l}(e);if(!t.ok)return t;let{include:r,maxEntries:a,session:n}=t;if("web"===n.device.platform)return await im({include:r,maxEntries:a});let i=await eh({device:n.device,appBundleId:n.appBundleId,appLogState:n.appLog?.getState(),appLogStartedAt:n.appLog?.startedAt,appLogPath:e.sessionStore.resolveAppLogPath(e.sessionName),maxEntries:a,include:r,maxPayloadChars:2048,maxScanLines:4e3});return{ok:!0,data:{...i.dump,active:!!n.appLog,state:n.appLog?.getState()??"inactive",backend:i.backend,notes:i.notes}}}async function im(e){let t=t9();if(!t.dumpNetwork)return U("UNSUPPORTED_OPERATION","network is not supported by this web provider");try{let r=await t.dumpNetwork({include:e.include,limit:e.maxEntries});return{ok:!0,data:{entries:r.entries,active:!0,state:"active",backend:r.backend??"agent-browser",include:e.include,matchedLines:r.entries.length,scannedLines:r.entries.length,limits:{maxEntries:e.maxEntries,maxPayloadChars:2048,maxScanLines:r.entries.length},notes:r.notes}}}catch(e){return{ok:!1,error:s(e)}}}function ih(e,t,r){var a,n;if(null==e)return rc("open",[rg(rm(t,"launchApp"),r)]);if("string"==typeof e)return rc("open",[rg(e,r)]);if(!rf(e))throw new l("INVALID_ARGS","launchApp expects a string or map.");rh(e,"launchApp",["appId","stopApp","clearState","clearKeychain","arguments","permissions","launchArguments"]),iy(e,"permissions"),iy(e,"clearKeychain");let i=rg("string"==typeof e.appId?e.appId:rm(t,"launchApp"),r),o=(a=e,n=r,[...iw(a.arguments,"launchApp.arguments",n),...iw(a.launchArguments,"launchApp.launchArguments",n)]),s=!0===e.clearState;return rc("open",[i],{...!s&&(!0===e.stopApp||o.length>0)?{relaunch:!0}:{},...s?{clearAppState:!0}:{},...o.length>0?{launchArgs:o}:{}})}function ig(e,t,r){if(null==e)return rc("close",[rg(rm(t,"stopApp"),r)]);if("string"==typeof e)return rc("close",[rg(e,r)]);throw new l("INVALID_ARGS","stopApp expects a string appId or no value.")}function iw(e,t,r){if(null==e)return[];if("string"==typeof e)return[rg(e,r)];if(Array.isArray(e))return e.map((e,a)=>iv(e,`${t}[${a}]`,r));if(rf(e))return Object.entries(e).flatMap(([e,a])=>[rg(e,r),iv(a,`${t}.${e}`,r)]);throw new l("INVALID_ARGS",`${t} expects a string, list, or map.`)}function iv(e,t,r){if("string"==typeof e)return rg(e,r);if("number"==typeof e||"boolean"==typeof e)return String(e);throw new l("INVALID_ARGS",`${t} must be a string, number, or boolean.`)}function iy(e,t){if(void 0!==e[t])throw ry(`Maestro launchApp field "${t}" is not supported yet.`)}let iA="__maestroRunScript",ib="__maestroAssertVisible",iS="__maestroAssertNotVisible",iI="__maestroPressEnter",i_="__maestroWaitForAnimationToEnd",ik="__maestroScrollUntilVisible",iN="__maestroSwipeScreen",iD="__maestroSwipeOn",ix="__maestroTapOn",iR="__maestroTapPointPercent";function iM(e){if(null==e)return rc("type",["\b".repeat(50)]);if("number"==typeof e&&Number.isInteger(e)&&e>0)return rc("type",["\b".repeat(e)]);if(!rf(e))throw new l("INVALID_ARGS","eraseText expects empty, a positive count, or a map.");if(rh(e,"eraseText",["charactersToErase"]),void 0===e.charactersToErase)return rc("type",["\b".repeat(50)]);if("number"!=typeof e.charactersToErase||!Number.isInteger(e.charactersToErase)||e.charactersToErase<=0)throw new l("INVALID_ARGS","eraseText.charactersToErase must be a positive integer.");return rc("type",["\b".repeat(e.charactersToErase)])}function iP(e){return"number"==typeof e&&Number.isFinite(e)?String(Math.max(16,Math.floor(e))):void 0}function iL(e,t){let r=e.toLowerCase();switch(r){case"up":case"down":case"left":case"right":return r;default:throw ry(`Maestro ${t} must be UP, DOWN, LEFT, or RIGHT.`)}}function iO(e){return iL(e,"swipe direction")}function i$(e,t,r=[],a){if("string"==typeof e)return iC(rg(e,a));if(!rf(e))throw new l("INVALID_ARGS",`${t} expects a string or selector map.`);rh(e,t,["id","text","enabled","selected",...r]);let n=[],i=[];if("boolean"==typeof e.enabled&&i.push(iV("enabled",String(e.enabled))),"boolean"==typeof e.selected&&i.push(iV("selected",String(e.selected))),"string"==typeof e.id&&n.push(iV("id",rg(e.id,a)),...i),"string"==typeof e.text&&0===n.length)return iC(rg(e.text,a),i);if("string"==typeof e.label&&0===n.length&&n.push(iV("label",rg(e.label,a)),...i),0===n.length&&i.length>0&&n.push(...i),0===n.length)throw new l("INVALID_ARGS",`${t} selector map must include one of id, text, label, enabled, or selected.`);return n.join(" ")}function iC(e,t=[]){return[[iV("label",e),...t].join(" "),[iV("text",e),...t].join(" "),[iV("id",e),...t].join(" ")].join(" || ")}function iE(e){let t=iP(e.duration);return t?[t]:[]}function iV(e,t){return`${e}=${JSON.stringify(t)}`}function iF(e){var t,r;if(!rf(e))return;let a={},n="number"==typeof(t=e.repeat)&&Number.isInteger(t)&&t>0?t:void 0,i="number"==typeof(r=e.delay)&&Number.isInteger(r)&&r>=0?r:void 0;return n&&n>1&&(a.count=n),void 0!==i&&(a.intervalMs=i),!0===e.optional&&(a.maestro={optional:!0}),Object.keys(a).length>0?a:void 0}function iq(e){let t=iF(e)??{};return{...t,maestro:{...t.maestro??{},allowNonHittableCoordinateFallback:!0}}}function iT(e){let t={doubleTap:!0};return rf(e)&&"number"==typeof e.delay&&Number.isInteger(e.delay)&&(t.intervalMs=Math.max(0,e.delay)),t}class iU{index=0;tokens;context;constructor(e,t){this.tokens=e,this.context=t}parse(){let e=this.parseOr();if(this.peek())throw new l("INVALID_ARGS","Unsupported trailing runFlow.when.true expression.");return e}parseOr(){let e=this.parseAnd();for(;this.consumeOperator("||");)e=this.parseAnd()||e;return e}parseAnd(){let e=this.parsePrimary();for(;this.consumeOperator("&&");)e=this.parsePrimary()&&e;return e}parsePrimary(){let e=this.peek();if(!e)throw new l("INVALID_ARGS","Incomplete runFlow.when.true expression.");if("boolean"===e.type)return this.index+=1,e.value;if("paren"===e.type&&"("===e.value){this.index+=1;let e=this.parseOr();if(!this.consumeParen(")"))throw new l("INVALID_ARGS","Unclosed runFlow.when.true parenthesis.");return e}return this.parsePlatformComparison()}parsePlatformComparison(){this.expectPlatform();let e=this.expectEqualityOperator(),t=this.expectString().toLowerCase(),r=this.context.platform;return"=="===e?r===t:r!==t}expectPlatform(){if(this.peek()?.type!=="platform")throw new l("INVALID_ARGS","runFlow.when.true supports maestro.platform comparisons.");this.index+=1}expectEqualityOperator(){let e=this.peek();if(e?.type==="operator"&&("=="===e.value||"!="===e.value))return this.index+=1,e.value;throw new l("INVALID_ARGS","runFlow.when.true comparison requires == or !=.")}expectString(){let e=this.peek();if(e?.type==="string")return this.index+=1,e.value;throw new l("INVALID_ARGS","runFlow.when.true comparison requires a string literal.")}consumeOperator(e){let t=this.peek();return t?.type==="operator"&&t.value===e&&(this.index+=1,!0)}consumeParen(e){let t=this.peek();return t?.type==="paren"&&t.value===e&&(this.index+=1,!0)}peek(){return this.tokens[this.index]}}function iG(e,t,r){return{...rc(e,t),replayControl:r}}function iH(e,t,r){let a="string"==typeof e?rg(e,t):e,n="number"==typeof a?a:"string"==typeof a&&/^\d+$/.test(a)?Number(a):void 0;if(void 0===n||!Number.isInteger(n)||n<0)throw new l("INVALID_ARGS",`${r} must be a non-negative integer or \${VAR} resolving to one.`);return n}let iB=`
1
+ import{B as e,F as t,I as n,S as r,b as i,f as a,h as o,m as s,p as c,t as l,v as u,y as d}from"./sdk-contracts.js";import{C as f,N as p,c as m,j as h,p as g,v as _}from"./sdk-android-adb.js";import{C as v,_ as y,m as b,v as x,w as S,y as C}from"./sdk-batch.js";import{i as ee,r as te}from"./output-path.js";import{a as ne,n as re,t as ie}from"./snapshot-diagnostics.js";import{n as ae}from"./version.js";import{t as w}from"./timeouts.js";import{An as oe,At as se,Bn as ce,Bt as le,Gt as ue,Ht as de,It as fe,Lt as pe,Mt as me,Pt as he,Ut as ge,V as _e,Vt as ve,Xt as ye,Zt as be,_n as xe,at as Se,gn as Ce,it as we,jn as Te,lt as Ee,nt as De,o as Oe,zt as ke}from"./device-rotation.js";import{N as Ae,d as je,g as Me,h as Ne,i as Pe,l as Fe,t as Ie}from"./sdk-selectors.js";import{n as Le,t as Re}from"./sdk-batch-runner.js";import{t as ze}from"./project-runtime.js";import{n as Be,t as Ve}from"./runtime-transport.js";import{i as He}from"./sdk-finders.js";import{a as Ue,s as We,t as Ge}from"./selectors2.js";import{n as Ke}from"./sdk-app-inventory.js";import{d as qe,m as Je}from"./runtime.js";import{f as Ye,p as Xe,s as Ze}from"./app-lifecycle.js";import{C as Qe,S as $e,f as et,g as tt,h as nt,m as rt,s as it,x as at}from"./logcat.js";import{d as ot,s as st}from"./providers.js";import{C as ct,S as lt,b as ut,c as dt,g as ft,h as pt,m as T,n as mt,o as ht,p as gt,r as _t,s as vt,t as yt,u as bt,v as xt,w as St,x as Ct,y as wt}from"./runner-client.js";import{o as Tt}from"./tool-provider.js";import{r as Et}from"./helper.js";import{n as Dt}from"./simctl.js";import{n as Ot,s as kt}from"./agent-browser-tool.js";import{$t as At,A as jt,At as Mt,B as Nt,C as Pt,D as Ft,E as It,F as Lt,Ht as E,I as Rt,It as D,Jt as zt,L as Bt,M as Vt,N as Ht,O as Ut,P as Wt,Qt as O,R as Gt,S as Kt,Sn as qt,T as Jt,Ut as Yt,Vt as Xt,Xt as k,_ as Zt,_n as Qt,_t as $t,a as en,an as tn,at as nn,b as rn,bn as an,c as on,cn as sn,ct as cn,d as ln,dn as un,dt as dn,en as fn,f as pn,fn as mn,ft as hn,g as gn,gt as _n,h as vn,hn as yn,ht as bn,i as xn,in as Sn,it as Cn,j as wn,k as Tn,kt as En,l as Dn,ln as On,lt as kn,m as An,mn as jn,mt as Mn,n as Nn,nn as Pn,nt as Fn,o as In,on as Ln,ot as Rn,p as zn,pn as Bn,pt as Vn,qt as Hn,r as Un,rn as Wn,rt as Gn,s as Kn,sn as qn,st as Jn,tn as Yn,u as Xn,un as Zn,ut as Qn,v as $n,vn as A,w as er,x as tr,xn as nr,y as rr,yn as ir,yt as j,z as ar}from"./internal/daemon.js";import{C as or,D as sr,E as cr,S as lr,T as ur,a as M,b as dr,c as fr,d as pr,f as mr,g as hr,h as N,i as P,l as gr,m as _r,n as vr,o as F,p as I,r as yr,s as br,u as xr,v as Sr,w as Cr,x as wr,y as Tr}from"./points.js";import{n as Er}from"./provider.js";import{a as Dr,i as Or,n as kr,r as Ar,t as jr}from"./apple-runner-options.js";import{t as Mr}from"./handler-utils.js";import{l as Nr}from"./apps.js";import{a as Pr,n as Fr}from"./simulator.js";import{t as Ir}from"./record-trace-recording.js";import L from"node:fs";import R from"node:path";import{access as Lr}from"node:fs/promises";import{setTimeout as Rr}from"node:timers/promises";import zr from"node:vm";function Br(e){throw new t(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function Vr(e){let n=e.meta?.installSource;if(!n)throw new t(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(n.kind){case`url`:if(!n.url||n.url.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return n;case`path`:if(!n.path||n.path.trim().length===0)throw new t(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return n;case`github-actions-artifact`:throw new t(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:Br(n)}}function Hr(e){let t=Vr(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Qt(n,e.meta?.tenantId)},cleanup:()=>{yn(n)}}}function Ur(e){return e===`ios`||e===`android`?e:void 0}function Wr(e){let n=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!n)return{enabled:!1};if(r!==void 0&&r<=0)throw new t(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,ttlMs:r}}async function Gr(e){let n=Ur(e.flags?.platform);if(e.session){if(n&&e.session.device.platform!==n)throw new t(`INVALID_ARGS`,`install_from_source requested platform ${n}, but session is bound to ${e.session.device.platform}`);return await Dr(e.session.device),e.session.device}if(!n)throw new t(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);let r=await Ln(e.flags??{});return await Dr(r),r}async function Kr(e){let{prepared:t,retention:n,req:r,session:i,sessionName:a}=e;if(n.enabled)return await ln({archivePath:t.archivePath,installablePath:t.installablePath,tenantId:r.meta?.tenantId,sessionName:i?a:void 0,ttlMs:n.ttlMs})}function qr(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}function Jr(e){let{session:t,sessionStore:n,req:r,data:i}=e;Mr(n,t,r,`install_source`,i,{positionals:[]})}async function Yr(t){let{req:n,sessionName:r,sessionStore:i}=t,a=i.get(r);try{let e=Hr(n),t=Wr(n),o=await Gr({session:a,flags:n.flags}),s=O(`install`,o,{message:`install_from_source is not supported on this device`});if(s)return s;let l=ut(n.meta?.requestId);if(c(o)){let{prepareIosInstallArtifact:s}=await import(`./apps.js`).then(e=>e.a),c=await s(e.source,{signal:l});return await Xr({prepared:c,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Zr(o,c,e)})}let{prepareAndroidInstallArtifact:u}=await import(`./logcat.js`).then(e=>e.r),d=await u(e.source,{signal:l});return await Xr({prepared:d,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Qr(o,d,e)})}catch(t){return{ok:!1,error:e(t)}}}async function Xr(e){let t;try{t=await Kr(e);let n=await e.buildResult(t),r=xe(n,ri(n));return Jr({session:e.session,sessionStore:e.sessionStore,req:e.req,data:r}),{ok:!0,data:r}}catch(n){throw t&&await Dn(t.materializationId,e.req.meta?.tenantId).catch(()=>{}),n}finally{await e.prepared.cleanup(),e.resolvedSourceCleanup()}}async function Zr(e,t,n){let r=await mn(e,t.installablePath,{appIdentifierHint:t.bundleId});if(!r){let{installIosInstallablePath:n}=await import(`./apps.js`).then(e=>e.t);await n(e,t.installablePath)}return $r(t,r,n)}async function Qr(e,t,n){let r=await mn(e,t.installablePath,{packageNameHint:t.packageName}),i=await ni(e,t,r),{inferAndroidAppName:a}=await import(`./app-lifecycle.js`).then(e=>e.t),o=a(i);return{...qr(n),packageName:i,...ti(r?.appName??o),launchTarget:r?.launchTarget??i}}function $r(e,t,n){let r=ei(e,t),i=t?.appName??e.appName;return{...qr(n),bundleId:r,...ti(i),launchTarget:t?.launchTarget??r}}function ei(e,n){let r=n?.bundleId??e.bundleId;if(r)return r;throw new t(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`)}function ti(e){return e?{appName:e}:{}}async function ni(e,n,r){let i=r?.packageName??r?.launchTarget;if(i)return i;let{installAndroidInstallablePathAndResolvePackageName:a}=await import(`./app-lifecycle.js`).then(e=>e.t),o=await a(e,n.installablePath,n.packageName);if(!o)throw new t(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return o}function ri(e){return`Installed: ${be(e)}`}async function ii(n){let{req:r}=n;try{let e=r.meta?.materializationId?.trim();if(!e)throw new t(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Dn(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(t){return{ok:!1,error:e(t)}}}function z(e){return c(e)&&e.kind===`simulator`}function ai(e){return e.platform===`android`&&e.kind===`emulator`}function B(e,t,n){return t||zt(n)?null:k(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function oi(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function si(e,t){!z(e)||t<=0||await new Promise(e=>setTimeout(e,t))}async function V(e){let t=zt(e.flags)||!e.session?await Ln(e.flags??{},{allowStoppedAndroidAvdPlaceholders:e.allowStoppedAndroidAvdPlaceholders}):await ci(e.session.device);return e.ensureReady!==!1&&await Dr(t),t}async function ci(e){if(!c(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if(ht(e.id)?.alive)return{...e,booted:!0};let n={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await Ln(n)}catch(e){if(!(e instanceof t)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Ln({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function li(e){let t=e.flags?.device?.trim();if(t)return t;if(e.resolvedDevice?.platform===`android`&&e.resolvedDevice.kind===`emulator`)return e.resolvedDevice.name;if(e.sessionDevice?.platform===`android`&&e.sessionDevice.kind===`emulator`)return e.sessionDevice.name}function ui(e,t){return t?_n(t,e).length===0:!1}const di=`shared_prefs/ReactNativeDevPrefs.xml`,fi=`debug_http_host`,pi=`dev_server_https`,mi=`RCT_jsLocation`,hi=`RCT_packager_scheme`,gi=`React Native runtime hints require adb run-as access to the app sandbox. Verify the app is debuggable and the selected package/device are correct.`,_i=[`<?xml version="1.0" encoding="utf-8" standalone="yes" ?>`,`<map>`,`</map>`,``].join(`
2
+ `);function vi(e){return Ve(e)!==void 0}async function yi(e){let{device:t,appId:n,runtime:r}=e;if(Bn(t)||!n)return;let i=Ve(r);if(i){if(t.platform===`android`){await xi(t,n,i);return}c(t)&&t.kind===`simulator`&&await Ti(t,n,i)}}async function bi(e){let{device:t,appId:n}=e;if(n){if(t.platform===`android`){await Si(t,n);return}c(t)&&t.kind===`simulator`&&await Ei(t,n)}}async function xi(e,t,n){Mi(t);let r=Oi(await Ci(e,t),fi,`${n.host}:${n.port}`);r=ki(r,pi,n.scheme===`https`),await wi(e,t,r)}async function Si(e,t){Mi(t);let n=await Ci(e,t),r=ji(ji(n,fi),pi);r!==n&&await wi(e,t,r)}async function Ci(e,t){let n=await it(e,[`shell`,`run-as`,t,`cat`,di],{allowFailure:!0});return n.exitCode===0?Di(n.stdout):_i}async function wi(e,r,i){let a=[`shell`,`run-as`,r,`id`],o=await it(e,a,{allowFailure:!0});if(o.exitCode!==0){let e=Fi(o.stdout,o.stderr);throw new t(`COMMAND_FAILED`,e?`Failed to access Android app sandbox for ${r}`:`Failed to probe Android app sandbox for ${r}`,g(o,{package:r,cmd:`adb`,args:a,hint:e?gi:`adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information.`}))}try{await it(e,[`shell`,`run-as`,r,`mkdir`,`-p`,`shared_prefs`]),await it(e,[`shell`,`run-as`,r,`tee`,di],{stdin:i.trimEnd()})}catch(e){let i=n(e);if(i.code===`TOOL_MISSING`)throw i;let a=Fi(typeof i.details?.stdout==`string`?i.details.stdout:``,typeof i.details?.stderr==`string`?i.details.stderr:``);throw new t(`COMMAND_FAILED`,a?`Failed to access Android app sandbox for ${r}`:`Failed to write Android runtime hints for ${r}`,{...i.details??{},package:r,cmd:`adb`,phase:`write-runtime-hints`,hint:a?gi:`adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command.`},i)}}async function Ti(e,t,n){await Tt(Dt(e,[`spawn`,e.id,`defaults`,`write`,t,mi,`-string`,`${n.host}:${n.port}`])),await Tt(Dt(e,[`spawn`,e.id,`defaults`,`write`,t,hi,`-string`,n.scheme]))}async function Ei(e,t){await Tt(Dt(e,[`spawn`,e.id,`defaults`,`delete`,t,mi]),{allowFailure:!0}),await Tt(Dt(e,[`spawn`,e.id,`defaults`,`delete`,t,hi]),{allowFailure:!0})}function Di(e){let t=e.trim();return!t.includes(`<map`)||!t.includes(`</map>`)?_i:`${t}\n`}function Oi(e,t,n){let r=` <string name="${Pi(t)}">${Pi(n)}</string>`;return Ai(ji(e,t),r)}function ki(e,t,n){let r=` <boolean name="${Pi(t)}" value="${n?`true`:`false`}" />`;return Ai(ji(e,t),r)}function Ai(e,t){return Di(e).replace(`</map>`,`${t}\n</map>`)}function ji(e,t){let n=Ni(t);return Di(e).replace(RegExp(`^\\s*<string name="${n}">[\\s\\S]*?<\\/string>\\n?`,`m`),``).replace(RegExp(`^\\s*<boolean name="${n}" value="(?:true|false)"\\s*\\/?>\\n?`,`m`),``)}function Mi(e){if(Ye(e)!==`binary`)return;let n=Xe(e);throw new t(`INVALID_ARGS`,n,{package:e,hint:n})}function Ni(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Pi(e){return e.replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`"`,`&quot;`).replaceAll(`'`,`&apos;`)}function Fi(e,t){let n=`${e}\n${t}`.toLowerCase();return[`run-as: package not debuggable`,`run-as: permission denied`,`run-as: package is unknown`,`run-as: unknown package`,`is unknown`,`is not an application`,`could not set capabilities`].some(e=>n.includes(e))}const Ii=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function Li(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Ri(e,n){if(e!==void 0){if(typeof e!=`string`)throw new t(`INVALID_ARGS`,`Invalid open runtime ${n}: expected string.`);return Be(e)}}function zi(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new t(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function Bi(e){if(e!==void 0){if(typeof e!=`number`)throw new t(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return zi(e)}}function Vi(e,n,r){if(e===void 0)return r;if(e!==`ios`&&e!==`android`)throw new t(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios" or "android".`);if(r&&e!==r)throw new t(`INVALID_ARGS`,`open runtime targets ${e}, but session "${n}" is bound to ${r}.`);return e}function Hi(e){if(e===`ios`||e===`android`)return e}function Ui(e,t){return{platform:t,metroHost:Be(e?.metroHost),metroPort:zi(e?.metroPort),bundleUrl:Be(e?.bundleUrl),launchUrl:Be(e?.launchUrl)}}function Wi(e,t){return{platform:t.platform??e?.platform,metroHost:t.metroHost??e?.metroHost,metroPort:t.metroPort??e?.metroPort,bundleUrl:t.bundleUrl??e?.bundleUrl,launchUrl:t.launchUrl??e?.launchUrl}}function Gi(e){let{runtime:n,sessionName:r,platform:i}=e;if(n===void 0)return;if(!n||typeof n!=`object`||Array.isArray(n))throw new t(`INVALID_ARGS`,`open runtime must be an object.`);let a=n,o=Object.keys(a).find(e=>!Ii.includes(e));if(o)throw new t(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Ii.join(`, `)}.`);return{platform:Vi(a.platform,r,i),metroHost:Ri(a.metroHost,`metroHost`),metroPort:Bi(a.metroPort),bundleUrl:Ri(a.bundleUrl,`bundleUrl`),launchUrl:Ri(a.launchUrl,`launchUrl`)}}function Ki(e,t,n){if(n){if(Li(n)===0){e.clearRuntimeHints(t);return}return e.setRuntimeHints(t,n),n}}function qi(e,n,r){let a=e.getRuntimeHints(n);if(!a)return;let o=r?i(r):void 0,s=Hi(o);if(a.platform&&r&&!s)throw new t(`INVALID_ARGS`,`Session runtime hints are only supported on iOS and Android sessions, but session "${n}" is bound to ${o}.`);if(a.platform&&s&&a.platform!==s)throw new t(`INVALID_ARGS`,`Session runtime hints target ${a.platform}, but session "${n}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&a.platform!==s?{...a,platform:s}:a}function Ji(e){let{req:t,sessionStore:n,sessionName:r,device:a}=e,o=n.getRuntimeHints(r),s=Gi({runtime:t.runtime,sessionName:r,platform:Hi(i(a))});return t.runtime===void 0?{runtime:qi(n,r,a),previousRuntime:o,replacedStoredRuntime:!1}:{runtime:s&&Li(s)>0?s:void 0,previousRuntime:o,replacedStoredRuntime:!0}}function Yi(e){try{return{ok:!0,data:Ji(e)}}catch(e){let t=n(e);return k(t.code,t.message,t.details)}}async function Xi(e){let{replacedStoredRuntime:t,previousRuntime:n,runtime:r,session:i}=e;!t||!i?.appBundleId||!vi(n)||vi(r)||await bi({device:i.device,appId:i.appBundleId})}async function Zi(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if($i(i))return await ia(t,i);if(!Qi(i))return k(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or port-reverse-remove`);let a=r.get(n),o=r.getRuntimeHints(n);return i===`clear`?await ea(n,r,a,o):i===`show`?ta(n,o):ra({req:t,sessionName:n,sessionStore:r,session:a,current:o})}function Qi(e){return e===`set`||e===`show`||e===`clear`}function $i(e){return e===`port-reverse`||e===`port-reverse-remove`}async function ea(e,t,n,r){return vi(r)&&n?.appBundleId&&await bi({device:n.device,appId:n.appBundleId}),{ok:!0,data:{session:e,cleared:t.clearRuntimeHints(e)}}}function ta(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function na(e){return e?i(e.device):void 0}function ra(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=na(i),s=Hi(t.flags?.platform??a?.platform??o);if(!s)return k(`INVALID_ARGS`,`runtime set only supports iOS and Android sessions. Pass --platform ios|android or open an iOS/Android session first.`);if(o!==void 0&&o!==s)return k(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Wi(a,Ui(t.flags,s));return Li(c)===0?k(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,c),{ok:!0,data:{session:n,configured:!0,runtime:c}})}async function ia(e,t){let n=aa(e);if(!n.ok)return n.response;let r=await ca(t,n.options);return r?{ok:!0,data:{action:t,...r}}:k(`UNSUPPORTED_OPERATION`,`No active provider device runtime supports port reverse for this lease.`)}function aa(e){let t=oa(e);if(!t.ok)return t;let n=sa(e);if(!n.ok)return n;let r=e.flags?.portReverseName?.trim()||`runtime`;return{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:r}}}function oa(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:k(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:k(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function sa(e){let t=la(e.flags?.devicePort),n=la(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:k(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}async function ca(e,t){return e===`port-reverse`?await Zn(t):await jn(t)}function la(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}const ua=`open-command-roundtrip`,da=`Not implemented for this platform in this release.`;function fa(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:a,appName:o,appBundleId:s,surface:l,startup:u,timing:d,device:f,runtime:p,runtimeHintCount:m}=e,h={session:t,surface:l,sessionStateDir:n,runnerLogPath:r,requestLogPath:a};return o&&(h.appName=o),s&&(h.appBundleId=s),u&&(h.startup=u),d&&(h.timing=d),p&&m(p)>0&&(h.runtime=p),f&&(h.platform=i(f),h.target=f.target??`mobile`,h.device=f.name,h.id=f.id,h.kind=f.kind,f.platform===`android`&&(h.serial=f.id)),f&&c(f)&&(h.device_udid=f.id,h.ios_simulator_device_set=f.simulatorSetPath??null),{...h,...Ce(`Opened: ${o??s??t}`)}}function pa(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s,saveScript:c}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,recordSession:t.recordSession||c,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,recordSession:c,actions:[]}}const ma=new Set([`app`,`desktop`,`frontmost-app`]);function ha(e,n,r){if(e.platform===`linux`){if(!n)return`app`;let e=ue(n);if(!ma.has(e))throw new t(`INVALID_ARGS`,`Linux supports --surface app, desktop, and frontmost-app (got "${n}")`);if(e!==`app`&&r)throw new t(`INVALID_ARGS`,`open --surface ${e} does not accept an app target`);return e}if(!s(e)){if(n)throw new t(`INVALID_ARGS`,`surface is only supported on macOS and Linux`);return`app`}let i=n?ue(n):`app`;if(i!==`app`&&i!==`menubar`&&r)throw new t(`INVALID_ARGS`,`open --surface ${i} does not accept an app target`);return i}function ga(e){let{device:t,surfaceFlag:n,openTarget:r,existingSurface:i}=e;return(s(t)||t.platform===`linux`)&&!n?i??`app`:ha(t,n,r)}async function _a(e){if(e===`app`||e===`desktop`||e===`menubar`)return{};let t=await Et();return{appBundleId:t.bundleId,appName:t.appName}}async function va(e,t,n){if(!(!a(e.platform)||!t))return at(t)?s(e)?void 0:e.kind===`device`?Qe(n,t):$e(t)?void 0:n??await ya(e,t):await ba(e,t)}async function ya(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function ba(e,t){try{let{resolveIosApp:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function xa(e,t){if(!(e.platform!==`android`||!t||at(t)))try{let{resolveAndroidApp:n}=await import(`./app-lifecycle.js`).then(e=>e.t),r=await n(e,t);return r.type===`package`?r.value:void 0}catch{return}}async function Sa(e,t,n){if(n||e.platform!==`android`||!t||!at(t))return n;try{let{getAndroidAppState:t}=await import(`./app-lifecycle.js`).then(e=>e.t);return(await t(e)).package?.trim()||n}catch{return n}}function Ca(e,t){return e.platform===`android`&&!!(t&&at(t))}async function wa(e,t,n,r){return await va(e,t,n)??await r(e,t)??(Ca(e,t)?n:void 0)}function H(e){return k(`INVALID_ARGS`,e)}function Ta(e,n,r,i){try{return ga({device:e,surfaceFlag:n,openTarget:r,existingSurface:i})}catch(e){return k(e instanceof t?e.code:`INVALID_ARGS`,String(e.message))}}function Ea(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;return t?n&&at(n)?H(`open --relaunch does not support URL targets.`):r===`app`?i.platform===`android`&&n&&Ye(n)===`binary`?H(Xe(n)):null:H(`open --relaunch is supported only for app surfaces.`):null}function Da(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;return t?n&&at(n)?H(`open --relaunch does not support URL targets.`):r===`android`&&n&&Ye(n)===`binary`?H(Xe(n)):null:null}async function Oa(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,openTarget:o,existingSession:s,onIosSimulatorColdBootStart:c}=e;await Dr(i,{deviceHub:t.flags?.deviceHub===!0,onIosSimulatorColdBootStart:c});let{appBundleId:l,appName:u}=await ka({device:i,surface:a,openTarget:o,existingAppBundleId:s?.appBundleId}),d=Yi({req:t,sessionStore:r,sessionName:n,device:i});if(!d.ok)return{type:`response`,response:d};if(s){let{runtime:e,previousRuntime:t,replacedStoredRuntime:n}=d.data;await Xi({replacedStoredRuntime:n,previousRuntime:t,runtime:e,session:s})}return{type:`details`,details:{appBundleId:l,appName:u,runtime:d.data.runtime}}}async function ka(e){let{device:t,surface:n,openTarget:r,existingAppBundleId:i}=e,a=await _a(n);return{appBundleId:a.appBundleId??await wa(t,r,i,xa),appName:a.appName??r}}const Aa=new Map;async function ja(e){let{device:t,closeTarget:n,outFlag:r,context:i}=e;a(t.platform)&&!z(t)&&await dt(t.id),await E(t,`close`,[n],r,i),await si(t,300)}async function Ma(e){let{runtime:t,device:n,req:r,logPath:i,appBundleId:a,traceLogPath:o,openPositionals:s}=e,c=t?.launchUrl;if(!c||s.length===0||s.length>1)return;let l=s[0]?.trim();!l||at(l)||await E(n,`open`,[c],r.flags?.out,{...Na(i,r.flags,a,o)})}function Na(e,t,n,r){let i=D(e,t,n,r);return delete i.launchConsole,delete i.launchArgs,i}function Pa(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:ua,appTarget:t,appBundleId:n}}async function Fa(e){let{req:t,sessionName:n,sessionStore:r,logPath:i,device:a,openTarget:o,openPositionals:s,appName:l,surface:u,appBundleId:d,runtime:f,existingSession:m}=e,g=t.flags?.relaunch===!0,_=m?.trace?.outPath,v=d,y=Date.now(),b={},x=c(a)&&u===`app`&&s.length>0&&!!v,S=kr({req:t,logPath:i,appBundleId:v,traceLogPath:_}),C=t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,ee,te=!1,ne=!1,re=(e=S)=>{te=!0,b.runnerPrewarmKind=`session`,b.runnerPrewarmScheduled=!0,ee=_t(a,e)},ie=async()=>{if(!ee||ne)return;ne=!0;let e=Date.now();await ee,b.runnerPrewarmWaited=!0,b.runnerPrewarmDurationMs=Math.max(0,Date.now()-e)};x&&z(a)&&!C&&re();let ae=g&&!!o&&s.length===1&&z(a)&&t.flags?.clearAppState!==!0;if(g&&o&&!ae){let e=v??o,n=Date.now();await ja({device:a,closeTarget:e,outFlag:t.flags?.out,context:{...D(i,t.flags,v??m?.appBundleId,_)}}),b.relaunchCloseDurationMs=Math.max(0,Date.now()-n)}let w=Date.now();await yi({device:a,appId:v,runtime:f}),b.runtimeHintsDurationMs=Math.max(0,Date.now()-w),x&&C&&(re({...S,propagateError:!0}),await ie());let oe=Date.now(),se=await Ia({req:t,sessionName:n,sessionStore:r,device:a,surface:u,sessionAppBundleId:v,appName:l,existingSession:m});if(se.type===`response`)return se.response;let ce=se.session??m;await E(a,`open`,s,t.flags?.out,{...D(i,t.flags,v),...ae?{terminateRunningApp:!0}:{}}),b.openDispatchDurationMs=Math.max(0,Date.now()-oe);let le=Date.now();await Ma({runtime:f,device:a,req:t,logPath:i,appBundleId:v,traceLogPath:_,openPositionals:s}),b.launchUrlDurationMs=Math.max(0,Date.now()-le),x&&!te&&re(),g?await ie():ee&&!ne&&(b.runnerPrewarmWaited=!1),v=await Sa(a,o,v),a.platform===`android`&&v&&await It(a,v);let ue=o?Pa(oe,o,v):void 0,de=Date.now();if(await si(a,300),b.postOpenSettleDurationMs=Math.max(0,Date.now()-de),Ct(t.meta?.requestId)){let e=wt();return k(e.code,e.message,e.details)}m&&Xt(m,`open`,m.snapshot);let fe=pa({existingSession:ce,sessionName:m?.name??Mn(t),sessionScope:m?.sessionScope??Vn(t),device:a,surface:u,appBundleId:v,appName:l,saveScript:!!t.flags?.saveScript});fe.lease=dn({req:t,existingLease:m?.lease}),t.runtime!==void 0&&Ki(r,n,f);let pe=r.ensureSessionDir(n),me=ir(pe,t.meta?.requestId??p().requestId);b.totalDurationMs=Math.max(0,Date.now()-y),h({level:`info`,phase:`open_timing`,durationMs:b.totalDurationMs,data:b});let he=fa({sessionName:fe.name,sessionStateDir:pe,runnerLogPath:an(pe),requestLogPath:me,appName:l,appBundleId:v,surface:u,startup:ue,timing:b,device:a,runtime:f,runtimeHintCount:Li});return r.recordAction(fe,{command:`open`,positionals:s,flags:t.flags??{},runtime:t.runtime===void 0?void 0:f,result:he}),r.set(n,fe),{ok:!0,data:he}}async function Ia(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,sessionAppBundleId:o,appName:s,existingSession:c}=e,l=t.internal?.openLifecycle?.beforeDispatch;if(!l)return{type:`session`,session:c};let u=pa({existingSession:c,sessionName:c?.name??Mn(t),sessionScope:c?.sessionScope??Vn(t),device:i,surface:a,appBundleId:o,appName:s,saveScript:!!t.flags?.saveScript});u.lease=dn({req:t,existingLease:c?.lease}),r.set(n,u);let d=await l(u);return d&&!d.ok?{type:`response`,response:d}:{type:`session`,session:r.get(n)??u}}async function La(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,a=i.get(n);if(a){let e=t.flags?.relaunch===!0,o=t.positionals?.[0],s=o??(e?a.appName:void 0),c=Ta(a.device,t.flags?.surface,s,a.surface);if(typeof c!=`string`)return c;if(!s&&c===`app`)return H(e?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let l=Ea({shouldRelaunch:e,openTarget:s,surface:c,device:a.device});if(l)return l;let u=await ci(a.device),d=await Oa({req:t,sessionName:n,sessionStore:i,device:u,surface:c,openTarget:s,existingSession:a,onIosSimulatorColdBootStart:Ar({req:t,logPath:r,device:u,surface:c,openTarget:s,traceLogPath:a.trace?.outPath})});return d.type===`response`?d.response:await Fa({req:t,sessionName:n,sessionStore:i,logPath:r,device:u,openTarget:s,openPositionals:o?t.positionals??[]:s?[s]:[],appBundleId:d.details.appBundleId,appName:d.details.appName,runtime:d.details.runtime,surface:c,existingSession:a})}let o=t.flags?.relaunch===!0,s=t.positionals?.[0];if(o&&!s)return H(`open --relaunch requires an app argument.`);let c=Da({shouldRelaunch:o,openTarget:s,platform:t.flags?.platform===`android`?`android`:void 0});if(c)return c;let l=await Ln(t.flags??{}),u=Ta(l,t.flags?.surface,s);return typeof u==`string`?Ea({shouldRelaunch:o,openTarget:s,surface:u,device:l})||await gt(Aa,l.id,async()=>{let e=i.toArray().find(e=>e.device.id===l.id);if(e)return hn(t,e)?k(`DEVICE_IN_USE`,`Device is already in use by another workspace session.`,{deviceId:l.id,deviceName:l.name,hint:`Use a different device selector, wait for the other workspace to close its session, or run agent-device devices to choose another target.`}):k(`DEVICE_IN_USE`,`Device is already in use by session "${e.name}".`,{session:e.name,deviceId:l.id,deviceName:l.name,hint:$t(e,`device-in-use`)});let a=await Oa({req:t,sessionName:n,sessionStore:i,device:l,surface:u,openTarget:s,onIosSimulatorColdBootStart:Ar({req:t,logPath:r,device:l,surface:u,openTarget:s})});return a.type===`response`?a.response:await Fa({req:t,sessionName:n,sessionStore:i,logPath:r,device:l,openTarget:s,openPositionals:t.positionals??[],appBundleId:a.details.appBundleId,appName:a.details.appName,runtime:a.details.runtime,surface:u})}):u}function Ra(e){return z(e)||ai(e)}async function za(t){if(t.booted===!1)return{success:!0,exitCode:0,stdout:``,stderr:``};try{return z(t)?await Ba(t):await Ha(t)}catch(t){let n=e(t);return{success:!1,exitCode:-1,stdout:``,stderr:n.message,error:n}}}async function Ba(e){let t=await Pr(e);return t.success?t:await Va(e)===`Shutdown`?{...t,success:!0,exitCode:0}:t}async function Va(e){try{return await Fr(e)}catch{return null}}async function Ha(e){let t=await it(e,[`emu`,`kill`],{allowFailure:!0,timeoutMs:15e3});return{success:t.exitCode===0,exitCode:t.exitCode,stdout:t.stdout,stderr:t.stderr}}async function Ua(e){let{device:t,shutdownRequested:n}=e;if(n&&Ra(t))return await za(t)}function Wa(e,t){return z(t.device)&&!e.flags?.shutdown&&!t.recording&&!t.lease&&!t.device.simulatorSetPath}function Ga(e){return a(e.device.platform)&&!z(e.device)}async function Ka(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=i.get(n);if(!c)return await Ya(t,r);let l;try{await en(c),await on(c,`session-close`),await In(c),await Un(c),await xn(c),qa(t,c)&&(Ga(c)&&await Nn(c),await E(c.device,`close`,t.positionals??[],t.flags?.out,{...D(r,t.flags,c.appBundleId,c.trace?.outPath)}),await si(c.device,300)),a(c.device.platform)&&!Wa(t,c)?await Nn(c):a(c.device.platform)&&(h({level:`debug`,phase:`ios_runner_retained_after_close`,data:{session:c.name,deviceId:c.device.id}}),vt(c.device.id)),vi(i.getRuntimeHints(n))&&c.appBundleId&&await bi({device:c.device,appId:c.appBundleId}).catch(()=>{}),Mr(i,c,t,`close`,{session:c.name,...Ce(`Closed: ${c.name}`)}),t.flags?.saveScript&&(c.recordSession=!0),i.writeSessionLog(c),await Xn(n).catch(()=>{})}finally{try{l=await Qn({session:c,leaseRegistry:o,leaseLifecycleProvider:s})}finally{i.delete(n)}}let u=await Ua({device:c.device,shutdownRequested:t.flags?.shutdown});return u?{ok:!0,data:xe({session:c.name,shutdown:u,...l?{provider:l}:{}},`Closed: ${c.name}`)}:{ok:!0,data:{session:c.name,...Ce(`Closed: ${c.name}`),...l?{provider:l}:{}}}}function qa(e,t){return Ja(e)||t.device.platform===`web`}function Ja(e){return(e.positionals?.length??0)>0}async function Ya(e,t){if(!e.positionals||e.positionals.length===0)return k(`SESSION_NOT_FOUND`,`No active session`);let n=await V({session:void 0,flags:e.flags,ensureReady:!0});return await E(n,`close`,e.positionals,e.flags?.out,{...D(t,e.flags)}),await si(n,300),{ok:!0,data:{app:e.positionals[0],...Ce(`Closed: ${e.positionals[0]}`)}}}const Xa={ios:async(e,t,n)=>{let r=await un(e,t,n,{relaunch:!0,appIdentifierHint:t});if(r)return{bundleId:r.bundleId??r.launchTarget??t};let{reinstallIosApp:i}=await import(`./apps.js`).then(e=>e.t);return await i(e,t,n)},android:async(e,t,n)=>{let r=await un(e,t,n,{relaunch:!0,packageNameHint:t});if(r)return{package:r.packageName??r.launchTarget??t};let{reinstallAndroidApp:i}=await import(`./app-lifecycle.js`).then(e=>e.t);return await i(e,t,n)}},Za={ios:async(e,t,n)=>{let r=await un(e,t,n,{appIdentifierHint:t});if(r)return{bundleId:r.bundleId,appName:r.appName,launchTarget:r.launchTarget};let{installIosApp:i}=await import(`./apps.js`).then(e=>e.t),a=await i(e,n,{appIdentifierHint:t});return{bundleId:a.bundleId,appName:a.appName,launchTarget:a.launchTarget}},android:async(e,t,n)=>{let r=await un(e,t,n,{packageNameHint:t});if(r)return{package:r.packageName,appName:r.appName,launchTarget:r.launchTarget};let{installAndroidApp:i}=await import(`./app-lifecycle.js`).then(e=>e.t),a=await i(e,n);return{package:a.packageName,appName:a.appName,launchTarget:a.launchTarget}}};async function Qa(e){let{req:t,command:n,sessionName:r,sessionStore:i,deployOps:a}=e,o=i.get(r),s=t.flags??{},l=B(n,o,s);if(l)return l;let u=no(n,t.positionals??[]);if(!u.ok)return u.response;let{app:d,appPathInput:f}=u,p=t.meta?.uploadedArtifactId;try{let e=p?Qt(p,t.meta?.tenantId):A.expandHome(f);if(!L.existsSync(e))return k(`INVALID_ARGS`,`App binary not found: ${e}`);let r=await V({session:o,flags:s,ensureReady:!1}),l=O(n,r);if(l)return l;let u=c(r)?eo(d,e,await a.ios(r,d,e)):to(d,e,await a.android(r,d,e)),m=xe(u,$a(u));return Mr(i,o,t,n,m),{ok:!0,data:m}}finally{p&&yn(p)}}function $a(e){return`Installed: ${e.appName??ye(e)}`}function eo(e,t,n){let r=n.bundleId;return{app:e||r||n.launchTarget||t,appPath:t,platform:`ios`,...r?{appId:r,bundleId:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function to(e,t,n){let r=n.package;return{app:e||r||n.launchTarget||t,appPath:t,platform:`android`,...r?{appId:r,package:r,packageName:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function no(e,t){let n=t[0]?.trim(),r=t[1]?.trim();if(e===`install`){let e=r??n;return e?{ok:!0,app:r?n??``:``,appPathInput:e}:{ok:!1,response:k(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:k(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}async function ro(e,t,n){return await Le(e,t,n)}async function io(e){let{req:t,sessionName:o,sessionStore:c}=e;if(t.command===`session_list`){let e=Vn(t);return{ok:!0,data:{sessions:c.toArray().filter(t=>bn(t,e)).map(e=>{let t=c.resolveSessionDir(e.name);return{name:e.name,sessionStateDir:t,runnerLogPath:an(t),platform:i(e.device),...a(e.device.platform)&&e.device.appleOs?{appleOs:e.device.appleOs}:{},target:e.device.target??`mobile`,surface:e.surface??`app`,device:e.device.name,id:e.device.id,device_id:e.device.id,createdAt:e.createdAt,...a(e.device.platform)&&!s(e.device)&&{device_udid:e.device.id,ios_simulator_device_set:e.device.simulatorSetPath??null}}})}}}if(t.command===`devices`)try{let e=rt(t.flags?.androidDeviceAllowlist),n=t.flags?.platform,i=r({simulatorSetPath:nt(t.flags?.iosSimulatorDeviceSet),platform:n,target:t.flags?.target}),a=await tn({platform:n,target:t.flags?.target,deviceName:t.flags?.device,udid:t.flags?.udid,serial:t.flags?.serial,iosSimulatorSetPath:i,androidSerialAllowlist:e?Array.from(e).sort():void 0}),o=n?a.filter(e=>oo(e,n)):a;return{ok:!0,data:{devices:(t.flags?.target?o.filter(e=>(e.target??`mobile`)===t.flags?.target):o).map(ao)}}}catch(e){let t=n(e);return k(t.code,t.message,t.details)}if(t.command===`capabilities`){let e=c.get(o),n=t.flags??{},r=B(t.command,e,n);if(r)return r;let i=await V({session:e,flags:n,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0});return{ok:!0,data:{device:ao(i),availableCommands:fn().filter(e=>At(e,i))}}}if(t.command===`apps`){let e=c.get(o),n=t.flags??{},r=B(t.command,e,n);if(r)return r;let i=await V({session:e,flags:n,ensureReady:!0}),s=O(`apps`,i);if(s)return s;let l=Ke(t.flags?.appsFilter);return a(i.platform)?{ok:!0,data:{apps:(await Nr(i,l)).map(e=>e.name&&e.name!==e.bundleId?`${e.name} (${e.bundleId})`:e.bundleId)}}:{ok:!0,data:{apps:(await Ze(i,l)).map(e=>e.name&&e.name!==e.package?`${e.name} (${e.package})`:e.package)}}}return null}function ao({simulatorSetPath:e,appleOs:t,...n}){return{...n,platform:i({platform:n.platform,appleOs:t}),...a(n.platform)&&t?{appleOs:t}:{}}}function oo(e,t){return d(e,t)}async function so(e){let{ensureAndroidEmulatorBooted:t}=await import(`./logcat.js`).then(e=>e.c);return await t(e)}const co=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,lo=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;async function uo(e){let{req:t,sessionName:n,sessionStore:r}=e,o=r.get(n),l=t.flags??{},u=l.platform;if(!o&&oi(l))return k(`SESSION_NOT_FOUND`,u===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`);let d=B(`appstate`,o,l);if(d)return d;let f=a(o?.device.platform)&&ui(l,o),p=u===`ios`,m=u===`macos`;if(p&&!f)return k(`SESSION_NOT_FOUND`,co);if(m&&!f)return k(`SESSION_NOT_FOUND`,lo);if(f&&o){let e=o.appName??o.appBundleId;return!o.appName&&!o.appBundleId?s(o.device)&&o.surface&&o.surface!==`app`&&o.surface!==`frontmost-app`?{ok:!0,data:{platform:i(o.device),appName:o.surface,appBundleId:o.appBundleId,source:`session`,surface:o.surface}}:k(`COMMAND_FAILED`,`No foreground app is tracked for this ${s(o.device)?`macOS`:`iOS`} session. Open an app in the session, then retry appstate.`):{ok:!0,data:{platform:i(o.device),appName:e??`unknown`,appBundleId:o.appBundleId,source:`session`,surface:o.surface??`app`,...c(o.device)?{device_udid:o.device.id,ios_simulator_device_set:o.device.simulatorSetPath??null}:{}}}}let h=await V({session:o,flags:l,ensureReady:!0});if(c(h))return k(`SESSION_NOT_FOUND`,co);if(s(h))return k(`SESSION_NOT_FOUND`,lo);if(h.platform===`web`)return k(`UNSUPPORTED_OPERATION`,`appstate is not supported on web.`);let{getAndroidAppState:g}=await import(`./app-lifecycle.js`).then(e=>e.t),_=await g(h);return{ok:!0,data:{platform:`android`,package:_.package,activity:_.activity}}}async function fo(e){let{req:t,sessionName:r,logPath:o,sessionStore:s}=e;if(t.command===`boot`){let e=s.get(r),l=t.flags??{},u=B(t.command,e,l);if(u)return u;let d=(l.platform??e?.device.platform)===`android`,f=l.headless===!0;if(f&&!d)return k(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);let p=li({flags:l,sessionDevice:e?.device}),m=d&&!!p,h,g=!1;try{h=await V({session:e,flags:l,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0})}catch(e){let t=n(e);if(d&&f&&!p&&t.code===`DEVICE_NOT_FOUND`)return k(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);if(!m||t.code!==`DEVICE_NOT_FOUND`||!p)throw e;h=await so({avdName:p,serial:l.serial,headless:f}),g=!0}if(l.target&&(h.target??`mobile`)!==l.target)return k(`DEVICE_NOT_FOUND`,`No ${h.platform} device found matching --target ${l.target}.`);if(d&&f){if(h.platform!==`android`||h.kind!==`emulator`)return k(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);if(!g){let t=li({flags:l,sessionDevice:e?.device,resolvedDevice:h});if(!t)return k(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);h=await so({avdName:t,serial:l.serial,headless:!0})}await Dr(h)}else h.platform===`android`&&h.kind===`emulator`&&h.booted!==!0?(h=await so({avdName:h.name,serial:l.serial,headless:!1}),await Dr(h)):(h.platform!==`android`||h.booted!==!0)&&await Dr(h,{onIosSimulatorColdBootStart:Or({req:t,logPath:o,device:h,enabled:!0})});return O(`boot`,h)||(c(h)&&h.kind===`simulator`&&mt(h,{}),{ok:!0,data:{platform:i(h),target:h.target??`mobile`,device:h.name,id:h.id,kind:h.kind,booted:!0,...a(h.platform)&&h.appleOs?{appleOs:h.appleOs}:{}}})}if(t.command===`shutdown`){let e=s.get(r),n=t.flags??{},o=B(t.command,e,n);if(o)return o;let c=await V({ensureReady:!1,flags:n,session:e}),l=O(`shutdown`,c,{message:`shutdown is supported only for Apple simulators and Android emulators.`});if(l)return l;if(e&&e.device.platform===c.platform&&e.device.id===c.id)return k(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${r}`,session:r,platform:i(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind});let u=await za(c);return u.success?{ok:!0,data:{platform:i(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:u,...a(c.platform)&&c.appleOs?{appleOs:c.appleOs}:{}}}:k(u.error?.code??`COMMAND_FAILED`,po(u),{platform:i(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:u})}return t.command===`appstate`?await uo({req:t,sessionName:r,sessionStore:s}):null}function po(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}Yn();function mo(e){let t=[];for(let n of e){if(n.command!==`open`)continue;let e=n.result?.startup;if(!e||typeof e!=`object`)continue;let r=e;typeof r.durationMs!=`number`||!Number.isFinite(r.durationMs)||typeof r.measuredAt!=`string`||r.measuredAt.trim().length===0||r.method!==`open-command-roundtrip`||t.push({durationMs:Math.max(0,Math.round(r.durationMs)),measuredAt:r.measuredAt,method:ua,appTarget:typeof r.appTarget==`string`&&r.appTarget.length>0?r.appTarget:void 0,appBundleId:typeof r.appBundleId==`string`&&r.appBundleId.length>0?r.appBundleId:void 0})}return t.slice(-20)}async function ho(e,t={}){let n=vo(e);return Oo(e)?e.appBundleId?e.device.platform===`android`?(await wo(n,e,e.appBundleId,t),n):(await To(n,e,e.appBundleId),n):(Co(n,e),n):n}async function go(e,t={}){let n=xo(e);return Oo(e)?e.appBundleId?(await Do(n,e,e.appBundleId,t),n):(n.metrics.fps={available:!1,reason:ko(e)},n):n}async function _o(e,t){let n=So(e);return Oo(e)?t.action===`sample`?(n.metrics={memory:await Io(e,t)},n):(n.artifact=await Ro(e,t),n.support=Wo(n.artifact.support)??Uo(e),n):t.action===`snapshot`?(n.artifact=Vo(e,zo(e,t.kind)),n.support=Wo(n.artifact.support)??Uo(e),n):(n.metrics={memory:{available:!1,reason:da}},n)}function vo(e){let t=mo(e.actions),n=t.at(-1),r=n?{available:!0,lastDurationMs:n.durationMs,lastMeasuredAt:n.measuredAt,method:ua,sampleCount:t.length,samples:t}:{available:!1,reason:`No startup sample captured yet. Run open <app|url> in this session first.`,method:ua};return{session:e.name,platform:i(e.device),device:e.device.name,deviceId:e.device.id,metrics:{startup:r,...yo()},sampling:{startup:{method:ua,description:`Elapsed wall-clock time around dispatching the open command for the active session app target.`,unit:`ms`},...Ao(e)}}}function yo(){return{fps:bo(),memory:{available:!1,reason:da},cpu:{available:!1,reason:da}}}function bo(){return{available:!1,reason:`Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.`}}function xo(e){return{session:e.name,platform:i(e.device),device:e.device.name,deviceId:e.device.id,metrics:{fps:bo()},sampling:{fps:No(e)}}}function So(e){return{session:e.name,platform:i(e.device),device:e.device.name,deviceId:e.device.id,sampling:{memory:jo(e),snapshot:Mo(e)}}}function Co(e,t){let n=ko(t);e.metrics.fps={available:!1,reason:n},e.metrics.memory={available:!1,reason:n},e.metrics.cpu={available:!1,reason:n}}async function wo(e,t,n,r){Eo(e,t,await Po(t,n,r))}async function To(e,t,n){Eo(e,t,await Fo(t,n))}function Eo(e,t,n){e.metrics.memory=Ko(n.memory),e.metrics.cpu=Ko(n.cpu),e.metrics.fps=qo(Ko(n.fps),t)}async function Do(e,t,n,r){let i=t.device.platform===`android`?await Go(Ft(t.device,n,{adb:r.androidAdb})):await Go(ar(t.device,n));e.metrics.fps=qo(Ko(i),t)}function Oo(e){return Wn(e.device.platform)?.perf?.supportsMetrics(e.device)??!1}function ko(e){return e.device.platform===`android`?`No Android app package is associated with this session. Run open <app> first.`:`No Apple app bundle ID is associated with this session. Run open <app> first.`}function Ao(e){return e.device.platform===`android`?{memory:{method:Zt,description:gn,unit:`kB`},cpu:{method:zn,description:pn,unit:`percent`},fps:{method:Tn,description:Ut,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}}:Bt(e.device)}function jo(e){return e.device.platform===`android`?{method:Zt,description:gn,unit:`kB`,topConsumerLimit:5}:Bt(e.device).memory}function Mo(e){return e.device.platform===`android`?{method:vn,description:An,defaultKind:`android-hprof`,artifactOnly:!0}:{method:Wt,description:Ht,defaultKind:`memgraph`,artifactOnly:!0}}function No(e){return e.device.platform===`android`?{method:Tn,description:Ut,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}:Lt(e.device)}async function Po(e,t,n){let r={adb:n.androidAdb},[i,a,o]=await Promise.allSettled([rn(e.device,t,r),rr(e.device,t,r),Ft(e.device,t,r)]);return{memory:i,cpu:a,fps:o}}async function Fo(e,t){let n=await Go(ar(e.device,t)),r=await Go(Nt(e.device,t));if(r.status===`fulfilled`){let e=r.value;return{memory:{status:`fulfilled`,value:e.memory},cpu:{status:`fulfilled`,value:e.cpu},fps:n}}return{memory:{status:`rejected`,reason:r.reason},cpu:{status:`rejected`,reason:r.reason},fps:n}}async function Io(e,t){return e.appBundleId?Ko(e.device.platform===`android`?await Go(rn(e.device,e.appBundleId,{adb:t.androidAdb})):await Go(Lo(e))):{available:!1,reason:ko(e)}}async function Lo(e){if(!e.appBundleId)throw new t(`INVALID_ARGS`,ko(e));return(await Nt(e.device,e.appBundleId)).memory}async function Ro(e,n){if(!e.appBundleId)throw new t(`INVALID_ARGS`,ko(e),{hint:`Run open <app> first so perf memory snapshot can resolve the app process.`});let r=zo(e,n.kind),i=Bo(n,r);return e.device.platform===`android`?r===`android-hprof`?await $n(e.device,e.appBundleId,i,{adb:n.androidAdb}):Vo(e,r):r===`memgraph`?await Gt(e.device,e.appBundleId,i):Vo(e,r)}function zo(e,t){return t||(e.device.platform===`android`?`android-hprof`:`memgraph`)}function Bo(e,t){if(e.out)return A.expandHome(e.out,e.cwd);let n=t===`android-hprof`?`hprof`:t===`memgraph`?`memgraph`:`artifact`,r=new Date().toISOString().replace(/[:.]/g,`-`),i=e.sessionStore.ensureSessionDir(e.sessionName);return R.join(i,`artifacts`,`memory-${t}-${r}.${n}`)}function Vo(e,t){let n=Uo(e),r=Ho(e,t);return{available:!1,kind:t,reason:r.reason,hint:r.hint,support:n}}function Ho(e,t){return e.device.platform===`android`?{reason:`Android perf memory snapshot supports android-hprof, not ${t}.`,hint:`Use perf memory snapshot --kind android-hprof for Android Java heap artifacts.`}:a(e.device.platform)?{reason:`Apple perf memory snapshot supports memgraph, not ${t}.`,hint:`Use perf memory snapshot --kind memgraph for supported Apple app sessions.`}:{reason:`Memory snapshot artifacts are not supported on ${e.device.platform}.`,hint:`Use perf memory sample where supported, or run the snapshot against Android, iOS simulator, or macOS.`}}function Uo(e){return e.device.platform===`android`?{platform:e.device.platform,defaultKind:`android-hprof`,androidHprof:!0,memgraph:!1,heapprofd:!1,heapprofdDecision:`Deferred until Android Perfetto/heapprofd plumbing is available in the perf trace slice.`}:a(e.device.platform)?{...Rt(e.device),androidHprof:!1,heapprofd:!1,heapprofdDecision:`Deferred because heapprofd is Android/Perfetto-specific and outside this memory artifact slice.`}:{platform:e.device.platform,defaultKind:`memgraph`,androidHprof:!1,memgraph:!1,heapprofd:!1,reason:`Memory snapshot artifacts are available only on Android, iOS simulator, and macOS.`,hint:`Use perf memory sample where supported, or switch to a platform with memory artifact support.`,heapprofdDecision:`Deferred because heapprofd is Android/Perfetto-specific and outside this memory artifact slice.`}}function Wo(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}async function Go(e){try{return{status:`fulfilled`,value:await e}}catch(e){return{status:`rejected`,reason:e}}}function Ko(t){if(t.status===`fulfilled`)return{available:!0,...t.value};let n=e(t.reason);return{available:!1,reason:n.message,error:n}}function qo(e,t){if(e.available!==!0)return e;let n=Jo(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Jo(e,t){let n=Yo(t.windowStartedAt),r=Yo(t.windowEndedAt)??Yo(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(e=>e.ts>=n&&e.ts<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:Xo(e)})).slice(-12)}function Yo(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Xo(e){let t=e.result;if(t)for(let e of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=t[e];if(typeof n==`string`&&n.length>0)return n}}async function Zo(t){let n=Qo(t.req,t.area);if(!n.ok)return n;let{session:r}=t;if(r.device.platform!==`android`)return k(`UNSUPPORTED_OPERATION`,`Android native perf collectors are supported only on Android sessions.`);if(!r.appBundleId)return k(`COMMAND_FAILED`,`No Android app package is associated with this session.`,{hint:`Run open <app> first so perf can resolve the package and process identity.`});try{return{ok:!0,data:n.area===`cpu`?await ss(t,r,r.appBundleId,n):await cs(t,r,r.appBundleId,n)}}catch(t){return{ok:!1,error:e(t)}}}function Qo(e,t){let n=os(e,t);return t===`cpu`?$o(e,n):es(e,n)}function $o(e,t){let n=ts(e,1),r=ts(e,2),i=ts(e,3);return ge(n)?ns(r)?i===`simpleperf`?{ok:!0,area:`cpu`,subject:n,action:r,kind:i,outPath:t}:k(`INVALID_ARGS`,`perf cpu profile requires --kind simpleperf`):k(`INVALID_ARGS`,`perf cpu profile action must be start, stop, or report`):k(`INVALID_ARGS`,pe)}function es(e,t){let n=ts(e,1),r=ts(e,2);return rs(n)?ve(r)?r===`perfetto`?{ok:!0,area:`trace`,action:n,kind:r,outPath:t}:k(`INVALID_ARGS`,`perf trace requires --kind perfetto`):k(`INVALID_ARGS`,he):k(`INVALID_ARGS`,`perf trace action must be start or stop`)}function ts(e,t){return(e.positionals?.[t]??``).toLowerCase()}function ns(e){return e===`start`||e===`stop`||e===`report`}function rs(e){return e===`start`||e===`stop`}function is(e,t){return e.sessionStore.set(e.sessionName,{...e.session,nativePerf:{android:t}}),ps(t)}function as(e,t,n){return t?A.expandHome(t,e.req.meta?.cwd):fs(e.sessionStore,e.sessionName,n)}function os(e,t){return typeof e.flags?.out==`string`&&e.flags.out.length>0?e.flags.out:(e.positionals??[])[t===`cpu`?5:4]||void 0}async function ss(e,t,n,r){if(r.action===`start`){us(t);let i=as(e,r.outPath,`cpu.perf.data`);return is(e,await tr(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=ms(t,`cpu-profile`,r.kind);if(r.action===`report`){await ls(i);let n=as(e,r.outPath,`cpu-report.json`);return await Pt(t.device,i,n,{adb:e.androidAdbExecutor})}let a=ds(e,r.outPath,i);return is(e,await Kt(t.device,i,a,{adb:e.androidAdbExecutor}))}async function cs(e,t,n,r){if(r.action===`start`){us(t);let i=as(e,r.outPath,`app.perfetto-trace`);return is(e,await er(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=ms(t,`trace`,r.kind),a=ds(e,r.outPath,i);return is(e,await Jt(t.device,i,a,{adb:e.androidAdbExecutor}))}function ls(e){if(e.state===`running`)throw new t(`COMMAND_FAILED`,`Stop the Android Simpleperf CPU profile before generating a report.`,{hint:`Run perf cpu profile stop --kind simpleperf, then retry perf cpu profile report --kind simpleperf.`})}function us(e){let n=e.nativePerf?.android;if(n?.state===`running`)throw new t(`COMMAND_FAILED`,`Android ${n.kind} ${n.type} is already running for this session.`,{hint:n.type===`cpu-profile`?`Run perf cpu profile stop --kind simpleperf before starting another Android native perf capture.`:`Run perf trace stop --kind perfetto before starting another Android native perf capture.`})}function ds(e,t,n){return t?as(e,t,n.outPath):n.outPath}function fs(e,t,n){let r=new Date().toISOString().replace(/[:.]/g,`-`);return R.join(e.ensureSessionDir(t),`${r}-${n}`)}function ps(e){return{action:e.action,platform:`android`,type:e.type,kind:e.kind,packageName:e.packageName,appPid:e.appPid,profilerPid:e.profilerPid,state:e.state,startedAt:new Date(e.startedAt).toISOString(),stoppedAt:typeof e.stoppedAt==`number`?new Date(e.stoppedAt).toISOString():void 0,durationMs:e.durationMs,outPath:e.outPath,sizeBytes:e.sizeBytes,remotePath:e.remotePath,method:e.method,summary:e.summary,message:e.message}}function ms(e,n,r){let i=e.nativePerf?.android;if(i?.type===n&&i.kind===r)return i;throw new t(`COMMAND_FAILED`,`No Android ${r} ${n} is active for this session.`,{hint:n===`cpu-profile`?`Run perf cpu profile start --kind simpleperf first, then stop or report in the same session.`:`Run perf trace start --kind perfetto first, then stop in the same session.`})}async function hs(e){if(!Pn(e))return;let{macOsScreenCaptureKitAudioProbeBackend:t}=await import(`./audio-probe.js`);return t}const gs=[`probe`],_s=[`start`,`status`,`stop`],vs=`audio probe requires ${_s.join(`, `)}`;async function ys(t){let n=bs(t);if(!n.ok)return n;let r=await hs(n.session.device);if(r)return await Ss(t,n,r);let i=Er();if(!i.probeAudio)return k(`UNSUPPORTED_OPERATION`,`audio is not supported by this web provider`);try{return{ok:!0,data:await i.probeAudio({action:n.probeAction,durationMs:n.durationMs,bucketMs:n.bucketMs})}}catch(t){return{ok:!1,error:e(t)}}}function bs(e){let t=xs(e);if(!t.ok)return t;let n=Cs(e.req);if(!n.ok)return n;let r=ws(e.req,n.probeAction);return r.ok?{ok:!0,session:t.session,probeAction:n.probeAction,...r.timing}:r}function xs(e){let t=e.sessionStore.get(e.sessionName);return t?At(`audio`,t.device)?{ok:!0,session:t}:k(`UNSUPPORTED_OPERATION`,`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`):k(`SESSION_NOT_FOUND`,`audio requires an active session`)}async function Ss(t,n,r){try{return{ok:!0,data:await Kn({session:n.session,sessionName:t.sessionName,sessionStore:t.sessionStore,backend:r,probeAction:n.probeAction,durationMs:n.durationMs,bucketMs:n.bucketMs})}}catch(t){return{ok:!1,error:e(t)}}}function Cs(e){if(!Ts(e.positionals?.[0]))return k(`INVALID_ARGS`,`audio requires probe`);let t=Es(e.positionals?.[1]);return t?{ok:!0,probeAction:t}:k(`INVALID_ARGS`,vs)}function ws(e,t){if(t!==`start`&&e.positionals&&e.positionals.length>2)return k(`INVALID_ARGS`,`audio probe duration and bucket are only supported with audio probe start`);let n=Ds(e.positionals?.[2],{defaultValue:1e4,min:100,max:12e4,message:`audio probe duration must be an integer in range 100..120000 ms`});if(n instanceof Error)return k(`INVALID_ARGS`,n.message);let r=Ds(e.positionals?.[3],{defaultValue:1e3,min:100,max:1e4,message:`audio probe bucket must be an integer in range 100..10000 ms`});return r instanceof Error?k(`INVALID_ARGS`,r.message):{ok:!0,timing:{durationMs:n,bucketMs:r}}}function Ts(e){let t=(e??`probe`).toLowerCase();return gs.includes(t)?`probe`:void 0}function Es(e){let t=(e??`status`).toLowerCase();return _s.includes(t)?t:void 0}function Ds(e,t){if(e===void 0)return t.defaultValue;let n=Number.parseInt(e,10);return!Number.isInteger(n)||String(n)!==e||n<t.min||n>t.max?Error(t.message):n}async function Os(t,n){let r=ks(t.req);if(!r.ok)return r;if(n.device.platform===`android`)return k(`UNSUPPORTED_OPERATION`,`Android native profiling belongs to the Android perf rollout; Apple xctrace perf supports iOS and macOS sessions only.`);if(!a(n.device.platform))return k(`UNSUPPORTED_OPERATION`,`Apple xctrace perf is not supported on ${n.device.platform}.`);if(!n.appBundleId)return k(`INVALID_ARGS`,`Apple xctrace perf requires an active app session. Run open <app> first.`);try{return r.action===`start`?await Ps(t,n,r):r.action===`stop`?await Fs(t,n,r):await Bs(t,n,r)}catch(t){return{ok:!1,error:e(t)}}}function ks(e){let t=e.positionals??[],n=t[0]?.toLowerCase();return n===`cpu`?As(t):n===`trace`?js(t):k(`INVALID_ARGS`,me)}function As(e){if(e[1]?.toLowerCase()!==`profile`)return k(`INVALID_ARGS`,`perf cpu requires profile`);let t=Ms(e[2],`perf cpu profile`,!0);if(!t.ok)return t;let n=Ns(e[3]);return n.ok?{ok:!0,area:`cpu`,mode:`cpu-profile`,action:t.value,kind:`xctrace`,template:e[4]||void 0,outPath:e[5]||void 0,tracePath:e[6]||void 0}:n}function js(e){let t=Ms(e[1],`perf trace`,!1);if(!t.ok)return t;let n=Ns(e[2]);return n.ok?{ok:!0,area:`trace`,mode:`trace`,action:t.value,kind:`xctrace`,template:e[3]||void 0,outPath:e[4]||void 0,tracePath:e[5]||void 0}:n}function Ms(e,t,n){let r=e?.toLowerCase();return r===`start`||r===`stop`||n&&r===`report`?{ok:!0,value:r}:k(`INVALID_ARGS`,n?`${t} requires start, stop, or report`:`${t} requires start or stop`)}function Ns(e){return e?.toLowerCase()===`xctrace`?{ok:!0}:k(`INVALID_ARGS`,`perf native collection currently supports --kind xctrace`)}async function Ps(e,t,n){if(t.applePerf?.active)return k(`INVALID_ARGS`,`Apple xctrace perf capture already in progress`);let r=n.template??Ws(n.mode),i=Us(e,n),a=await jt({device:t.device,appBundleId:t.appBundleId,mode:n.mode,template:r,outPath:i});t.applePerf={...t.applePerf??{},active:a},e.sessionStore.set(e.sessionName,t);let o=Gs(`started`,a);return Hs(e,t,o),{ok:!0,data:o}}async function Fs(e,t,n){let r=t.applePerf?.active;if(!r)return k(`INVALID_ARGS`,`no active Apple xctrace perf capture`);let i=n.outPath?A.expandHome(n.outPath,e.req.meta?.cwd):r.outPath,a;try{a=await wn(r,i)}catch(n){throw Ls(n)&&Is(e,t),n}Rs(e,t,a);let o=Gs(`stopped`,a);return Hs(e,t,o),{ok:!0,data:o}}function Is(e,t){t.applePerf={...t.applePerf??{},active:void 0},e.sessionStore.set(e.sessionName,t)}function Ls(e){return n(e).details?.captureCleanedUp===!0}function Rs(e,t,n){t.applePerf={...t.applePerf??{},active:void 0,lastMode:n.mode,...zs(n)},e.sessionStore.set(e.sessionName,t)}function zs(e){return e.mode===`cpu-profile`?{lastProfileTracePath:e.outPath,lastProfileTemplate:e.template}:{lastTracePath:e.outPath}}async function Bs(e,t,n){if(n.mode!==`cpu-profile`)return k(`INVALID_ARGS`,`perf trace does not support report`);if(t.applePerf?.active)return k(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let r=Us(e,n),i=Vs(t,n);if(!i.ok)return i;let a={perf:`reported`,...await Vt({tracePath:A.expandHome(i.value,e.req.meta?.cwd),outPath:r,mode:n.mode,template:t.applePerf?.lastProfileTemplate??n.template,appBundleId:t.appBundleId})};return Hs(e,t,a),{ok:!0,data:a}}function Vs(e,t){let n=t.tracePath??e.applePerf?.lastProfileTracePath??e.applePerf?.active?.outPath;return n?{ok:!0,value:n}:k(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`)}function Hs(e,t,n){Mr(e.sessionStore,t,e.req,`perf`,n)}function Us(e,t){if(t.outPath)return A.expandHome(t.outPath,e.req.meta?.cwd);let n=e.sessionStore.ensureSessionDir(e.sessionName),r=new Date().toISOString().replace(/[:.]/g,`-`),i=t.action===`report`?`json`:`trace`;return`${n}/perf-${t.mode}-${r}.${i}`}function Ws(e){return e===`cpu-profile`?`Time Profiler`:`Animation Hitches`}function Gs(e,t){return{perf:e,kind:t.kind,mode:t.mode,template:t.template,outPath:t.outPath,appBundleId:t.appBundleId,deviceId:t.deviceId,platform:t.platform,targetPids:t.targetPids,targetProcesses:t.targetProcesses,startedAt:t.startedAt,endedAt:t.endedAt}}const Ks=`logs requires ${Oe.slice(0,-1).join(`, `)}, or ${Oe.at(-1)}`,qs=[`dump`,`log`],Js=`network requires ${qs.join(` or `)}`,Ys=`network include mode must be one of: ${l.join(`, `)}`,Xs={path:({session:e,sessionName:t,sessionStore:n})=>xc(e,t,n),doctor:({session:e,sessionName:t,sessionStore:n})=>Sc(e,t,n),mark:({req:e,sessionName:t,sessionStore:n})=>Cc(e,t,n),clear:({session:e,sessionName:t,sessionStore:n,restart:r})=>wc(e,t,n,r),start:({session:e,sessionName:t,sessionStore:n})=>Tc(e,t,n),stop:({session:e,sessionName:t,sessionStore:n})=>Ec(e,t,n)};function Zs(e){if(e.appLog){let t=e.appLog.getState();return{active:t===`active`||t===`recovering`,state:t,backend:e.appLog.backend,startedAt:e.appLog.startedAt,notes:ec(t)}}return e.appLogFailure?{active:!1,state:`failed`,backend:e.appLogFailure.backend,failureCode:e.appLogFailure.code,failureMessage:e.appLogFailure.message,hint:e.appLogFailure.hint,notes:[$s(e.appLogFailure)]}:{active:!1,state:`inactive`,backend:Rn(e.device)}}function Qs(e,t){return{backend:t,code:e.code,message:e.message,hint:e.hint}}function $s(e){return e.hint?`${e.message} ${e.hint}`:e.message}function ec(e){if(e===`failed`)return[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`];if(e===`ended`)return[`The app log stream process ended. Run logs clear --restart before the next capture window.`]}function tc(e,t){return qt([...e,...t.notes??[]])}function nc(e,t,n){return{...n,platform:e.device.platform,outPath:t}}function rc(t,n,r,i){let a=e(i);return t.set(n,{...r,appLog:void 0,appLogFailure:Qs(a,Rn(r.device))}),{ok:!1,error:a}}async function ic(e){let{req:t}=e;return t.command===`perf`?ac(e):t.command===`logs`?yc(e):t.command===`network`?Dc(e):t.command===`audio`?await ys(e):null}async function ac(t){let{req:n,sessionName:r,sessionStore:i,androidAdbExecutor:a}=t,o=i.get(r);if(!o)return k(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);let s=(n.positionals?.[0]??`metrics`).toLowerCase();if(oc(s))return o.device.platform===`android`?await Zo({req:n,sessionName:r,sessionStore:i,session:o,androidAdbExecutor:a,area:s}):await Os(t,o);let c=sc(n);if(!c.ok)return c;if(c.native)return await Os(t,o);try{return{ok:!0,data:await cc(t,o,c)}}catch(t){return{ok:!1,error:e(t)}}}function oc(e){return e===`cpu`||e===`trace`}function sc(n){let r=lc(n.positionals?.[0]);if(!r)return k(`INVALID_ARGS`,me);if(r===`cpu`||r===`trace`)return{ok:!0,native:!0};let i=uc(n.positionals?.[1]);if(!i)return k(`INVALID_ARGS`,se);let a=dc(n.flags?.kind);return a instanceof t?{ok:!1,error:e(a)}:(fc(r,i)??hc(n,r,i,a))||{ok:!0,native:!1,area:r,action:i,kind:a,out:vc(n.flags?.out)}}async function cc(e,t,n){let{sessionName:r,sessionStore:i,androidAdbExecutor:a}=e;return n.area===`memory`?await _o(t,{action:mc(n.action),kind:n.kind,out:n.out,cwd:e.req.meta?.cwd,sessionName:r,sessionStore:i,androidAdb:a}):n.area===`frames`?await go(t,{androidAdb:a}):await ho(t,{androidAdb:a})}function lc(e){let t=(e??`metrics`).toString().toLowerCase();return le(t)?t:void 0}function uc(e){let t=(e??`sample`).toString().toLowerCase();return ke(t)?t:void 0}function dc(e){if(e!==void 0)return typeof e!=`string`||!ve(e)?new t(`INVALID_ARGS`,he):e}function fc(e,t){if(e===`memory`)return pc(t)?void 0:k(`INVALID_ARGS`,`perf memory requires sample or snapshot`);if(t!==`sample`)return k(`INVALID_ARGS`,`perf metrics and perf frames only support sample`)}function pc(e){return e===`sample`||e===`snapshot`}function mc(e){if(pc(e))return e;throw new t(`INVALID_ARGS`,`perf memory requires sample or snapshot`)}function hc(e,t,n,r){return gc(e.flags?.out,t,n)??_c(r,t,n)}function gc(e,t,n){if(!(!e||t===`memory`&&n===`snapshot`))return k(`INVALID_ARGS`,`--out is only supported with perf memory snapshot`)}function _c(e,t,n){if(e){if(t!==`memory`||n!==`snapshot`)return k(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(!de(e))return k(`INVALID_ARGS`,fe)}}function vc(e){return typeof e==`string`&&e.length>0?e:void 0}async function yc(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(!i)return k(`SESSION_NOT_FOUND`,`logs requires an active session`);let a=O(`logs`,i.device);if(a)return a;let o=bc(t);return o.ok?await Xs[o.action]({...e,session:i,restart:o.restart}):o}function bc(e){let t=(e.positionals?.[0]??`path`).toLowerCase(),n=!!e.flags?.restart;return Oe.includes(t)?n&&t!==`clear`?k(`INVALID_ARGS`,`logs --restart is only supported with logs clear`):{ok:!0,action:t,restart:n}:k(`INVALID_ARGS`,Ks)}function xc(e,t,n){let r=n.resolveAppLogPath(t),i=Cn(r),a=Zs(e);return{ok:!0,data:{path:r,active:a.active,state:a.state,backend:a.backend,sizeBytes:i.sizeBytes,modifiedAt:i.modifiedAt,startedAt:a.startedAt?new Date(a.startedAt).toISOString():void 0,failureCode:a.failureCode,failureMessage:a.failureMessage,hint:a.hint??`Grep the file for token-efficient debugging, e.g. grep -n "Error\\|Exception" <path>`,notes:a.notes}}}async function Sc(e,t,n){let r=n.resolveAppLogPath(t),i=await kn(e.device,e.appBundleId),a=Zs(e);return{ok:!0,data:{path:r,active:a.active,state:a.state,backend:a.backend,checks:i.checks,failureCode:a.failureCode,failureMessage:a.failureMessage,hint:a.hint,notes:tc(i.notes,a)}}}function Cc(e,t,n){let r=e.positionals?.slice(1).join(` `)??``,i=n.resolveAppLogPath(t);return Fn(i,r),{ok:!0,data:{path:i,marked:!0}}}async function wc(e,t,n,r){if(e.appLog&&!r)return k(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=n.resolveAppLogPath(t);if(!r){let r=Gn(i);return n.set(t,{...e,appLogFailure:void 0}),{ok:!0,data:r}}let a=e.appBundleId;if(!a)return k(`INVALID_ARGS`,`logs clear --restart requires an app session; run open <app> first`);e.appLog&&await cn(e.appLog);let o=Gn(i),s=n.resolveAppLogPidPath(t);try{let r=await Jn(e.device,a,i,s);return n.set(t,{...e,appLog:nc(e,i,r),appLogFailure:void 0}),{ok:!0,data:{...o,restarted:!0}}}catch(r){return rc(n,t,e,r)}}async function Tc(e,t,n){if(e.appLog)return k(`INVALID_ARGS`,`app log already streaming; run logs stop first`);if(!e.appBundleId)return k(`INVALID_ARGS`,`logs start requires an app session; run open <app> first`);let r=n.resolveAppLogPath(t),i=n.resolveAppLogPidPath(t);try{let a=await Jn(e.device,e.appBundleId,r,i);return n.set(t,{...e,appLog:nc(e,r,a),appLogFailure:void 0}),{ok:!0,data:{path:r,started:!0}}}catch(r){return rc(n,t,e,r)}}async function Ec(e,t,n){if(!e.appLog)return k(`INVALID_ARGS`,`no app log stream active`);let r=e.appLog.outPath;return await cn(e.appLog),n.set(t,{...e,appLog:void 0,appLogFailure:void 0}),{ok:!0,data:{path:r,stopped:!0}}}async function Dc(e){let t=kc(e);if(!t.ok)return t;let{include:n,maxEntries:r,session:i}=t;if(i.device.platform===`web`)return await Oc({include:n,maxEntries:r});let a=await nn({device:i.device,appBundleId:i.appBundleId,appLogState:i.appLog?.getState(),appLogStartedAt:i.appLog?.startedAt,appLogPath:e.sessionStore.resolveAppLogPath(e.sessionName),maxEntries:r,include:n,maxPayloadChars:2048,maxScanLines:4e3});return{ok:!0,data:{...a.dump,active:!!i.appLog,state:i.appLog?.getState()??`inactive`,backend:a.backend,notes:a.notes}}}async function Oc(t){let n=Er();if(!n.dumpNetwork)return k(`UNSUPPORTED_OPERATION`,`network is not supported by this web provider`);try{let e=await n.dumpNetwork({include:t.include,limit:t.maxEntries});return{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend??`agent-browser`,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:2048,maxScanLines:e.entries.length},notes:e.notes}}}catch(t){return{ok:!1,error:e(t)}}}function kc(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(!i)return k(`SESSION_NOT_FOUND`,`network requires an active session`);let a=O(`network`,i.device);if(a)return a;let o=(t.positionals?.[0]??`dump`).toLowerCase();if(!qs.includes(o))return k(`INVALID_ARGS`,Js);let s=t.positionals?.[1]?Number.parseInt(t.positionals[1],10):25;if(!Number.isInteger(s)||s<1||s>200)return k(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`);let c=Ac(t);return c.ok?{ok:!0,session:i,maxEntries:s,include:c.include}:c}function Ac(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return k(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return l.includes(r)?{ok:!0,include:r}:k(`INVALID_ARGS`,Ys)}function jc(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=A.expandHome(t??`.agent-device/test-artifacts`,n);return R.join(i,r)}function Mc(e,t){let n=t?R.relative(t,e):R.basename(e);return(n.length===0||n.startsWith(`..`)?R.basename(e):n).toLowerCase().replace(/[\\/]+/g,`__`).replace(/[^a-z0-9._-]+/g,`-`).replace(/^-+|-+$/g,``)||`test`}function Nc(e,t){L.mkdirSync(t,{recursive:!0}),Lc(e,t)}function Pc(e){let{response:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=[...Fc(t)];!t.ok&&typeof t.error.logPath==`string`&&s.push(t.error.logPath);let c=Ic(s,o),l=[`file: ${n}`,`session: ${r}`,`attempt: ${i}/${a}`,`status: ${t.ok?`passed`:`failed`}`];if(t.ok){let e=typeof t.data?.replayed==`number`?t.data.replayed:0,n=typeof t.data?.healed==`number`?t.data.healed:0;l.push(`replayed: ${e}`,`healed: ${n}`)}else l.push(`code: ${t.error.code}`,`message: ${t.error.message}`),t.error.hint&&l.push(`hint: ${t.error.hint}`),t.error.diagnosticId&&l.push(`diagnosticId: ${t.error.diagnosticId}`),t.error.logPath&&l.push(`logPath: ${t.error.logPath}`),t.error.details?.reason===`timeout`&&l.push(`timeoutMode: cooperative`);c.length>0&&l.push(`copiedArtifacts: ${c.map(e=>R.basename(e)).join(`, `)}`);let u=R.join(o,`result.txt`),d=`${l.join(`
3
+ `)}\n`;L.writeFileSync(u,d),t.ok||L.writeFileSync(R.join(o,`failure.txt`),d)}function Fc(e){let t=e.ok?e.data?.artifactPaths:e.error.details?.artifactPaths;return Array.isArray(t)?[...new Set(t.filter(e=>typeof e==`string`))]:[]}function Ic(e,t){let n=[],r=new Map;for(let i of e){if(!Bc(i))continue;let e=zc(R.basename(i),r),a=R.join(t,e);R.resolve(i)!==R.resolve(a)&&L.copyFileSync(i,a),n.push(a)}return n}function Lc(e,t){let n=R.join(t,`replay.ad`);if(L.copyFileSync(e,n),!Rc(e))return;let r=R.join(t,R.basename(e));R.resolve(r)!==R.resolve(n)&&L.copyFileSync(e,r)}function Rc(e){let t=R.extname(e).toLowerCase();return t===`.yml`||t===`.yaml`}function zc(e,t){let n=R.extname(e),r=n?e.slice(0,-n.length):e,i=t.get(e)??0;return t.set(e,i+1),i===0?e:`${r}-${i+1}${n}`}function Bc(e){try{return L.statSync(e).isFile()}catch{return!1}}function Vc(e,n,r){if(e==null)return P(`open`,[I(pr(n,`launchApp`),r)]);if(typeof e==`string`)return P(`open`,[I(e,r)]);if(!F(e))throw new t(`INVALID_ARGS`,`launchApp expects a string or map.`);M(e,`launchApp`,[`appId`,`stopApp`,`clearState`,`clearKeychain`,`arguments`,`permissions`,`launchArguments`]),Kc(e,`permissions`),Kc(e,`clearKeychain`);let i=I(typeof e.appId==`string`?e.appId:pr(n,`launchApp`),r),a=Uc(e,r),o=e.clearState===!0,s=!o&&(e.stopApp===!0||a.length>0);return P(`open`,[i],{...s?{relaunch:!0}:{},...o?{clearAppState:!0}:{},...a.length>0?{launchArgs:a}:{}})}function Hc(e,n,r){if(e==null)return P(`close`,[I(pr(n,`stopApp`),r)]);if(typeof e==`string`)return P(`close`,[I(e,r)]);throw new t(`INVALID_ARGS`,`stopApp expects a string appId or no value.`)}function Uc(e,t){return[...Wc(e.arguments,`launchApp.arguments`,t),...Wc(e.launchArguments,`launchApp.launchArguments`,t)]}function Wc(e,n,r){if(e==null)return[];if(typeof e==`string`)return[I(e,r)];if(Array.isArray(e))return e.map((e,t)=>Gc(e,`${n}[${t}]`,r));if(F(e))return Object.entries(e).flatMap(([e,t])=>[I(e,r),Gc(t,`${n}.${e}`,r)]);throw new t(`INVALID_ARGS`,`${n} expects a string, list, or map.`)}function Gc(e,n,r){if(typeof e==`string`)return I(e,r);if(typeof e==`number`||typeof e==`boolean`)return String(e);throw new t(`INVALID_ARGS`,`${n} must be a string, number, or boolean.`)}function Kc(e,t){if(e[t]!==void 0)throw N(`Maestro launchApp field "${t}" is not supported yet.`)}const U={runScript:`__maestroRunScript`,assertVisible:`__maestroAssertVisible`,assertNotVisible:`__maestroAssertNotVisible`,pressEnter:`__maestroPressEnter`,waitForAnimationToEnd:`__maestroWaitForAnimationToEnd`,scrollUntilVisible:`__maestroScrollUntilVisible`,swipeScreen:`__maestroSwipeScreen`,swipeOn:`__maestroSwipeOn`,tapOn:`__maestroTapOn`,tapPointPercent:`__maestroTapPointPercent`};function qc(e,t){if(typeof e==`string`)return P(U.tapOn,[ul(I(e,t))],ml(e));if(F(e)&&typeof e.point==`string`){M(e,`tapOn`,[`point`,`repeat`,`delay`,`optional`,`label`]);let t=yr(e.point);return t.kind===`percent`?P(U.tapPointPercent,[String(t.x),String(t.y)],pl(e)):P(`click`,[String(t.x),String(t.y)],pl(e))}F(e)&&M(e,`tapOn`,[`id`,`text`,`childOf`,`enabled`,`index`,`selected`,`repeat`,`delay`,`optional`,`label`]);let n=ml(e);return P(U.tapOn,[W(e,`tapOn`,[`repeat`,`delay`,`optional`,`label`,`index`,`childOf`],t),...dl(e,t)],n)}function Jc(e,t){if(F(e)&&typeof e.point==`string`){M(e,`doubleTapOn`,[`point`,`delay`]);let t=vr(e.point);return P(`click`,[String(t.x),String(t.y)],hl(e))}return F(e)&&M(e,`doubleTapOn`,[`id`,`text`,`enabled`,`selected`,`delay`]),P(`click`,[W(e,`doubleTapOn`,[`delay`],t)],hl(e))}function Yc(e,t){if(F(e)&&typeof e.point==`string`){M(e,`longPressOn`,[`point`]);let t=vr(e.point);return P(`longpress`,[String(t.x),String(t.y),`3000`])}return F(e)&&M(e,`longPressOn`,[`id`,`text`,`enabled`,`selected`]),P(`click`,[W(e,`longPressOn`,[],t)],{holdMs:3e3})}function Xc(e){if(typeof e==`string`)return e;if(!F(e))throw new t(`INVALID_ARGS`,`inputText expects a string or map.`);if(M(e,`inputText`,[`text`,`label`]),typeof e.text!=`string`)throw new t(`INVALID_ARGS`,`inputText map requires a string text field.`);return e.text}function Zc(e){if(e==null)return P(`type`,[`\b`.repeat(50)]);if(typeof e==`number`&&Number.isInteger(e)&&e>0)return P(`type`,[`\b`.repeat(e)]);if(!F(e))throw new t(`INVALID_ARGS`,`eraseText expects empty, a positive count, or a map.`);if(M(e,`eraseText`,[`charactersToErase`]),e.charactersToErase===void 0)return P(`type`,[`\b`.repeat(50)]);if(typeof e.charactersToErase!=`number`||!Number.isInteger(e.charactersToErase)||e.charactersToErase<=0)throw new t(`INVALID_ARGS`,`eraseText.charactersToErase must be a positive integer.`);return P(`type`,[`\b`.repeat(e.charactersToErase)])}function Qc(e,n){if(!F(e))throw new t(`INVALID_ARGS`,`extendedWaitUntil expects a map.`);M(e,`extendedWaitUntil`,[`visible`,`notVisible`,`timeout`]);let r=e.visible??e.notVisible;if(r===void 0)throw N(`Only Maestro extendedWaitUntil.visible/notVisible is supported.`);let i=W(r,`extendedWaitUntil`,[],n),a=String(xr(e,17e3));return e.notVisible===void 0?[P(U.assertVisible,[i,a],{maestro:{allowAlreadyPastLoading:!0}})]:[P(U.assertNotVisible,[i,a])]}function $c(e){if(e!=null)throw N(`Maestro scroll options are not supported yet.`);return P(`scroll`,[`down`])}function el(e,n){if(typeof e==`string`)return[P(U.scrollUntilVisible,[ul(I(e,n)),`5000`,`down`])];if(!F(e))throw new t(`INVALID_ARGS`,`scrollUntilVisible expects a string or map.`);M(e,`scrollUntilVisible`,[`element`,`direction`,`timeout`]);let r=W(e.element,`scrollUntilVisible.element`,[],n),i=typeof e.direction==`string`?sl(e.direction,`scrollUntilVisible.direction`):`down`,a=String(xr(e,5e3));return[P(U.scrollUntilVisible,[r,a,i])]}function tl(e,n){if(!F(e))throw new t(`INVALID_ARGS`,`swipe expects a map.`);M(e,`swipe`,[`start`,`end`,`direction`,`duration`,`from`,`label`]);let r=e.from??(typeof e.label==`string`?e.label:void 0);return r===void 0?typeof e.direction==`string`?P(U.swipeScreen,[`direction`,cl(e.direction),...fl(e)]):rl(e):nl(e,r,n)}function nl(e,t,n){let r=cl(typeof e.direction==`string`?e.direction:`up`);return P(U.swipeOn,[W(t,`swipe.from`,[],n),r,...fl(e)])}function rl(e){let{start:t,end:n}=il(e);return ol(t,n,al(e.duration))}function il(e){if(typeof e.start==`string`&&typeof e.end==`string`)return{start:yr(e.start),end:yr(e.end)};throw N(`Only Maestro swipe start/end coordinates are supported.`)}function al(e){return typeof e==`number`&&Number.isFinite(e)?String(Math.max(16,Math.floor(e))):void 0}function ol(e,t,n){if(e.kind===`absolute`&&t.kind===`absolute`)return P(`swipe`,[String(e.x),String(e.y),String(t.x),String(t.y),...n?[n]:[]]);if(e.kind===`percent`&&t.kind===`percent`)return P(U.swipeScreen,[`percent`,String(e.x),String(e.y),String(t.x),String(t.y),...n?[n]:[]]);throw N(`Maestro swipe start/end must both be absolute pixels or both be percentages.`)}function sl(e,t){let n=e.toLowerCase();switch(n){case`up`:case`down`:case`left`:case`right`:return n;default:throw N(`Maestro ${t} must be UP, DOWN, LEFT, or RIGHT.`)}}function cl(e){return sl(e,`swipe direction`)}function ll(e){let t=mr(`pressKey`,e).toLowerCase();if(t===`back`)return P(`back`);if(t===`enter`||t===`return`)return P(U.pressEnter);if(t===`home`)return P(`home`);throw N(`Maestro pressKey "${t}" is not supported yet.`)}function W(e,n,r=[],i){if(typeof e==`string`)return ul(I(e,i));if(!F(e))throw new t(`INVALID_ARGS`,`${n} expects a string or selector map.`);M(e,n,[`id`,`text`,`enabled`,`selected`,...r]);let a=[],o=[];if(typeof e.enabled==`boolean`&&o.push(G(`enabled`,String(e.enabled))),typeof e.selected==`boolean`&&o.push(G(`selected`,String(e.selected))),typeof e.id==`string`&&a.push(G(`id`,I(e.id,i)),...o),typeof e.text==`string`&&a.length===0)return ul(I(e.text,i),o);if(typeof e.label==`string`&&a.length===0&&a.push(G(`label`,I(e.label,i)),...o),a.length===0&&o.length>0&&a.push(...o),a.length===0)throw new t(`INVALID_ARGS`,`${n} selector map must include one of id, text, label, enabled, or selected.`);return a.join(` `)}function ul(e,t=[]){return[[G(`label`,e),...t].join(` `),[G(`text`,e),...t].join(` `),[G(`id`,e),...t].join(` `)].join(` || `)}function dl(e,n){if(!F(e))return[];let r={};if(e.index!==void 0){if(typeof e.index!=`number`||!Number.isInteger(e.index)||e.index<0)throw new t(`INVALID_ARGS`,`tapOn.index must be a non-negative integer.`);r.index=e.index}return e.childOf!==void 0&&(r.childOf=W(e.childOf,`tapOn.childOf`,[],n)),Object.keys(r).length>0?[JSON.stringify(r)]:[]}function fl(e){let t=al(e.duration);return t?[t]:[]}function G(e,t){return`${e}=${JSON.stringify(t)}`}function pl(e){if(!F(e))return;let t={},n=gl(e.repeat),r=_l(e.delay);return n&&n>1&&(t.count=n),r!==void 0&&(t.intervalMs=r),e.optional===!0&&(t.maestro={optional:!0}),Object.keys(t).length>0?t:void 0}function ml(e){let t=pl(e)??{};return{...t,maestro:{...t.maestro??{},allowNonHittableCoordinateFallback:!0}}}function hl(e){let t={doubleTap:!0};return F(e)&&typeof e.delay==`number`&&Number.isInteger(e.delay)&&(t.intervalMs=Math.max(0,e.delay)),t}function gl(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}function _l(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:void 0}const vl=1e3;function yl(e,n,r,i,a){if(typeof e==`string`)return i.parseRunFlowFile(I(e,r),r).actions;if(!F(e))throw new t(`INVALID_ARGS`,`runFlow expects a file path string or map.`);M(e,`runFlow`,[`file`,`commands`,`env`,`when`,`label`]);let o=Cl(e.when,r);return o.shouldRun?Rl(Sl(e,n,{...r,env:{...r.env,...gr(e.env,`runFlow.env`),...r.envOverrides}},i,a),o):[]}function bl(e,n,r,i,a){if(!F(e))throw new t(`INVALID_ARGS`,`repeat expects a map.`);if(M(e,`repeat`,[`times`,`commands`,`while`]),e.while!==void 0)throw N(`Maestro repeat.while is not supported yet. Only deterministic repeat.times is supported.`);let o=Bl(e.times,r);if(!Array.isArray(e.commands))throw new t(`INVALID_ARGS`,`repeat requires a commands list.`);if(o>vl)throw new t(`INVALID_ARGS`,`repeat.times must be <= ${vl} for deterministic replay expansion.`);let s=br(e.commands);return Array.from({length:o}).flatMap(()=>a(s,n,r,i))}function xl(e,n,r,i,a){if(!F(e))throw new t(`INVALID_ARGS`,`retry expects a map.`);if(M(e,`retry`,[`maxRetries`,`commands`]),!Array.isArray(e.commands))throw new t(`INVALID_ARGS`,`retry requires a commands list.`);let o=Vl(e.maxRetries,r),s=a(br(e.commands),n,r,i);return[zl(`retry`,[String(o)],{kind:`retry`,maxRetries:o,actions:s})]}function Sl(e,n,r,i,a){if(typeof e.file==`string`)return i.parseRunFlowFile(I(e.file,r),r).actions;if(Array.isArray(e.commands))return a(br(e.commands),n,r,i);throw new t(`INVALID_ARGS`,`runFlow map requires either file or commands.`)}function Cl(e,n){if(e==null)return{shouldRun:!0};if(!F(e))throw new t(`INVALID_ARGS`,`runFlow.when expects a map.`);return M(e,`runFlow.when`,[`platform`,`visible`,`notVisible`,`true`]),wl(e,n)?{shouldRun:!0,...Tl(e,n)}:{shouldRun:!1}}function wl(e,n){if(e.true!==void 0&&!Dl(e.true,n))return!1;if(e.platform===void 0)return!0;let r=El(e.platform,`runFlow.when.platform`);if(!n.platform)throw new t(`INVALID_ARGS`,`Maestro runFlow.when.platform requires replay to be run with --platform ios|android.`);return r===n.platform}function Tl(e,t){return{...e.visible===void 0?{}:{visibleSelector:W(e.visible,`runFlow.when.visible`,[],t)},...e.notVisible===void 0?{}:{notVisibleSelector:W(e.notVisible,`runFlow.when.notVisible`,[],t)}}}function El(e,n){if(typeof e!=`string`)throw new t(`INVALID_ARGS`,`${n} expects Android, iOS, or Web.`);let r=e.trim().toLowerCase();if(r===`android`||r===`ios`||r===`web`)return r;throw new t(`INVALID_ARGS`,`${n} expects Android, iOS, or Web.`)}function Dl(e,n){if(typeof e==`boolean`)return e;if(typeof e!=`string`)throw new t(`INVALID_ARGS`,`runFlow.when.true expects a boolean or expression string.`);return new Ll(kl(Ol(I(e,n))),{platform:n.platform}).parse()}function Ol(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1).trim():t}function kl(e){let n=[],r=0;for(;r<e.length;){let i=e.slice(r),a=Al(i);if(a>0){r+=a;continue}let o=jl(i);if(o){n.push(o.token),r+=o.length;continue}throw new t(`INVALID_ARGS`,`Unsupported runFlow.when.true expression near "${i.slice(0,24)}".`)}return n}function Al(e){return/^\s+/.exec(e)?.[0].length??0}function jl(e){return Ml(e)??Nl(e)??Pl(e)??Fl(e)??Il(e)}function Ml(e){return e.startsWith(`maestro.platform`)?{token:{type:`platform`},length:16}:null}function Nl(e){let t=/^(==|!=|&&|\|\|)/.exec(e)?.[1];return t?{token:{type:`operator`,value:t},length:t.length}:null}function Pl(e){let t=e[0];return t===`(`||t===`)`?{token:{type:`paren`,value:t},length:1}:null}function Fl(e){let t=/^(['"])(.*?)\1/.exec(e);return t?{token:{type:`string`,value:t[2]??``},length:t[0].length}:null}function Il(e){let t=/^(true|false)\b/.exec(e)?.[1];return t?{token:{type:`boolean`,value:t===`true`},length:t.length}:null}var Ll=class{index=0;tokens;context;constructor(e,t){this.tokens=e,this.context=t}parse(){let e=this.parseOr();if(this.peek())throw new t(`INVALID_ARGS`,`Unsupported trailing runFlow.when.true expression.`);return e}parseOr(){let e=this.parseAnd();for(;this.consumeOperator(`||`);)e=this.parseAnd()||e;return e}parseAnd(){let e=this.parsePrimary();for(;this.consumeOperator(`&&`);)e=this.parsePrimary()&&e;return e}parsePrimary(){let e=this.peek();if(!e)throw new t(`INVALID_ARGS`,`Incomplete runFlow.when.true expression.`);if(e.type===`boolean`)return this.index+=1,e.value;if(e.type===`paren`&&e.value===`(`){this.index+=1;let e=this.parseOr();if(!this.consumeParen(`)`))throw new t(`INVALID_ARGS`,`Unclosed runFlow.when.true parenthesis.`);return e}return this.parsePlatformComparison()}parsePlatformComparison(){this.expectPlatform();let e=this.expectEqualityOperator(),t=this.expectString().toLowerCase(),n=this.context.platform;return e===`==`?n===t:n!==t}expectPlatform(){if(this.peek()?.type!==`platform`)throw new t(`INVALID_ARGS`,`runFlow.when.true supports maestro.platform comparisons.`);this.index+=1}expectEqualityOperator(){let e=this.peek();if(e?.type===`operator`&&(e.value===`==`||e.value===`!=`))return this.index+=1,e.value;throw new t(`INVALID_ARGS`,`runFlow.when.true comparison requires == or !=.`)}expectString(){let e=this.peek();if(e?.type===`string`)return this.index+=1,e.value;throw new t(`INVALID_ARGS`,`runFlow.when.true comparison requires a string literal.`)}consumeOperator(e){let t=this.peek();return t?.type!==`operator`||t.value!==e?!1:(this.index+=1,!0)}consumeParen(e){let t=this.peek();return t?.type!==`paren`||t.value!==e?!1:(this.index+=1,!0)}peek(){return this.tokens[this.index]}};function Rl(e,t){let{visibleSelector:n,notVisibleSelector:r}=t;if(!n&&!r)return e;if(n&&r)throw N(`Maestro runFlow.when cannot combine visible and notVisible yet.`);let i=n?`visible`:`notVisible`,a=n??r??``;return[zl(`runFlow.when`,[i,a],{kind:`maestroRunFlowWhen`,mode:i,selector:a,actions:e})]}function zl(e,t,n){return{...P(e,t),replayControl:n}}function Bl(e,t){return Hl(e,t,`repeat.times`)}function Vl(e,t){return e===void 0?1:Hl(e,t,`retry.maxRetries`)}function Hl(e,n,r){let i=typeof e==`string`?I(e,n):e,a=typeof i==`number`?i:typeof i==`string`&&/^\d+$/.test(i)?Number(i):void 0;if(a===void 0||!Number.isInteger(a)||a<0)throw new t(`INVALID_ARGS`,`${r} must be a non-negative integer or \${VAR} resolving to one.`);return a}const Ul=3e4;function Wl(e,t){let n=Kl(e,t),r=ql(n.file,t);return P(U.runScript,[r],{...Object.keys(n.env).length>0?{maestro:{runScriptEnv:n.env}}:{}})}function Gl(e){let{scriptPath:n,env:r}=e,i=L.readFileSync(n,`utf8`),a=Object.create(null);try{zr.runInNewContext(i,Jl(r,a),{filename:n,timeout:Ul})}catch(e){throw new t(`COMMAND_FAILED`,`Maestro runScript failed for ${n}: ${e instanceof Error?e.message:String(e)}`,{scriptPath:n},e instanceof Error?e:void 0)}return Ql(a,n),Object.fromEntries(Object.entries(a).map(([e,t])=>[`output.${e}`,$l(t)]))}function Kl(e,n){if(typeof e==`string`)return{file:I(e,n),env:{}};if(!F(e))throw new t(`INVALID_ARGS`,`runScript expects a file path string or map.`);M(e,`runScript`,[`file`,`env`]);let r=I(mr(`runScript.file`,e.file),n),i=gr(e.env,`runScript.env`);return{file:r,env:Object.fromEntries(Object.entries(i).map(([e,t])=>[e,I(t,n)]))}}function ql(e,n){if(R.isAbsolute(e))return e;if(!n.baseDir)throw new t(`INVALID_ARGS`,`runScript file paths require replay input to have a source path.`);return R.resolve(n.baseDir,e)}function Jl(e,t){return{...e,output:t,json:Yl,http:{post:(e,t)=>Zl(`POST`,e,t)}}}function Yl(e){if(typeof e!=`string`)throw new t(`COMMAND_FAILED`,`Maestro runScript json() expected a string body, received ${typeof e}.`);if(e.trim().length===0)throw new t(`COMMAND_FAILED`,`Maestro runScript json() received an empty body. Check the preceding http response status and setup server output.`);try{return JSON.parse(e,Xl)}catch(n){throw new t(`COMMAND_FAILED`,`Maestro runScript json() could not parse response body: ${n instanceof Error?n.message:String(n)}`,{bodyPreview:e.slice(0,1e3)},n instanceof Error?n:void 0)}}function Xl(e,t){return e===`__proto__`||e===`constructor`||e===`prototype`?void 0:t}function Zl(e,n,r){let i=f(process.execPath,[`-e`,`
5
4
  const fs = require('node:fs');
6
5
  const input = JSON.parse(fs.readFileSync(0, 'utf8'));
7
6
  if (typeof fetch !== 'function') {
@@ -22,10 +21,10 @@ fetch(input.url, {
22
21
  console.error(error && error.stack ? error.stack : String(error));
23
22
  process.exit(1);
24
23
  });
25
- `;function iK(e){if("string"!=typeof e)throw new l("COMMAND_FAILED",`Maestro runScript json() expected a string body, received ${typeof e}.`);if(0===e.trim().length)throw new l("COMMAND_FAILED","Maestro runScript json() received an empty body. Check the preceding http response status and setup server output.");try{return JSON.parse(e,ij)}catch(t){throw new l("COMMAND_FAILED",`Maestro runScript json() could not parse response body: ${t instanceof Error?t.message:String(t)}`,{bodyPreview:e.slice(0,1e3)},t instanceof Error?t:void 0)}}function ij(e,t){return"__proto__"===e||"constructor"===e||"prototype"===e?void 0:t}let iz={launchApp:({value:e,config:t,context:r})=>[ih(e,t,r)],tapOn:({value:e,context:t})=>[function(e,t){if("string"==typeof e)return rc(ix,[iC(rg(e,t))],iq(e));if(rf(e)&&"string"==typeof e.point){rh(e,"tapOn",["point","repeat","delay","optional","label"]);let t=rv(e.point);return"percent"===t.kind?rc(iR,[String(t.x),String(t.y)],iF(e)):rc("click",[String(t.x),String(t.y)],iF(e))}rf(e)&&rh(e,"tapOn",["id","text","childOf","enabled","index","selected","repeat","delay","optional","label"]);let r=iq(e);return rc(ix,[i$(e,"tapOn",["repeat","delay","optional","label","index","childOf"],t),...function(e,t){if(!rf(e))return[];let r={};if(void 0!==e.index){if("number"!=typeof e.index||!Number.isInteger(e.index)||e.index<0)throw new l("INVALID_ARGS","tapOn.index must be a non-negative integer.");r.index=e.index}return void 0!==e.childOf&&(r.childOf=i$(e.childOf,"tapOn.childOf",[],t)),Object.keys(r).length>0?[JSON.stringify(r)]:[]}(e,t)],r)}(e,t)],doubleTapOn:({value:e,context:t})=>[function(e,t){if(rf(e)&&"string"==typeof e.point){rh(e,"doubleTapOn",["point","delay"]);let t=rl(e.point);return rc("click",[String(t.x),String(t.y)],iT(e))}return rf(e)&&rh(e,"doubleTapOn",["id","text","enabled","selected","delay"]),rc("click",[i$(e,"doubleTapOn",["delay"],t)],iT(e))}(e,t)],longPressOn:({value:e,context:t})=>[function(e,t){if(rf(e)&&"string"==typeof e.point){rh(e,"longPressOn",["point"]);let t=rl(e.point);return rc("longpress",[String(t.x),String(t.y),"3000"])}return rf(e)&&rh(e,"longPressOn",["id","text","enabled","selected"]),rc("click",[i$(e,"longPressOn",[],t)],{holdMs:3e3})}(e,t)],inputText:({value:e,context:t})=>[rc("type",[rg(function(e){if("string"==typeof e)return e;if(!rf(e))throw new l("INVALID_ARGS","inputText expects a string or map.");if(rh(e,"inputText",["text","label"]),"string"!=typeof e.text)throw new l("INVALID_ARGS","inputText map requires a string text field.");return e.text}(e),t)])],eraseText:({value:e})=>[iM(e)],pasteText:({value:e,context:t,name:r})=>[rc("type",[rg(rw(r,e),t)])],openLink:({value:e,config:t,context:r,name:a})=>{var n,i,o,s,l,u;let d;return[(n=e,i=t,o=r,s=a,d=rg((l=n,u=s,"string"==typeof l?l:rf(l)?(rh(l,u,["link"]),rw(`${u}.link`,l.link)):rw(u,l)),o),("ios"===o.platform||"android"===o.platform)&&i.appId?rc("open",[rg(rm(i,s),o),d],"ios"===o.platform?{maestro:{prewarmRunnerBeforeOpen:!0}}:void 0):rc("open",[d]))]},assertVisible:({value:e,context:t,name:r})=>[rc(ib,[i$(e,r,[],t),"17000"])],assertNotVisible:({value:e,context:t,name:r})=>[rc(iS,[i$(e,r,[],t)])],extendedWaitUntil:({value:e,context:t})=>(function(e,t){if(!rf(e))throw new l("INVALID_ARGS","extendedWaitUntil expects a map.");rh(e,"extendedWaitUntil",["visible","notVisible","timeout"]);let r=e.visible??e.notVisible;if(void 0===r)throw ry("Only Maestro extendedWaitUntil.visible/notVisible is supported.");let a=i$(r,"extendedWaitUntil",[],t),n=String(rA(e,17e3));return void 0!==e.notVisible?[rc(iS,[a,n])]:[rc(ib,[a,n],{maestro:{allowAlreadyPastLoading:!0}})]})(e,t),takeScreenshot:({value:e,context:t,name:r})=>[rc("screenshot",[rg(rw(r,e),t)])],scroll:({value:e})=>[function(e){if(null!=e)throw ry("Maestro scroll options are not supported yet.");return rc("scroll",["down"])}(e)],scrollUntilVisible:({value:e,context:t})=>(function(e,t){if("string"==typeof e)return[rc(ik,[iC(rg(e,t)),"5000","down"])];if(!rf(e))throw new l("INVALID_ARGS","scrollUntilVisible expects a string or map.");rh(e,"scrollUntilVisible",["element","direction","timeout"]);let r=i$(e.element,"scrollUntilVisible.element",[],t),a="string"==typeof e.direction?iL(e.direction,"scrollUntilVisible.direction"):"down";return[rc(ik,[r,String(rA(e,5e3)),a])]})(e,t),swipe:({value:e,context:t})=>[function(e,t){var r,a,n;let i;if(!rf(e))throw new l("INVALID_ARGS","swipe expects a map.");rh(e,"swipe",["start","end","direction","duration","from","label"]);let o=e.from??("string"==typeof e.label?e.label:void 0);return void 0!==o?(r=e,a=o,n=t,i=iO("string"==typeof r.direction?r.direction:"up"),rc(iD,[i$(a,"swipe.from",[],n),i,...iE(r)])):"string"==typeof e.direction?rc(iN,["direction",iO(e.direction),...iE(e)]):function(e){let{start:t,end:r}=function(e){if("string"==typeof e.start&&"string"==typeof e.end)return{start:rv(e.start),end:rv(e.end)};throw ry("Only Maestro swipe start/end coordinates are supported.")}(e);var a=t,n=r,i=iP(e.duration);if("absolute"===a.kind&&"absolute"===n.kind)return rc("swipe",[String(a.x),String(a.y),String(n.x),String(n.y),...i?[i]:[]]);if("percent"===a.kind&&"percent"===n.kind)return rc(iN,["percent",String(a.x),String(a.y),String(n.x),String(n.y),...i?[i]:[]]);throw ry("Maestro swipe start/end must both be absolute pixels or both be percentages.")}(e)}(e,t)],hideKeyboard:()=>[rc("keyboard",["dismiss"])],pressKey:({value:e})=>[function(e){let t=rw("pressKey",e).toLowerCase();if("back"===t)return rc("back");if("enter"===t||"return"===t)return rc(iI);if("home"===t)return rc("home");throw ry(`Maestro pressKey "${t}" is not supported yet.`)}(e)],back:()=>[rc("back")],waitForAnimationToEnd:({value:e})=>[rc(i_,[String(rA(e,15e3))])],stopApp:({value:e,config:t,context:r})=>[ig(e,t,r)],runScript:({value:e,context:t})=>{let a;return[rc(iA,[function(e,t){if(r.isAbsolute(e))return e;if(!t.baseDir)throw new l("INVALID_ARGS","runScript file paths require replay input to have a source path.");return r.resolve(t.baseDir,e)}((a=function(e,t){if("string"==typeof e)return{file:rg(e,t),env:{}};if(!rf(e))throw new l("INVALID_ARGS","runScript expects a file path string or map.");return rh(e,"runScript",["file","env"]),{file:rg(rw("runScript.file",e.file),t),env:Object.fromEntries(Object.entries(rt(e.env,"runScript.env")).map(([e,r])=>[e,rg(r,t)]))}}(e,t)).file,t)],{...Object.keys(a.env).length>0?{maestro:{runScriptEnv:a.env}}:{}})]},runFlow:({value:e,config:t,context:r,deps:a})=>(function(e,t,r,a,n){if("string"==typeof e)return a.parseRunFlowFile(rg(e,r),r).actions;if(!rf(e))throw new l("INVALID_ARGS","runFlow expects a file path string or map.");rh(e,"runFlow",["file","commands","env","when","label"]);let i=function(e,t){var r,a;if(null==e)return{shouldRun:!0};if(!rf(e))throw new l("INVALID_ARGS","runFlow.when expects a map.");return(rh(e,"runFlow.when",["platform","visible","notVisible","true"]),!function(e,t){if(void 0!==e.true&&!function(e,t){let r;if("boolean"==typeof e)return e;if("string"!=typeof e)throw new l("INVALID_ARGS","runFlow.when.true expects a boolean or expression string.");return new iU(function(e){let t=[],r=0;for(;r<e.length;){var a,n;let i=e.slice(r),o=(a=i,/^\s+/.exec(a)?.[0].length??0);if(o>0){r+=o;continue}let s=function(e){let t="maestro.platform";return e.startsWith(t)?{token:{type:"platform"},length:t.length}:null}(n=i)??function(e){let t=/^(==|!=|&&|\|\|)/.exec(e)?.[1];return t?{token:{type:"operator",value:t},length:t.length}:null}(n)??function(e){let t=e[0];return"("===t||")"===t?{token:{type:"paren",value:t},length:1}:null}(n)??function(e){let t=/^(['"])(.*?)\1/.exec(e);return t?{token:{type:"string",value:t[2]??""},length:t[0].length}:null}(n)??function(e){let t=/^(true|false)\b/.exec(e)?.[1];return t?{token:{type:"boolean",value:"true"===t},length:t.length}:null}(n);if(s){t.push(s.token),r+=s.length;continue}throw new l("INVALID_ARGS",`Unsupported runFlow.when.true expression near "${i.slice(0,24)}".`)}return t}((r=rg(e,t).trim()).startsWith("${")&&r.endsWith("}")?r.slice(2,-1).trim():r),{platform:t.platform}).parse()}(e.true,t))return!1;if(void 0===e.platform)return!0;let r=function(e,t){if("string"!=typeof e)throw new l("INVALID_ARGS",`${t} expects Android, iOS, or Web.`);let r=e.trim().toLowerCase();if("android"===r||"ios"===r||"web"===r)return r;throw new l("INVALID_ARGS",`${t} expects Android, iOS, or Web.`)}(e.platform,"runFlow.when.platform");if(!t.platform)throw new l("INVALID_ARGS","Maestro runFlow.when.platform requires replay to be run with --platform ios|android.");return r===t.platform}(e,t))?{shouldRun:!1}:{shouldRun:!0,...(r=e,a=t,{...void 0!==r.visible?{visibleSelector:i$(r.visible,"runFlow.when.visible",[],a)}:{},...void 0!==r.notVisible?{notVisibleSelector:i$(r.notVisible,"runFlow.when.notVisible",[],a)}:{}})}}(e.when,r);if(!i.shouldRun)return[];let o={...r,env:{...r.env,...rt(e.env,"runFlow.env"),...r.envOverrides}};return function(e,t){let{visibleSelector:r,notVisibleSelector:a}=t;if(!r&&!a)return e;if(r&&a)throw ry("Maestro runFlow.when cannot combine visible and notVisible yet.");let n=r?"visible":"notVisible",i=r??a??"";return[iG("runFlow.when",[n,i],{kind:"maestroRunFlowWhen",mode:n,selector:i,actions:e})]}(function(e,t,r,a,n){if("string"==typeof e.file)return a.parseRunFlowFile(rg(e.file,r),r).actions;if(Array.isArray(e.commands))return n(rn(e.commands),t,r,a);throw new l("INVALID_ARGS","runFlow map requires either file or commands.")}(e,t,o,a,n),i)})(e,t,r,a,iY),repeat:({value:e,config:t,context:r,deps:a})=>(function(e,t,r,a,n){var i;if(!rf(e))throw new l("INVALID_ARGS","repeat expects a map.");if(rh(e,"repeat",["times","commands","while"]),void 0!==e.while)throw ry("Maestro repeat.while is not supported yet. Only deterministic repeat.times is supported.");let o=(i=e.times,iH(i,r,"repeat.times"));if(!Array.isArray(e.commands))throw new l("INVALID_ARGS","repeat requires a commands list.");if(o>1e3)throw new l("INVALID_ARGS","repeat.times must be <= 1000 for deterministic replay expansion.");let s=rn(e.commands);return Array.from({length:o}).flatMap(()=>n(s,t,r,a))})(e,t,r,a,iY),retry:({value:e,config:t,context:r,deps:a})=>(function(e,t,r,a,n){var i,o;if(!rf(e))throw new l("INVALID_ARGS","retry expects a map.");if(rh(e,"retry",["maxRetries","commands"]),!Array.isArray(e.commands))throw new l("INVALID_ARGS","retry requires a commands list.");let s=(i=e.maxRetries,o=r,void 0===i?1:iH(i,o,"retry.maxRetries")),u=n(rn(e.commands),t,r,a);return[iG("retry",[String(s)],{kind:"retry",maxRetries:s,actions:u})]})(e,t,r,a,iY)},iW={launchApp:(e,t)=>[ih(void 0,e,t)],scroll:()=>[rc("scroll",["down"])],hideKeyboard:()=>[rc("keyboard",["dismiss"])],eraseText:()=>[iM(void 0)],back:()=>[rc("back")],waitForAnimationToEnd:()=>[rc(i_,["15000"])],stopApp:(e,t)=>[ig(void 0,e,t)]};function iJ(e,t,r,a,n){try{return function(e,t,r,a){if("string"==typeof e){var n,i,o;let a;return n=e,i=t,o=r,(a=iW[n])?a(i,o):re(n)}let s=Object.entries(e);if(1!==s.length)throw new l("INVALID_ARGS","Maestro command maps must contain exactly one command.");let[u,d]=s[0],p=iz[u];return p?p({value:d,config:t,context:r,deps:a,name:u}):re(u)}(e,t,a,n)}catch(e){if(e instanceof l&&!/\bline \d+\b/.test(e.message))throw new l(e.code,`${e.message} (line ${r})`,e.details);throw e}}function iY(e,t,r,a){return e.flatMap((e,n)=>iJ(e,t,n+1,r,a))}function iX(e,t){let{config:r,commands:a}=iQ(rs(e)),n={...t,env:{...t.env,...r.env??{},...t.envOverrides}},{actions:i,actionLines:o}=function(e){let{config:t,commands:r,commandLines:a,context:n}=e,i=[...t.onFlowStart??[],...r,...t.onFlowComplete??[]],o=[...Array.from({length:t.onFlowStart?.length??0},()=>1),...a,...Array.from({length:t.onFlowComplete?.length??0},()=>a.at(-1)??1)],s=[],l=[];for(let[e,r]of i.entries()){let a=o[e]??e+1,i=iJ(r,t,a,n,{parseRunFlowFile:iZ});s.push(...i),i.forEach(()=>l.push(a))}return function(e,t){let r=[],a=[];for(let n=0;n<e.length;n+=1){let i=e[n],o=function(e,t,r){var a;let n=function(e,t,r){let a=e[r],n=e[r+1],i=e[r+2];if(i?.command!==iI||a.flags?.maestro?.optional===!0)return null;let o=function(e){if(e?.command!=="type"||e.flags&&Object.keys(e.flags).length>0)return null;let[t,...r]=e.positionals??[];return r.length>0||"string"!=typeof t?null:t}(n),s=function(e){if(e?.command!==ix)return null;let[t,...r]=e.positionals??[];return r.length>0||"string"!=typeof t?null:t}(a);return n&&null!==o&&null!==s?{action:a,nextAction:n,pressEnterAction:i,tapSelector:s,typedAfterTap:o,line:t[r]??1}:null}(e,t,r);if(!n)return null;let{action:i,nextAction:o,pressEnterAction:s,tapSelector:l,typedAfterTap:u,line:d}=n;return(a=l,/\b(input|textfield|textarea|field|email|password|username|search|query)\b/i.test(a.replace(/([a-z])([A-Z])/g,"$1 $2")))?{actions:[{...i,command:"wait",positionals:[l,"30000"]},{...o,command:"fill",positionals:[l,u],flags:i.flags},s],actionLines:[d,d,t[r+2]??d],consumed:3}:{actions:[function(e){let t={...e.flags?.maestro??{}};return delete t.allowNonHittableCoordinateFallback,{...e,flags:{...e.flags??{},maestro:{...t}}}}(i)],actionLines:[d],consumed:1}}(e,t,n);if(o){r.push(...o.actions),a.push(...o.actionLines),n+=o.consumed-1;continue}r.push(i),a.push(t[n]??1)}return{actions:r,actionLines:a}}(s,l)}({config:r,commands:a,commandLines:function(e){let t=e.split(/\r?\n/),r=t.findIndex(e=>"---"===e.trim()),a=-1===r?0:r+1,n=[];for(let e=a;e<t.length;e+=1)/^-\s+/.test(t[e]??"")&&n.push(e+1);return n}(e),context:n});return{actions:i,actionLines:o,metadata:{env:r.env}}}function iQ(e){if(0===e.length)throw new l("INVALID_ARGS","Maestro flow is empty.");if(Array.isArray(e[0]))return{config:{},commands:rn(e[0])};let t=function(e){if(!rf(e))throw new l("INVALID_ARGS","Maestro flow config must be a YAML map.");return{..."string"==typeof e.name&&e.name.length>0?{name:e.name}:{},..."string"==typeof e.appId&&e.appId.length>0?{appId:e.appId}:{},...rf(e.env)?{env:rt(e.env,"env")}:{},...Array.isArray(e.onFlowStart)?{onFlowStart:rn(e.onFlowStart)}:{},...Array.isArray(e.onFlowComplete)?{onFlowComplete:rn(e.onFlowComplete)}:{}}}(e[0]),r=e[1];if(!Array.isArray(r))throw new l("INVALID_ARGS","Maestro flow must contain a command list after the YAML document separator.");return{config:t,commands:rn(r)}}function iZ(e,a){let n=function(e,t){if(r.isAbsolute(e))return e;if(!t.baseDir)throw new l("INVALID_ARGS","runFlow file paths require replay input to have a source path.");return r.resolve(t.baseDir,e)}(e,a);if(a.visitedPaths.has(n))throw new l("INVALID_ARGS",`Maestro runFlow cycle detected at ${n}.`);let i=t.readFileSync(n,"utf8"),o=new Set(a.visitedPaths);return o.add(n),iX(i,{...a,baseDir:r.dirname(n),visitedPaths:o})}let i0=/[*?[\]{}]/;function i1(e,t,a,n,i=0){let o=r.basename(a,r.extname(a)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`${e}:test:${t}:${n+1}${o?`-${o}`:""}:attempt-${i+1}`}function i3(e,t){return"number"==typeof e?e:t}function i2(e,t){let r="number"==typeof e?e:t;return"number"!=typeof r?0:Math.max(0,Math.min(3,r))}function i5(e,a,n){var i,o;let s=eN.expandHome(e,a);if(t.existsSync(s)){let a=t.statSync(s);if(a.isDirectory())return{paths:[...n].map(e=>`**/*${e}`).flatMap(e=>t.globSync(e,{cwd:s}).map(e=>r.join(s,e))),source:"directory"};if(a.isFile()){if(!n.has(r.extname(s)))throw new l("INVALID_ARGS",`test does not support this file type: ${e}`);return{paths:[s],source:"file"}}return{paths:[],source:"file"}}if(i=e,!i0.test(i)&&(o=s,!i0.test(o)))throw new l("INVALID_ARGS",`test input not found: ${e}`);let u=r.isAbsolute(s)?s:e;return{paths:t.globSync(u,{cwd:r.isAbsolute(s)?void 0:a}).map(e=>r.isAbsolute(e)?e:r.resolve(a,e)).filter(e=>n.has(r.extname(e))&&function(e){try{return t.statSync(e).isFile()}catch{return!1}}(e)),source:"glob"}}function i4(e,t){let r=i8(e),a=i8(t);return r!==a?r-a:e.localeCompare(t)}function i8(e){return+(".ad"===r.extname(e))}function i6(e){return[...new Set(e.map(e=>r.normalize(e)))]}function i7(e){return"maestro"===e}let i9=["failed to start daemon","runner did not accept connection","xcodebuild exited early","device is offline","device offline","device unauthorized"];function oe(e){var t,r,a,n;let i,o,s="ok"in(t=e)?t.ok?null:t.error:"failed"===t.status?t.error:null;return!!s&&(r=s.details,"timeout_cleanup_pending"===(i="string"==typeof r?.reason?r.reason:"")||!!i&&tj(i)||(a=s.code,n=s.message,o=`${a}
26
- ${n}`.toLowerCase(),i9.some(e=>o.includes(e))))}async function ot(e){let a,n,{filePath:i,sessionName:o,requestId:l,parentRequestId:u,timeoutMs:d,platform:p,target:c,artifactsDir:f,shard:m,progress:h,runReplay:g,cleanupSession:w,finalizeAttempt:v}=e;T(l);let y=function(e,t){if(!t||t===e)return()=>{};let r=e5(t);if(!r)return()=>{};let a=()=>{eB(e)};return r.aborted?(a(),()=>{}):(r.addEventListener("abort",a,{once:!0}),()=>{r.removeEventListener("abort",a)})}(l,u),A=new Set,b=!1,S=Date.now(),I=function(e){let{artifactsDir:a,artifactPaths:n,filePath:i,sessionName:o,requestId:s,timeoutMs:l,platform:u,target:d}=e;if(!a)return;let p=r.join(a,"replay-timing.ndjson");return t.mkdirSync(r.dirname(p),{recursive:!0}),t.writeFileSync(p,""),n.add(p),oi(p,{type:"replay_test_attempt_start",ts:new Date().toISOString(),replayPath:i,session:o,requestId:s,timeoutMs:l,platform:u,target:d}),p}({artifactsDir:f,artifactPaths:A,filePath:i,sessionName:o,requestId:l,timeoutMs:d,platform:p,target:c}),_=eU(h,async()=>await g({filePath:i,sessionName:o,platform:p,target:c,requestId:l,artifactsDir:f,artifactPaths:A,tracePath:I,shard:m})).catch(e=>({ok:!1,error:s(e)})).finally(()=>{y(),eX(l)});try{n="number"==typeof d?await Promise.race([_,new Promise(e=>{a=setTimeout(()=>{b=!0,eB(l),e(function(e,t=[]){return{ok:!1,error:{code:"COMMAND_FAILED",message:`TIMEOUT after ${e}ms`,hint:"Replay test timeouts are cooperative; the active command may take a short grace period to stop.",details:{reason:"timeout",timeoutMs:e,timeoutMode:"cooperative",artifactPaths:t}}}}(d,[...A]))},d)})]):await _,oi(I,{type:"replay_test_attempt_stop",ts:new Date().toISOString(),session:o,ok:n.ok,timedOut:b,durationMs:Date.now()-S,errorCode:n.ok?void 0:n.error.code})}finally{var k,N,D;let e,t;a&&clearTimeout(a),b&&(await or(_)||((k=n)&&!k.ok&&(k.error.details={...k.error.details??{},reason:"timeout_cleanup_pending",timeoutCleanupPending:!0}),t3({level:"warn",phase:"test_timeout_cleanup_race",data:{session:o,requestId:l,graceMs:2e3}}),oa({replayPromise:_,cleanupSession:w,sessionName:o,requestId:l})));let r=await on({finalizeAttempt:v,sessionName:o,artifactPaths:A,artifactsDir:f,tracePath:I});n?.ok&&r&&!r.ok&&(N=n,D=`Replay test finalization failed: ${r.error.message}`,t=Array.isArray((e=N.data??={}).warnings)?e.warnings.filter(e=>"string"==typeof e):[],e.warnings=[...t,D]);let i=Date.now();try{oi(I,{type:"replay_test_cleanup_start",ts:new Date().toISOString(),session:o}),await w(o),oi(I,{type:"replay_test_cleanup_stop",ts:new Date().toISOString(),session:o,ok:!0,durationMs:Date.now()-i})}catch(t){let e=s(t);oi(I,{type:"replay_test_cleanup_stop",ts:new Date().toISOString(),session:o,ok:!1,durationMs:Date.now()-i,errorCode:e.code}),t3({level:"warn",phase:"test_cleanup_failed",data:{session:o,error:e.message}})}}return n??{ok:!1,error:{code:"COMMAND_FAILED",message:"Unknown replay test failure"}}}async function or(e){return await Promise.race([e.then(()=>!0),n(2e3).then(()=>!1)])}async function oa(e){let{replayPromise:t,cleanupSession:r,sessionName:a,requestId:n}=e;try{await t}finally{try{await r(a)}catch(e){t3({level:"warn",phase:"test_late_cleanup_failed",data:{session:a,requestId:n,error:s(e).message}})}}}async function on(e){let{finalizeAttempt:t,sessionName:r,artifactPaths:a,artifactsDir:n,tracePath:i}=e;if(!t)return;let o=Date.now();oi(i,{type:"replay_test_finalize_start",ts:new Date().toISOString(),session:r});try{let e=await t({sessionName:r,artifactPaths:a,artifactsDir:n,tracePath:i});return oi(i,{type:"replay_test_finalize_stop",ts:new Date().toISOString(),session:r,ok:e?.ok??!0,durationMs:Date.now()-o,errorCode:e?.ok===!1?e.error.code:void 0}),e}catch(t){let e=s(t);return oi(i,{type:"replay_test_finalize_stop",ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-o,errorCode:e.code}),t3({level:"warn",phase:"test_finalize_failed",data:{session:r,error:e.message}}),{ok:!1,error:e}}}function oi(e,r){e&&t.appendFileSync(e,`${JSON.stringify(r)}
27
- `)}async function oo(e){var t,a,n;let i,o=function(e){var t;let a,{entry:n,cwd:i,retries:o,suiteArtifactsDir:s,shard:l}=e;return{testStartedAt:Date.now(),testArtifactsDir:r.join(s,...l?[`shard-${l.shardIndex+1}`]:[],(t=n.path,(0===(a=i?r.relative(i,t):r.basename(t)).length||a.startsWith("..")?r.basename(t):a).toLowerCase().replace(/[\\/]+/g,"__").replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"test")),maxAttempts:o+1}}(e),s=await os(e,o);return t=e,a=o,n=s,i=Date.now()-a.testStartedAt,n.finalResponse?.ok?function(e,t,r,a){var n;let{entry:i,suiteIndex:o,suiteTotal:s,shard:l}=e,u=r.finalResponse;if(!u?.ok)throw Error("Expected passing replay test response.");return e6({type:"replay-test",file:i.path,title:i.title,status:"pass",index:o,total:s,attempt:r.attempts,maxAttempts:t.maxAttempts,durationMs:a,session:r.finalSessionName,artifactsDir:t.testArtifactsDir,...od(l)}),{file:i.path,title:i.title,session:r.finalSessionName,status:"passed",durationMs:a,finalAttemptDurationMs:r.finalAttemptDurationMs,attempts:r.attempts,artifactsDir:t.testArtifactsDir,...(n=u,{replayed:"number"==typeof n.data?.replayed?n.data.replayed:0,healed:"number"==typeof n.data?.healed?n.data.healed:0}),...function(e){if(!Array.isArray(e))return{};let t=e.filter(e=>"string"==typeof e);return t.length>0?{warnings:t}:{}}(u.data?.warnings),...ou(u.data?.snapshotDiagnostics),...function(e){return od(e)}(l),...r.attemptFailures.length>0?{attemptFailures:r.attemptFailures}:{}}}(t,a,n,i):function(e,t,r,a){var n,i;let{entry:o,suiteIndex:s,suiteTotal:l,shard:u}=e,d=(n=r.finalResponse)&&!n.ok?n.error:{code:"COMMAND_FAILED",message:"Unknown replay test failure"};return e6({type:"replay-test",file:o.path,title:o.title,status:"fail",index:s,total:l,attempt:r.attempts,maxAttempts:t.maxAttempts,durationMs:a,session:r.finalSessionName,artifactsDir:t.testArtifactsDir,message:d.message,hint:d.hint,...od(u)}),{file:o.path,title:o.title,session:r.finalSessionName,status:"failed",durationMs:a,attempts:r.attempts,artifactsDir:t.testArtifactsDir,error:d,...ou((i=r.finalResponse,i?.ok?i.data?.snapshotDiagnostics:i?.error.details?.snapshotDiagnostics)),...function(e){return od(e)}(u)}}(t,a,n,i)}async function os(e,t){!function(e,t){let{entry:r,sessionName:a,suiteInvocationId:n,caseIndex:i,suiteIndex:o,suiteTotal:s,shard:l}=e;e6({type:"replay-test",file:r.path,title:r.title,status:"start",index:o,total:s,maxAttempts:t.maxAttempts,session:i1(a,n,r.path,i),artifactsDir:t.testArtifactsDir,...od(l)})}(e,t);let r={finalSessionName:"",attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let p=0;p<=e.retries&&!eM(e.requestId);p+=1){var a,n,i,o,s,l,u,d;let c=await ol(e,t,p);if((a=r).finalResponse=(n=c).response,a.finalSessionName=n.sessionName,a.attempts=n.attempt,a.finalAttemptDurationMs=n.durationMs,n.response.ok||a.attemptFailures.push({attempt:n.attempt,message:n.response.error.message,durationMs:n.durationMs}),i=e,o=c.response,s=p,o.ok||eM(i.requestId)||oe(o)||s>=i.retries)break;l=e,u=t,(d=c).response.ok||e6({type:"replay-test",file:l.entry.path,title:l.entry.title,status:"fail",index:l.suiteIndex,total:l.suiteTotal,attempt:d.attempt,maxAttempts:u.maxAttempts,durationMs:d.durationMs,retrying:!0,message:d.response.error.message,hint:d.response.error.hint,session:d.sessionName,artifactsDir:u.testArtifactsDir,...od(l.shard)})}return r}async function ol(e,a,n){var i;let{entry:o,sessionName:s,suiteInvocationId:l,caseIndex:u,suiteIndex:d,suiteTotal:p,requestId:c,timeoutMs:f,shard:m}=e,h=n+1,g=Date.now(),w=i1(s,l,o.path,u,n),v=r.join(a.testArtifactsDir,`attempt-${h}`);i=o.path,t.mkdirSync(v,{recursive:!0}),function(e,a){var n;let i,o=r.join(a,"replay.ad");if(t.copyFileSync(e,o),n=e,".yml"!==(i=r.extname(n).toLowerCase())&&".yaml"!==i)return;let s=r.join(a,r.basename(e));r.resolve(s)!==r.resolve(o)&&t.copyFileSync(e,s)}(i,v);let y=function(e){let{requestId:t,suiteInvocationId:a,filePath:n,caseIndex:i,attemptIndex:o,shardIndex:s}=e,l=void 0===s?"":`:shard:${s+1}`;return eP(`${t??a}${l}:test:${i+1}:${r.basename(n)}:attempt:${o+1}`,a)}({requestId:c,suiteInvocationId:l,filePath:o.path,caseIndex:u,attemptIndex:n,shardIndex:m?.shardIndex}),A=await ot({filePath:o.path,sessionName:w,requestId:y,parentRequestId:c,timeoutMs:f,platform:o.metadata.platform,target:o.metadata.target,artifactsDir:v,shard:m,progress:{file:o.path,title:o.title,index:d,total:p,attempt:h,maxAttempts:a.maxAttempts,session:w,artifactsDir:a.testArtifactsDir,...od(m)},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt}),b=Date.now()-g;return!function(e){var a;let n,{response:i,filePath:o,sessionName:s,attempts:l,maxAttempts:u,attemptArtifactsDir:d}=e,p=[...Array.isArray(n=(a=i).ok?a.data?.artifactPaths:a.error.details?.artifactPaths)?[...new Set(n.filter(e=>"string"==typeof e))]:[]];i.ok||"string"!=typeof i.error.logPath||p.push(i.error.logPath);let c=function(e,a){let n=[],i=new Map;for(let o of e){if(!function(e){try{return t.statSync(e).isFile()}catch{return!1}}(o))continue;let e=function(e,t){let a=r.extname(e),n=a?e.slice(0,-a.length):e,i=t.get(e)??0;return(t.set(e,i+1),0===i)?e:`${n}-${i+1}${a}`}(r.basename(o),i),s=r.join(a,e);r.resolve(o)!==r.resolve(s)&&t.copyFileSync(o,s),n.push(s)}return n}(p,d),f=[`file: ${o}`,`session: ${s}`,`attempt: ${l}/${u}`,`status: ${i.ok?"passed":"failed"}`];if(i.ok){let e="number"==typeof i.data?.replayed?i.data.replayed:0,t="number"==typeof i.data?.healed?i.data.healed:0;f.push(`replayed: ${e}`,`healed: ${t}`)}else f.push(`code: ${i.error.code}`,`message: ${i.error.message}`),i.error.hint&&f.push(`hint: ${i.error.hint}`),i.error.diagnosticId&&f.push(`diagnosticId: ${i.error.diagnosticId}`),i.error.logPath&&f.push(`logPath: ${i.error.logPath}`),i.error.details?.reason==="timeout"&&f.push("timeoutMode: cooperative");c.length>0&&f.push(`copiedArtifacts: ${c.map(e=>r.basename(e)).join(", ")}`);let m=r.join(d,"result.txt"),h=`${f.join("\n")}
28
- `;t.writeFileSync(m,h),i.ok||t.writeFileSync(r.join(d,"failure.txt"),h)}({response:A,filePath:o.path,sessionName:w,attempts:h,maxAttempts:a.maxAttempts,attemptArtifactsDir:v}),{response:A,sessionName:w,attempt:h,durationMs:b}}function ou(e){let t=rk(e);return t?{snapshotDiagnostics:t}:{}}function od(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function op(e,t,r){let a=function(e){let t=oc(e?.shardAll,"--shard-all"),r=oc(e?.shardSplit,"--shard-split");if(void 0!==t&&void 0!==r)throw new l("INVALID_ARGS","--shard-all and --shard-split are mutually exclusive");return void 0!==t?{kind:"all",count:t}:void 0!==r?{kind:"split",count:r}:void 0}(e);if(!a||0===t.length)return;let n=await of(e,a.count);return{mode:a.kind,shardCount:a.count,total:r+("all"===a.kind?t.length*a.count:t.length),shards:n.map((e,r)=>({shardIndex:r,shardCount:a.count,device:e,entries:"all"===a.kind?t:t.filter((e,t)=>t%a.count===r)}))}}function oc(e,t){if(void 0!==e){if("number"!=typeof e||!Number.isInteger(e)||e<1)throw new l("INVALID_ARGS",`${t} requires a positive integer`);return e}}async function of(e,t){var r,a,n,i,o,s,u,d,p;let c,f,m=(r=e,"string"!=typeof(c=r?.device)||0===c.trim().length?[]:c.split(",").map(e=>e.trim()).filter(Boolean)),h=(n=await ek((a=e,f=tJ(a?.androidDeviceAllowlist),{platform:a?.platform,target:a?.target,iosSimulatorSetPath:e9({simulatorSetPath:tH(a?.iosSimulatorDeviceSet),platform:a?.platform,target:a?.target}),androidSerialAllowlist:f?Array.from(f).sort():void 0})),i=m,o=e,i.length>0?(s=n,u=i,d=o,u.map(e=>{let t=oh(e),r=s.find(r=>om(r,d)&&(r.id===e||oh(r.name)===t));if(!r)throw new l("DEVICE_NOT_FOUND",`No shard device matched ${e}`);return r})):n.filter(e=>{var t;return!!om(t=e,o)&&!!tr(t)&&!1!==t.booted}).sort(og));if(h.length<t){throw new l("DEVICE_NOT_FOUND",`test sharding requires ${(p=t,`${p} device${1===p?"":"s"}`)}, but only ${h.length} matched`)}return h.slice(0,t)}function om(e,t){return!(!ta(e,t?.platform)||t?.target&&(e.target??"mobile")!==t.target)}function oh(e){return e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim()}function og(e,t){return e.id.localeCompare(t.id)}async function ow(e){let{req:t,sessionName:r,runReplay:a,cleanupSession:n,finalizeAttempt:i}=e;if((t.positionals?.length??0)===0)return U("INVALID_ARGS","test requires at least one path or glob");try{var s,l,u,d;let e,o,p,c,f,m,h=Date.now(),g=await ov(t);s=g,e6({type:"replay-test-suite",status:"start",total:s.total,runnable:s.runnable.length,skipped:s.entries.length-s.runnable.length,artifactsDir:s.suiteArtifactsDir,shardMode:s.shardPlan?.mode,shardCount:s.shardPlan?.shardCount});let w=g.shardPlan?function(e){let{entries:t,total:r}=e,a=[];for(let[e,n]of t.entries())"skip"===n.kind&&(e6({type:"replay-test",file:n.path,status:"skip",index:e+1,total:r,message:n.message}),a.push({file:n.path,status:"skipped",durationMs:0,reason:n.reason,message:n.message}));return a}({entries:g.entries,total:g.total}):[];g.shardPlan?w.push(...await oy({shards:g.shardPlan.shards,sessionName:r,suiteInvocationId:g.suiteInvocationId,cwd:t.meta?.cwd,requestId:t.meta?.requestId,flags:t.flags,suiteArtifactsDir:g.suiteArtifactsDir,suiteTotal:g.total,runReplay:a,cleanupSession:n,finalizeAttempt:i})):w.push(...await oS({discoveryEntries:g.entries,sessionName:r,suiteInvocationId:g.suiteInvocationId,cwd:t.meta?.cwd,requestId:t.meta?.requestId,flags:t.flags,suiteArtifactsDir:g.suiteArtifactsDir,suiteTotal:g.total,runReplay:a,cleanupSession:n,finalizeAttempt:i}));let v=(l=g.total,u=w,d=Date.now()-h,e=u.filter(e=>"passed"===e.status).length,p=(o=u.filter(e=>"failed"===e.status)).length,c=u.filter(e=>"skipped"===e.status).length,f=e+p,m=rD(u.map(e=>"skipped"===e.status?void 0:e.snapshotDiagnostics)),{total:l,executed:f,passed:e,failed:p,skipped:c,notRun:Math.max(0,l-f-c),durationMs:d,failures:o,tests:u,...m?{snapshotDiagnostics:m}:{}});return{ok:!0,data:v}}catch(t){let e=o(t);return U(e.code,e.message)}}async function ov(e){var a,n,i,o;let s=function(e){let{inputs:a,cwd:n,platformFilter:i,replayBackend:o}=e,s=new Set(i7(o)?[".yaml",".yml",".ad"]:[".ad"]),u=function(e,a,n,i){if(!i7(i))return[...new Set(e.flatMap(e=>i5(e,a,n).paths))].map(e=>r.normalize(e)).sort((e,t)=>e.localeCompare(t));let o=[],s=[];for(let i of e){let e=function(e,a,n){let i=eN.expandHome(e,a);return t.existsSync(i)&&t.statSync(i).isDirectory()?{paths:function e(a,n){let i=[],o=t.opendirSync(a);try{let t;for(;null!==(t=o.readSync());){let o=r.join(a,t.name);t.isDirectory()?i.push(...e(o,n)):t.isFile()&&n.has(r.extname(t.name))&&i.push(o)}}finally{o.closeSync()}return i}(i,n),source:"directory"}:i5(e,a,n)}(i,a,n);"file"===e.source?o.push(...e.paths):s.push("directory"===e.source?i6(e.paths):e.paths.map(e=>r.normalize(e)).sort(i4))}return i6([...o,...s.flat()])}(a,n??process.cwd(),s,o),d=[];for(let e of u){var p,c,f,m;let a=t.readFileSync(e,"utf8"),n=ru(a),s=(p=a,c=e,i7(o)&&".ad"!==r.extname(c)?function(e){let{config:t}=iQ(rs(e));return t.name}(p):void 0);if(!i){d.push({kind:"run",path:e,title:s,metadata:n});continue}if(!n.platform){i7(o)?d.push({kind:"run",path:e,title:s,metadata:n}):d.push({kind:"skip",path:e,reason:"skipped-by-filter",message:`missing platform metadata for --platform ${i}`});continue}f=i,m=n.platform,("apple"===f?tn(m):m===f)&&d.push({kind:"run",path:e,title:s,metadata:n})}if(0===d.filter(e=>"run"===e.kind).length){let e=i?` for --platform ${i}`:"";throw new l("INVALID_ARGS",`No replay tests matched${e}.`)}return d}({inputs:(n=e).positionals??[],cwd:n.meta?.cwd,platformFilter:n.flags?.platform,replayBackend:n.flags?.replayBackend}),u=s.flatMap((e,t)=>"run"===e.kind?[{entry:e,suiteIndex:t+1}]:[]),d=s.length-u.length,p=(a=e.meta?.requestId,(a?.trim()||`${process.pid}-${Date.now().toString(36)}`).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"suite"),c=await op(e.flags,u,d);return{entries:s,runnable:u,shardPlan:c,suiteInvocationId:p,suiteArtifactsDir:(i=e,o=p,function(e){let{artifactsDir:t,cwd:a,suiteInvocationId:n}=e,i=eN.expandHome(t??".agent-device/test-artifacts",a);return r.join(i,n)}({artifactsDir:"string"==typeof i.flags?.artifactsDir?i.flags.artifactsDir:void 0,cwd:i.meta?.cwd,suiteInvocationId:o})),total:c?.total??s.length}}async function oy(e){return(await Promise.allSettled(e.shards.map(async t=>await oA({...e,shard:t})))).flatMap((t,r)=>{var a,n;let i;if("fulfilled"===t.status)return t.value;let o=e.shards[r];return o?[(a=o,n=e.sessionName,i=s(t.reason),{file:a.entries[0]?.entry.path??`shard-${a.shardIndex+1}`,session:ob(n,a),status:"failed",durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:a.shardIndex,shardCount:a.shardCount,deviceId:a.device.id,deviceName:a.device.name})]:[]})}async function oA(e){let{shard:t,sessionName:r}=e;return await oI({...e,entries:t.entries,sessionName:ob(r,t),shard:t})}function ob(e,t){return`${e}:shard-${t.shardIndex+1}`}async function oS(e){let{discoveryEntries:t,sessionName:r,suiteInvocationId:a,cwd:n,requestId:i,flags:o,suiteArtifactsDir:s,suiteTotal:l,runReplay:u,cleanupSession:d,finalizeAttempt:p}=e,c=[],f=0;for(let[e,m]of t.entries()){if(eM(i))break;if("skip"===m.kind){e6({type:"replay-test",file:m.path,status:"skip",index:e+1,total:l,message:m.message}),c.push({file:m.path,status:"skipped",durationMs:0,reason:m.reason,message:m.message});continue}f+=1;let t=await oo({entry:m,sessionName:r,suiteInvocationId:a,caseIndex:f-1,cwd:n,requestId:i,retries:i2(o?.retries,m.metadata.retries),timeoutMs:i3(o?.timeoutMs,m.metadata.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:l,runReplay:u,cleanupSession:d,finalizeAttempt:p});if(c.push(t),o_(t,o,i))break}return c}async function oI(e){let{entries:t,sessionName:r,suiteInvocationId:a,cwd:n,requestId:i,flags:o,suiteArtifactsDir:s,suiteTotal:l,shard:u,runReplay:d,cleanupSession:p,finalizeAttempt:c}=e,f=[];for(let[e,m]of t.entries()){if(eM(i))break;let{entry:t,suiteIndex:h}=m,g=await oo({entry:t,sessionName:r,suiteInvocationId:a,caseIndex:e,cwd:n,requestId:i,retries:i2(o?.retries,t.metadata.retries),timeoutMs:i3(o?.timeoutMs,t.metadata.timeoutMs),suiteArtifactsDir:s,suiteIndex:h,suiteTotal:l,shard:u,runReplay:d,cleanupSession:p,finalizeAttempt:c});if(f.push(g),o_(g,o,i))break}return f}function o_(e,t,r){return eM(r)||t?.failFast===!0||oe(e)}let ok={maestro:{parse:function(e,t={}){var a;let n;return iX(e,(n=(a=t).visitedPaths??new Set,a.sourcePath&&n.add(r.resolve(a.sourcePath)),{baseDir:a.sourcePath?r.dirname(a.sourcePath):void 0,platform:ri(a.platform),env:{},envOverrides:a.env??{},visitedPaths:n}))}}};function oN(e){if(0===e.length)return{selectorExpression:null,selectorTimeout:null};let t=e[e.length-1],r=void 0!==t&&/^\d+$/.test(t)?t:null,a=rT(null!==r?e.slice(0,-1):e.slice());return!a||a.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:a.selectorExpression,selectorTimeout:r}}async function oD(e){let{action:t,sessionName:r,logPath:a,sessionStore:n}=e;if(!(rq(t.command)||["fill","get","is","wait"].includes(t.command)))return null;let i=n.get(r);if(!i)return null;let o=(function(e){let t=[],r=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>"string"==typeof e)?e.result.selectorChain:[];if(t.push(...r),rq(e.command)){let r=function(e){let t=e.positionals??[];if("longpress"!==e.command)return t;let r=t.at(-1);return t.length>1&&ox(r)?t.slice(0,-1):t}(e),a=r[0]??"";a&&!a.startsWith("@")&&t.push(r.join(" "))}if("fill"===e.command){let r=e.positionals?.[0]??"";r&&!r.startsWith("@")&&Number.isNaN(Number(r))&&t.push(r)}if("get"===e.command){let r=e.positionals?.[1]??"";r&&!r.startsWith("@")&&t.push(e.positionals.slice(1).join(" "))}if("is"===e.command){let{split:r}=rL(e.positionals);r&&t.push(r.selectorExpression)}if("wait"===e.command){let{selectorExpression:r}=oN(e.positionals??[]);r&&t.push(r)}return Z(t).filter(e=>e.trim().length>0)})(t).map(e=>rG(e)).filter(e=>null!==e);if(0===o.length)return null;let s=rq(t.command)||"fill"===t.command,l=rq(t.command)||"fill"===t.command||"get"===t.command&&t.positionals?.[0]==="text",u=await oR(i,t,a,s,n);for(let e of o){let r=rx(u.nodes,e,{platform:i.device.platform,requireRect:s,requireUnique:!0,disambiguateAmbiguous:l});if(!r)continue;let a=rO(r.node,i.device.platform,{action:"fill"===t.command?"fill":rq(t.command)?"click":"get"}).join(" || ");if(rq(t.command))return{...t,positionals:"longpress"===t.command?function(e,t){let r="number"==typeof e.result?.durationMs?String(e.result.durationMs):function(e){let t=e.at(-1);return e.length>1&&ox(t)?t:void 0}(e.positionals??[]);return r?[t,r]:[t]}(t,a):[a]};if("fill"===t.command){let e=I(t);if(!e)continue;return{...t,positionals:[a,e]}}if("get"===t.command){let e=t.positionals?.[0];if("text"!==e&&"attrs"!==e)continue;return{...t,positionals:[e,a]}}if("is"===t.command){let{predicate:e,split:r}=rL(t.positionals);if(!e)continue;let n=r?.rest.join(" ").trim()??"",i=[e,a];return"text"===e&&n.length>0&&i.push(n),{...t,positionals:i}}if("wait"===t.command){let{selectorTimeout:e}=oN(t.positionals??[]),r=[a];return e&&r.push(e),{...t,positionals:r}}}return null}function ox(e){return void 0!==e&&""!==e.trim()&&Number.isFinite(Number(e))}async function oR(e,t,r,a,n){let i=eA(await f(e.device,"snapshot",[],t.flags?.out,{...e_(r,{...t.flags??{},snapshotInteractiveOnly:a},e.appBundleId,e.trace?.outPath)}),{...t.flags??{},snapshotInteractiveOnly:a});return ee(e,i),n.set(e.name,e),i}let oM=.35,oP=120,oL=360,oO=8;function o$(e,t){return Math.round(Math.min(oL,Math.max(oP,"number"==typeof e?e*oM:0,1.5*t)))}let oC=new WeakMap,oE=new WeakMap,oV=new WeakMap;function oF(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}async function oq(e){var t;let r,a=!0===e.raw||"1"===process.env.AGENT_DEVICE_MAESTRO_RAW_SNAPSHOTS,n=await e.invoke({...e.baseReq,command:"snapshot",positionals:[],flags:{...e.baseReq.flags,noRecord:!0,...a?{snapshotRaw:!0}:{}}});return n.ok&&e.scope&&(t=e.scope,(r=ep(oT(n.data)))&&oC.set(t,r)),n}function oT(e){return Array.isArray(e?.nodes)?e:void 0}function oU(e,t){e&&oE.set(e,{selector:t})}function oG(e){e&&oV.delete(e)}let oH=new Map([["button",0],["link",0],["textfield",0],["textview",0],["searchfield",0],["switch",0],["slider",0],["cell",1],["statictext",2]]);function oB(e,t,r,a,n,i={}){let o=oJ(e,t,a);if(r.childOf){let t=oJ(e,r.childOf,a);if(0===t.length)return{ok:!1,message:`Maestro childOf parent did not match: ${r.childOf}`};let n=r$(e.nodes);o=o.filter(r=>t.some(t=>rP(e.nodes,r,t,n)))}let s=oj({nodes:e.nodes,matches:o,platform:a}),l=oQ(e.nodes,s.matches,r.index,oW(t),n,!0===i.requireOnScreen,i.promoteTapTarget,i.preferredContext);if(!l){let e=r.index??0;return{ok:!1,message:s.blockedByReactNativeOverlay?`React Native overlay is covering app content: ${t}`:o.length>0&&0===s.matches.length?`Maestro selector matched ${o.length} element(s), but none were visible: ${t}`:`Maestro selector did not match index ${e}: ${t}`}}return{ok:!0,node:l.node,rect:l.rect}}function oK(e,t,r,a){let n=oJ(e,t,r,{allowLeadingCompositeLabelMatch:!1}),i=oj({nodes:e.nodes,matches:n,platform:r}),o=oQ(e.nodes,i.matches,void 0,oW(t),a,!0);return o?{ok:!0,node:o.node,rect:o.rect,matches:i.matches.length}:{ok:!1,message:i.blockedByReactNativeOverlay?`React Native overlay is covering app content: ${t}`:n.length>0?`Maestro selector matched ${n.length} element(s), but none were visible: ${t}`:`Maestro selector did not match: ${t}`}}function oj(e){let t=e.matches.filter(t=>rF({predicate:"visible",node:t,nodes:e.nodes,platform:e.platform}).pass),r=function(e,t,r){let a=tE(e);if(!a.detected||!a.redBox)return{matches:t,blockedByReactNativeOverlay:!1};let n=tC(a),i=n.filter(t=>rF({predicate:"visible",node:t,nodes:e,platform:r}).pass);if(0===i.length)return 0===n.length?{matches:[],blockedByReactNativeOverlay:!0}:{matches:t,blockedByReactNativeOverlay:!1};let o=new Set(i.map(e=>e.index)),s=t.filter(e=>o.has(e.index));return{matches:s,blockedByReactNativeOverlay:t.length>0&&0===s.length}}(e.nodes,t,e.platform);return{matches:r.matches,blockedByReactNativeOverlay:r.blockedByReactNativeOverlay}}function oz(e){return e?.platform==="android"?"android":"ios"}function oW(e){let t=rH(e).selectors.flatMap(e=>e.terms);if(0===t.length||!t.some(e=>"label"===e.key||"text"===e.key)||!t.every(e=>["label","text","id"].includes(e.key)))return null;let r=t.map(e=>"string"==typeof e.value?e.value:""),a=r[0];return a&&r.every(e=>e===a)?a:null}function oJ(e,t,r,a={}){for(let n of rH(t).selectors){let t=e.nodes.filter(e=>(function(e,t,r,a){return!!rC(e,t,r)||t.terms.every(t=>(function(e,t,r,a){var n,i,o;return"string"!=typeof t.value||"id"!==(n=t.key)&&"label"!==n&&"text"!==n&&"value"!==n?rC(e,{raw:t.key,terms:[t]},r):oY((i=e,"id"===(o=t.key)?i.identifier:"label"===o?i.label:"value"===o?i.value:rR(i)),t.value,a)})(e,t,r,a))})(e,n,r,a));if(t.length>0)return t}return[]}function oY(e,t,r={}){var a;let n=e??"",i=rU(n),o=rU(t);if(i===o||!1!==r.allowLeadingCompositeLabelMatch&&function(e,t){if(!e||!t||!e.startsWith(t))return!1;let r=e.at(t.length);return","===r||":"===r||";"===r}(i,o))return!0;if(a=t,!/(?:\.\*|\.\+|\[[^\]]+\]|\([^)]*\)|\||\^|\$|\\[dDsSwWbB])/.test(a))return!1;try{return new RegExp(t).test(n)}catch{return!1}}function oX(e,t,r){if(t.rect&&t.rect.width>0&&t.rect.height>0)return{rect:t.rect,inherited:!1};if(t.rect)return null;let a=function(e,t,r){let a=t;for(;"number"==typeof a.parentIndex&&(a=r.get(a.parentIndex)??e[a.parentIndex]);)if(a.rect)return a.rect.width>0&&a.rect.height>0?a.rect:null;return null}(e,t,r);return a?{rect:a,inherited:!0}:null}function oQ(e,t,r,a,n,i=!1,o=!1,s){var l,u,d,p,c,f,m,h,g,w,v,y,A,b,S,I,_,k,N;let D,x,R,M,P=r$(e),L=(l=e,u=t,d=P,p=a,c=r,f=n,m=i,R=(x=(D=u.map(e=>{var t;let r;return(r=oX(l,t=e,d))?{node:t,rect:r.rect,inheritedRect:r.inherited}:null}).filter(e=>!!e)).filter(e=>!e.inheritedRect)).length>0?x:D,p&&void 0===c?(h=R,g=f,w=m,M=h.filter(e=>{var t,r;let a,n;return t=e.rect,r=g,a=r?.referenceWidth??1/0,n=r?.referenceHeight??1/0,t.x<a&&t.y<n&&t.x+t.width>0&&t.y+t.height>0}),w||M.length>0?M:h):D),O=function(e,t,r,a,n,i){var o,s,l,u,d,p,c;if(void 0!==r)return t[r]??null;let f=(o=e,s=t,l=a,u=n,d=i,u&&l?function(e,t,r,a){let n=t.filter(e=>0===o7(e.node,r));if(n.length>=2){let t=o0(e,n,r,a);if(t)return t}let i=t.filter(e=>1===o7(e.node,r));return n.length>0||i.length<2?null:o0(e,i,r,a)}(o,s,l,d)??oZ(o,s,l,d):oZ(o,s,l,d));return(p=f,c=a,n&&c&&p)?function(e,t,r){var a,n,i,o,s,l,u,d,p,c,f,m,h,g,w,v,y,A;let b,S,I,_,k,N,D,x;if(a=t,n=r,!(("cell"===(b=rE(a.node.type??""))||"other"===b||"scrollview"===b||"scroll-area"===b)&&!(a.rect.width<120)&&!(a.rect.height<32)&&!(a.rect.height>80)&&1>=o7(a.node,n)))return null;let R=(i=e,o=t,s=r,l=r$(e),i.filter(e=>{var t,r,a;let n;return e.index!==o.node.index&&!!e.rect&&rP(i,e,o.node,l)&&(t=e,r=o.rect,a=s,!("button"!==(n=rE(t.type??""))&&"cell"!==n&&"other"!==n||1>=o7(t,a))&&!(t.rect.width<16)&&!(t.rect.height<16)&&!!o8(r,t.rect)&&o5(r,t.rect)>=.5)}).sort((e,t)=>e.rect.x-t.rect.x));if(0===R.length)return null;let M=(I=Math.floor((S=[...R.map(e=>e.rect.width)].sort((e,t)=>e-t)).length/2),S[I]??0),P=function(e,t){let r=[],a=e.x,n=e.x+e.width;for(let i of t){let t=Math.max(e.x,i.x),o=Math.min(n,i.x+i.width);t>a&&r.push({x:a,width:t-a}),a=Math.max(a,o)}return n>a&&r.push({x:a,width:n-a}),r}(t.rect,R.map(e=>e.rect)),L=(u=t,d=r,p=P,c=M,N=p.filter(e=>{var t,r;return t=e.width,r=c,!(t<24)&&!(r<24)&&t>=.4*r&&t<=1.6*r}),D=(f=u,m=d,_=p.find(e=>1>Math.abs(e.x-f.rect.x)),k=Math.max(48,Math.min(220,8*m.length+24)),(h=f,g=m,w=_,v=k,w&&"scrollview"===rE(h.node.type??"")&&1>=o7(h.node,g)&&h.rect.width>=240&&h.rect.height>=32&&h.rect.height<=80&&w.width<=.55*h.rect.width&&w.width>=.6*v)?{x:f.rect.x,width:Math.min(k,_.width)}:null),x=N.some(e=>{var t;return t=u.rect,1>Math.abs(e.x-t.x)}),D&&!x?D:1===N.length?N[0]??null:D);return L?(y=t,A=L,{...y,rect:{x:A.x,y:y.rect.y,width:A.width,height:y.rect.height}}):null}(e,f,a)??f:f}(e,L,r,a,o,s);return v=e,y=O,A=P,b=o,S=n,y?b?(I=v,_=y,k=A,N=S,(o4(_.node)?null:rM(I,_.node,k,e=>{if(!o4(e))return null;let t=oX(I,e,k);return t&&function(e,t,r){var a,n;if(!o8(t,e)||(a=e,!((n=t).height<32||n.height>80||a.height<.75*n.height||.75>o5(a,n))&&!(n.width<240)&&n.width>=3*a.width))return!1;let i=o3(t),o=o3(e);if(o>0&&i>30*o)return!1;if(r){let e=r.referenceWidth*r.referenceHeight;if(e>0&&i>.5*e)return!1}return!0}(_.rect,t.rect,N)?{node:e,rect:t.rect}:null}))??{node:y.node,rect:y.rect}):{node:y.node,rect:y.rect}:null}function oZ(e,t,r,a){return(function(e,t,r,a){var n;let i,o,s;if(!r||t.length<2)return t;let l=t.filter(e=>0===o7(e.node,r));if(l.length<2)return t;let u=r$(e),d=l.map(t=>({candidate:t,container:o1(e,t.node,u)})).filter(e=>!!e.container);if(d.length<2||d.length!==l.length)return t;let p=d.filter(e=>{var t;return t=e,d.some(e=>e!==t&&t.container.index!==e.container.index&&o6(t.container.rect,e.container.rect)>=.6)});if(p.length<2)return t;let c=(o=Math.max(...i=(n=p).map(e=>o3(e.container.rect))),(s=Math.min(...i))<=0||o<1.2*s?[]:n.filter(e=>o3(e.container.rect)===o).map(e=>e.candidate));if(c.length>0)return c;let f=function(e,t,r,a){if(!r)return[];let n=o1(e,r.node,a),i=n&&o8(n.rect,r.rect)?n:null,o=t.map(e=>({entry:e,score:function(e,t,r){if(r)return e.index===r.index?0:.6>o6(e.rect,r.rect)?1/0:Math.abs(e.index-r.index);if(o6(e.rect,t.rect)>=.6)return 0;let a=e.index-t.node.index;return a>=0?a:1e5+Math.abs(a)}(e.container,r,i)})),s=Math.min(...o.map(e=>e.score));return Number.isFinite(s)?o.filter(e=>e.score===s).map(e=>e.entry.candidate):[]}(e,p,a,u);if(f.length>0)return f;let m=Math.max(...p.map(e=>e.container.index)),h=p.filter(e=>e.container.index===m).map(e=>e.candidate);return h.length>0?h:t})(e,t,r,a).sort((e,t)=>(function(e,t,r){var a,n;let i=function(e,t,r){if(r){let a=o7(e.node,r)-o7(t.node,r);if(0!==a)return a}let a=o2(e.node)-o2(t.node);if(0!==a)return a;let n=Number(e.inheritedRect)-Number(t.inheritedRect);if(0!==n)return n;let i=r&&o2(e.node)===o2(t.node)?o3(t.rect)-o3(e.rect):o3(e.rect)-o3(t.rect);return 0!==i?i:0}(e,t,r);if(0!==i)return i;if(a=e.rect,n=t.rect,Math.round(a.x)!==Math.round(n.x)||Math.round(a.y)!==Math.round(n.y)||Math.round(a.width)!==Math.round(n.width)||Math.round(a.height)!==Math.round(n.height))return e.node.index-t.node.index;let o=(t.node.depth??0)-(e.node.depth??0);return 0!==o?o:t.node.index-e.node.index})(e,t,r))[0]??null}function o0(e,t,r,a){let n=r$(e),i=t.filter(r=>{var a;return(a=r).rect.width>=16&&a.rect.width<=260&&a.rect.height>=24&&a.rect.height<=80&&t.some(t=>{var a,i,o,s;return a=e,i=t,o=r,s=n,!(i.node.index===o.node.index||!o8(i.rect,o.rect)||o3(i.rect)<2*o3(o.rect))&&rP(a,o.node,i.node,s)})});return oZ(e,i,r,a)}function o1(e,t,r){return rM(e,t,r,e=>{let t;return!e.rect||"scrollview"!==(t=rE(e.type??""))&&"scroll-area"!==t&&"list"!==t||e.rect.width<240||e.rect.height<320?null:e})}function o3(e){return e.width*e.height}function o2(e){return oH.get(rE(e.type??""))??3}function o5(e,t){let r=Math.max(e.y,t.y);return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-r)/Math.max(1,Math.min(e.height,t.height))}function o4(e){let t=rE(e.type??"");return!0===e.hittable||"button"===t||"link"===t||"cell"===t||"textfield"===t||"searchfield"===t||"switch"===t||"slider"===t}function o8(e,t){return t.x>=e.x-1&&t.y>=e.y-1&&t.x+t.width<=e.x+e.width+1&&t.y+t.height<=e.y+e.height+1}function o6(e,t){let r=Math.max(e.x,t.x),a=Math.min(e.x+e.width,t.x+t.width),n=Math.max(e.y,t.y);return Math.max(0,a-r)*Math.max(0,Math.min(e.y+e.height,t.y+t.height)-n)/Math.max(1,Math.min(o3(e),o3(t)))}function o7(e,t){let r=[e.label,rR(e),e.identifier,e.value].filter(e=>!!e);return r.some(e=>e===t)?0:r.some(e=>rU(e)===rU(t))?1:r.some(e=>oY(e,t))?2:3}async function o9(e){let t=sc(e.positionals,{command:"assertVisible",defaultTimeoutMs:17e3});if(!t.ok)return t.response;let r=sp(e.baseReq,t.selector);return r?await se(e,t,r):await sr(e,t)}async function se(e,t,r){let a=Date.now(),n=await st(e,t,r);if(n.ok){var i;if(i=e.baseReq,i.flags?.platform==="android"){let r=await sf(e,t.selector,"assertVisible");if(!r.visible){let n=sd(e.baseReq,t,r,a);return"return"===n.kind?n.response:await sr(e,t)}}return oU(e.scope,t.selector),sg({ok:!0,data:{selector:t.selector,nativeWait:!0,query:r,response:n.data}},t.selector,a)}return await sa(e,t,n,a)}async function st(e,t,r){return await e.invoke({...e.baseReq,command:"wait",positionals:[r,String(t.timeoutMs)]})}async function sr(e,t){let r,a,n=Date.now(),i=t.timeoutMs+1e3,o=!1;for(;;){let s=Date.now(),l=await sf(e,t.selector,"assertVisible");if(l.visible)return sg(l.response,t.selector,n);r=l.response,a=l.snapshot??a;let u=sd(e.baseReq,t,l,n);if("return"===u.kind)return u.response;let d=function(e){var t,r,a,n;return Date.now()-e.startedAt<e.deadlineMs?"wait":(t=e.capturedAfterDeadline,r=e.captureStartedAt,a=e.startedAt,n=e.deadlineMs,!t&&r-a<n)?"capture-again":"finish"}({captureStartedAt:s,capturedAfterDeadline:o,startedAt:n,deadlineMs:i});if("capture-again"===d){o=!0;continue}if("finish"===d)break;await rB(250)}let s=r??oF("COMMAND_FAILED",`Expected visible but did not match: ${t.selector}`,{selector:t.selector,timeoutMs:t.timeoutMs}),l=await sn(e,t,a);return l||sw(s,a,e.baseReq)}async function sa(e,t,r,a){let n=await sf(e,t.selector,"assertVisible");if(n.visible)return sg(n.response,t.selector,a);let i=sd(e.baseReq,t,n,a);if("return"===i.kind)return i.response;let o=await sn(e,t,n.snapshot);return o||sw(r,n.snapshot,e.baseReq)}async function sn(e,t,r){if(e.baseReq.flags?.platform!=="android")return null;let a=function(e){if(!e)return;let t=oV.get(e);return oV.delete(e),t}(e.scope);return a?"tap"===a.kind?await si(e,t,r,a):await so(e,t,a):null}async function si(e,t,r,a){if(!r)return null;let n=function(e,t,r){var a;let n,i=oz(e.baseReq.flags),o=ep(t),s=oB(t,r.selector,r.options??{},i,o,{promoteTapTarget:!0});if(s.ok)return{ok:!0,target:{kind:"point",point:tS(s.rect)}};let l=oW(r.selector);return l&&(a=t,(n=l.trim().toLowerCase())&&a.nodes.some(e=>[e.label,e.value,e.identifier].some(e=>e?.trim().toLowerCase().includes(n))))?{ok:!0,target:{kind:"text",query:l}}:{ok:!1}}(e,r,a);return n.ok&&(t3({level:"info",phase:"maestro_assert_visible_retry_tap",data:{selector:t.selector,tapSelector:a.selector,originalPoint:a.point,retryTarget:n.target,timeoutMs:5e3}}),(await sl(e,n.target)).ok)?await ss(e,t,"retryTap"):null}async function so(e,t,r){return(t3({level:"info",phase:"maestro_assert_visible_retry_swipe",data:{selector:t.selector,swipePositionals:r.positionals,timeoutMs:5e3}}),(await su(e,r)).ok)?await ss(e,t,"retrySwipe"):null}async function ss(e,t,r){let a={...t,timeoutMs:Math.min(t.timeoutMs,5e3)},n=sp(e.baseReq,a.selector);if(!n)return await sr(e,a);let i=Date.now(),o=await st(e,a,n);return o.ok?(oU(e.scope,a.selector),sg({ok:!0,data:{selector:a.selector,nativeWait:!0,[r]:!0,query:n,response:o.data}},a.selector,i)):await sa(e,a,o,i)}async function sl(e,t){return"text"===t.kind?await e.invoke({...e.baseReq,command:"find",positionals:[t.query,"click"],flags:{...e.baseReq.flags,findFirst:!0,postGestureStabilization:!0}}):await e.invoke({...e.baseReq,command:"click",positionals:[String(t.point.x),String(t.point.y)],flags:{...e.baseReq.flags,postGestureStabilization:!0}})}async function su(e,t){return await e.invoke({...e.baseReq,command:"swipe",positionals:t.positionals})}function sd(e,t,r,a){var n,i,o,s,l,u,d;return!(n=r.response).ok&&"COMMAND_FAILED"===n.error.code&&n.error.message.includes("React Native overlay")?{kind:"return",response:r.response}:(i=e,o=t.selector,s=r.snapshot,i.flags?.maestro?.allowAlreadyPastLoading===!0&&void 0!==s&&function(e,t){let r=sm(oW(e));if(!sh(r))return!1;let a=t.nodes.flatMap(e=>[e.label,e.value,e.identifier]).filter(e=>!!e?.trim()).map(e=>sm(e));return!a.some(e=>e.includes("something went wrong"))&&a.some(e=>e!==r&&!sh(e))}(o,s))?{kind:"return",response:(l=t.selector,u=t.timeoutMs,d=a,{ok:!0,data:{selector:l,alreadyPastLoading:!0,waitedMs:Date.now()-d,timeoutMs:u}})}:{kind:"continue"}}function sp(e,t){return e.flags?.platform!=="ios"&&e.flags?.platform!=="android"?null:oW(t)}function sc(e,t){let[r,a=String(t.defaultTimeoutMs)]=e;if(!r)return{ok:!1,response:oF("INVALID_ARGS",`${t.command} requires a selector.`)};let n=Number(a);return!Number.isFinite(n)||n<0?{ok:!1,response:oF("INVALID_ARGS",`${t.command} timeout must be a non-negative number.`)}:{ok:!0,selector:r,timeoutMs:n}}async function sf(e,t,r){let a=await oq(e);var n=e,i=t,o=r,s=a;if(!s.ok)return{visible:!1,response:s,infrastructureFailure:!0};let l=oT(s.data);if(!l)return{visible:!1,response:oF("COMMAND_FAILED",`Unable to read snapshot data for ${o}.`),infrastructureFailure:!0};let u=oK(l,i,oz(n.baseReq.flags),ep(l));return u.ok?(oU(n.scope,i),{visible:!0,response:{ok:!0,data:{selector:i,matches:u.matches,nodeIndex:u.node.index,nodeType:u.node.type,nodeLabel:u.node.label,nodeIdentifier:u.node.identifier,rect:u.rect}}}):{visible:!1,response:oF("COMMAND_FAILED",u.message,{selector:i}),infrastructureFailure:!1,snapshot:l}}function sm(e){return e?.trim().toLowerCase().replace(/\u2026/g,"...")??""}function sh(e){return"loading"===e||"loading..."===e}function sg(e,t,r){return e.ok?{ok:!0,data:{selector:t,...e.data,waitedMs:Date.now()-r}}:e}function sw(e,a,n){var i;if(e.ok||!a)return e;let o="string"==typeof n.flags?.artifactsDir?n.flags.artifactsDir:void 0;if(!o)return e;let s=function(e,a){try{t.mkdirSync(a,{recursive:!0});let n=r.join(a,"failure-snapshot.json"),i=r.join(a,"failure-snapshot.txt");t.writeFileSync(n,`${JSON.stringify(e,null,2)}
29
- `);let o=tv(e.nodes,{summarizeTextSurfaces:!0}).map(e=>e.text);return t.writeFileSync(i,`${o.join("\n")}
30
- `),[n,i]}catch{return[]}}(a,o);return 0===s.length?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},artifactPaths:[...new Set([...Array.isArray(i=e.error.details?.artifactPaths)?i.filter(e=>"string"==typeof e):[],...s])]}}}}async function sv(e){let t,r=sc(e.positionals,{command:"assertNotVisible",defaultTimeoutMs:3e3});if(!r.ok)return r.response;let a=Date.now(),n=0;for(;Date.now()-a<=r.timeoutMs;){let i=await sf(e,r.selector,"assertNotVisible");if(!i.visible&&i.infrastructureFailure)return i.response;if(i.visible)n=0,t=i.response;else{n+=1;let e=Date.now()-a;if(n>=2||e>=r.timeoutMs)return{ok:!0,data:{pass:!0,selector:r.selector,stableSamples:n,waitedMs:e,timeoutMs:r.timeoutMs}}}await rB(250)}return n>0?{ok:!0,data:{pass:!0,selector:r.selector,stableSamples:n,waitedMs:Date.now()-a,timeoutMs:r.timeoutMs}}:oF("COMMAND_FAILED",`Expected not visible but matched: ${r.selector}`,{selector:r.selector,timeoutMs:r.timeoutMs,lastResponse:t})}async function sy(e){let t,r,a=Number(e.positionals[0]??15e3);if(!Number.isFinite(a)||a<0)return oF("INVALID_ARGS","waitForAnimationToEnd timeout must be a number.");let n=Date.now();for(;Date.now()-n<a;){let n=await oq(e),i=function(e,t,r){let a=function(e){if(!e.ok)return null;let t=oT(e.data);return t?JSON.stringify(t.nodes.map(e=>({index:e.index,parentIndex:e.parentIndex,type:e.type,identifier:e.identifier,label:e.label,value:e.value,rect:e.rect?{x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height)}:void 0}))):null}(e);return e.ok?a?t===a?{done:!0,response:{ok:!0,data:{stable:!0,timeoutMs:r}}}:{done:!1,signature:a}:{done:!0,response:e}:{done:!1}}(n,t,a);if(i.done)return i.response;t=i.signature??t,r=n,await rB(250)}return r?.ok===!1?r:{ok:!0,data:{stable:!1,timeoutMs:a}}}async function sA(e){var t,r,a;let[n,i="5000",o="down"]=e.positionals;if(!n)return oF("INVALID_ARGS","scrollUntilVisible requires a selector.");let s=Number(i);if(!Number.isFinite(s)||s<=0)return oF("INVALID_ARGS","scrollUntilVisible timeout must be a positive number.");let l=oW(n),u=Math.max(1,Math.ceil(s/500)),d=null;for(let t=0;t<u;t+=1){let r=await sP(e,n,l,Math.min(500,Math.max(1,s-500*t)));if(r.ok)return r;if(d=r,t===u-1)break;let a=await e.invoke({...e.baseReq,command:"scroll",positionals:[o]});if(!a.ok)return a}return t=d,r=n,a=s,t?{ok:!1,error:{...t.error,message:`scrollUntilVisible timed out after ${a}ms for selector: ${r}. Last wait: ${t.error.message}`}}:oF("COMMAND_FAILED",`scrollUntilVisible timed out after ${a}ms for selector: ${r}`)}async function sb(e){let[t,r]=e.positionals,a=Number(t),n=Number(r);if(!Number.isFinite(a)||!Number.isFinite(n))return oF("INVALID_ARGS","tapOn percentage point requires numeric x/y values.");let i=await oq(e);if(!i.ok)return i;let o=oT(i.data);if(!o)return oF("COMMAND_FAILED","Unable to read snapshot data for Maestro percentage point tap.");let s=ep(o);if(!s)return oF("COMMAND_FAILED","Unable to resolve screen size for Maestro percentage point tap.");let l=tm(s,a,n),u=await e.invoke({...e.baseReq,command:"click",positionals:[String(l.x),String(l.y)],flags:{...e.baseReq.flags,postGestureStabilization:!0}});return u.ok&&oG(e.scope),u}async function sS(e){let t=await sI(e);if(t)return t;let r=await sD(e);return r.ok?await sN(e,r,r.durationMs):r.response}async function sI(e){let[t,r,a]=e.positionals;if("direction"===t&&("left"===r||"right"===r)&&"android"!==oz(e.baseReq.flags))return await e.invoke({...e.baseReq,command:"gesture",positionals:["swipe",r,...a?[a]:[]]})}async function s_(e){var t,r,a,n;let i,[o,s]=e.positionals;if(!o)return oF("INVALID_ARGS","tapOn requires a selector.");let l=function(e){if(!e)return{ok:!0,value:null};try{let t=JSON.parse(e);return{ok:!0,value:t}}catch{return{ok:!1,response:oF("INVALID_ARGS","tapOn runtime options must be valid JSON.")}}}(s);if(!l.ok)return l.response;let u=Date.now(),d=(t=e,t.baseReq.flags?.maestro?.optional===!0?3e3:3e4);for(;Date.now()-u<d;){let t=await sL(e,o,l.value??{});if(!t.retry)return t.response;i=t.response,await rB(250)}return r=e,a=o,n=i,r.baseReq.flags?.maestro?.optional===!0?{ok:!0,data:{skipped:!0,optional:!0,selector:a}}:n??oF("COMMAND_FAILED",`tapOn timed out for selector: ${a}`)}async function sk(e){let[t,r="up",a]=e.positionals;if(!t)return oF("INVALID_ARGS","swipe.label requires a label selector.");let n=await sE(e,t,{},"swipe.label",{promoteTapTarget:!1});if(!n.ok)return n.response;let i=function(e,t){let r=tS(e.rect),a=e.frame,n=o$(a?.referenceWidth,e.rect.width),i=o$(a?.referenceHeight,e.rect.height),o=oO,s=a?a.referenceWidth-o:r.x+n,l=a?a.referenceHeight-o:r.y+i;switch(t.toLowerCase()){case"up":return{ok:!0,start:r,end:{x:r.x,y:tL(r.y-i,o,l)}};case"down":return{ok:!0,start:r,end:{x:r.x,y:tL(r.y+i,o,l)}};case"left":return{ok:!0,start:r,end:{x:tL(r.x-n,o,s),y:r.y}};case"right":return{ok:!0,start:r,end:{x:tL(r.x+n,o,s),y:r.y}};default:return{ok:!1,message:"swipe.label direction must be up, down, left, or right."}}}(n.target,r);return i.ok?await sN(e,i,a):oF("INVALID_ARGS",i.message)}async function sN(e,t,r){var a,n;let i=[String(t.start.x),String(t.start.y),String(t.end.x),String(t.end.y),...r?[r]:[]],o=await e.invoke({...e.baseReq,command:"swipe",positionals:i});return o.ok&&(a=e.scope,n={kind:"swipe",positionals:i},a&&oV.set(a,n)),o}async function sD(e){var t;let r=((t=e.scope)?oC.get(t):void 0)??await sx(e);if(!r)return{ok:!1,response:oF("COMMAND_FAILED","Unable to resolve screen size for Maestro swipe.")};let[a,...n]=e.positionals;return"direction"===a?function(e,t,r){let[a,n]=e;if(!a)return{ok:!1,response:oF("INVALID_ARGS","Maestro direction swipe requires a direction.")};switch(a){case"up":case"down":var i,o,s;let l;return i=a,o=t,s=n,{ok:!0,start:t_({x:(l=tg({direction:i,amount:.6,referenceWidth:o.referenceWidth,referenceHeight:o.referenceHeight})).x1,y:l.y1},o,8),end:t_({x:l.x2,y:l.y2},o,8),durationMs:s};case"left":case"right":return function(e,t,r,a){let n=sM(r,85,50,15,50),[i,o]="left"===e?[85,15]:[15,85],s=sR(r,t,i,50,o,50);return{ok:!0,start:tm(t,i,n.startY,{marginPx:s}),end:tm(t,o,n.endY,{marginPx:s}),durationMs:a}}(a,t,r,n);default:return{ok:!1,response:oF("INVALID_ARGS","Maestro swipe direction must be UP, DOWN, LEFT, or RIGHT.")}}}(n,r,oz(e.baseReq.flags)):"percent"===a?function(e,t,r){let[a,n,i,o,s]=e,l=[a,n,i,o].map(Number);if(l.some(e=>!Number.isFinite(e)))return{ok:!1,response:oF("INVALID_ARGS","Maestro percentage swipe requires numeric points.")};let[u,d,p,c]=l,f=sM(r,u,d,p,c),m=sR(r,t,u,d,p,c);return{ok:!0,start:tm(t,u,f.startY,{marginPx:m}),end:tm(t,p,f.endY,{marginPx:m}),durationMs:s}}(n,r,oz(e.baseReq.flags)):{ok:!1,response:oF("INVALID_ARGS","Maestro screen swipe requires direction or percent.")}}async function sx(e){let t=await oq(e);if(t.ok)return ep(oT(t.data))}function sR(e,t,r,a,n,i){return"ios"!==e||a!==i||30>Math.abs(n-r)?1:Math.max(1,Math.round(.15*t.referenceWidth))}function sM(e,t,r,a,n){return"android"!==e||r!==n||50!==r||30>Math.abs(a-t)?{startY:r,endY:n}:{startY:65,endY:65}}async function sP(e,t,r,a){let n=await e.invoke({...e.baseReq,command:"wait",positionals:[t,String(a)]});return n.ok||!r?n:await e.invoke({...e.baseReq,command:"find",positionals:[r,"wait",String(a)]})}async function sL(e,t,r){let a=oW(t),n=await sO(e,t,r);return n.response.ok?{retry:!1,response:n.response}:n.targetResolved&&a?await sC(e,a):{retry:!0,response:n.response}}async function sO(e,t,r){let a=await sE(e,t,r,"tapOn",{promoteTapTarget:!0});return a.ok?await s$(e,t,a.target,r):{response:a.response,targetResolved:!1}}async function s$(e,t,r,a){let n=tS(r.rect);t3({level:"debug",phase:"maestro_tap_target",data:{selector:t,node:{index:r.node.index,type:r.node.type,label:r.node.label,value:r.node.value,identifier:r.node.identifier,visibleToUser:r.node.visibleToUser},rect:r.rect,point:n}});let i=await e.invoke({...e.baseReq,command:"click",positionals:[String(n.x),String(n.y)],flags:{...e.baseReq.flags,postGestureStabilization:!0}});if(i.ok){var o,s,l;(o=e.scope)&&oE.delete(o),s=e.scope,l={kind:"tap",selector:t,point:n,options:{...a}},s&&oV.set(s,l)}return{response:i,targetResolved:!0}}async function sC(e,t){let r=await e.invoke({...e.baseReq,command:"find",positionals:[t,"click"],flags:{...e.baseReq.flags,findFirst:!0,postGestureStabilization:!0}});return(t3({level:r.ok?"info":"debug",phase:"maestro_fuzzy_tap_fallback",data:{query:t,ok:r.ok}}),r.ok)?(oG(e.scope),{retry:!1,response:r}):{retry:!0,response:r}}async function sE(e,t,r,a,n){let i=await oq({...e,raw:!0});return function(e,t,r,a,n,i){if(!i.ok)return{ok:!1,response:i};let o=oT(i.data);if(!o)return{ok:!1,response:oF("COMMAND_FAILED",`Unable to read snapshot data for ${a}.`)};let s=ep(o),l=oz(e.baseReq.flags),u=function(e,t,r,a){var n;let i=(n=e.scope)?oE.get(n):void 0;if(!i)return;let o=oK(t,i.selector,r,a);if(o.ok)return t3({level:"debug",phase:"maestro_preferred_context",data:{selector:i.selector,node:{index:o.node.index,type:o.node.type,label:o.node.label,value:o.node.value,identifier:o.node.identifier},rect:o.rect}}),{node:o.node,rect:o.rect}}(e,o,l,s),d=oB(o,t,r,l,s,{...n,preferredContext:u,requireOnScreen:!0});if(!d.ok){let e=oW(t);if(e){let t=function(e,t,r,a,n={}){let i=function(e,t){let r=rU(t);if(!r)return[];let a=[],n=[];for(let t of e.nodes){let e=[t.label,rR(t),t.identifier,t.value].filter(e=>!!e).map(e=>rU(e));e.some(e=>e===r)?a.push(t):e.some(e=>e.includes(r))&&n.push(t)}return a.length>0?a:n}(e,t),o=oj({nodes:e.nodes,matches:i,platform:r}),s=oQ(e.nodes,o.matches,void 0,t,a,!0===n.requireOnScreen,n.promoteTapTarget,n.preferredContext);return s?{ok:!0,node:s.node,rect:s.rect}:{ok:!1,message:`Maestro fuzzy text did not match: ${t}`}}(o,e,l,s,{...n,preferredContext:u,requireOnScreen:!0});if(t.ok)return{ok:!0,target:{node:t.node,rect:t.rect,frame:s}}}}return d.ok?{ok:!0,target:{node:d.node,rect:d.rect,frame:s}}:{ok:!1,response:oF("ELEMENT_NOT_FOUND",d.message,{selector:t,options:r,command:a})}}(e,t,r,a,n,i)}async function sV(e){switch(e.command){case ib:return await o9(e);case iS:return await sv(e);case iI:return await sF(e);case i_:return await sy(e);case ik:return await sA(e);case iN:return await sS(e);case iD:return await sk(e);case ix:return await s_(e);case iR:return await sb(e);case iA:return function(e){let[r]=e.positionals;if(!r)return oF("INVALID_ARGS","runScript requires a file path.");try{let n=function(e){let{scriptPath:r,env:n}=e,i=t.readFileSync(r,"utf8"),o=Object.create(null);try{var s,u;a.runInNewContext(i,(s=n,u=o,{...s,output:u,json:iK,http:{post:(e,t)=>(function(e,t,r){let a=t1(process.execPath,["-e",iB],{stdin:JSON.stringify({method:e,url:t,headers:r?.headers??{},body:r?.body??""}),timeoutMs:3e4,allowFailure:!0});if(0!==a.exitCode){let r;throw new l("COMMAND_FAILED",`Maestro runScript http.${e.toLowerCase()} failed for ${t}: ${(r=a.stderr.trim()).length>0?r.slice(0,1e3):"request process exited without stderr"}`,{exitCode:a.exitCode,stderr:a.stderr})}try{return JSON.parse(a.stdout)}catch(r){throw new l("COMMAND_FAILED",`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${t}`,{stdout:a.stdout.slice(0,1e3),stderr:a.stderr.slice(0,1e3)},r instanceof Error?r:void 0)}})("POST",e,t)}}),{filename:r,timeout:3e4})}catch(e){throw new l("COMMAND_FAILED",`Maestro runScript failed for ${r}: ${e instanceof Error?e.message:String(e)}`,{scriptPath:r},e instanceof Error?e:void 0)}return function(e,t){for(let r of Object.keys(e))if(r.includes("."))throw new l("INVALID_ARGS",`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:t,key:r})}(o,r),Object.fromEntries(Object.entries(o).map(([e,t])=>{var r;return[`output.${e}`,(r=t,"string"==typeof r?r:"number"==typeof r||"boolean"==typeof r?String(r):JSON.stringify(r))]}))}({scriptPath:r,env:{...e.scope.values,...e.baseReq.flags?.maestro?.runScriptEnv??{}}});return{ok:!0,data:{outputEnv:n}}}catch(t){let e=o(t);return oF(e.code,e.message,e.details)}}(e);default:return}}async function sF(e){let t=await e.invoke({...e.baseReq,command:"keyboard",positionals:["enter"]});return t.ok?t:await e.invoke({...e.baseReq,command:"type",positionals:["\n"]})}async function sq(e){for(let[t,r]of e.actions.entries()){let a=await e.invokeReplayAction({action:r,line:e.line,step:e.step+t/1e3});if(!a.ok)return a}return{ok:!0,data:{ran:e.actions.length}}}async function sT(e){let t;for(let r=0;r<=e.maxRetries;r+=1){let a=await sq({actions:e.actions,line:e.line,step:e.step+r,invokeReplayAction:e.invokeReplayAction});if(a.ok)return{ok:!0,data:{attempts:r+1,retried:r>0}};t=a}return t??{ok:!1,error:{code:"COMMAND_FAILED",message:"retry commands failed."}}}async function sU(e){let t=await sG(e,e.control);return t.ok?t.matched?await sK(e):{ok:!0,data:{skipped:!0,condition:e.control.mode,selector:e.control.selector}}:t.response}async function sG(e,t){if("visible"===t.mode)return await sH(e,t);let r=await sB(e,t.selector);return r.ok?{ok:!0,matched:!r.matched}:{ok:!1,response:r.response}}async function sH(e,t){let r=Date.now();for(;;){let a=await sB(e,t.selector);if(!a.ok)return{ok:!1,response:a.response};if(a.matched)return{ok:!0,matched:!0};if(Date.now()-r>=3e3)return{ok:!0,matched:!1};await rB(250)}}async function sB(e,t){var r,a;let n,i=await oq(e);return i.ok?(r=e,a=t,(n=oT(i.data))?{ok:!0,matched:oK(n,a,oz(r.baseReq.flags),ep(n)).ok}:{ok:!1,response:oF("COMMAND_FAILED","Unable to read snapshot data for runFlow.when.")}):{ok:!1,response:i}}async function sK(e){let t=await sq({actions:e.control.actions,line:e.line,step:e.step,invokeReplayAction:e.invokeReplayAction});return t.ok?{ok:!0,data:{ran:t.data?.ran,condition:e.control.mode,selector:e.control.selector}}:t}async function sj(e){let{req:t,sessionName:r,action:a,scope:n,filePath:i,line:o,step:s,tracePath:l,invoke:u}=e,d=rI(a,n,{file:i,line:o}),p=Date.now();sJ(l,{type:"replay_action_start",ts:new Date(p).toISOString(),replayPath:i,line:o,step:s,command:d.command,positionals:d.positionals??[]});let c=await sz({req:t,sessionName:r,resolved:d,scope:n,line:o,step:s,invoke:u,invokeReplayAction:e=>sj({req:t,sessionName:r,action:e.action,scope:n,filePath:i,line:e.line,step:e.step,tracePath:l,invoke:u})}),f=Date.now();return sJ(l,{type:"replay_action_stop",ts:new Date(f).toISOString(),replayPath:i,line:o,step:s,command:d.command,ok:c.ok,durationMs:f-p,resultTiming:c.ok?function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;let t=e.timing;if(!(!t||"object"!=typeof t||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return"number"===t||"string"===t||"boolean"===t}))}(c.data):void 0,errorCode:c.ok?void 0:c.error.code}),c}async function sz(e){var t;let{req:r,sessionName:a,resolved:n,scope:i,line:o,step:s,invoke:l,invokeReplayAction:u}=e,d=(t=r.flags,t8(t,{...n.flags??{}})),p={token:r.token,session:a,flags:d,runtime:n.runtime,meta:r.meta,internal:r.internal},c=await sW({control:n.replayControl,baseReq:p,line:o,step:s,invoke:l,invokeReplayAction:u})??await sV({command:n.command,baseReq:p,positionals:n.positionals??[],scope:i,line:o,step:s,invoke:l,invokeReplayAction:u})??await l({...p,command:n.command,positionals:n.positionals??[]});if(c.ok){let e=function(e){if(!e||"object"!=typeof e)return null;let t=e.outputEnv;if(!t||"object"!=typeof t||Array.isArray(t))return null;let r=Object.entries(t).filter(e=>"string"==typeof e[1]);return r.length>0?Object.fromEntries(r):null}(c.data);e&&r_(i,e)}return c}async function sW(e){let{control:t,baseReq:r,line:a,step:n,invoke:i,invokeReplayAction:o}=e;if(t){switch(t.kind){case"retry":return await sT({actions:t.actions,maxRetries:t.maxRetries,line:a,step:n,invokeReplayAction:o});case"maestroRunFlowWhen":return await sU({baseReq:r,control:t,line:a,step:n,invoke:i,invokeReplayAction:o})}return t}}function sJ(e,r){e&&t.appendFileSync(e,`${JSON.stringify(r)}
31
- `)}async function sY(e){let{req:a,sessionName:n,logPath:i,sessionStore:s,tracePath:u,invoke:d}=e,p=a.positionals?.[0];if(!p)return U("INVALID_ARGS","replay requires a path");let c="",f=new Set;try{var m,h,g,w,v,y,A,b,S,I,_,k,N,D,x,R,M,P,L,O;c=eN.expandHome(p,a.meta?.cwd);let e=t.readFileSync(c,"utf8"),o=e.trimStart()[0];if("{"===o||"["===o)return U("INVALID_ARGS","replay accepts .ad script files. JSON replay payloads are no longer supported.");let $=function(e,t,r={}){var a;let n=function(e){let t=e?.replayBackend;if("string"!=typeof t)return;let r=ok[t];if(!r)throw new l("INVALID_ARGS",`Unsupported replay backend "${t}".`);return r}(t);return n?{...n.parse(e,{...r,platform:t?.platform,env:(a=t,{...rp(ra(a?.replayShellEnv)),...rd(ro(a?.replayEnv))})}),updateUnsupportedMessage:"replay -u is not supported for compat flow input. Convert to .ad first, then update that replay file."}:{...rr(e),metadata:ru(e)}}(e,a.flags,{sourcePath:c}),C=$.metadata,E=C.platform||C.target?{...a,flags:(m=a.flags,h=C,{...m??{},...void 0!==h.platform&&m?.platform===void 0?{platform:h.platform}:{},...void 0!==h.target&&m?.target===void 0?{target:h.target}:{}})}:a,V=$.actions,F=$.actionLines;if(a.flags?.replayUpdate===!0&&$.updateUnsupportedMessage)return U("INVALID_ARGS",$.updateUnsupportedMessage);if(a.flags?.replayUpdate===!0&&C.env&&Object.keys(C.env).length>0)return U("INVALID_ARGS","replay -u does not yet preserve env directives. Temporarily remove the env lines, run replay -u, then restore them.");if(a.flags?.replayUpdate===!0&&function(e){for(let t of e){for(let e of t.positionals??[])if("string"==typeof e&&e.includes("${"))return!0;if(s3(t.flags)||s3(t.runtime))return!0}return!1}(V))return U("INVALID_ARGS","replay -u does not yet preserve ${VAR} substitutions. Resolve or inline the variables before running with -u.");let q=rS({builtins:function(e){let{req:t,sessionName:a,metadata:n,resolvedPath:i}=e,o=t.flags??{},s=t.meta?.cwd??process.cwd(),l={AD_SESSION:a,AD_FILENAME:r.relative(s,i)||i},u=o.platform??n.platform;u&&(l.AD_PLATFORM=u);let d=o.target??n.target;d&&(l.AD_TARGET=d);let p=o.device;"string"==typeof p&&p.length>0&&(l.AD_DEVICE=p);let c="string"==typeof o.serial?o.serial:o.udid;"string"==typeof c&&c.length>0&&(l.AD_DEVICE_ID=c),"number"==typeof o.shardIndex&&(l.AD_SHARD_INDEX=String(o.shardIndex)),"number"==typeof o.shardCount&&(l.AD_SHARD_COUNT=String(o.shardCount));let f=o.artifactsDir;return"string"==typeof f&&f.length>0&&(l.AD_ARTIFACTS=f),l}({req:E,sessionName:n,metadata:C,resolvedPath:c}),fileEnv:C.env,shellEnv:rp(ra(a.flags?.replayShellEnv)),cliEnv:rd(ro(a.flags?.replayEnv))}),T=a.flags?.replayUpdate===!0,G=u??s.get(n)?.trace?.outPath,B=[],K=0;for(let e=0;e<V.length;e+=1){let t=V[e];if(!t||"replay"===t.command)continue;!function(e,t,r,a){var n;let i=H();i&&e6({type:"replay-test",...i,file:i.file||e,status:"progress",stepIndex:t+1,stepTotal:r,...(n=a,{stepCommand:function(e){if(!e.startsWith("__maestro"))return e;let t=e.slice(9);return t.length>0?t[0].toLowerCase()+t.slice(1):e}(n.command),...function(e){let t=e.positionals??[],r=function(e){if(!e)return;let t=rG(e);if(!t)return;let r=t.selectors.flatMap(e=>e.terms.flatMap(e=>("label"===e.key||"text"===e.key||"id"===e.key)&&"string"==typeof e.value?[e.value]:[]));if(0===r.length)return;let a=r[0];return a&&r.every(e=>e===a)?a:void 0}(t[0]);return r?{stepValue:r}:"__maestroTapPointPercent"===e.command&&t.length>=2?{stepValue:`${t[0]},${t[1]}%`}:0===t.length?{}:{stepValue:t.join(" ")}}(n)})})}(c,e,V.length,t);let r=sZ(s,n),a=await sj({req:E,sessionName:n,action:t,scope:q,filePath:c,line:F[e]??0,step:e+1,tracePath:G,invoke:d});if(B.push(...s0(s,n,r)),a.ok){sQ(a).forEach(e=>f.add(e));continue}if(sQ(a).forEach(e=>f.add(e)),!T){return g=a,w=t,v=e,y=c,A=[...f],b=B,sX(g,w,v,y,A,rN(b))}let o=await oD({action:t,sessionName:n,logPath:i,sessionStore:s});if(!o){return S=a,I=t,_=e,k=c,N=[...f],D=B,sX(S,I,_,k,N,rN(D))}V[e]=o;let l=sZ(s,n);if(a=await sj({req:E,sessionName:n,action:o,scope:q,filePath:c,line:F[e]??0,step:e+1,tracePath:G,invoke:d}),B.push(...s0(s,n,l)),!a.ok){return sQ(a).forEach(e=>f.add(e)),x=a,R=o,M=e,P=c,L=[...f],O=B,sX(x,R,M,P,L,rN(O))}sQ(a).forEach(e=>f.add(e)),K+=1}T&&K>0&&rb(c,V,s.get(n));let j=rN(B);return{ok:!0,data:{replayed:V.length,healed:K,session:n,artifactPaths:[...f],...j?{snapshotDiagnostics:j}:{}}}}catch(t){let e=o(t);return U(e.code,e.message,f.size>0?{artifactPaths:[...f]}:void 0)}}function sX(e,t,r,a,n=[],i){if(e.ok)return e;let o=r+1;return{ok:!1,error:{code:e.error.code,message:`Replay failed at step ${o} (${rV(t)}): ${e.error.message}`,hint:e.error.hint,diagnosticId:e.error.diagnosticId,logPath:e.error.logPath,details:{...e.error.details??{},replayPath:a,step:o,action:t.command,positionals:t.positionals??[],artifactPaths:n,...i?{snapshotDiagnostics:i}:{}}}}}function sQ(e){if(!e.ok){let t=e.error.details?.artifactPaths;return Array.isArray(t)?[...new Set(t.filter(e=>"string"==typeof e&&s1(e)))]:[]}if(!e.data)return[];let t=[];if("string"==typeof e.data.path&&t.push(e.data.path),"string"==typeof e.data.outPath&&t.push(e.data.outPath),Array.isArray(e.data.artifacts))for(let r of e.data.artifacts){if(!r||"object"!=typeof r)continue;let e="string"==typeof r.localPath?r.localPath:void 0,a="string"==typeof r.path?r.path:void 0;e?t.push(e):a&&t.push(a)}return[...new Set(t.filter(e=>s1(e)))]}function sZ(e,t){return e.get(t)?.snapshotDiagnostics?.samples.length??0}function s0(e,t,r){return e.get(t)?.snapshotDiagnostics?.samples.slice(r)??[]}function s1(e){try{return t.statSync(e).isFile()}catch{return!1}}function s3(e){return"string"==typeof e?e.includes("${"):Array.isArray(e)?e.some(s3):!!e&&"object"==typeof e&&Object.values(e).some(s3)}async function s2(e){let{req:t,sessionName:a,logPath:n,sessionStore:i,artifactsDir:o,tracePath:s}=e;if(t.flags?.recordVideo!==!0)return;let l=i.get(a);if(!l||l.recording)return;let u=rj(l.device.platform),d=o?r.join(o,`recording${u}`):rz(l.device.platform);s4(s,{type:"video_recording_start",session:a,videoPath:d}),t3({phase:"replay_test_video_recording_start",data:{session:a,videoPath:d}});let p=await rK({req:{token:t.token,session:a,command:"record",positionals:["start",d],flags:{},meta:t.meta},sessionName:a,sessionStore:i,logPath:n});if(!p.ok)return s4(s,{type:"video_recording_start_failed",session:a,videoPath:d,errorCode:p.error.code}),p;let c=Date.now();return await rB(1e3),s4(s,{type:"video_preroll_done",session:a,durationMs:Date.now()-c,requestedDurationMs:1e3}),t3({phase:"replay_test_video_recording_preroll_done",durationMs:Date.now()-c,data:{session:a,requestedDurationMs:1e3}}),p}async function s5(e){let{req:t,sessionName:r,logPath:a,sessionStore:n,tracePath:i,artifactPaths:o}=e;if(t.flags?.recordVideo!==!0||!n.get(r)?.recording)return;s4(i,{type:"video_tail_start",session:r,requestedDurationMs:3e3});let s=Date.now();await rB(3e3);let l=Date.now(),u=await rK({req:{token:t.token,session:r,command:"record",positionals:["stop"],flags:{},meta:t.meta},sessionName:r,sessionStore:n,logPath:a});return sQ(u).forEach(e=>o.add(e)),s4(i,{type:"video_recording_stop",session:r,ok:u.ok,durationMs:Date.now()-l,tailDurationMs:l-s,errorCode:u.ok?void 0:u.error.code}),t3({phase:"replay_test_video_recording_stop",durationMs:Date.now()-l,data:{session:r,ok:u.ok,tailDurationMs:l-s}}),u}function s4(e,t){oi(e,{...t,ts:new Date().toISOString()})}async function s8(e){let{req:t,sessionName:r,logPath:a,sessionStore:n,leaseRegistry:i,invoke:o}=e;return"replay"===t.command?await sY({req:t,sessionName:r,logPath:a,sessionStore:n,invoke:o}):"test"===t.command?await ow({req:t,sessionName:r,runReplay:async({filePath:e,sessionName:r,platform:i,target:s,requestId:l,artifactsDir:u,artifactPaths:d,tracePath:p,shard:c})=>{let f=function(e){let{platform:t,target:r,artifactsDir:a,shard:n}=e,i=function(e){if(e?.recordVideo!==!0)return e;let t={...e};return delete t.recordVideo,Object.keys(t).length>0?t:void 0}(e.parentFlags);if(void 0===t&&void 0===r&&void 0===a&&void 0===n)return i;var o={...i??{},...void 0!==t?{platform:t}:{},...void 0!==r?{target:r}:{},...void 0!==a?{artifactsDir:a}:{}};if(!n)return o;let s={...o??{},device:void 0,udid:void 0,serial:void 0,platform:n.device.platform,target:n.device.target,shardAll:void 0,shardSplit:void 0,shardCount:n.shardCount,shardIndex:n.shardIndex};return"android"===n.device.platform?{...s,serial:n.device.id}:{...s,udid:n.device.id}}({parentFlags:t.flags,platform:i,target:s,artifactsDir:u,shard:c}),m={req:t,sessionName:r,logPath:a,sessionStore:n,artifactsDir:u,tracePath:p},h=function(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await s2(e)}}(m);return await sY({req:{...t,command:"replay",session:r,positionals:[e],flags:f,meta:{...t.meta??{},...l?{requestId:l}:{}},...t.internal||h?{internal:{...t.internal??{},...h?{openLifecycle:h}:{}}}:{}},sessionName:r,logPath:a,sessionStore:n,tracePath:p,invoke:async e=>{var t;let r=await s2(m);return r&&!r.ok?r:(t=await o(e),d&&sQ(t).forEach(e=>d.add(e)),t)}})},finalizeAttempt:async({sessionName:e,artifactPaths:r,artifactsDir:i,tracePath:o})=>await s5({req:t,sessionName:e,logPath:a,sessionStore:n,artifactsDir:i,tracePath:o,artifactPaths:r}),cleanupSession:async e=>{n.get(e)&&await nt({req:{token:t.token,session:e,command:"close",positionals:[],flags:{},meta:t.meta},sessionName:e,logPath:a,sessionStore:n,leaseRegistry:i})}}):null}function s6(e,t){var r;e.push(t),e6({type:"command",status:"progress",message:[tR(r=t),...ty(r)].join("\n")})}async function s7(e,t){let{device:r,metroPort:a,shouldProbeMetro:n,androidAdbExecutor:i}=t;if("android"!==r.platform||!n)return;let o=tU(r,i);s6(e,await s9(o,r.id,a))}async function s9(e,t,r){try{let a=await e(["reverse","--list"],{allowFailure:!0,timeoutMs:2e3}),n=`tcp:${r} tcp:${r}`,i=a.stdout.includes(n);return{id:"android-reverse",status:i?"pass":"warn",summary:i?`Android adb reverse exists for Metro port ${r}.`:`Android adb reverse is missing for Metro port ${r}.`,command:i?void 0:`adb -s ${t} reverse tcp:${r} tcp:${r}`,evidence:{stdout:a.stdout.trim()}}}catch(t){let e=s(t);return{id:"android-reverse",status:"warn",summary:"Could not inspect Android adb reverse mappings.",hint:e.message,evidence:{code:e.code}}}}async function le(e,t){let{device:r,targetApp:a,session:n}=t;if(a)try{let t=await lt(r,a);if(!t)return void s6(e,{id:"target-app",status:"info",summary:`Target app installation checks are not supported for ${te(r)}.`,evidence:{requested:a,platform:te(r)}});s6(e,{id:"target-app",status:"pass",summary:`Target app is launchable: ${t}`,evidence:{requested:a,resolved:t,sessionApp:n?.appBundleId}})}catch(a){let t=s(a);s6(e,{id:"target-app",status:"fail",summary:`Target app check failed: ${t.message}`,hint:t.hint??"Install the app or pass an exact package/bundle id or app name.",command:`agent-device apps --platform ${te(r)} --all`,evidence:{code:t.code,message:t.message}})}}async function lt(e,t){if("android"===e.platform){let{listAndroidApps:r}=await import("./3340.js"),a=lr(t,(await r(e,"all")).map(e=>({id:e.package,name:e.name})));return a?.id}if(to(e)||e7(e)){let{listIosApps:r}=await import("./apps.js"),a=lr(t,(await r(e,"all")).map(e=>({id:e.bundleId,name:e.name})));return a?.id}}function lr(e,t){let r=e.trim().toLowerCase(),a=t.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(a)return a;let n=t.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(1===n.length)return n[0];if(n.length>1)throw new l("AMBIGUOUS_MATCH",`Multiple launchable apps matched "${e}"`,{matches:n.map(e=>e.id),hint:"Pass an exact package/bundle id from agent-device apps --all."});throw new l("APP_NOT_INSTALLED",`No launchable installed app matched "${e}"`)}async function la(e,t,r){var a,n,i,o,l,u;let d,p=(a=t,n=r,ei({platform:(d=a.flags??{}).platform??n?.device.platform,target:d.target??n?.device.target,device:d.device,udid:d.udid,serial:d.serial,iosSimulatorDeviceSet:d.iosSimulatorDeviceSet,androidDeviceAllowlist:d.androidDeviceAllowlist}));try{let t=await ln(p),r=(i=t.devices,o=p,i.filter(e=>ti(e,o,{includeExplicitSelectors:!0})));return s6(e,{id:"device",status:0===r.length?"fail":"pass",summary:function(e,t,r){var a,n;if(0===e.length)return r.length>0?`No ${li(t)} devices found; ${r.slice(0,2).map(e=>`${lo(e.platform)} inventory failed: ${e.message}`).join("; ")}.`:`No ${li(t)} devices found.`;let i=e.filter(e=>!0===e.booted).length,o=`${e.length} ${li(t)} ${(a=e.length,n="device",1===a?n:`${n}s`)} available; ${i} booted`,s=function(e,t){if(t.platform||t.target)return;let r=g(e),a={android:"Android",apple:"Apple",linux:"Linux",web:"web"};return["android","apple","linux","web"].flatMap(e=>{let t=r[e];return t.available>0?[`${a[e]} ${t.available} available, ${t.booted} booted`]:[]}).join("; ")}(e,t);return s?`${o} (${s}).`:`${o}.`}(r,p,t.failures),hint:0===r.length?(l=t.failures,l.find(e=>e.hint)?.hint??"Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors."):void 0,command:0===r.length?(u=p).platform?`agent-device devices --platform ${u.platform}`:"agent-device devices":void 0,evidence:function(e,t){let r=new Map;for(let t of e){let e=te(t),a=r.get(e)??{available:0,booted:0};a.available+=1,!0===t.booted&&(a.booted+=1),r.set(e,a)}return{available:e.length,booted:e.filter(e=>!0===e.booted).length,byPlatform:Object.fromEntries([...r.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}(r,t.failures)}),r.length>0&&function(e,t){for(let a of t){var r;s6(e,(r=a,{id:`device-${r.platform}`,status:"warn",summary:`${lo(r.platform)} device inventory could not be read: ${r.message}`,hint:r.hint??`Check the ${lo(r.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:r.platform,code:r.code}}))}}(e,t.failures),{devices:r,platform:p.platform,target:p.target}}catch(r){let t=s(r);return s6(e,{id:"device",status:"fail",summary:t.message,hint:t.hint,command:"agent-device devices",evidence:{code:t.code,details:t.details}}),{devices:[],platform:p.platform,target:p.target}}}async function ln(e){if(e.platform)return{devices:await ek(e),failures:[]};let t=[],r=[];for(let a of p)try{t.push(...await ek({...e,platform:a}))}catch(e){r.push(function(e,t){let r=s(t);return{platform:e,message:r.message,hint:r.hint,code:r.code}}(a,e))}return{devices:t,failures:r}}function li(e){let t=e.platform?lo(e.platform):"local";return e.target?`${t} ${e.target}`:t}function lo(e){return"ios"===e?"iOS":"macos"===e?"macOS":"android"===e?"Android":"linux"===e?"Linux":"web"===e?"web":"Apple"}async function ls(e,t,r,a={}){let n=`http://${e}:${t}/status`;try{var i,o;let s=await fetch(n,{signal:AbortSignal.timeout(1500)}),l=await s.text(),u=s.ok&&l.toLowerCase().includes("packager-status:running"),d=u?await ll(e,t,a):void 0;return{id:"metro",status:u?"pass":"warn",summary:u?(i=n,o=d,o?.cwd?`Metro is reachable at ${i} (cwd: ${o.cwd}).`:`Metro is reachable at ${i}.`):`Metro responded at ${n}, but did not report packager-status:running.`,hint:u?void 0:"Verify this is the Metro instance for the target app, or restart Metro.",evidence:{url:n,statusCode:s.status,body:l.slice(0,120),kind:r,...d?{process:d}:{}}}}catch(e){return{id:"metro",status:"auto"===r?"warn":"fail",summary:`Metro is not reachable at ${n}.`,hint:"Start Metro for this project. For non-default endpoints, launch with open --metro-host/--metro-port, or run metro prepare with --public-base-url/--proxy-base-url before retrying doctor.",command:`curl -fsS ${n}`,evidence:{url:n,error:e instanceof Error?e.message:String(e),kind:r}}}}async function ll(e,t,r){try{return await (r.resolveProcessInfo??lu)(e,t)}catch{return}}async function lu(e,t){var r;if("127.0.0.1"!==(r=e)&&"localhost"!==r&&"::1"!==r&&"0.0.0.0"!==r)return;let a=await ld(t);if(void 0!==a)return{pid:a,cwd:await lp(a)}}async function ld(e){let t=await t0("lsof",["-nP",`-iTCP:${e}`,"-sTCP:LISTEN","-Fp"],{allowFailure:!0,timeoutMs:1500});if(0===t.exitCode)return t.stdout.split("\n").map(e=>e.startsWith("p")?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function lp(e){let t=await t0("lsof",["-nP","-a","-p",String(e),"-d","cwd","-Fn"],{allowFailure:!0,timeoutMs:1500});if(0===t.exitCode)return t.stdout.split("\n").find(e=>e.startsWith("n")&&e.length>1)?.slice(1)}let lc=["daemonBaseUrl","tenant","runId","leaseId","leaseProvider"],lf=["provider","providerSessionId","providerApp","providerOsVersion","providerProject","providerBuild","providerSessionName","awsProjectArn","awsDeviceArn","awsAppArn","awsRegion","awsInteractionMode"];function lm(e){return"string"==typeof e&&e.trim().length>0?e.trim():void 0}async function lh(e,t){"android"===t?s6(e,await lg()):("ios"===t||"macos"===t||"apple"===t)&&s6(e,await lw())}async function lg(){var e,t,r;let a=process.env.ANDROID_HOME||process.env.ANDROID_SDK_ROOT,n=await lv(a),i=await ly("adb",["version"]);return i?{id:"toolchain",status:(t=e={license:n,sdkRoot:a,versionLine:i}).versionLine&&t.sdkRoot&&"missing"!==t.license?"pass":"info",summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${e.sdkRoot?"ANDROID_HOME/ANDROID_SDK_ROOT set":"ANDROID_HOME unset"}.`:"Android toolchain: adb is present but version check failed.",hint:"missing"===e.license?"Accept Android SDK licenses before installing/building apps.":void 0,command:"missing"===e.license?"sdkmanager --licenses":void 0,evidence:{adbVersion:e.versionLine??null,androidHome:e.sdkRoot??null,license:e.license}}:(r=a,{id:"toolchain",status:"info",summary:"Android toolchain: adb not found on PATH.",hint:"Install Android platform-tools or add adb to PATH.",evidence:{androidHome:r??null,license:n}})}async function lw(){var e,t;let r=await ly("xcodebuild",["-version"]);return r?{id:"toolchain",status:(e={selectedPath:await ly("xcode-select",["-p"]),versionLine:r}).versionLine?"pass":"info",summary:(t=e).versionLine?t.selectedPath?`Apple toolchain: ${t.versionLine}; xcode-select ${t.selectedPath}.`:`Apple toolchain: ${t.versionLine}; xcode-select path unavailable.`:"Apple toolchain: xcodebuild version check failed.",evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}:{id:"toolchain",status:"info",summary:"Apple toolchain: xcodebuild version check failed.",hint:"Install/select Xcode and complete first launch/license setup if xcodebuild reports it.",command:"xcodebuild -version"}}async function lv(e){if(!e)return"unknown";try{return await i(r.join(e,"licenses","android-sdk-license")),"accepted"}catch{return"missing"}}async function ly(e,t){try{let r=await t0(e,t,{allowFailure:!0,timeoutMs:3e3});if(0!==r.exitCode)return;return r.stdout.split("\n").map(e=>e.trim()).find(Boolean)}catch{return}}async function lA(e){var t,a,n,i;let o,s,l,{req:u,sessionName:d,sessionStore:p,androidAdbExecutor:c}=e;if(u.command!==rY.doctor)return null;let f=p.get(d),m=(s=rW(u.meta?.cwd),l=lm(u.flags?.targetApp)??f?.appBundleId,{targetApp:l,metroHost:lm(u.runtime?.metroHost)??"127.0.0.1",metroPort:("number"==typeof(t=u.runtime?.metroPort)&&Number.isInteger(t)&&t>0?t:void 0)??8081,kind:s,remote:u.flags?.remote===!0,shouldProbeMetro:(a=u,"auto"!==s||"number"==typeof a.runtime?.metroPort||"string"==typeof a.runtime?.metroHost)}),h=(n=p,i=d,o=r.dirname(n.resolveSessionDir(i)),"sessions"===r.basename(o)?r.dirname(o):o),g=[];if(!function(e,...t){for(let r of t)s6(e,r)}(g,{id:"agent-device",status:"pass",summary:`agent-device ${rX()} using ${h}`,evidence:{version:rX(),stateDir:h}},...function(e,t={}){var r;let a,n=(r=e,Object.keys(a={...Object.fromEntries([...lc,...lf].flatMap(e=>"string"==typeof r.flags?.[e]?[[e,"<configured>"]]:[])),...r.flags?.sessionIsolation==="tenant"?{sessionIsolation:"tenant"}:{}}).length>0?a:void 0);return n?[{id:"remote-connection",status:t.required?"pass":"info",summary:"Remote daemon/session or provider scope is configured.",evidence:n}]:t.required?[{id:"remote-connection",status:"fail",summary:"No remote daemon/session or provider scope is configured.",hint:"Use connect, --remote-config <path>, or direct remote/provider flags for the command."}]:[]}(u,{required:m.remote}),...function(e,t,r,a={}){let n=r?e.toArray().filter(e=>e.name!==r.name&&e.device.platform===r.device.platform&&e.device.id===r.device.id).map(e=>e.name):[];return r?[{id:"session",status:n.length>0?"warn":"pass",summary:n.length>0?`Other active sessions target the same device: ${n.join(", ")}`:`Active session ${r.name} targets ${r.device.name}`,hint:n.length>0?"Close stale sessions before a QA run if they belong to old attempts.":void 0,command:n.length>0?`agent-device close --session ${n[0]} --platform ${te(r.device)}`:void 0,evidence:{session:r.name,sameDeviceSessions:n,sessionStateDir:e.resolveSessionDir(r.name)}}]:[{id:"session",status:"info",summary:a.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:"This is expected before a run. Use open when app foreground state matters."}]}(p,d,f,{remote:m.remote})),m.remote)return lI(g,m);let w=await la(g,u,f);await lh(g,f?.device.platform??w?.platform);let v=await lb({androidAdbExecutor:c,checks:g,inventory:w,options:m,session:f});return lI(g,m,{device:v,includeMetro:!0,inventory:w})}async function lb(e){let{checks:t,inventory:r,options:a,session:n,androidAdbExecutor:i}=e,o=n?.device??function(e,t,r){if(!r||!t)return;let a=t.devices.filter(e=>!0===e.booted);if(1===a.length)return a[0];s6(e,{id:"target-app-device",status:"fail",summary:0===a.length?"Target app check needs one booted device; none matched.":`Target app check needs one booted device; ${a.length} matched.`,hint:0===a.length?"Boot a device, or adjust --platform/--target/--device/--udid/--serial.":"Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.",command:t.platform?`agent-device devices --platform ${t.platform}`:"agent-device devices",evidence:{targetApp:r,booted:a.map(e=>({platform:te(e),id:e.id,name:e.name}))}})}(t,r,a.targetApp);return o&&await lS(t,{androidAdbExecutor:i,device:o,options:a,session:n}),a.shouldProbeMetro&&s6(t,await ls(a.metroHost,a.metroPort,a.kind)),o}async function lS(e,t){let{androidAdbExecutor:r,device:a,options:n,session:i}=t;await le(e,{device:a,session:i,targetApp:n.targetApp}),await s7(e,{androidAdbExecutor:r,device:a,metroPort:n.metroPort,shouldProbeMetro:n.shouldProbeMetro})}function lI(e,t,r={}){let a,n=e.some(e=>"fail"===e.status)?"fail":e.some(e=>"warn"===e.status)?"warn":"pass";return{ok:!0,data:{status:n,summary:"fail"===n?"Blockers found before the run.":"warn"===n?"No hard blockers found, but warnings need attention.":"No blockers found.",kind:t.kind,platform:r.device?te(r.device):r.inventory?.platform,target:r.device?.target??r.inventory?.target,targetApp:t.targetApp,metro:r.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:(a={fail:0,warn:1,pass:2,info:3},[...e].sort((e,t)=>a[e.status]-a[t.status]))}}}async function l_(e){var t,r,a,n,i,o,s,l,u;let d,p,{req:c,sessionName:f,logPath:m,sessionStore:h}=e,g=c.positionals?.[0]??"";if("ios-runner"!==g)return U("INVALID_ARGS","prepare requires a subcommand: ios-runner");let w=h.get(f),v=c.flags??{},y=ae(rY.prepare,w,v);if(y)return y;let A=await ar({session:w,flags:v,ensureReady:!0});if(!tn(A.platform))return U("UNSUPPORTED_OPERATION","prepare ios-runner is only supported on Apple runner platforms");let b=Date.now(),S=await ec(A,(t=c,r=w,a=m,n=b,p=(i=t,"number"==typeof(d=i.flags?.timeoutMs)&&Number.isFinite(d)&&d>0?d:24e4),{...tl({req:t,logPath:a,traceLogPath:r?.trace?.outPath}),cleanStaleBundles:!0,buildTimeoutMs:p,healthTimeoutMs:p,prepareDeadline:tz.fromTimeoutMs(p,n),startupTimeoutMs:p}));return{ok:!0,data:(o=g,s=A,l=Math.max(0,Date.now()-b),u=S,{action:o,platform:te(s),deviceId:s.id,deviceName:s.name,kind:s.kind,durationMs:l,...u,message:`Prepared Apple runner: ${s.name}`})}}async function lk(e){let{req:t,sessionName:r,logPath:a,sessionStore:n,command:i,positionals:o,recordPositionals:s,deriveNextSession:l}=e,u=n.get(r),d=t.flags??{},p=ae(i,u,d);if(p)return p;let c=await ar({session:u,flags:d,ensureReady:!0}),m=Q(i,c);if(m)return m;let h=await f(c,i,o,t.flags?.out,{...e_(a,t.flags,u?.appBundleId,u?.trace?.outPath)});if(u){let e=l?await l(u,h,c):u;tF(n,e,t,i,h??{},{positionals:s??o}),e!==u&&n.set(r,e)}return{ok:!0,data:h??{}}}async function lN(e){let{req:t,sessionName:r,logPath:a,sessionStore:n}=e,i=n.get(r),o=t.flags??{},s=ae(rY.clipboard,i,o);if(s)return s;let l=(t.positionals?.[0]??"").toLowerCase();if("read"!==l&&"write"!==l)return U("INVALID_ARGS","clipboard requires a subcommand: read or write");let u=await ar({session:i,flags:o,ensureReady:!0}),d=Q(rY.clipboard,u);if(d)return d;let p=await f(u,rY.clipboard,t.positionals??[],t.flags?.out,{...e_(a,t.flags,i?.appBundleId,i?.trace?.outPath)});return tF(n,i,t,t.command,p??{}),{ok:!0,data:{platform:te(u),...p??{}}}}async function lD(e){let{req:t,sessionName:r,logPath:a,sessionStore:n,leaseRegistry:i=new eE,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:l,androidAdbExecutor:u}=e;if(t.command===rY.doctor)return await lA({req:t,sessionName:r,sessionStore:n,androidAdbExecutor:u});if("inventory"===S(t.command))return await ns({req:t,sessionName:r,sessionStore:n});if("runtime"===t.command)return await aO({req:t,sessionName:r,sessionStore:n});if("state"===S(t.command))return await nc({req:t,sessionName:r,logPath:a,sessionStore:n});if(t.command===rY.clipboard)return await lN({req:t,sessionName:r,logPath:a,sessionStore:n});if(t.command===rY.keyboard){let e=n.get(r),i=t.positionals?.[0]?.trim().toLowerCase();return e||"dismiss"!==i&&"enter"!==i&&"return"!==i||"ios"!==(t.flags??{}).platform?await lk({req:t,sessionName:r,logPath:a,sessionStore:n,command:rY.keyboard,positionals:t.positionals??[]}):U("SESSION_NOT_FOUND","iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.")}if("observability"===S(t.command))return await ir({req:t,sessionName:r,sessionStore:n,androidAdbExecutor:u});if(t.command===rY.prepare)return await l_({req:t,sessionName:r,logPath:a,sessionStore:n});if(t.command===rY.install||t.command===rY.reinstall)return await ni({req:t,command:t.command,sessionName:r,sessionStore:n,deployOps:t.command===rY.install?nn:na});if(t.command===rJ.installSource)return await r3({req:t,sessionName:r,sessionStore:n});if(t.command===rJ.releaseMaterializedPaths)return await r7({req:t});if(t.command===rY.push){let e,i=t.positionals?.[0]?.trim(),o=t.positionals?.[1]?.trim();return i&&o?await lk({req:t,sessionName:r,logPath:a,sessionStore:n,command:rY.push,positionals:[i,"file"===(e=e$(o,{subject:"Push payload",cwd:t.meta?.cwd,expandPath:(e,t)=>eN.expandHome(e,t)})).kind?e.path:e.text],recordPositionals:[i,o]}):U("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>")}return t.command===rY.triggerAppEvent?await lk({req:t,sessionName:r,logPath:a,sessionStore:n,command:rY.triggerAppEvent,positionals:t.positionals??[],deriveNextSession:async(e,t)=>{let r="string"==typeof t?.eventUrl?t.eventUrl:void 0,a=r?await aW(e.device,r,e.appBundleId,aj)??e.appBundleId:e.appBundleId;return{...e,appBundleId:a}}}):t.command===rY.open?await a4({req:t,sessionName:r,logPath:a,sessionStore:n}):"replay"===S(t.command)?await s8({req:t,sessionName:r,logPath:a,sessionStore:n,leaseRegistry:i,invoke:l??s}):t.command===rY.batch?await no(t,r,s):t.command===rY.close?await nt({req:t,sessionName:r,logPath:a,sessionStore:n,leaseRegistry:i,leaseLifecycleProvider:o}):null}export{rQ as session_namespaceObject};
24
+ `],{stdin:JSON.stringify({method:e,url:n,headers:r?.headers??{},body:r?.body??``}),timeoutMs:Ul,allowFailure:!0});if(i.exitCode!==0)throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} failed for ${n}: ${eu(i.stderr)}`,{exitCode:i.exitCode,stderr:i.stderr});try{return JSON.parse(i.stdout)}catch(r){throw new t(`COMMAND_FAILED`,`Maestro runScript http.${e.toLowerCase()} returned invalid JSON for ${n}`,{stdout:i.stdout.slice(0,1e3),stderr:i.stderr.slice(0,1e3)},r instanceof Error?r:void 0)}}function Ql(e,n){for(let r of Object.keys(e))if(r.includes(`.`))throw new t(`INVALID_ARGS`,`Maestro runScript output key cannot contain ".": ${r}`,{scriptPath:n,key:r})}function $l(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function eu(e){let t=e.trim();return t.length>0?t.slice(0,1e3):`request process exited without stderr`}const tu={launchApp:({value:e,config:t,context:n})=>[Vc(e,t,n)],tapOn:({value:e,context:t})=>[qc(e,t)],doubleTapOn:({value:e,context:t})=>[Jc(e,t)],longPressOn:({value:e,context:t})=>[Yc(e,t)],inputText:({value:e,context:t})=>[P(`type`,[I(Xc(e),t)])],eraseText:({value:e})=>[Zc(e)],pasteText:({value:e,context:t,name:n})=>[P(`type`,[I(mr(n,e),t)])],openLink:({value:e,config:t,context:n,name:r})=>[ou(e,t,n,r)],assertVisible:({value:e,context:t,name:n})=>[P(U.assertVisible,[W(e,n,[],t),`17000`])],assertNotVisible:({value:e,context:t,name:n})=>[P(U.assertNotVisible,[W(e,n,[],t)])],extendedWaitUntil:({value:e,context:t})=>Qc(e,t),takeScreenshot:({value:e,context:t,name:n})=>[P(`screenshot`,[I(mr(n,e),t)])],scroll:({value:e})=>[$c(e)],scrollUntilVisible:({value:e,context:t})=>el(e,t),swipe:({value:e,context:t})=>[tl(e,t)],hideKeyboard:()=>[P(`keyboard`,[`dismiss`])],pressKey:({value:e})=>[ll(e)],back:()=>[P(`back`)],waitForAnimationToEnd:({value:e})=>[P(U.waitForAnimationToEnd,[String(xr(e,15e3))])],stopApp:({value:e,config:t,context:n})=>[Hc(e,t,n)],runScript:({value:e,context:t})=>[Wl(e,t)],runFlow:({value:e,config:t,context:n,deps:r})=>yl(e,t,n,r,cu),repeat:({value:e,config:t,context:n,deps:r})=>bl(e,t,n,r,cu),retry:({value:e,config:t,context:n,deps:r})=>xl(e,t,n,r,cu)},nu={launchApp:(e,t)=>[Vc(void 0,e,t)],scroll:()=>[P(`scroll`,[`down`])],hideKeyboard:()=>[P(`keyboard`,[`dismiss`])],eraseText:()=>[Zc(void 0)],back:()=>[P(`back`)],waitForAnimationToEnd:()=>[P(U.waitForAnimationToEnd,[`15000`])],stopApp:(e,t)=>[Hc(void 0,e,t)]};function ru(e,n,r,i,a){try{return iu(e,n,i,a)}catch(e){throw e instanceof t&&!/\bline \d+\b/.test(e.message)?new t(e.code,`${e.message} (line ${r})`,e.details):e}}function iu(e,n,r,i){if(typeof e==`string`)return au(e,n,r);let a=Object.entries(e);if(a.length!==1)throw new t(`INVALID_ARGS`,`Maestro command maps must contain exactly one command.`);let[o,s]=a[0],c=tu[o];return c?c({value:s,config:n,context:r,deps:i,name:o}):_r(o)}function au(e,t,n){let r=nu[e];return r?r(t,n):_r(e)}function ou(e,t,n,r){let i=I(su(e,r),n);return(n.platform===`ios`||n.platform===`android`)&&t.appId?P(`open`,[I(pr(t,r),n),i],n.platform===`ios`?{maestro:{prewarmRunnerBeforeOpen:!0}}:void 0):P(`open`,[i])}function su(e,t){return typeof e==`string`?e:F(e)?(M(e,t,[`link`]),mr(`${t}.link`,e.link)):mr(t,e)}function cu(e,t,n,r){return e.flatMap((e,i)=>ru(e,t,i+1,n,r))}function lu(e,t={}){return du(e,bu(t))}function uu(e){let{config:t}=Su(hr(e));return t.name}function du(e,t){let{config:n,commands:r}=Su(hr(e)),i={...t,env:{...t.env,...n.env??{},...t.envOverrides}},{actions:a,actionLines:o}=fu({config:n,commands:r,commandLines:xu(e),context:i});return{actions:a,actionLines:o,metadata:{env:n.env}}}function fu(e){let{config:t,commands:n,commandLines:r,context:i}=e,a=[...t.onFlowStart??[],...n,...t.onFlowComplete??[]],o=[...Array.from({length:t.onFlowStart?.length??0},()=>1),...r,...Array.from({length:t.onFlowComplete?.length??0},()=>r.at(-1)??1)],s=[],c=[];for(let[e,n]of a.entries()){let r=o[e]??e+1,a=ru(n,t,r,i,{parseRunFlowFile:wu});s.push(...a),a.forEach(()=>c.push(r))}return pu(s,c)}function pu(e,t){let n=[],r=[];for(let i=0;i<e.length;i+=1){let a=e[i],o=mu(e,t,i);if(o){n.push(...o.actions),r.push(...o.actionLines),i+=o.consumed-1;continue}n.push(a),r.push(t[i]??1)}return{actions:n,actionLines:r}}function mu(e,t,n){let r=hu(e,t,n);if(!r)return null;let{action:i,nextAction:a,pressEnterAction:o,tapSelector:s,typedAfterTap:c,line:l}=r;return yu(s)?{actions:[{...i,command:`wait`,positionals:[s,`30000`]},{...a,command:`fill`,positionals:[s,c],flags:i.flags},o],actionLines:[l,l,t[n+2]??l],consumed:3}:{actions:[gu(i)],actionLines:[l],consumed:1}}function hu(e,t,n){let r=e[n],i=e[n+1],a=e[n+2];if(a?.command!==U.pressEnter||r.flags?.maestro?.optional===!0)return null;let o=vu(i),s=_u(r);return!i||o===null||s===null?null:{action:r,nextAction:i,pressEnterAction:a,tapSelector:s,typedAfterTap:o,line:t[n]??1}}function gu(e){let t={...e.flags?.maestro??{}};return delete t.allowNonHittableCoordinateFallback,{...e,flags:{...e.flags??{},maestro:{...t}}}}function _u(e){if(e?.command!==U.tapOn)return null;let[t,...n]=e.positionals??[];return n.length>0||typeof t!=`string`?null:t}function vu(e){if(e?.command!==`type`||e.flags&&Object.keys(e.flags).length>0)return null;let[t,...n]=e.positionals??[];return n.length>0||typeof t!=`string`?null:t}function yu(e){return/\b(input|textfield|textarea|field|email|password|username|search|query)\b/i.test(e.replace(/([a-z])([A-Z])/g,`$1 $2`))}function bu(e){let t=e.visitedPaths??new Set;return e.sourcePath&&t.add(R.resolve(e.sourcePath)),{baseDir:e.sourcePath?R.dirname(e.sourcePath):void 0,platform:fr(e.platform),env:{},envOverrides:e.env??{},visitedPaths:t}}function xu(e){let t=e.split(/\r?\n/),n=t.findIndex(e=>e.trim()===`---`),r=n===-1?0:n+1,i=[];for(let e=r;e<t.length;e+=1)/^-\s+/.test(t[e]??``)&&i.push(e+1);return i}function Su(e){if(e.length===0)throw new t(`INVALID_ARGS`,`Maestro flow is empty.`);if(Array.isArray(e[0]))return{config:{},commands:br(e[0])};let n=Cu(e[0]),r=e[1];if(!Array.isArray(r))throw new t(`INVALID_ARGS`,`Maestro flow must contain a command list after the YAML document separator.`);return{config:n,commands:br(r)}}function Cu(e){if(!F(e))throw new t(`INVALID_ARGS`,`Maestro flow config must be a YAML map.`);return{...typeof e.name==`string`&&e.name.length>0?{name:e.name}:{},...typeof e.appId==`string`&&e.appId.length>0?{appId:e.appId}:{},...F(e.env)?{env:gr(e.env,`env`)}:{},...Array.isArray(e.onFlowStart)?{onFlowStart:br(e.onFlowStart)}:{},...Array.isArray(e.onFlowComplete)?{onFlowComplete:br(e.onFlowComplete)}:{}}}function wu(e,n){let r=Tu(e,n);if(n.visitedPaths.has(r))throw new t(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${r}.`);let i=L.readFileSync(r,`utf8`),a=new Set(n.visitedPaths);return a.add(r),du(i,{...n,baseDir:R.dirname(r),visitedPaths:a})}function Tu(e,n){if(R.isAbsolute(e))return e;if(!n.baseDir)throw new t(`INVALID_ARGS`,`runFlow file paths require replay input to have a source path.`);return R.resolve(n.baseDir,e)}const Eu=/[*?[\]{}]/;function Du(e){let{inputs:n,cwd:r,platformFilter:i,replayBackend:a}=e,o=Lu(a),s=Nu(n,r??process.cwd(),o,a),c=[];for(let e of s){let t=L.readFileSync(e,`utf8`),n=Tr(t),r=Wu(t,e,a);if(!i){c.push({kind:`run`,path:e,title:r,metadata:n});continue}if(!n.platform){Uu(a)?c.push({kind:`run`,path:e,title:r,metadata:n}):c.push({kind:`skip`,path:e,reason:`skipped-by-filter`,message:`missing platform metadata for --platform ${i}`});continue}Ku(i,n.platform)&&c.push({kind:`run`,path:e,title:r,metadata:n})}if(c.filter(e=>e.kind===`run`).length===0)throw new t(`INVALID_ARGS`,`No replay tests matched${i?` for --platform ${i}`:``}.`);return c}function Ou(e,t,n,r,i=0){let a=R.basename(n,R.extname(n)).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``);return`${e}:test:${t}:${r+1}${a?`-${a}`:``}:attempt-${i+1}`}function ku(e){return(e?.trim()||`${process.pid}-${Date.now().toString(36)}`).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)||`suite`}function Au(e){let{requestId:t,suiteInvocationId:n,filePath:r,caseIndex:i,attemptIndex:a,shardIndex:o}=e,s=o===void 0?``:`:shard:${o+1}`;return St(`${t??n}${s}:test:${i+1}:${R.basename(r)}:attempt:${a+1}`,n)}function ju(e,t){return typeof e==`number`?e:t}function Mu(e,t){let n=typeof e==`number`?e:t;return typeof n==`number`?Math.max(0,Math.min(3,n)):0}function Nu(e,t,n,r){if(!Uu(r))return[...new Set(e.flatMap(e=>Iu(e,t,n).paths))].map(e=>R.normalize(e)).sort((e,t)=>e.localeCompare(t));let i=[],a=[];for(let r of e){let e=Pu(r,t,n);e.source===`file`?i.push(...e.paths):a.push(e.source===`directory`?Hu(e.paths):zu(e.paths))}return Hu([...i,...a.flat()])}function Pu(e,t,n){let r=A.expandHome(e,t);return L.existsSync(r)&&L.statSync(r).isDirectory()?{paths:Fu(r,n),source:`directory`}:Iu(e,t,n)}function Fu(e,t){let n=[],r=L.opendirSync(e);try{let i;for(;(i=r.readSync())!==null;){let r=R.join(e,i.name);i.isDirectory()?n.push(...Fu(r,t)):i.isFile()&&t.has(R.extname(i.name))&&n.push(r)}}finally{r.closeSync()}return n}function Iu(e,n,r){let i=A.expandHome(e,n);if(L.existsSync(i)){let n=L.statSync(i);if(n.isDirectory())return{paths:Ru(r).flatMap(e=>L.globSync(e,{cwd:i}).map(e=>R.join(i,e))),source:`directory`};if(n.isFile()){if(!r.has(R.extname(i)))throw new t(`INVALID_ARGS`,`test does not support this file type: ${e}`);return{paths:[i],source:`file`}}return{paths:[],source:`file`}}if(!Gu(e)&&!Gu(i))throw new t(`INVALID_ARGS`,`test input not found: ${e}`);let a=R.isAbsolute(i)?i:e;return{paths:L.globSync(a,{cwd:R.isAbsolute(i)?void 0:n}).map(e=>R.isAbsolute(e)?e:R.resolve(n,e)).filter(e=>r.has(R.extname(e))&&qu(e)),source:`glob`}}function Lu(e){return Uu(e)?new Set([`.yaml`,`.yml`,`.ad`]):new Set([`.ad`])}function Ru(e){return[...e].map(e=>`**/*${e}`)}function zu(e){return e.map(e=>R.normalize(e)).sort(Bu)}function Bu(e,t){let n=Vu(e),r=Vu(t);return n===r?e.localeCompare(t):n-r}function Vu(e){return+(R.extname(e)===`.ad`)}function Hu(e){return[...new Set(e.map(e=>R.normalize(e)))]}function Uu(e){return e===`maestro`}function Wu(e,t,n){return Uu(n)&&R.extname(t)!==`.ad`?uu(e):void 0}function Gu(e){return Eu.test(e)}function Ku(e,t){return e===`apple`?a(t):t===e}function qu(e){try{return L.statSync(e).isFile()}catch{return!1}}const Ju=[`failed to start daemon`,`runner did not accept connection`,`xcodebuild exited early`,`device is offline`,`device offline`,`device unauthorized`];function Yu(e){let t=Xu(e);return t?Zu(t.details)||Qu(t.code,t.message):!1}function Xu(e){return`ok`in e?e.ok?null:e.error:e.status===`failed`?e.error:null}function Zu(e){let t=typeof e?.reason==`string`?e.reason:``;return t===`timeout_cleanup_pending`?!0:t?et(t):!1}function Qu(e,t){let n=`${e}\n${t}`.toLowerCase();return Ju.some(e=>n.includes(e))}const $u=2e3;async function ed(t){let{filePath:n,sessionName:r,requestId:i,parentRequestId:a,timeoutMs:o,platform:s,target:c,artifactsDir:l,shard:u,progress:d,runReplay:f,cleanupSession:p,finalizeAttempt:m}=t;ct(i);let g=td(i,a),_=new Set,v,y=!1,b,x=Date.now(),S=sd({artifactsDir:l,artifactPaths:_,filePath:n,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),C=ft(d,async()=>await f({filePath:n,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:_,tracePath:S,shard:u})).catch(t=>({ok:!1,error:e(t)})).finally(()=>{g(),xt(i)});try{b=typeof o==`number`?await Promise.race([C,new Promise(e=>{v=setTimeout(()=>{y=!0,lt(i),e(cd(o,[..._]))},o)})]):await C,K(S,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:b.ok,timedOut:y,durationMs:Date.now()-x,errorCode:b.ok?void 0:b.error.code})}finally{v&&clearTimeout(v),y&&(await nd(C)||(ad(b),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:$u}}),rd({replayPromise:C,cleanupSession:p,sessionName:r,requestId:i})));let t=await id({finalizeAttempt:m,sessionName:r,artifactPaths:_,artifactsDir:l,tracePath:S});b?.ok&&t&&!t.ok&&od(b,`Replay test finalization failed: ${t.error.message}`);let n=Date.now();try{K(S,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),K(S,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-n})}catch(t){let i=e(t);K(S,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-n,errorCode:i.code}),h({level:`warn`,phase:`test_cleanup_failed`,data:{session:r,error:i.message}})}}return b??{ok:!1,error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}}}function td(e,t){if(!t||t===e)return()=>{};let n=ut(t);if(!n)return()=>{};let r=()=>{lt(e)};return n.aborted?(r(),()=>{}):(n.addEventListener(`abort`,r,{once:!0}),()=>{n.removeEventListener(`abort`,r)})}async function nd(e){return await Promise.race([e.then(()=>!0),Rr($u).then(()=>!1)])}async function rd(t){let{replayPromise:n,cleanupSession:r,sessionName:i,requestId:a}=t;try{await n}finally{try{await r(i)}catch(t){h({level:`warn`,phase:`test_late_cleanup_failed`,data:{session:i,requestId:a,error:e(t).message}})}}}async function id(t){let{finalizeAttempt:n,sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o}=t;if(!n)return;let s=Date.now();K(o,{type:`replay_test_finalize_start`,ts:new Date().toISOString(),session:r});try{let e=await n({sessionName:r,artifactPaths:i,artifactsDir:a,tracePath:o});return K(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:e?.ok??!0,durationMs:Date.now()-s,errorCode:e?.ok===!1?e.error.code:void 0}),e}catch(t){let n=e(t);return K(o,{type:`replay_test_finalize_stop`,ts:new Date().toISOString(),session:r,ok:!1,durationMs:Date.now()-s,errorCode:n.code}),h({level:`warn`,phase:`test_finalize_failed`,data:{session:r,error:n.message}}),{ok:!1,error:n}}}function ad(e){!e||e.ok||(e.error.details={...e.error.details??{},reason:`timeout_cleanup_pending`,timeoutCleanupPending:!0})}function od(e,t){let n=e.data??={};n.warnings=[...Array.isArray(n.warnings)?n.warnings.filter(e=>typeof e==`string`):[],t]}function sd(e){let{artifactsDir:t,artifactPaths:n,filePath:r,sessionName:i,requestId:a,timeoutMs:o,platform:s,target:c}=e;if(!t)return;let l=R.join(t,`replay-timing.ndjson`);return L.mkdirSync(R.dirname(l),{recursive:!0}),L.writeFileSync(l,``),n.add(l),K(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function K(e,t){e&&L.appendFileSync(e,`${JSON.stringify(t)}\n`)}function cd(e,t=[]){return{ok:!1,error:{code:`COMMAND_FAILED`,message:`TIMEOUT after ${e}ms`,hint:`Replay test timeouts are cooperative; the active command may take a short grace period to stop.`,details:{reason:`timeout`,timeoutMs:e,timeoutMode:`cooperative`,artifactPaths:t}}}}async function ld(e){let t=ud(e);return _d(e,t,await dd(e,t))}function ud(e){let{entry:t,cwd:n,retries:r,suiteArtifactsDir:i,shard:a}=e;return{testStartedAt:Date.now(),testArtifactsDir:R.join(i,...a?[`shard-${a.shardIndex+1}`]:[],Mc(t.path,n)),maxAttempts:r+1}}async function dd(e,t){pd(e,t);let n={finalSessionName:``,attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let r=0;r<=e.retries&&!Ct(e.requestId);r+=1){let i=await fd(e,t,r);if(md(n,i),hd(e,i.response,r))break;gd(e,t,i)}return n}async function fd(e,t,n){let{entry:r,sessionName:i,suiteInvocationId:a,caseIndex:o,suiteIndex:s,suiteTotal:c,requestId:l,timeoutMs:u,shard:d}=e,f=n+1,p=Date.now(),m=Ou(i,a,r.path,o,n),h=R.join(t.testArtifactsDir,`attempt-${f}`);Nc(r.path,h);let g=Au({requestId:l,suiteInvocationId:a,filePath:r.path,caseIndex:o,attemptIndex:n,shardIndex:d?.shardIndex}),_=await ed({filePath:r.path,sessionName:m,requestId:g,parentRequestId:l,timeoutMs:u,platform:r.metadata.platform,target:r.metadata.target,artifactsDir:h,shard:d,progress:{file:r.path,title:r.title,index:s,total:c,attempt:f,maxAttempts:t.maxAttempts,session:m,artifactsDir:t.testArtifactsDir,...Ed(d)},runReplay:e.runReplay,cleanupSession:e.cleanupSession,finalizeAttempt:e.finalizeAttempt}),v=Date.now()-p;return Pc({response:_,filePath:r.path,sessionName:m,attempts:f,maxAttempts:t.maxAttempts,attemptArtifactsDir:h}),{response:_,sessionName:m,attempt:f,durationMs:v}}function pd(e,t){let{entry:n,sessionName:r,suiteInvocationId:i,caseIndex:a,suiteIndex:o,suiteTotal:s,shard:c}=e;T({type:`replay-test`,file:n.path,title:n.title,status:`start`,index:o,total:s,maxAttempts:t.maxAttempts,session:Ou(r,i,n.path,a),artifactsDir:t.testArtifactsDir,...Ed(c)})}function md(e,t){e.finalResponse=t.response,e.finalSessionName=t.sessionName,e.attempts=t.attempt,e.finalAttemptDurationMs=t.durationMs,!t.response.ok&&e.attemptFailures.push({attempt:t.attempt,message:t.response.error.message,durationMs:t.durationMs})}function hd(e,t,n){return t.ok||Ct(e.requestId)||Yu(t)||n>=e.retries}function gd(e,t,n){n.response.ok||T({type:`replay-test`,file:e.entry.path,title:e.entry.title,status:`fail`,index:e.suiteIndex,total:e.suiteTotal,attempt:n.attempt,maxAttempts:t.maxAttempts,durationMs:n.durationMs,retrying:!0,message:n.response.error.message,hint:n.response.error.hint,session:n.sessionName,artifactsDir:t.testArtifactsDir,...Ed(e.shard)})}function _d(e,t,n){let r=Date.now()-t.testStartedAt;return n.finalResponse?.ok?vd(e,t,n,r):yd(e,t,n,r)}function vd(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=n.finalResponse;if(!c?.ok)throw Error(`Expected passing replay test response.`);return T({type:`replay-test`,file:i.path,title:i.title,status:`pass`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,...Ed(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`passed`,durationMs:r,finalAttemptDurationMs:n.finalAttemptDurationMs,attempts:n.attempts,artifactsDir:t.testArtifactsDir,...xd(c),...Sd(c.data?.warnings),...Cd(c.data?.snapshotDiagnostics),...Td(s),...n.attemptFailures.length>0?{attemptFailures:n.attemptFailures}:{}}}function yd(e,t,n,r){let{entry:i,suiteIndex:a,suiteTotal:o,shard:s}=e,c=bd(n.finalResponse);return T({type:`replay-test`,file:i.path,title:i.title,status:`fail`,index:a,total:o,attempt:n.attempts,maxAttempts:t.maxAttempts,durationMs:r,session:n.finalSessionName,artifactsDir:t.testArtifactsDir,message:c.message,hint:c.hint,...Ed(s)}),{file:i.path,title:i.title,session:n.finalSessionName,status:`failed`,durationMs:r,attempts:n.attempts,artifactsDir:t.testArtifactsDir,error:c,...Cd(wd(n.finalResponse)),...Td(s)}}function bd(e){return e&&!e.ok?e.error:{code:`COMMAND_FAILED`,message:`Unknown replay test failure`}}function xd(e){return{replayed:typeof e.data?.replayed==`number`?e.data.replayed:0,healed:typeof e.data?.healed==`number`?e.data.healed:0}}function Sd(e){if(!Array.isArray(e))return{};let t=e.filter(e=>typeof e==`string`);return t.length>0?{warnings:t}:{}}function Cd(e){let t=re(e);return t?{snapshotDiagnostics:t}:{}}function wd(e){return e?.ok?e.data?.snapshotDiagnostics:e?.error.details?.snapshotDiagnostics}function Td(e){return Ed(e)}function Ed(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function Dd(e,t,n){let r=kd(e);if(!r||t.length===0)return;let i=await jd(e,r.count);return{mode:r.kind,shardCount:r.count,total:n+(r.kind===`all`?t.length*r.count:t.length),shards:i.map((e,n)=>({shardIndex:n,shardCount:r.count,device:e,entries:r.kind===`all`?t:t.filter((e,t)=>t%r.count===n)}))}}function Od(e,t){if(!t)return e;let n={...e??{},device:void 0,udid:void 0,serial:void 0,platform:t.device.platform,target:t.device.target,shardAll:void 0,shardSplit:void 0,shardCount:t.shardCount,shardIndex:t.shardIndex};return t.device.platform===`android`?{...n,serial:t.device.id}:{...n,udid:t.device.id}}function kd(e){let n=Ad(e?.shardAll,`--shard-all`),r=Ad(e?.shardSplit,`--shard-split`);if(n!==void 0&&r!==void 0)throw new t(`INVALID_ARGS`,`--shard-all and --shard-split are mutually exclusive`);if(n!==void 0)return{kind:`all`,count:n};if(r!==void 0)return{kind:`split`,count:r}}function Ad(e,n){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw new t(`INVALID_ARGS`,`${n} requires a positive integer`);return e}}async function jd(e,n){let r=Fd(e),i=Nd(await tn(Md(e)),r,e);if(i.length<n)throw new t(`DEVICE_NOT_FOUND`,`test sharding requires ${Pd(n)}, but only ${i.length} matched`);return i.slice(0,n)}function Md(e){let t=rt(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:r({simulatorSetPath:nt(e?.iosSimulatorDeviceSet),platform:e?.platform,target:e?.target}),androidSerialAllowlist:t?Array.from(t).sort():void 0}}function Nd(e,t,n){return t.length>0?Id(e,t,n):e.filter(e=>Ld(e,n)).sort(Bd)}function Pd(e){return`${e} device${e===1?``:`s`}`}function Fd(e){let t=e?.device;return typeof t!=`string`||t.trim().length===0?[]:t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Id(e,n,r){return n.map(n=>{let i=zd(n),a=e.find(e=>Rd(e,r)&&(e.id===n||zd(e.name)===i));if(!a)throw new t(`DEVICE_NOT_FOUND`,`No shard device matched ${n}`);return a})}function Ld(e,t){return!Rd(e,t)||!o(e)?!1:e.booted!==!1}function Rd(e,t){return!(!d(e,t?.platform)||t?.target&&(e.target??`mobile`)!==t.target)}function zd(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}function Bd(e,t){return e.id.localeCompare(t.id)}async function Vd(e){let{req:t,sessionName:r,runReplay:i,cleanupSession:a,finalizeAttempt:o}=e;if((t.positionals?.length??0)===0)return k(`INVALID_ARGS`,`test requires at least one path or glob`);try{let e=Date.now(),n=await Hd(t);Kd(n);let s=n.shardPlan?qd({entries:n.entries,total:n.total}):[];return n.shardPlan?s.push(...await Jd({shards:n.shardPlan.shards,sessionName:r,suiteInvocationId:n.suiteInvocationId,cwd:t.meta?.cwd,requestId:t.meta?.requestId,flags:t.flags,suiteArtifactsDir:n.suiteArtifactsDir,suiteTotal:n.total,runReplay:i,cleanupSession:a,finalizeAttempt:o})):s.push(...await Qd({discoveryEntries:n.entries,sessionName:r,suiteInvocationId:n.suiteInvocationId,cwd:t.meta?.cwd,requestId:t.meta?.requestId,flags:t.flags,suiteArtifactsDir:n.suiteArtifactsDir,suiteTotal:n.total,runReplay:i,cleanupSession:a,finalizeAttempt:o})),{ok:!0,data:tf(n.total,s,Date.now()-e)}}catch(e){let t=n(e);return k(t.code,t.message)}}async function Hd(e){let t=Ud(e),n=Wd(t),r=t.length-n.length,i=ku(e.meta?.requestId),a=await Dd(e.flags,n,r);return{entries:t,runnable:n,shardPlan:a,suiteInvocationId:i,suiteArtifactsDir:Gd(e,i),total:a?.total??t.length}}function Ud(e){return Du({inputs:e.positionals??[],cwd:e.meta?.cwd,platformFilter:e.flags?.platform,replayBackend:e.flags?.replayBackend})}function Wd(e){return e.flatMap((e,t)=>e.kind===`run`?[{entry:e,suiteIndex:t+1}]:[])}function Gd(e,t){return jc({artifactsDir:typeof e.flags?.artifactsDir==`string`?e.flags.artifactsDir:void 0,cwd:e.meta?.cwd,suiteInvocationId:t})}function Kd(e){T({type:`replay-test-suite`,status:`start`,total:e.total,runnable:e.runnable.length,skipped:e.entries.length-e.runnable.length,artifactsDir:e.suiteArtifactsDir,shardMode:e.shardPlan?.mode,shardCount:e.shardPlan?.shardCount})}function qd(e){let{entries:t,total:n}=e,r=[];for(let[e,i]of t.entries())i.kind===`skip`&&(T({type:`replay-test`,file:i.path,status:`skip`,index:e+1,total:n,message:i.message}),r.push({file:i.path,status:`skipped`,durationMs:0,reason:i.reason,message:i.message}));return r}async function Jd(e){return(await Promise.allSettled(e.shards.map(async t=>await Xd({...e,shard:t})))).flatMap((t,n)=>{if(t.status===`fulfilled`)return t.value;let r=e.shards[n];return r?[Yd(r,e.sessionName,t.reason)]:[]})}function Yd(t,n,r){let i=e(r);return{file:t.entries[0]?.entry.path??`shard-${t.shardIndex+1}`,session:Zd(n,t),status:`failed`,durationMs:0,attempts:1,error:{code:i.code,message:i.message,hint:i.hint,diagnosticId:i.diagnosticId,logPath:i.logPath,details:i.details},shardIndex:t.shardIndex,shardCount:t.shardCount,deviceId:t.device.id,deviceName:t.device.name}}async function Xd(e){let{shard:t,sessionName:n}=e;return await $d({...e,entries:t.entries,sessionName:Zd(n,t),shard:t})}function Zd(e,t){return`${e}:shard-${t.shardIndex+1}`}async function Qd(e){let{discoveryEntries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,flags:o,suiteArtifactsDir:s,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d}=e,f=[],p=0;for(let[e,m]of t.entries()){if(Ct(a))break;if(m.kind===`skip`){T({type:`replay-test`,file:m.path,status:`skip`,index:e+1,total:c,message:m.message}),f.push({file:m.path,status:`skipped`,durationMs:0,reason:m.reason,message:m.message});continue}p+=1;let t=await ld({entry:m,sessionName:n,suiteInvocationId:r,caseIndex:p-1,cwd:i,requestId:a,retries:Mu(o?.retries,m.metadata.retries),timeoutMs:ju(o?.timeoutMs,m.metadata.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:c,runReplay:l,cleanupSession:u,finalizeAttempt:d});if(f.push(t),ef(t,o,a))break}return f}async function $d(e){let{entries:t,sessionName:n,suiteInvocationId:r,cwd:i,requestId:a,flags:o,suiteArtifactsDir:s,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f}=e,p=[];for(let[e,m]of t.entries()){if(Ct(a))break;let{entry:t,suiteIndex:h}=m,g=await ld({entry:t,sessionName:n,suiteInvocationId:r,caseIndex:e,cwd:i,requestId:a,retries:Mu(o?.retries,t.metadata.retries),timeoutMs:ju(o?.timeoutMs,t.metadata.timeoutMs),suiteArtifactsDir:s,suiteIndex:h,suiteTotal:c,shard:l,runReplay:u,cleanupSession:d,finalizeAttempt:f});if(p.push(g),ef(g,o,a))break}return p}function ef(e,t,n){return Ct(n)||t?.failFast===!0||Yu(e)}function tf(e,t,n){let r=t.filter(e=>e.status===`passed`).length,i=t.filter(e=>e.status===`failed`),a=i.length,o=t.filter(e=>e.status===`skipped`).length,s=r+a,c=ie(t.map(e=>e.status===`skipped`?void 0:e.snapshotDiagnostics));return{total:e,executed:s,passed:r,failed:a,skipped:o,notRun:Math.max(0,e-s-o),durationMs:n,failures:i,tests:t,...c?{snapshotDiagnostics:c}:{}}}const nf={maestro:{parse:lu}};function rf(e,t,n={}){let r=of(t);return r?{...r.parse(e,{...n,platform:t?.platform,env:af(t)}),updateUnsupportedMessage:`replay -u is not supported for compat flow input. Convert to .ad first, then update that replay file.`}:{...Sr(e),metadata:Tr(e)}}function af(e){return{...lr(cr(e?.replayShellEnv)),...Cr(ur(e?.replayEnv))}}function of(e){let n=e?.replayBackend;if(typeof n!=`string`)return;let r=nf[n];if(!r)throw new t(`INVALID_ARGS`,`Unsupported replay backend "${n}".`);return r}function sf(e){if(e.length===0)return{selectorExpression:null,selectorTimeout:null};let t=e[e.length-1],n=t!==void 0&&/^\d+$/.test(t)?t:null,r=x(n===null?e.slice():e.slice(0,-1));return!r||r.rest.length>0?{selectorExpression:null,selectorTimeout:null}:{selectorExpression:r.selectorExpression,selectorTimeout:n}}function cf(e){let t=[],n=Array.isArray(e.result?.selectorChain)&&e.result?.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];if(t.push(...n),ot(e.command)){let n=df(e),r=n[0]??``;r&&!r.startsWith(`@`)&&t.push(n.join(` `))}if(e.command===`fill`){let n=e.positionals?.[0]??``;n&&!n.startsWith(`@`)&&Number.isNaN(Number(n))&&t.push(n)}if(e.command===`get`){let n=e.positionals?.[1]??``;n&&!n.startsWith(`@`)&&t.push(e.positionals.slice(1).join(` `))}if(e.command===`is`){let{split:n}=Ie(e.positionals);n&&t.push(n.selectorExpression)}if(e.command===`wait`){let{selectorExpression:n}=sf(e.positionals??[]);n&&t.push(n)}return qt(t).filter(e=>e.trim().length>0)}function lf(e){return cf(e).map(e=>C(e)).filter(e=>e!==null)}async function uf(e){let{action:t,sessionName:n,logPath:r,sessionStore:i}=e;if(!(ot(t.command)||[`fill`,`get`,`is`,`wait`].includes(t.command)))return null;let a=i.get(n);if(!a)return null;let o=lf(t);if(o.length===0)return null;let s=ot(t.command)||t.command===`fill`,c=ot(t.command)||t.command===`fill`||t.command===`get`&&t.positionals?.[0]===`text`,l=await hf(a,t,r,s,i);for(let e of o){let n=Ue(l.nodes,e,{platform:a.device.platform,requireRect:s,requireUnique:!0,disambiguateAmbiguous:c});if(!n)continue;let r=Ge(n.node,a.device.platform,{action:t.command===`fill`?`fill`:ot(t.command)?`click`:`get`}).join(` || `);if(ot(t.command))return{...t,positionals:t.command===`longpress`?ff(t,r):[r]};if(t.command===`fill`){let e=nr(t);if(!e)continue;return{...t,positionals:[r,e]}}if(t.command===`get`){let e=t.positionals?.[0];if(e!==`text`&&e!==`attrs`)continue;return{...t,positionals:[e,r]}}if(t.command===`is`){let{predicate:e,split:n}=Ie(t.positionals);if(!e)continue;let i=n?.rest.join(` `).trim()??``,a=[e,r];return e===`text`&&i.length>0&&a.push(i),{...t,positionals:a}}if(t.command===`wait`){let{selectorTimeout:e}=sf(t.positionals??[]),n=[r];return e&&n.push(e),{...t,positionals:n}}}return null}function df(e){let t=e.positionals??[];if(e.command!==`longpress`)return t;let n=t.at(-1);return t.length>1&&mf(n)?t.slice(0,-1):t}function ff(e,t){let n=typeof e.result?.durationMs==`number`?String(e.result.durationMs):pf(e.positionals??[]);return n?[t,n]:[t]}function pf(e){let t=e.at(-1);return e.length>1&&mf(t)?t:void 0}function mf(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function hf(e,t,n,r,i){let a=Mt(await E(e.device,`snapshot`,[],t.flags?.out,{...D(n,{...t.flags??{},snapshotInteractiveOnly:r},e.appBundleId,e.trace?.outPath)}),{...t.flags??{},snapshotInteractiveOnly:r});return En(e,a),i.set(e.name,e),a}const gf={swipe:{screenRatio:.35,minDistancePx:120,maxDistancePx:360,marginPx:8}};function _f(e,t){let n=_e(e.rect),r=e.frame,i=yf(r?.referenceWidth,e.rect.width),a=yf(r?.referenceHeight,e.rect.height),o=gf.swipe.marginPx,s=o,c=o,l=r?r.referenceWidth-o:n.x+i,u=r?r.referenceHeight-o:n.y+a;switch(t.toLowerCase()){case`up`:return{ok:!0,start:n,end:{x:n.x,y:Se(n.y-a,c,u)}};case`down`:return{ok:!0,start:n,end:{x:n.x,y:Se(n.y+a,c,u)}};case`left`:return{ok:!0,start:n,end:{x:Se(n.x-i,s,l),y:n.y}};case`right`:return{ok:!0,start:n,end:{x:Se(n.x+i,s,l),y:n.y}};default:return{ok:!1,message:`swipe.label direction must be up, down, left, or right.`}}}function vf(e){return _e(e.rect)}function yf(e,t){let n=typeof e==`number`?e*gf.swipe.screenRatio:0;return Math.round(Math.min(gf.swipe.maxDistancePx,Math.max(gf.swipe.minDistancePx,n,t*1.5)))}const bf=new WeakMap,xf=new WeakMap,Sf=new WeakMap;function q(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}async function Cf(e){let t=e.raw===!0||process.env.AGENT_DEVICE_MAESTRO_RAW_SNAPSHOTS===`1`,n=await e.invoke({...e.baseReq,command:`snapshot`,positionals:[],flags:{...e.baseReq.flags,noRecord:!0,...t?{snapshotRaw:!0}:{}}});return n.ok&&e.scope&&Mf(e.scope,n.data),n}function wf(e){return Array.isArray(e?.nodes)?e:void 0}function Tf(e){return e?bf.get(e):void 0}function Ef(e,t){e&&xf.set(e,{selector:t})}function Df(e){return e?xf.get(e):void 0}function Of(e){e&&xf.delete(e)}function kf(e,t){e&&Sf.set(e,t)}function Af(e){if(!e)return;let t=Sf.get(e);return Sf.delete(e),t}function jf(e){e&&Sf.delete(e)}function Mf(e,t){let n=j(wf(t));n&&bf.set(e,n)}const Nf=new Map([[`button`,0],[`link`,0],[`textfield`,0],[`textview`,0],[`searchfield`,0],[`switch`,0],[`slider`,0],[`cell`,1],[`statictext`,2]]);function Pf(e,t,n,r,i,a={}){let o=zf(e,t,r);if(n.childOf){let t=zf(e,n.childOf,r);if(t.length===0)return{ok:!1,message:`Maestro childOf parent did not match: ${n.childOf}`};let i=Fe(e.nodes);o=o.filter(n=>t.some(t=>Me(e.nodes,n,t,i)))}let s=Lf({nodes:e.nodes,matches:o,platform:r}),c=Xf(e.nodes,s.matches,n.index,Y(t),i,a.requireOnScreen===!0,a.promoteTapTarget,a.preferredContext);if(!c){let e=n.index??0;return{ok:!1,message:s.blockedByReactNativeOverlay?`React Native overlay is covering app content: ${t}`:o.length>0&&s.matches.length===0?`Maestro selector matched ${o.length} element(s), but none were visible: ${t}`:`Maestro selector did not match index ${e}: ${t}`}}return{ok:!0,node:c.node,rect:c.rect}}function Ff(e,t,n,r,i={}){let a=Bf(e,t),o=Lf({nodes:e.nodes,matches:a,platform:n}),s=Xf(e.nodes,o.matches,void 0,t,r,i.requireOnScreen===!0,i.promoteTapTarget,i.preferredContext);return s?{ok:!0,node:s.node,rect:s.rect}:{ok:!1,message:`Maestro fuzzy text did not match: ${t}`}}function If(e,t,n,r){let i=zf(e,t,n,{allowLeadingCompositeLabelMatch:!1}),a=Lf({nodes:e.nodes,matches:i,platform:n}),o=Xf(e.nodes,a.matches,void 0,Y(t),r,!0);return o?{ok:!0,node:o.node,rect:o.rect,matches:a.matches.length}:{ok:!1,message:a.blockedByReactNativeOverlay?`React Native overlay is covering app content: ${t}`:i.length>0?`Maestro selector matched ${i.length} element(s), but none were visible: ${t}`:`Maestro selector did not match: ${t}`}}function Lf(e){let t=e.matches.filter(t=>Pe({predicate:`visible`,node:t,nodes:e.nodes,platform:e.platform}).pass),n=Rf(e.nodes,t,e.platform);return{matches:n.matches,blockedByReactNativeOverlay:n.blockedByReactNativeOverlay}}function Rf(e,t,n){let r=qe(e);if(!r.detected||!r.redBox)return{matches:t,blockedByReactNativeOverlay:!1};let i=Je(r),a=i.filter(t=>Pe({predicate:`visible`,node:t,nodes:e,platform:n}).pass);if(a.length===0)return i.length===0?{matches:[],blockedByReactNativeOverlay:!0}:{matches:t,blockedByReactNativeOverlay:!1};let o=new Set(a.map(e=>e.index)),s=t.filter(e=>o.has(e.index));return{matches:s,blockedByReactNativeOverlay:t.length>0&&s.length===0}}function J(e){return e?.platform===`android`?`android`:`ios`}function Y(e){let t=y(e).selectors.flatMap(e=>e.terms);if(t.length===0||!t.some(e=>e.key===`label`||e.key===`text`)||!t.every(e=>[`label`,`text`,`id`].includes(e.key)))return null;let n=t.map(e=>typeof e.value==`string`?e.value:``),r=n[0];return!r||!n.every(e=>e===r)?null:r}function zf(e,t,n,r={}){let i=y(t);for(let t of i.selectors){let i=e.nodes.filter(e=>Vf(e,t,n,r));if(i.length>0)return i}return[]}function Bf(e,t){let n=He(t);if(!n)return[];let r=[],i=[];for(let t of e.nodes){let e=[t.label,je(t),t.identifier,t.value].filter(e=>!!e).map(e=>He(e));e.some(e=>e===n)?r.push(t):e.some(e=>e.includes(n))&&i.push(t)}return r.length>0?r:i}function Vf(e,t,n,r){return We(e,t,n)?!0:t.terms.every(t=>Hf(e,t,n,r))}function Hf(e,t,n,r){return typeof t.value!=`string`||!Uf(t.key)?We(e,{raw:t.key,terms:[t]},n):Gf(Wf(e,t.key),t.value,r)}function Uf(e){return e===`id`||e===`label`||e===`text`||e===`value`}function Wf(e,t){return t===`id`?e.identifier:t===`label`?e.label:t===`value`?e.value:je(e)}function Gf(e,t,n={}){let r=e??``,i=He(r),a=He(t);if(i===a||n.allowLeadingCompositeLabelMatch!==!1&&Kf(i,a))return!0;if(!qf(t))return!1;try{return new RegExp(t).test(r)}catch{return!1}}function Kf(e,t){if(!e||!t||!e.startsWith(t))return!1;let n=e.at(t.length);return n===`,`||n===`:`||n===`;`}function qf(e){return/(?:\.\*|\.\+|\[[^\]]+\]|\([^)]*\)|\||\^|\$|\\[dDsSwWbB])/.test(e)}function Jf(e,t,n){if(t.rect&&t.rect.width>0&&t.rect.height>0)return{rect:t.rect,inherited:!1};if(t.rect)return null;let r=Yf(e,t,n);return r?{rect:r,inherited:!0}:null}function Yf(e,t,n){let r=t;for(;typeof r.parentIndex==`number`;){if(r=n.get(r.parentIndex)??e[r.parentIndex],!r)return null;if(r.rect)return r.rect.width>0&&r.rect.height>0?r.rect:null}return null}function Xf(e,t,n,r,i,a=!1,o=!1,s){let c=Fe(e);return Np(e,$f(e,Zf(e,t,c,r,n,i,a),n,r,o,s),c,o,i)}function Zf(e,t,n,r,i,a,o){let s=t.map(t=>Qf(e,t,n)).filter(e=>!!e),c=s.filter(e=>!e.inheritedRect),l=c.length>0?c:s;return!r||i!==void 0?s:mp(l,a,o)}function Qf(e,t,n){let r=Jf(e,t,n);return r?{node:t,rect:r.rect,inheritedRect:r.inherited}:null}function $f(e,t,n,r,i,a){if(n!==void 0)return t[n]??null;let o=ep(e,t,r,i,a);return tp(o,r,i)?bp(e,o,r)??o:o}function ep(e,t,n,r,i){return!r||!n?np(e,t,n,i):rp(e,t,n,i)??np(e,t,n,i)}function tp(e,t,n){return!!(n&&t&&e)}function np(e,t,n,r){return ap(e,t,n,r).sort((e,t)=>gp(e,t,n))[0]??null}function rp(e,t,n,r){let i=t.filter(e=>Z(e.node,n)===0);if(i.length>=2){let t=ip(e,i,n,r);if(t)return t}let a=t.filter(e=>Z(e.node,n)===1);return i.length>0||a.length<2?null:ip(e,a,n,r)}function ip(e,t,n,r){let i=Fe(e);return np(e,t.filter(n=>fp(n)&&t.some(t=>pp(e,t,n,i))),n,r)}function ap(e,t,n,r){if(!n||t.length<2)return t;let i=t.filter(e=>Z(e.node,n)===0);if(i.length<2)return t;let a=Fe(e),o=i.map(t=>({candidate:t,container:up(e,t.node,a)})).filter(e=>!!e.container);if(o.length<2||o.length!==i.length)return t;let s=o.filter(e=>lp(e,o));if(s.length<2)return t;let c=cp(s);if(c.length>0)return c;let l=op(e,s,r,a);if(l.length>0)return l;let u=Math.max(...s.map(e=>e.container.index)),d=s.filter(e=>e.container.index===u).map(e=>e.candidate);return d.length>0?d:t}function op(e,t,n,r){if(!n)return[];let i=up(e,n.node,r),a=i&&Rp(i.rect,n.rect)?i:null,o=t.map(e=>({entry:e,score:sp(e.container,n,a)})),s=Math.min(...o.map(e=>e.score));return Number.isFinite(s)?o.filter(e=>e.score===s).map(e=>e.entry.candidate):[]}function sp(e,t,n){if(n)return e.index===n.index?0:zp(e.rect,n.rect)<.6?1/0:Math.abs(e.index-n.index);if(zp(e.rect,t.rect)>=.6)return 0;let r=e.index-t.node.index;return r>=0?r:1e5+Math.abs(r)}function cp(e){let t=e.map(e=>X(e.container.rect)),n=Math.max(...t),r=Math.min(...t);return r<=0||n<r*1.2?[]:e.filter(e=>X(e.container.rect)===n).map(e=>e.candidate)}function lp(e,t){return t.some(t=>t!==e&&e.container.index!==t.container.index&&zp(e.container.rect,t.container.rect)>=.6)}function up(e,t,n){return Ne(e,t,n,e=>!e.rect||!dp(e)||e.rect.width<240||e.rect.height<320?null:e)}function dp(e){let t=Ae(e.type??``);return t===`scrollview`||t===`scroll-area`||t===`list`}function fp(e){return e.rect.width>=16&&e.rect.width<=260&&e.rect.height>=24&&e.rect.height<=80}function pp(e,t,n,r){return t.node.index===n.node.index||!Rp(t.rect,n.rect)||X(t.rect)<X(n.rect)*2?!1:Me(e,n.node,t.node,r)}function mp(e,t,n){let r=e.filter(e=>hp(e.rect,t));return n||r.length>0?r:e}function hp(e,t){let n=t?.referenceWidth??1/0,r=t?.referenceHeight??1/0;return e.x<n&&e.y<r&&e.x+e.width>0&&e.y+e.height>0}function gp(e,t,n){let r=vp(e,t,n);if(r!==0)return r;if(!_p(e.rect,t.rect))return e.node.index-t.node.index;let i=(t.node.depth??0)-(e.node.depth??0);return i===0?t.node.index-e.node.index:i}function _p(e,t){return Math.round(e.x)===Math.round(t.x)&&Math.round(e.y)===Math.round(t.y)&&Math.round(e.width)===Math.round(t.width)&&Math.round(e.height)===Math.round(t.height)}function vp(e,t,n){if(n){let r=Z(e.node,n)-Z(t.node,n);if(r!==0)return r}let r=yp(e.node)-yp(t.node);if(r!==0)return r;let i=Number(e.inheritedRect)-Number(t.inheritedRect);if(i!==0)return i;let a=n&&yp(e.node)===yp(t.node)?X(t.rect)-X(e.rect):X(e.rect)-X(t.rect);return a===0?0:a}function X(e){return e.width*e.height}function yp(e){return Nf.get(Ae(e.type??``))??3}function bp(e,t,n){if(!Dp(t,n))return null;let r=xp(e,t,n,Fe(e));if(r.length===0)return null;let i=jp(r.map(e=>e.rect.width)),a=Sp(t,n,kp(t.rect,r.map(e=>e.rect)),i);return a?Ep(t,a):null}function xp(e,t,n,r){return e.filter(i=>i.index!==t.node.index&&!!i.rect&&Me(e,i,t.node,r)&&Op(i,t.rect,n)).sort((e,t)=>e.rect.x-t.rect.x)}function Sp(e,t,n,r){let i=n.filter(e=>Ap(e.width,r)),a=Cp(e,t,n),o=i.some(t=>Tp(e.rect,t));return a&&!o?a:i.length===1?i[0]??null:a}function Cp(e,t,n){let r=n.find(t=>Math.abs(t.x-e.rect.x)<1),i=Math.max(48,Math.min(220,t.length*8+24));return wp(e,t,r,i)?{x:e.rect.x,width:Math.min(i,r.width)}:null}function wp(e,t,n,r){return n?Ae(e.node.type??``)===`scrollview`&&Z(e.node,t)<=1&&e.rect.width>=240&&e.rect.height>=32&&e.rect.height<=80&&n.width<=e.rect.width*.55&&n.width>=r*.6:!1}function Tp(e,t){return Math.abs(t.x-e.x)<1}function Ep(e,t){return{...e,rect:{x:t.x,y:e.rect.y,width:t.width,height:e.rect.height}}}function Dp(e,t){let n=Ae(e.node.type??``);return n!==`cell`&&n!==`other`&&n!==`scrollview`&&n!==`scroll-area`||e.rect.width<120||e.rect.height<32||e.rect.height>80?!1:Z(e.node,t)<=1}function Op(e,t,n){let r=Ae(e.type??``);return r!==`button`&&r!==`cell`&&r!==`other`||Z(e,n)<=1||e.rect.width<16||e.rect.height<16||!Rp(t,e.rect)?!1:Mp(t,e.rect)>=.5}function kp(e,t){let n=[],r=e.x,i=e.x+e.width;for(let a of t){let t=Math.max(e.x,a.x),o=Math.min(i,a.x+a.width);t>r&&n.push({x:r,width:t-r}),r=Math.max(r,o)}return i>r&&n.push({x:r,width:i-r}),n}function Ap(e,t){return e<24||t<24?!1:e>=t*.4&&e<=t*1.6}function jp(e){let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??0}function Mp(e,t){let n=Math.max(e.y,t.y),r=Math.min(e.y+e.height,t.y+t.height);return Math.max(0,r-n)/Math.max(1,Math.min(e.height,t.height))}function Np(e,t,n,r,i){return t?r?Pp(e,t,n,i)??{node:t.node,rect:t.rect}:{node:t.node,rect:t.rect}:null}function Pp(e,t,n,r){return Fp(t.node)?null:Ne(e,t.node,n,i=>{if(!Fp(i))return null;let a=Jf(e,i,n);return!a||!Ip(t.rect,a.rect,r)?null:{node:i,rect:a.rect}})}function Fp(e){let t=Ae(e.type??``);return e.hittable===!0||t===`button`||t===`link`||t===`cell`||t===`textfield`||t===`searchfield`||t===`switch`||t===`slider`}function Ip(e,t,n){if(!Rp(t,e)||Lp(e,t))return!1;let r=X(t),i=X(e);if(i>0&&r>i*30)return!1;if(n){let e=n.referenceWidth*n.referenceHeight;if(e>0&&r>e*.5)return!1}return!0}function Lp(e,t){return t.height<32||t.height>80||e.height<t.height*.75||Mp(e,t)<.75||t.width<240?!1:t.width>=e.width*3}function Rp(e,t){return t.x>=e.x-1&&t.y>=e.y-1&&t.x+t.width<=e.x+e.width+1&&t.y+t.height<=e.y+e.height+1}function zp(e,t){let n=Math.max(e.x,t.x),r=Math.min(e.x+e.width,t.x+t.width),i=Math.max(e.y,t.y),a=Math.min(e.y+e.height,t.y+t.height);return Math.max(0,r-n)*Math.max(0,a-i)/Math.max(1,Math.min(X(e),X(t)))}function Z(e,t){let n=[e.label,je(e),e.identifier,e.value].filter(e=>!!e);return n.some(e=>e===t)?0:n.some(e=>He(e)===He(t))?1:n.some(e=>Gf(e,t))?2:3}const Q={animationPollMs:250,assertVisibleGraceMs:1e3,assertVisiblePollMs:250,assertVisibleRetryTimeoutMs:5e3,assertNotVisiblePollMs:250,defaultAssertNotVisibleTimeoutMs:3e3};async function Bp(e){let t=om(e.positionals,{command:`assertVisible`,defaultTimeoutMs:17e3});if(!t.ok)return t.response;let n=im(e.baseReq,t.selector);return n?await Vp(e,t,n):await Wp(e,t)}async function Vp(e,t,n){let r=Date.now(),i=await Up(e,t,n);if(i.ok){if(Hp(e.baseReq)){let n=await sm(e,t.selector,`assertVisible`);if(!n.visible){let i=em(e.baseReq,t,n,r);return i.kind===`return`?i.response:await Wp(e,t)}}return Ef(e.scope,t.selector),fm({ok:!0,data:{selector:t.selector,nativeWait:!0,query:n,response:i.data}},t.selector,r)}return await Gp(e,t,i,r)}function Hp(e){return e.flags?.platform===`android`}async function Up(e,t,n){return await e.invoke({...e.baseReq,command:`wait`,positionals:[n,String(t.timeoutMs)]})}async function Wp(e,t){let n=Date.now(),r=t.timeoutMs+Q.assertVisibleGraceMs,i,a,o=!1;for(;;){let s=Date.now(),c=await sm(e,t.selector,`assertVisible`);if(c.visible)return fm(c.response,t.selector,n);i=c.response,a=c.snapshot??a;let l=em(e.baseReq,t,c,n);if(l.kind===`return`)return l.response;let u=nm({captureStartedAt:s,capturedAfterDeadline:o,startedAt:n,deadlineMs:r});if(u===`capture-again`){o=!0;continue}if(u===`finish`)break;await w(Q.assertVisiblePollMs)}let s=i??q(`COMMAND_FAILED`,`Expected visible but did not match: ${t.selector}`,{selector:t.selector,timeoutMs:t.timeoutMs});return await Kp(e,t,a)||pm(s,a,e.baseReq)}async function Gp(e,t,n,r){let i=await sm(e,t.selector,`assertVisible`);if(i.visible)return fm(i.response,t.selector,r);let a=em(e.baseReq,t,i,r);return a.kind===`return`?a.response:await Kp(e,t,i.snapshot)||pm(n,i.snapshot,e.baseReq)}async function Kp(e,t,n){if(e.baseReq.flags?.platform!==`android`)return null;let r=Af(e.scope);return r?r.kind===`tap`?await qp(e,t,n,r):await Jp(e,t,r):null}async function qp(e,t,n,r){if(!n)return null;let i=Xp(e,n,r);return!i.ok||(h({level:`info`,phase:`maestro_assert_visible_retry_tap`,data:{selector:t.selector,tapSelector:r.selector,originalPoint:r.point,retryTarget:i.target,timeoutMs:Q.assertVisibleRetryTimeoutMs}}),!(await Zp(e,i.target)).ok)?null:await Yp(e,t,`retryTap`)}async function Jp(e,t,n){return h({level:`info`,phase:`maestro_assert_visible_retry_swipe`,data:{selector:t.selector,swipePositionals:n.positionals,timeoutMs:Q.assertVisibleRetryTimeoutMs}}),(await Qp(e,n)).ok?await Yp(e,t,`retrySwipe`):null}async function Yp(e,t,n){let r={...t,timeoutMs:Math.min(t.timeoutMs,Q.assertVisibleRetryTimeoutMs)},i=im(e.baseReq,r.selector);if(!i)return await Wp(e,r);let a=Date.now(),o=await Up(e,r,i);return o.ok?(Ef(e.scope,r.selector),fm({ok:!0,data:{selector:r.selector,nativeWait:!0,[n]:!0,query:i,response:o.data}},r.selector,a)):await Gp(e,r,o,a)}function Xp(e,t,n){let r=J(e.baseReq.flags),i=j(t),a=Pf(t,n.selector,n.options??{},r,i,{promoteTapTarget:!0});if(a.ok)return{ok:!0,target:{kind:`point`,point:vf(a)}};let o=Y(n.selector);return!o||!$p(t,o)?{ok:!1}:{ok:!0,target:{kind:`text`,query:o}}}async function Zp(e,t){return t.kind===`text`?await e.invoke({...e.baseReq,command:`find`,positionals:[t.query,`click`],flags:{...e.baseReq.flags,findFirst:!0,postGestureStabilization:!0}}):await e.invoke({...e.baseReq,command:`click`,positionals:[String(t.point.x),String(t.point.y)],flags:{...e.baseReq.flags,postGestureStabilization:!0}})}async function Qp(e,t){return await e.invoke({...e.baseReq,command:`swipe`,positionals:t.positionals})}function $p(e,t){let n=t.trim().toLowerCase();return n?e.nodes.some(e=>[e.label,e.value,e.identifier].some(e=>e?.trim().toLowerCase().includes(n))):!1}function em(e,t,n,r){return rm(n.response)?{kind:`return`,response:n.response}:tm(e,t.selector,n.snapshot)?{kind:`return`,response:am(t.selector,t.timeoutMs,r)}:{kind:`continue`}}function tm(e,t,n){return e.flags?.maestro?.allowAlreadyPastLoading===!0&&n!==void 0&&lm(t,n)}function nm(e){return Date.now()-e.startedAt<e.deadlineMs?`wait`:_m(e.capturedAfterDeadline,e.captureStartedAt,e.startedAt,e.deadlineMs)?`capture-again`:`finish`}function rm(e){return!e.ok&&e.error.code===`COMMAND_FAILED`&&e.error.message.includes(`React Native overlay`)}function im(e,t){return e.flags?.platform!==`ios`&&e.flags?.platform!==`android`?null:Y(t)}function am(e,t,n){return{ok:!0,data:{selector:e,alreadyPastLoading:!0,waitedMs:Date.now()-n,timeoutMs:t}}}function om(e,t){let[n,r=String(t.defaultTimeoutMs)]=e;if(!n)return{ok:!1,response:q(`INVALID_ARGS`,`${t.command} requires a selector.`)};let i=Number(r);return!Number.isFinite(i)||i<0?{ok:!1,response:q(`INVALID_ARGS`,`${t.command} timeout must be a non-negative number.`)}:{ok:!0,selector:n,timeoutMs:i}}async function sm(e,t,n){return cm(e,t,n,await Cf(e))}function cm(e,t,n,r){if(!r.ok)return{visible:!1,response:r,infrastructureFailure:!0};let i=wf(r.data);if(!i)return{visible:!1,response:q(`COMMAND_FAILED`,`Unable to read snapshot data for ${n}.`),infrastructureFailure:!0};let a=If(i,t,J(e.baseReq.flags),j(i));return a.ok?(Ef(e.scope,t),{visible:!0,response:{ok:!0,data:{selector:t,matches:a.matches,nodeIndex:a.node.index,nodeType:a.node.type,nodeLabel:a.node.label,nodeIdentifier:a.node.identifier,rect:a.rect}}}):{visible:!1,response:q(`COMMAND_FAILED`,a.message,{selector:t}),infrastructureFailure:!1,snapshot:i}}function lm(e,t){let n=um(Y(e));if(!dm(n))return!1;let r=t.nodes.flatMap(e=>[e.label,e.value,e.identifier]).filter(e=>!!e?.trim()).map(e=>um(e));return r.some(e=>e.includes(`something went wrong`))?!1:r.some(e=>e!==n&&!dm(e))}function um(e){return e?.trim().toLowerCase().replace(/\u2026/g,`...`)??``}function dm(e){return e===`loading`||e===`loading...`}function fm(e,t,n){return e.ok?{ok:!0,data:{selector:t,...e.data,waitedMs:Date.now()-n}}:e}function pm(e,t,n){if(e.ok||!t)return e;let r=typeof n.flags?.artifactsDir==`string`?n.flags.artifactsDir:void 0;if(!r)return e;let i=mm(t,r);return i.length===0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},artifactPaths:gm([...hm(e.error.details?.artifactPaths),...i])}}}}function mm(e,t){try{L.mkdirSync(t,{recursive:!0});let n=R.join(t,`failure-snapshot.json`),r=R.join(t,`failure-snapshot.txt`);L.writeFileSync(n,`${JSON.stringify(e,null,2)}\n`);let i=ce(e.nodes,{summarizeTextSurfaces:!0}).map(e=>e.text);return L.writeFileSync(r,`${i.join(`
25
+ `)}\n`),[n,r]}catch{return[]}}function hm(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function gm(e){return[...new Set(e)]}function _m(e,t,n,r){return!e&&t-n<r}async function vm(e){let t=om(e.positionals,{command:`assertNotVisible`,defaultTimeoutMs:Q.defaultAssertNotVisibleTimeoutMs});if(!t.ok)return t.response;let n=Date.now(),r=0,i;for(;Date.now()-n<=t.timeoutMs;){let a=await sm(e,t.selector,`assertNotVisible`);if(!a.visible&&a.infrastructureFailure)return a.response;if(a.visible)r=0,i=a.response;else{r+=1;let e=Date.now()-n;if(r>=2||e>=t.timeoutMs)return{ok:!0,data:{pass:!0,selector:t.selector,stableSamples:r,waitedMs:e,timeoutMs:t.timeoutMs}}}await w(Q.assertNotVisiblePollMs)}return r>0?{ok:!0,data:{pass:!0,selector:t.selector,stableSamples:r,waitedMs:Date.now()-n,timeoutMs:t.timeoutMs}}:q(`COMMAND_FAILED`,`Expected not visible but matched: ${t.selector}`,{selector:t.selector,timeoutMs:t.timeoutMs,lastResponse:i})}async function ym(e){let t=Number(e.positionals[0]??15e3);if(!Number.isFinite(t)||t<0)return q(`INVALID_ARGS`,`waitForAnimationToEnd timeout must be a number.`);let n=Date.now(),r,i;for(;Date.now()-n<t;){let n=await Cf(e),a=bm(n,r,t);if(a.done)return a.response;r=a.signature??r,i=n,await w(Q.animationPollMs)}return i?.ok===!1?i:{ok:!0,data:{stable:!1,timeoutMs:t}}}function bm(e,t,n){let r=xm(e);return e.ok?r?t===r?{done:!0,response:{ok:!0,data:{stable:!0,timeoutMs:n}}}:{done:!1,signature:r}:{done:!0,response:e}:{done:!1}}function xm(e){if(!e.ok)return null;let t=wf(e.data);return t?Sm(t):null}function Sm(e){return JSON.stringify(e.nodes.map(e=>({index:e.index,parentIndex:e.parentIndex,type:e.type,identifier:e.identifier,label:e.label,value:e.value,rect:e.rect?{x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height)}:void 0})))}const Cm={scrollUntilVisibleProbeMs:500,tapOnRetryMs:250,tapOnTimeoutMs:3e4,optionalTapOnTimeoutMs:3e3};async function wm(e){let[t,n=`5000`,r=`down`]=e.positionals;if(!t)return q(`INVALID_ARGS`,`scrollUntilVisible requires a selector.`);let i=Number(n);if(!Number.isFinite(i)||i<=0)return q(`INVALID_ARGS`,`scrollUntilVisible timeout must be a positive number.`);let a=Y(t),o=Math.max(1,Math.ceil(i/Cm.scrollUntilVisibleProbeMs)),s=null;for(let n=0;n<o;n+=1){let c=await zm(e,t,a,Bm(i,n));if(c.ok)return c;if(s=c,n===o-1)break;let l=await e.invoke({...e.baseReq,command:`scroll`,positionals:[r]});if(!l.ok)return l}return Zm(s,t,i)}async function Tm(e){let[t,n]=e.positionals,r=Number(t),i=Number(n);if(!Number.isFinite(r)||!Number.isFinite(i))return q(`INVALID_ARGS`,`tapOn percentage point requires numeric x/y values.`);let a=await Cf(e);if(!a.ok)return a;let o=wf(a.data);if(!o)return q(`COMMAND_FAILED`,`Unable to read snapshot data for Maestro percentage point tap.`);let s=j(o);if(!s)return q(`COMMAND_FAILED`,`Unable to resolve screen size for Maestro percentage point tap.`);let c=Ee(s,r,i),l=await e.invoke({...e.baseReq,command:`click`,positionals:[String(c.x),String(c.y)],flags:{...e.baseReq.flags,postGestureStabilization:!0}});return l.ok&&jf(e.scope),l}async function Em(e){let t=await Dm(e);if(t)return t;let n=await jm(e);return n.ok?await Am(e,n,n.durationMs):n.response}async function Dm(e){let[t,n,r]=e.positionals;if(!(t!==`direction`||n!==`left`&&n!==`right`)&&J(e.baseReq.flags)!==`android`)return await e.invoke({...e.baseReq,command:`gesture`,positionals:[`swipe`,n,...r?[r]:[]]})}async function Om(e){let[t,n]=e.positionals;if(!t)return q(`INVALID_ARGS`,`tapOn requires a selector.`);let r=Xm(n);if(!r.ok)return r.response;let i=Date.now(),a=Vm(e),o;for(;Date.now()-i<a;){let n=await Um(e,t,r.value??{});if(!n.retry)return n.response;o=n.response,await w(Cm.tapOnRetryMs)}return Hm(e,t,o)}async function km(e){let[t,n=`up`,r]=e.positionals;if(!t)return q(`INVALID_ARGS`,`swipe.label requires a label selector.`);let i=await qm(e,t,{},`swipe.label`,{promoteTapTarget:!1});if(!i.ok)return i.response;let a=_f(i.target,n);return a.ok?await Am(e,a,r):q(`INVALID_ARGS`,a.message)}async function Am(e,t,n){let r=[String(t.start.x),String(t.start.y),String(t.end.x),String(t.end.y),...n?[n]:[]],i=await e.invoke({...e.baseReq,command:`swipe`,positionals:r});return i.ok&&kf(e.scope,{kind:`swipe`,positionals:r}),i}async function jm(e){let t=Tf(e.scope)??await Mm(e);if(!t)return{ok:!1,response:q(`COMMAND_FAILED`,`Unable to resolve screen size for Maestro swipe.`)};let[n,...r]=e.positionals;return n===`direction`?Nm(r,t,J(e.baseReq.flags)):n===`percent`?Im(r,t,J(e.baseReq.flags)):{ok:!1,response:q(`INVALID_ARGS`,`Maestro screen swipe requires direction or percent.`)}}async function Mm(e){let t=await Cf(e);if(t.ok)return j(wf(t.data))}function Nm(e,t,n){let[r,i]=e;if(!r)return{ok:!1,response:q(`INVALID_ARGS`,`Maestro direction swipe requires a direction.`)};switch(r){case`up`:case`down`:return Fm(r,t,i);case`left`:case`right`:return Pm(r,t,n,i);default:return{ok:!1,response:q(`INVALID_ARGS`,`Maestro swipe direction must be UP, DOWN, LEFT, or RIGHT.`)}}}function Pm(e,t,n,r){let i=Rm(n,85,50,15,50),[a,o]=e===`left`?[85,15]:[15,85],s=Lm(n,t,a,50,o,50);return{ok:!0,start:Ee(t,a,i.startY,{marginPx:s}),end:Ee(t,o,i.endY,{marginPx:s}),durationMs:r}}function Fm(e,t,n){let r=De({direction:e,amount:.6,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight});return{ok:!0,start:we({x:r.x1,y:r.y1},t,8),end:we({x:r.x2,y:r.y2},t,8),durationMs:n}}function Im(e,t,n){let[r,i,a,o,s]=e,c=[r,i,a,o].map(Number);if(c.some(e=>!Number.isFinite(e)))return{ok:!1,response:q(`INVALID_ARGS`,`Maestro percentage swipe requires numeric points.`)};let[l,u,d,f]=c,p=Rm(n,l,u,d,f),m=Lm(n,t,l,u,d,f);return{ok:!0,start:Ee(t,l,p.startY,{marginPx:m}),end:Ee(t,d,p.endY,{marginPx:m}),durationMs:s}}function Lm(e,t,n,r,i,a){return e!==`ios`||r!==a||Math.abs(i-n)<30?1:Math.max(1,Math.round(t.referenceWidth*.15))}function Rm(e,t,n,r,i){return e!==`android`||n!==i||n!==50||Math.abs(r-t)<30?{startY:n,endY:i}:{startY:65,endY:65}}async function zm(e,t,n,r){let i=await e.invoke({...e.baseReq,command:`wait`,positionals:[t,String(r)]});return i.ok||!n?i:await e.invoke({...e.baseReq,command:`find`,positionals:[n,`wait`,String(r)]})}function Bm(e,t){return Math.min(Cm.scrollUntilVisibleProbeMs,Math.max(1,e-t*Cm.scrollUntilVisibleProbeMs))}function Vm(e){return e.baseReq.flags?.maestro?.optional===!0?Cm.optionalTapOnTimeoutMs:Cm.tapOnTimeoutMs}function Hm(e,t,n){return e.baseReq.flags?.maestro?.optional===!0?{ok:!0,data:{skipped:!0,optional:!0,selector:t}}:n??q(`COMMAND_FAILED`,`tapOn timed out for selector: ${t}`)}async function Um(e,t,n){let r=Y(t),i=await Wm(e,t,n);return i.response.ok?{retry:!1,response:i.response}:i.targetResolved&&r?await Km(e,r):{retry:!0,response:i.response}}async function Wm(e,t,n){let r=await qm(e,t,n,`tapOn`,{promoteTapTarget:!0});return r.ok?await Gm(e,t,r.target,n):{response:r.response,targetResolved:!1}}async function Gm(e,t,n,r){let i=vf(n);h({level:`debug`,phase:`maestro_tap_target`,data:{selector:t,node:{index:n.node.index,type:n.node.type,label:n.node.label,value:n.node.value,identifier:n.node.identifier,visibleToUser:n.node.visibleToUser},rect:n.rect,point:i}});let a=await e.invoke({...e.baseReq,command:`click`,positionals:[String(i.x),String(i.y)],flags:{...e.baseReq.flags,postGestureStabilization:!0}});return a.ok&&(Of(e.scope),kf(e.scope,{kind:`tap`,selector:t,point:i,options:{...r}})),{response:a,targetResolved:!0}}async function Km(e,t){let n=await e.invoke({...e.baseReq,command:`find`,positionals:[t,`click`],flags:{...e.baseReq.flags,findFirst:!0,postGestureStabilization:!0}});return h({level:n.ok?`info`:`debug`,phase:`maestro_fuzzy_tap_fallback`,data:{query:t,ok:n.ok}}),n.ok?(jf(e.scope),{retry:!1,response:n}):{retry:!0,response:n}}async function qm(e,t,n,r,i){return Jm(e,t,n,r,i,await Cf({...e,raw:!0}))}function Jm(e,t,n,r,i,a){if(!a.ok)return{ok:!1,response:a};let o=wf(a.data);if(!o)return{ok:!1,response:q(`COMMAND_FAILED`,`Unable to read snapshot data for ${r}.`)};let s=j(o),c=J(e.baseReq.flags),l=Ym(e,o,c,s),u=Pf(o,t,n,c,s,{...i,preferredContext:l,requireOnScreen:!0});if(!u.ok){let e=Y(t);if(e){let t=Ff(o,e,c,s,{...i,preferredContext:l,requireOnScreen:!0});if(t.ok)return{ok:!0,target:{node:t.node,rect:t.rect,frame:s}}}}return u.ok?{ok:!0,target:{node:u.node,rect:u.rect,frame:s}}:{ok:!1,response:q(`ELEMENT_NOT_FOUND`,u.message,{selector:t,options:n,command:r})}}function Ym(e,t,n,r){let i=Df(e.scope);if(!i)return;let a=If(t,i.selector,n,r);if(a.ok)return h({level:`debug`,phase:`maestro_preferred_context`,data:{selector:i.selector,node:{index:a.node.index,type:a.node.type,label:a.node.label,value:a.node.value,identifier:a.node.identifier},rect:a.rect}}),{node:a.node,rect:a.rect}}function Xm(e){if(!e)return{ok:!0,value:null};try{return{ok:!0,value:JSON.parse(e)}}catch{return{ok:!1,response:q(`INVALID_ARGS`,`tapOn runtime options must be valid JSON.`)}}}function Zm(e,t,n){return e?{ok:!1,error:{...e.error,message:`scrollUntilVisible timed out after ${n}ms for selector: ${t}. Last wait: ${e.error.message}`}}:q(`COMMAND_FAILED`,`scrollUntilVisible timed out after ${n}ms for selector: ${t}`)}async function Qm(e){switch(e.command){case U.assertVisible:return await Bp(e);case U.assertNotVisible:return await vm(e);case U.pressEnter:return await $m(e);case U.waitForAnimationToEnd:return await ym(e);case U.scrollUntilVisible:return await wm(e);case U.swipeScreen:return await Em(e);case U.swipeOn:return await km(e);case U.tapOn:return await Om(e);case U.tapPointPercent:return await Tm(e);case U.runScript:return eh(e);default:return}}async function $m(e){let t=await e.invoke({...e.baseReq,command:`keyboard`,positionals:[`enter`]});return t.ok?t:await e.invoke({...e.baseReq,command:`type`,positionals:[`
26
+ `]})}function eh(e){let[t]=e.positionals;if(!t)return q(`INVALID_ARGS`,`runScript requires a file path.`);try{return{ok:!0,data:{outputEnv:Gl({scriptPath:t,env:{...e.scope.values,...e.baseReq.flags?.maestro?.runScriptEnv??{}}})}}}catch(e){let t=n(e);return q(t.code,t.message,t.details)}}async function th(e){for(let[t,n]of e.actions.entries()){let r=await e.invokeReplayAction({action:n,line:e.line,step:e.step+t/1e3});if(!r.ok)return r}return{ok:!0,data:{ran:e.actions.length}}}async function nh(e){let t;for(let n=0;n<=e.maxRetries;n+=1){let r=await th({actions:e.actions,line:e.line,step:e.step+n,invokeReplayAction:e.invokeReplayAction});if(r.ok)return{ok:!0,data:{attempts:n+1,retried:n>0}};t=r}return t??{ok:!1,error:{code:`COMMAND_FAILED`,message:`retry commands failed.`}}}const rh={visibleTimeoutMs:3e3,visiblePollMs:250};async function ih(e){let t=await ah(e,e.control);return t.ok?t.matched?await lh(e):{ok:!0,data:{skipped:!0,condition:e.control.mode,selector:e.control.selector}}:t.response}async function ah(e,t){if(t.mode===`visible`)return await oh(e,t);let n=await sh(e,t.selector);return n.ok?{ok:!0,matched:!n.matched}:{ok:!1,response:n.response}}async function oh(e,t){let n=Date.now();for(;;){let r=await sh(e,t.selector);if(!r.ok)return{ok:!1,response:r.response};if(r.matched)return{ok:!0,matched:!0};if(Date.now()-n>=rh.visibleTimeoutMs)return{ok:!0,matched:!1};await w(rh.visiblePollMs)}}async function sh(e,t){let n=await Cf(e);return n.ok?ch(e,t,n):{ok:!1,response:n}}function ch(e,t,n){let r=wf(n.data);return r?{ok:!0,matched:If(r,t,J(e.baseReq.flags),j(r)).ok}:{ok:!1,response:q(`COMMAND_FAILED`,`Unable to read snapshot data for runFlow.when.`)}}async function lh(e){let t=await th({actions:e.control.actions,line:e.line,step:e.step,invokeReplayAction:e.invokeReplayAction});return t.ok?{ok:!0,data:{ran:t.data?.ran,condition:e.control.mode,selector:e.control.selector}}:t}async function uh(e){let{req:t,sessionName:n,action:r,scope:i,filePath:a,line:o,step:s,tracePath:c,invoke:l}=e,u=sr(r,i,{file:a,line:o}),d=e=>uh({req:t,sessionName:n,action:e.action,scope:i,filePath:a,line:e.line,step:e.step,tracePath:c,invoke:l}),f=Date.now();hh(c,{type:`replay_action_start`,ts:new Date(f).toISOString(),replayPath:a,line:o,step:s,command:u.command,positionals:u.positionals??[]});let p=await dh({req:t,sessionName:n,resolved:u,scope:i,line:o,step:s,invoke:l,invokeReplayAction:d}),m=Date.now();return hh(c,{type:`replay_action_stop`,ts:new Date(m).toISOString(),replayPath:a,line:o,step:s,command:u.command,ok:p.ok,durationMs:m-f,resultTiming:p.ok?mh(p.data):void 0,errorCode:p.ok?void 0:p.error.code}),p}async function dh(e){let{req:t,sessionName:n,resolved:r,scope:i,line:a,step:o,invoke:s,invokeReplayAction:c}=e,l=gh(t.flags,r.flags),u={token:t.token,session:n,flags:l,runtime:r.runtime,meta:t.meta,internal:t.internal},d=await fh({control:r.replayControl,baseReq:u,line:a,step:o,invoke:s,invokeReplayAction:c})??await Qm({command:r.command,baseReq:u,positionals:r.positionals??[],scope:i,line:a,step:o,invoke:s,invokeReplayAction:c})??await s({...u,command:r.command,positionals:r.positionals??[]});if(d.ok){let e=ph(d.data);e&&or(i,e)}return d}async function fh(e){let{control:t,baseReq:n,line:r,step:i,invoke:a,invokeReplayAction:o}=e;if(t){switch(t.kind){case`retry`:return await nh({actions:t.actions,maxRetries:t.maxRetries,line:r,step:i,invokeReplayAction:o});case`maestroRunFlowWhen`:return await ih({baseReq:n,control:t,line:r,step:i,invoke:a,invokeReplayAction:o})}return t}}function ph(e){if(!e||typeof e!=`object`)return null;let t=e.outputEnv;if(!t||typeof t!=`object`||Array.isArray(t))return null;let n=Object.entries(t).filter(e=>typeof e[1]==`string`);return n.length>0?Object.fromEntries(n):null}function mh(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e.timing;if(!(!t||typeof t!=`object`||Array.isArray(t)))return Object.fromEntries(Object.entries(t).filter(([,e])=>{let t=typeof e;return t===`number`||t===`string`||t===`boolean`}))}function hh(e,t){e&&L.appendFileSync(e,`${JSON.stringify(t)}\n`)}function gh(e,t){return Re(e,{...t??{}})}async function _h(e){let{req:t,sessionName:r,logPath:i,sessionStore:a,tracePath:o,invoke:s}=e,c=t.positionals?.[0];if(!c)return k(`INVALID_ARGS`,`replay requires a path`);let l=``,u=new Set;try{l=A.expandHome(c,t.meta?.cwd);let e=L.readFileSync(l,`utf8`),n=e.trimStart()[0];if(n===`{`||n===`[`)return k(`INVALID_ARGS`,`replay accepts .ad script files. JSON replay payloads are no longer supported.`);let d=rf(e,t.flags,{sourcePath:l}),f=d.metadata,p=f.platform||f.target?{...t,flags:wh(t.flags,f)}:t,m=d.actions,h=d.actionLines;if(t.flags?.replayUpdate===!0&&d.updateUnsupportedMessage)return k(`INVALID_ARGS`,d.updateUnsupportedMessage);if(t.flags?.replayUpdate===!0&&f.env&&Object.keys(f.env).length>0)return k(`INVALID_ARGS`,`replay -u does not yet preserve env directives. Temporarily remove the env lines, run replay -u, then restore them.`);if(t.flags?.replayUpdate===!0&&jh(m))return k(`INVALID_ARGS`,"replay -u does not yet preserve ${VAR} substitutions. Resolve or inline the variables before running with -u.");let g=wr({builtins:vh({req:p,sessionName:r,metadata:f,resolvedPath:l}),fileEnv:f.env,shellEnv:lr(cr(t.flags?.replayShellEnv)),cliEnv:Cr(ur(t.flags?.replayEnv))}),_=t.flags?.replayUpdate===!0,v=o??a.get(r)?.trace?.outPath,y=[],b=0;for(let e=0;e<m.length;e+=1){let t=m[e];if(!t||t.command===`replay`)continue;yh(l,e,m.length,t);let n=Oh(a,r),o=await uh({req:p,sessionName:r,action:t,scope:g,filePath:l,line:h[e]??0,step:e+1,tracePath:v,invoke:s});if(y.push(...kh(a,r,n)),o.ok){Dh(o).forEach(e=>u.add(e));continue}if(Dh(o).forEach(e=>u.add(e)),!_)return Th(o,t,e,l,[...u],y);let c=await uf({action:t,sessionName:r,logPath:i,sessionStore:a});if(!c)return Th(o,t,e,l,[...u],y);m[e]=c;let d=Oh(a,r);if(o=await uh({req:p,sessionName:r,action:c,scope:g,filePath:l,line:h[e]??0,step:e+1,tracePath:v,invoke:s}),y.push(...kh(a,r,d)),!o.ok)return Dh(o).forEach(e=>u.add(e)),Th(o,c,e,l,[...u],y);Dh(o).forEach(e=>u.add(e)),b+=1}_&&b>0&&dr(l,m,a.get(r));let x=ne(y);return{ok:!0,data:{replayed:m.length,healed:b,session:r,artifactPaths:[...u],...x?{snapshotDiagnostics:x}:{}}}}catch(e){let t=n(e);return k(t.code,t.message,u.size>0?{artifactPaths:[...u]}:void 0)}}function vh(e){let{req:t,sessionName:n,metadata:r,resolvedPath:i}=e,a=t.flags??{},o=t.meta?.cwd??process.cwd(),s={AD_SESSION:n,AD_FILENAME:R.relative(o,i)||i},c=a.platform??r.platform;c&&(s.AD_PLATFORM=c);let l=a.target??r.target;l&&(s.AD_TARGET=l);let u=a.device;typeof u==`string`&&u.length>0&&(s.AD_DEVICE=u);let d=typeof a.serial==`string`?a.serial:a.udid;typeof d==`string`&&d.length>0&&(s.AD_DEVICE_ID=d),typeof a.shardIndex==`number`&&(s.AD_SHARD_INDEX=String(a.shardIndex)),typeof a.shardCount==`number`&&(s.AD_SHARD_COUNT=String(a.shardCount));let f=a.artifactsDir;return typeof f==`string`&&f.length>0&&(s.AD_ARTIFACTS=f),s}function yh(e,t,n,r){let i=pt();i&&T({type:`replay-test`,...i,file:i.file||e,status:`progress`,stepIndex:t+1,stepTotal:n,...bh(r)})}function bh(e){return{stepCommand:xh(e.command),...Sh(e)}}function xh(e){if(!e.startsWith(`__maestro`))return e;let t=e.slice(9);return t.length>0?t[0].toLowerCase()+t.slice(1):e}function Sh(e){let t=e.positionals??[],n=Ch(t[0]);return n?{stepValue:n}:e.command===`__maestroTapPointPercent`&&t.length>=2?{stepValue:`${t[0]},${t[1]}%`}:t.length===0?{}:{stepValue:t.join(` `)}}function Ch(e){if(!e)return;let t=C(e);if(!t)return;let n=t.selectors.flatMap(e=>e.terms.flatMap(e=>(e.key===`label`||e.key===`text`||e.key===`id`)&&typeof e.value==`string`?[e.value]:[]));if(n.length===0)return;let r=n[0];return r&&n.every(e=>e===r)?r:void 0}function wh(e,t){return{...e??{},...t.platform!==void 0&&e?.platform===void 0?{platform:t.platform}:{},...t.target!==void 0&&e?.target===void 0?{target:t.target}:{}}}function Th(e,t,n,r,i,a){return Eh(e,t,n,r,i,ne(a))}function Eh(e,t,n,r,i=[],a){if(e.ok)return e;let o=n+1;return{ok:!1,error:{code:e.error.code,message:`Replay failed at step ${o} (${st(t)}): ${e.error.message}`,hint:e.error.hint,diagnosticId:e.error.diagnosticId,logPath:e.error.logPath,details:{...e.error.details??{},replayPath:r,step:o,action:t.command,positionals:t.positionals??[],artifactPaths:i,...a?{snapshotDiagnostics:a}:{}}}}}function Dh(e){if(!e.ok){let t=e.error.details?.artifactPaths;return Array.isArray(t)?[...new Set(t.filter(e=>typeof e==`string`&&Ah(e)))]:[]}if(!e.data)return[];let t=[];if(typeof e.data.path==`string`&&t.push(e.data.path),typeof e.data.outPath==`string`&&t.push(e.data.outPath),Array.isArray(e.data.artifacts))for(let n of e.data.artifacts){if(!n||typeof n!=`object`)continue;let e=n,r=typeof e.localPath==`string`?e.localPath:void 0,i=typeof e.path==`string`?e.path:void 0;r?t.push(r):i&&t.push(i)}return[...new Set(t.filter(e=>Ah(e)))]}function Oh(e,t){return e.get(t)?.snapshotDiagnostics?.samples.length??0}function kh(e,t,n){return e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[]}function Ah(e){try{return L.statSync(e).isFile()}catch{return!1}}function jh(e){for(let t of e){for(let e of t.positionals??[])if(typeof e==`string`&&e.includes("${"))return!0;if(Mh(t.flags)||Mh(t.runtime))return!0}return!1}function Mh(e){return typeof e==`string`?e.includes("${"):Array.isArray(e)?e.some(Mh):e&&typeof e==`object`?Object.values(e).some(Mh):!1}const Nh=1e3,Ph=3e3;function Fh(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await Ih(e)}}async function Ih(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,artifactsDir:a,tracePath:o}=e;if(t.flags?.recordVideo!==!0)return;let s=i.get(n);if(!s||s.recording)return;let c=ee(s.device.platform),l=a?R.join(a,`recording${c}`):te(s.device.platform);Rh(o,{type:`video_recording_start`,session:n,videoPath:l}),h({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:l}});let u=await Ir({req:{token:t.token,session:n,command:`record`,positionals:[`start`,l],flags:{},meta:t.meta},sessionName:n,sessionStore:i,logPath:r});if(!u.ok)return Rh(o,{type:`video_recording_start_failed`,session:n,videoPath:l,errorCode:u.error.code}),u;let d=Date.now();return await w(Nh),Rh(o,{type:`video_preroll_done`,session:n,durationMs:Date.now()-d,requestedDurationMs:Nh}),h({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-d,data:{session:n,requestedDurationMs:Nh}}),u}async function Lh(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,tracePath:a,artifactPaths:o}=e;if(t.flags?.recordVideo!==!0||!i.get(n)?.recording)return;Rh(a,{type:`video_tail_start`,session:n,requestedDurationMs:Ph});let s=Date.now();await w(Ph);let c=Date.now(),l=await Ir({req:{token:t.token,session:n,command:`record`,positionals:[`stop`],flags:{},meta:t.meta},sessionName:n,sessionStore:i,logPath:r});return Dh(l).forEach(e=>o.add(e)),Rh(a,{type:`video_recording_stop`,session:n,ok:l.ok,durationMs:Date.now()-c,tailDurationMs:c-s,errorCode:l.ok?void 0:l.error.code}),h({phase:`replay_test_video_recording_stop`,durationMs:Date.now()-c,data:{session:n,ok:l.ok,tailDurationMs:c-s}}),l}function Rh(e,t){K(e,{...t,ts:new Date().toISOString()})}function zh(e){let{platform:t,target:n,artifactsDir:r,shard:i}=e,a=Bh(e.parentFlags);return t===void 0&&n===void 0&&r===void 0&&i===void 0?a:Od({...a??{},...t===void 0?{}:{platform:t},...n===void 0?{}:{target:n},...r===void 0?{}:{artifactsDir:r}},i)}function Bh(e){if(e?.recordVideo!==!0)return e;let t={...e};return delete t.recordVideo,Object.keys(t).length>0?t:void 0}async function Vh(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o}=e;return t.command===`replay`?await _h({req:t,sessionName:n,logPath:r,sessionStore:i,invoke:o}):t.command===`test`?await Vd({req:t,sessionName:n,runReplay:async({filePath:e,sessionName:n,platform:a,target:s,requestId:c,artifactsDir:l,artifactPaths:u,tracePath:d,shard:f})=>{let p=e=>(u&&Dh(e).forEach(e=>u.add(e)),e),m=zh({parentFlags:t.flags,platform:a,target:s,artifactsDir:l,shard:f}),h={req:t,sessionName:n,logPath:r,sessionStore:i,artifactsDir:l,tracePath:d},g=Fh(h);return await _h({req:{...t,command:`replay`,session:n,positionals:[e],flags:m,meta:{...t.meta??{},...c?{requestId:c}:{}},...t.internal||g?{internal:{...t.internal??{},...g?{openLifecycle:g}:{}}}:{}},sessionName:n,logPath:r,sessionStore:i,tracePath:d,invoke:async e=>{let t=await Ih(h);return t&&!t.ok?t:p(await o(e))}})},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,tracePath:o})=>await Lh({req:t,sessionName:e,logPath:r,sessionStore:i,artifactsDir:a,tracePath:o,artifactPaths:n}),cleanupSession:async e=>{i.get(e)&&await Ka({req:{token:t.token,session:e,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:e,logPath:r,sessionStore:i,leaseRegistry:a})}}):null}function Hh(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function Uh(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function Wh(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function Gh(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),T({type:`command`,status:`progress`,message:Kh(t)})}function Kh(e){return[Te(e),...oe(e)].join(`
27
+ `)}async function qh(e,t){let{device:n,metroPort:r,shouldProbeMetro:i,androidAdbExecutor:a}=t;n.platform!==`android`||!i||$(e,await Jh(m(n,a),n.id,r))}async function Jh(t,n,r){try{let e=await t([`reverse`,`--list`],{allowFailure:!0,timeoutMs:2e3}),i=`tcp:${r} tcp:${r}`,a=e.stdout.includes(i);return{id:`android-reverse`,status:a?`pass`:`warn`,summary:a?`Android adb reverse exists for Metro port ${r}.`:`Android adb reverse is missing for Metro port ${r}.`,command:a?void 0:`adb -s ${n} reverse tcp:${r} tcp:${r}`,evidence:{stdout:e.stdout.trim()}}}catch(t){let n=e(t);return{id:`android-reverse`,status:`warn`,summary:`Could not inspect Android adb reverse mappings.`,hint:n.message,evidence:{code:n.code}}}}async function Yh(t,n){let{device:r,targetApp:a,session:o}=n;if(a)try{let e=await Xh(r,a);if(!e){$(t,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${i(r)}.`,evidence:{requested:a,platform:i(r)}});return}$(t,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${e}`,evidence:{requested:a,resolved:e,sessionApp:o?.appBundleId}})}catch(n){let a=e(n);$(t,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${a.message}`,hint:a.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${i(r)} --all`,evidence:{code:a.code,message:a.message}})}}async function Xh(e,t){if(e.platform===`android`){let{listAndroidApps:n}=await import(`./app-lifecycle.js`).then(e=>e.t);return Zh(t,(await n(e,`all`)).map(e=>({id:e.package,name:e.name})))?.id}if(c(e)||s(e)){let{listIosApps:n}=await import(`./apps.js`).then(e=>e.t);return Zh(t,(await n(e,`all`)).map(e=>({id:e.bundleId,name:e.name})))?.id}}function Zh(e,n){let r=e.trim().toLowerCase(),i=n.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(i)return i;let a=n.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(a.length===1)return a[0];throw a.length>1?new t(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${e}"`,{matches:a.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new t(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function Qh(t,n,r){let i=eg(n,r);try{let e=await ng(i),n=tg(e.devices,i);return $(t,{id:`device`,status:n.length===0?`fail`:`pass`,summary:og(n,i,e.failures),hint:n.length===0?lg(e.failures):void 0,command:n.length===0?mg(i):void 0,evidence:hg(n,e.failures)}),n.length>0&&rg(t,e.failures),{devices:n,platform:i.platform,target:i.target}}catch(n){let r=e(n);return $(t,{id:`device`,status:`fail`,summary:r.message,hint:r.hint,command:`agent-device devices`,evidence:{code:r.code,details:r.details}}),{devices:[],platform:i.platform,target:i.target}}}function $h(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];$(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:i(e),id:e.id,name:e.name}))}})}function eg(e,t){let n=e.flags??{};return Sn({platform:n.platform??t?.device.platform,target:n.target??t?.device.target,device:n.device,udid:n.udid,serial:n.serial,iosSimulatorDeviceSet:n.iosSimulatorDeviceSet,androidDeviceAllowlist:n.androidDeviceAllowlist})}function tg(e,t){return e.filter(e=>u(e,t,{includeExplicitSelectors:!0}))}async function ng(e){if(e.platform)return{devices:await tn(e),failures:[]};let t=[],n=[];for(let r of qn)try{t.push(...await tn({...e,platform:r}))}catch(e){n.push(ag(r,e))}return{devices:t,failures:n}}function rg(e,t){for(let n of t)$(e,ig(n))}function ig(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${fg(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${fg(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function ag(t,n){let r=e(n);return{platform:t,message:r.message,hint:r.hint,code:r.code}}function og(e,t,n){if(e.length===0)return n.length>0?`No ${sg(t)} devices found; ${cg(n)}.`:`No ${sg(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${sg(t)} ${pg(e.length,`device`)} available; ${r} booted`,a=ug(e,t);return a?`${i} (${a}).`:`${i}.`}function sg(e){let t=e.platform?fg(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function cg(e){return e.slice(0,2).map(e=>`${fg(e.platform)} inventory failed: ${e.message}`).join(`; `)}function lg(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function ug(e,t){if(t.platform||t.target)return;let n=sn(e),r=dg();return[`android`,`apple`,`linux`,`web`].flatMap(e=>{let t=n[e];return t.available>0?[`${r[e]} ${t.available} available, ${t.booted} booted`]:[]}).join(`; `)}function dg(){return{android:`Android`,apple:`Apple`,linux:`Linux`,web:`web`}}function fg(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function pg(e,t){return e===1?t:`${t}s`}function mg(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function hg(e,t){let n=new Map;for(let t of e){let e=i(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const gg=1500;async function _g(e,t,n,r={}){let i=`http://${e}:${t}/status`;try{let a=await fetch(i,{signal:AbortSignal.timeout(1500)}),o=await a.text(),s=a.ok&&o.toLowerCase().includes(`packager-status:running`),c=s?await vg(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?yg(i,c):`Metro responded at ${i}, but did not report packager-status:running.`,hint:s?void 0:`Verify this is the Metro instance for the target app, or restart Metro.`,evidence:{url:i,statusCode:a.status,body:o.slice(0,120),kind:n,...c?{process:c}:{}}}}catch(e){return{id:`metro`,status:n===`auto`?`warn`:`fail`,summary:`Metro is not reachable at ${i}.`,hint:`Start Metro for this project. For non-default endpoints, launch with open --metro-host/--metro-port, or run metro prepare with --public-base-url/--proxy-base-url before retrying doctor.`,command:`curl -fsS ${i}`,evidence:{url:i,error:e instanceof Error?e.message:String(e),kind:n}}}}async function vg(e,t,n){try{return await(n.resolveProcessInfo??bg)(e,t)}catch{return}}function yg(e,t){return t?.cwd?`Metro is reachable at ${e} (cwd: ${t.cwd}).`:`Metro is reachable at ${e}.`}async function bg(e,t){if(!xg(e))return;let n=await Sg(t);if(n!==void 0)return{pid:n,cwd:await Cg(n)}}function xg(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Sg(e){let t=await _(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:gg});if(t.exitCode===0)return t.stdout.split(`
28
+ `).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function Cg(e){let t=await _(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:gg});if(t.exitCode===0)return t.stdout.split(`
29
+ `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const wg=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Tg=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Eg(e,t){let n=ze(e.meta?.cwd);return{targetApp:jg(e.flags?.targetApp)??t?.appBundleId,metroHost:jg(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Mg(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:kg(e,n)}}function Dg(e,t={}){let n=Ag(e);return n?[{id:`remote-connection`,status:t.required?`pass`:`info`,summary:`Remote daemon/session or provider scope is configured.`,evidence:n}]:t.required?[{id:`remote-connection`,status:`fail`,summary:`No remote daemon/session or provider scope is configured.`,hint:`Use connect, --remote-config <path>, or direct remote/provider flags for the command.`}]:[]}function Og(e,t,n,r={}){let a=n?e.toArray().filter(e=>e.name!==n.name&&e.device.platform===n.device.platform&&e.device.id===n.device.id).map(e=>e.name):[];return n?[{id:`session`,status:a.length>0?`warn`:`pass`,summary:a.length>0?`Other active sessions target the same device: ${a.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:a.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:a.length>0?`agent-device close --session ${a[0]} --platform ${i(n.device)}`:void 0,evidence:{session:n.name,sameDeviceSessions:a,sessionStateDir:e.resolveSessionDir(n.name)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function kg(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function Ag(e){let t={...Object.fromEntries([...wg,...Tg].flatMap(t=>typeof e.flags?.[t]==`string`?[[t,`<configured>`]]:[])),...e.flags?.sessionIsolation===`tenant`?{sessionIsolation:`tenant`}:{}};return Object.keys(t).length>0?t:void 0}function jg(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Mg(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Ng(e,t){if(t===`android`){$(e,await Pg());return}(t===`ios`||t===`macos`||t===`apple`)&&$(e,await zg())}async function Pg(){let e=process.env.ANDROID_HOME||process.env.ANDROID_SDK_ROOT,t=await Wg(e),n=await Gg(`adb`,[`version`]);return n?Fg({license:t,sdkRoot:e,versionLine:n}):Rg(e,t)}function Fg(e){return{id:`toolchain`,status:Ig(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${Lg(e.sdkRoot)}.`:`Android toolchain: adb is present but version check failed.`,hint:e.license===`missing`?`Accept Android SDK licenses before installing/building apps.`:void 0,command:e.license===`missing`?`sdkmanager --licenses`:void 0,evidence:{adbVersion:e.versionLine??null,androidHome:e.sdkRoot??null,license:e.license}}}function Ig(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function Lg(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function Rg(e,t){return{id:`toolchain`,status:`info`,summary:`Android toolchain: adb not found on PATH.`,hint:`Install Android platform-tools or add adb to PATH.`,evidence:{androidHome:e??null,license:t}}}async function zg(){let e=await Gg(`xcodebuild`,[`-version`]);return e?Bg({selectedPath:await Gg(`xcode-select`,[`-p`]),versionLine:e}):Ug()}function Bg(e){return{id:`toolchain`,status:Vg(e),summary:Hg(e),evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}}function Vg(e){return e.versionLine?`pass`:`info`}function Hg(e){return e.versionLine?e.selectedPath?`Apple toolchain: ${e.versionLine}; xcode-select ${e.selectedPath}.`:`Apple toolchain: ${e.versionLine}; xcode-select path unavailable.`:`Apple toolchain: xcodebuild version check failed.`}function Ug(){return{id:`toolchain`,status:`info`,summary:`Apple toolchain: xcodebuild version check failed.`,hint:`Install/select Xcode and complete first launch/license setup if xcodebuild reports it.`,command:`xcodebuild -version`}}async function Wg(e){if(!e)return`unknown`;try{return await Lr(R.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}async function Gg(e,t){try{let n=await _(e,t,{allowFailure:!0,timeoutMs:3e3});return n.exitCode===0?n.stdout.split(`
30
+ `).map(e=>e.trim()).find(Boolean):void 0}catch{return}}async function Kg(e,t){$(e,await qg(t))}async function qg(e){let t=Ot({stateDir:e});if(!t.installed)return{id:`web-agent-browser-processes`,status:`info`,summary:`Managed web backend is not installed; no agent-device-owned browser processes counted.`,evidence:{stateDir:e,installed:!1}};try{let n=await kt(t);return{id:`web-agent-browser-processes`,status:n.count>0?`info`:`pass`,summary:n.count>0?`${n.count} live agent-device-owned Chrome process${n.count===1?``:`es`} detected.`:`No live agent-device-owned Chrome processes detected.`,evidence:{stateDir:e,installed:!0,count:n.count,pids:n.pids,matchReasons:n.processes.map(e=>e.reason)}}}catch(t){return{id:`web-agent-browser-processes`,status:`info`,summary:`Could not inspect live agent-device-owned Chrome processes.`,hint:`Run doctor again from a shell with permission to inspect local processes.`,evidence:{stateDir:e,error:t instanceof Error?t.message:String(t)}}}}async function Jg(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i}=e;if(t.command!==S.doctor)return null;let a=r.get(n),o=Eg(t,a),s=Zg(r,n),c=[];if(Gh(c,{id:`agent-device`,status:`pass`,summary:`agent-device ${ae()} using ${s}`,evidence:{version:ae(),stateDir:s}},...Dg(t,{required:o.remote}),...Og(r,n,a,{remote:o.remote})),o.remote)return e_(c,o);let l=await Qh(c,t,a);await Ng(c,a?.device.platform??l?.platform);let u=await Qg({androidAdbExecutor:i,checks:c,inventory:l,options:o,session:a,stateDir:s});return await Xg(c,u??Yg(l)),e_(c,o,{device:u,includeMetro:!0,inventory:l})}function Yg(e){let t=(e?.devices??[]).filter(e=>c(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}async function Xg(e,t){if(!(!t||!c(t)||t.kind!==`simulator`)&&!(process.platform!==`darwin`||Bn(t))){if(T({type:`command`,status:`progress`,message:`Checking iOS runner build cache (${t.name})...`}),await bt(t)){$(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner artifact cached; first open skips the runner build`});return}mt(t,{}),T({type:`command`,status:`progress`,message:`Warming iOS runner build cache in the background (${t.name})...`}),$(e,{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner build started in the background; the first open gets faster once it completes`,hint:"Run `agent-device prepare ios-runner` to wait for a fully warmed runner instead."})}}function Zg(e,t){let n=R.dirname(e.resolveSessionDir(t));return R.basename(n)===`sessions`?R.dirname(n):n}async function Qg(e){let{checks:t,inventory:n,options:r,session:i,androidAdbExecutor:a,stateDir:o}=e,s=i?.device??$h(t,n,r.targetApp);return s&&await $g(t,{androidAdbExecutor:a,device:s,options:r,session:i}),r.shouldProbeMetro&&$(t,await _g(r.metroHost,r.metroPort,r.kind)),await Kg(t,o),s}async function $g(e,t){let{androidAdbExecutor:n,device:r,options:i,session:a}=t;await Yh(e,{device:r,session:a,targetApp:i.targetApp}),await qh(e,{androidAdbExecutor:n,device:r,metroPort:i.metroPort,shouldProbeMetro:i.shouldProbeMetro})}function e_(e,t,n={}){let r=Hh(e);return{ok:!0,data:{status:r,summary:Uh(r),kind:t.kind,platform:n.device?i(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:Wh(e)}}}async function t_(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,o=t.positionals?.[0]??``;if(o!==`ios-runner`)return k(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let s=i.get(n),c=t.flags??{},l=B(S.prepare,s,c);if(l)return l;let u=await V({session:s,flags:c,ensureReady:!0});if(!a(u.platform))return k(`UNSUPPORTED_OPERATION`,`prepare ios-runner is only supported on Apple runner platforms`);let d=Date.now(),f=await yt(u,n_(t,s,r,d));return{ok:!0,data:i_(o,u,Math.max(0,Date.now()-d),f)}}function n_(e,t,n,r){let i=r_(e);return{...jr({req:e,logPath:n,traceLogPath:t?.trace?.outPath}),cleanStaleBundles:!0,buildTimeoutMs:i,healthTimeoutMs:i,prepareDeadline:tt.fromTimeoutMs(i,r),startupTimeoutMs:i}}function r_(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:b}function i_(e,t,n,r){return{action:e,platform:i(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:a_(n,r),message:`Prepared Apple runner: ${t.name}`}}function a_(e,t){let n=o_(t.buildMs),r=s_(t.connectMs),i=s_(t.healthCheckMs);return{totalMs:e,additiveParts:{...n===void 0?{}:{buildMs:n},connectAfterBuildMs:Math.max(0,r-(n??0)),healthCheckMs:i},containment:n===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},note:`Top-level prepare timing fields are diagnostic and may overlap; use timing.additiveParts for additive wall-clock phases.`}}function o_(e){return e===void 0?void 0:s_(e)}function s_(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}async function c_(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,command:a,positionals:o,recordPositionals:s,deriveNextSession:c}=e,l=i.get(n),u=t.flags??{},d=B(a,l,u);if(d)return d;let f=await V({session:l,flags:u,ensureReady:!0}),p=O(a,f);if(p)return p;let m=await E(f,a,o,t.flags?.out,{...D(r,t.flags,l?.appBundleId,l?.trace?.outPath)});if(l){let e=c?await c(l,m,f):l;Mr(i,e,t,a,m??{},{positionals:s??o}),e!==l&&i.set(n,e)}return{ok:!0,data:m??{}}}async function l_(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,o=a.get(n),s=t.flags??{},c=B(S.clipboard,o,s);if(c)return c;let l=(t.positionals?.[0]??``).toLowerCase();if(l!==`read`&&l!==`write`)return k(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let u=await V({session:o,flags:s,ensureReady:!0}),d=O(S.clipboard,u);if(d)return d;let f=await E(u,S.clipboard,t.positionals??[],t.flags?.out,{...D(r,t.flags,o?.appBundleId,o?.trace?.outPath)});return Mr(a,o,t,t.command,f??{}),{ok:!0,data:{platform:i(u),...f??{}}}}async function u_(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new On,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l}=e;if(t.command===S.doctor)return await Jg({req:t,sessionName:n,sessionStore:i,androidAdbExecutor:l});if(Hn(t.command)===`inventory`)return await io({req:t,sessionName:n,sessionStore:i});if(t.command===`runtime`)return await Zi({req:t,sessionName:n,sessionStore:i});if(Hn(t.command)===`state`)return await fo({req:t,sessionName:n,logPath:r,sessionStore:i});if(t.command===S.clipboard)return await l_({req:t,sessionName:n,logPath:r,sessionStore:i});if(t.command===S.keyboard){let e=i.get(n),a=t.positionals?.[0]?.trim().toLowerCase();return!e&&(a===`dismiss`||a===`enter`||a===`return`)&&(t.flags??{}).platform===`ios`?k(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`):await c_({req:t,sessionName:n,logPath:r,sessionStore:i,command:S.keyboard,positionals:t.positionals??[]})}if(Hn(t.command)===`observability`)return await ic({req:t,sessionName:n,sessionStore:i,androidAdbExecutor:l});if(t.command===S.prepare)return await t_({req:t,sessionName:n,logPath:r,sessionStore:i});if(t.command===S.install||t.command===S.reinstall)return await Qa({req:t,command:t.command,sessionName:n,sessionStore:i,deployOps:t.command===S.install?Za:Xa});if(t.command===v.installSource)return await Yr({req:t,sessionName:n,sessionStore:i});if(t.command===v.releaseMaterializedPaths)return await ii({req:t});if(t.command===S.push){let e=t.positionals?.[0]?.trim(),a=t.positionals?.[1]?.trim();return!e||!a?k(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`):await c_({req:t,sessionName:n,logPath:r,sessionStore:i,command:S.push,positionals:[e,d_(a,t.meta?.cwd)],recordPositionals:[e,a]})}return t.command===S.triggerAppEvent?await c_({req:t,sessionName:n,logPath:r,sessionStore:i,command:S.triggerAppEvent,positionals:t.positionals??[],deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await wa(e.device,n,e.appBundleId,xa)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}}):t.command===S.open?await La({req:t,sessionName:n,logPath:r,sessionStore:i}):Hn(t.command)===`replay`?await Vh({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:c??s}):t.command===S.batch?await ro(t,n,s):t.command===S.close?await Ka({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o}):null}function d_(e,t){let n=Yt(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>A.expandHome(e,t)});return n.kind===`file`?n.path:n.text}export{u_ as handleSessionCommands};