agent-device 0.18.3 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.3.apk → agent-device-android-multitouch-helper-0.19.1.apk} +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.1.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.3.manifest.json → agent-device-android-multitouch-helper-0.19.1.manifest.json} +4 -4
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.3.apk → agent-device-android-snapshot-helper-0.19.1.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.1.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.3.manifest.json → agent-device-android-snapshot-helper-0.19.1.manifest.json} +6 -6
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +28 -0
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +33 -127
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +630 -177
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +155 -0
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +67 -0
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +173 -122
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +172 -0
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +64 -0
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +76 -182
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +92 -51
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +213 -137
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +142 -0
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +208 -46
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +82 -11
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +74 -0
- package/dist/src/agent-browser-tool.js +1 -0
- package/dist/src/android-adb.d.ts +63 -234
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-ownership.js +6 -0
- package/dist/src/android.js +1 -5
- package/dist/src/app-lifecycle.js +7 -0
- package/dist/src/apple-runner-options.js +1 -0
- package/dist/src/apps.js +5 -11
- package/dist/src/artifacts.d.ts +4 -3
- package/dist/src/artifacts.js +1 -1
- package/dist/src/audio-probe.js +1 -1
- package/dist/src/batch.d.ts +2 -177
- package/dist/src/batch.js +1 -1
- package/dist/src/cli-help.js +178 -60
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +2 -0
- package/dist/src/cli.js +12 -41
- package/dist/src/client-metro-companion.js +1 -0
- package/dist/src/client.js +3 -0
- package/dist/src/command-metadata.js +1 -0
- package/dist/src/command-schema.js +22 -0
- package/dist/src/command-surface.js +1 -1
- package/dist/src/contracts.d.ts +2 -213
- package/dist/src/contracts.js +1 -1
- package/dist/src/debug-symbols.js +5 -3
- package/dist/src/device-input-state.js +2 -0
- package/dist/src/devices.js +1 -1
- package/dist/src/devices2.js +1 -0
- package/dist/src/devices3.js +1 -0
- package/dist/src/find.js +1 -1
- package/dist/src/finders.d.ts +2 -81
- package/dist/src/finders.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/handler-utils.js +1 -1
- package/dist/src/helper.js +2 -0
- package/dist/src/host-process.js +2 -0
- package/dist/src/index.d.ts +1444 -1786
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +3 -1
- package/dist/src/input-actions2.js +1 -0
- package/dist/src/install-source.d.ts +13 -14
- package/dist/src/install-source.js +1 -1
- package/dist/src/install-source2.js +1 -0
- package/dist/src/interaction-snapshot.js +1 -0
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +2 -1
- package/dist/src/internal/bin.d.ts +1 -1
- package/dist/src/internal/bin.js +2 -5
- package/dist/src/internal/companion-tunnel.d.ts +1 -1
- package/dist/src/internal/companion-tunnel.js +1 -1
- package/dist/src/internal/daemon.d.ts +1 -1
- package/dist/src/internal/daemon.js +18 -1
- package/dist/src/internal/png-worker.d.ts +29 -26
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/internal/update-check-entry.d.ts +1 -1
- package/dist/src/internal/update-check-entry.js +1 -1
- package/dist/src/io.d.ts +2 -85
- package/dist/src/io.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/manifest.js +1 -0
- package/dist/src/metro.d.ts +69 -113
- package/dist/src/metro.js +1 -1
- package/dist/src/metro2.js +1 -0
- package/dist/src/notifications.js +1 -1
- package/dist/src/output-path.js +1 -0
- package/dist/src/path-resolution.js +1 -0
- package/dist/src/png-worker-contract.js +1 -0
- package/dist/src/points.js +4 -0
- package/dist/src/project-runtime.js +1 -0
- package/dist/src/provider.js +1 -1
- package/dist/src/providers.js +1 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-trace-recording.js +2 -5
- package/dist/src/record-trace.js +1 -1
- package/dist/src/recording-provider.js +1 -1
- package/dist/src/registry.js +38 -0
- package/dist/src/remote-config.d.ts +2 -83
- package/dist/src/reporting.js +9 -0
- package/dist/src/rolldown-runtime.js +1 -0
- package/dist/src/runner-client.js +1 -0
- package/dist/src/runner-provider.js +1 -0
- package/dist/src/runner-sequence.js +1 -1
- package/dist/src/runtime-transport.js +1 -0
- package/dist/src/runtime.js +3 -0
- package/dist/src/scoped-provider.js +1 -0
- package/dist/src/sdk-android-adb.d.ts +144 -0
- package/dist/src/sdk-android-adb.js +4 -0
- package/dist/src/sdk-app-inventory.d.ts +4 -0
- package/dist/src/sdk-app-inventory.js +1 -0
- package/dist/src/sdk-batch-runner.d.ts +39 -0
- package/dist/src/sdk-batch-runner.js +2 -0
- package/dist/src/sdk-batch.js +2 -0
- package/dist/src/sdk-contracts.d.ts +386 -0
- package/dist/src/sdk-contracts.js +2 -0
- package/dist/src/sdk-finders.d.ts +60 -0
- package/dist/src/sdk-finders.js +1 -0
- package/dist/src/sdk-io.d.ts +78 -0
- package/dist/src/sdk-io.js +1 -0
- package/dist/src/sdk-remote-config.d.ts +139 -0
- package/dist/src/sdk-remote-config.js +1 -0
- package/dist/src/sdk-selectors.js +1 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.d.ts +38 -137
- package/dist/src/selectors.js +1 -1
- package/dist/src/selectors2.js +1 -0
- package/dist/src/server.js +3 -2
- package/dist/src/session.js +10 -11
- package/dist/src/setting-state.js +1 -0
- package/dist/src/simctl.js +1 -0
- package/dist/src/simulator.js +1 -2
- package/dist/src/snapshot-diagnostics.js +3 -0
- package/dist/src/snapshot-helper.js +5 -0
- package/dist/src/snapshot-quality.js +1 -0
- package/dist/src/snapshot.js +1 -2
- package/dist/src/snapshot2.js +2 -0
- package/dist/src/{5560.js → timeouts.js} +1 -1
- package/dist/src/tool-provider.js +3 -0
- package/dist/src/tool-provider2.js +1 -0
- package/dist/src/ttl-memo.js +1 -0
- package/dist/src/tv-remote.js +14 -0
- package/dist/src/update-check.js +1 -0
- package/dist/src/url.js +1 -0
- package/dist/src/version.js +1 -0
- package/dist/src/web.js +1 -1
- package/dist/src/xml.js +2 -0
- package/package.json +13 -19
- package/server.json +2 -2
- package/skills/agent-device/SKILL.md +8 -7
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.3.apk.sha256 +0 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.3.apk.sha256 +0 -1
- package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +0 -443
- package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -169
- package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +0 -220
- package/dist/src/1404.js +0 -1
- package/dist/src/1986.js +0 -1
- package/dist/src/2748.js +0 -1
- package/dist/src/2948.js +0 -30
- package/dist/src/3006.js +0 -1
- package/dist/src/314.js +0 -1
- package/dist/src/3340.js +0 -8
- package/dist/src/4418.js +0 -1
- package/dist/src/4428.js +0 -3
- package/dist/src/485.js +0 -1
- package/dist/src/4917.js +0 -1
- package/dist/src/495.js +0 -5
- package/dist/src/5448.js +0 -3
- package/dist/src/5484.js +0 -1
- package/dist/src/5643.js +0 -1
- package/dist/src/587.js +0 -1
- package/dist/src/5913.js +0 -4
- package/dist/src/6849.js +0 -1
- package/dist/src/6918.js +0 -1
- package/dist/src/6967.js +0 -1
- package/dist/src/760.js +0 -1
- package/dist/src/7871.js +0 -1
- package/dist/src/8184.js +0 -1
- package/dist/src/8225.js +0 -1
- package/dist/src/8391.js +0 -1
- package/dist/src/8404.js +0 -2
- package/dist/src/8414.js +0 -2
- package/dist/src/8875.js +0 -4
- package/dist/src/893.js +0 -1
- package/dist/src/8936.js +0 -1
- package/dist/src/9414.js +0 -1
- package/dist/src/9581.js +0 -22
- package/dist/src/9612.js +0 -1
- package/dist/src/9624.js +0 -1
- package/dist/src/9722.js +0 -39
- package/dist/src/devices~1.js +0 -1
- package/dist/src/devices~2.js +0 -1
- package/dist/src/input-actions~1.js +0 -1
- package/dist/src/rslib-runtime.js +0 -1
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
package/dist/src/session.js
CHANGED
|
@@ -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,emitRequestProgress as c,APPLE_MEMGRAPH_SNAPSHOT_DESCRIPTION as p,dispatchCommand as f,sessionMatchesScope as m,appendAppLogMarker as h,LOCAL_DEVICE_INVENTORY_PLATFORM_SELECTORS as g,countDeviceInventoryByGroup as w,installProviderDeviceApp as v,startAndroidSimpleperfProfile as y,hasCachedAppleRunnerArtifact as A,sampleAppleFramePerf as b,captureAppleMemorySnapshot as S,isHostSystemAudioProbeDevice as I,getSessionCommandKind as _,inferFillText as k,scheduleIosRunnerIdleStop as N,startAndroidPerfettoTrace as D,stopIosRunnerSession as x,captureAndroidHeapSnapshot as R,stopAppleXctracePerfCapture as M,resolvePublicSessionName as P,writeAppleXctracePerfReport as L,registerBuiltinPlatformPlugins as O,stopSessionApplePerfCapture as $,cleanupUploadedArtifact as C,resolveSessionRequestLogPath as E,ANDROID_FRAME_SAMPLE_METHOD as V,buildAppleFrameSamplingMetadata as F,createRequestCanceledError as T,stopAppleRunnerForClose as q,isActiveProviderDevice as U,registerRequestAbort as G,errorResponse as H,runHostSystemAudioProbeCommand as B,readReplayTestActionProgress as K,configureProviderPortReverse as j,releaseSessionLease as z,removeProviderPortReverse as W,withKeyedLock as J,buildSessionRecoveryHint as Y,resolveTargetDevice as X,getAppLogPathMetadata as Q,sampleAndroidMemoryPerf as Z,requireCommandSupported as ee,uniqueStrings as et,setSessionSnapshot as er,stopSessionAudioProbe as ea,ANDROID_HPROF_SNAPSHOT_DESCRIPTION as en,sampleAndroidCpuPerf as ei,ANDROID_HPROF_SNAPSHOT_METHOD as eo,buildDeviceInventoryRequestFromFlags as es,startAppleXctracePerfCapture as el,buildAppleSamplingMetadata as eu,cleanupRetainedMaterializedPathsForSession as ed,clearAppLogFiles as ec,tryGetPlugin as ep,getSnapshotReferenceFrame as ef,prepareIosRunner as em,hasExplicitDeviceSelector as eh,stopSessionAndroidNativePerfCapture as eg,readSessionNetworkCapture as ew,cleanupRetainedMaterializedPaths as ev,isImplicitSessionScopeConflict as ey,resolveSessionRunnerLogPath as eA,ANDROID_CPU_SAMPLE_DESCRIPTION as eb,buildSnapshotState as eS,resolveLogBackend as eI,resolveSessionLeaseForRequest as e_,stopAndroidSimpleperfProfile as ek,context_contextFromFlags as eN,listDeviceInventory as eD,SessionStore as ex,ANDROID_CPU_SAMPLE_METHOD as eR,buildAppleMemorySnapshotSupport as eM,stopAndroidPerfettoTrace as eP,isRequestCanceled as eL,resolveRequestTrackingId as eO,retainMaterializedPaths as e$,resolvePayloadInput as eC,LeaseRegistry as eE,prepareUploadedArtifact as eV,resetAndroidFramePerfStats as eF,getRunnerSessionSnapshot as eT,listSessionSelectorConflicts as eq,stopSessionAppLog as eU,stopSessionAndroidSnapshotHelper as eG,withReplayTestActionProgress as eH,ANDROID_FRAME_SAMPLE_DESCRIPTION as eB,runAppLogDoctor as eK,markRequestCanceled as ej,stopAppLog as ez,resolveImplicitSessionScope as eW,APPLE_MEMGRAPH_SNAPSHOT_METHOD as eJ,ANDROID_MEMORY_SAMPLE_DESCRIPTION as eY,writeAndroidSimpleperfReport as eX,prewarmIosRunnerSession as eQ,clearRequestCanceled as eZ,buildSimctlArgsForDevice as e0,resolveFrontmostMacOsApp as e1,isCommandSupportedOnDevice as e3,sampleApplePerfMetrics as e2,sampleAndroidFramePerf as e5,prewarmAppleRunnerCache as e4,markAndroidSnapshotFreshness as e8,getRequestSignal as e6,ANDROID_MEMORY_SAMPLE_METHOD as e7,startAppLog as e9}from"./9722.js";import{isMacOs as te,resolveAppleSimulatorSetPathForSelector as tt,publicPlatformString as tr,NETWORK_INCLUDE_MODES as ta,isMobilePlatform as tn,matchesPlatformSelector as ti,isApplePlatform as to,matchesDeviceSelector as ts,isIosFamily as tl}from"./6849.js";import{ensureDeviceReady as tu,buildAppleRunnerRequestOptions as td,buildAppleRunnerSessionOptions as tc,createAppleRunnerCachePrewarmOnColdBoot as tp,createAppleRunnerCacheColdBootPrewarmForOpen as tf}from"./8414.js";import{isPerfAction as tm,isPerfSubject as th,pointFromPercent as tg,PERF_AREA_ERROR_MESSAGE as tw,buildSwipeGesturePlan as tv,PERF_ACTION_ERROR_MESSAGE as ty,buildSnapshotDisplayLines as tA,formatDoctorCheckDetailLines as tb,isPerfKind as tS,isPerfMemoryKind as tI,pointInsideRect as t_,successText as tk,clampGesturePoint as tN,resolveDeployResultTarget as tD,PERF_MEMORY_KIND_ERROR_MESSAGE as tx,PERF_KIND_ERROR_MESSAGE as tR,isPerfArea as tM,formatDoctorCheckSummaryLine as tP,LOG_ACTION_VALUES as tL,withSuccessText as tO,clampToRange as t$,parseSessionSurface as tC,resolveInstallFromSourceResultTarget as tE,readReactNativeOverlayActionNodes as tV,detectReactNativeOverlay as tF,PERF_SUBJECT_ERROR_MESSAGE as tT}from"./2948.js";import{recordSessionAction as tq}from"./handler-utils.js";import{trimRuntimeValue as tU,resolveRuntimeTransportHints as tG}from"./8936.js";import{resolveAndroidAdbExecutor as tH,runAndroidAdb as tB,resolveIosSimulatorDeviceSetPath as tK,classifyAndroidAppTarget as tj,resolveIosDeviceDeepLinkBundleId as tz,isInfrastructureBootFailureReason as tW,Deadline as tJ,isWebUrl as tY,resolveAndroidSerialAllowlist as tX,isDeepLinkTarget as tQ,formatAndroidInstalledPackageRequiredMessage as tZ,listAndroidApps as t0}from"./3340.js";import{getDiagnosticsMeta as t1,runCmd as t3,runCmdSync as t2,emitDiagnostic as t5}from"./8875.js";import{shutdownSimulator as t4,getSimulatorState as t8}from"./simulator.js";import{runBatch as t6,mergeParentFlags as t7}from"./6918.js";import{assertResolvedAppsFilter as t9}from"./2748.js";import{listIosApps as re}from"./apps.js";import{resolveWebProvider as rt}from"./provider.js";import{unsupportedCommand as rr,readEnvMap as ra,parseReplayScriptDetailed as rn,readReplayShellEnvSource as ri,normalizeCommandList as ro,normalizePlatform as rs,readReplayCliEnvEntries as rl,parseMaestroYamlDocuments as ru,parseAbsolutePoint as rd,readReplayScriptMetadata as rc,parseReplayCliEnvEntries as rp,collectReplayShellEnv as rf,support_action as rm,isPlainRecord as rh,requireAppId as rg,assertOnlyKeys as rw,resolveMaestroString as rv,requireStringValue as ry,parseMaestroPoint as rA,unsupportedMaestroSyntax as rb,readTimeoutMs as rS,writeReplayScript as rI,buildReplayVarScope as r_,resolveReplayAction as rk,mergeReplayVarScopeValues as rN}from"./4428.js";import{readSnapshotDiagnosticsSummary as rD,summarizeSnapshotTimingSamples as rx,mergeSnapshotDiagnostics as rR}from"./5913.js";import{resolveSelectorChain as rM,extractNodeText as rP,findSnapshotAncestor as rL,isDescendantOfSnapshotNode as rO,splitIsSelectorArgs as r$,buildSelectorChainForNode as rC,buildSnapshotNodeByIndex as rE,matchesSelector as rV,normalizeType as rF}from"./893.js";import{formatScriptActionSummary as rT,evaluateIsPredicate as rq,isTouchTargetCommand as rU}from"./7871.js";import{splitSelectorFromArgs as rG,normalizeText as rH,tryParseSelectorChain as rB,parseSelectorChain as rK}from"./587.js";import{sleep as rj}from"./5560.js";import{handleRecordCommand as rz}from"./record-trace-recording.js";import{recordingExtensionForPlatform as rW,defaultRecordingPath as rJ}from"./5643.js";import{detectProjectRuntimeKind as rY}from"./760.js";import{INTERNAL_COMMANDS as rX,PUBLIC_COMMANDS as rQ}from"./1986.js";import{readVersion as rZ}from"./1404.js";var r0={};async function r1(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 tu(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 X(e.flags??{});return await tu(a),a}async function r3(e){let{prepared:t,retention:r,req:a,session:n,sessionName:i}=e;if(r.enabled)return await e$({archivePath:t.archivePath,installablePath:t.installablePath,tenantId:a.meta?.tenantId,sessionName:n?i:void 0,ttlMs:r.ttlMs})}function r2(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function r5(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:eV(i,t.meta?.tenantId)},cleanup:()=>{C(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 r1({session:n,flags:t.flags}),d=ee("install",u,{message:"install_from_source is not supported on this device"});if(d)return d;let c=e6(t.meta?.requestId);if(tl(u)){let{prepareIosInstallArtifact:e}=await import("./apps.js"),i=await e(o.source,{signal:c});return await r4({prepared:i,retention:s,req:t,resolvedSourceCleanup:()=>o.cleanup(),session:n,sessionName:r,sessionStore:a,buildResult:async e=>await r8(u,i,e)})}let{prepareAndroidInstallArtifact:p}=await import("./3340.js"),f=await p(o.source,{signal:c});return await r4({prepared:f,retention:s,req:t,resolvedSourceCleanup:()=>o.cleanup(),session:n,sessionName:r,sessionStore:a,buildResult:async e=>await r6(u,f,e)})}catch(e){return{ok:!1,error:s(e)}}}async function r4(e){let t;try{var r;t=await r3(e);let a=await e.buildResult(t),n=tO(a,(r=a,`Installed: ${tE(r)}`));return!function(e){let{session:t,sessionStore:r,req:a,data:n}=e;tq(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 ev(t.materializationId,e.req.meta?.tenantId).catch(()=>{}),r}finally{await e.prepared.cleanup(),e.resolvedSourceCleanup()}}async function r8(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,{...r2(i),bundleId:o,...r7(s),launchTarget:n?.launchTarget??o}}async function r6(e,t,r){let a=await d(e,t.installablePath,{packageNameHint:t.packageName}),n=await r9(e,t,a),{inferAndroidAppName:i}=await import("./3340.js"),o=i(n);return{...r2(r),packageName:n,...r7(a?.appName??o),launchTarget:a?.launchTarget??n}}function r7(e){return e?{appName:e}:{}}async function r9(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 ae(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 ev(e,t.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:s(e)}}}function at(e){return tl(e)&&"simulator"===e.kind}function ar(e,t,r){return t||eh(r)?null:H("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}async function aa(e,t){at(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function an(e){let t=eh(e.flags)||!e.session?await X(e.flags??{},{allowStoppedAndroidAvdPlaceholders:e.allowStoppedAndroidAvdPlaceholders}):await ai(e.session.device);return!1!==e.ensureReady&&await tu(t),t}async function ai(e){if(!tl(e)||"simulator"!==e.kind||"darwin"!==process.platform)return e;if(eT(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 X(t)}catch(e){if(!(e instanceof l)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await X({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function ao(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(r0),e.d(r0,{handleSessionCommands:()=>lO});let as="shared_prefs/ReactNativeDevPrefs.xml",al="debug_http_host",au="dev_server_https",ad="RCT_jsLocation",ac="RCT_packager_scheme",ap="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.",af='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function am(e){return void 0!==tG(e)}async function ah(e){let{device:t,appId:r,runtime:a}=e;if(U(t)||!r)return;let n=tG(a);if(n){if("android"===t.platform)return void await aw(t,r,n);tl(t)&&"simulator"===t.kind&&await ab(t,r,n)}}async function ag(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await av(t,r);tl(t)&&"simulator"===t.kind&&await aS(t,r)}}async function aw(e,t,r){var a,n,i,o,s,l;let u,d;aN(t);let c=(a=await ay(e,t),n=al,i=`${r.host}:${r.port}`,u=` <string name="${aD(n)}">${aD(i)}</string>`,a_(ak(a,n),u));o=c,s=au,l="https"===r.scheme,d=` <boolean name="${aD(s)}" value="${l?"true":"false"}" />`,c=a_(ak(o,s),d),await aA(e,t,c)}async function av(e,t){aN(t);let r=await ay(e,t),a=ak(r,al),n=ak(a,au);n!==r&&await aA(e,t,n)}async function ay(e,t){let r=await tB(e,["shell","run-as",t,"cat",as],{allowFailure:!0});return 0!==r.exitCode?af:aI(r.stdout)}async function aA(e,t,r){let a=["shell","run-as",t,"id"],n=await tB(e,a,{allowFailure:!0});if(0!==n.exitCode){let e=ax(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?ap:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await tB(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await tB(e,["shell","run-as",t,"tee",as],{stdin:r.trimEnd()})}catch(a){let e=o(a);if("TOOL_MISSING"===e.code)throw e;let r=ax("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?ap:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function ab(e,t,r){await u(e0(e,["spawn",e.id,"defaults","write",t,ad,"-string",`${r.host}:${r.port}`])),await u(e0(e,["spawn",e.id,"defaults","write",t,ac,"-string",r.scheme]))}async function aS(e,t){await u(e0(e,["spawn",e.id,"defaults","delete",t,ad]),{allowFailure:!0}),await u(e0(e,["spawn",e.id,"defaults","delete",t,ac]),{allowFailure:!0})}function aI(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
|
|
2
|
-
`:af}function a_(e,t){return aI(e).replace("</map>",`${t}
|
|
3
|
-
</map>`)}function ak(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return aI(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 aN(e){if("binary"!==tj(e))return;let t=tZ(e);throw new l("INVALID_ARGS",t,{package:e,hint:t})}function aD(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function ax(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 aR=["platform","metroHost","metroPort","bundleUrl","launchUrl"];function aM(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>void 0!==e&&""!==e).length:0}function aP(e,t){if(void 0!==e){if("string"!=typeof e)throw new l("INVALID_ARGS",`Invalid open runtime ${t}: expected string.`);return tU(e)}}function aL(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 aO(e){if("ios"===e||"android"===e)return e}async function a$(e){let{replacedStoredRuntime:t,previousRuntime:r,runtime:a,session:n}=e;!t||!n?.appBundleId||!am(r)||am(a)||await ag({device:n.device,appId:n.appBundleId})}async function aC(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 aV(n,s);if("set"!==(r=s)&&"show"!==r&&"clear"!==r)return H("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 aE(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?tr(o.device):void 0,u=aO(a.flags?.platform??s?.platform??l);if(!u)return H("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 H("INVALID_ARGS",`runtime set targets ${u}, but session "${n}" is already bound to ${l}.`);let d={platform:(t=a.flags,r={platform:u,metroHost:tU(t?.metroHost),metroPort:aL(t?.metroPort),bundleUrl:tU(t?.bundleUrl),launchUrl:tU(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===aM(d)?H("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 aE(e,t,r,a){am(a)&&r?.appBundleId&&await ag({device:r.device,appId:r.appBundleId});let n=t.clearRuntimeHints(e);return{ok:!0,data:{session:e,cleared:n}}}async function aV(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:H("INVALID_ARGS","runtime port-reverse requires a lease provider.")}:{ok:!1,response:H("INVALID_ARGS","runtime port-reverse requires a resolved remote lease.")});if(!s.ok)return s;let l=(r=e,i=aT(r.flags?.devicePort),o=aT(r.flags?.hostPort??r.flags?.devicePort),i&&o?{ok:!0,devicePort:i,hostPort:o}:{ok:!1,response:H("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 aF(t,r.options);return a?{ok:!0,data:{action:t,...a}}:H("UNSUPPORTED_OPERATION","No active provider device runtime supports port reverse for this lease.")}async function aF(e,t){return"port-reverse"===e?await j(t):await W(t)}function aT(e){if("number"==typeof e&&Number.isInteger(e)&&!(e<1)&&!(e>65535))return e}let aq="open-command-roundtrip",aU="Not implemented for this platform in this release.";function aG(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 aH=new Set(["app","desktop","frontmost-app"]);async function aB(e){if("app"===e||"desktop"===e||"menubar"===e)return{};let t=await e1();return{appBundleId:t.bundleId,appName:t.appName}}async function aK(e,t,r){if(to(e.platform)&&t)return tQ(t)?te(e)?void 0:"device"===e.kind?tz(r,t):tY(t)?void 0:r??await aj(e,t):await az(e,t)}async function aj(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:r}=await import("./apps.js");return await r(e,t)}catch{return}}async function az(e,t){try{let{resolveIosApp:r}=await import("./apps.js");return await r(e,t)}catch{return}}async function aW(e,t){if(!("android"!==e.platform||!t||tQ(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 aJ(e,t,r){if(r||"android"!==e.platform||!t||!tQ(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 aY(e,t,r,a){return await aK(e,t,r)??await a(e,t)??("android"===e.platform&&t&&tQ(t)?r:void 0)}function aX(e){return H("INVALID_ARGS",e)}function aQ(e,t,r,a){try{return function(e){let{device:t,surfaceFlag:r,openTarget:a,existingSurface:n}=e;if((te(t)||"linux"===t.platform)&&!r)return n??"app";if("linux"===t.platform){if(!r)return"app";let e=tC(r);if(!aH.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(!te(t)){if(r)throw new l("INVALID_ARGS","surface is only supported on macOS and Linux");return"app"}let i=r?tC(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 H(e instanceof l?e.code:"INVALID_ARGS",String(e.message))}}function aZ(e){let{shouldRelaunch:t,openTarget:r,surface:a,device:n}=e;return t?r&&tQ(r)?aX("open --relaunch does not support URL targets."):"app"!==a?aX("open --relaunch is supported only for app surfaces."):"android"===n.platform&&r&&"binary"===tj(r)?aX(tZ(r)):null:null}async function a0(e){let{req:t,sessionName:r,sessionStore:a,device:n,surface:i,openTarget:s,existingSession:u,onIosSimulatorColdBootStart:d}=e;await tu(n,{deviceHub:t.flags?.deviceHub===!0,onIosSimulatorColdBootStart:d});let{appBundleId:c,appName:p}=await a1({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=>!aR.includes(e));if(n)throw new l("INVALID_ARGS",`Invalid open runtime field: ${n}. Supported fields are ${aR.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:aP(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 aL(e)}}(t.metroPort),bundleUrl:aP(t.bundleUrl,"bundleUrl"),launchUrl:aP(t.launchUrl,"launchUrl")}}({runtime:t.runtime,sessionName:a,platform:aO(tr(n))});return void 0===t.runtime?{runtime:function(e,t,r){let a=e.getRuntimeHints(t);if(!a)return;let n=r?tr(r):void 0,i=aO(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&&aM(o)>0?o:void 0,previousRuntime:i,replacedStoredRuntime:!0}}(e)}}catch(t){let e=o(t);return H(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 a$({replacedStoredRuntime:r,previousRuntime:t,runtime:e,session:u})}return{type:"details",details:{appBundleId:c,appName:p,runtime:f.data.runtime}}}async function a1(e){let{device:t,surface:r,openTarget:a,existingAppBundleId:n}=e,i=await aB(r);return{appBundleId:i.appBundleId??await aY(t,a,n,aW),appName:i.appName??a}}let a3=new Map;async function a2(e){let{device:t,closeTarget:r,outFlag:a,context:n}=e;to(t.platform)&&!at(t)&&await x(t.id),await f(t,"close",[r],a,n),await aa(t,300)}async function a5(e){var t,r;let a,{runtime:n,device:i,req:o,logPath:s,appBundleId:l,traceLogPath:u,openPositionals:d}=e,c=n?.launchUrl;if(!c||0===d.length||d.length>1)return;let p=d[0]?.trim();!p||tQ(p)||await f(i,"open",[c],o.flags?.out,{...(t=s,r=o.flags,a=eN(t,r,l,u),delete a.launchConsole,delete a.launchArgs,a)})}async function a4(e){var t,r,a,n;let i,{req:o,sessionName:s,sessionStore:l,logPath:u,device:d,openTarget:c,openPositionals:p,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={},_=tl(d)&&"app"===h&&p.length>0&&!!b,k=tc({req:o,logPath:u,appBundleId:b,traceLogPath:A}),N=o.flags?.maestro?.prewarmRunnerBeforeOpen===!0,D=!1,x=!1,R=(e=k)=>{D=!0,I.runnerPrewarmKind="session",I.runnerPrewarmScheduled=!0,i=eQ(d,e)},M=async()=>{if(!i||x)return;x=!0;let e=Date.now();await i,I.runnerPrewarmWaited=!0,I.runnerPrewarmDurationMs=Math.max(0,Date.now()-e)};_&&at(d)&&!N&&R();let L=y&&!!c&&1===p.length&&at(d)&&o.flags?.clearAppState!==!0;if(y&&c&&!L){let e=b??c,t=Date.now();await a2({device:d,closeTarget:e,outFlag:o.flags?.out,context:{...eN(u,o.flags,b??v?.appBundleId,A)}}),I.relaunchCloseDurationMs=Math.max(0,Date.now()-t)}let O=Date.now();await ah({device:d,appId:b,runtime:w}),I.runtimeHintsDurationMs=Math.max(0,Date.now()-O),_&&N&&(R({...k,propagateError:!0}),await M());let $=Date.now(),C=await a8({req:o,sessionName:s,sessionStore:l,device:d,surface:h,sessionAppBundleId:b,appName:m,existingSession:v});if("response"===C.type)return C.response;let V=C.session??v;await f(d,"open",p,o.flags?.out,{...eN(u,o.flags,b),...L?{terminateRunningApp:!0}:{}}),I.openDispatchDurationMs=Math.max(0,Date.now()-$);let F=Date.now();await a5({runtime:w,device:d,req:o,logPath:u,appBundleId:b,traceLogPath:A,openPositionals:p}),I.launchUrlDurationMs=Math.max(0,Date.now()-F),_&&!D&&R(),y?await M():i&&!x&&(I.runnerPrewarmWaited=!1),b=await aJ(d,c,b),"android"===d.platform&&b&&await eF(d,b);let q=c?(t=b,{durationMs:Math.max(0,Date.now()-$),measuredAt:new Date().toISOString(),method:aq,appTarget:c,appBundleId:t}):void 0,U=Date.now();if(await aa(d,300),I.postOpenSettleDurationMs=Math.max(0,Date.now()-U),eL(o.meta?.requestId)){let e=T();return H(e.code,e.message,e.details)}v&&e8(v,"open",v.snapshot);let G=aG({existingSession:V,sessionName:v?.name??P(o),sessionScope:v?.sessionScope??eW(o),device:d,surface:h,appBundleId:b,appName:m,saveScript:!!o.flags?.saveScript});G.lease=e_({req:o,existingLease:v?.lease}),void 0!==o.runtime&&(r=l,a=s,(n=w)&&(0===aM(n)?r.clearRuntimeHints(a):r.setRuntimeHints(a,n)));let B=l.ensureSessionDir(s),K=E(B,o.meta?.requestId??t1().requestId);I.totalDurationMs=Math.max(0,Date.now()-S),t5({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:c,runtimeHintCount:p}=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),c&&p(c)>0&&(f.runtime=c),d&&(f.platform=tr(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&&tl(d)&&(f.device_udid=d.id,f.ios_simulator_device_set=d.simulatorSetPath??null),{...f,...tk(`Opened: ${i??o??t}`)}}({sessionName:G.name,sessionStateDir:B,runnerLogPath:eA(B),requestLogPath:K,appName:m,appBundleId:b,surface:h,startup:q,timing:I,device:d,runtime:w,runtimeHintCount:aM});return l.recordAction(G,{command:"open",positionals:p,flags:o.flags??{},runtime:void 0!==o.runtime?w:void 0,result:j}),l.set(s,G),{ok:!0,data:j}}async function a8(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=aG({existingSession:l,sessionName:l?.name??P(t),sessionScope:l?.sessionScope??eW(t),device:n,surface:i,appBundleId:o,appName:s,saveScript:!!t.flags?.saveScript});d.lease=e_({req:t,existingLease:l?.lease}),a.set(r,d);let c=await u(d);return c&&!c.ok?{type:"response",response:c}:{type:"session",session:a.get(r)??d}}async function a6(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=aQ(i.device,t.flags?.surface,s,i.surface);if("string"!=typeof l)return l;if(!s&&"app"===l)return e?aX("open --relaunch requires an app name or an active session app."):aX("Session already active. Close it first or pass a new --session name.");let u=aZ({shouldRelaunch:e,openTarget:s,surface:l,device:i.device});if(u)return u;let d=await ai(i.device),c=await a0({req:t,sessionName:r,sessionStore:n,device:d,surface:l,openTarget:s,existingSession:i,onIosSimulatorColdBootStart:tf({req:t,logPath:a,device:d,surface:l,openTarget:s,traceLogPath:i.trace?.outPath})});return"response"===c.type?c.response:await a4({req:t,sessionName:r,sessionStore:n,logPath:a,device:d,openTarget:s,openPositionals:o?t.positionals??[]:s?[s]:[],appBundleId:c.details.appBundleId,appName:c.details.appName,runtime:c.details.runtime,surface:l,existingSession:i})}let o=t.flags?.relaunch===!0,s=t.positionals?.[0];if(o&&!s)return aX("open --relaunch requires an app argument.");let l=function(e){let{shouldRelaunch:t,openTarget:r,platform:a}=e;return t?r&&tQ(r)?aX("open --relaunch does not support URL targets."):"android"===a&&r&&"binary"===tj(r)?aX(tZ(r)):null:null}({shouldRelaunch:o,openTarget:s,platform:t.flags?.platform==="android"?"android":void 0});if(l)return l;let u=await X(t.flags??{}),d=aQ(u,t.flags?.surface,s);if("string"!=typeof d)return d;let c=aZ({shouldRelaunch:o,openTarget:s,surface:d,device:u});return c||await J(a3,u.id,async()=>{let e=n.toArray().find(e=>e.device.id===u.id);if(e)return ey(t,e)?H("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."}):H("DEVICE_IN_USE",`Device is already in use by session "${e.name}".`,{session:e.name,deviceId:u.id,deviceName:u.name,hint:Y(e,"device-in-use")});let i=await a0({req:t,sessionName:r,sessionStore:n,device:u,surface:d,openTarget:s,onIosSimulatorColdBootStart:tf({req:t,logPath:a,device:u,surface:d,openTarget:s})});return"response"===i.type?i.response:await a4({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 a7(e){if(!1===e.booted)return{success:!0,exitCode:0,stdout:"",stderr:""};try{return at(e)?await a9(e):await nt(e)}catch(t){let e=s(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function a9(e){let t=await t4(e);return t.success?t:"Shutdown"===await ne(e)?{...t,success:!0,exitCode:0}:t}async function ne(e){try{return await t8(e)}catch{return null}}async function nt(e){let t=await tB(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 nr(e){let{device:t,shutdownRequested:r}=e;if(r&&(at(t)||"android"===t.platform&&"emulator"===t.kind))return await a7(t)}async function na(e){let t,{req:r,sessionName:a,logPath:n,sessionStore:i,leaseRegistry:o,leaseLifecycleProvider:s}=e,l=i.get(a);if(!l)return await nn(r,n);try{var u,d,c;(await eU(l),await ea(l,"session-close"),await $(l),await eg(l),await eG(l),u=r,d=l,c=u,(c.positionals?.length??0)>0||"web"===d.device.platform)&&(to(l.device.platform)&&!at(l.device)&&await q(l),await f(l.device,"close",r.positionals??[],r.flags?.out,{...eN(n,r.flags,l.appBundleId,l.trace?.outPath)}),await aa(l.device,300));to(l.device.platform)&&(!at(l.device)||r.flags?.shutdown||l.recording||l.lease||l.device.simulatorSetPath)?await q(l):to(l.device.platform)&&(t5({level:"debug",phase:"ios_runner_retained_after_close",data:{session:l.name,deviceId:l.device.id}}),N(l.device.id));let e=i.getRuntimeHints(a);am(e)&&l.appBundleId&&await ag({device:l.device,appId:l.appBundleId}).catch(()=>{}),tq(i,l,r,"close",{session:l.name,...tk(`Closed: ${l.name}`)}),r.flags?.saveScript&&(l.recordSession=!0),i.writeSessionLog(l),await ed(a).catch(()=>{})}finally{try{t=await z({session:l,leaseRegistry:o,leaseLifecycleProvider:s})}finally{i.delete(a)}}let p=await nr({device:l.device,shutdownRequested:r.flags?.shutdown});return p?{ok:!0,data:tO({session:l.name,shutdown:p,...t?{provider:t}:{}},`Closed: ${l.name}`)}:{ok:!0,data:{session:l.name,...tk(`Closed: ${l.name}`),...t?{provider:t}:{}}}}async function nn(e,t){if(!e.positionals||0===e.positionals.length)return H("SESSION_NOT_FOUND","No active session");let r=await an({session:void 0,flags:e.flags,ensureReady:!0});return await f(r,"close",e.positionals,e.flags?.out,{...eN(t,e.flags)}),await aa(r,300),{ok:!0,data:{app:e.positionals[0],...tk(`Closed: ${e.positionals[0]}`)}}}let ni={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)}},no={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 ns(e){let{req:r,command:a,sessionName:n,sessionStore:i,deployOps:o}=e,s=i.get(n),l=r.flags??{},u=ar(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:H("INVALID_ARGS","install requires: install <path-to-app-binary>")}}return r&&a?{ok:!0,app:r,appPathInput:a}:{ok:!1,response:H("INVALID_ARGS","reinstall requires: reinstall <app> <path-to-app-binary>")}}(a,r.positionals??[]);if(!d.ok)return d.response;let{app:c,appPathInput:p}=d,f=r.meta?.uploadedArtifactId;try{var m,h,g,w,v,y,A;let e,n,u=f?eV(f,r.meta?.tenantId):ex.expandHome(p);if(!t.existsSync(u))return H("INVALID_ARGS",`App binary not found: ${u}`);let d=await an({session:s,flags:l,ensureReady:!1}),b=ee(a,d);if(b)return b;let S=tl(d)?(m=c,h=u,e=(g=await o.ios(d,c,u)).bundleId,{app:m||e||g.launchTarget||h,appPath:h,platform:"ios",...e?{appId:e,bundleId:e}:{},appName:g.appName,launchTarget:g.launchTarget}):(w=c,v=u,n=(y=await o.android(d,c,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=tO(S,(A=S,`Installed: ${A.appName??tD(A)}`));return tq(i,s,r,a,I),{ok:!0,data:I}}finally{f&&C(f)}}async function nl(e,t,r){return await t6(e,t,r)}async function nu(e){let{req:t,sessionName:r,sessionStore:a}=e;if("session_list"===t.command){let e=eW(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:eA(t),platform:tr(e.device),...to(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,...to(e.device.platform)&&!te(e.device)&&{device_udid:e.device.id,ios_simulator_device_set:e.device.simulatorSetPath??null}}})}}}if("devices"===t.command)try{let e=tX(t.flags?.androidDeviceAllowlist),r=t.flags?.platform,a=tt({simulatorSetPath:tK(t.flags?.iosSimulatorDeviceSet),platform:r,target:t.flags?.target}),n=await eD({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,ti(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:tr({platform:r.platform,appleOs:t}),...to(r.platform)&&t?{appleOs:t}:{}}));return{ok:!0,data:{devices:o}}}catch(t){let e=o(t);return H(e.code,e.message,e.details)}if("apps"===t.command){let e=a.get(r),n=t.flags??{},i=ar(t.command,e,n);if(i)return i;let o=await an({session:e,flags:n,ensureReady:!0}),s=ee("apps",o);if(s)return s;let l=t9(t.flags?.appsFilter);return to(o.platform)?{ok:!0,data:{apps:(await re(o,l)).map(e=>e.name&&e.name!==e.bundleId?`${e.name} (${e.bundleId})`:e.bundleId)}}:{ok:!0,data:{apps:(await t0(o,l)).map(e=>e.name&&e.name!==e.package?`${e.name} (${e.package})`:e.package)}}}return null}async function nd(e){let{ensureAndroidEmulatorBooted:t}=await import("./3340.js");return await t(e)}let nc='iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).',np='macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").';async function nf(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 H("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=ar("appstate",n,i);if(s)return s;let l=to(n?.device.platform)&&!!n&&0===eq(n,i).length;if("ios"===o&&!l)return H("SESSION_NOT_FOUND",nc);if("macos"===o&&!l)return H("SESSION_NOT_FOUND",np);if(l&&n){let e=n.appName??n.appBundleId;if(!n.appName&&!n.appBundleId){if(te(n.device)&&n.surface&&"app"!==n.surface&&"frontmost-app"!==n.surface)return{ok:!0,data:{platform:tr(n.device),appName:n.surface,appBundleId:n.appBundleId,source:"session",surface:n.surface}};let e=te(n.device)?"macOS":"iOS";return H("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:tr(n.device),appName:e??"unknown",appBundleId:n.appBundleId,source:"session",surface:n.surface??"app",...tl(n.device)?{device_udid:n.device.id,ios_simulator_device_set:n.device.simulatorSetPath??null}:{}}}}let u=await an({session:n,flags:i,ensureReady:!0});if(tl(u))return H("SESSION_NOT_FOUND",nc);if(te(u))return H("SESSION_NOT_FOUND",np);if("web"===u.platform)return H("UNSUPPORTED_OPERATION","appstate is not supported on web.");let{getAndroidAppState:d}=await import("./3340.js"),c=await d(u);return{ok:!0,data:{platform:"android",package:c.package,activity:c.activity}}}async function nm(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=ar(t.command,i,s);if(l)return l;let u="android"===(s.platform??i?.device.platform),d=!0===s.headless;if(d&&!u)return H("INVALID_ARGS","boot --headless is supported only for Android emulators.");let c=ao({flags:s,sessionDevice:i?.device}),p=u&&!!c,f=!1;try{e=await an({session:i,flags:s,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0})}catch(r){let t=o(r);if(u&&d&&!c&&"DEVICE_NOT_FOUND"===t.code)return H("INVALID_ARGS","boot --headless requires --device <avd-name> (or an Android emulator session target).");if(!p||"DEVICE_NOT_FOUND"!==t.code||!c)throw r;e=await nd({avdName:c,serial:s.serial,headless:d}),f=!0}if(s.target&&(e.target??"mobile")!==s.target)return H("DEVICE_NOT_FOUND",`No ${e.platform} device found matching --target ${s.target}.`);if(u&&d){if("android"!==e.platform||"emulator"!==e.kind)return H("INVALID_ARGS","boot --headless is supported only for Android emulators.");if(!f){let t=ao({flags:s,sessionDevice:i?.device,resolvedDevice:e});if(!t)return H("INVALID_ARGS","boot --headless requires --device <avd-name> (or an Android emulator session target).");e=await nd({avdName:t,serial:s.serial,headless:!0})}await tu(e)}else"android"===e.platform&&"emulator"===e.kind&&!0!==e.booted?(e=await nd({avdName:e.name,serial:s.serial,headless:!1}),await tu(e)):("android"!==e.platform||!0!==e.booted)&&await tu(e,{onIosSimulatorColdBootStart:tp({req:t,logPath:a,device:e,enabled:!0})});let m=ee("boot",e);return m||(tl(e)&&"simulator"===e.kind&&e4(e,{}),{ok:!0,data:{platform:tr(e),target:e.target??"mobile",device:e.name,id:e.id,kind:e.kind,booted:!0,...to(e.platform)&&e.appleOs?{appleOs:e.appleOs}:{}}})}if("shutdown"===t.command){var i;let e,a=n.get(r),o=t.flags??{},s=ar(t.command,a,o);if(s)return s;let l=await an({ensureReady:!1,flags:o,session:a}),u=ee("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 H("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:tr(l),target:l.target??"mobile",device:l.name,id:l.id,kind:l.kind});let d=await a7(l);return d.success?{ok:!0,data:{platform:tr(l),target:l.target??"mobile",device:l.name,id:l.id,kind:l.kind,shutdown:d,...to(l.platform)&&l.appleOs?{appleOs:l.appleOs}:{}}}:H(d.error?.code??"COMMAND_FAILED",(i=d,(e=i.error?.message??i.stderr.trim()).length>0?e:"Shutdown failed"),{platform:tr(l),target:l.target??"mobile",device:l.name,id:l.id,kind:l.kind,shutdown:d})}return"appstate"===t.command?await nf({req:t,sessionName:r,sessionStore:n}):null}async function nh(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===aq&&t.push({durationMs:Math.max(0,Math.round(e.durationMs)),measuredAt:e.measuredAt,method:aq,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:aq,sampleCount:i.length,samples:i}:{available:!1,reason:"No startup sample captured yet. Run open <app|url> in this session first.",method:aq},{session:r.name,platform:tr(r.device),device:r.device.name,deviceId:r.device.id,metrics:{startup:s,...{fps:nv(),memory:{available:!1,reason:aU},cpu:{available:!1,reason:aU}}},sampling:{startup:{method:aq,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:e7,description:eY,unit:"kB"},cpu:{method:eR,description:eb,unit:"percent"},fps:{method:V,description:eB,unit:"percent",primaryField:"droppedFramePercent",window:"since previous Android gfxinfo reset or app process start",resetsAfterRead:!0,relatedActionsLimit:12}}:eu(a.device)}});return nI(e)&&(e.appBundleId?"android"===e.device.platform?await ny(u,e,e.appBundleId,t):await nA(u,e,e.appBundleId):(n=u,l=n_(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 ng(e,t={}){var r,a;let n={session:(r=e).name,platform:tr(r.device),device:r.device.name,deviceId:r.device.id,metrics:{fps:nv()},sampling:{fps:"android"===(a=r).device.platform?{method:V,description:eB,unit:"percent",primaryField:"droppedFramePercent",window:"since previous Android gfxinfo reset or app process start",resetsAfterRead:!0,relatedActionsLimit:12}:F(a.device)}};return nI(e)&&(e.appBundleId?await nS(n,e,e.appBundleId,t):n.metrics.fps={available:!1,reason:n_(e)}),n}async function nw(e,t){var r,a;let n={session:(r=e).name,platform:tr(r.device),device:r.device.name,deviceId:r.device.id,sampling:{memory:"android"===(a=r).device.platform?{method:e7,description:eY,unit:"kB",topConsumerLimit:5}:eu(a.device).memory,snapshot:"android"===r.device.platform?{method:eo,description:en,defaultKind:"android-hprof",artifactOnly:!0}:{method:eJ,description:p,defaultKind:"memgraph",artifactOnly:!0}}};if(!nI(e)){if("snapshot"===t.action){let r=nM(e,t.kind);return n.artifact=nP(e,r),n.support=nO(n.artifact.support)??nL(e),n}return n.metrics={memory:{available:!1,reason:aU}},n}return"sample"===t.action?n.metrics={memory:await nD(e,t)}:(n.artifact=await nR(e,t),n.support=nO(n.artifact.support)??nL(e)),n}function nv(){return{available:!1,reason:"Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions."}}async function ny(e,t,r,a){let n=await nk(t,r,a);nb(e,t,n)}async function nA(e,t,r){let a=await nN(t,r);nb(e,t,a)}function nb(e,t,r){e.metrics.memory=nC(r.memory),e.metrics.cpu=nC(r.cpu),e.metrics.fps=nE(nC(r.fps),t)}async function nS(e,t,r,a){let n="android"===t.device.platform?await n$(e5(t.device,r,{adb:a.androidAdb})):await n$(b(t.device,r));e.metrics.fps=nE(nC(n),t)}function nI(e){return ep(e.device.platform)?.perf?.supportsMetrics(e.device)??!1}function n_(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 nk(e,t,r){let a={adb:r.androidAdb},[n,i,o]=await Promise.allSettled([Z(e.device,t,a),ei(e.device,t,a),e5(e.device,t,a)]);return{memory:n,cpu:i,fps:o}}async function nN(e,t){let r=await n$(b(e.device,t)),a=await n$(e2(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 nD(e,t){return e.appBundleId?nC("android"===e.device.platform?await n$(Z(e.device,e.appBundleId,{adb:t.androidAdb})):await n$(nx(e))):{available:!1,reason:n_(e)}}async function nx(e){if(!e.appBundleId)throw new l("INVALID_ARGS",n_(e));return(await e2(e.device,e.appBundleId)).memory}async function nR(e,t){if(!e.appBundleId)throw new l("INVALID_ARGS",n_(e),{hint:"Run open <app> first so perf memory snapshot can resolve the app process."});let a=nM(e,t.kind),n=function(e,t){if(e.out)return ex.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?nP(e,a):await R(e.device,e.appBundleId,n,{adb:t.androidAdb}):"memgraph"!==a?nP(e,a):await S(e.device,e.appBundleId,n)}function nM(e,t){return t||("android"===e.device.platform?"android-hprof":"memgraph")}function nP(e,t){var r,a;let n=nL(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."}:to(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 nL(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."}:to(e.device.platform)?{...eM(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 nO(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:void 0}async function n$(e){try{return{status:"fulfilled",value:await e}}catch(e){return{status:"rejected",reason:e}}}function nC(e){if("fulfilled"===e.status)return{available:!0,...e.value};let t=s(e.reason);return{available:!1,reason:t.message,error:t}}function nE(e,t){var r,a;let n,i;if(!0!==e.available)return e;let o=(r=t.actions,n=nV((a=e).windowStartedAt),i=nV(a.windowEndedAt)??nV(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 nV(e){if("string"!=typeof e)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}async function nF(e){var t,r,a,n,i,o,l,u,d,c;let p,f,m,h,g,w,v=(t=e.req,r=e.area,p=(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=p,f=nT(i,1),m=nT(i,2),h=nT(i,3),th(f)?"start"!==(l=m)&&"stop"!==l&&"report"!==l?H("INVALID_ARGS","perf cpu profile action must be start, stop, or report"):"simpleperf"!==h?H("INVALID_ARGS","perf cpu profile requires --kind simpleperf"):{ok:!0,area:"cpu",subject:f,action:m,kind:h,outPath:o}:H("INVALID_ARGS",tT)):(u=t,d=p,g=nT(u,1),w=nT(u,2),"start"!==(c=g)&&"stop"!==c?H("INVALID_ARGS","perf trace action must be start or stop"):tS(w)?"perfetto"!==w?H("INVALID_ARGS","perf trace requires --kind perfetto"):{ok:!0,area:"trace",action:g,kind:w,outPath:d}:H("INVALID_ARGS",tR)));if(!v.ok)return v;let{session:y}=e;if("android"!==y.device.platform)return H("UNSUPPORTED_OPERATION","Android native perf collectors are supported only on Android sessions.");if(!y.appBundleId)return H("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 nG(e,y,y.appBundleId,v):await nH(e,y,y.appBundleId,v);return{ok:!0,data:t}}catch(e){return{ok:!1,error:s(e)}}}function nT(e,t){return(e.positionals?.[t]??"").toLowerCase()}function nq(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 nU(e,t,a){var n,i,o;let s;return t?ex.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 nG(e,t,r,a){if("start"===a.action){nB(t);let n=nU(e,a.outPath,"cpu.perf.data"),i=await y(t.device,r,n,{adb:e.androidAdbExecutor});return nq(e,i)}let n=nj(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=nU(e,a.outPath,"cpu-report.json");return await eX(t.device,n,r,{adb:e.androidAdbExecutor})}let i=nK(e,a.outPath,n),o=await ek(t.device,n,i,{adb:e.androidAdbExecutor});return nq(e,o)}async function nH(e,t,r,a){if("start"===a.action){nB(t);let n=nU(e,a.outPath,"app.perfetto-trace"),i=await D(t.device,r,n,{adb:e.androidAdbExecutor});return nq(e,i)}let n=nj(t,"trace",a.kind),i=nK(e,a.outPath,n),o=await eP(t.device,n,i,{adb:e.androidAdbExecutor});return nq(e,o)}function nB(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 nK(e,t,r){return t?nU(e,t,r.outPath):r.outPath}function nj(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 nz(e){if(!I(e))return;let{macOsScreenCaptureKitAudioProbeBackend:t}=await import("./audio-probe.js");return t}O();let nW=["probe"],nJ=["start","status","stop"],nY=`audio probe requires ${nJ.join(", ")}`;async function nX(e){let t=function(e){var t;let r,a=(r=(t=e).sessionStore.get(t.sessionName))?e3("audio",r.device)?{ok:!0,session:r}:H("UNSUPPORTED_OPERATION","audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts"):H("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(),nW.includes(t)?!"probe":!void 0)return H("INVALID_ARGS","audio requires probe");let a=(r=(e.positionals?.[1]??"status").toLowerCase(),nJ.includes(r)?r:void 0);return a?{ok:!0,probeAction:a}:H("INVALID_ARGS",nY)}(e.req);if(!n.ok)return n;let i=function(e,t){if("start"!==t&&e.positionals&&e.positionals.length>2)return H("INVALID_ARGS","audio probe duration and bucket are only supported with audio probe start");let r=nZ(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 H("INVALID_ARGS",r.message);let a=nZ(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?H("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 nz(t.session.device);if(r)return await nQ(e,t,r);let a=rt();if(!a.probeAudio)return H("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 nQ(e,t,r){try{return{ok:!0,data:await B({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 nZ(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 n0(e,t){let r,a,n=(r=e.req.positionals??[],"cpu"===(a=r[0]?.toLowerCase())?function(e){if(e[1]?.toLowerCase()!=="profile")return H("INVALID_ARGS","perf cpu requires profile");let t=n1(e[2],"perf cpu profile",!0);if(!t.ok)return t;let r=n3(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=n1(e[1],"perf trace",!1);if(!t.ok)return t;let r=n3(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):H("INVALID_ARGS",tw));if(!n.ok)return n;if("android"===t.device.platform)return H("UNSUPPORTED_OPERATION","Android native profiling belongs to the Android perf rollout; Apple xctrace perf supports iOS and macOS sessions only.");if(!to(t.device.platform))return H("UNSUPPORTED_OPERATION",`Apple xctrace perf is not supported on ${t.device.platform}.`);if(!t.appBundleId)return H("INVALID_ARGS","Apple xctrace perf requires an active app session. Run open <app> first.");try{if("start"===n.action)return await n2(e,t,n);if("stop"===n.action)return await n5(e,t,n);return await n4(e,t,n)}catch(e){return{ok:!1,error:s(e)}}}function n1(e,t,r){let a=e?.toLowerCase();return"start"===a||"stop"===a||r&&"report"===a?{ok:!0,value:a}:H("INVALID_ARGS",r?`${t} requires start, stop, or report`:`${t} requires start or stop`)}function n3(e){return e?.toLowerCase()==="xctrace"?{ok:!0}:H("INVALID_ARGS","perf native collection currently supports --kind xctrace")}async function n2(e,t,r){if(t.applePerf?.active)return H("INVALID_ARGS","Apple xctrace perf capture already in progress");let a=r.template??("cpu-profile"===r.mode?"Time Profiler":"Animation Hitches"),n=n6(e,r),i=await el({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=n7("started",i);return n8(e,t,o),{ok:!0,data:o}}async function n5(e,t,r){var a,n,i,s,l,u,d;let c,p=t.applePerf?.active;if(!p)return H("INVALID_ARGS","no active Apple xctrace perf capture");let f=r.outPath?ex.expandHome(r.outPath,e.req.meta?.cwd):p.outPath;try{c=await M(p,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=c,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=n7("stopped",c);return n8(e,t,m),{ok:!0,data:m}}async function n4(e,t,r){var a;let n;if("cpu-profile"!==r.mode)return H("INVALID_ARGS","perf trace does not support report");if(t.applePerf?.active)return H("INVALID_ARGS","perf cpu profile report requires a stopped profile trace; stop the active capture first.");let i=n6(e,r),o=(a=t,(n=r.tracePath??a.applePerf?.lastProfileTracePath??a.applePerf?.active?.outPath)?{ok:!0,value:n}:H("INVALID_ARGS","perf cpu profile report requires a stopped profile trace or tracePath option"));if(!o.ok)return o;let s={perf:"reported",...await L({tracePath:ex.expandHome(o.value,e.req.meta?.cwd),outPath:i,mode:r.mode,template:t.applePerf?.lastProfileTemplate??r.template,appBundleId:t.appBundleId})};return n8(e,t,s),{ok:!0,data:s}}function n8(e,t,r){tq(e.sessionStore,t,e.req,"perf",r)}function n6(e,t){if(t.outPath)return ex.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 n7(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 n9=`logs requires ${tL.slice(0,-1).join(", ")}, or ${tL.at(-1)}`,ie=["dump","log"],it=`network requires ${ie.join(" or ")}`,ir=`network include mode must be one of: ${ta.join(", ")}`,ia={path:({session:e,sessionName:t,sessionStore:r})=>{var a,n;let i,o,s;return a=e,n=t,o=Q(i=r.resolveAppLogPath(n)),{ok:!0,data:{path:i,active:(s=ii(a)).active,state:s.state,backend:s.backend,sizeBytes:o.sizeBytes,modifiedAt:o.modifiedAt,startedAt:s.startedAt?new Date(s.startedAt).toISOString():void 0,failureCode:s.failureCode,failureMessage:s.failureMessage,hint:s.hint??'Grep the file for token-efficient debugging, e.g. grep -n "Error\\|Exception" <path>',notes:s.notes}}},doctor:({session:e,sessionName:t,sessionStore:r})=>im(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})=>ih(e,t,r,a),start:({session:e,sessionName:t,sessionStore:r})=>ig(e,t,r),stop:({session:e,sessionName:t,sessionStore:r})=>iw(e,t,r)};function ii(e){var t,r;if(e.appLog){let r=e.appLog.getState();return{active:"active"===r||"recovering"===r,state:r,backend:e.appLog.backend,startedAt:e.appLog.startedAt,notes:"failed"===(t=r)?["The app log stream process exited with an error. Run logs doctor for backend diagnostics."]:"ended"===t?["The app log stream process ended. Run logs clear --restart before the next capture window."]:void 0}}return e.appLogFailure?{active:!1,state:"failed",backend:e.appLogFailure.backend,failureCode:e.appLogFailure.code,failureMessage:e.appLogFailure.message,hint:e.appLogFailure.hint,notes:[(r=e.appLogFailure).hint?`${r.message} ${r.hint}`:r.message]}:{active:!1,state:"inactive",backend:eI(e.device)}}function io(e,t,r){return{...r,platform:e.device.platform,outPath:t}}function is(e,t,r,a){let n=s(a);return e.set(t,{...r,appLog:void 0,appLogFailure:{backend:eI(r.device),code:n.code,message:n.message,hint:n.hint}}),{ok:!1,error:n}}async function il(e){let{req:t}=e;return"perf"===t.command?iu(e):"logs"===t.command?ip(e):"network"===t.command?iv(e):"audio"===t.command?await nX(e):null}async function iu(e){var t;let{req:r,sessionName:a,sessionStore:n,androidAdbExecutor:i}=e,o=n.get(a);if(!o)return H("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 nF({req:r,sessionName:a,sessionStore:n,session:o,androidAdbExecutor:i,area:u}):await n0(e,o);let d=function(e){var t,r,a,n,i,o,u,d,c,p;let f,m,h=tM(f=(e.positionals?.[0]??"metrics").toString().toLowerCase())?f:void 0;if(!h)return H("INVALID_ARGS",tw);if("cpu"===h||"trace"===h)return{ok:!0,native:!0};let g=tm(m=(e.positionals?.[1]??"sample").toString().toLowerCase())?m:void 0;if(!g)return H("INVALID_ARGS",ty);let w=function(e){if(void 0!==e)return"string"==typeof e&&tS(e)?e:new l("INVALID_ARGS",tR)}(e.flags?.kind);if(w instanceof l)return{ok:!1,error:s(w)};let v=(t=h,r=g,("memory"===t?ic(r)?void 0:H("INVALID_ARGS","perf memory requires sample or snapshot"):"sample"!==r?H("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 H("INVALID_ARGS","--out is only supported with perf memory snapshot")}(a.flags?.out,n,i)??(u=o,d=n,c=i,u?"memory"!==d||"snapshot"!==c?H("INVALID_ARGS","--kind is only supported with perf memory snapshot"):tI(u)?void 0:H("INVALID_ARGS",tx):void 0)));return v||{ok:!0,native:!1,area:h,action:g,kind:w,out:"string"==typeof(p=e.flags?.out)&&p.length>0?p:void 0}}(r);if(!d.ok)return d;if(d.native)return await n0(e,o);try{return{ok:!0,data:await id(e,o,d)}}catch(e){return{ok:!1,error:s(e)}}}async function id(e,t,r){let{sessionName:a,sessionStore:n,androidAdbExecutor:i}=e;return"memory"===r.area?await nw(t,{action:function(e){if(ic(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 ng(t,{androidAdb:i}):await nh(t,{androidAdb:i})}function ic(e){return"sample"===e||"snapshot"===e}async function ip(e){var t;let r,a,{req:n,sessionName:i,sessionStore:o}=e,s=o.get(i);if(!s)return H("SESSION_NOT_FOUND","logs requires an active session");let l=ee("logs",s.device);if(l)return l;let u=(t=n,r=(t.positionals?.[0]??"path").toLowerCase(),a=!!t.flags?.restart,tL.includes(r)?a&&"clear"!==r?H("INVALID_ARGS","logs --restart is only supported with logs clear"):{ok:!0,action:r,restart:a}:H("INVALID_ARGS",n9));return u.ok?await ia[u.action]({...e,session:s,restart:u.restart}):u}async function im(e,t,r){let a=r.resolveAppLogPath(t),n=await eK(e.device,e.appBundleId),i=ii(e);return{ok:!0,data:{path:a,active:i.active,state:i.state,backend:i.backend,checks:n.checks,failureCode:i.failureCode,failureMessage:i.failureMessage,hint:i.hint,notes:et([...n.notes,...i.notes??[]])}}}async function ih(e,t,r,a){if(e.appLog&&!a)return H("INVALID_ARGS","logs clear requires logs to be stopped first; run logs stop");let n=r.resolveAppLogPath(t);if(!a){let a=ec(n);return r.set(t,{...e,appLogFailure:void 0}),{ok:!0,data:a}}let i=e.appBundleId;if(!i)return H("INVALID_ARGS","logs clear --restart requires an app session; run open <app> first");e.appLog&&await ez(e.appLog);let o=ec(n),s=r.resolveAppLogPidPath(t);try{let a=await e9(e.device,i,n,s);return r.set(t,{...e,appLog:io(e,n,a),appLogFailure:void 0}),{ok:!0,data:{...o,restarted:!0}}}catch(a){return is(r,t,e,a)}}async function ig(e,t,r){if(e.appLog)return H("INVALID_ARGS","app log already streaming; run logs stop first");if(!e.appBundleId)return H("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 e9(e.device,e.appBundleId,a,n);return r.set(t,{...e,appLog:io(e,a,i),appLogFailure:void 0}),{ok:!0,data:{path:a,started:!0}}}catch(a){return is(r,t,e,a)}}async function iw(e,t,r){if(!e.appLog)return H("INVALID_ARGS","no app log stream active");let a=e.appLog.outPath;return await ez(e.appLog),r.set(t,{...e,appLog:void 0,appLogFailure:void 0}),{ok:!0,data:{path:a,stopped:!0}}}async function iv(e){let t=function(e){let{req:t,sessionName:r,sessionStore:a}=e,n=a.get(r);if(!n)return H("SESSION_NOT_FOUND","network requires an active session");let i=ee("network",n.device);if(i)return i;let o=(t.positionals?.[0]??"dump").toLowerCase();if(!ie.includes(o))return H("INVALID_ARGS",it);let s=t.positionals?.[1]?Number.parseInt(t.positionals[1],10):25;if(!Number.isInteger(s)||s<1||s>200)return H("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 H("INVALID_ARGS","network include mode was provided both positionally and via --include with different values");let a=(r??t??"summary").toLowerCase();return ta.includes(a)?{ok:!0,include:a}:H("INVALID_ARGS",ir)}(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 iy({include:r,maxEntries:a});let i=await ew({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 iy(e){let t=rt();if(!t.dumpNetwork)return H("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 iA(e,t,r){var a,n;if(null==e)return rm("open",[rv(rg(t,"launchApp"),r)]);if("string"==typeof e)return rm("open",[rv(e,r)]);if(!rh(e))throw new l("INVALID_ARGS","launchApp expects a string or map.");rw(e,"launchApp",["appId","stopApp","clearState","clearKeychain","arguments","permissions","launchArguments"]),i_(e,"permissions"),i_(e,"clearKeychain");let i=rv("string"==typeof e.appId?e.appId:rg(t,"launchApp"),r),o=(a=e,n=r,[...iS(a.arguments,"launchApp.arguments",n),...iS(a.launchArguments,"launchApp.launchArguments",n)]),s=!0===e.clearState;return rm("open",[i],{...!s&&(!0===e.stopApp||o.length>0)?{relaunch:!0}:{},...s?{clearAppState:!0}:{},...o.length>0?{launchArgs:o}:{}})}function ib(e,t,r){if(null==e)return rm("close",[rv(rg(t,"stopApp"),r)]);if("string"==typeof e)return rm("close",[rv(e,r)]);throw new l("INVALID_ARGS","stopApp expects a string appId or no value.")}function iS(e,t,r){if(null==e)return[];if("string"==typeof e)return[rv(e,r)];if(Array.isArray(e))return e.map((e,a)=>iI(e,`${t}[${a}]`,r));if(rh(e))return Object.entries(e).flatMap(([e,a])=>[rv(e,r),iI(a,`${t}.${e}`,r)]);throw new l("INVALID_ARGS",`${t} expects a string, list, or map.`)}function iI(e,t,r){if("string"==typeof e)return rv(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 i_(e,t){if(void 0!==e[t])throw rb(`Maestro launchApp field "${t}" is not supported yet.`)}let ik="__maestroRunScript",iN="__maestroAssertVisible",iD="__maestroAssertNotVisible",ix="__maestroPressEnter",iR="__maestroWaitForAnimationToEnd",iM="__maestroScrollUntilVisible",iP="__maestroSwipeScreen",iL="__maestroSwipeOn",iO="__maestroTapOn",i$="__maestroTapPointPercent";function iC(e){if(null==e)return rm("type",["\b".repeat(50)]);if("number"==typeof e&&Number.isInteger(e)&&e>0)return rm("type",["\b".repeat(e)]);if(!rh(e))throw new l("INVALID_ARGS","eraseText expects empty, a positive count, or a map.");if(rw(e,"eraseText",["charactersToErase"]),void 0===e.charactersToErase)return rm("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 rm("type",["\b".repeat(e.charactersToErase)])}function iE(e){return"number"==typeof e&&Number.isFinite(e)?String(Math.max(16,Math.floor(e))):void 0}function iV(e,t){let r=e.toLowerCase();switch(r){case"up":case"down":case"left":case"right":return r;default:throw rb(`Maestro ${t} must be UP, DOWN, LEFT, or RIGHT.`)}}function iF(e){return iV(e,"swipe direction")}function iT(e,t,r=[],a){if("string"==typeof e)return iq(rv(e,a));if(!rh(e))throw new l("INVALID_ARGS",`${t} expects a string or selector map.`);rw(e,t,["id","text","enabled","selected",...r]);let n=[],i=[];if("boolean"==typeof e.enabled&&i.push(iG("enabled",String(e.enabled))),"boolean"==typeof e.selected&&i.push(iG("selected",String(e.selected))),"string"==typeof e.id&&n.push(iG("id",rv(e.id,a)),...i),"string"==typeof e.text&&0===n.length)return iq(rv(e.text,a),i);if("string"==typeof e.label&&0===n.length&&n.push(iG("label",rv(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 iq(e,t=[]){return[[iG("label",e),...t].join(" "),[iG("text",e),...t].join(" "),[iG("id",e),...t].join(" ")].join(" || ")}function iU(e){let t=iE(e.duration);return t?[t]:[]}function iG(e,t){return`${e}=${JSON.stringify(t)}`}function iH(e){var t,r;if(!rh(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 iB(e){let t=iH(e)??{};return{...t,maestro:{...t.maestro??{},allowNonHittableCoordinateFallback:!0}}}function iK(e){let t={doubleTap:!0};return rh(e)&&"number"==typeof e.delay&&Number.isInteger(e.delay)&&(t.intervalMs=Math.max(0,e.delay)),t}class ij{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 iz(e,t,r){return{...rm(e,t),replayControl:r}}function iW(e,t,r){let a="string"==typeof e?rv(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 iJ=`
|
|
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{S as v,_ as y,b,x as ee}from"./sdk-batch.js";import{$t as x,Bt as S,Gt as te,Ht as ne,It as re,Jn as ie,Jt as ae,Kt as oe,Qn as C,Rn as se,Rt as ce,Tn as le,Ut as ue,Yt as de,Zn as fe,an as pe,ct as me,dt as he,f as ge,ht as _e,in as ve,q as ye,qt as be,ut as xe,wn as Se,zn as Ce}from"./tv-remote.js";import{i as we,r as Te}from"./output-path.js";import{a as Ee,n as De,t as Oe}from"./snapshot-diagnostics.js";import{n as ke}from"./version.js";import{t as w}from"./timeouts.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{f as qe,h as Je}from"./runtime.js";import{f as Ye,p as Xe,s as Ze}from"./app-lifecycle.js";import{D as Qe,O as $e,S as et,b as tt,k as nt,p as rt,v as it,x as at}from"./android-input-ownership.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 E,A as At,B as jt,C as Mt,Cn as Nt,D as Pt,E as Ft,F as It,Gt as D,I as Lt,Kt as Rt,L as zt,M as Bt,Mt as Vt,N as Ht,Nt as Ut,O as Wt,P as Gt,R as Kt,S as qt,Sn as Jt,St as O,T as Yt,Tn as Xt,Wt as Zt,Xt as Qt,Zt as $t,_ as en,_n as tn,_t as nn,a as rn,an,at as on,b as sn,bn as cn,c as ln,cn as un,ct as dn,d as fn,dn as pn,dt as mn,f as hn,fn as gn,g as _n,gn as vn,gt as yn,h as bn,hn as xn,ht as Sn,i as Cn,in as wn,it as Tn,j as En,k as Dn,l as On,ln as kn,lt as An,m as jn,mn as Mn,mt as Nn,n as Pn,nn as Fn,nt as In,o as Ln,on as Rn,ot as zn,p as Bn,pn as Vn,pt as Hn,r as Un,rn as Wn,rt as Gn,s as Kn,sn as qn,st as Jn,tn as k,u as Yn,un as Xn,ut as Zn,v as Qn,vn as $n,vt as er,w as tr,wn as nr,x as rr,xn as A,y as ir,z as ar,zt as j}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 L,u as br,v as xr,w as Sr,x as Cr,y as wr}from"./points.js";import{n as Tr}from"./provider.js";import{a as R,i as Er,n as Dr,r as Or,t as kr}from"./apple-runner-options.js";import{t as Ar}from"./handler-utils.js";import{l as jr}from"./apps.js";import{a as Mr,n as Nr}from"./simulator.js";import{t as Pr}from"./record-trace-recording.js";import z from"node:fs";import B from"node:path";import{access as Fr}from"node:fs/promises";import{setTimeout as Ir}from"node:timers/promises";import Lr from"node:vm";function Rr(e){throw new t(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function zr(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:Rr(n)}}function Br(e){let t=zr(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:cn(n,e.meta?.tenantId)},cleanup:()=>{$n(n)}}}function Vr(e){return e===`ios`||e===`android`?e:void 0}function Hr(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 Ur(e){let n=Vr(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 R(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 kn(e.flags??{});return await R(r),r}async function Wr(e){let{prepared:t,retention:n,req:r,session:i,sessionName:a}=e;if(n.enabled)return await fn({archivePath:t.archivePath,installablePath:t.installablePath,tenantId:r.meta?.tenantId,sessionName:i?a:void 0,ttlMs:n.ttlMs})}function Gr(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}function Kr(e){let{session:t,sessionStore:n,req:r,data:i}=e;Ar(n,t,r,`install_source`,i,{positionals:[]})}async function qr(t){let{req:n,sessionName:r,sessionStore:i}=t,a=i.get(r);try{let e=Br(n),t=Hr(n),o=await Ur({session:a,flags:n.flags}),s=k(`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 Jr({prepared:c,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Yr(o,c,e)})}let{prepareAndroidInstallArtifact:u}=await import(`./android-input-ownership.js`).then(e=>e.l),d=await u(e.source,{signal:l});return await Jr({prepared:d,retention:t,req:n,resolvedSourceCleanup:()=>e.cleanup(),session:a,sessionName:r,sessionStore:i,buildResult:async e=>await Xr(o,d,e)})}catch(t){return{ok:!1,error:e(t)}}}async function Jr(e){let t;try{t=await Wr(e);let n=await e.buildResult(t),r=le(n,ti(n));return Kr({session:e.session,sessionStore:e.sessionStore,req:e.req,data:r}),{ok:!0,data:r}}catch(n){throw t&&await On(t.materializationId,e.req.meta?.tenantId).catch(()=>{}),n}finally{await e.prepared.cleanup(),e.resolvedSourceCleanup()}}async function Yr(e,t,n){let r=await xn(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 Zr(t,r,n)}async function Xr(e,t,n){let r=await xn(e,t.installablePath,{packageNameHint:t.packageName}),i=await ei(e,t,r),{inferAndroidAppName:a}=await import(`./app-lifecycle.js`).then(e=>e.t),o=a(i);return{...Gr(n),packageName:i,...$r(r?.appName??o),launchTarget:r?.launchTarget??i}}function Zr(e,t,n){let r=Qr(e,t),i=t?.appName??e.appName;return{...Gr(n),bundleId:r,...$r(i),launchTarget:t?.launchTarget??r}}function Qr(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 $r(e){return e?{appName:e}:{}}async function ei(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 ti(e){return`Installed: ${pe(e)}`}async function ni(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 On(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(t){return{ok:!1,error:e(t)}}}function V(e){return c(e)&&e.kind===`simulator`}function ri(e){return e.platform===`android`&&e.kind===`emulator`}function H(e,t,n){return t||$t(n)?null:E(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function ii(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function ai(e,t){!V(e)||t<=0||await new Promise(e=>setTimeout(e,t))}async function U(e){let t=$t(e.flags)||!e.session?await kn(e.flags??{},{allowStoppedAndroidAvdPlaceholders:e.allowStoppedAndroidAvdPlaceholders}):await oi(e.session.device);return e.ensureReady!==!1&&await R(t),t}async function oi(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 kn(n)}catch(e){if(!(e instanceof t)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await kn({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function si(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 ci(e,t){return t?nn(t,e).length===0:!1}const li=`shared_prefs/ReactNativeDevPrefs.xml`,ui=`debug_http_host`,di=`dev_server_https`,fi=`RCT_jsLocation`,pi=`RCT_packager_scheme`,mi=`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.`,hi=[`<?xml version="1.0" encoding="utf-8" standalone="yes" ?>`,`<map>`,`</map>`,``].join(`
|
|
2
|
+
`);function gi(e){return Ve(e)!==void 0}async function _i(e){let{device:t,appId:n,runtime:r}=e;if(vn(t)||!n)return;let i=Ve(r);if(i){if(t.platform===`android`){await yi(t,n,i);return}c(t)&&t.kind===`simulator`&&await Ci(t,n,i)}}async function vi(e){let{device:t,appId:n}=e;if(n){if(t.platform===`android`){await bi(t,n);return}c(t)&&t.kind===`simulator`&&await wi(t,n)}}async function yi(e,t,n){Ai(t);let r=Ei(await xi(e,t),ui,`${n.host}:${n.port}`);r=Di(r,di,n.scheme===`https`),await Si(e,t,r)}async function bi(e,t){Ai(t);let n=await xi(e,t),r=ki(ki(n,ui),di);r!==n&&await Si(e,t,r)}async function xi(e,t){let n=await rt(e,[`shell`,`run-as`,t,`cat`,li],{allowFailure:!0});return n.exitCode===0?Ti(n.stdout):hi}async function Si(e,r,i){let a=[`shell`,`run-as`,r,`id`],o=await rt(e,a,{allowFailure:!0});if(o.exitCode!==0){let e=Ni(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?mi:`adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information.`}))}try{await rt(e,[`shell`,`run-as`,r,`mkdir`,`-p`,`shared_prefs`]),await rt(e,[`shell`,`run-as`,r,`tee`,li],{stdin:i.trimEnd()})}catch(e){let i=n(e);if(i.code===`TOOL_MISSING`)throw i;let a=Ni(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?mi:`adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command.`},i)}}async function Ci(e,t,n){await Tt(Dt(e,[`spawn`,e.id,`defaults`,`write`,t,fi,`-string`,`${n.host}:${n.port}`])),await Tt(Dt(e,[`spawn`,e.id,`defaults`,`write`,t,pi,`-string`,n.scheme]))}async function wi(e,t){await Tt(Dt(e,[`spawn`,e.id,`defaults`,`delete`,t,fi]),{allowFailure:!0}),await Tt(Dt(e,[`spawn`,e.id,`defaults`,`delete`,t,pi]),{allowFailure:!0})}function Ti(e){let t=e.trim();return!t.includes(`<map`)||!t.includes(`</map>`)?hi:`${t}\n`}function Ei(e,t,n){let r=` <string name="${Mi(t)}">${Mi(n)}</string>`;return Oi(ki(e,t),r)}function Di(e,t,n){let r=` <boolean name="${Mi(t)}" value="${n?`true`:`false`}" />`;return Oi(ki(e,t),r)}function Oi(e,t){return Ti(e).replace(`</map>`,`${t}\n</map>`)}function ki(e,t){let n=ji(t);return Ti(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 Ai(e){if(Ye(e)!==`binary`)return;let n=Xe(e);throw new t(`INVALID_ARGS`,n,{package:e,hint:n})}function ji(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Mi(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function Ni(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 Pi=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function Fi(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Ii(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 Li(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 Ri(e){if(e!==void 0){if(typeof e!=`number`)throw new t(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return Li(e)}}function zi(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 Bi(e){if(e===`ios`||e===`android`)return e}function Vi(e,t){return{platform:t,metroHost:Be(e?.metroHost),metroPort:Li(e?.metroPort),bundleUrl:Be(e?.bundleUrl),launchUrl:Be(e?.launchUrl)}}function Hi(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 Ui(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=>!Pi.includes(e));if(o)throw new t(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Pi.join(`, `)}.`);return{platform:zi(a.platform,r,i),metroHost:Ii(a.metroHost,`metroHost`),metroPort:Ri(a.metroPort),bundleUrl:Ii(a.bundleUrl,`bundleUrl`),launchUrl:Ii(a.launchUrl,`launchUrl`)}}function Wi(e,t,n){if(n){if(Fi(n)===0){e.clearRuntimeHints(t);return}return e.setRuntimeHints(t,n),n}}function Gi(e,n,r){let a=e.getRuntimeHints(n);if(!a)return;let o=r?i(r):void 0,s=Bi(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 Ki(e){let{req:t,sessionStore:n,sessionName:r,device:a}=e,o=n.getRuntimeHints(r),s=Ui({runtime:t.runtime,sessionName:r,platform:Bi(i(a))});return t.runtime===void 0?{runtime:Gi(n,r,a),previousRuntime:o,replacedStoredRuntime:!1}:{runtime:s&&Fi(s)>0?s:void 0,previousRuntime:o,replacedStoredRuntime:!0}}function qi(e){try{return{ok:!0,data:Ki(e)}}catch(e){let t=n(e);return E(t.code,t.message,t.details)}}async function Ji(e){let{replacedStoredRuntime:t,previousRuntime:n,runtime:r,session:i}=e;!t||!i?.appBundleId||!gi(n)||gi(r)||await vi({device:i.device,appId:i.appBundleId})}async function Yi(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(Zi(i))return await na(t,i);if(!Xi(i))return E(`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 Qi(n,r,a,o):i===`show`?$i(n,o):ta({req:t,sessionName:n,sessionStore:r,session:a,current:o})}function Xi(e){return e===`set`||e===`show`||e===`clear`}function Zi(e){return e===`port-reverse`||e===`port-reverse-remove`}async function Qi(e,t,n,r){return gi(r)&&n?.appBundleId&&await vi({device:n.device,appId:n.appBundleId}),{ok:!0,data:{session:e,cleared:t.clearRuntimeHints(e)}}}function $i(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function ea(e){return e?i(e.device):void 0}function ta(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:a}=e,o=ea(i),s=Bi(t.flags?.platform??a?.platform??o);if(!s)return E(`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 E(`INVALID_ARGS`,`runtime set targets ${s}, but session "${n}" is already bound to ${o}.`);let c=Hi(a,Vi(t.flags,s));return Fi(c)===0?E(`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 na(e,t){let n=ra(e);if(!n.ok)return n.response;let r=await oa(t,n.options);return r?{ok:!0,data:{action:t,...r}}:E(`UNSUPPORTED_OPERATION`,`No active provider device runtime supports port reverse for this lease.`)}function ra(e){let t=ia(e);if(!t.ok)return t;let n=aa(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 ia(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:E(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:E(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function aa(e){let t=sa(e.flags?.devicePort),n=sa(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:E(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}async function oa(e,t){return e===`port-reverse`?await Vn(t):await tn(t)}function sa(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}const ca=`open-command-roundtrip`,la=`Not implemented for this platform in this release.`;function ua(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:a,eventLogPath:o,appName:s,appBundleId:l,surface:u,startup:d,timing:f,device:p,runtime:m,runtimeHintCount:h}=e,g={session:t,surface:u,sessionStateDir:n,runnerLogPath:r,requestLogPath:a,eventLogPath:o};return s&&(g.appName=s),l&&(g.appBundleId=l),d&&(g.startup=d),f&&(g.timing=f),m&&h(m)>0&&(g.runtime=m),p&&(g.platform=i(p),g.target=p.target??`mobile`,g.device=p.name,g.id=p.id,g.kind=p.kind,p.platform===`android`&&(g.serial=p.id)),p&&c(p)&&(g.device_udid=p.id,g.ios_simulator_device_set=p.simulatorSetPath??null),{...g,...Se(`Opened: ${s??l??t}`)}}function da(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 fa=new Set([`app`,`desktop`,`frontmost-app`]);function pa(e,n,r){if(e.platform===`linux`){if(!n)return`app`;let e=x(n);if(!fa.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?x(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 ma(e){let{device:t,surfaceFlag:n,openTarget:r,existingSurface:i}=e;return(s(t)||t.platform===`linux`)&&!n?i??`app`:pa(t,n,r)}async function ha(e){if(e===`app`||e===`desktop`||e===`menubar`)return{};let t=await Et();return{appBundleId:t.bundleId,appName:t.appName}}async function ga(e,t,n){if(!(!a(e.platform)||!t))return Qe(t)?s(e)?void 0:e.kind===`device`?nt(n,t):$e(t)?void 0:n??await _a(e,t):await va(e,t)}async function _a(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function va(e,t){try{let{resolveIosApp:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function ya(e,t){if(!(e.platform!==`android`||!t||Qe(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 ba(e,t,n){if(n||e.platform!==`android`||!t||!Qe(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 xa(e,t){return e.platform===`android`&&!!(t&&Qe(t))}async function Sa(e,t,n,r){return await ga(e,t,n)??await r(e,t)??(xa(e,t)?n:void 0)}function W(e){return E(`INVALID_ARGS`,e)}function Ca(e,n,r,i){try{return ma({device:e,surfaceFlag:n,openTarget:r,existingSurface:i})}catch(e){return E(e instanceof t?e.code:`INVALID_ARGS`,String(e.message))}}function wa(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;return t?n&&Qe(n)?W(`open --relaunch does not support URL targets.`):r===`app`?i.platform===`android`&&n&&Ye(n)===`binary`?W(Xe(n)):null:W(`open --relaunch is supported only for app surfaces.`):null}function Ta(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;return t?n&&Qe(n)?W(`open --relaunch does not support URL targets.`):r===`android`&&n&&Ye(n)===`binary`?W(Xe(n)):null:null}async function Ea(e){let{req:t,sessionName:n,sessionStore:r,device:i,surface:a,openTarget:o,existingSession:s,onIosSimulatorColdBootStart:c}=e;await R(i,{deviceHub:t.flags?.deviceHub===!0,onIosSimulatorColdBootStart:c});let{appBundleId:l,appName:u}=await Da({device:i,surface:a,openTarget:o,existingAppBundleId:s?.appBundleId}),d=qi({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 Ji({replacedStoredRuntime:n,previousRuntime:t,runtime:e,session:s})}return{type:`details`,details:{appBundleId:l,appName:u,runtime:d.data.runtime}}}async function Da(e){let{device:t,surface:n,openTarget:r,existingAppBundleId:i}=e,a=await ha(n);return{appBundleId:a.appBundleId??await Sa(t,r,i,ya),appName:a.appName??r}}const Oa=new Map;async function ka(e){let{device:t,closeTarget:n,outFlag:r,context:i}=e;a(t.platform)&&!V(t)&&await dt(t.id),await D(t,`close`,[n],r,i),await ai(t,300)}async function Aa(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||Qe(l)||await D(n,`open`,[c],r.flags?.out,{...ja(i,r.flags,a,o)})}function ja(e,t,n,r){let i=j(e,t,n,r);return delete i.launchConsole,delete i.launchArgs,i}function Ma(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:ca,appTarget:t,appBundleId:n}}async function Na(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={},ee=c(a)&&u===`app`&&s.length>0&&!!v,x=Dr({req:t,logPath:i,appBundleId:v,traceLogPath:_}),S=t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,te,ne=!1,re=!1,ie=(e=x)=>{ne=!0,b.runnerPrewarmKind=`session`,b.runnerPrewarmScheduled=!0,te=_t(a,e)},ae=async()=>{if(!te||re)return;re=!0;let e=Date.now();await te,b.runnerPrewarmWaited=!0,b.runnerPrewarmDurationMs=Math.max(0,Date.now()-e)};ee&&V(a)&&!S&&ie();let oe=g&&!!o&&s.length===1&&V(a)&&t.flags?.clearAppState!==!0;if(g&&o&&!oe){let e=v??o,n=Date.now();await ka({device:a,closeTarget:e,outFlag:t.flags?.out,context:{...j(i,t.flags,v??m?.appBundleId,_)}}),b.relaunchCloseDurationMs=Math.max(0,Date.now()-n)}let C=Date.now();await _i({device:a,appId:v,runtime:f}),b.runtimeHintsDurationMs=Math.max(0,Date.now()-C),ee&&S&&(ie({...x,propagateError:!0}),await ae());let se=Date.now(),ce=await Pa({req:t,sessionName:n,sessionStore:r,device:a,surface:u,sessionAppBundleId:v,appName:l,existingSession:m});if(ce.type===`response`)return ce.response;let le=ce.session??m;await D(a,`open`,s,t.flags?.out,{...j(i,t.flags,v),...oe?{terminateRunningApp:!0}:{}}),b.openDispatchDurationMs=Math.max(0,Date.now()-se);let ue=Date.now();await Aa({runtime:f,device:a,req:t,logPath:i,appBundleId:v,traceLogPath:_,openPositionals:s}),b.launchUrlDurationMs=Math.max(0,Date.now()-ue),ee&&!ne&&ie(),g?await ae():te&&!re&&(b.runnerPrewarmWaited=!1),v=await ba(a,o,v),a.platform===`android`&&v&&await Ft(a,v);let de=o?Ma(se,o,v):void 0,fe=Date.now();if(await ai(a,300),b.postOpenSettleDurationMs=Math.max(0,Date.now()-fe),Ct(t.meta?.requestId)){let e=wt();return E(e.code,e.message,e.details)}m&&Zt(m,`open`,m.snapshot);let pe=da({existingSession:le,sessionName:m?.name??Sn(t),sessionScope:m?.sessionScope??Nn(t),device:a,surface:u,appBundleId:v,appName:l,saveScript:!!t.flags?.saveScript});pe.lease=mn({req:t,existingLease:m?.lease}),t.runtime!==void 0&&Wi(r,n,f);let me=r.ensureSessionDir(n),he=Jt(me,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 ge=ua({sessionName:pe.name,sessionStateDir:me,runnerLogPath:Nt(me),requestLogPath:he,eventLogPath:r.resolveEventLogPath(n),appName:l,appBundleId:v,surface:u,startup:de,timing:b,device:a,runtime:f,runtimeHintCount:Fi});return r.set(n,pe),r.recordAction(pe,{command:`open`,positionals:s,flags:t.flags??{},runtime:t.runtime===void 0?void 0:f,result:ge}),{ok:!0,data:ge}}async function Pa(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=da({existingSession:c,sessionName:c?.name??Sn(t),sessionScope:c?.sessionScope??Nn(t),device:i,surface:a,appBundleId:o,appName:s,saveScript:!!t.flags?.saveScript});u.lease=mn({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 Fa(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=Ca(a.device,t.flags?.surface,s,a.surface);if(typeof c!=`string`)return c;if(!s&&c===`app`)return W(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=wa({shouldRelaunch:e,openTarget:s,surface:c,device:a.device});if(l)return l;let u=await oi(a.device),d=await Ea({req:t,sessionName:n,sessionStore:i,device:u,surface:c,openTarget:s,existingSession:a,onIosSimulatorColdBootStart:Or({req:t,logPath:r,device:u,surface:c,openTarget:s,traceLogPath:a.trace?.outPath})});return d.type===`response`?d.response:await Na({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 W(`open --relaunch requires an app argument.`);let c=Ta({shouldRelaunch:o,openTarget:s,platform:t.flags?.platform===`android`?`android`:void 0});if(c)return c;let l=await kn(t.flags??{}),u=Ca(l,t.flags?.surface,s);return typeof u==`string`?wa({shouldRelaunch:o,openTarget:s,surface:u,device:l})||await gt(Oa,l.id,async()=>{let e=i.toArray().find(e=>e.device.id===l.id);if(e)return Hn(t,e)?E(`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.`}):E(`DEVICE_IN_USE`,`Device is already in use by session "${e.name}".`,{session:e.name,deviceId:l.id,deviceName:l.name,hint:er(e,`device-in-use`)});let a=await Ea({req:t,sessionName:n,sessionStore:i,device:l,surface:u,openTarget:s,onIosSimulatorColdBootStart:Or({req:t,logPath:r,device:l,surface:u,openTarget:s})});return a.type===`response`?a.response:await Na({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 Ia(e){return V(e)||ri(e)}async function La(t){if(t.booted===!1)return{success:!0,exitCode:0,stdout:``,stderr:``};try{return V(t)?await Ra(t):await Ba(t)}catch(t){let n=e(t);return{success:!1,exitCode:-1,stdout:``,stderr:n.message,error:n}}}async function Ra(e){let t=await Mr(e);return t.success?t:await za(e)===`Shutdown`?{...t,success:!0,exitCode:0}:t}async function za(e){try{return await Nr(e)}catch{return null}}async function Ba(e){let t=await rt(e,[`emu`,`kill`],{allowFailure:!0,timeoutMs:15e3});return{success:t.exitCode===0,exitCode:t.exitCode,stdout:t.stdout,stderr:t.stderr}}async function Va(e){let{device:t,shutdownRequested:n}=e;if(n&&Ia(t))return await La(t)}function Ha(e,t){return V(t.device)&&!e.flags?.shutdown&&!t.recording&&!t.lease&&!t.device.simulatorSetPath}function Ua(e){return a(e.device.platform)&&!V(e.device)}async function Wa(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:o,leaseLifecycleProvider:s}=e,c=i.get(n);if(!c)return await qa(t,r);let l;try{await rn(c),await ln(c,`session-close`),await Ln(c),await Un(c),await Cn(c),Ga(t,c)&&(Ua(c)&&await Pn(c),await D(c.device,`close`,t.positionals??[],t.flags?.out,{...j(r,t.flags,c.appBundleId,c.trace?.outPath)}),await ai(c.device,300)),a(c.device.platform)&&!Ha(t,c)?await Pn(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)),gi(i.getRuntimeHints(n))&&c.appBundleId&&await vi({device:c.device,appId:c.appBundleId}).catch(()=>{}),Ar(i,c,t,`close`,{session:c.name,...Se(`Closed: ${c.name}`)}),t.flags?.saveScript&&(c.recordSession=!0),i.writeSessionLog(c),await Yn(n).catch(()=>{})}finally{try{l=await Zn({session:c,leaseRegistry:o,leaseLifecycleProvider:s})}finally{i.delete(n)}}let u=await Va({device:c.device,shutdownRequested:t.flags?.shutdown});return u?{ok:!0,data:le({session:c.name,shutdown:u,...l?{provider:l}:{}},`Closed: ${c.name}`)}:{ok:!0,data:{session:c.name,...Se(`Closed: ${c.name}`),...l?{provider:l}:{}}}}function Ga(e,t){return Ka(e)||t.device.platform===`web`}function Ka(e){return(e.positionals?.length??0)>0}async function qa(e,t){if(!e.positionals||e.positionals.length===0)return E(`SESSION_NOT_FOUND`,`No active session`);let n=await U({session:void 0,flags:e.flags,ensureReady:!0});return await D(n,`close`,e.positionals,e.flags?.out,{...j(t,e.flags)}),await ai(n,300),{ok:!0,data:{app:e.positionals[0],...Se(`Closed: ${e.positionals[0]}`)}}}const Ja={ios:async(e,t,n)=>{let r=await Mn(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 Mn(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)}},Ya={ios:async(e,t,n)=>{let r=await Mn(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 Mn(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 Xa(e){let{req:t,command:n,sessionName:r,sessionStore:i,deployOps:a}=e,o=i.get(r),s=t.flags??{},l=H(n,o,s);if(l)return l;let u=eo(n,t.positionals??[]);if(!u.ok)return u.response;let{app:d,appPathInput:f}=u,p=t.meta?.uploadedArtifactId;try{let e=p?cn(p,t.meta?.tenantId):A.expandHome(f);if(!z.existsSync(e))return E(`INVALID_ARGS`,`App binary not found: ${e}`);let r=await U({session:o,flags:s,ensureReady:!1}),l=k(n,r);if(l)return l;let u=c(r)?Qa(d,e,await a.ios(r,d,e)):$a(d,e,await a.android(r,d,e)),m=le(u,Za(u));return Ar(i,o,t,n,m),{ok:!0,data:m}}finally{p&&$n(p)}}function Za(e){return`Installed: ${e.appName??ve(e)}`}function Qa(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 $a(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 eo(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:E(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:E(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}async function to(e,t,n){return await Le(e,t,n)}async function no(e){let{req:t,sessionName:o,sessionStore:c}=e;if(t.command===`session_list`){let e=Nn(t);return{ok:!0,data:{sessions:c.toArray().filter(t=>yn(t,e)).map(e=>{let t=c.resolveSessionDir(e.name);return{name:e.name,sessionStateDir:t,runnerLogPath:Nt(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=tt(t.flags?.androidDeviceAllowlist),n=t.flags?.platform,i=r({simulatorSetPath:at(t.flags?.iosSimulatorDeviceSet),platform:n,target:t.flags?.target}),a=await un({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=>io(e,n)):a;return{ok:!0,data:{devices:(t.flags?.target?o.filter(e=>(e.target??`mobile`)===t.flags?.target):o).map(ro)}}}catch(e){let t=n(e);return E(t.code,t.message,t.details)}if(t.command===`capabilities`){let e=c.get(o),n=t.flags??{},r=H(t.command,e,n);if(r)return r;let i=await U({session:e,flags:n,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0});return{ok:!0,data:{device:ro(i),availableCommands:Wn().filter(e=>Fn(e,i))}}}if(t.command===`apps`){let e=c.get(o),n=t.flags??{},r=H(t.command,e,n);if(r)return r;let i=await U({session:e,flags:n,ensureReady:!0}),s=k(`apps`,i);if(s)return s;let l=Ke(t.flags?.appsFilter);return a(i.platform)?{ok:!0,data:{apps:(await jr(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 ro({simulatorSetPath:e,appleOs:t,...n}){return{...n,platform:i({platform:n.platform,appleOs:t}),...a(n.platform)&&t?{appleOs:t}:{}}}function io(e,t){return d(e,t)}async function ao(e){let{ensureAndroidEmulatorBooted:t}=await import(`./android-input-ownership.js`).then(e=>e.m);return await t(e)}const oo=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,so=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;async function co(e){let{req:t,sessionName:n,sessionStore:r}=e,o=r.get(n),l=t.flags??{},u=l.platform;if(!o&&ii(l))return E(`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=H(`appstate`,o,l);if(d)return d;let f=a(o?.device.platform)&&ci(l,o),p=u===`ios`,m=u===`macos`;if(p&&!f)return E(`SESSION_NOT_FOUND`,oo);if(m&&!f)return E(`SESSION_NOT_FOUND`,so);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}}:E(`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 U({session:o,flags:l,ensureReady:!0});if(c(h))return E(`SESSION_NOT_FOUND`,oo);if(s(h))return E(`SESSION_NOT_FOUND`,so);if(h.platform===`web`)return E(`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 lo(e){let{req:t,sessionName:r,logPath:o,sessionStore:s}=e;if(t.command===`boot`){let e=s.get(r),l=t.flags??{},u=H(t.command,e,l);if(u)return u;let d=(l.platform??e?.device.platform)===`android`,f=l.headless===!0;if(f&&!d)return E(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);let p=si({flags:l,sessionDevice:e?.device}),m=d&&!!p,h,g=!1;try{h=await U({session:e,flags:l,ensureReady:!1,allowStoppedAndroidAvdPlaceholders:!0})}catch(e){let t=n(e);if(d&&f&&!p&&t.code===`DEVICE_NOT_FOUND`)return E(`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 ao({avdName:p,serial:l.serial,headless:f}),g=!0}if(l.target&&(h.target??`mobile`)!==l.target)return E(`DEVICE_NOT_FOUND`,`No ${h.platform} device found matching --target ${l.target}.`);if(d&&f){if(h.platform!==`android`||h.kind!==`emulator`)return E(`INVALID_ARGS`,`boot --headless is supported only for Android emulators.`);if(!g){let t=si({flags:l,sessionDevice:e?.device,resolvedDevice:h});if(!t)return E(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);h=await ao({avdName:t,serial:l.serial,headless:!0})}await R(h)}else h.platform===`android`&&h.kind===`emulator`&&h.booted!==!0?(h=await ao({avdName:h.name,serial:l.serial,headless:!1}),await R(h)):(h.platform!==`android`||h.booted!==!0)&&await R(h,{onIosSimulatorColdBootStart:Er({req:t,logPath:o,device:h,enabled:!0})});return k(`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=H(t.command,e,n);if(o)return o;let c=await U({ensureReady:!1,flags:n,session:e}),l=k(`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 E(`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 La(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}:{}}}:E(u.error?.code??`COMMAND_FAILED`,uo(u),{platform:i(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:u})}return t.command===`appstate`?await co({req:t,sessionName:r,sessionStore:s}):null}function uo(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}wn();function fo(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:ca,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 po(e,t={}){let n=go(e);return Eo(e)?e.appBundleId?e.device.platform===`android`?(await So(n,e,e.appBundleId,t),n):(await Co(n,e,e.appBundleId),n):(xo(n,e),n):n}async function mo(e,t={}){let n=yo(e);return Eo(e)?e.appBundleId?(await To(n,e,e.appBundleId,t),n):(n.metrics.fps={available:!1,reason:Do(e)},n):n}async function ho(e,t){let n=bo(e);return Eo(e)?t.action===`sample`?(n.metrics={memory:await Po(e,t)},n):(n.artifact=await Io(e,t),n.support=Ho(n.artifact.support)??Vo(e),n):t.action===`snapshot`?(n.artifact=zo(e,Lo(e,t.kind)),n.support=Ho(n.artifact.support)??Vo(e),n):(n.metrics={memory:{available:!1,reason:la}},n)}function go(e){let t=fo(e.actions),n=t.at(-1),r=n?{available:!0,lastDurationMs:n.durationMs,lastMeasuredAt:n.measuredAt,method:ca,sampleCount:t.length,samples:t}:{available:!1,reason:`No startup sample captured yet. Run open <app|url> in this session first.`,method:ca};return{session:e.name,platform:i(e.device),device:e.device.name,deviceId:e.device.id,metrics:{startup:r,..._o()},sampling:{startup:{method:ca,description:`Elapsed wall-clock time around dispatching the open command for the active session app target.`,unit:`ms`},...Oo(e)}}}function _o(){return{fps:vo(),memory:{available:!1,reason:la},cpu:{available:!1,reason:la}}}function vo(){return{available:!1,reason:`Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.`}}function yo(e){return{session:e.name,platform:i(e.device),device:e.device.name,deviceId:e.device.id,metrics:{fps:vo()},sampling:{fps:jo(e)}}}function bo(e){return{session:e.name,platform:i(e.device),device:e.device.name,deviceId:e.device.id,sampling:{memory:ko(e),snapshot:Ao(e)}}}function xo(e,t){let n=Do(t);e.metrics.fps={available:!1,reason:n},e.metrics.memory={available:!1,reason:n},e.metrics.cpu={available:!1,reason:n}}async function So(e,t,n,r){wo(e,t,await Mo(t,n,r))}async function Co(e,t,n){wo(e,t,await No(t,n))}function wo(e,t,n){e.metrics.memory=Wo(n.memory),e.metrics.cpu=Wo(n.cpu),e.metrics.fps=Go(Wo(n.fps),t)}async function To(e,t,n,r){let i=t.device.platform===`android`?await Uo(Pt(t.device,n,{adb:r.androidAdb})):await Uo(ar(t.device,n));e.metrics.fps=Go(Wo(i),t)}function Eo(e){return Rn(e.device.platform)?.perf?.supportsMetrics(e.device)??!1}function Do(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 Oo(e){return e.device.platform===`android`?{memory:{method:en,description:_n,unit:`kB`},cpu:{method:Bn,description:hn,unit:`percent`},fps:{method:Dn,description:Wt,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}}:zt(e.device)}function ko(e){return e.device.platform===`android`?{method:en,description:_n,unit:`kB`,topConsumerLimit:5}:zt(e.device).memory}function Ao(e){return e.device.platform===`android`?{method:bn,description:jn,defaultKind:`android-hprof`,artifactOnly:!0}:{method:Gt,description:Ht,defaultKind:`memgraph`,artifactOnly:!0}}function jo(e){return e.device.platform===`android`?{method:Dn,description:Wt,unit:`percent`,primaryField:`droppedFramePercent`,window:`since previous Android gfxinfo reset or app process start`,resetsAfterRead:!0,relatedActionsLimit:12}:It(e.device)}async function Mo(e,t,n){let r={adb:n.androidAdb},[i,a,o]=await Promise.allSettled([sn(e.device,t,r),ir(e.device,t,r),Pt(e.device,t,r)]);return{memory:i,cpu:a,fps:o}}async function No(e,t){let n=await Uo(ar(e.device,t)),r=await Uo(jt(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 Po(e,t){return e.appBundleId?Wo(e.device.platform===`android`?await Uo(sn(e.device,e.appBundleId,{adb:t.androidAdb})):await Uo(Fo(e))):{available:!1,reason:Do(e)}}async function Fo(e){if(!e.appBundleId)throw new t(`INVALID_ARGS`,Do(e));return(await jt(e.device,e.appBundleId)).memory}async function Io(e,n){if(!e.appBundleId)throw new t(`INVALID_ARGS`,Do(e),{hint:`Run open <app> first so perf memory snapshot can resolve the app process.`});let r=Lo(e,n.kind),i=Ro(n,r);return e.device.platform===`android`?r===`android-hprof`?await Qn(e.device,e.appBundleId,i,{adb:n.androidAdb}):zo(e,r):r===`memgraph`?await Kt(e.device,e.appBundleId,i):zo(e,r)}function Lo(e,t){return t||(e.device.platform===`android`?`android-hprof`:`memgraph`)}function Ro(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 B.join(i,`artifacts`,`memory-${t}-${r}.${n}`)}function zo(e,t){let n=Vo(e),r=Bo(e,t);return{available:!1,kind:t,reason:r.reason,hint:r.hint,support:n}}function Bo(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 Vo(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)?{...Lt(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 Ho(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}async function Uo(e){try{return{status:`fulfilled`,value:await e}}catch(e){return{status:`rejected`,reason:e}}}function Wo(t){if(t.status===`fulfilled`)return{available:!0,...t.value};let n=e(t.reason);return{available:!1,reason:n.message,error:n}}function Go(e,t){if(e.available!==!0)return e;let n=Ko(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Ko(e,t){let n=qo(t.windowStartedAt),r=qo(t.windowEndedAt)??qo(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:Jo(e)})).slice(-12)}function qo(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Jo(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 Yo(t){let n=Xo(t.req,t.area);if(!n.ok)return n;let{session:r}=t;if(r.device.platform!==`android`)return E(`UNSUPPORTED_OPERATION`,`Android native perf collectors are supported only on Android sessions.`);if(!r.appBundleId)return E(`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 as(t,r,r.appBundleId,n):await os(t,r,r.appBundleId,n)}}catch(t){return{ok:!1,error:e(t)}}}function Xo(e,t){let n=is(e,t);return t===`cpu`?Zo(e,n):Qo(e,n)}function Zo(e,t){let n=$o(e,1),r=$o(e,2),i=$o(e,3);return de(n)?es(r)?i===`simpleperf`?{ok:!0,area:`cpu`,subject:n,action:r,kind:i,outPath:t}:E(`INVALID_ARGS`,`perf cpu profile requires --kind simpleperf`):E(`INVALID_ARGS`,`perf cpu profile action must be start, stop, or report`):E(`INVALID_ARGS`,ue)}function Qo(e,t){let n=$o(e,1),r=$o(e,2);return ts(n)?be(r)?r===`perfetto`?{ok:!0,area:`trace`,action:n,kind:r,outPath:t}:E(`INVALID_ARGS`,`perf trace requires --kind perfetto`):E(`INVALID_ARGS`,S):E(`INVALID_ARGS`,`perf trace action must be start or stop`)}function $o(e,t){return(e.positionals?.[t]??``).toLowerCase()}function es(e){return e===`start`||e===`stop`||e===`report`}function ts(e){return e===`start`||e===`stop`}function ns(e,t){return e.sessionStore.set(e.sessionName,{...e.session,nativePerf:{android:t}}),ds(t)}function rs(e,t,n){return t?A.expandHome(t,e.req.meta?.cwd):us(e.sessionStore,e.sessionName,n)}function is(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 as(e,t,n,r){if(r.action===`start`){cs(t);let i=rs(e,r.outPath,`cpu.perf.data`);return ns(e,await rr(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=fs(t,`cpu-profile`,r.kind);if(r.action===`report`){await ss(i);let n=rs(e,r.outPath,`cpu-report.json`);return await Mt(t.device,i,n,{adb:e.androidAdbExecutor})}let a=ls(e,r.outPath,i);return ns(e,await qt(t.device,i,a,{adb:e.androidAdbExecutor}))}async function os(e,t,n,r){if(r.action===`start`){cs(t);let i=rs(e,r.outPath,`app.perfetto-trace`);return ns(e,await tr(t.device,n,i,{adb:e.androidAdbExecutor}))}let i=fs(t,`trace`,r.kind),a=ls(e,r.outPath,i);return ns(e,await Yt(t.device,i,a,{adb:e.androidAdbExecutor}))}function ss(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 cs(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 ls(e,t,n){return t?rs(e,t,n.outPath):n.outPath}function us(e,t,n){let r=new Date().toISOString().replace(/[:.]/g,`-`);return B.join(e.ensureSessionDir(t),`${r}-${n}`)}function ds(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 fs(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 ps(e){if(!an(e))return;let{macOsScreenCaptureKitAudioProbeBackend:t}=await import(`./audio-probe.js`);return t}const ms=[`probe`],hs=[`start`,`status`,`stop`],gs=`audio probe requires ${hs.join(`, `)}`;async function _s(t){let n=vs(t);if(!n.ok)return n;let r=await ps(n.session.device);if(r)return await bs(t,n,r);let i=Tr();if(!i.probeAudio)return E(`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 vs(e){let t=ys(e);if(!t.ok)return t;let n=xs(e.req);if(!n.ok)return n;let r=Ss(e.req,n.probeAction);return r.ok?{ok:!0,session:t.session,probeAction:n.probeAction,...r.timing}:r}function ys(e){let t=e.sessionStore.get(e.sessionName);return t?Fn(`audio`,t.device)?{ok:!0,session:t}:E(`UNSUPPORTED_OPERATION`,`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`):E(`SESSION_NOT_FOUND`,`audio requires an active session`)}async function bs(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 xs(e){if(!Cs(e.positionals?.[0]))return E(`INVALID_ARGS`,`audio requires probe`);let t=ws(e.positionals?.[1]);return t?{ok:!0,probeAction:t}:E(`INVALID_ARGS`,gs)}function Ss(e,t){if(t!==`start`&&e.positionals&&e.positionals.length>2)return E(`INVALID_ARGS`,`audio probe duration and bucket are only supported with audio probe start`);let n=Ts(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 E(`INVALID_ARGS`,n.message);let r=Ts(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?E(`INVALID_ARGS`,r.message):{ok:!0,timing:{durationMs:n,bucketMs:r}}}function Cs(e){let t=(e??`probe`).toLowerCase();return ms.includes(t)?`probe`:void 0}function ws(e){let t=(e??`status`).toLowerCase();return hs.includes(t)?t:void 0}function Ts(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 Es(t,n){let r=Ds(t.req);if(!r.ok)return r;if(n.device.platform===`android`)return E(`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 E(`UNSUPPORTED_OPERATION`,`Apple xctrace perf is not supported on ${n.device.platform}.`);if(!n.appBundleId)return E(`INVALID_ARGS`,`Apple xctrace perf requires an active app session. Run open <app> first.`);try{return r.action===`start`?await Ms(t,n,r):r.action===`stop`?await Ns(t,n,r):await Rs(t,n,r)}catch(t){return{ok:!1,error:e(t)}}}function Ds(e){let t=e.positionals??[],n=t[0]?.toLowerCase();return n===`cpu`?Os(t):n===`trace`?ks(t):E(`INVALID_ARGS`,ce)}function Os(e){if(e[1]?.toLowerCase()!==`profile`)return E(`INVALID_ARGS`,`perf cpu requires profile`);let t=As(e[2],`perf cpu profile`,!0);if(!t.ok)return t;let n=js(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 ks(e){let t=As(e[1],`perf trace`,!1);if(!t.ok)return t;let n=js(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 As(e,t,n){let r=e?.toLowerCase();return r===`start`||r===`stop`||n&&r===`report`?{ok:!0,value:r}:E(`INVALID_ARGS`,n?`${t} requires start, stop, or report`:`${t} requires start or stop`)}function js(e){return e?.toLowerCase()===`xctrace`?{ok:!0}:E(`INVALID_ARGS`,`perf native collection currently supports --kind xctrace`)}async function Ms(e,t,n){if(t.applePerf?.active)return E(`INVALID_ARGS`,`Apple xctrace perf capture already in progress`);let r=n.template??Hs(n.mode),i=Vs(e,n),a=await At({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=Us(`started`,a);return Bs(e,t,o),{ok:!0,data:o}}async function Ns(e,t,n){let r=t.applePerf?.active;if(!r)return E(`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 En(r,i)}catch(n){throw Fs(n)&&Ps(e,t),n}Is(e,t,a);let o=Us(`stopped`,a);return Bs(e,t,o),{ok:!0,data:o}}function Ps(e,t){t.applePerf={...t.applePerf??{},active:void 0},e.sessionStore.set(e.sessionName,t)}function Fs(e){return n(e).details?.captureCleanedUp===!0}function Is(e,t,n){t.applePerf={...t.applePerf??{},active:void 0,lastMode:n.mode,...Ls(n)},e.sessionStore.set(e.sessionName,t)}function Ls(e){return e.mode===`cpu-profile`?{lastProfileTracePath:e.outPath,lastProfileTemplate:e.template}:{lastTracePath:e.outPath}}async function Rs(e,t,n){if(n.mode!==`cpu-profile`)return E(`INVALID_ARGS`,`perf trace does not support report`);if(t.applePerf?.active)return E(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let r=Vs(e,n),i=zs(t,n);if(!i.ok)return i;let a={perf:`reported`,...await Bt({tracePath:A.expandHome(i.value,e.req.meta?.cwd),outPath:r,mode:n.mode,template:t.applePerf?.lastProfileTemplate??n.template,appBundleId:t.appBundleId})};return Bs(e,t,a),{ok:!0,data:a}}function zs(e,t){let n=t.tracePath??e.applePerf?.lastProfileTracePath??e.applePerf?.active?.outPath;return n?{ok:!0,value:n}:E(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`)}function Bs(e,t,n){Ar(e.sessionStore,t,e.req,`perf`,n)}function Vs(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 Hs(e){return e===`cpu-profile`?`Time Profiler`:`Animation Hitches`}function Us(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 Ws=`logs requires ${ge.slice(0,-1).join(`, `)}, or ${ge.at(-1)}`,Gs=[`dump`,`log`],Ks=`network requires ${Gs.join(` or `)}`,qs=`network include mode must be one of: ${l.join(`, `)}`,Js={path:({session:e,sessionName:t,sessionStore:n})=>bc(e,t,n),doctor:({session:e,sessionName:t,sessionStore:n})=>xc(e,t,n),mark:({req:e,sessionName:t,sessionStore:n})=>Sc(e,t,n),clear:({session:e,sessionName:t,sessionStore:n,restart:r})=>Cc(e,t,n,r),start:({session:e,sessionName:t,sessionStore:n})=>wc(e,t,n),stop:({session:e,sessionName:t,sessionStore:n})=>Tc(e,t,n)};function Ys(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:Qs(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:[Zs(e.appLogFailure)]}:{active:!1,state:`inactive`,backend:zn(e.device)}}function Xs(e,t){return{backend:t,code:e.code,message:e.message,hint:e.hint}}function Zs(e){return e.hint?`${e.message} ${e.hint}`:e.message}function Qs(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 $s(e,t){return Xt([...e,...t.notes??[]])}function ec(e,t,n){return{...n,platform:e.device.platform,outPath:t}}function tc(t,n,r,i){let a=e(i);return t.set(n,{...r,appLog:void 0,appLogFailure:Xs(a,zn(r.device))}),{ok:!1,error:a}}async function nc(e){let{req:t}=e;return t.command===`perf`?ic(e):t.command===`logs`?vc(e):t.command===`events`?await rc(e):t.command===`network`?Ec(e):t.command===`audio`?await _s(e):null}async function rc(t){let{req:n,sessionName:r,sessionStore:i}=t;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:n.positionals?.[0],cursor:n.positionals?.[1]})}}catch(t){return{ok:!1,error:e(t)}}}async function ic(t){let{req:n,sessionName:r,sessionStore:i,androidAdbExecutor:a}=t,o=i.get(r);if(!o)return E(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);let s=(n.positionals?.[0]??`metrics`).toLowerCase();if(ac(s))return o.device.platform===`android`?await Yo({req:n,sessionName:r,sessionStore:i,session:o,androidAdbExecutor:a,area:s}):await Es(t,o);let c=oc(n);if(!c.ok)return c;if(c.native)return await Es(t,o);try{return{ok:!0,data:await sc(t,o,c)}}catch(t){return{ok:!1,error:e(t)}}}function ac(e){return e===`cpu`||e===`trace`}function oc(n){let r=cc(n.positionals?.[0]);if(!r)return E(`INVALID_ARGS`,ce);if(r===`cpu`||r===`trace`)return{ok:!0,native:!0};let i=lc(n.positionals?.[1]);if(!i)return E(`INVALID_ARGS`,re);let a=uc(n.flags?.kind);return a instanceof t?{ok:!1,error:e(a)}:(dc(r,i)??mc(n,r,i,a))||{ok:!0,native:!1,area:r,action:i,kind:a,out:_c(n.flags?.out)}}async function sc(e,t,n){let{sessionName:r,sessionStore:i,androidAdbExecutor:a}=e;return n.area===`memory`?await ho(t,{action:pc(n.action),kind:n.kind,out:n.out,cwd:e.req.meta?.cwd,sessionName:r,sessionStore:i,androidAdb:a}):n.area===`frames`?await mo(t,{androidAdb:a}):await po(t,{androidAdb:a})}function cc(e){let t=(e??`metrics`).toString().toLowerCase();return oe(t)?t:void 0}function lc(e){let t=(e??`sample`).toString().toLowerCase();return te(t)?t:void 0}function uc(e){if(e!==void 0)return typeof e!=`string`||!be(e)?new t(`INVALID_ARGS`,S):e}function dc(e,t){if(e===`memory`)return fc(t)?void 0:E(`INVALID_ARGS`,`perf memory requires sample or snapshot`);if(t!==`sample`)return E(`INVALID_ARGS`,`perf metrics and perf frames only support sample`)}function fc(e){return e===`sample`||e===`snapshot`}function pc(e){if(fc(e))return e;throw new t(`INVALID_ARGS`,`perf memory requires sample or snapshot`)}function mc(e,t,n,r){return hc(e.flags?.out,t,n)??gc(r,t,n)}function hc(e,t,n){if(!(!e||t===`memory`&&n===`snapshot`))return E(`INVALID_ARGS`,`--out is only supported with perf memory snapshot`)}function gc(e,t,n){if(e){if(t!==`memory`||n!==`snapshot`)return E(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(!ae(e))return E(`INVALID_ARGS`,ne)}}function _c(e){return typeof e==`string`&&e.length>0?e:void 0}async function vc(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(!i)return E(`SESSION_NOT_FOUND`,`logs requires an active session`);let a=k(`logs`,i.device);if(a)return a;let o=yc(t);return o.ok?await Js[o.action]({...e,session:i,restart:o.restart}):o}function yc(e){let t=(e.positionals?.[0]??`path`).toLowerCase(),n=!!e.flags?.restart;return ge.includes(t)?n&&t!==`clear`?E(`INVALID_ARGS`,`logs --restart is only supported with logs clear`):{ok:!0,action:t,restart:n}:E(`INVALID_ARGS`,Ws)}function bc(e,t,n){let r=n.resolveAppLogPath(t),i=Tn(r),a=Ys(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 xc(e,t,n){let r=n.resolveAppLogPath(t),i=await An(e.device,e.appBundleId),a=Ys(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:$s(i.notes,a)}}}function Sc(e,t,n){let r=e.positionals?.slice(1).join(` `)??``,i=n.resolveAppLogPath(t);return In(i,r),{ok:!0,data:{path:i,marked:!0}}}async function Cc(e,t,n,r){if(e.appLog&&!r)return E(`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 E(`INVALID_ARGS`,`logs clear --restart requires an app session; run open <app> first`);e.appLog&&await dn(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:ec(e,i,r),appLogFailure:void 0}),{ok:!0,data:{...o,restarted:!0}}}catch(r){return tc(n,t,e,r)}}async function wc(e,t,n){if(e.appLog)return E(`INVALID_ARGS`,`app log already streaming; run logs stop first`);if(!e.appBundleId)return E(`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:ec(e,r,a),appLogFailure:void 0}),{ok:!0,data:{path:r,started:!0}}}catch(r){return tc(n,t,e,r)}}async function Tc(e,t,n){if(!e.appLog)return E(`INVALID_ARGS`,`no app log stream active`);let r=e.appLog.outPath;return await dn(e.appLog),n.set(t,{...e,appLog:void 0,appLogFailure:void 0}),{ok:!0,data:{path:r,stopped:!0}}}async function Ec(e){let t=Oc(e);if(!t.ok)return t;let{include:n,maxEntries:r,session:i}=t;if(i.device.platform===`web`)return await Dc({include:n,maxEntries:r});let a=await on({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 Dc(t){let n=Tr();if(!n.dumpNetwork)return E(`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 Oc(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(!i)return E(`SESSION_NOT_FOUND`,`network requires an active session`);let a=k(`network`,i.device);if(a)return a;let o=(t.positionals?.[0]??`dump`).toLowerCase();if(!Gs.includes(o))return E(`INVALID_ARGS`,Ks);let s=t.positionals?.[1]?Number.parseInt(t.positionals[1],10):25;if(!Number.isInteger(s)||s<1||s>200)return E(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`);let c=kc(t);return c.ok?{ok:!0,session:i,maxEntries:s,include:c.include}:c}function kc(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return E(`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}:E(`INVALID_ARGS`,qs)}function Ac(e){let{artifactsDir:t,cwd:n,suiteInvocationId:r}=e,i=A.expandHome(t??`.agent-device/test-artifacts`,n);return B.join(i,r)}function jc(e,t){let n=t?B.relative(t,e):B.basename(e);return(n.length===0||n.startsWith(`..`)?B.basename(e):n).toLowerCase().replace(/[\\/]+/g,`__`).replace(/[^a-z0-9._-]+/g,`-`).replace(/^-+|-+$/g,``)||`test`}function Mc(e,t){z.mkdirSync(t,{recursive:!0}),Ic(e,t)}function Nc(e){let{response:t,filePath:n,sessionName:r,attempts:i,maxAttempts:a,attemptArtifactsDir:o}=e,s=[...Pc(t)];!t.ok&&typeof t.error.logPath==`string`&&s.push(t.error.logPath);let c=Fc(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=>B.basename(e)).join(`, `)}`);let u=B.join(o,`result.txt`),d=`${l.join(`
|
|
3
|
+
`)}\n`;z.writeFileSync(u,d),t.ok||z.writeFileSync(B.join(o,`failure.txt`),d)}function Pc(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 Fc(e,t){let n=[],r=new Map;for(let i of e){if(!zc(i))continue;let e=Rc(B.basename(i),r),a=B.join(t,e);B.resolve(i)!==B.resolve(a)&&z.copyFileSync(i,a),n.push(a)}return n}function Ic(e,t){let n=B.join(t,`replay.ad`);if(z.copyFileSync(e,n),!Lc(e))return;let r=B.join(t,B.basename(e));B.resolve(r)!==B.resolve(n)&&z.copyFileSync(e,r)}function Lc(e){let t=B.extname(e).toLowerCase();return t===`.yml`||t===`.yaml`}function Rc(e,t){let n=B.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 zc(e){try{return z.statSync(e).isFile()}catch{return!1}}function Bc(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`]),Gc(e,`permissions`),Gc(e,`clearKeychain`);let i=I(typeof e.appId==`string`?e.appId:pr(n,`launchApp`),r),a=Hc(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 Vc(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 Hc(e,t){return[...Uc(e.arguments,`launchApp.arguments`,t),...Uc(e.launchArguments,`launchApp.launchArguments`,t)]}function Uc(e,n,r){if(e==null)return[];if(typeof e==`string`)return[I(e,r)];if(Array.isArray(e))return e.map((e,t)=>Wc(e,`${n}[${t}]`,r));if(F(e))return Object.entries(e).flatMap(([e,t])=>[I(e,r),Wc(t,`${n}.${e}`,r)]);throw new t(`INVALID_ARGS`,`${n} expects a string, list, or map.`)}function Wc(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 Gc(e,t){if(e[t]!==void 0)throw N(`Maestro launchApp field "${t}" is not supported yet.`)}const G={runScript:`__maestroRunScript`,assertVisible:`__maestroAssertVisible`,assertNotVisible:`__maestroAssertNotVisible`,pressEnter:`__maestroPressEnter`,waitForAnimationToEnd:`__maestroWaitForAnimationToEnd`,scrollUntilVisible:`__maestroScrollUntilVisible`,swipeScreen:`__maestroSwipeScreen`,swipeOn:`__maestroSwipeOn`,tapOn:`__maestroTapOn`,tapPointPercent:`__maestroTapPointPercent`};function Kc(e,t){if(typeof e==`string`)return P(G.tapOn,[ll(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(G.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(G.tapOn,[K(e,`tapOn`,[`repeat`,`delay`,`optional`,`label`,`index`,`childOf`],t),...ul(e,t)],n)}function qc(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`,[K(e,`doubleTapOn`,[`delay`],t)],hl(e))}function Jc(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`,[K(e,`longPressOn`,[],t)],{holdMs:3e3})}function Yc(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 Xc(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 Zc(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=K(r,`extendedWaitUntil`,[],n),a=String(br(e,17e3));return e.notVisible===void 0?[P(G.assertVisible,[i,a],{maestro:{allowAlreadyPastLoading:!0}})]:[P(G.assertNotVisible,[i,a])]}function Qc(e){if(e!=null)throw N(`Maestro scroll options are not supported yet.`);return P(`scroll`,[`down`])}function $c(e,n){if(typeof e==`string`)return[P(G.scrollUntilVisible,[ll(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=K(e.element,`scrollUntilVisible.element`,[],n),i=typeof e.direction==`string`?ol(e.direction,`scrollUntilVisible.direction`):`down`,a=String(br(e,5e3));return[P(G.scrollUntilVisible,[r,a,i])]}function el(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(G.swipeScreen,[`direction`,sl(e.direction),...dl(e)]):nl(e):tl(e,r,n)}function tl(e,t,n){let r=sl(typeof e.direction==`string`?e.direction:`up`);return P(G.swipeOn,[K(t,`swipe.from`,[],n),r,...dl(e)])}function nl(e){let{start:t,end:n}=rl(e);return al(t,n,il(e.duration))}function rl(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 il(e){return typeof e==`number`&&Number.isFinite(e)?String(Math.max(16,Math.floor(e))):void 0}function al(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(G.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 ol(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 sl(e){return ol(e,`swipe direction`)}function cl(e){let t=mr(`pressKey`,e).toLowerCase();if(t===`back`)return P(`back`);if(t===`enter`||t===`return`)return P(G.pressEnter);if(t===`home`)return P(`home`);throw N(`Maestro pressKey "${t}" is not supported yet.`)}function K(e,n,r=[],i){if(typeof e==`string`)return ll(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(fl(`enabled`,String(e.enabled))),typeof e.selected==`boolean`&&o.push(fl(`selected`,String(e.selected))),typeof e.id==`string`&&a.push(fl(`id`,I(e.id,i)),...o),typeof e.text==`string`&&a.length===0)return ll(I(e.text,i),o);if(typeof e.label==`string`&&a.length===0&&a.push(fl(`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 ll(e,t=[]){return[[fl(`label`,e),...t].join(` `),[fl(`text`,e),...t].join(` `),[fl(`id`,e),...t].join(` `)].join(` || `)}function ul(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=K(e.childOf,`tapOn.childOf`,[],n)),Object.keys(r).length>0?[JSON.stringify(r)]:[]}function dl(e){let t=il(e.duration);return t?[t]:[]}function fl(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=L(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(L(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(L(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:K(e.visible,`runFlow.when.visible`,[],t)},...e.notVisible===void 0?{}:{notVisibleSelector:K(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(G.runScript,[r],{...Object.keys(n.env).length>0?{maestro:{runScriptEnv:n.env}}:{}})}function Gl(e){let{scriptPath:n,env:r}=e,i=z.readFileSync(n,`utf8`),a=Object.create(null);try{Lr.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(B.isAbsolute(e))return e;if(!n.baseDir)throw new t(`INVALID_ARGS`,`runScript file paths require replay input to have a source path.`);return B.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 iY(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,iX)}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 iX(e,t){return"__proto__"===e||"constructor"===e||"prototype"===e?void 0:t}let iQ={launchApp:({value:e,config:t,context:r})=>[iA(e,t,r)],tapOn:({value:e,context:t})=>[function(e,t){if("string"==typeof e)return rm(iO,[iq(rv(e,t))],iB(e));if(rh(e)&&"string"==typeof e.point){rw(e,"tapOn",["point","repeat","delay","optional","label"]);let t=rA(e.point);return"percent"===t.kind?rm(i$,[String(t.x),String(t.y)],iH(e)):rm("click",[String(t.x),String(t.y)],iH(e))}rh(e)&&rw(e,"tapOn",["id","text","childOf","enabled","index","selected","repeat","delay","optional","label"]);let r=iB(e);return rm(iO,[iT(e,"tapOn",["repeat","delay","optional","label","index","childOf"],t),...function(e,t){if(!rh(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=iT(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(rh(e)&&"string"==typeof e.point){rw(e,"doubleTapOn",["point","delay"]);let t=rd(e.point);return rm("click",[String(t.x),String(t.y)],iK(e))}return rh(e)&&rw(e,"doubleTapOn",["id","text","enabled","selected","delay"]),rm("click",[iT(e,"doubleTapOn",["delay"],t)],iK(e))}(e,t)],longPressOn:({value:e,context:t})=>[function(e,t){if(rh(e)&&"string"==typeof e.point){rw(e,"longPressOn",["point"]);let t=rd(e.point);return rm("longpress",[String(t.x),String(t.y),"3000"])}return rh(e)&&rw(e,"longPressOn",["id","text","enabled","selected"]),rm("click",[iT(e,"longPressOn",[],t)],{holdMs:3e3})}(e,t)],inputText:({value:e,context:t})=>[rm("type",[rv(function(e){if("string"==typeof e)return e;if(!rh(e))throw new l("INVALID_ARGS","inputText expects a string or map.");if(rw(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})=>[iC(e)],pasteText:({value:e,context:t,name:r})=>[rm("type",[rv(ry(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=rv((l=n,u=s,"string"==typeof l?l:rh(l)?(rw(l,u,["link"]),ry(`${u}.link`,l.link)):ry(u,l)),o),("ios"===o.platform||"android"===o.platform)&&i.appId?rm("open",[rv(rg(i,s),o),d],"ios"===o.platform?{maestro:{prewarmRunnerBeforeOpen:!0}}:void 0):rm("open",[d]))]},assertVisible:({value:e,context:t,name:r})=>[rm(iN,[iT(e,r,[],t),"17000"])],assertNotVisible:({value:e,context:t,name:r})=>[rm(iD,[iT(e,r,[],t)])],extendedWaitUntil:({value:e,context:t})=>(function(e,t){if(!rh(e))throw new l("INVALID_ARGS","extendedWaitUntil expects a map.");rw(e,"extendedWaitUntil",["visible","notVisible","timeout"]);let r=e.visible??e.notVisible;if(void 0===r)throw rb("Only Maestro extendedWaitUntil.visible/notVisible is supported.");let a=iT(r,"extendedWaitUntil",[],t),n=String(rS(e,17e3));return void 0!==e.notVisible?[rm(iD,[a,n])]:[rm(iN,[a,n],{maestro:{allowAlreadyPastLoading:!0}})]})(e,t),takeScreenshot:({value:e,context:t,name:r})=>[rm("screenshot",[rv(ry(r,e),t)])],scroll:({value:e})=>[function(e){if(null!=e)throw rb("Maestro scroll options are not supported yet.");return rm("scroll",["down"])}(e)],scrollUntilVisible:({value:e,context:t})=>(function(e,t){if("string"==typeof e)return[rm(iM,[iq(rv(e,t)),"5000","down"])];if(!rh(e))throw new l("INVALID_ARGS","scrollUntilVisible expects a string or map.");rw(e,"scrollUntilVisible",["element","direction","timeout"]);let r=iT(e.element,"scrollUntilVisible.element",[],t),a="string"==typeof e.direction?iV(e.direction,"scrollUntilVisible.direction"):"down";return[rm(iM,[r,String(rS(e,5e3)),a])]})(e,t),swipe:({value:e,context:t})=>[function(e,t){var r,a,n;let i;if(!rh(e))throw new l("INVALID_ARGS","swipe expects a map.");rw(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=iF("string"==typeof r.direction?r.direction:"up"),rm(iL,[iT(a,"swipe.from",[],n),i,...iU(r)])):"string"==typeof e.direction?rm(iP,["direction",iF(e.direction),...iU(e)]):function(e){let{start:t,end:r}=function(e){if("string"==typeof e.start&&"string"==typeof e.end)return{start:rA(e.start),end:rA(e.end)};throw rb("Only Maestro swipe start/end coordinates are supported.")}(e);var a=t,n=r,i=iE(e.duration);if("absolute"===a.kind&&"absolute"===n.kind)return rm("swipe",[String(a.x),String(a.y),String(n.x),String(n.y),...i?[i]:[]]);if("percent"===a.kind&&"percent"===n.kind)return rm(iP,["percent",String(a.x),String(a.y),String(n.x),String(n.y),...i?[i]:[]]);throw rb("Maestro swipe start/end must both be absolute pixels or both be percentages.")}(e)}(e,t)],hideKeyboard:()=>[rm("keyboard",["dismiss"])],pressKey:({value:e})=>[function(e){let t=ry("pressKey",e).toLowerCase();if("back"===t)return rm("back");if("enter"===t||"return"===t)return rm(ix);if("home"===t)return rm("home");throw rb(`Maestro pressKey "${t}" is not supported yet.`)}(e)],back:()=>[rm("back")],waitForAnimationToEnd:({value:e})=>[rm(iR,[String(rS(e,15e3))])],stopApp:({value:e,config:t,context:r})=>[ib(e,t,r)],runScript:({value:e,context:t})=>{let a;return[rm(ik,[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:rv(e,t),env:{}};if(!rh(e))throw new l("INVALID_ARGS","runScript expects a file path string or map.");return rw(e,"runScript",["file","env"]),{file:rv(ry("runScript.file",e.file),t),env:Object.fromEntries(Object.entries(ra(e.env,"runScript.env")).map(([e,r])=>[e,rv(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(rv(e,r),r).actions;if(!rh(e))throw new l("INVALID_ARGS","runFlow expects a file path string or map.");rw(e,"runFlow",["file","commands","env","when","label"]);let i=function(e,t){var r,a;if(null==e)return{shouldRun:!0};if(!rh(e))throw new l("INVALID_ARGS","runFlow.when expects a map.");return(rw(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 ij(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=rv(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:iT(r.visible,"runFlow.when.visible",[],a)}:{},...void 0!==r.notVisible?{notVisibleSelector:iT(r.notVisible,"runFlow.when.notVisible",[],a)}:{}})}}(e.when,r);if(!i.shouldRun)return[];let o={...r,env:{...r.env,...ra(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 rb("Maestro runFlow.when cannot combine visible and notVisible yet.");let n=r?"visible":"notVisible",i=r??a??"";return[iz("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(rv(e.file,r),r).actions;if(Array.isArray(e.commands))return n(ro(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,i1),repeat:({value:e,config:t,context:r,deps:a})=>(function(e,t,r,a,n){var i;if(!rh(e))throw new l("INVALID_ARGS","repeat expects a map.");if(rw(e,"repeat",["times","commands","while"]),void 0!==e.while)throw rb("Maestro repeat.while is not supported yet. Only deterministic repeat.times is supported.");let o=(i=e.times,iW(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=ro(e.commands);return Array.from({length:o}).flatMap(()=>n(s,t,r,a))})(e,t,r,a,i1),retry:({value:e,config:t,context:r,deps:a})=>(function(e,t,r,a,n){var i,o;if(!rh(e))throw new l("INVALID_ARGS","retry expects a map.");if(rw(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:iW(i,o,"retry.maxRetries")),u=n(ro(e.commands),t,r,a);return[iz("retry",[String(s)],{kind:"retry",maxRetries:s,actions:u})]})(e,t,r,a,i1)},iZ={launchApp:(e,t)=>[iA(void 0,e,t)],scroll:()=>[rm("scroll",["down"])],hideKeyboard:()=>[rm("keyboard",["dismiss"])],eraseText:()=>[iC(void 0)],back:()=>[rm("back")],waitForAnimationToEnd:()=>[rm(iR,["15000"])],stopApp:(e,t)=>[ib(void 0,e,t)]};function i0(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=iZ[n])?a(i,o):rr(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],c=iQ[u];return c?c({value:d,config:t,context:r,deps:a,name:u}):rr(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 i1(e,t,r,a){return e.flatMap((e,n)=>i0(e,t,n+1,r,a))}function i3(e,t){let{config:r,commands:a}=i2(ru(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=i0(r,t,a,n,{parseRunFlowFile:i5});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!==ix||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!==iO)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 i2(e){if(0===e.length)throw new l("INVALID_ARGS","Maestro flow is empty.");if(Array.isArray(e[0]))return{config:{},commands:ro(e[0])};let t=function(e){if(!rh(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}:{},...rh(e.env)?{env:ra(e.env,"env")}:{},...Array.isArray(e.onFlowStart)?{onFlowStart:ro(e.onFlowStart)}:{},...Array.isArray(e.onFlowComplete)?{onFlowComplete:ro(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:ro(r)}}function i5(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),i3(i,{...a,baseDir:r.dirname(n),visitedPaths:o})}let i4=/[*?[\]{}]/;function i8(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 i6(e,t){return"number"==typeof e?e:t}function i7(e,t){let r="number"==typeof e?e:t;return"number"!=typeof r?0:Math.max(0,Math.min(3,r))}function i9(e,a,n){var i,o;let s=ex.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,!i4.test(i)&&(o=s,!i4.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 oe(e,t){let r=ot(e),a=ot(t);return r!==a?r-a:e.localeCompare(t)}function ot(e){return+(".ad"===r.extname(e))}function or(e){return[...new Set(e.map(e=>r.normalize(e)))]}function oa(e){return"maestro"===e}let on=["failed to start daemon","runner did not accept connection","xcodebuild exited early","device is offline","device offline","device unauthorized"];function oi(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&&tW(i)||(a=s.code,n=s.message,o=`${a}
|
|
26
|
-
|
|
27
|
-
`)}async function oc(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 op(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 c({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,...oh(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),...om(u.data?.snapshotDiagnostics),...function(e){return oh(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 c({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,...oh(u)}),{file:o.path,title:o.title,session:r.finalSessionName,status:"failed",durationMs:a,attempts:r.attempts,artifactsDir:t.testArtifactsDir,error:d,...om((i=r.finalResponse,i?.ok?i.data?.snapshotDiagnostics:i?.error.details?.snapshotDiagnostics)),...function(e){return oh(e)}(u)}}(t,a,n,i)}async function op(e,t){!function(e,t){let{entry:r,sessionName:a,suiteInvocationId:n,caseIndex:i,suiteIndex:o,suiteTotal:s,shard:l}=e;c({type:"replay-test",file:r.path,title:r.title,status:"start",index:o,total:s,maxAttempts:t.maxAttempts,session:i8(a,n,r.path,i),artifactsDir:t.testArtifactsDir,...oh(l)})}(e,t);let r={finalSessionName:"",attempts:0,finalAttemptDurationMs:0,attemptFailures:[]};for(let p=0;p<=e.retries&&!eL(e.requestId);p+=1){var a,n,i,o,s,l,u,d;let f=await of(e,t,p);if((a=r).finalResponse=(n=f).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=f.response,s=p,o.ok||eL(i.requestId)||oi(o)||s>=i.retries)break;l=e,u=t,(d=f).response.ok||c({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,...oh(l.shard)})}return r}async function of(e,a,n){var i;let{entry:o,sessionName:s,suiteInvocationId:l,caseIndex:u,suiteIndex:d,suiteTotal:c,requestId:p,timeoutMs:f,shard:m}=e,h=n+1,g=Date.now(),w=i8(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 eO(`${t??a}${l}:test:${i+1}:${r.basename(n)}:attempt:${o+1}`,a)}({requestId:p,suiteInvocationId:l,filePath:o.path,caseIndex:u,attemptIndex:n,shardIndex:m?.shardIndex}),A=await oo({filePath:o.path,sessionName:w,requestId:y,parentRequestId:p,timeoutMs:f,platform:o.metadata.platform,target:o.metadata.target,artifactsDir:v,shard:m,progress:{file:o.path,title:o.title,index:d,total:c,attempt:h,maxAttempts:a.maxAttempts,session:w,artifactsDir:a.testArtifactsDir,...oh(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,c=[...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||c.push(i.error.logPath);let p=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}(c,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");p.length>0&&f.push(`copiedArtifacts: ${p.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 om(e){let t=rD(e);return t?{snapshotDiagnostics:t}:{}}function oh(e){return e?{shardIndex:e.shardIndex,shardCount:e.shardCount,deviceId:e.device.id,deviceName:e.device.name}:{}}async function og(e,t,r){let a=function(e){let t=ow(e?.shardAll,"--shard-all"),r=ow(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 ov(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 ow(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 ov(e,t){var r,a,n,i,o,s,u,d,c;let p,f,m=(r=e,"string"!=typeof(p=r?.device)||0===p.trim().length?[]:p.split(",").map(e=>e.trim()).filter(Boolean)),h=(n=await eD((a=e,f=tX(a?.androidDeviceAllowlist),{platform:a?.platform,target:a?.target,iosSimulatorSetPath:tt({simulatorSetPath:tK(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=oA(e),r=s.find(r=>oy(r,d)&&(r.id===e||oA(r.name)===t));if(!r)throw new l("DEVICE_NOT_FOUND",`No shard device matched ${e}`);return r})):n.filter(e=>{var t;return!!oy(t=e,o)&&!!tn(t)&&!1!==t.booted}).sort(ob));if(h.length<t){throw new l("DEVICE_NOT_FOUND",`test sharding requires ${(c=t,`${c} device${1===c?"":"s"}`)}, but only ${h.length} matched`)}return h.slice(0,t)}function oy(e,t){return!(!ti(e,t?.platform)||t?.target&&(e.target??"mobile")!==t.target)}function oA(e){return e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim()}function ob(e,t){return e.id.localeCompare(t.id)}async function oS(e){let{req:t,sessionName:r,runReplay:a,cleanupSession:n,finalizeAttempt:i}=e;if((t.positionals?.length??0)===0)return H("INVALID_ARGS","test requires at least one path or glob");try{var s,l,u,d;let e,o,p,f,m,h,g=Date.now(),w=await oI(t);s=w,c({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 v=w.shardPlan?function(e){let{entries:t,total:r}=e,a=[];for(let[e,n]of t.entries())"skip"===n.kind&&(c({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:w.entries,total:w.total}):[];w.shardPlan?v.push(...await o_({shards:w.shardPlan.shards,sessionName:r,suiteInvocationId:w.suiteInvocationId,cwd:t.meta?.cwd,requestId:t.meta?.requestId,flags:t.flags,suiteArtifactsDir:w.suiteArtifactsDir,suiteTotal:w.total,runReplay:a,cleanupSession:n,finalizeAttempt:i})):v.push(...await oD({discoveryEntries:w.entries,sessionName:r,suiteInvocationId:w.suiteInvocationId,cwd:t.meta?.cwd,requestId:t.meta?.requestId,flags:t.flags,suiteArtifactsDir:w.suiteArtifactsDir,suiteTotal:w.total,runReplay:a,cleanupSession:n,finalizeAttempt:i}));let y=(l=w.total,u=v,d=Date.now()-g,e=u.filter(e=>"passed"===e.status).length,p=(o=u.filter(e=>"failed"===e.status)).length,f=u.filter(e=>"skipped"===e.status).length,m=e+p,h=rR(u.map(e=>"skipped"===e.status?void 0:e.snapshotDiagnostics)),{total:l,executed:m,passed:e,failed:p,skipped:f,notRun:Math.max(0,l-m-f),durationMs:d,failures:o,tests:u,...h?{snapshotDiagnostics:h}:{}});return{ok:!0,data:y}}catch(t){let e=o(t);return H(e.code,e.message)}}async function oI(e){var a,n,i,o;let s=function(e){let{inputs:a,cwd:n,platformFilter:i,replayBackend:o}=e,s=new Set(oa(o)?[".yaml",".yml",".ad"]:[".ad"]),u=function(e,a,n,i){if(!oa(i))return[...new Set(e.flatMap(e=>i9(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=ex.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"}:i9(e,a,n)}(i,a,n);"file"===e.source?o.push(...e.paths):s.push("directory"===e.source?or(e.paths):e.paths.map(e=>r.normalize(e)).sort(oe))}return or([...o,...s.flat()])}(a,n??process.cwd(),s,o),d=[];for(let e of u){var c,p,f,m;let a=t.readFileSync(e,"utf8"),n=rc(a),s=(c=a,p=e,oa(o)&&".ad"!==r.extname(p)?function(e){let{config:t}=i2(ru(e));return t.name}(c):void 0);if(!i){d.push({kind:"run",path:e,title:s,metadata:n});continue}if(!n.platform){oa(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?to(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,c=(a=e.meta?.requestId,(a?.trim()||`${process.pid}-${Date.now().toString(36)}`).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"suite"),p=await og(e.flags,u,d);return{entries:s,runnable:u,shardPlan:p,suiteInvocationId:c,suiteArtifactsDir:(i=e,o=c,function(e){let{artifactsDir:t,cwd:a,suiteInvocationId:n}=e,i=ex.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:p?.total??s.length}}async function o_(e){return(await Promise.allSettled(e.shards.map(async t=>await ok({...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:oN(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 ok(e){let{shard:t,sessionName:r}=e;return await ox({...e,entries:t.entries,sessionName:oN(r,t),shard:t})}function oN(e,t){return`${e}:shard-${t.shardIndex+1}`}async function oD(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,f=[],m=0;for(let[e,h]of t.entries()){if(eL(i))break;if("skip"===h.kind){c({type:"replay-test",file:h.path,status:"skip",index:e+1,total:l,message:h.message}),f.push({file:h.path,status:"skipped",durationMs:0,reason:h.reason,message:h.message});continue}m+=1;let t=await oc({entry:h,sessionName:r,suiteInvocationId:a,caseIndex:m-1,cwd:n,requestId:i,retries:i7(o?.retries,h.metadata.retries),timeoutMs:i6(o?.timeoutMs,h.metadata.timeoutMs),suiteArtifactsDir:s,suiteIndex:e+1,suiteTotal:l,runReplay:u,cleanupSession:d,finalizeAttempt:p});if(f.push(t),oR(t,o,i))break}return f}async function ox(e){let{entries:t,sessionName:r,suiteInvocationId:a,cwd:n,requestId:i,flags:o,suiteArtifactsDir:s,suiteTotal:l,shard:u,runReplay:d,cleanupSession:c,finalizeAttempt:p}=e,f=[];for(let[e,m]of t.entries()){if(eL(i))break;let{entry:t,suiteIndex:h}=m,g=await oc({entry:t,sessionName:r,suiteInvocationId:a,caseIndex:e,cwd:n,requestId:i,retries:i7(o?.retries,t.metadata.retries),timeoutMs:i6(o?.timeoutMs,t.metadata.timeoutMs),suiteArtifactsDir:s,suiteIndex:h,suiteTotal:l,shard:u,runReplay:d,cleanupSession:c,finalizeAttempt:p});if(f.push(g),oR(g,o,i))break}return f}function oR(e,t,r){return eL(r)||t?.failFast===!0||oi(e)}let oM={maestro:{parse:function(e,t={}){var a;let n;return i3(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:rs(a.platform),env:{},envOverrides:a.env??{},visitedPaths:n}))}}};function oP(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=rG(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 oL(e){let{action:t,sessionName:r,logPath:a,sessionStore:n}=e;if(!(rU(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),rU(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&&oO(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}=r$(e.positionals);r&&t.push(r.selectorExpression)}if("wait"===e.command){let{selectorExpression:r}=oP(e.positionals??[]);r&&t.push(r)}return et(t).filter(e=>e.trim().length>0)})(t).map(e=>rB(e)).filter(e=>null!==e);if(0===o.length)return null;let s=rU(t.command)||"fill"===t.command,l=rU(t.command)||"fill"===t.command||"get"===t.command&&t.positionals?.[0]==="text",u=await o$(i,t,a,s,n);for(let e of o){let r=rM(u.nodes,e,{platform:i.device.platform,requireRect:s,requireUnique:!0,disambiguateAmbiguous:l});if(!r)continue;let a=rC(r.node,i.device.platform,{action:"fill"===t.command?"fill":rU(t.command)?"click":"get"}).join(" || ");if(rU(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&&oO(t)?t:void 0}(e.positionals??[]);return r?[t,r]:[t]}(t,a):[a]};if("fill"===t.command){let e=k(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}=r$(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}=oP(t.positionals??[]),r=[a];return e&&r.push(e),{...t,positionals:r}}}return null}function oO(e){return void 0!==e&&""!==e.trim()&&Number.isFinite(Number(e))}async function o$(e,t,r,a,n){let i=eS(await f(e.device,"snapshot",[],t.flags?.out,{...eN(r,{...t.flags??{},snapshotInteractiveOnly:a},e.appBundleId,e.trace?.outPath)}),{...t.flags??{},snapshotInteractiveOnly:a});return er(e,i),n.set(e.name,e),i}let oC=.35,oE=120,oV=360,oF=8;function oT(e,t){return Math.round(Math.min(oV,Math.max(oE,"number"==typeof e?e*oC:0,1.5*t)))}let oq=new WeakMap,oU=new WeakMap,oG=new WeakMap;function oH(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}async function oB(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=ef(oK(n.data)))&&oq.set(t,r)),n}function oK(e){return Array.isArray(e?.nodes)?e:void 0}function oj(e,t){e&&oU.set(e,{selector:t})}function oz(e){e&&oG.delete(e)}let oW=new Map([["button",0],["link",0],["textfield",0],["textview",0],["searchfield",0],["switch",0],["slider",0],["cell",1],["statictext",2]]);function oJ(e,t,r,a,n,i={}){let o=o0(e,t,a);if(r.childOf){let t=o0(e,r.childOf,a);if(0===t.length)return{ok:!1,message:`Maestro childOf parent did not match: ${r.childOf}`};let n=rE(e.nodes);o=o.filter(r=>t.some(t=>rO(e.nodes,r,t,n)))}let s=oX({nodes:e.nodes,matches:o,platform:a}),l=o2(e.nodes,s.matches,r.index,oZ(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 oY(e,t,r,a){let n=o0(e,t,r,{allowLeadingCompositeLabelMatch:!1}),i=oX({nodes:e.nodes,matches:n,platform:r}),o=o2(e.nodes,i.matches,void 0,oZ(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 oX(e){let t=e.matches.filter(t=>rq({predicate:"visible",node:t,nodes:e.nodes,platform:e.platform}).pass),r=function(e,t,r){let a=tF(e);if(!a.detected||!a.redBox)return{matches:t,blockedByReactNativeOverlay:!1};let n=tV(a),i=n.filter(t=>rq({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 oQ(e){return e?.platform==="android"?"android":"ios"}function oZ(e){let t=rK(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 o0(e,t,r,a={}){for(let n of rK(t).selectors){let t=e.nodes.filter(e=>(function(e,t,r,a){return!!rV(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?rV(e,{raw:t.key,terms:[t]},r):o1((i=e,"id"===(o=t.key)?i.identifier:"label"===o?i.label:"value"===o?i.value:rP(i)),t.value,a)})(e,t,r,a))})(e,n,r,a));if(t.length>0)return t}return[]}function o1(e,t,r={}){var a;let n=e??"",i=rH(n),o=rH(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 o3(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 o2(e,t,r,a,n,i=!1,o=!1,s){var l,u,d,c,p,f,m,h,g,w,v,y,A,b,S,I,_,k,N;let D,x,R,M,P=rE(e),L=(l=e,u=t,d=P,c=a,p=r,f=n,m=i,R=(x=(D=u.map(e=>{var t;let r;return(r=o3(l,t=e,d))?{node:t,rect:r.rect,inheritedRect:r.inherited}:null}).filter(e=>!!e)).filter(e=>!e.inheritedRect)).length>0?x:D,c&&void 0===p?(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,c,p;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===sa(e.node,r));if(n.length>=2){let t=o4(e,n,r,a);if(t)return t}let i=t.filter(e=>1===sa(e.node,r));return n.length>0||i.length<2?null:o4(e,i,r,a)}(o,s,l,d)??o5(o,s,l,d):o5(o,s,l,d));return(c=f,p=a,n&&p&&c)?function(e,t,r){var a,n,i,o,s,l,u,d,c,p,f,m,h,g,w,v,y,A;let b,S,I,_,k,N,D,x;if(a=t,n=r,!(("cell"===(b=rF(a.node.type??""))||"other"===b||"scrollview"===b||"scroll-area"===b)&&!(a.rect.width<120)&&!(a.rect.height<32)&&!(a.rect.height>80)&&1>=sa(a.node,n)))return null;let R=(i=e,o=t,s=r,l=rE(e),i.filter(e=>{var t,r,a;let n;return e.index!==o.node.index&&!!e.rect&&rO(i,e,o.node,l)&&(t=e,r=o.rect,a=s,!("button"!==(n=rF(t.type??""))&&"cell"!==n&&"other"!==n||1>=sa(t,a))&&!(t.rect.width<16)&&!(t.rect.height<16)&&!!st(r,t.rect)&&o9(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,c=P,p=M,N=c.filter(e=>{var t,r;return t=e.width,r=p,!(t<24)&&!(r<24)&&t>=.4*r&&t<=1.6*r}),D=(f=u,m=d,_=c.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"===rF(h.node.type??"")&&1>=sa(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,(se(_.node)?null:rL(I,_.node,k,e=>{if(!se(e))return null;let t=o3(I,e,k);return t&&function(e,t,r){var a,n;if(!st(t,e)||(a=e,!((n=t).height<32||n.height>80||a.height<.75*n.height||.75>o9(a,n))&&!(n.width<240)&&n.width>=3*a.width))return!1;let i=o6(t),o=o6(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 o5(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===sa(e.node,r));if(l.length<2)return t;let u=rE(e),d=l.map(t=>({candidate:t,container:o8(e,t.node,u)})).filter(e=>!!e.container);if(d.length<2||d.length!==l.length)return t;let c=d.filter(e=>{var t;return t=e,d.some(e=>e!==t&&t.container.index!==e.container.index&&sr(t.container.rect,e.container.rect)>=.6)});if(c.length<2)return t;let p=(o=Math.max(...i=(n=c).map(e=>o6(e.container.rect))),(s=Math.min(...i))<=0||o<1.2*s?[]:n.filter(e=>o6(e.container.rect)===o).map(e=>e.candidate));if(p.length>0)return p;let f=function(e,t,r,a){if(!r)return[];let n=o8(e,r.node,a),i=n&&st(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>sr(e.rect,r.rect)?1/0:Math.abs(e.index-r.index);if(sr(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,c,a,u);if(f.length>0)return f;let m=Math.max(...c.map(e=>e.container.index)),h=c.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=sa(e.node,r)-sa(t.node,r);if(0!==a)return a}let a=o7(e.node)-o7(t.node);if(0!==a)return a;let n=Number(e.inheritedRect)-Number(t.inheritedRect);if(0!==n)return n;let i=r&&o7(e.node)===o7(t.node)?o6(t.rect)-o6(e.rect):o6(e.rect)-o6(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 o4(e,t,r,a){let n=rE(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||!st(i.rect,o.rect)||o6(i.rect)<2*o6(o.rect))&&rO(a,o.node,i.node,s)})});return o5(e,i,r,a)}function o8(e,t,r){return rL(e,t,r,e=>{let t;return!e.rect||"scrollview"!==(t=rF(e.type??""))&&"scroll-area"!==t&&"list"!==t||e.rect.width<240||e.rect.height<320?null:e})}function o6(e){return e.width*e.height}function o7(e){return oW.get(rF(e.type??""))??3}function o9(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 se(e){let t=rF(e.type??"");return!0===e.hittable||"button"===t||"link"===t||"cell"===t||"textfield"===t||"searchfield"===t||"switch"===t||"slider"===t}function st(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 sr(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(o6(e),o6(t)))}function sa(e,t){let r=[e.label,rP(e),e.identifier,e.value].filter(e=>!!e);return r.some(e=>e===t)?0:r.some(e=>rH(e)===rH(t))?1:r.some(e=>o1(e,t))?2:3}async function sn(e){let t=sw(e.positionals,{command:"assertVisible",defaultTimeoutMs:17e3});if(!t.ok)return t.response;let r=sg(e.baseReq,t.selector);return r?await si(e,t,r):await ss(e,t)}async function si(e,t,r){let a=Date.now(),n=await so(e,t,r);if(n.ok){var i;if(i=e.baseReq,i.flags?.platform==="android"){let r=await sv(e,t.selector,"assertVisible");if(!r.visible){let n=sh(e.baseReq,t,r,a);return"return"===n.kind?n.response:await ss(e,t)}}return oj(e.scope,t.selector),sb({ok:!0,data:{selector:t.selector,nativeWait:!0,query:r,response:n.data}},t.selector,a)}return await sl(e,t,n,a)}async function so(e,t,r){return await e.invoke({...e.baseReq,command:"wait",positionals:[r,String(t.timeoutMs)]})}async function ss(e,t){let r,a,n=Date.now(),i=t.timeoutMs+1e3,o=!1;for(;;){let s=Date.now(),l=await sv(e,t.selector,"assertVisible");if(l.visible)return sb(l.response,t.selector,n);r=l.response,a=l.snapshot??a;let u=sh(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 rj(250)}let s=r??oH("COMMAND_FAILED",`Expected visible but did not match: ${t.selector}`,{selector:t.selector,timeoutMs:t.timeoutMs}),l=await su(e,t,a);return l||sS(s,a,e.baseReq)}async function sl(e,t,r,a){let n=await sv(e,t.selector,"assertVisible");if(n.visible)return sb(n.response,t.selector,a);let i=sh(e.baseReq,t,n,a);if("return"===i.kind)return i.response;let o=await su(e,t,n.snapshot);return o||sS(r,n.snapshot,e.baseReq)}async function su(e,t,r){if(e.baseReq.flags?.platform!=="android")return null;let a=function(e){if(!e)return;let t=oG.get(e);return oG.delete(e),t}(e.scope);return a?"tap"===a.kind?await sd(e,t,r,a):await sc(e,t,a):null}async function sd(e,t,r,a){if(!r)return null;let n=function(e,t,r){var a;let n,i=oQ(e.baseReq.flags),o=ef(t),s=oJ(t,r.selector,r.options??{},i,o,{promoteTapTarget:!0});if(s.ok)return{ok:!0,target:{kind:"point",point:t_(s.rect)}};let l=oZ(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&&(t5({level:"info",phase:"maestro_assert_visible_retry_tap",data:{selector:t.selector,tapSelector:a.selector,originalPoint:a.point,retryTarget:n.target,timeoutMs:5e3}}),(await sf(e,n.target)).ok)?await sp(e,t,"retryTap"):null}async function sc(e,t,r){return(t5({level:"info",phase:"maestro_assert_visible_retry_swipe",data:{selector:t.selector,swipePositionals:r.positionals,timeoutMs:5e3}}),(await sm(e,r)).ok)?await sp(e,t,"retrySwipe"):null}async function sp(e,t,r){let a={...t,timeoutMs:Math.min(t.timeoutMs,5e3)},n=sg(e.baseReq,a.selector);if(!n)return await ss(e,a);let i=Date.now(),o=await so(e,a,n);return o.ok?(oj(e.scope,a.selector),sb({ok:!0,data:{selector:a.selector,nativeWait:!0,[r]:!0,query:n,response:o.data}},a.selector,i)):await sl(e,a,o,i)}async function sf(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 sm(e,t){return await e.invoke({...e.baseReq,command:"swipe",positionals:t.positionals})}function sh(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=sy(oZ(e));if(!sA(r))return!1;let a=t.nodes.flatMap(e=>[e.label,e.value,e.identifier]).filter(e=>!!e?.trim()).map(e=>sy(e));return!a.some(e=>e.includes("something went wrong"))&&a.some(e=>e!==r&&!sA(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 sg(e,t){return e.flags?.platform!=="ios"&&e.flags?.platform!=="android"?null:oZ(t)}function sw(e,t){let[r,a=String(t.defaultTimeoutMs)]=e;if(!r)return{ok:!1,response:oH("INVALID_ARGS",`${t.command} requires a selector.`)};let n=Number(a);return!Number.isFinite(n)||n<0?{ok:!1,response:oH("INVALID_ARGS",`${t.command} timeout must be a non-negative number.`)}:{ok:!0,selector:r,timeoutMs:n}}async function sv(e,t,r){let a=await oB(e);var n=e,i=t,o=r,s=a;if(!s.ok)return{visible:!1,response:s,infrastructureFailure:!0};let l=oK(s.data);if(!l)return{visible:!1,response:oH("COMMAND_FAILED",`Unable to read snapshot data for ${o}.`),infrastructureFailure:!0};let u=oY(l,i,oQ(n.baseReq.flags),ef(l));return u.ok?(oj(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:oH("COMMAND_FAILED",u.message,{selector:i}),infrastructureFailure:!1,snapshot:l}}function sy(e){return e?.trim().toLowerCase().replace(/\u2026/g,"...")??""}function sA(e){return"loading"===e||"loading..."===e}function sb(e,t,r){return e.ok?{ok:!0,data:{selector:t,...e.data,waitedMs:Date.now()-r}}:e}function sS(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
|
-
`)
|
|
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 sI(e){let t,r=sw(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 sv(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 rj(250)}return n>0?{ok:!0,data:{pass:!0,selector:r.selector,stableSamples:n,waitedMs:Date.now()-a,timeoutMs:r.timeoutMs}}:oH("COMMAND_FAILED",`Expected not visible but matched: ${r.selector}`,{selector:r.selector,timeoutMs:r.timeoutMs,lastResponse:t})}async function s_(e){let t,r,a=Number(e.positionals[0]??15e3);if(!Number.isFinite(a)||a<0)return oH("INVALID_ARGS","waitForAnimationToEnd timeout must be a number.");let n=Date.now();for(;Date.now()-n<a;){let n=await oB(e),i=function(e,t,r){let a=function(e){if(!e.ok)return null;let t=oK(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 rj(250)}return r?.ok===!1?r:{ok:!0,data:{stable:!1,timeoutMs:a}}}async function sk(e){var t,r,a;let[n,i="5000",o="down"]=e.positionals;if(!n)return oH("INVALID_ARGS","scrollUntilVisible requires a selector.");let s=Number(i);if(!Number.isFinite(s)||s<=0)return oH("INVALID_ARGS","scrollUntilVisible timeout must be a positive number.");let l=oZ(n),u=Math.max(1,Math.ceil(s/500)),d=null;for(let t=0;t<u;t+=1){let r=await sE(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}`}}:oH("COMMAND_FAILED",`scrollUntilVisible timed out after ${a}ms for selector: ${r}`)}async function sN(e){let[t,r]=e.positionals,a=Number(t),n=Number(r);if(!Number.isFinite(a)||!Number.isFinite(n))return oH("INVALID_ARGS","tapOn percentage point requires numeric x/y values.");let i=await oB(e);if(!i.ok)return i;let o=oK(i.data);if(!o)return oH("COMMAND_FAILED","Unable to read snapshot data for Maestro percentage point tap.");let s=ef(o);if(!s)return oH("COMMAND_FAILED","Unable to resolve screen size for Maestro percentage point tap.");let l=tg(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&&oz(e.scope),u}async function sD(e){let t=await sx(e);if(t)return t;let r=await sL(e);return r.ok?await sP(e,r,r.durationMs):r.response}async function sx(e){let[t,r,a]=e.positionals;if("direction"===t&&("left"===r||"right"===r)&&"android"!==oQ(e.baseReq.flags))return await e.invoke({...e.baseReq,command:"gesture",positionals:["swipe",r,...a?[a]:[]]})}async function sR(e){var t,r,a,n;let i,[o,s]=e.positionals;if(!o)return oH("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:oH("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 sV(e,o,l.value??{});if(!t.retry)return t.response;i=t.response,await rj(250)}return r=e,a=o,n=i,r.baseReq.flags?.maestro?.optional===!0?{ok:!0,data:{skipped:!0,optional:!0,selector:a}}:n??oH("COMMAND_FAILED",`tapOn timed out for selector: ${a}`)}async function sM(e){let[t,r="up",a]=e.positionals;if(!t)return oH("INVALID_ARGS","swipe.label requires a label selector.");let n=await sU(e,t,{},"swipe.label",{promoteTapTarget:!1});if(!n.ok)return n.response;let i=function(e,t){let r=t_(e.rect),a=e.frame,n=oT(a?.referenceWidth,e.rect.width),i=oT(a?.referenceHeight,e.rect.height),o=oF,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:t$(r.y-i,o,l)}};case"down":return{ok:!0,start:r,end:{x:r.x,y:t$(r.y+i,o,l)}};case"left":return{ok:!0,start:r,end:{x:t$(r.x-n,o,s),y:r.y}};case"right":return{ok:!0,start:r,end:{x:t$(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 sP(e,i,a):oH("INVALID_ARGS",i.message)}async function sP(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&&oG.set(a,n)),o}async function sL(e){var t;let r=((t=e.scope)?oq.get(t):void 0)??await sO(e);if(!r)return{ok:!1,response:oH("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:oH("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:tN({x:(l=tv({direction:i,amount:.6,referenceWidth:o.referenceWidth,referenceHeight:o.referenceHeight})).x1,y:l.y1},o,8),end:tN({x:l.x2,y:l.y2},o,8),durationMs:s};case"left":case"right":return function(e,t,r,a){let n=sC(r,85,50,15,50),[i,o]="left"===e?[85,15]:[15,85],s=s$(r,t,i,50,o,50);return{ok:!0,start:tg(t,i,n.startY,{marginPx:s}),end:tg(t,o,n.endY,{marginPx:s}),durationMs:a}}(a,t,r,n);default:return{ok:!1,response:oH("INVALID_ARGS","Maestro swipe direction must be UP, DOWN, LEFT, or RIGHT.")}}}(n,r,oQ(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:oH("INVALID_ARGS","Maestro percentage swipe requires numeric points.")};let[u,d,c,p]=l,f=sC(r,u,d,c,p),m=s$(r,t,u,d,c,p);return{ok:!0,start:tg(t,u,f.startY,{marginPx:m}),end:tg(t,c,f.endY,{marginPx:m}),durationMs:s}}(n,r,oQ(e.baseReq.flags)):{ok:!1,response:oH("INVALID_ARGS","Maestro screen swipe requires direction or percent.")}}async function sO(e){let t=await oB(e);if(t.ok)return ef(oK(t.data))}function s$(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 sC(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 sE(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 sV(e,t,r){let a=oZ(t),n=await sF(e,t,r);return n.response.ok?{retry:!1,response:n.response}:n.targetResolved&&a?await sq(e,a):{retry:!0,response:n.response}}async function sF(e,t,r){let a=await sU(e,t,r,"tapOn",{promoteTapTarget:!0});return a.ok?await sT(e,t,a.target,r):{response:a.response,targetResolved:!1}}async function sT(e,t,r,a){let n=t_(r.rect);t5({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)&&oU.delete(o),s=e.scope,l={kind:"tap",selector:t,point:n,options:{...a}},s&&oG.set(s,l)}return{response:i,targetResolved:!0}}async function sq(e,t){let r=await e.invoke({...e.baseReq,command:"find",positionals:[t,"click"],flags:{...e.baseReq.flags,findFirst:!0,postGestureStabilization:!0}});return(t5({level:r.ok?"info":"debug",phase:"maestro_fuzzy_tap_fallback",data:{query:t,ok:r.ok}}),r.ok)?(oz(e.scope),{retry:!1,response:r}):{retry:!0,response:r}}async function sU(e,t,r,a,n){let i=await oB({...e,raw:!0});return function(e,t,r,a,n,i){if(!i.ok)return{ok:!1,response:i};let o=oK(i.data);if(!o)return{ok:!1,response:oH("COMMAND_FAILED",`Unable to read snapshot data for ${a}.`)};let s=ef(o),l=oQ(e.baseReq.flags),u=function(e,t,r,a){var n;let i=(n=e.scope)?oU.get(n):void 0;if(!i)return;let o=oY(t,i.selector,r,a);if(o.ok)return t5({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=oJ(o,t,r,l,s,{...n,preferredContext:u,requireOnScreen:!0});if(!d.ok){let e=oZ(t);if(e){let t=function(e,t,r,a,n={}){let i=function(e,t){let r=rH(t);if(!r)return[];let a=[],n=[];for(let t of e.nodes){let e=[t.label,rP(t),t.identifier,t.value].filter(e=>!!e).map(e=>rH(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=oX({nodes:e.nodes,matches:i,platform:r}),s=o2(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:oH("ELEMENT_NOT_FOUND",d.message,{selector:t,options:r,command:a})}}(e,t,r,a,n,i)}async function sG(e){switch(e.command){case iN:return await sn(e);case iD:return await sI(e);case ix:return await sH(e);case iR:return await s_(e);case iM:return await sk(e);case iP:return await sD(e);case iL:return await sM(e);case iO:return await sR(e);case i$:return await sN(e);case ik:return function(e){let[r]=e.positionals;if(!r)return oH("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:iY,http:{post:(e,t)=>(function(e,t,r){let a=t2(process.execPath,["-e",iJ],{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 oH(e.code,e.message,e.details)}}(e);default:return}}async function sH(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 sB(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 sK(e){let t;for(let r=0;r<=e.maxRetries;r+=1){let a=await sB({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 sj(e){let t=await sz(e,e.control);return t.ok?t.matched?await sY(e):{ok:!0,data:{skipped:!0,condition:e.control.mode,selector:e.control.selector}}:t.response}async function sz(e,t){if("visible"===t.mode)return await sW(e,t);let r=await sJ(e,t.selector);return r.ok?{ok:!0,matched:!r.matched}:{ok:!1,response:r.response}}async function sW(e,t){let r=Date.now();for(;;){let a=await sJ(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 rj(250)}}async function sJ(e,t){var r,a;let n,i=await oB(e);return i.ok?(r=e,a=t,(n=oK(i.data))?{ok:!0,matched:oY(n,a,oQ(r.baseReq.flags),ef(n)).ok}:{ok:!1,response:oH("COMMAND_FAILED","Unable to read snapshot data for runFlow.when.")}):{ok:!1,response:i}}async function sY(e){let t=await sB({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 sX(e){let{req:t,sessionName:r,action:a,scope:n,filePath:i,line:o,step:s,tracePath:l,invoke:u}=e,d=rk(a,n,{file:i,line:o}),c=Date.now();s0(l,{type:"replay_action_start",ts:new Date(c).toISOString(),replayPath:i,line:o,step:s,command:d.command,positionals:d.positionals??[]});let p=await sQ({req:t,sessionName:r,resolved:d,scope:n,line:o,step:s,invoke:u,invokeReplayAction:e=>sX({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 s0(l,{type:"replay_action_stop",ts:new Date(f).toISOString(),replayPath:i,line:o,step:s,command:d.command,ok:p.ok,durationMs:f-c,resultTiming:p.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}))}(p.data):void 0,errorCode:p.ok?void 0:p.error.code}),p}async function sQ(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,t7(t,{...n.flags??{}})),c={token:r.token,session:a,flags:d,runtime:n.runtime,meta:r.meta,internal:r.internal},p=await sZ({control:n.replayControl,baseReq:c,line:o,step:s,invoke:l,invokeReplayAction:u})??await sG({command:n.command,baseReq:c,positionals:n.positionals??[],scope:i,line:o,step:s,invoke:l,invokeReplayAction:u})??await l({...c,command:n.command,positionals:n.positionals??[]});if(p.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}(p.data);e&&rN(i,e)}return p}async function sZ(e){let{control:t,baseReq:r,line:a,step:n,invoke:i,invokeReplayAction:o}=e;if(t){switch(t.kind){case"retry":return await sK({actions:t.actions,maxRetries:t.maxRetries,line:a,step:n,invokeReplayAction:o});case"maestroRunFlowWhen":return await sj({baseReq:r,control:t,line:a,step:n,invoke:i,invokeReplayAction:o})}return t}}function s0(e,r){e&&t.appendFileSync(e,`${JSON.stringify(r)}
|
|
31
|
-
`)}async function s1(e){let{req:a,sessionName:n,logPath:i,sessionStore:s,tracePath:u,invoke:d}=e,p=a.positionals?.[0];if(!p)return H("INVALID_ARGS","replay requires a path");let f="",m=new Set;try{var h,g,w,v,y,A,b,S,I,_,k,N,D,x,R,M,P,L,O,$;f=ex.expandHome(p,a.meta?.cwd);let e=t.readFileSync(f,"utf8"),o=e.trimStart()[0];if("{"===o||"["===o)return H("INVALID_ARGS","replay accepts .ad script files. JSON replay payloads are no longer supported.");let C=function(e,t,r={}){var a;let n=function(e){let t=e?.replayBackend;if("string"!=typeof t)return;let r=oM[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,{...rf(ri(a?.replayShellEnv)),...rp(rl(a?.replayEnv))})}),updateUnsupportedMessage:"replay -u is not supported for compat flow input. Convert to .ad first, then update that replay file."}:{...rn(e),metadata:rc(e)}}(e,a.flags,{sourcePath:f}),E=C.metadata,V=E.platform||E.target?{...a,flags:(h=a.flags,g=E,{...h??{},...void 0!==g.platform&&h?.platform===void 0?{platform:g.platform}:{},...void 0!==g.target&&h?.target===void 0?{target:g.target}:{}})}:a,F=C.actions,T=C.actionLines;if(a.flags?.replayUpdate===!0&&C.updateUnsupportedMessage)return H("INVALID_ARGS",C.updateUnsupportedMessage);if(a.flags?.replayUpdate===!0&&E.env&&Object.keys(E.env).length>0)return H("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(s6(t.flags)||s6(t.runtime))return!0}return!1}(F))return H("INVALID_ARGS","replay -u does not yet preserve ${VAR} substitutions. Resolve or inline the variables before running with -u.");let q=r_({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 c=o.device;"string"==typeof c&&c.length>0&&(l.AD_DEVICE=c);let p="string"==typeof o.serial?o.serial:o.udid;"string"==typeof p&&p.length>0&&(l.AD_DEVICE_ID=p),"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:V,sessionName:n,metadata:E,resolvedPath:f}),fileEnv:E.env,shellEnv:rf(ri(a.flags?.replayShellEnv)),cliEnv:rp(rl(a.flags?.replayEnv))}),U=a.flags?.replayUpdate===!0,G=u??s.get(n)?.trace?.outPath,B=[],j=0;for(let e=0;e<F.length;e+=1){let t=F[e];if(!t||"replay"===t.command)continue;!function(e,t,r,a){var n;let i=K();i&&c({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=rB(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)})})}(f,e,F.length,t);let r=s5(s,n),a=await sX({req:V,sessionName:n,action:t,scope:q,filePath:f,line:T[e]??0,step:e+1,tracePath:G,invoke:d});if(B.push(...s4(s,n,r)),a.ok){s2(a).forEach(e=>m.add(e));continue}if(s2(a).forEach(e=>m.add(e)),!U){return w=a,v=t,y=e,A=f,b=[...m],S=B,s3(w,v,y,A,b,rx(S))}let o=await oL({action:t,sessionName:n,logPath:i,sessionStore:s});if(!o){return I=a,_=t,k=e,N=f,D=[...m],x=B,s3(I,_,k,N,D,rx(x))}F[e]=o;let l=s5(s,n);if(a=await sX({req:V,sessionName:n,action:o,scope:q,filePath:f,line:T[e]??0,step:e+1,tracePath:G,invoke:d}),B.push(...s4(s,n,l)),!a.ok){return s2(a).forEach(e=>m.add(e)),R=a,M=o,P=e,L=f,O=[...m],$=B,s3(R,M,P,L,O,rx($))}s2(a).forEach(e=>m.add(e)),j+=1}U&&j>0&&rI(f,F,s.get(n));let z=rx(B);return{ok:!0,data:{replayed:F.length,healed:j,session:n,artifactPaths:[...m],...z?{snapshotDiagnostics:z}:{}}}}catch(t){let e=o(t);return H(e.code,e.message,m.size>0?{artifactPaths:[...m]}:void 0)}}function s3(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} (${rT(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 s2(e){if(!e.ok){let t=e.error.details?.artifactPaths;return Array.isArray(t)?[...new Set(t.filter(e=>"string"==typeof e&&s8(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=>s8(e)))]}function s5(e,t){return e.get(t)?.snapshotDiagnostics?.samples.length??0}function s4(e,t,r){return e.get(t)?.snapshotDiagnostics?.samples.slice(r)??[]}function s8(e){try{return t.statSync(e).isFile()}catch{return!1}}function s6(e){return"string"==typeof e?e.includes("${"):Array.isArray(e)?e.some(s6):!!e&&"object"==typeof e&&Object.values(e).some(s6)}async function s7(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=rW(l.device.platform),d=o?r.join(o,`recording${u}`):rJ(l.device.platform);le(s,{type:"video_recording_start",session:a,videoPath:d}),t5({phase:"replay_test_video_recording_start",data:{session:a,videoPath:d}});let c=await rz({req:{token:t.token,session:a,command:"record",positionals:["start",d],flags:{},meta:t.meta},sessionName:a,sessionStore:i,logPath:n});if(!c.ok)return le(s,{type:"video_recording_start_failed",session:a,videoPath:d,errorCode:c.error.code}),c;let p=Date.now();return await rj(1e3),le(s,{type:"video_preroll_done",session:a,durationMs:Date.now()-p,requestedDurationMs:1e3}),t5({phase:"replay_test_video_recording_preroll_done",durationMs:Date.now()-p,data:{session:a,requestedDurationMs:1e3}}),c}async function s9(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;le(i,{type:"video_tail_start",session:r,requestedDurationMs:3e3});let s=Date.now();await rj(3e3);let l=Date.now(),u=await rz({req:{token:t.token,session:r,command:"record",positionals:["stop"],flags:{},meta:t.meta},sessionName:r,sessionStore:n,logPath:a});return s2(u).forEach(e=>o.add(e)),le(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}),t5({phase:"replay_test_video_recording_stop",durationMs:Date.now()-l,data:{session:r,ok:u.ok,tailDurationMs:l-s}}),u}function le(e,t){od(e,{...t,ts:new Date().toISOString()})}async function lt(e){let{req:t,sessionName:r,logPath:a,sessionStore:n,leaseRegistry:i,invoke:o}=e;return"replay"===t.command?await s1({req:t,sessionName:r,logPath:a,sessionStore:n,invoke:o}):"test"===t.command?await oS({req:t,sessionName:r,runReplay:async({filePath:e,sessionName:r,platform:i,target:s,requestId:l,artifactsDir:u,artifactPaths:d,tracePath:c,shard:p})=>{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:p}),m={req:t,sessionName:r,logPath:a,sessionStore:n,artifactsDir:u,tracePath:c},h=function(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await s7(e)}}(m);return await s1({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:c,invoke:async e=>{var t;let r=await s7(m);return r&&!r.ok?r:(t=await o(e),d&&s2(t).forEach(e=>d.add(e)),t)}})},finalizeAttempt:async({sessionName:e,artifactPaths:r,artifactsDir:i,tracePath:o})=>await s9({req:t,sessionName:e,logPath:a,sessionStore:n,artifactsDir:i,tracePath:o,artifactPaths:r}),cleanupSession:async e=>{n.get(e)&&await na({req:{token:t.token,session:e,command:"close",positionals:[],flags:{},meta:t.meta},sessionName:e,logPath:a,sessionStore:n,leaseRegistry:i})}}):null}function lr(e,t){var r;e.push(t),c({type:"command",status:"progress",message:[tP(r=t),...tb(r)].join("\n")})}async function la(e,t){let{device:r,metroPort:a,shouldProbeMetro:n,androidAdbExecutor:i}=t;if("android"!==r.platform||!n)return;let o=tH(r,i);lr(e,await ln(o,r.id,a))}async function ln(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 li(e,t){let{device:r,targetApp:a,session:n}=t;if(a)try{let t=await lo(r,a);if(!t)return void lr(e,{id:"target-app",status:"info",summary:`Target app installation checks are not supported for ${tr(r)}.`,evidence:{requested:a,platform:tr(r)}});lr(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);lr(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 ${tr(r)} --all`,evidence:{code:t.code,message:t.message}})}}async function lo(e,t){if("android"===e.platform){let{listAndroidApps:r}=await import("./3340.js"),a=ls(t,(await r(e,"all")).map(e=>({id:e.package,name:e.name})));return a?.id}if(tl(e)||te(e)){let{listIosApps:r}=await import("./apps.js"),a=ls(t,(await r(e,"all")).map(e=>({id:e.bundleId,name:e.name})));return a?.id}}function ls(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 ll(e,t,r){var a,n,i,o,l,u;let d,c=(a=t,n=r,es({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 lu(c),r=(i=t.devices,o=c,i.filter(e=>ts(e,o,{includeExplicitSelectors:!0})));return lr(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 ${ld(t)} devices found; ${r.slice(0,2).map(e=>`${lc(e.platform)} inventory failed: ${e.message}`).join("; ")}.`:`No ${ld(t)} devices found.`;let i=e.filter(e=>!0===e.booted).length,o=`${e.length} ${ld(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=w(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,c,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=c).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=tr(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;lr(e,(r=a,{id:`device-${r.platform}`,status:"warn",summary:`${lc(r.platform)} device inventory could not be read: ${r.message}`,hint:r.hint??`Check the ${lc(r.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:r.platform,code:r.code}}))}}(e,t.failures),{devices:r,platform:c.platform,target:c.target}}catch(r){let t=s(r);return lr(e,{id:"device",status:"fail",summary:t.message,hint:t.hint,command:"agent-device devices",evidence:{code:t.code,details:t.details}}),{devices:[],platform:c.platform,target:c.target}}}async function lu(e){if(e.platform)return{devices:await eD(e),failures:[]};let t=[],r=[];for(let a of g)try{t.push(...await eD({...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 ld(e){let t=e.platform?lc(e.platform):"local";return e.target?`${t} ${e.target}`:t}function lc(e){return"ios"===e?"iOS":"macos"===e?"macOS":"android"===e?"Android":"linux"===e?"Linux":"web"===e?"web":"Apple"}async function lp(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 lf(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 lf(e,t,r){try{return await (r.resolveProcessInfo??lm)(e,t)}catch{return}}async function lm(e,t){var r;if("127.0.0.1"!==(r=e)&&"localhost"!==r&&"::1"!==r&&"0.0.0.0"!==r)return;let a=await lh(t);if(void 0!==a)return{pid:a,cwd:await lg(a)}}async function lh(e){let t=await t3("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 lg(e){let t=await t3("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 lw=["daemonBaseUrl","tenant","runId","leaseId","leaseProvider"],lv=["provider","providerSessionId","providerApp","providerOsVersion","providerProject","providerBuild","providerSessionName","awsProjectArn","awsDeviceArn","awsAppArn","awsRegion","awsInteractionMode"];function ly(e){return"string"==typeof e&&e.trim().length>0?e.trim():void 0}async function lA(e,t){"android"===t?lr(e,await lb()):("ios"===t||"macos"===t||"apple"===t)&&lr(e,await lS())}async function lb(){var e,t,r;let a=process.env.ANDROID_HOME||process.env.ANDROID_SDK_ROOT,n=await lI(a),i=await l_("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 lS(){var e,t;let r=await l_("xcodebuild",["-version"]);return r?{id:"toolchain",status:(e={selectedPath:await l_("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 lI(e){if(!e)return"unknown";try{return await i(r.join(e,"licenses","android-sdk-license")),"accepted"}catch{return"missing"}}async function l_(e,t){try{let r=await t3(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 lk(e){var t,a,n,i,o;let s,l,u,d,{req:c,sessionName:p,sessionStore:f,androidAdbExecutor:m}=e;if(c.command!==rQ.doctor)return null;let h=f.get(p),g=(u=rY(c.meta?.cwd),d=ly(c.flags?.targetApp)??h?.appBundleId,{targetApp:d,metroHost:ly(c.runtime?.metroHost)??"127.0.0.1",metroPort:("number"==typeof(t=c.runtime?.metroPort)&&Number.isInteger(t)&&t>0?t:void 0)??8081,kind:u,remote:c.flags?.remote===!0,shouldProbeMetro:(a=c,"auto"!==u||"number"==typeof a.runtime?.metroPort||"string"==typeof a.runtime?.metroHost)}),w=(n=f,i=p,s=r.dirname(n.resolveSessionDir(i)),"sessions"===r.basename(s)?r.dirname(s):s),v=[];if(!function(e,...t){for(let r of t)lr(e,r)}(v,{id:"agent-device",status:"pass",summary:`agent-device ${rZ()} using ${w}`,evidence:{version:rZ(),stateDir:w}},...function(e,t={}){var r;let a,n=(r=e,Object.keys(a={...Object.fromEntries([...lw,...lv].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."}]:[]}(c,{required:g.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 ${tr(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."}]}(f,p,h,{remote:g.remote})),g.remote)return lR(v,g);let y=await ll(v,c,h);await lA(v,h?.device.platform??y?.platform);let A=await lD({androidAdbExecutor:m,checks:v,inventory:y,options:g,session:h});return await lN(v,A??(o=y,(l=(o?.devices??[]).filter(e=>tl(e)&&"simulator"===e.kind)).find(e=>!0===e.booted)??l[0])),lR(v,g,{device:A,includeMetro:!0,inventory:y})}async function lN(e,t){if(t&&tl(t)&&"simulator"===t.kind&&!("darwin"!==process.platform||U(t))){if(c({type:"command",status:"progress",message:`Checking iOS runner build cache (${t.name})...`}),await A(t))return void lr(e,{id:"ios-runner-cache",status:"pass",summary:"iOS runner artifact cached; first open skips the runner build"});e4(t,{}),c({type:"command",status:"progress",message:`Warming iOS runner build cache in the background (${t.name})...`}),lr(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."})}}async function lD(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];lr(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:tr(e),id:e.id,name:e.name}))}})}(t,r,a.targetApp);return o&&await lx(t,{androidAdbExecutor:i,device:o,options:a,session:n}),a.shouldProbeMetro&&lr(t,await lp(a.metroHost,a.metroPort,a.kind)),o}async function lx(e,t){let{androidAdbExecutor:r,device:a,options:n,session:i}=t;await li(e,{device:a,session:i,targetApp:n.targetApp}),await la(e,{androidAdbExecutor:r,device:a,metroPort:n.metroPort,shouldProbeMetro:n.shouldProbeMetro})}function lR(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?tr(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 lM(e){var t,r,a,n,i,o,s,l,u;let d,c,{req:p,sessionName:f,logPath:m,sessionStore:h}=e,g=p.positionals?.[0]??"";if("ios-runner"!==g)return H("INVALID_ARGS","prepare requires a subcommand: ios-runner");let w=h.get(f),v=p.flags??{},y=ar(rQ.prepare,w,v);if(y)return y;let A=await an({session:w,flags:v,ensureReady:!0});if(!to(A.platform))return H("UNSUPPORTED_OPERATION","prepare ios-runner is only supported on Apple runner platforms");let b=Date.now(),S=await em(A,(t=p,r=w,a=m,n=b,c=(i=t,"number"==typeof(d=i.flags?.timeoutMs)&&Number.isFinite(d)&&d>0?d:24e4),{...td({req:t,logPath:a,traceLogPath:r?.trace?.outPath}),cleanStaleBundles:!0,buildTimeoutMs:c,healthTimeoutMs:c,prepareDeadline:tJ.fromTimeoutMs(c,n),startupTimeoutMs:c}));return{ok:!0,data:(o=g,s=A,l=Math.max(0,Date.now()-b),u=S,{action:o,platform:tr(s),deviceId:s.id,deviceName:s.name,kind:s.kind,durationMs:l,...u,message:`Prepared Apple runner: ${s.name}`})}}async function lP(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??{},c=ar(i,u,d);if(c)return c;let p=await an({session:u,flags:d,ensureReady:!0}),m=ee(i,p);if(m)return m;let h=await f(p,i,o,t.flags?.out,{...eN(a,t.flags,u?.appBundleId,u?.trace?.outPath)});if(u){let e=l?await l(u,h,p):u;tq(n,e,t,i,h??{},{positionals:s??o}),e!==u&&n.set(r,e)}return{ok:!0,data:h??{}}}async function lL(e){let{req:t,sessionName:r,logPath:a,sessionStore:n}=e,i=n.get(r),o=t.flags??{},s=ar(rQ.clipboard,i,o);if(s)return s;let l=(t.positionals?.[0]??"").toLowerCase();if("read"!==l&&"write"!==l)return H("INVALID_ARGS","clipboard requires a subcommand: read or write");let u=await an({session:i,flags:o,ensureReady:!0}),d=ee(rQ.clipboard,u);if(d)return d;let c=await f(u,rQ.clipboard,t.positionals??[],t.flags?.out,{...eN(a,t.flags,i?.appBundleId,i?.trace?.outPath)});return tq(n,i,t,t.command,c??{}),{ok:!0,data:{platform:tr(u),...c??{}}}}async function lO(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===rQ.doctor)return await lk({req:t,sessionName:r,sessionStore:n,androidAdbExecutor:u});if("inventory"===_(t.command))return await nu({req:t,sessionName:r,sessionStore:n});if("runtime"===t.command)return await aC({req:t,sessionName:r,sessionStore:n});if("state"===_(t.command))return await nm({req:t,sessionName:r,logPath:a,sessionStore:n});if(t.command===rQ.clipboard)return await lL({req:t,sessionName:r,logPath:a,sessionStore:n});if(t.command===rQ.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 lP({req:t,sessionName:r,logPath:a,sessionStore:n,command:rQ.keyboard,positionals:t.positionals??[]}):H("SESSION_NOT_FOUND","iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.")}if("observability"===_(t.command))return await il({req:t,sessionName:r,sessionStore:n,androidAdbExecutor:u});if(t.command===rQ.prepare)return await lM({req:t,sessionName:r,logPath:a,sessionStore:n});if(t.command===rQ.install||t.command===rQ.reinstall)return await ns({req:t,command:t.command,sessionName:r,sessionStore:n,deployOps:t.command===rQ.install?no:ni});if(t.command===rX.installSource)return await r5({req:t,sessionName:r,sessionStore:n});if(t.command===rX.releaseMaterializedPaths)return await ae({req:t});if(t.command===rQ.push){let e,i=t.positionals?.[0]?.trim(),o=t.positionals?.[1]?.trim();return i&&o?await lP({req:t,sessionName:r,logPath:a,sessionStore:n,command:rQ.push,positionals:[i,"file"===(e=eC(o,{subject:"Push payload",cwd:t.meta?.cwd,expandPath:(e,t)=>ex.expandHome(e,t)})).kind?e.path:e.text],recordPositionals:[i,o]}):H("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>")}return t.command===rQ.triggerAppEvent?await lP({req:t,sessionName:r,logPath:a,sessionStore:n,command:rQ.triggerAppEvent,positionals:t.positionals??[],deriveNextSession:async(e,t)=>{let r="string"==typeof t?.eventUrl?t.eventUrl:void 0,a=r?await aY(e.device,r,e.appBundleId,aW)??e.appBundleId:e.appBundleId;return{...e,appBundleId:a}}}):t.command===rQ.open?await a6({req:t,sessionName:r,logPath:a,sessionStore:n}):"replay"===_(t.command)?await lt({req:t,sessionName:r,logPath:a,sessionStore:n,leaseRegistry:i,invoke:l??s}):t.command===rQ.batch?await nl(t,r,s):t.command===rQ.close?await na({req:t,sessionName:r,logPath:a,sessionStore:n,leaseRegistry:i,leaseLifecycleProvider:o}):null}export{r0 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})=>[Bc(e,t,n)],tapOn:({value:e,context:t})=>[Kc(e,t)],doubleTapOn:({value:e,context:t})=>[qc(e,t)],longPressOn:({value:e,context:t})=>[Jc(e,t)],inputText:({value:e,context:t})=>[P(`type`,[I(Yc(e),t)])],eraseText:({value:e})=>[Xc(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(G.assertVisible,[K(e,n,[],t),`17000`])],assertNotVisible:({value:e,context:t,name:n})=>[P(G.assertNotVisible,[K(e,n,[],t)])],extendedWaitUntil:({value:e,context:t})=>Zc(e,t),takeScreenshot:({value:e,context:t,name:n})=>[P(`screenshot`,[I(mr(n,e),t)])],scroll:({value:e})=>[Qc(e)],scrollUntilVisible:({value:e,context:t})=>$c(e,t),swipe:({value:e,context:t})=>[el(e,t)],hideKeyboard:()=>[P(`keyboard`,[`dismiss`])],pressKey:({value:e})=>[cl(e)],back:()=>[P(`back`)],waitForAnimationToEnd:({value:e})=>[P(G.waitForAnimationToEnd,[String(br(e,15e3))])],stopApp:({value:e,config:t,context:n})=>[Vc(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)=>[Bc(void 0,e,t)],scroll:()=>[P(`scroll`,[`down`])],hideKeyboard:()=>[P(`keyboard`,[`dismiss`])],eraseText:()=>[Xc(void 0)],back:()=>[P(`back`)],waitForAnimationToEnd:()=>[P(G.waitForAnimationToEnd,[`15000`])],stopApp:(e,t)=>[Vc(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!==G.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!==G.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(B.resolve(e.sourcePath)),{baseDir:e.sourcePath?B.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:L(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:L(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:L(e.onFlowStart)}:{},...Array.isArray(e.onFlowComplete)?{onFlowComplete:L(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=z.readFileSync(r,`utf8`),a=new Set(n.visitedPaths);return a.add(r),du(i,{...n,baseDir:B.dirname(r),visitedPaths:a})}function Tu(e,n){if(B.isAbsolute(e))return e;if(!n.baseDir)throw new t(`INVALID_ARGS`,`runFlow file paths require replay input to have a source path.`);return B.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=z.readFileSync(e,`utf8`),n=wr(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=B.basename(n,B.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}:${B.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=>B.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 z.existsSync(r)&&z.statSync(r).isDirectory()?{paths:Fu(r,n),source:`directory`}:Iu(e,t,n)}function Fu(e,t){let n=[],r=z.opendirSync(e);try{let i;for(;(i=r.readSync())!==null;){let r=B.join(e,i.name);i.isDirectory()?n.push(...Fu(r,t)):i.isFile()&&t.has(B.extname(i.name))&&n.push(r)}}finally{r.closeSync()}return n}function Iu(e,n,r){let i=A.expandHome(e,n);if(z.existsSync(i)){let n=z.statSync(i);if(n.isDirectory())return{paths:Ru(r).flatMap(e=>z.globSync(e,{cwd:i}).map(e=>B.join(i,e))),source:`directory`};if(n.isFile()){if(!r.has(B.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=B.isAbsolute(i)?i:e;return{paths:z.globSync(a,{cwd:B.isAbsolute(i)?void 0:n}).map(e=>B.isAbsolute(e)?e:B.resolve(n,e)).filter(e=>r.has(B.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=>B.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+(B.extname(e)===`.ad`)}function Hu(e){return[...new Set(e.map(e=>B.normalize(e)))]}function Uu(e){return e===`maestro`}function Wu(e,t,n){return Uu(n)&&B.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 z.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?it(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,ee=Date.now(),x=sd({artifactsDir:l,artifactPaths:_,filePath:n,sessionName:r,requestId:i,timeoutMs:o,platform:s,target:c}),S=ft(d,async()=>await f({filePath:n,sessionName:r,platform:s,target:c,requestId:i,artifactsDir:l,artifactPaths:_,tracePath:x,shard:u})).catch(t=>({ok:!1,error:e(t)})).finally(()=>{g(),xt(i)});try{b=typeof o==`number`?await Promise.race([S,new Promise(e=>{v=setTimeout(()=>{y=!0,lt(i),e(cd(o,[..._]))},o)})]):await S,q(x,{type:`replay_test_attempt_stop`,ts:new Date().toISOString(),session:r,ok:b.ok,timedOut:y,durationMs:Date.now()-ee,errorCode:b.ok?void 0:b.error.code})}finally{v&&clearTimeout(v),y&&(await nd(S)||(ad(b),h({level:`warn`,phase:`test_timeout_cleanup_race`,data:{session:r,requestId:i,graceMs:$u}}),rd({replayPromise:S,cleanupSession:p,sessionName:r,requestId:i})));let t=await id({finalizeAttempt:m,sessionName:r,artifactPaths:_,artifactsDir:l,tracePath:x});b?.ok&&t&&!t.ok&&od(b,`Replay test finalization failed: ${t.error.message}`);let n=Date.now();try{q(x,{type:`replay_test_cleanup_start`,ts:new Date().toISOString(),session:r}),await p(r),q(x,{type:`replay_test_cleanup_stop`,ts:new Date().toISOString(),session:r,ok:!0,durationMs:Date.now()-n})}catch(t){let i=e(t);q(x,{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),Ir($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();q(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 q(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 q(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=B.join(t,`replay-timing.ndjson`);return z.mkdirSync(B.dirname(l),{recursive:!0}),z.writeFileSync(l,``),n.add(l),q(l,{type:`replay_test_attempt_start`,ts:new Date().toISOString(),replayPath:r,session:i,requestId:a,timeoutMs:o,platform:s,target:c}),l}function q(e,t){e&&z.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:B.join(i,...a?[`shard-${a.shardIndex+1}`]:[],jc(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=B.join(t.testArtifactsDir,`attempt-${f}`);Mc(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 Nc({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=De(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 un(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=tt(e?.androidDeviceAllowlist);return{platform:e?.platform,target:e?.target,iosSimulatorSetPath:r({simulatorSetPath:at(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 E(`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 E(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 Ac({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=Oe(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.`}:{...xr(e),metadata:wr(e)}}function af(e){return{...lr(cr(e?.replayShellEnv)),...Sr(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=ee(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 Xt(t).filter(e=>e.trim().length>0)}function lf(e){return cf(e).map(e=>v(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=Ut(await D(e.device,`snapshot`,[],t.flags?.out,{...j(n,{...t.flags??{},snapshotInteractiveOnly:r},e.appBundleId,e.trace?.outPath)}),{...t.flags??{},snapshotInteractiveOnly:r});return Vt(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=ye(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:he(n.y-a,c,u)}};case`down`:return{ok:!0,start:n,end:{x:n.x,y:he(n.y+a,c,u)}};case`left`:return{ok:!0,start:n,end:{x:he(n.x-i,s,l),y:n.y}};case`right`:return{ok:!0,start:n,end:{x:he(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 ye(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 J(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=O(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=Bf(e,t,r);if(n.childOf){let t=Bf(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=Zf(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=Vf(e,t),o=Lf({nodes:e.nodes,matches:a,platform:n}),s=Zf(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=Bf(e,t,n,{allowLeadingCompositeLabelMatch:!1}),a=Lf({nodes:e.nodes,matches:i,platform:n}),o=Zf(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 zf(e){return e?.platform===`android`?`android`:`ios`}function Y(e){let t=b(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 Bf(e,t,n,r={}){let i=b(t);for(let t of i.selectors){let i=e.nodes.filter(e=>Hf(e,t,n,r));if(i.length>0)return i}return[]}function Vf(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 Hf(e,t,n,r){return We(e,t,n)?!0:t.terms.every(t=>Uf(e,t,n,r))}function Uf(e,t,n,r){return typeof t.value!=`string`||!Wf(t.key)?We(e,{raw:t.key,terms:[t]},n):Kf(Gf(e,t.key),t.value,r)}function Wf(e){return e===`id`||e===`label`||e===`text`||e===`value`}function Gf(e,t){return t===`id`?e.identifier:t===`label`?e.label:t===`value`?e.value:je(e)}function Kf(e,t,n={}){let r=e??``,i=He(r),a=He(t);if(i===a||n.allowLeadingCompositeLabelMatch!==!1&&qf(i,a))return!0;if(!Jf(t))return!1;try{return new RegExp(t).test(r)}catch{return!1}}function qf(e,t){if(!e||!t||!e.startsWith(t))return!1;let n=e.at(t.length);return n===`,`||n===`:`||n===`;`}function Jf(e){return/(?:\.\*|\.\+|\[[^\]]+\]|\([^)]*\)|\||\^|\$|\\[dDsSwWbB])/.test(e)}function Yf(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=Xf(e,t,n);return r?{rect:r,inherited:!0}:null}function Xf(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 Zf(e,t,n,r,i,a=!1,o=!1,s){let c=Fe(e);return Pp(e,ep(e,Qf(e,t,c,r,n,i,a),n,r,o,s),c,o,i)}function Qf(e,t,n,r,i,a,o){let s=t.map(t=>$f(e,t,n)).filter(e=>!!e),c=s.filter(e=>!e.inheritedRect),l=c.length>0?c:s;return!r||i!==void 0?s:hp(l,a,o)}function $f(e,t,n){let r=Yf(e,t,n);return r?{node:t,rect:r.rect,inheritedRect:r.inherited}:null}function ep(e,t,n,r,i,a){if(n!==void 0)return t[n]??null;let o=tp(e,t,r,i,a);return np(o,r,i)?xp(e,o,r)??o:o}function tp(e,t,n,r,i){return!r||!n?rp(e,t,n,i):ip(e,t,n,i)??rp(e,t,n,i)}function np(e,t,n){return!!(n&&t&&e)}function rp(e,t,n,r){return op(e,t,n,r).sort((e,t)=>_p(e,t,n))[0]??null}function ip(e,t,n,r){let i=t.filter(e=>Z(e.node,n)===0);if(i.length>=2){let t=ap(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:ap(e,a,n,r)}function ap(e,t,n,r){let i=Fe(e);return rp(e,t.filter(n=>pp(n)&&t.some(t=>mp(e,t,n,i))),n,r)}function op(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:dp(e,t.node,a)})).filter(e=>!!e.container);if(o.length<2||o.length!==i.length)return t;let s=o.filter(e=>up(e,o));if(s.length<2)return t;let c=lp(s);if(c.length>0)return c;let l=sp(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 sp(e,t,n,r){if(!n)return[];let i=dp(e,n.node,r),a=i&&zp(i.rect,n.rect)?i:null,o=t.map(e=>({entry:e,score:cp(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 cp(e,t,n){if(n)return e.index===n.index?0:Bp(e.rect,n.rect)<.6?1/0:Math.abs(e.index-n.index);if(Bp(e.rect,t.rect)>=.6)return 0;let r=e.index-t.node.index;return r>=0?r:1e5+Math.abs(r)}function lp(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 up(e,t){return t.some(t=>t!==e&&e.container.index!==t.container.index&&Bp(e.container.rect,t.container.rect)>=.6)}function dp(e,t,n){return Ne(e,t,n,e=>!e.rect||!fp(e)||e.rect.width<240||e.rect.height<320?null:e)}function fp(e){let t=Ae(e.type??``);return t===`scrollview`||t===`scroll-area`||t===`list`}function pp(e){return e.rect.width>=16&&e.rect.width<=260&&e.rect.height>=24&&e.rect.height<=80}function mp(e,t,n,r){return t.node.index===n.node.index||!zp(t.rect,n.rect)||X(t.rect)<X(n.rect)*2?!1:Me(e,n.node,t.node,r)}function hp(e,t,n){let r=e.filter(e=>gp(e.rect,t));return n||r.length>0?r:e}function gp(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 _p(e,t,n){let r=yp(e,t,n);if(r!==0)return r;if(!vp(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 vp(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 yp(e,t,n){if(n){let r=Z(e.node,n)-Z(t.node,n);if(r!==0)return r}let r=bp(e.node)-bp(t.node);if(r!==0)return r;let i=Number(e.inheritedRect)-Number(t.inheritedRect);if(i!==0)return i;let a=n&&bp(e.node)===bp(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 bp(e){return Nf.get(Ae(e.type??``))??3}function xp(e,t,n){if(!Op(t,n))return null;let r=Sp(e,t,n,Fe(e));if(r.length===0)return null;let i=Mp(r.map(e=>e.rect.width)),a=Cp(t,n,Ap(t.rect,r.map(e=>e.rect)),i);return a?Dp(t,a):null}function Sp(e,t,n,r){return e.filter(i=>i.index!==t.node.index&&!!i.rect&&Me(e,i,t.node,r)&&kp(i,t.rect,n)).sort((e,t)=>e.rect.x-t.rect.x)}function Cp(e,t,n,r){let i=n.filter(e=>jp(e.width,r)),a=wp(e,t,n),o=i.some(t=>Ep(e.rect,t));return a&&!o?a:i.length===1?i[0]??null:a}function wp(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 Tp(e,t,r,i)?{x:e.rect.x,width:Math.min(i,r.width)}:null}function Tp(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 Ep(e,t){return Math.abs(t.x-e.x)<1}function Dp(e,t){return{...e,rect:{x:t.x,y:e.rect.y,width:t.width,height:e.rect.height}}}function Op(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 kp(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||!zp(t,e.rect)?!1:Np(t,e.rect)>=.5}function Ap(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 jp(e,t){return e<24||t<24?!1:e>=t*.4&&e<=t*1.6}function Mp(e){let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??0}function Np(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 Pp(e,t,n,r,i){return t?r?Fp(e,t,n,i)??{node:t.node,rect:t.rect}:{node:t.node,rect:t.rect}:null}function Fp(e,t,n,r){return Ip(t.node)?null:Ne(e,t.node,n,i=>{if(!Ip(i))return null;let a=Yf(e,i,n);return!a||!Lp(t.rect,a.rect,r)?null:{node:i,rect:a.rect}})}function Ip(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 Lp(e,t,n){if(!zp(t,e)||Rp(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 Rp(e,t){return t.height<32||t.height>80||e.height<t.height*.75||Np(e,t)<.75||t.width<240?!1:t.width>=e.width*3}function zp(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 Bp(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=>Kf(e,t))?2:3}const Q={animationPollMs:250,assertVisibleGraceMs:1e3,assertVisiblePollMs:250,assertVisibleRetryTimeoutMs:5e3,assertNotVisiblePollMs:250,defaultAssertNotVisibleTimeoutMs:3e3};async function Vp(e){let t=lm(e.positionals,{command:`assertVisible`,defaultTimeoutMs:17e3});if(!t.ok)return t.response;let n=sm(e.baseReq,t.selector);return n?await Hp(e,t,n):await Gp(e,t)}async function Hp(e,t,n){let r=Date.now(),i=await Wp(e,t,n);if(i.ok){if(Up(e.baseReq)){let n=await um(e,t.selector,`assertVisible`);if(!n.visible){let i=tm(e.baseReq,t,n,r);return i.kind===`return`?i.response:await Gp(e,im(t))}}return Ef(e.scope,t.selector),hm({ok:!0,data:{selector:t.selector,nativeWait:!0,query:n,response:i.data}},t.selector,r)}return await Kp(e,t,i,r)}function Up(e){return e.flags?.platform===`android`}async function Wp(e,t,n){return await e.invoke({...e.baseReq,command:`wait`,positionals:[n,String(t.timeoutMs)]})}async function Gp(e,t){let n=Date.now(),r=t.timeoutMs+Q.assertVisibleGraceMs,i,a,o=!1;for(;;){let s=Date.now(),c=await um(e,t.selector,`assertVisible`);if(c.visible)return hm(c.response,t.selector,n);i=c.response,a=c.snapshot??a;let l=tm(e.baseReq,t,c,n);if(l.kind===`return`)return l.response;let u=rm({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??J(`COMMAND_FAILED`,`Expected visible but did not match: ${t.selector}`,{selector:t.selector,timeoutMs:t.timeoutMs});return await qp(e,t,a)||gm(s,a,e.baseReq)}async function Kp(e,t,n,r){let i=await um(e,t.selector,`assertVisible`);if(i.visible)return hm(i.response,t.selector,r);let a=tm(e.baseReq,t,i,r);return a.kind===`return`?a.response:await qp(e,t,i.snapshot)||gm(n,i.snapshot,e.baseReq)}async function qp(e,t,n){if(e.baseReq.flags?.platform!==`android`)return null;let r=Af(e.scope);return r?r.kind===`tap`?await Jp(e,t,n,r):await Yp(e,t,r):null}async function Jp(e,t,n,r){if(!n)return null;let i=Zp(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 Qp(e,i.target)).ok)?null:await Xp(e,t,`retryTap`)}async function Yp(e,t,n){return h({level:`info`,phase:`maestro_assert_visible_retry_swipe`,data:{selector:t.selector,swipePositionals:n.positionals,timeoutMs:Q.assertVisibleRetryTimeoutMs}}),(await $p(e,n)).ok?await Xp(e,t,`retrySwipe`):null}async function Xp(e,t,n){let r={...t,timeoutMs:am(t.timeoutMs)},i=sm(e.baseReq,r.selector);if(!i)return await Gp(e,r);let a=Date.now(),o=await Wp(e,r,i);return o.ok?(Ef(e.scope,r.selector),hm({ok:!0,data:{selector:r.selector,nativeWait:!0,[n]:!0,query:i,response:o.data}},r.selector,a)):await Kp(e,r,o,a)}function Zp(e,t,n){let r=zf(e.baseReq.flags),i=O(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||!em(t,o)?{ok:!1}:{ok:!0,target:{kind:`text`,query:o}}}async function Qp(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 $p(e,t){return await e.invoke({...e.baseReq,command:`swipe`,positionals:t.positionals})}function em(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 tm(e,t,n,r){return om(n.response)?{kind:`return`,response:n.response}:nm(e,t.selector,n.snapshot)?{kind:`return`,response:cm(t.selector,t.timeoutMs,r)}:{kind:`continue`}}function nm(e,t,n){return e.flags?.maestro?.allowAlreadyPastLoading===!0&&n!==void 0&&fm(t,n)}function rm(e){return Date.now()-e.startedAt<e.deadlineMs?`wait`:bm(e.capturedAfterDeadline,e.captureStartedAt,e.startedAt,e.deadlineMs)?`capture-again`:`finish`}function im(e){return{...e,timeoutMs:am(e.timeoutMs)}}function am(e){return Math.min(e,Q.assertVisibleRetryTimeoutMs)}function om(e){return!e.ok&&e.error.code===`COMMAND_FAILED`&&e.error.message.includes(`React Native overlay`)}function sm(e,t){return e.flags?.platform!==`ios`&&e.flags?.platform!==`android`?null:Y(t)}function cm(e,t,n){return{ok:!0,data:{selector:e,alreadyPastLoading:!0,waitedMs:Date.now()-n,timeoutMs:t}}}function lm(e,t){let[n,r=String(t.defaultTimeoutMs)]=e;if(!n)return{ok:!1,response:J(`INVALID_ARGS`,`${t.command} requires a selector.`)};let i=Number(r);return!Number.isFinite(i)||i<0?{ok:!1,response:J(`INVALID_ARGS`,`${t.command} timeout must be a non-negative number.`)}:{ok:!0,selector:n,timeoutMs:i}}async function um(e,t,n){return dm(e,t,n,await Cf(e))}function dm(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:J(`COMMAND_FAILED`,`Unable to read snapshot data for ${n}.`),infrastructureFailure:!0};let a=If(i,t,zf(e.baseReq.flags),O(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:J(`COMMAND_FAILED`,a.message,{selector:t}),infrastructureFailure:!1,snapshot:i}}function fm(e,t){let n=pm(Y(e));if(!mm(n))return!1;let r=t.nodes.flatMap(e=>[e.label,e.value,e.identifier]).filter(e=>!!e?.trim()).map(e=>pm(e));return r.some(e=>e.includes(`something went wrong`))?!1:r.some(e=>e!==n&&!mm(e))}function pm(e){return e?.trim().toLowerCase().replace(/\u2026/g,`...`)??``}function mm(e){return e===`loading`||e===`loading...`}function hm(e,t,n){return e.ok?{ok:!0,data:{selector:t,...e.data,waitedMs:Date.now()-n}}:e}function gm(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=_m(t,r);return i.length===0?e:{ok:!1,error:{...e.error,details:{...e.error.details??{},artifactPaths:ym([...vm(e.error.details?.artifactPaths),...i])}}}}function _m(e,t){try{z.mkdirSync(t,{recursive:!0});let n=B.join(t,`failure-snapshot.json`),r=B.join(t,`failure-snapshot.txt`);z.writeFileSync(n,`${JSON.stringify(e,null,2)}\n`);let i=ie(e.nodes,{summarizeTextSurfaces:!0}).map(e=>e.text);return z.writeFileSync(r,`${i.join(`
|
|
25
|
+
`)}\n`),[n,r]}catch{return[]}}function vm(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function ym(e){return[...new Set(e)]}function bm(e,t,n,r){return!e&&t-n<r}async function xm(e){let t=lm(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 um(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}}:J(`COMMAND_FAILED`,`Expected not visible but matched: ${t.selector}`,{selector:t.selector,timeoutMs:t.timeoutMs,lastResponse:i})}async function Sm(e){let t=Number(e.positionals[0]??15e3);if(!Number.isFinite(t)||t<0)return J(`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=Cm(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 Cm(e,t,n){let r=wm(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 wm(e){if(!e.ok)return null;let t=wf(e.data);return t?Tm(t):null}function Tm(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})))}async function Em(e){return await e.invoke({...e.baseReq,command:`click`,positionals:[String(e.point.x),String(e.point.y)],flags:{...e.baseReq.flags,postGestureStabilization:!0}})}const Dm={scrollUntilVisibleProbeMs:500,tapOnRetryMs:250,tapOnTimeoutMs:3e4,optionalTapOnTimeoutMs:3e3};async function Om(e){let[t,n=`5000`,r=`down`]=e.positionals;if(!t)return J(`INVALID_ARGS`,`scrollUntilVisible requires a selector.`);let i=Number(n);if(!Number.isFinite(i)||i<=0)return J(`INVALID_ARGS`,`scrollUntilVisible timeout must be a positive number.`);let a=Y(t),o=Math.max(1,Math.ceil(i/Dm.scrollUntilVisibleProbeMs)),s=null;for(let n=0;n<o;n+=1){let c=await Um(e,t,a,Wm(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 th(s,t,i)}async function km(e){let[t,n]=e.positionals,r=Number(t),i=Number(n);if(!Number.isFinite(r)||!Number.isFinite(i))return J(`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 J(`COMMAND_FAILED`,`Unable to read snapshot data for Maestro percentage point tap.`);let s=O(o);if(!s)return J(`COMMAND_FAILED`,`Unable to resolve screen size for Maestro percentage point tap.`);let c=_e(s,r,i),l=await Em({...e,point:c});return l.ok&&jf(e.scope),l}async function Am(e){let t=await jm(e);if(t)return t;let n=await Fm(e);return n.ok?await Pm(e,n,n.durationMs):n.response}async function jm(e){let[t,n,r]=e.positionals;if(!(t!==`direction`||n!==`left`&&n!==`right`)&&zf(e.baseReq.flags)!==`android`)return await e.invoke({...e.baseReq,command:`gesture`,positionals:[`swipe`,n,...r?[r]:[]]})}async function Mm(e){let[t,n]=e.positionals;if(!t)return J(`INVALID_ARGS`,`tapOn requires a selector.`);let r=eh(n);if(!r.ok)return r.response;let i=Date.now(),a=Gm(e),o;for(;Date.now()-i<a;){let n=await qm(e,t,r.value??{});if(!n.retry)return n.response;o=n.response,await w(Dm.tapOnRetryMs)}return Km(e,t,o)}async function Nm(e){let[t,n=`up`,r]=e.positionals;if(!t)return J(`INVALID_ARGS`,`swipe.label requires a label selector.`);let i=await Zm(e,t,{},`swipe.label`,{promoteTapTarget:!1});if(!i.ok)return i.response;let a=_f(i.target,n);return a.ok?await Pm(e,a,r):J(`INVALID_ARGS`,a.message)}async function Pm(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 Fm(e){let t=Tf(e.scope)??await Im(e);if(!t)return{ok:!1,response:J(`COMMAND_FAILED`,`Unable to resolve screen size for Maestro swipe.`)};let[n,...r]=e.positionals;return n===`direction`?Lm(r,t,zf(e.baseReq.flags)):n===`percent`?Bm(r,t,zf(e.baseReq.flags)):{ok:!1,response:J(`INVALID_ARGS`,`Maestro screen swipe requires direction or percent.`)}}async function Im(e){let t=await Cf(e);if(t.ok)return O(wf(t.data))}function Lm(e,t,n){let[r,i]=e;if(!r)return{ok:!1,response:J(`INVALID_ARGS`,`Maestro direction swipe requires a direction.`)};switch(r){case`up`:case`down`:return zm(r,t,i);case`left`:case`right`:return Rm(r,t,n,i);default:return{ok:!1,response:J(`INVALID_ARGS`,`Maestro swipe direction must be UP, DOWN, LEFT, or RIGHT.`)}}}function Rm(e,t,n,r){let i=Hm(n,85,50,15,50),[a,o]=e===`left`?[85,15]:[15,85],s=Vm(n,t,a,50,o,50);return{ok:!0,start:_e(t,a,i.startY,{marginPx:s}),end:_e(t,o,i.endY,{marginPx:s}),durationMs:r}}function zm(e,t,n){let r=me({direction:e,amount:.6,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight});return{ok:!0,start:xe({x:r.x1,y:r.y1},t,8),end:xe({x:r.x2,y:r.y2},t,8),durationMs:n}}function Bm(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:J(`INVALID_ARGS`,`Maestro percentage swipe requires numeric points.`)};let[l,u,d,f]=c,p=Hm(n,l,u,d,f),m=Vm(n,t,l,u,d,f);return{ok:!0,start:_e(t,l,p.startY,{marginPx:m}),end:_e(t,d,p.endY,{marginPx:m}),durationMs:s}}function Vm(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 Hm(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 Um(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 Wm(e,t){return Math.min(Dm.scrollUntilVisibleProbeMs,Math.max(1,e-t*Dm.scrollUntilVisibleProbeMs))}function Gm(e){return e.baseReq.flags?.maestro?.optional===!0?Dm.optionalTapOnTimeoutMs:Dm.tapOnTimeoutMs}function Km(e,t,n){return e.baseReq.flags?.maestro?.optional===!0?{ok:!0,data:{skipped:!0,optional:!0,selector:t}}:n??J(`COMMAND_FAILED`,`tapOn timed out for selector: ${t}`)}async function qm(e,t,n){let r=Y(t),i=await Jm(e,t,n);return i.response.ok?{retry:!1,response:i.response}:i.targetResolved&&r?await Xm(e,r):{retry:!0,response:i.response}}async function Jm(e,t,n){let r=await Zm(e,t,n,`tapOn`,{promoteTapTarget:!0});return r.ok?await Ym(e,t,r.target,n):{response:r.response,targetResolved:!1}}async function Ym(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 Em({...e,point:i});return a.ok&&(Of(e.scope),kf(e.scope,{kind:`tap`,selector:t,point:i,options:{...r}})),{response:a,targetResolved:!0}}async function Xm(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 Zm(e,t,n,r,i){return Qm(e,t,n,r,i,await Cf({...e,raw:!0}))}function Qm(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:J(`COMMAND_FAILED`,`Unable to read snapshot data for ${r}.`)};let s=O(o),c=zf(e.baseReq.flags),l=$m(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},snapshot:o}}}return u.ok?{ok:!0,target:{node:u.node,rect:u.rect,frame:s},snapshot:o}:{ok:!1,response:J(`ELEMENT_NOT_FOUND`,u.message,{selector:t,options:n,command:r})}}function $m(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 eh(e){if(!e)return{ok:!0,value:null};try{return{ok:!0,value:JSON.parse(e)}}catch{return{ok:!1,response:J(`INVALID_ARGS`,`tapOn runtime options must be valid JSON.`)}}}function th(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}`}}:J(`COMMAND_FAILED`,`scrollUntilVisible timed out after ${n}ms for selector: ${t}`)}async function nh(e){switch(e.command){case G.assertVisible:return await Vp(e);case G.assertNotVisible:return await xm(e);case G.pressEnter:return await rh(e);case G.waitForAnimationToEnd:return await Sm(e);case G.scrollUntilVisible:return await Om(e);case G.swipeScreen:return await Am(e);case G.swipeOn:return await Nm(e);case G.tapOn:return await Mm(e);case G.tapPointPercent:return await km(e);case G.runScript:return ih(e);default:return}}async function rh(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 ih(e){let[t]=e.positionals;if(!t)return J(`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 J(t.code,t.message,t.details)}}async function ah(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 oh(e){let t;for(let n=0;n<=e.maxRetries;n+=1){let r=await ah({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 sh={visibleTimeoutMs:3e3,visiblePollMs:250};async function ch(e){let t=await lh(e,e.control);return t.ok?t.matched?await ph(e):{ok:!0,data:{skipped:!0,condition:e.control.mode,selector:e.control.selector}}:t.response}async function lh(e,t){if(t.mode===`visible`)return await uh(e,t);let n=await dh(e,t.selector);return n.ok?{ok:!0,matched:!n.matched}:{ok:!1,response:n.response}}async function uh(e,t){let n=Date.now();for(;;){let r=await dh(e,t.selector);if(!r.ok)return{ok:!1,response:r.response};if(r.matched)return{ok:!0,matched:!0};if(Date.now()-n>=sh.visibleTimeoutMs)return{ok:!0,matched:!1};await w(sh.visiblePollMs)}}async function dh(e,t){let n=await Cf(e);return n.ok?fh(e,t,n):{ok:!1,response:n}}function fh(e,t,n){let r=wf(n.data);return r?{ok:!0,matched:If(r,t,zf(e.baseReq.flags),O(r)).ok}:{ok:!1,response:J(`COMMAND_FAILED`,`Unable to read snapshot data for runFlow.when.`)}}async function ph(e){let t=await ah({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 mh(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=>mh({req:t,sessionName:n,action:e.action,scope:i,filePath:a,line:e.line,step:e.step,tracePath:c,invoke:l}),f=Date.now();yh(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 hh({req:t,sessionName:n,resolved:u,scope:i,line:o,step:s,invoke:l,invokeReplayAction:d}),m=Date.now();return yh(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?vh(p.data):void 0,errorCode:p.ok?void 0:p.error.code}),p}async function hh(e){let{req:t,sessionName:n,resolved:r,scope:i,line:a,step:o,invoke:s,invokeReplayAction:c}=e,l=bh(t.flags,r.flags),u={token:t.token,session:n,flags:l,runtime:r.runtime,meta:t.meta,internal:t.internal},d=await gh({control:r.replayControl,baseReq:u,line:a,step:o,invoke:s,invokeReplayAction:c})??await nh({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=_h(d.data);e&&or(i,e)}return d}async function gh(e){let{control:t,baseReq:n,line:r,step:i,invoke:a,invokeReplayAction:o}=e;if(t){switch(t.kind){case`retry`:return await oh({actions:t.actions,maxRetries:t.maxRetries,line:r,step:i,invokeReplayAction:o});case`maestroRunFlowWhen`:return await ch({baseReq:n,control:t,line:r,step:i,invoke:a,invokeReplayAction:o})}return t}}function _h(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 vh(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 yh(e,t){e&&z.appendFileSync(e,`${JSON.stringify(t)}\n`)}function bh(e,t){return Re(e,{...t??{}})}async function xh(e){let{req:t,sessionName:r,logPath:i,sessionStore:a,tracePath:o,invoke:s}=e,c=t.positionals?.[0];if(!c)return E(`INVALID_ARGS`,`replay requires a path`);let l=``,u=new Set;try{l=A.expandHome(c,t.meta?.cwd);let e=z.readFileSync(l,`utf8`),n=e.trimStart()[0];if(n===`{`||n===`[`)return E(`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:Oh(t.flags,f)}:t,m=d.actions,h=d.actionLines;if(t.flags?.replayUpdate===!0&&d.updateUnsupportedMessage)return E(`INVALID_ARGS`,d.updateUnsupportedMessage);if(t.flags?.replayUpdate===!0&&f.env&&Object.keys(f.env).length>0)return E(`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&&Fh(m))return E(`INVALID_ARGS`,"replay -u does not yet preserve ${VAR} substitutions. Resolve or inline the variables before running with -u.");let g=Cr({builtins:Sh({req:p,sessionName:r,metadata:f,resolvedPath:l}),fileEnv:f.env,shellEnv:lr(cr(t.flags?.replayShellEnv)),cliEnv:Sr(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;Ch(l,e,m.length,t);let n=Mh(a,r),o=await mh({req:p,sessionName:r,action:t,scope:g,filePath:l,line:h[e]??0,step:e+1,tracePath:v,invoke:s});if(y.push(...Nh(a,r,n)),o.ok){jh(o).forEach(e=>u.add(e));continue}if(jh(o).forEach(e=>u.add(e)),!_)return kh(o,t,e,l,[...u],y);let c=await uf({action:t,sessionName:r,logPath:i,sessionStore:a});if(!c)return kh(o,t,e,l,[...u],y);m[e]=c;let d=Mh(a,r);if(o=await mh({req:p,sessionName:r,action:c,scope:g,filePath:l,line:h[e]??0,step:e+1,tracePath:v,invoke:s}),y.push(...Nh(a,r,d)),!o.ok)return jh(o).forEach(e=>u.add(e)),kh(o,c,e,l,[...u],y);jh(o).forEach(e=>u.add(e)),b+=1}_&&b>0&&dr(l,m,a.get(r));let ee=Ee(y);return{ok:!0,data:{replayed:m.length,healed:b,session:r,artifactPaths:[...u],...ee?{snapshotDiagnostics:ee}:{}}}}catch(e){let t=n(e);return E(t.code,t.message,u.size>0?{artifactPaths:[...u]}:void 0)}}function Sh(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:B.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 Ch(e,t,n,r){let i=pt();i&&T({type:`replay-test`,...i,file:i.file||e,status:`progress`,stepIndex:t+1,stepTotal:n,...wh(r)})}function wh(e){return{stepCommand:Th(e.command),...Eh(e)}}function Th(e){if(!e.startsWith(`__maestro`))return e;let t=e.slice(9);return t.length>0?t[0].toLowerCase()+t.slice(1):e}function Eh(e){let t=e.positionals??[],n=Dh(t[0]);return n?{stepValue:n}:e.command===`__maestroTapPointPercent`&&t.length>=2?{stepValue:`${t[0]},${t[1]}%`}:t.length===0?{}:{stepValue:t.join(` `)}}function Dh(e){if(!e)return;let t=v(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 Oh(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 kh(e,t,n,r,i,a){return Ah(e,t,n,r,i,Ee(a))}function Ah(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 jh(e){if(!e.ok){let t=e.error.details?.artifactPaths;return Array.isArray(t)?[...new Set(t.filter(e=>typeof e==`string`&&Ph(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=>Ph(e)))]}function Mh(e,t){return e.get(t)?.snapshotDiagnostics?.samples.length??0}function Nh(e,t,n){return e.get(t)?.snapshotDiagnostics?.samples.slice(n)??[]}function Ph(e){try{return z.statSync(e).isFile()}catch{return!1}}function Fh(e){for(let t of e){for(let e of t.positionals??[])if(typeof e==`string`&&e.includes("${"))return!0;if(Ih(t.flags)||Ih(t.runtime))return!0}return!1}function Ih(e){return typeof e==`string`?e.includes("${"):Array.isArray(e)?e.some(Ih):e&&typeof e==`object`?Object.values(e).some(Ih):!1}const Lh=1e3,Rh=3e3;function zh(e){if(e.req.flags?.recordVideo===!0)return{beforeDispatch:async()=>await Bh(e)}}async function Bh(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=we(s.device.platform),l=a?B.join(a,`recording${c}`):Te(s.device.platform);Hh(o,{type:`video_recording_start`,session:n,videoPath:l}),h({phase:`replay_test_video_recording_start`,data:{session:n,videoPath:l}});let u=await Pr({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 Hh(o,{type:`video_recording_start_failed`,session:n,videoPath:l,errorCode:u.error.code}),u;let d=Date.now();return await w(Lh),Hh(o,{type:`video_preroll_done`,session:n,durationMs:Date.now()-d,requestedDurationMs:Lh}),h({phase:`replay_test_video_recording_preroll_done`,durationMs:Date.now()-d,data:{session:n,requestedDurationMs:Lh}}),u}async function Vh(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;Hh(a,{type:`video_tail_start`,session:n,requestedDurationMs:Rh});let s=Date.now();await w(Rh);let c=Date.now(),l=await Pr({req:{token:t.token,session:n,command:`record`,positionals:[`stop`],flags:{},meta:t.meta},sessionName:n,sessionStore:i,logPath:r});return jh(l).forEach(e=>o.add(e)),Hh(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 Hh(e,t){q(e,{...t,ts:new Date().toISOString()})}function Uh(e){let{platform:t,target:n,artifactsDir:r,shard:i}=e,a=Wh(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 Wh(e){if(e?.recordVideo!==!0)return e;let t={...e};return delete t.recordVideo,Object.keys(t).length>0?t:void 0}async function Gh(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o}=e;return t.command===`replay`?await xh({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&&jh(e).forEach(e=>u.add(e)),e),m=Uh({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=zh(h);return await xh({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 Bh(h);return t&&!t.ok?t:p(await o(e))}})},finalizeAttempt:async({sessionName:e,artifactPaths:n,artifactsDir:a,tracePath:o})=>await Vh({req:t,sessionName:e,logPath:r,sessionStore:i,artifactsDir:a,tracePath:o,artifactPaths:n}),cleanupSession:async e=>{i.get(e)&&await Wa({req:{token:t.token,session:e,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:e,logPath:r,sessionStore:i,leaseRegistry:a})}}):null}function Kh(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function qh(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function Jh(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function Yh(e,...t){for(let n of t)$(e,n)}function $(e,t){e.push(t),T({type:`command`,status:`progress`,message:Xh(t)})}function Xh(e){return[Ce(e),...se(e)].join(`
|
|
27
|
+
`)}async function Zh(e,t){let{device:n,metroPort:r,shouldProbeMetro:i,androidAdbExecutor:a}=t;n.platform!==`android`||!i||$(e,await Qh(m(n,a),n.id,r))}async function Qh(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 $h(t,n){let{device:r,targetApp:a,session:o}=n;if(a)try{let e=await eg(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 eg(e,t){if(e.platform===`android`){let{listAndroidApps:n}=await import(`./app-lifecycle.js`).then(e=>e.t);return tg(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 tg(t,(await n(e,`all`)).map(e=>({id:e.bundleId,name:e.name})))?.id}}function tg(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 ng(t,n,r){let i=ig(n,r);try{let e=await og(i),n=ag(e.devices,i);return $(t,{id:`device`,status:n.length===0?`fail`:`pass`,summary:ug(n,i,e.failures),hint:n.length===0?pg(e.failures):void 0,command:n.length===0?vg(i):void 0,evidence:yg(n,e.failures)}),n.length>0&&sg(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 rg(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 ig(e,t){let n=e.flags??{};return qn({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 ag(e,t){return e.filter(e=>u(e,t,{includeExplicitSelectors:!0}))}async function og(e){if(e.platform)return{devices:await un(e),failures:[]};let t=[],n=[];for(let r of Xn)try{t.push(...await un({...e,platform:r}))}catch(e){n.push(lg(r,e))}return{devices:t,failures:n}}function sg(e,t){for(let n of t)$(e,cg(n))}function cg(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${gg(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${gg(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function lg(t,n){let r=e(n);return{platform:t,message:r.message,hint:r.hint,code:r.code}}function ug(e,t,n){if(e.length===0)return n.length>0?`No ${dg(t)} devices found; ${fg(n)}.`:`No ${dg(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${dg(t)} ${_g(e.length,`device`)} available; ${r} booted`,a=mg(e,t);return a?`${i} (${a}).`:`${i}.`}function dg(e){let t=e.platform?gg(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function fg(e){return e.slice(0,2).map(e=>`${gg(e.platform)} inventory failed: ${e.message}`).join(`; `)}function pg(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function mg(e,t){if(t.platform||t.target)return;let n=pn(e),r=hg();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 hg(){return{android:`Android`,apple:`Apple`,linux:`Linux`,web:`web`}}function gg(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function _g(e,t){return e===1?t:`${t}s`}function vg(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function yg(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 bg=1500;async function xg(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 Sg(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Cg(i,c):`React Native dev server responded at ${i}, but did not report packager-status:running.`,hint:s?void 0:`Verify this is the Metro/Re.Pack instance for the target app, or restart the dev server.`,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:`React Native dev server is not reachable at ${i}.`,hint:`Start Metro or Re.Pack 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 Sg(e,t,n){try{return await(n.resolveProcessInfo??wg)(e,t)}catch{return}}function Cg(e,t){return t?.cwd?`React Native dev server is reachable at ${e} (cwd: ${t.cwd}).`:`React Native dev server is reachable at ${e}.`}async function wg(e,t){if(!Tg(e))return;let n=await Eg(t);if(n!==void 0)return{pid:n,cwd:await Dg(n)}}function Tg(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Eg(e){let t=await _(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:bg});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 Dg(e){let t=await _(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:bg});if(t.exitCode===0)return t.stdout.split(`
|
|
29
|
+
`).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Og=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],kg=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Ag(e,t){let n=ze(e.meta?.cwd);return{targetApp:Fg(e.flags?.targetApp)??t?.appBundleId,metroHost:Fg(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Ig(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Ng(e,n)}}function jg(e,t={}){let n=Pg(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 Mg(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 Ng(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function Pg(e){let t={...Object.fromEntries([...Og,...kg].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 Fg(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Ig(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Lg(e,t){if(t===`android`){$(e,await Rg());return}(t===`ios`||t===`macos`||t===`apple`)&&$(e,await Ug())}async function Rg(){let e=process.env.ANDROID_HOME||process.env.ANDROID_SDK_ROOT,t=await Jg(e),n=await Yg(`adb`,[`version`]);return n?zg({license:t,sdkRoot:e,versionLine:n}):Hg(e,t)}function zg(e){return{id:`toolchain`,status:Bg(e),summary:e.versionLine?`Android toolchain: ${e.versionLine}; ${Vg(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 Bg(e){return e.versionLine&&e.sdkRoot&&e.license!==`missing`?`pass`:`info`}function Vg(e){return e?`ANDROID_HOME/ANDROID_SDK_ROOT set`:`ANDROID_HOME unset`}function Hg(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 Ug(){let e=await Yg(`xcodebuild`,[`-version`]);return e?Wg({selectedPath:await Yg(`xcode-select`,[`-p`]),versionLine:e}):qg()}function Wg(e){return{id:`toolchain`,status:Gg(e),summary:Kg(e),evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}}function Gg(e){return e.versionLine?`pass`:`info`}function Kg(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 qg(){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 Jg(e){if(!e)return`unknown`;try{return await Fr(B.join(e,`licenses`,`android-sdk-license`)),`accepted`}catch{return`missing`}}async function Yg(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 Xg(e,t){$(e,await Zg(t))}async function Zg(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 Qg(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i}=e;if(t.command!==C.doctor)return null;let a=r.get(n),o=Ag(t,a),s=t_(r,n),c=[];if(Yh(c,{id:`agent-device`,status:`pass`,summary:`agent-device ${ke()} using ${s}`,evidence:{version:ke(),stateDir:s}},...jg(t,{required:o.remote}),...Mg(r,n,a,{remote:o.remote})),o.remote)return i_(c,o);let l=await ng(c,t,a);await Lg(c,a?.device.platform??l?.platform);let u=await n_({androidAdbExecutor:i,checks:c,inventory:l,options:o,session:a,stateDir:s});return await e_(c,u??$g(l)),i_(c,o,{device:u,includeMetro:!0,inventory:l})}function $g(e){let t=(e?.devices??[]).filter(e=>c(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}async function e_(e,t){if(!(!t||!c(t)||t.kind!==`simulator`)&&!(process.platform!==`darwin`||vn(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 t_(e,t){let n=B.dirname(e.resolveSessionDir(t));return B.basename(n)===`sessions`?B.dirname(n):n}async function n_(e){let{checks:t,inventory:n,options:r,session:i,androidAdbExecutor:a,stateDir:o}=e,s=i?.device??rg(t,n,r.targetApp);return s&&await r_(t,{androidAdbExecutor:a,device:s,options:r,session:i}),r.shouldProbeMetro&&$(t,await xg(r.metroHost,r.metroPort,r.kind)),await Xg(t,o),s}async function r_(e,t){let{androidAdbExecutor:n,device:r,options:i,session:a}=t;await $h(e,{device:r,session:a,targetApp:i.targetApp}),await Zh(e,{androidAdbExecutor:n,device:r,metroPort:i.metroPort,shouldProbeMetro:i.shouldProbeMetro})}function i_(e,t,n={}){let r=Kh(e);return{ok:!0,data:{status:r,summary:qh(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:Jh(e)}}}async function a_(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,o=t.positionals?.[0]??``;if(o!==`ios-runner`)return E(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let s=i.get(n),c=t.flags??{},l=H(C.prepare,s,c);if(l)return l;let u=await U({session:s,flags:c,ensureReady:!0});if(!a(u.platform))return E(`UNSUPPORTED_OPERATION`,`prepare ios-runner is only supported on Apple runner platforms`);let d=Date.now(),f=await yt(u,o_(t,s,r,d));return{ok:!0,data:c_(o,u,Math.max(0,Date.now()-d),f)}}function o_(e,t,n,r){let i=s_(e);return{...kr({req:e,logPath:n,traceLogPath:t?.trace?.outPath}),cleanStaleBundles:!0,buildTimeoutMs:i,healthTimeoutMs:i,prepareDeadline:et.fromTimeoutMs(i,r),startupTimeoutMs:i}}function s_(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:y}function c_(e,t,n,r){return{action:e,platform:i(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:l_(n,r),message:`Prepared Apple runner: ${t.name}`}}function l_(e,t){let n=u_(t.buildMs),r=d_(t.connectMs),i=d_(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 u_(e){return e===void 0?void 0:d_(e)}function d_(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}async function f_(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=H(a,l,u);if(d)return d;let f=await U({session:l,flags:u,ensureReady:!0}),p=k(a,f);if(p)return p;let m=await D(f,a,o,t.flags?.out,{...j(r,t.flags,l?.appBundleId,l?.trace?.outPath)});if(l){let e=c?await c(l,m,f):l;Ar(i,e,t,a,m??{},{positionals:s??o}),e!==l&&i.set(n,e)}return{ok:!0,data:m??{}}}async function p_(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,o=a.get(n),s=t.flags??{},c=H(C.clipboard,o,s);if(c)return c;let l=(t.positionals?.[0]??``).toLowerCase();if(l!==`read`&&l!==`write`)return E(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let u=await U({session:o,flags:s,ensureReady:!0}),d=k(C.clipboard,u);if(d)return d;let f=await D(u,C.clipboard,t.positionals??[],t.flags?.out,{...j(r,t.flags,o?.appBundleId,o?.trace?.outPath)});return Ar(a,o,t,t.command,f??{}),{ok:!0,data:{platform:i(u),...f??{}}}}async function m_(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new gn,leaseLifecycleProvider:o,invoke:s,invokeReplayAction:c,androidAdbExecutor:l}=e;if(t.command===C.doctor)return await Qg({req:t,sessionName:n,sessionStore:i,androidAdbExecutor:l});if(Qt(t.command)===`inventory`)return await no({req:t,sessionName:n,sessionStore:i});if(t.command===`runtime`)return await Yi({req:t,sessionName:n,sessionStore:i});if(Qt(t.command)===`state`)return await lo({req:t,sessionName:n,logPath:r,sessionStore:i});if(t.command===C.clipboard)return await p_({req:t,sessionName:n,logPath:r,sessionStore:i});if(t.command===C.keyboard){let e=i.get(n),a=t.positionals?.[0]?.trim().toLowerCase();return!e&&(a===`dismiss`||a===`enter`||a===`return`)&&(t.flags??{}).platform===`ios`?E(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`):await f_({req:t,sessionName:n,logPath:r,sessionStore:i,command:C.keyboard,positionals:t.positionals??[]})}if(Qt(t.command)===`observability`)return await nc({req:t,sessionName:n,sessionStore:i,androidAdbExecutor:l});if(t.command===C.prepare)return await a_({req:t,sessionName:n,logPath:r,sessionStore:i});if(t.command===C.install||t.command===C.reinstall)return await Xa({req:t,command:t.command,sessionName:n,sessionStore:i,deployOps:t.command===C.install?Ya:Ja});if(t.command===fe.installSource)return await qr({req:t,sessionName:n,sessionStore:i});if(t.command===fe.releaseMaterializedPaths)return await ni({req:t});if(t.command===C.push){let e=t.positionals?.[0]?.trim(),a=t.positionals?.[1]?.trim();return!e||!a?E(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`):await f_({req:t,sessionName:n,logPath:r,sessionStore:i,command:C.push,positionals:[e,h_(a,t.meta?.cwd)],recordPositionals:[e,a]})}return t.command===C.triggerAppEvent?await f_({req:t,sessionName:n,logPath:r,sessionStore:i,command:C.triggerAppEvent,positionals:t.positionals??[],deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await Sa(e.device,n,e.appBundleId,ya)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}}):t.command===C.open?await Fa({req:t,sessionName:n,logPath:r,sessionStore:i}):Qt(t.command)===`replay`?await Gh({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:c??s}):t.command===C.batch?await to(t,n,s):t.command===C.close?await Wa({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o}):null}function h_(e,t){let n=Rt(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>A.expandHome(e,t)});return n.kind===`file`?n.path:n.text}export{m_ as handleSessionCommands};
|