agent-device 0.20.10 → 0.21.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.
Files changed (510) hide show
  1. package/README.md +2 -2
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.apk → agent-device-android-ime-helper-0.21.1.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.1.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.10.manifest.json → agent-device-android-ime-helper-0.21.1.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.10.manifest.json → agent-device-android-snapshot-helper-0.21.1.manifest.json} +6 -6
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +35 -33
  9. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +6 -1
  10. package/apple/snapshot-bridge/LICENSE.idb +23 -0
  11. package/apple/snapshot-bridge/README.md +106 -0
  12. package/apple/snapshot-bridge/SnapshotBridge.m +286 -0
  13. package/apple/snapshot-bridge/SnapshotBridgeCapture.h +25 -0
  14. package/apple/snapshot-bridge/SnapshotBridgeCapture.m +138 -0
  15. package/apple/snapshot-bridge/SnapshotBridgeRuntime.h +34 -0
  16. package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +411 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +58 -0
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +19 -0
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +12 -0
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +20 -0
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAlertVerification.swift +36 -0
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSelectorMatchPolicy.swift +15 -15
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerStringNormalization.swift +8 -0
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +12 -1
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +100 -6
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSystemSurfaceHostPolicy.swift +72 -0
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +63 -14
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +677 -83
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +35 -92
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +124 -0
  31. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+BlockingSystemModalResolution.swift +39 -4
  32. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1058 -213
  33. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +296 -14
  34. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +1 -1
  35. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +10 -10
  36. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +309 -149
  37. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +101 -42
  38. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +24 -17
  39. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +124 -199
  40. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +71 -4
  41. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXElementTypes.swift +12 -0
  42. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +211 -78
  43. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +30 -10
  44. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +254 -24
  45. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +206 -22
  46. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +465 -494
  47. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +168 -0
  48. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +802 -247
  49. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationInvariant.swift +19 -0
  50. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +185 -0
  51. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +206 -0
  52. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +83 -5
  53. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +156 -34
  54. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +5 -4
  55. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +35 -318
  56. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +206 -0
  57. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +158 -0
  58. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +28 -0
  59. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +101 -0
  60. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +56 -23
  61. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +56 -27
  62. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +30 -24
  63. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +126 -80
  64. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +111 -0
  65. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +47 -86
  66. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +32 -79
  67. package/dist/apple/snapshot-presentation/Package.swift +21 -0
  68. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +56 -0
  69. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +259 -0
  70. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentation.swift +153 -0
  71. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationFailure.swift +27 -0
  72. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +91 -0
  73. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +161 -0
  74. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotScopePolicy.swift +53 -0
  75. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +242 -0
  76. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +97 -0
  77. package/dist/src/adapter.js +1 -0
  78. package/dist/src/adb-executor.js +2 -0
  79. package/dist/src/adb-failure.js +1 -0
  80. package/dist/src/adb-host.js +1 -0
  81. package/dist/src/adb.js +1 -0
  82. package/dist/src/agent-browser-lifecycle.js +1 -0
  83. package/dist/src/agent-browser-process-record.js +1 -0
  84. package/dist/src/agent-browser-provider.js +1 -0
  85. package/dist/src/agent-browser-tool.js +1 -1
  86. package/dist/src/agent-device-client.js +2 -2
  87. package/dist/src/ai-sdk.d.ts +2 -2
  88. package/dist/src/ai-sdk.js +1 -1
  89. package/dist/src/alert-contract.js +1 -0
  90. package/dist/src/alert-runtime.js +1 -0
  91. package/dist/src/android-adb.d.ts +27 -19
  92. package/dist/src/android-adb.js +1 -1
  93. package/dist/src/android-input-ownership.js +1 -0
  94. package/dist/src/android-system-chrome.js +1 -0
  95. package/dist/src/android.js +1 -1
  96. package/dist/src/api.js +11 -0
  97. package/dist/src/app-catalog.js +1 -0
  98. package/dist/src/app-deployment-resolution.js +2 -0
  99. package/dist/src/app-helpers.js +1 -1
  100. package/dist/src/app-inventory-contract.js +1 -0
  101. package/dist/src/app-inventory.js +1 -0
  102. package/dist/src/app-launch.js +2 -0
  103. package/dist/src/app-lifecycle-facade.js +1 -0
  104. package/dist/src/app-lifecycle.js +3 -6
  105. package/dist/src/app-lifecycle2.js +2 -2
  106. package/dist/src/app-lifecycle3.js +1 -0
  107. package/dist/src/app-log-files.js +1 -1
  108. package/dist/src/app-log-reconnect.js +1 -1
  109. package/dist/src/app-log-runtime.js +1 -4
  110. package/dist/src/app-log-runtime2.js +4 -0
  111. package/dist/src/app-parsers.js +4 -0
  112. package/dist/src/app-resolution-cache.js +1 -0
  113. package/dist/src/app-resolution-facade.js +1 -0
  114. package/dist/src/app-resolution.js +2 -2
  115. package/dist/src/app-state.js +1 -2
  116. package/dist/src/apple-runner-platform.js +1 -0
  117. package/dist/src/application-lifecycle-interaction.js +1 -0
  118. package/dist/src/application-lifecycle-runtime.js +1 -0
  119. package/dist/src/apps-simctl.js +1 -0
  120. package/dist/src/archive.js +4 -0
  121. package/dist/src/artifact-download.js +1 -0
  122. package/dist/src/artifacts.d.ts +6 -2
  123. package/dist/src/artifacts.js +1 -1
  124. package/dist/src/async-lifecycle.js +1 -0
  125. package/dist/src/audio-probe-result.js +1 -0
  126. package/dist/src/audio-probe-runtime.js +1 -0
  127. package/dist/src/audio-probe-support.js +1 -0
  128. package/dist/src/auth-session.js +1 -1
  129. package/dist/src/auth.js +1 -1
  130. package/dist/src/backend-snapshot-options.js +1 -1
  131. package/dist/src/{url.js → base-url.js} +1 -1
  132. package/dist/src/boot-diagnostics.js +2 -2
  133. package/dist/src/byte-limit-stream.js +1 -1
  134. package/dist/src/capabilities.js +1 -0
  135. package/dist/src/capture.js +1 -0
  136. package/dist/src/catalog.js +1 -0
  137. package/dist/src/cli-command-aliases.js +1 -0
  138. package/dist/src/cli-config.js +1 -1
  139. package/dist/src/cli-help.js +74 -51
  140. package/dist/src/cli-output.js +1 -1
  141. package/dist/src/cli-runner.js +1 -1
  142. package/dist/src/cli.js +4 -6
  143. package/dist/src/click-button.js +1 -0
  144. package/dist/src/client-metro-companion.js +1 -0
  145. package/dist/src/client-metro.js +1 -1
  146. package/dist/src/client-types.d.ts +280 -242
  147. package/dist/src/clipboard.js +1 -0
  148. package/dist/src/code-signature-cache.js +1 -0
  149. package/dist/src/code-signature.js +1 -0
  150. package/dist/src/color.js +1 -0
  151. package/dist/src/command-metadata.js +1 -1
  152. package/dist/src/command-schema.js +3 -3
  153. package/dist/src/command-surface.js +1 -1
  154. package/dist/src/command-tools.js +2 -2
  155. package/dist/src/command.js +1 -0
  156. package/dist/src/compatibility-policy.js +1 -0
  157. package/dist/src/config.js +1 -1
  158. package/dist/src/config2.js +1 -0
  159. package/dist/src/connection-runtime.js +1 -1
  160. package/dist/src/connection.js +5 -5
  161. package/dist/src/contracts.d.ts +1 -1
  162. package/dist/src/contracts.js +1 -1
  163. package/dist/src/daemon-client-lifecycle.js +1 -0
  164. package/dist/src/daemon-process.js +1 -0
  165. package/dist/src/daemon-registration.js +1 -0
  166. package/dist/src/daemon-shutdown-report.js +1 -1
  167. package/dist/src/daemon.js +2 -2
  168. package/dist/src/debug-symbols-facade.js +5 -0
  169. package/dist/src/deploy-result-target.js +1 -0
  170. package/dist/src/device-claim-inspection.js +1 -1
  171. package/dist/src/device-claim-rule.js +1 -0
  172. package/dist/src/device-input-state.d.ts +190 -3
  173. package/dist/src/device-inventory-context.js +1 -0
  174. package/dist/src/device-isolation.js +1 -0
  175. package/dist/src/device-release.js +1 -0
  176. package/dist/src/device-rotation.js +1 -0
  177. package/dist/src/device-selection-resolver.js +1 -0
  178. package/dist/src/device-session.js +1 -0
  179. package/dist/src/device.js +1 -1
  180. package/dist/src/device2.js +3 -2
  181. package/dist/src/diagnostics.js +3 -0
  182. package/dist/src/diagnostics2.js +1 -0
  183. package/dist/src/dispatch-resolve.js +1 -0
  184. package/dist/src/doctor-facade.js +1 -0
  185. package/dist/src/doctor-output.js +1 -0
  186. package/dist/src/doctor.js +1 -0
  187. package/dist/src/doctor2.js +1 -0
  188. package/dist/src/doctor3.js +1 -0
  189. package/dist/src/durable-resource.js +1 -0
  190. package/dist/src/entities.js +1 -1
  191. package/dist/src/error.js +2 -0
  192. package/dist/src/exec.js +1 -0
  193. package/dist/src/file.js +1 -0
  194. package/dist/src/find.js +1 -1
  195. package/dist/src/finders.js +1 -1
  196. package/dist/src/generic-settle.js +1 -1
  197. package/dist/src/generic.js +1 -1
  198. package/dist/src/gesture-admission.js +1 -0
  199. package/dist/src/gesture-plan-types.js +1 -0
  200. package/dist/src/gesture-plan.js +1 -0
  201. package/dist/src/gesture-runtime.js +1 -0
  202. package/dist/src/harmonyos.js +1 -1
  203. package/dist/src/hdc.js +1 -1
  204. package/dist/src/helper.js +2 -2
  205. package/dist/src/host-file.js +1 -0
  206. package/dist/src/human-control-contract.js +1 -0
  207. package/dist/src/human-control.js +1 -0
  208. package/dist/src/index.d.ts +1 -1
  209. package/dist/src/index.js +1 -1
  210. package/dist/src/input-actions.js +1 -4
  211. package/dist/src/input-actions2.js +2 -1
  212. package/dist/src/install-artifact-facade.js +1 -0
  213. package/dist/src/install-source-network-transport.js +1 -0
  214. package/dist/src/install-source.d.ts +3 -10
  215. package/dist/src/install-source2.js +1 -1
  216. package/dist/src/interaction-positionals.js +1 -0
  217. package/dist/src/interaction-ref-policy.js +1 -0
  218. package/dist/src/interaction.js +1 -1
  219. package/dist/src/interaction2.js +1 -1
  220. package/dist/src/interactor-operation-catalog.js +1 -0
  221. package/dist/src/interactor-types.js +1 -0
  222. package/dist/src/interactor.js +6 -2
  223. package/dist/src/interactor2.js +1 -1
  224. package/dist/src/interactors.js +1 -1
  225. package/dist/src/internal/bin.d.ts +1 -1
  226. package/dist/src/internal/bin.js +1 -2
  227. package/dist/src/internal/companion-tunnel.d.ts +1 -1
  228. package/dist/src/internal/companion-tunnel.js +1 -1
  229. package/dist/src/internal/daemon.d.ts +1 -1
  230. package/dist/src/internal/daemon.js +2 -4
  231. package/dist/src/internal/png-worker.d.ts +4 -4
  232. package/dist/src/internal/png-worker.js +1 -1
  233. package/dist/src/internal/run-script-http-child.d.ts +4 -0
  234. package/dist/src/internal/run-script-http-child.js +1 -0
  235. package/dist/src/internal/update-check-entry.d.ts +1 -1
  236. package/dist/src/inventory.js +4 -4
  237. package/dist/src/inventory2.js +1 -1
  238. package/dist/src/inventory3.js +1 -1
  239. package/dist/src/inventory5.js +1 -1
  240. package/dist/src/inventory6.js +1 -1
  241. package/dist/src/ios-client.js +16 -0
  242. package/dist/src/ios-snapshot-acquisition.js +1 -0
  243. package/dist/src/ios-snapshot-adapter.js +1 -0
  244. package/dist/src/ios-snapshot-planning.js +1 -0
  245. package/dist/src/ios-snapshot-runtime.js +1 -0
  246. package/dist/src/ios-system-surface.js +1 -0
  247. package/dist/src/json.js +1 -0
  248. package/dist/src/keyboard-actions.js +1 -0
  249. package/dist/src/launch-console.js +1 -0
  250. package/dist/src/lease-context.js +1 -1
  251. package/dist/src/lease-scope.js +1 -0
  252. package/dist/src/lease.js +1 -1
  253. package/dist/src/limrun-runtime-dependencies.js +1 -1
  254. package/dist/src/limrun.d.ts +1610 -7
  255. package/dist/src/limrun.js +1 -1
  256. package/dist/src/linux.js +1 -1
  257. package/dist/src/local-interactor-operation-set.js +1 -0
  258. package/dist/src/location-coordinates.js +1 -1
  259. package/dist/src/logcat.js +1 -1
  260. package/dist/src/macos-facade.js +1 -0
  261. package/dist/src/managed-device-scope.js +1 -0
  262. package/dist/src/mechanics.js +19 -0
  263. package/dist/src/metro.d.ts +4 -2
  264. package/dist/src/metro.js +1 -1
  265. package/dist/src/metro2.js +1 -1
  266. package/dist/src/mobile-snapshot-semantics.js +1 -1
  267. package/dist/src/multitouch-support.js +1 -0
  268. package/dist/src/numeric.js +1 -0
  269. package/dist/src/observability.js +1 -1
  270. package/dist/src/observation.js +2 -0
  271. package/dist/src/open-target-resolution.js +1 -0
  272. package/dist/src/output-path.js +1 -1
  273. package/dist/src/owner-identity.js +3 -1
  274. package/dist/src/parameterized-recorded-fill.js +1 -0
  275. package/dist/src/parser.js +1 -1
  276. package/dist/src/perf-facade.js +2 -0
  277. package/dist/src/perf-process-identity.js +1 -0
  278. package/dist/src/perf-runtime-operation-builder.js +1 -0
  279. package/dist/src/perf-runtime-plan.js +1 -0
  280. package/dist/src/perf-runtime.js +1 -0
  281. package/dist/src/perf.js +1 -4
  282. package/dist/src/physical-device-control.js +1 -1
  283. package/dist/src/physical-device-facade.js +1 -0
  284. package/dist/src/platform-request-scope.js +1 -0
  285. package/dist/src/platform-runtime-android-adb-host.js +1 -0
  286. package/dist/src/platform-runtime-android-mechanics.js +1 -0
  287. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  288. package/dist/src/platform-runtime-app-log-process.js +1 -1
  289. package/dist/src/platform-runtime-host.js +1 -1
  290. package/dist/src/platform-runtime-managed-owner.js +1 -0
  291. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  292. package/dist/src/platform-runtime-open-target.js +1 -1
  293. package/dist/src/platform-runtime-operation-host.js +4 -4
  294. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  295. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  296. package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
  297. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  298. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  299. package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
  300. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  301. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  302. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -0
  303. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  304. package/dist/src/platform-runtime-unavailable.js +1 -0
  305. package/dist/src/platform-runtime.js +1 -1
  306. package/dist/src/platform-runtime2.js +1 -1
  307. package/dist/src/plist.js +1 -1
  308. package/dist/src/png-worker-contract.js +1 -1
  309. package/dist/src/prepare-kind.js +1 -0
  310. package/dist/src/process-exit.js +1 -1
  311. package/dist/src/process.js +1 -0
  312. package/dist/src/provider-device-runtime.js +1 -0
  313. package/dist/src/provider-session-ownership.js +2 -0
  314. package/dist/src/provider-webdriver.js +1 -1
  315. package/dist/src/provider.js +1 -1
  316. package/dist/src/providers.js +1 -0
  317. package/dist/src/proxy.js +2 -2
  318. package/dist/src/react-native-overlay.js +1 -0
  319. package/dist/src/react-native.js +1 -1
  320. package/dist/src/record-runtime.js +1 -1
  321. package/dist/src/record-trace.js +1 -1
  322. package/dist/src/rect-center.js +1 -0
  323. package/dist/src/register-builtins.js +1 -0
  324. package/dist/src/registry.js +40 -28
  325. package/dist/src/remote-config2.js +1 -1
  326. package/dist/src/replay-divergence.js +2 -0
  327. package/dist/src/replay.js +2 -2
  328. package/dist/src/reporting.js +8 -7
  329. package/dist/src/request-admission.js +1 -0
  330. package/dist/src/request-cancel.js +1 -0
  331. package/dist/src/request-cancellation.js +1 -0
  332. package/dist/src/request-progress-protocol.js +1 -0
  333. package/dist/src/request-providers.js +1 -0
  334. package/dist/src/request-runtime-binding.js +1 -0
  335. package/dist/src/request.js +1 -0
  336. package/dist/src/result-serialization.js +1 -0
  337. package/dist/src/retry.js +1 -0
  338. package/dist/src/rolldown-runtime.js +1 -1
  339. package/dist/src/runner-cache-metadata.js +2 -0
  340. package/dist/src/runner-client.js +1 -1
  341. package/dist/src/runner-disposal.js +1 -1
  342. package/dist/src/runner-operations-facade.js +1 -0
  343. package/dist/src/runner-owner-facade.js +1 -0
  344. package/dist/src/runner-owner-state.js +1 -0
  345. package/dist/src/runner-presentation.js +1 -0
  346. package/dist/src/runner.js +1 -0
  347. package/dist/src/{runtime-transport.js → runtime-transport-hints.js} +1 -1
  348. package/dist/src/runtime.js +3 -3
  349. package/dist/src/runtime2.js +4 -4
  350. package/dist/src/runtime3.js +1 -1
  351. package/dist/src/runtime4.js +5 -3
  352. package/dist/src/runtime5.js +1 -1
  353. package/dist/src/runtime6.js +1 -1
  354. package/dist/src/runtime7.js +1 -1
  355. package/dist/src/runtime8.js +1 -1
  356. package/dist/src/runtime9.js +1 -1
  357. package/dist/src/scoped-provider.js +1 -1
  358. package/dist/src/screen-recording-completion.js +1 -0
  359. package/dist/src/screen-recording-live-handle.js +1 -0
  360. package/dist/src/screen-recording-options.js +1 -0
  361. package/dist/src/screen-recording-resource-recovery.js +1 -0
  362. package/dist/src/screen-recording-runtime.js +1 -0
  363. package/dist/src/screenshot-density.js +1 -1
  364. package/dist/src/screenshot-result.js +1 -6
  365. package/dist/src/screenshot-runtime.js +1 -0
  366. package/dist/src/screenshot.js +1 -1
  367. package/dist/src/screenshot2.js +1 -0
  368. package/dist/src/screenshot3.js +5 -0
  369. package/dist/src/script.js +1 -0
  370. package/dist/src/scroll-command.js +1 -0
  371. package/dist/src/scroll-gesture.js +1 -0
  372. package/dist/src/scroll-indicator.js +1 -0
  373. package/dist/src/sdk-batch-runner.d.ts +23 -6
  374. package/dist/src/sdk-batch-runner.js +2 -3
  375. package/dist/src/sdk-batch.js +2 -0
  376. package/dist/src/sdk-contracts.d.ts +170 -41
  377. package/dist/src/sdk-contracts.js +2 -2
  378. package/dist/src/sdk-device.js +1 -1
  379. package/dist/src/sdk-finders.d.ts +1 -1
  380. package/dist/src/sdk-finders.js +1 -1
  381. package/dist/src/sdk-io.js +1 -1
  382. package/dist/src/sdk-remote-config.d.ts +1 -1
  383. package/dist/src/sdk-remote-config.js +1 -1
  384. package/dist/src/sdk-selectors.d.ts +524 -140
  385. package/dist/src/sdk-selectors.js +1 -1
  386. package/dist/src/selection.js +1 -0
  387. package/dist/src/selector-runtime.js +1 -1
  388. package/dist/src/selectors.js +1 -1
  389. package/dist/src/semantic-index.js +1 -0
  390. package/dist/src/server.js +4 -4
  391. package/dist/src/session-allocation.js +1 -0
  392. package/dist/src/session-artifact-paths.js +1 -0
  393. package/dist/src/session-observation.js +1 -0
  394. package/dist/src/session-paths.js +1 -0
  395. package/dist/src/session-repair-tombstone.js +1 -0
  396. package/dist/src/session-routing.js +1 -0
  397. package/dist/src/session-runtime-admission.js +1 -0
  398. package/dist/src/session-snapshot.js +1 -0
  399. package/dist/src/session-store.js +4 -0
  400. package/dist/src/session-target-evidence.js +1 -1
  401. package/dist/src/session2.js +5 -27
  402. package/dist/src/settings.js +1 -0
  403. package/dist/src/shared.js +2 -2
  404. package/dist/src/simctl-facade.js +1 -0
  405. package/dist/src/simctl.js +1 -1
  406. package/dist/src/simulator-facade.js +1 -0
  407. package/dist/src/simulator.js +1 -1
  408. package/dist/src/snapshot-capture-annotations.js +1 -0
  409. package/dist/src/snapshot-desktop-projection.js +1 -0
  410. package/dist/src/snapshot-diagnostics.js +1 -0
  411. package/dist/src/snapshot-process.js +1 -0
  412. package/dist/src/snapshot-quality-backend-capabilities.js +1 -0
  413. package/dist/src/snapshot-quality-verdict.js +1 -0
  414. package/dist/src/snapshot-runtime-binding.js +1 -0
  415. package/dist/src/snapshot-runtime.js +1 -1
  416. package/dist/src/snapshot-scope.js +1 -1
  417. package/dist/src/snapshot-state.js +1 -0
  418. package/dist/src/snapshot.js +1 -8
  419. package/dist/src/snapshot2.js +1 -1
  420. package/dist/src/snapshot3.js +1 -1
  421. package/dist/src/snapshot4.js +1 -0
  422. package/dist/src/src.js +1 -1
  423. package/dist/src/src2.js +1 -1
  424. package/dist/src/src3.js +1 -2
  425. package/dist/src/src4.js +1 -1
  426. package/dist/src/src5.js +1 -0
  427. package/dist/src/src6.js +1 -0
  428. package/dist/src/src7.js +2 -0
  429. package/dist/src/src8.js +115 -0
  430. package/dist/src/startup-recovery-fence.js +1 -0
  431. package/dist/src/status-markers.js +1 -0
  432. package/dist/src/string-enum.js +1 -1
  433. package/dist/src/success-text.js +1 -0
  434. package/dist/src/surface-snapshot.js +1 -0
  435. package/dist/src/surface-snapshot2.js +1 -0
  436. package/dist/src/takeover.js +5 -0
  437. package/dist/src/tool-provider-facade.js +1 -0
  438. package/dist/src/tool-provider.js +4 -3
  439. package/dist/src/tool-provider2.js +1 -1
  440. package/dist/src/tool-provider3.js +1 -1
  441. package/dist/src/toolchain-probe.js +2 -0
  442. package/dist/src/touch-reference-frame.js +1 -0
  443. package/dist/src/touch-runtime.js +1 -0
  444. package/dist/src/transport.js +3 -0
  445. package/dist/src/tree.js +1 -0
  446. package/dist/src/ttl-memo.js +1 -0
  447. package/dist/src/tv-remote.js +1 -0
  448. package/dist/src/type-text-runtime.js +1 -0
  449. package/dist/src/undici.js +99 -0
  450. package/dist/src/update-check.js +1 -1
  451. package/dist/src/verified-file.js +1 -1
  452. package/dist/src/version.js +1 -1
  453. package/dist/src/video.js +2 -2
  454. package/dist/src/web.js +2 -1
  455. package/dist/src/web2.js +1 -0
  456. package/dist/src/webdriver-ios-snapshot.js +1 -0
  457. package/dist/src/webdriver-source.js +1 -0
  458. package/dist/src/window-state.js +1 -0
  459. package/linux/atspi-dump.py +54 -9
  460. package/package.json +58 -35
  461. package/server.json +9 -3
  462. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.10.apk.sha256 +0 -1
  463. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk +0 -0
  464. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk.sha256 +0 -1
  465. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +0 -4
  466. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -168
  467. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -6
  468. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +0 -4
  469. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +0 -4
  470. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentation.swift +0 -183
  471. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationTests.swift +0 -0
  472. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -4
  473. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +0 -4
  474. package/dist/src/appearance.js +0 -1
  475. package/dist/src/apps.js +0 -5
  476. package/dist/src/audio-probe.js +0 -1
  477. package/dist/src/cli-grammar.js +0 -1
  478. package/dist/src/command-catalog.js +0 -1
  479. package/dist/src/debug-symbols.js +0 -5
  480. package/dist/src/device-input-state.js +0 -2
  481. package/dist/src/device-ready.js +0 -1
  482. package/dist/src/dispatch.js +0 -1
  483. package/dist/src/handler-utils.js +0 -1
  484. package/dist/src/helper-package-install.js +0 -1
  485. package/dist/src/host-process.js +0 -3
  486. package/dist/src/ime-lifecycle.js +0 -2
  487. package/dist/src/ime-recovery-marker.js +0 -1
  488. package/dist/src/input-actions3.js +0 -1
  489. package/dist/src/install-artifact.js +0 -1
  490. package/dist/src/install-artifact2.js +0 -1
  491. package/dist/src/interaction-common.js +0 -1
  492. package/dist/src/interaction-runtime.js +0 -1
  493. package/dist/src/interaction-snapshot.js +0 -1
  494. package/dist/src/manifest.js +0 -1
  495. package/dist/src/method-scope.js +0 -1
  496. package/dist/src/png-resize.js +0 -1
  497. package/dist/src/process-lock.js +0 -1
  498. package/dist/src/runner-lease.js +0 -1
  499. package/dist/src/runner-sequence.js +0 -1
  500. package/dist/src/script-source-bundle.js +0 -16
  501. package/dist/src/sdk-android-adb.d.ts +0 -245
  502. package/dist/src/sdk-android-adb.js +0 -4
  503. package/dist/src/sdk.js +0 -1
  504. package/dist/src/setting-state.js +0 -1
  505. package/dist/src/shell-quote.js +0 -1
  506. package/dist/src/snapshot-session.js +0 -1
  507. package/dist/src/timing-safe-equal.js +0 -1
  508. package/dist/src/unsupported-interactor.js +0 -1
  509. package/dist/src/verdict.js +0 -1
  510. /package/dist/src/{recording-telemetry.js → telemetry.js} +0 -0
@@ -1,3 +1,3 @@
1
- import{n as e}from"./rolldown-runtime.js";import{A as t,D as n,E as r,_ as i,a,k as o}from"./sdk-contracts.js";import{h as s,u as c}from"./location-coordinates.js";import{Br as l,C as u,Gr as d,Hr as f,Ir as p,Jr as m,Kr as h,Lr as g,Ur as ee,Vr as te,Wr as ne,Xt as re}from"./sdk-batch-runner.js";import{f as ie,o as ae,p as oe,s as se}from"./sdk-device.js";import{An as ce,Mn as le,Tn as ue,cn as _,sn as de,u as fe,wn as pe}from"./script-source-bundle.js";import{C as me,S as he,_ as v,_t as ge,a as _e,at as ve,d as y,dt as b,f as ye,ht as x,i as be,l as xe,m as Se,mt as S,n as Ce,pt as we,u as Te,v as Ee,y as De}from"./screenshot-result.js";import{n as C,t as w}from"./command-catalog.js";import{b as Oe,c as ke,i as Ae,p as je,y as Me}from"./registry.js";import{t as Ne}from"./command-metadata.js";import{A as T,F as Pe,S as Fe,_ as Ie,b as Le,k as Re}from"./sdk-android-adb.js";import{r as ze,t as Be}from"./output-path.js";import{n as E,t as Ve}from"./version.js";import{n as He,t as Ue}from"./shell-quote.js";import{t as D}from"./timeouts.js";import{n as We,t as Ge}from"./client-metro.js";import O from"node:path";import{createHash as Ke,randomUUID as qe}from"node:crypto";import k from"node:fs";import Je from"node:os";import{pipeline as A}from"node:stream/promises";import{Transform as Ye,Writable as Xe}from"node:stream";import j from"node:net";function Ze(e,t){let n=f(e,`bundleId`),r=f(e,`package`);return{app:h(e,`app`),appPath:h(e,`appPath`),platform:d(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:de({session:t,bundleId:n,packageName:r})}}function Qe(e,t){let n=f(e,`bundleId`),r=f(e,`packageName`),a=n??r??f(e,`appId`),o=f(e,`launchTarget`)??r??n??a;if(!o)throw new i(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:e});return{appName:f(e,`appName`),appId:a,bundleId:n,packageName:r,launchTarget:o,installablePath:f(e,`installablePath`),archivePath:f(e,`archivePath`),materializationId:f(e,`materializationId`),materializationExpiresAt:f(e,`materializationExpiresAt`),identifiers:de({session:t,bundleId:n,packageName:r,appId:a})}}function $e(e){return{released:e.released===!0,materializationId:h(e,`materializationId`),identifiers:{}}}function et(e){let{record:t,platform:n,id:r,name:i,target:a}=rt(e,`name`),o=nt(t);return{platform:n,target:a,kind:ee(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...se(n)&&o?{appleOs:o}:{},identifiers:_(n,r,i),...M(n,r)}}function tt(e){let{record:t,platform:n,id:r,name:i,target:a}=rt(e,`name`),o=h(t,`device`),s=nt(t),c={session:i,..._(n,r,o)};return{name:i,createdAt:ne(t,`createdAt`),sessionStateDir:f(t,`sessionStateDir`),runnerLogPath:f(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...s?{appleOs:s}:{},identifiers:c,...M(n,r,{simulatorSetPath:te(t,`ios_simulator_device_set`)})},identifiers:c}}function nt(e){let t=e.appleOs;return ae(t)?t:void 0}function rt(e,t){let n=p(e);return{record:n,platform:d(n,`platform`),id:h(n,`id`),name:h(n,t),target:l(n,`target`)}}function M(e,t,n={}){if(e===`ios`)return{ios:{udid:t,...n.simulatorSetPath===void 0?{}:{simulatorSetPath:n.simulatorSetPath}}};if(!oe(e))return{};let r=n.serial??t;return e===`android`?{android:{serial:r}}:e===`harmonyos`?{harmonyos:{serial:r}}:{vega:{serial:r}}}function it(e){if(!g(e))return;let t=e.platform,n=f(e,`metroHost`),r=typeof e.metroPort==`number`?e.metroPort:void 0,i=f(e,`bundleUrl`),a=f(e,`launchUrl`);return{platform:t===`ios`||t===`android`?t:void 0,metroHost:n,metroPort:r,bundleUrl:i,launchUrl:a}}function at(e){let t=e.platform,n=f(e,`id`),r=f(e,`device`);if(!ie(t)||!n||!r)return;let i=l(e,`target`),a=oe(t)?f(e,`serial`)??n:void 0;return{platform:t,target:i,id:n,name:r,identifiers:{..._(t,n,r),...a?{serial:a}:{}},...M(t,t===`ios`?f(e,`device_udid`)??n:n,{simulatorSetPath:te(e,`ios_simulator_device_set`),serial:a})}}function ot(e){if(g(e)&&!(typeof e.durationMs!=`number`||typeof e.measuredAt!=`string`||typeof e.method!=`string`))return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:f(e,`appTarget`),appBundleId:f(e,`appBundleId`)}}function st(e){if(!g(e)||typeof e.success!=`boolean`||typeof e.exitCode!=`number`||typeof e.stdout!=`string`||typeof e.stderr!=`string`)return;let t=lt(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}const ct=[`hint`,`diagnosticId`,`logPath`,`supportedOn`];function lt(e){if(!g(e)||typeof e.code!=`string`||typeof e.message!=`string`)return;let t={code:e.code,message:e.message};for(let n of ct){let r=e[n];typeof r==`string`&&(t[n]=r)}return g(e.details)&&(t.details=e.details),typeof e.retriable==`boolean`&&(t.retriable=e.retriable),t}function ut(e){let t=lt(e.initialSnapshotError);return{...e.snapshot&&typeof e.snapshot==`object`?{snapshot:e.snapshot}:{},...t?{initialSnapshotError:t}:{}}}function dt(e){return Array.isArray(e)?e:[]}function ft(e){let t=pe(e);return m({requestId:e.requestId,cwd:e.cwd,sessionExplicit:e.session!==void 0,debug:e.debug,includeCost:e.cost,responseLevel:e.responseLevel,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform,...le(t),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function N(e){return e??`default`}const pt={...Ae(),batch:je(mt)};async function mt(e,t,n){let r=pt[e];if(!r)throw Error(`Missing daemon writer for batch command: ${e}`);let a=Ne(e);if(!a)throw Error(`Missing command metadata for batch command: ${e}`);try{return await gt(r,a,a.readInput(t))}catch(t){throw new i(`INVALID_ARGS`,`Batch step ${n} ${e} input is invalid: ${t instanceof Error?t.message:String(t)}`,void 0,t)}}async function ht(e,t){let n=pt[e];if(!n)throw Error(`Missing daemon writer for command: ${e}`);return await gt(n,Ne(e),t)}async function gt(e,t,n){let r=await e(n);return{...r,...t?{metadataFlags:Oe(t,r.options)}:{}}}async function _t(e,t){let n=k.statSync(e),r=O.basename(e),i=n.isDirectory(),a=bt(t)??yt(e,n),o=[];try{let t=i?await vt(e,o):e,n=k.statSync(t);return{payloadPath:t,fileName:r,artifactType:i?`app-bundle`:`file`,platform:a,contentType:i?`application/gzip`:`application/octet-stream`,sha256:await St(t),sizeBytes:n.size,cleanup:()=>xt(o)}}catch(e){throw xt(o),e}}async function vt(e,t){let n=k.mkdtempSync(O.join(Je.tmpdir(),`agent-device-upload-${qe()}-`));t.push(n);let r=O.join(n,`${O.basename(e)}.tar.gz`);return await Ie(`tar`,[`czf`,r,`-C`,O.dirname(e),O.basename(e)],{env:{...process.env,COPYFILE_DISABLE:`1`}}),r}function yt(e,t){let n=e.toLowerCase();if(t.isDirectory()&&n.endsWith(`.app`)||n.endsWith(`.ipa`))return`ios`;if(n.endsWith(`.apk`)||n.endsWith(`.aab`))return`android`}function bt(e){return e===`ios`||e===`android`?e:void 0}function xt(e){for(let t of e)k.rmSync(t,{recursive:!0,force:!0})}async function St(e){let t=Ke(`sha256`),n=new Xe({write(e,n,r){t.update(e),r()}});return await A(k.createReadStream(e),n).catch(e=>{throw new i(`COMMAND_FAILED`,`Failed to read local artifact`,{},e instanceof Error?e:void 0)}),t.digest(`hex`)}function Ct(e){let{stage:t,fileName:n,startOffset:r,totalBytes:i,onProgress:a}=e,o=r,s=Et(i),c=Math.min(i,r+s);return new Ye({transform(e,r,l){o=Math.min(i,o+e.byteLength),o>=c&&(a?.({type:`progress`,stage:t,fileName:n,transferredBytes:o,totalBytes:i}),c=Math.min(i,o+s)),l(null,e)}})}function wt(){if(!(process.stderr.isTTY!==!0||process.env.CI))return e=>{process.stderr.write(`${Tt(e)}\n`)}}function Tt(e){switch(e.type){case`start`:return`Uploading ${e.fileName} (${P(e.totalBytes)}) via ${Dt(e.stage)} upload`;case`resume`:return`Resuming ${e.fileName} at ${P(e.transferredBytes)} of ${P(e.totalBytes)}`;case`progress`:return`Uploaded ${P(e.transferredBytes)} of ${P(e.totalBytes)} (${Ot(e.transferredBytes,e.totalBytes)})`;case`fallback`:return`Direct upload did not complete; retrying ${e.fileName} with ${Dt(e.to)} upload`}}function Et(e){return Math.max(8388608,Math.ceil(e*.05))}function Dt(e){return e===`direct`?`direct`:`legacy`}function Ot(e,t){return t<=0?`100%`:`${Math.min(100,Math.floor(e/t*100))}%`}function P(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t.toFixed(1)} KiB`;let n=t/1024;return n<1024?`${n.toFixed(1)} MiB`:`${(n/1024).toFixed(1)} GiB`}const kt=300*1e3,At=`uploadStreamRetryable`;async function jt(e){return await F({...e,url:e.url,redirectCount:0,startOffset:0})}function Mt(e){return e instanceof i&&e.details?.[At]===!0}async function F(e){let t=await x(e.url.protocol),n=k.statSync(e.payloadPath).size,r=Ft(e.headers,e.startOffset,n);return Pt(e.progress,e.startOffset,n),await new Promise((a,o)=>{let s=!1,c=t.request({protocol:e.url.protocol,host:e.url.hostname,port:e.url.port,method:e.method,path:e.url.pathname+e.url.search,headers:r},t=>{s=!0,ge(t).then(r=>{clearTimeout(l);let s=t.statusCode??500,c=t.headers.location;if(c&&It(s)){if(e.redirectCount>=5){o(new i(`COMMAND_FAILED`,`Artifact upload exceeded redirect limit`,{maxRedirects:5,url:e.url.toString()}));return}let t=new URL(c,e.url);F({...e,url:t,redirectCount:e.redirectCount+1}).then(a,o);return}let u=Lt(s)?Rt(t.headers,n):void 0;if(u!==void 0){if(u>=n){a({statusCode:200,statusMessage:`Upload already complete`,body:``});return}if(u<=e.startOffset){o(new i(`COMMAND_FAILED`,`Artifact upload resume did not advance`,{offset:u,previousOffset:e.startOffset,url:e.url.toString()}));return}F({...e,startOffset:u}).then(a,o);return}a({statusCode:s,statusMessage:t.statusMessage,body:r})}).catch(o)}),l=setTimeout(()=>{c.destroy(),o(new i(`COMMAND_FAILED`,e.timeoutMessage,{timeoutMs:kt,...e.timeoutHint?{hint:e.timeoutHint}:{},...Nt(e)}))},kt);c.on(`error`,t=>{s||(clearTimeout(l),o(new i(`COMMAND_FAILED`,e.errorMessage,{...e.errorHint?{hint:e.errorHint}:{},...Nt(e)},t)))}),c.on(`close`,()=>clearTimeout(l)),A(k.createReadStream(e.payloadPath,{start:e.startOffset}),Ct({stage:e.progress?.stage??`legacy`,fileName:e.progress?.fileName??O.basename(e.payloadPath),startOffset:e.startOffset,totalBytes:n,onProgress:e.progress?.onProgress}),c).catch(e=>{s||(c.destroy(),o(new i(`COMMAND_FAILED`,`Failed to read local artifact`,{},e instanceof Error?e:Error(String(e)))))})})}function Nt(e){return e.retryable===!0?{[At]:!0}:{}}function Pt(e,t,n){e?.onProgress?.({type:t>0?`resume`:`start`,stage:e.stage,fileName:e.fileName,transferredBytes:t,totalBytes:n})}function Ft(e,t,n){return t<=0?e:{...e,"content-length":Math.max(n-t,0),"content-range":`bytes ${t}-${n-1}/${n}`}}function It(e){return[301,302,303,307,308].includes(e)}function Lt(e){return e===308}function Rt(e,t){let n=zt(e[`x-upload-offset`]??e[`upload-offset`]);if(n!==void 0)return Math.min(n,t);let r=Bt(e.range)?.match(/^bytes=0-(\d+)$/);if(!r)return;let i=Number(r[1]);if(!(!Number.isSafeInteger(i)||i<0))return Math.min(i+1,t)}function zt(e){let t=Bt(e);if(t===void 0)return;let n=Number(t);return Number.isSafeInteger(n)&&n>=0?n:void 0}function Bt(e){return Array.isArray(e)?e[0]:e}const Vt=30*1e3;async function Ht(e){let t=await _t(e.localPath,e.platform),n=e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`,r=qe();try{let i=await Kt({normalizedBase:n,token:e.token,artifact:t,uploadAttemptId:r});return i?.kind===`cache-hit`?i.uploadId:i?.kind===`direct-upload`?await Ut({normalizedBase:n,token:e.token,artifact:t,preflight:i,uploadAttemptId:r,onProgress:e.onProgress})||(e.onProgress?.({type:`fallback`,from:`direct`,to:`legacy`,fileName:t.fileName}),await Gt({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress})):await Gt({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress})}finally{t.cleanup()}}async function Ut(e){let t=async t=>(await Yt(e.artifact,t,e.onProgress),await Xt({normalizedBase:e.normalizedBase,token:e.token,uploadId:t.uploadId}));try{return await t(e.preflight)}catch(n){if(!Wt(n))return;let r=await Kt({normalizedBase:e.normalizedBase,token:e.token,artifact:e.artifact,uploadAttemptId:e.uploadAttemptId});if(r?.kind===`cache-hit`)return r.uploadId;if(r?.kind===`direct-upload`)try{return await t(r)}catch{return}return}}function Wt(e){return e instanceof i?Mt(e):!0}async function Gt(e){let{normalizedBase:t,token:n,artifact:r}=e,a=new URL(`upload`,t),o={"content-type":r.contentType,"x-artifact-type":r.artifactType,"x-artifact-filename":r.fileName,"x-artifact-hash":r.sha256,"x-artifact-hash-algorithm":`sha256`,"transfer-encoding":`chunked`};Object.assign(o,b(n));let s=await jt({url:a,method:`POST`,headers:o,payloadPath:r.payloadPath,timeoutMessage:`Artifact upload timed out`,timeoutHint:`The upload to the remote daemon exceeded the 5-minute timeout.`,errorMessage:`Failed to upload artifact to remote daemon`,errorHint:`Verify the remote daemon is reachable and supports artifact uploads.`,progress:{stage:`legacy`,fileName:r.fileName,onProgress:e.onProgress}});try{let e=JSON.parse(s.body);if(!e.ok||!e.uploadId)throw new i(`COMMAND_FAILED`,`Upload failed: ${s.body}`);return e.uploadId}catch(e){throw e instanceof i?e:new i(`COMMAND_FAILED`,`Invalid upload response: ${s.body}`)}}async function Kt(e){let t=new URL(`upload/preflight`,e.normalizedBase),n={"content-type":`application/json`};Object.assign(n,b(e.token));let r=await fetch(t,{method:`POST`,headers:n,signal:AbortSignal.timeout(Vt),body:JSON.stringify({uploadAttemptId:e.uploadAttemptId,sha256:e.artifact.sha256,fileName:e.artifact.fileName,sizeBytes:e.artifact.sizeBytes,artifactType:e.artifact.artifactType,...e.artifact.platform?{platform:e.artifact.platform}:{},contentType:e.artifact.contentType})}).catch(()=>void 0);if(r?.ok)return qt(await r.json().catch(()=>void 0))}function qt(e){if(!e||typeof e!=`object`)return;let t=e;if(t.ok!==!0||typeof t.uploadId!=`string`)return;if(t.cacheHit===!0)return{kind:`cache-hit`,uploadId:t.uploadId};let n=t.upload;if(!n||typeof n.url!=`string`)return;let r=n.headers??{};if(Jt(r))return{kind:`direct-upload`,uploadId:t.uploadId,url:n.url,headers:r}}function Jt(e){return!e||typeof e!=`object`||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}async function Yt(e,t,n){let r=await jt({url:new URL(t.url),method:`PUT`,headers:t.headers,payloadPath:e.payloadPath,timeoutMessage:`Direct artifact upload timed out`,timeoutHint:`The direct upload ticket did not accept the artifact within the timeout.`,errorMessage:`Failed to upload artifact with direct upload ticket`,retryable:!0,progress:{stage:`direct`,fileName:e.fileName,onProgress:n}});if(r.statusCode<200||r.statusCode>=300)throw new i(`COMMAND_FAILED`,`Direct artifact upload failed`,{statusCode:r.statusCode,statusMessage:r.statusMessage})}async function Xt(e){let t=new URL(`upload/finalize`,e.normalizedBase),n={"content-type":`application/json`};Object.assign(n,b(e.token));let r=await fetch(t,{method:`POST`,headers:n,signal:AbortSignal.timeout(Vt),body:JSON.stringify({uploadId:e.uploadId})}).catch(e=>{throw new i(`COMMAND_FAILED`,`Failed to finalize direct artifact upload`,{},e)});if(!r.ok)throw new i(`COMMAND_FAILED`,`Direct artifact upload finalize failed`,{status:r.status,statusText:r.statusText});let a=await r.json().catch(()=>void 0);if(!a?.ok||!a.uploadId)throw new i(`COMMAND_FAILED`,`Invalid upload finalize response`);return a.uploadId}async function Zt(e,t){let n=[...e.positionals??[]],r=e.flags?{...e.flags}:void 0,i=e.meta?.installSource,a={},o,s=wt();if(!hn(t))return rn({positionals:n,flags:r,installSource:i,uploadedArtifactId:o,clientArtifactPaths:a});Qt(e),r=en(e,n,r,a);let c=await an(e,t,s);return c&&(i=c.installSource,o=c.uploadedArtifactId??o),e.command!==`install`&&e.command!==`reinstall`||(o=await $t(e,t,n,s)??o),rn({positionals:n,flags:r,installSource:i,uploadedArtifactId:o,clientArtifactPaths:a})}function Qt(e){if(e.flags?.saveScript!==void 0)throw new i(`INVALID_ARGS`,`--save-script is not supported against a remote daemon: the healed script would be written on the daemon host, not on this machine.`,{hint:`Run the script against a local daemon to capture a healed .ad, or re-run without --save-script.`,command:e.command})}async function $t(e,t,n,r){let i=n.length===1?0:1,a=n[i];if(a===void 0)return;if(a.startsWith(`remote:`)){n[i]=a.slice(7);return}let o=nn(a,e.meta?.cwd);if(o)return await Ht({localPath:o,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:r})}function en(e,t,n,r){let i=on(e,t);if(!i)return n;i.positionalPath!==void 0&&(t[i.positionalIndex]=i.positionalPath);let a=tn(n,i.flagPath);return r[i.field]=i.localPath,a}function tn(e,t){return t===void 0?e:{...e??{},out:t}}function nn(e,t){let n=O.isAbsolute(e)?e:O.resolve(t??process.cwd(),e);return k.existsSync(n)?n:void 0}function rn(e){return{positionals:e.positionals,flags:e.flags,installSource:e.installSource,uploadedArtifactId:e.uploadedArtifactId,...Object.keys(e.clientArtifactPaths).length>0?{clientArtifactPaths:e.clientArtifactPaths}:{}}}async function an(e,t,n){let r=e.meta?.installSource;if(e.command!==`install_source`||!r||r.kind!==`path`)return null;let i=r.path.trim();if(!i)return{installSource:r};if(i.startsWith(`remote:`))return{installSource:{...r,path:i.slice(7)}};let a=O.isAbsolute(i)?i:O.resolve(e.meta?.cwd??process.cwd(),i);if(!k.existsSync(a))return{installSource:{...r,path:a}};let o=await Ht({localPath:a,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:n});return{installSource:{...r,path:a},uploadedArtifactId:o}}function on(e,t){if(e.command===`screenshot`){let n=un(e,`path`,`.png`);return t[0]?{field:`path`,localPath:n,positionalIndex:0,positionalPath:L(`screenshot`,`.png`)}:{field:`path`,localPath:n,positionalIndex:0,flagPath:L(`screenshot`,`.png`)}}if(e.command===`record`&&(t[0]??``).toLowerCase()===`start`){if(!cn(e)&&e.flags?.platform===void 0)return null;let t=sn(e),n=ln(un(e,`outPath`,t,1),e);return{field:`outPath`,localPath:n,positionalIndex:1,positionalPath:L(`recording`,O.extname(n)||t)}}return null}function sn(e){return ze(e.flags?.platform)}function cn(e){return I(e.positionals?.[1])||I(e.flags?.out)}function ln(e,t){return t.flags?.platform===`web`?Be(e,sn(t)):e}function un(e,t,n,r=0){let i=e.positionals?.[r]??e.flags?.out,a=`${t===`path`?`screenshot`:`recording`}-${Date.now()}${n}`,o=I(i)?i:a;return O.isAbsolute(o)?o:O.resolve(e.meta?.cwd??process.cwd(),o)}function I(e){return typeof e==`string`&&e.trim().length>0}function L(e,t){let n=t.startsWith(`.`)?t:`.${t}`;return O.posix.join(`/tmp`,`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${n}`)}async function dn(e,t,n){let r=Array.isArray(n.data?.artifacts)?n.data.artifacts:[];if(r.length===0||!e.baseUrl)return n;let i=n.data?{...n.data}:{},a=[];for(let n of r){if(!n||typeof n!=`object`||typeof n.artifactId!=`string`){a.push(n);continue}let r=fn(n,t);await pn({baseUrl:e.baseUrl,token:e.token,artifactId:n.artifactId,destinationPath:r,requestScope:t.meta}),i[n.field]=r,a.push({...n,localPath:r})}return i.artifacts=a,{ok:!0,data:i}}function fn(e,t){if(e.localPath&&e.localPath.trim().length>0)return e.localPath;let n=t.meta?.clientArtifactPaths?.[e.field];if(n&&n.trim().length>0)return n;let r=e.fileName?.trim()||`${e.field}-${Date.now()}`;return O.resolve(t.meta?.cwd??process.cwd(),r)}async function pn(e){let t=new URL(mn(e.baseUrl,e.artifactId)),n=await x(t.protocol);await k.promises.mkdir(O.dirname(e.destinationPath),{recursive:!0}),await new Promise((r,a)=>{let o=!1,s=e.timeoutMs??9e4,c=t=>{if(!o){if(o=!0,clearTimeout(u),t){k.promises.rm(e.destinationPath,{force:!0}).finally(()=>a(t));return}r()}},l=n.request({protocol:t.protocol,host:t.hostname,port:t.port,method:`GET`,path:t.pathname+t.search,headers:{...b(e.token),...we(e.requestScope?.tenantId)}},t=>{if((t.statusCode??500)>=400){let n=``;t.setEncoding(`utf8`),t.on(`data`,e=>{n+=e}),t.on(`end`,()=>{c(new i(`COMMAND_FAILED`,`Failed to download remote artifact`,{artifactId:e.artifactId,statusCode:t.statusCode,requestId:e.requestScope?.requestId,body:n}))});return}t.on(`aborted`,()=>{c(new i(`COMMAND_FAILED`,`Remote artifact download was interrupted`,{artifactId:e.artifactId,requestId:e.requestScope?.requestId}))}),A(t,k.createWriteStream(e.destinationPath)).then(()=>c(),e=>c(e instanceof Error?e:Error(String(e))))}),u=setTimeout(()=>{let t=new i(`COMMAND_FAILED`,`Remote artifact download timed out`,{artifactId:e.artifactId,requestId:e.requestScope?.requestId,timeoutMs:s});c(t),l.destroy(t)},s);l.on(`error`,t=>{if(t instanceof i){c(t);return}c(new i(`COMMAND_FAILED`,`Failed to download remote artifact`,{artifactId:e.artifactId,requestId:e.requestScope?.requestId,timeoutMs:s},t instanceof Error?t:void 0))}),l.end()})}function mn(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(`artifacts/${encodeURIComponent(t)}`,n).toString()}function hn(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}const gn=3e3,_n=1e3;function vn(e){let t=On(e);if(!t||typeof t!=`object`)return null;let n=t,r=yn(n);if(!r)return null;let i=bn(n);return i?{token:r,...i,transport:xn(n.transport),pid:R(n.pid)??0,version:Sn(n.version),codeSignature:Sn(n.codeSignature),processStartTime:Sn(n.processStartTime)}:null}function yn(e){return typeof e.token==`string`&&e.token.length>0?e.token:null}function bn(e){let t=R(e.port),n=R(e.httpPort);return t===void 0&&n===void 0?null:{port:t,httpPort:n}}function xn(e){return e===`socket`||e===`http`||e===`dual`?e:void 0}function Sn(e){return typeof e==`string`?e:void 0}function R(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function z(e){let t=On(e);if(!t||typeof t!=`object`)return null;let n=t;return Number.isInteger(n.pid)&&Number(n.pid)>0?{pid:Number(n.pid),processStartTime:typeof n.processStartTime==`string`?n.processStartTime:void 0,startedAt:typeof n.startedAt==`number`?n.startedAt:void 0}:null}function B(e){kn(e)}function V(e){kn(e)}function Cn(e){let t=U(e);if(!t.hasLock||t.hasInfo)return;let n=z(e.lockPath);if(!n){V(e.lockPath);return}y(n.pid,n.processStartTime)||V(e.lockPath)}async function H(e,t,n={}){let r=n.stopLiveProcesses??!0,i={reason:t,removedInfo:!1,removedLock:!1,stoppedInfoProcess:!1,stoppedLockProcess:!1};try{let t=k.existsSync(e.infoPath),n=vn(e.infoPath);if(n){let t=y(n.pid,n.processStartTime);t&&!r?i.retainedInfoProcess=!0:(t&&(await W(n),i.stoppedInfoProcess=!0),B(e.infoPath),i.removedInfo=!0)}else t&&(B(e.infoPath),i.removedInfo=!0);let a=k.existsSync(e.lockPath),o=z(e.lockPath);if(o){let t=y(o.pid,o.processStartTime);t&&!r?i.retainedLockProcess=!0:(t&&(await ye(o.pid,{termTimeoutMs:gn,killTimeoutMs:_n,expectedStartTime:o.processStartTime}),i.stoppedLockProcess=!0),V(e.lockPath),i.removedLock=!0)}else a&&(V(e.lockPath),i.removedLock=!0)}catch(e){i.error=e instanceof Error?e.message:String(e)}return T({level:i.error?`warn`:`info`,phase:`daemon_startup_metadata_cleanup`,data:i}),i}function U(e){return{hasInfo:k.existsSync(e.infoPath),hasLock:k.existsSync(e.lockPath)}}async function wn(e){let t=U(e);if(!t.hasLock||t.hasInfo)return!1;let n=z(e.lockPath);return!n||!y(n.pid,n.processStartTime)?(V(e.lockPath),!0):!1}async function W(e){await ye(e.pid,{termTimeoutMs:gn,killTimeoutMs:_n,expectedStartTime:e.processStartTime})}function Tn(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}function En(e,t=v(process.env.AGENT_DEVICE_STATE_DIR)){let n=Dn(t);return e.hasLock&&!e.hasInfo?`agent-device attempted to clean stale daemon metadata automatically, but ${t.lockPath} still exists without ${t.infoPath}. Retry with --debug; if this persists after confirming no agent-device daemon process is running, run: ${n}`:e.hasLock&&e.hasInfo?`agent-device attempted to clean stale daemon metadata automatically, but ${t.infoPath} and ${t.lockPath} still remain. Retry with --debug; if this persists after confirming no agent-device daemon process is running, run: ${n}`:e.hasInfo?`agent-device did not observe reachable daemon metadata after retrying, and ${t.infoPath} still remains. Stale metadata was cleaned automatically when safe; retry with --debug. If this persists after confirming no agent-device daemon process is running, run: ${n}`:`agent-device did not observe reachable daemon metadata after retrying. Stale metadata was cleaned automatically when safe; retry with --debug and check daemon diagnostics logs. If stale metadata returns after confirming no agent-device daemon process is running, run: ${n}`}function Dn(e){return`rm -f ${Ue(e.infoPath)} ${Ue(e.lockPath)}`}function On(e){if(!k.existsSync(e))return null;try{return JSON.parse(k.readFileSync(e,`utf8`))}catch{return null}}function kn(e){try{k.existsSync(e)&&k.unlinkSync(e)}catch{}}function An(e,t){if(t.onProgress){t.onProgress(e);return}e.type===`command`&&(t.req.command===`doctor`&&fe(),process.stderr.write(`${e.message}\n`))}function G(e,t,n){return new i(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:e.meta?.requestId,line:t},n instanceof Error?n:void 0)}function jn(e){let t=t=>(e.onError(t),!0);return{handleLine(n){let r;try{r=JSON.parse(n)}catch(r){return t(G(e.req,n,r))}if(be(r))try{return An(r.event,{req:e.req,onProgress:e.onProgress}),!1}catch(e){return t(e)}return _e(r)?(e.onResponse(r.response),!0):e.responseFormat===`socket-legacy`?(e.onResponse(r),!0):t(G(e.req,n,Error(`Missing daemon progress response envelope`)))}}}function Mn(e,t){return xe(e)&&String(Array.isArray(t)?t.join(`,`):t??``).includes(`application/x-ndjson`)}function Nn(e,t){let{req:n,isSettled:r,resolve:i,reject:a,clearTimeout:o}=t,s=``,c=jn({req:n,onProgress:t.onProgress,responseFormat:`socket-legacy`,onResponse(t){o(),i(t),e.end()},onError(e){o(),a(e)}});e.setEncoding(`utf8`),e.on(`data`,e=>{if(r())return;let t=Te(s,e);s=t.buffer;for(let e of t.lines)if(c.handleLine(e))return})}function Pn(e,t){let{req:n,handleResponseBody:r,reject:a,clearTimeout:o}=t,s=``,c=!1,l=jn({req:n,onProgress:t.onProgress,responseFormat:`ndjson-envelope`,onResponse(e){c=!0,o(),r(JSON.stringify(e))},onError(e){c=!0,o(),a(e)}});e.setEncoding(`utf8`),e.on(`data`,e=>{if(c)return;let t=Te(s,e);s=t.buffer;for(let e of t.lines)if(e&&l.handleLine(e))return}),e.on(`end`,()=>{if(c)return;let e=s.trim();e&&l.handleLine(e)||(c=!0,o(),a(G(n,e)))}),e.on(`error`,e=>{c||(c=!0,o(),a(new i(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:n.meta?.requestId},e instanceof Error?e:void 0)))})}const Fn=1e4,In=8*1024*1024;function Ln(e,t){return S(e,`sessions/${encodeURIComponent(t.session)}/requests/${encodeURIComponent(t.requestId)}/diagnostics`)}function Rn(e){let{logPath:t,...n}=e;return n}async function zn(e,t){let n=Rn(e),r=e.diagnosticsRecord,i=r?.requestId??t.requestId;if(!r)return K(n,t.endpoint,i,`the daemon named no diagnostics record`);try{let e=me(t.stateDir,r),a=await Bn({endpoint:t.endpoint,ref:r,destinationPath:e});return a?K(n,t.endpoint,i,a):{...n,logPath:e}}catch(e){return K(n,t.endpoint,i,e instanceof Error?e.message:String(e))}}function K(e,t,n,r){return{...e,logPathUnavailable:`remote daemon ${t.baseUrl}, request ${n??`unknown`}: ${r}`}}async function Bn(e){let{endpoint:t,ref:n,destinationPath:r}=e,i;try{i=new URL(Ln(t.baseUrl,n))}catch{return`daemon base URL is not a valid URL`}try{let e=await x(i.protocol);return await k.promises.mkdir(O.dirname(r),{recursive:!0}),await new Promise(n=>{let a=!1,o=e=>{if(!a){if(a=!0,clearTimeout(c),e===void 0){n(void 0);return}k.promises.rm(r,{force:!0}).finally(()=>{n(e)})}},s=e.request({protocol:i.protocol,host:i.hostname,port:i.port,method:`GET`,path:i.pathname+i.search,headers:{...b(t.token),...we(t.tenantId)}},e=>{let t=e.statusCode??500;if(t!==200){e.resume(),o(`HTTP ${t}`);return}let n=k.createWriteStream(r),i=0;e.on(`data`,e=>{i+=e.length,i>In&&(s.destroy(),n.destroy(),o(`record exceeds ${In} bytes`))}),e.on(`error`,e=>{n.destroy(),o(e.message)}),n.on(`error`,e=>{o(e.message)}),n.on(`finish`,()=>{o(void 0)}),e.pipe(n)}),c=setTimeout(()=>{o(`fetch timed out after ${Fn}ms`),s.destroy()},Fn);s.on(`error`,e=>{o(e.message)}),s.end()})}catch(e){return e instanceof Error?e.message:String(e)}}function Vn(e,t){let{info:n,req:r,stateDir:a,resolve:o,reject:s}=t;try{let t=Hn(e);if(t.error){Un(t.error,{info:n,req:r,stateDir:a,reject:s});return}if(!t.result||typeof t.result!=`object`){s(new i(`COMMAND_FAILED`,`Invalid daemon RPC response`,{requestId:r.meta?.requestId}));return}Kn(n,r,t.result,o,s)}catch(t){s(new i(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:r.meta?.requestId,line:e},t instanceof Error?t:void 0))}}function Hn(e){return JSON.parse(e)}async function Un(e,t){let{info:n,req:r,stateDir:i,reject:a}=t,o=r.meta?.requestId,s=Wn(e);if(!n.baseUrl){a(Gn(s,o));return}a(Gn(await zn(s,{endpoint:{baseUrl:n.baseUrl,token:n.token,tenantId:r.meta?.tenantId},stateDir:i,requestId:o}),o))}function Wn(e){let r=e.data??{};return{code:t(r.code==null?void 0:String(r.code),`COMMAND_FAILED`),message:String(r.message??e.message??`Daemon RPC request failed`),details:typeof r.details==`object`&&r.details?r.details:void 0,hint:typeof r.hint==`string`?r.hint:void 0,diagnosticId:typeof r.diagnosticId==`string`?r.diagnosticId:void 0,logPath:typeof r.logPath==`string`?r.logPath:void 0,diagnosticsRecord:n(r.diagnosticsRecord),retriable:typeof r.retriable==`boolean`?r.retriable:void 0,supportedOn:typeof r.supportedOn==`string`?r.supportedOn:void 0}}function Gn(e,n){return new i(t(e.code,`COMMAND_FAILED`),e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath,logPathUnavailable:e.logPathUnavailable,diagnosticsRecord:e.diagnosticsRecord,retriable:e.retriable,supportedOn:e.supportedOn,requestId:n})}async function Kn(e,t,n,r,i){try{r(e.baseUrl&&n.ok?await dn(e,t,n):n)}catch(e){i(e)}}function qn(e,t){let n=e.meta?.requestId??Re();return Jn(e.command)?{jsonrpc:`2.0`,id:n,method:Yn(e.command),params:Xn(e,e.command,t)}:{jsonrpc:`2.0`,id:n,method:`agent_device.command`,params:e}}function Jn(e){return e===`lease_allocate`||e===`lease_heartbeat`||e===`lease_release`}function Yn(e){switch(e){case`lease_allocate`:return`agent_device.lease.allocate`;case`lease_heartbeat`:return`agent_device.lease.heartbeat`;case`lease_release`:return`agent_device.lease.release`}}function Xn(e,t,n){return ce(ue(e),t,{includeTokenParam:n.includeTokenParam,token:e.token,session:e.session})}const Zn=[`xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand`,`xcodebuild .*AgentDeviceRunner\\.env\\.session-`,`xcodebuild build-for-testing .*apple/runner/AgentDeviceRunner/AgentDeviceRunner\\.xcodeproj`],Qn=new Set([`apple`,`ios`,`macos`]);function $n(e){return e!==void 0&&Qn.has(e)}function er(e){let t=u(e.command);if(t.envelopeMs===`unbounded`)return;let n={...t,envelopeMs:t.envelopeMs};return tr(n,e.positionals??[])??nr(n,e.flags)??n.envelopeMs}function tr(e,t){if(e.budget.source!==`positional-parser`)return;let n=e.budget.parser(t);return n===null?void 0:ir(e,n)}function nr(e,t){if(e.budget.source===`flag`)return e.budget.envelope===`widen`?rr(e,e.budget,t):typeof t?.timeoutMs==`number`?t.timeoutMs:e.envelopeMs}function rr(e,t,n){if(n?.settle!==!0)return e.envelopeMs;let r=typeof n.timeoutMs==`number`?n.timeoutMs:t.defaultBudgetMs;return typeof r==`number`?ar(e,r):e.envelopeMs}function ir(e,t){return Math.max(e.envelopeMs,t+re)}function ar(e,t){return Math.max(e.envelopeMs,e.envelopeMs+t+re)}function or(e,t,n,r,a,o,s){let c=a?{terminated:0}:lr(),l=!a&&sr(r),u=l?ur(e,t):{forcedKill:!1},d=$n(s)||c.terminated>0;return T({level:`error`,phase:`daemon_request_timeout`,data:{timeoutMs:o,requestId:n,command:r,timedOutRunnerPidsTerminated:c.terminated,timedOutRunnerCleanupError:c.error,daemonPidReset:l?e.pid:void 0,daemonPidForceKilled:l?u.forcedKill:void 0,daemonPreservedAfterTimeout:!a&&!l,daemonBaseUrl:e.baseUrl}}),new i(`COMMAND_FAILED`,`Daemon request timed out`,{timeoutMs:o,requestId:n,hint:cr({remote:a,resetDaemon:l,command:r,appleCleanupEvidence:d})})}function sr(e){return u(e).onTimeout===`reset-daemon`}function cr(e){let{remote:t,resetDaemon:n,command:r,appleCleanupEvidence:i}=e;if(t)return`Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.`;if(!n){let e=i&&r===C.snapshot?` If this was the first Apple-platform snapshot on the device, run agent-device prepare ios-runner with the same --platform before snapshot/test so runner startup is handled explicitly.`:``;return`Retry with --debug and check daemon diagnostics logs. The timed-out ${r??`request`} request was canceled${i?` and Apple runner work was aborted when detected`:``}; the daemon was kept alive so the session can still be closed or inspected.${e}`}return i?`Retry with --debug and check daemon diagnostics logs. Timed-out Apple runner xcodebuild processes were terminated when detected.`:`Retry with --debug and check daemon diagnostics logs. The daemon was reset after the timeout.`}function lr(){let e=0;try{for(let t of Zn)Fe(`pkill`,[`-f`,t],{allowFailure:!0}).exitCode===0&&(e+=1);return{terminated:e}}catch(t){return{terminated:e,error:t instanceof Error?t.message:String(t)}}}function ur(e,t){let n=!1;try{y(e.pid,e.processStartTime)&&(process.kill(e.pid,`SIGKILL`),n=!0)}catch{W(e)}finally{B(t.infoPath),V(t.lockPath)}return{forcedKill:n}}const dr=`Daemon HTTP endpoint is unavailable`,fr=`Daemon socket endpoint is unavailable`;async function pr(e,t){let n=Sr(e,t);if(await mr(e,n))return!0;let r=Cr(e,t,n);return r?await mr(e,r):!1}async function mr(e,t){return t===`http`?await gr(e):await hr(e.port)}function hr(e){return e?new Promise(t=>{let n=!1,r=j.createConnection({host:`127.0.0.1`,port:e},()=>{i(!0)}),i=e=>{n||(n=!0,r.destroy(),t(e))};r.setTimeout(500),r.on(`timeout`,()=>{i(!1)}),r.on(`error`,()=>{i(!1)})}):Promise.resolve(!1)}function gr(e){return vr(e).then(e=>e.reachable)}async function _r(e){let t=await vr(e);if(!e.baseUrl||!t.reachable)return t;if(typeof t.rpcProtocolVersion==`number`&&t.rpcProtocolVersion!==2)throw new i(`COMMAND_FAILED`,`Remote daemon RPC protocol is incompatible`,{daemonBaseUrl:e.baseUrl,clientVersion:E(),remoteVersion:t.version,remoteService:t.service,supportedRpcProtocolVersion:2,remoteRpcProtocolVersion:t.rpcProtocolVersion,hint:`Upgrade agent-device on the client or remote host so both support the same daemon RPC protocol.`});return t}async function vr(e){let t=e.baseUrl?S(e.baseUrl,`health`):e.httpPort?`http://127.0.0.1:${e.httpPort}/health`:null;if(!t)return{reachable:!1};let n=new URL(t),r=await x(n.protocol),i=e.baseUrl?3e3:500;return await new Promise(t=>{let a=e.baseUrl?b(e.token):{},o=r.request({protocol:n.protocol,host:n.hostname,port:n.port,path:n.pathname+n.search,method:`GET`,timeout:i,headers:a},e=>{let n=``;e.setEncoding(`utf8`),e.on(`data`,e=>{n+=e}),e.on(`end`,()=>{let r=e.statusCode??500;t({reachable:r<500,statusCode:r,...yr(n)})})});o.on(`timeout`,()=>{o.destroy(),t({reachable:!1})}),o.on(`error`,()=>{t({reachable:!1})}),o.end()})}function yr(e){try{let t=JSON.parse(e);return{service:typeof t.service==`string`?t.service:void 0,version:typeof t.version==`string`?t.version:void 0,rpcProtocolVersion:typeof t.rpcProtocolVersion==`number`?t.rpcProtocolVersion:void 0}}catch{return{}}}async function br(e,t,n,r,i,a={}){let o=Sr(e,n);try{return await xr(e,t,r,i,o,a)}catch(s){let c=Cr(e,n,o);if(!c||!wr(s,o))throw s;return await xr(e,t,r,i,c,a)}}async function xr(e,t,n,r,i,a){return i===`http`?await Or(e,t,n,r,a):await Dr(e,t,n,r,a)}function Sr(e,t){if(e.baseUrl){if(t===`socket`)throw new i(`COMMAND_FAILED`,`Remote daemon endpoint only supports HTTP transport`,{daemonBaseUrl:e.baseUrl});return`http`}if(t===`http`||t===`socket`)return Tr(e,t);let n=(e.transport===`socket`||e.transport===`dual`?[`socket`,`http`]:[`http`,`socket`]).find(t=>q(e,t));if(n)return n;throw new i(`COMMAND_FAILED`,`Daemon metadata has no reachable transport`)}function q(e,t){return t===`http`?!!e.httpPort:!!e.port}function Cr(e,t,n){if(t!==`auto`||e.baseUrl)return null;let r=n===`socket`?`http`:`socket`;return q(e,r)?r:null}function wr(e,t){return t===`socket`&&e instanceof i&&e.code===`COMMAND_FAILED`&&e.message===`Failed to communicate with daemon`&&e.details?.daemonSocketRequestWritten===!1}function Tr(e,t){if(q(e,t))return t;throw new i(`COMMAND_FAILED`,t===`http`?dr:fr)}function Er(e,t,n,r={}){return T({level:`error`,phase:`daemon_request_socket_error`,data:{requestId:t,message:e instanceof Error?e.message:String(e)}}),new i(`COMMAND_FAILED`,`Failed to communicate with daemon`,{...r,requestId:t,hint:n?`Retry command. If this persists, verify the remote daemon URL, auth token, and remote host reachability.`:`Retry command. If this persists, clean stale daemon metadata and start a fresh session.`},e instanceof Error?e:void 0)}async function Dr(e,t,n,r,a){let o=e.port;if(!o)throw new i(`COMMAND_FAILED`,fr);return new Promise((i,s)=>{let c=!1,l=j.createConnection({host:`127.0.0.1`,port:o},()=>{c=!0,l.write(`${JSON.stringify(t)}\n`)}),u=!1,d=typeof r==`number`?setTimeout(()=>{u=!0,l.destroy(),s(or(e,n,t.meta?.requestId,t.command,!1,r,t.flags?.platform))},r):void 0;Nn(l,{req:t,onProgress:a.onProgress,isSettled:()=>u,clearTimeout:()=>{d&&clearTimeout(d)},resolve:e=>{u=!0,i(e)},reject:e=>{u=!0,s(e)}}),l.on(`error`,e=>{u||(u=!0,d&&clearTimeout(d),s(Er(e,t.meta?.requestId,!1,{daemonSocketRequestWritten:c})))})})}async function Or(e,t,n,r,a){let o=e.baseUrl?new URL(S(e.baseUrl,`rpc`)):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!o)throw new i(`COMMAND_FAILED`,dr);let s=JSON.stringify(qn(t,{includeTokenParam:!e.baseUrl})),c={"content-type":`application/json`,"content-length":Buffer.byteLength(s)};e.baseUrl&&Object.assign(c,b(e.token));let l=await x(o.protocol);return await new Promise((u,d)=>{let f=l.request({protocol:o.protocol,host:o.hostname,port:o.port,method:`POST`,path:o.pathname+o.search,headers:c},r=>{if(Mn(t,r.headers?.[`content-type`])){Pn(r,{req:t,onProgress:a.onProgress,reject:d,clearTimeout:()=>{m&&clearTimeout(m)},handleResponseBody:r=>Vn(r,{info:e,req:t,stateDir:n.baseDir,resolve:u,reject:d})});return}ge(r).then(r=>{m&&clearTimeout(m),Vn(r,{info:e,req:t,stateDir:n.baseDir,resolve:u,reject:d})}).catch(e=>{m&&clearTimeout(m),d(new i(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:t.meta?.requestId},e instanceof Error?e:void 0))})}),p=Tn(e),m=typeof r==`number`?setTimeout(()=>{f.destroy(),d(or(e,n,t.meta?.requestId,t.command,p,r,t.flags?.platform))},r):void 0;f.on(`error`,e=>{m&&clearTimeout(m),d(Er(e,t.meta?.requestId,p))}),f.write(s),f.end()})}const J=15e3,Y=new j.BlockList;Y.addSubnet(`127.0.0.0`,8,`ipv4`),Y.addAddress(`::1`,`ipv6`),Y.addSubnet(`::ffff:127.0.0.0`,104,`ipv6`);function kr(e,t){let n=Ar(e),r=jr(e,t),i=Mr(e,r.remoteBaseUrl),a=Nr(e,n,r.rawBaseUrl);return{paths:v(a?Pr():n),transportPreference:i.preference,serverMode:i.serverMode,ownedStateDir:a,remoteBaseUrl:r.remoteBaseUrl,remoteAuthToken:r.authToken}}function Ar(e){return e.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR}function jr(e,t){let n=e.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL,r=ri(n),i=t??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN;return ii(r,i),{rawBaseUrl:n,remoteBaseUrl:r,authToken:i}}function Mr(e,t){let n=e.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,r=De(n);if(t&&r===`socket`)throw new i(`INVALID_ARGS`,`Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.`,{daemonBaseUrl:t});return{preference:r,serverMode:Ee(e.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??(n===`dual`?`dual`:void 0))}}function Nr(e,t,n){return Jr(e.command)&&!t&&!n}function Pr(){return k.mkdtempSync(O.join(Je.tmpdir(),`agent-device-replay-daemon-`))}async function Fr(e){if(e.remoteBaseUrl)return await Ir(e);let t=await Lr(e);return t?{info:t,startedByClient:!1}:(Cn(e.paths),await Ur(e))}async function Ir(e){let t={transport:`http`,token:e.remoteAuthToken??``,pid:0,baseUrl:e.remoteBaseUrl};if((await _r(t)).reachable)return{info:t,startedByClient:!1};throw new i(`COMMAND_FAILED`,`Remote daemon is unavailable`,{daemonBaseUrl:e.remoteBaseUrl,hint:`Verify AGENT_DEVICE_DAEMON_BASE_URL points to a reachable daemon with GET /health and POST /rpc. If this CLI was connected with connect proxy, run agent-device disconnect to return to the local daemon.`})}async function Lr(e){let t=vn(e.paths.infoPath);if(!t)return null;let n=await Rr(t,e.transportPreference);return Br(t,n)?t:(Vr(t,n,e.paths.baseDir),await W(t),B(e.paths.infoPath),null)}async function Rr(e,t){try{return await pr(e,t)}catch(e){if(zr(e))return!1;throw e}}function zr(e){return e instanceof i&&e.code===`COMMAND_FAILED`&&(e.message===`Daemon HTTP endpoint is unavailable`||e.message===`Daemon socket endpoint is unavailable`)}function Br(e,t){return e.version===E()&&e.codeSignature===ei()&&t}function Vr(e,t,n){try{let r=e.version?`pid ${e.pid}, v${e.version}`:`pid ${e.pid}`,i=Hr(e,t);process.stderr.write(`Replacing daemon (${r}) in ${n}: ${i}\n`)}catch{}}function Hr(e,t){return e.version===E()?e.codeSignature===ei()?t?`not reusable`:`unreachable`:`code-signature mismatch`:`version mismatch (client v${E()})`}async function Ur(e){let t=0,n=[],r,a;for(let i=1;i<=2;i+=1){let o;try{o=Qr(e),a={pid:o.pid}}catch(t){if(r=t instanceof Error?t.message:String(t),n.push(await H(e.paths,`start_error`)),i<2){await D(150);continue}break}let s=await Zr(J,e,o);if(s.kind===`ready`)return{info:s.info,startedByClient:!0};if(s.kind===`early_exit`){if(a=s.exit,r=ti(s.exit),n.push(await H(e.paths,`start_error`)),i<2){await D(150);continue}break}if(await wn(e.paths)){t+=1;continue}let c=U(e.paths),l=i<2,u=await H(e.paths,`startup_timeout`,{stopLiveProcesses:!1});if(n.push(u),u.retainedInfoProcess||u.retainedLockProcess){let t=await Zr(J,e,o);if(t.kind===`ready`)return{info:t.info,startedByClient:!0};t.kind===`early_exit`&&(a=t.exit,r=ti(t.exit));break}if(!l)break;!c.hasInfo&&!c.hasLock&&await D(150)}let o=U(e.paths),s=ni(e.paths.logPath);throw new i(`COMMAND_FAILED`,`Failed to start daemon`,{kind:`daemon_startup_failed`,stateDir:e.paths.baseDir,infoPath:e.paths.infoPath,lockPath:e.paths.lockPath,logPath:e.paths.logPath,startupTimeoutMs:J,startupAttempts:2,lockRecoveryCount:t,cleanupResults:n,startError:r,daemonProcess:a,...s?{daemonLogTail:s}:{},metadataState:o,hint:En(o,e.paths)})}async function Wr(e,t,n,r){if(!Jr(e.command)||!t.startedByClient&&!n.ownedStateDir||Tn(t.info)||Kr(r)||Yr(e,r))return r;let i={pid:t.info.pid,removedInfo:!1,removedLock:!1,removedStateDir:!1,error:void 0},a=r;try{await W(t.info)}catch(e){i.error=e instanceof Error?e.message:String(e)}finally{let e=k.existsSync(n.paths.infoPath);B(n.paths.infoPath),i.removedInfo=e&&!k.existsSync(n.paths.infoPath);let t=k.existsSync(n.paths.lockPath);if(V(n.paths.lockPath),i.removedLock=t&&!k.existsSync(n.paths.lockPath),n.ownedStateDir){let e=he(n.paths.sessionsDir);e?a=Gr(r,e):(k.rmSync(n.paths.baseDir,{recursive:!0,force:!0}),i.removedStateDir=!k.existsSync(n.paths.baseDir))}}return T({level:i.error?`warn`:`info`,phase:`daemon_replay_cleanup`,data:i}),a}function Gr(e,t){if(e&&!e.ok)return e;let{sessionName:n,tombstone:a}=t,o=a.sourcePath?`re-run: replay ${a.sourcePath} --save-script`:`re-run your replay <script> --save-script from the start`;return{ok:!1,error:r(new i(`REPAIR_COMMIT_FAILED`,`The repair transaction for session "${n}" completed, but committing its healed script failed at teardown: ${a.commitFailure.message}. ${o}.`))}}function Kr(e){if(!e||e.ok||e.error.code!==`REPLAY_DIVERGENCE`)return!1;let t=e.error.details?.divergence;if(!t||typeof t!=`object`)return!1;let n=t.resume;return!n||typeof n!=`object`?!1:n.repairSessionHeld===!0}function qr(e,t){let n=`This repair session's daemon was kept alive to continue the repair; pass --state-dir ${t} on your next command (press, replay --from, or close --save-script) to reach it.`,r=e.error.hint;return{...e,error:{...e.error,hint:r?`${r} ${n}`:n}}}function Jr(e){return e===C.replay||e===C.test}function Yr(e,t){return e.command!==C.replay||!t||!t.ok?!1:t.data?.sessionActive===!0}function Xr(e,t){let n=e.data??{},r=typeof n.session==`string`?n.session:void 0,i=[...t?[`--state-dir ${He(t)}`]:[],...r?[`--session ${He(r)}`]:[]];if(i.length===0)return e;let a=`This session's daemon was kept alive because its script left the session active; pass ${i.join(` `)} on your next command to reach it.`,o=typeof n.message==`string`?n.message:void 0;return{...e,data:{...n,hint:a,message:o?`${o} ${a}`:a}}}async function Zr(e,t,n){let r=Date.now(),i;for(n.exited.then(e=>{i=e});Date.now()-r<e;){if(i)return{kind:`early_exit`,exit:i};let e=vn(t.paths.infoPath);if(e&&await pr(e,t.transportPreference))return{kind:`ready`,info:e};if(i)return{kind:`early_exit`,exit:i};await D(100)}return{kind:`timeout`}}function Qr(e){let t=$r(),n=t.useSrc?[`--experimental-strip-types`,t.srcPath]:[t.distPath],r={...process.env,AGENT_DEVICE_STATE_DIR:e.paths.baseDir,AGENT_DEVICE_DAEMON_SERVER_MODE:e.serverMode};k.mkdirSync(e.paths.baseDir,{recursive:!0});let i=k.openSync(e.paths.logPath,`a`),a=k.openSync(e.paths.logPath,`a`);try{return Le(process.execPath,n,{env:r,stdio:[`ignore`,i,a]})}finally{k.closeSync(i),k.closeSync(a)}}function $r(){let e=Ve(),t=[O.join(e,`dist`,`src`,`internal`,`daemon.js`),O.join(e,`dist`,`src`,`daemon.js`)],n=t[0];if(n===void 0)throw new i(`COMMAND_FAILED`,`Daemon dist path list is empty`);let r=t.find(e=>k.existsSync(e))??n,a=O.join(e,`src`,`daemon.ts`),o=t.some(e=>k.existsSync(e)),s=k.existsSync(a);if(!o&&!s)throw new i(`COMMAND_FAILED`,`Daemon entry not found`,{distPaths:t,srcPath:a});return{root:e,distPath:r,distPaths:t,srcPath:a,useSrc:(process.execArgv.includes(`--experimental-strip-types`)||!o)&&s}}function ei(){let e=$r();return Se(e.useSrc?e.srcPath:e.distPath,e.root)}function ti(e){return e.error?`daemon process ${e.pid} failed to start: ${e.error}`:e.signal?`daemon process ${e.pid} exited before readiness with signal ${e.signal}`:`daemon process ${e.pid} exited before readiness with code ${e.exitCode??0}`}function ni(e){try{if(!k.existsSync(e))return;let t=k.statSync(e);if(t.size<=0)return;let n=Math.min(t.size,64e3),r=k.openSync(e,`r`);try{let e=Buffer.alloc(n);k.readSync(r,e,0,n,t.size-n);let i=e.toString(`utf8`).trim();return i.length>0?i:void 0}finally{k.closeSync(r)}}catch{return}}function ri(e){if(!e)return;let t;try{t=new URL(e)}catch(t){throw new i(`INVALID_ARGS`,`Invalid daemon base URL`,{daemonBaseUrl:e},t instanceof Error?t:void 0)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new i(`INVALID_ARGS`,`Daemon base URL must use http or https`,{daemonBaseUrl:e});return t.toString().replace(/\/+$/,``)}function ii(e,t){if(!e)return;let n=new URL(e).hostname;if(!ai(n)&&!(typeof t==`string`&&t.trim().length>0))throw new i(`INVALID_ARGS`,`Remote daemon base URL for non-loopback hosts requires daemon authentication`,{daemonBaseUrl:e,hint:`Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL.`})}function ai(e){let t=e.trim().toLowerCase().replace(/^\[(.*)\]$/,`$1`);return t===`localhost`?!0:j.isIPv4(t)?Y.check(t,`ipv4`):j.isIPv6(t)?Y.check(t,`ipv6`):!1}async function oi(e,t={}){let n=e.meta?.requestId??Re(),r=!!(e.meta?.debug||e.flags?.verbose),i=e.flags,{daemonAuthToken:a,...o}=i??{},s=i?{...e,flags:o}:e,c=kr(s,t.authToken??a),l=er(s),u=await Pe(`daemon_startup`,async()=>await Fr(c),{requestId:n,session:e.session}),d=u.info,f=await Zt(s,d);mi(s.command);let p=si(s,f,d.token,n,r);return T({level:`info`,phase:`daemon_request_prepare`,data:{requestId:n,command:s.command,session:s.session}}),await di(s,u,c,async()=>pi(fi(await Pe(`daemon_request`,async()=>await br(d,p,c.transportPreference,c.paths,l,t.onProgress?{onProgress:t.onProgress}:void 0),{requestId:n,command:e.command}),c),s,c))}function si(e,t,n,r,i){return{...e,positionals:t.positionals,flags:t.flags,token:n,meta:ci(e,t,r,i)}}function ci(e,t,n,r){let i=e.meta??{};return{...i,requestId:n,debug:r,...li(i,e.flags),...ui(t)}}function li(e,t){return{includeCost:e.includeCost,cwd:e.cwd,sessionExplicit:e.sessionExplicit,tenantId:e.tenantId??t?.tenant,runId:e.runId??t?.runId,leaseId:e.leaseId??t?.leaseId,sessionIsolation:e.sessionIsolation??t?.sessionIsolation,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform}}function ui(e){return{...e.uploadedArtifactId?{uploadedArtifactId:e.uploadedArtifactId}:{},...e.clientArtifactPaths?{clientArtifactPaths:e.clientArtifactPaths}:{},...e.installSource?{installSource:e.installSource}:{}}}async function di(e,t,n,r){let a,o=!1,s;try{a=await r()}catch(e){o=!0,s=e}let c=await Wr(e,t,n,a);if(o)throw s;if(!c)throw new i(`COMMAND_FAILED`,`Daemon request produced no response after cleanup`);return c}function fi(e,t){return e.ok||!t.ownedStateDir||!Kr(e)?e:qr(e,t.paths.baseDir)}function pi(e,t,n){return!e.ok||!Yr(t,e)?e:Xr(e,n.ownedStateDir?n.paths.baseDir:void 0)}function mi(e){!hi(e)||process.stderr.isTTY!==!0||process.env.CI||process.stderr.write(e===C.reinstall?`Reinstalling...
1
+ import{r as e}from"./rolldown-runtime.js";import{B as t,C as n,L as r,a as i,o as a}from"./sdk-contracts.js";import"./capture.js";import{n as o}from"./snapshot-capture-annotations.js";import{C as s,D as c,S as l,T as u,b as d,g as f,h as p,w as m,x as h,y as g}from"./sdk-batch-runner.js";import{n as _}from"./snapshot-diagnostics.js";import{E as ee,T as te,h as ne,i as re}from"./registry.js";import{c as ie,m as v,p as y,s as b}from"./sdk-device.js";import{f as x,i as S}from"./lease-scope.js";import{C as ae,en as oe}from"./sdk-batch.js";import{n as C,t as w}from"./catalog.js";import{c as T,n as se,r as ce}from"./diagnostics.js";import{t as E}from"./command-metadata.js";import"./diagnostics2.js";import{a as le,c as ue,i as de,l as fe,n as pe,o as me,r as he,s as ge,t as _e}from"./daemon-client-lifecycle.js";import{n as D}from"./config.js";import{r as ve}from"./session-paths.js";import{n as ye,t as be}from"./client-metro.js";import{t as xe}from"./screenshot-result.js";import O from"node:path";import k from"node:fs";function A(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function j(e,t,n){return{deviceId:t,deviceName:n,...v(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function M(e,t){let n=h(e,`bundleId`),r=h(e,`package`);return{app:u(e,`app`),appPath:u(e,`appPath`),platform:m(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:A({session:t,bundleId:n,packageName:r})}}function Se(e,t){let r=h(e,`bundleId`),i=h(e,`packageName`),a=r??i??h(e,`appId`),o=h(e,`launchTarget`)??i??r??a;if(!o)throw new n(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:e});return{appName:h(e,`appName`),appId:a,bundleId:r,packageName:i,launchTarget:o,installablePath:h(e,`installablePath`),archivePath:h(e,`archivePath`),materializationId:h(e,`materializationId`),materializationExpiresAt:h(e,`materializationExpiresAt`),identifiers:A({session:t,bundleId:r,packageName:i,appId:a})}}function Ce(e){return{released:e.released===!0,materializationId:u(e,`materializationId`),identifiers:{}}}function N(e){let{record:t,platform:n,id:r,name:i,target:a}=F(e,`name`),o=P(t);return{platform:n,target:a,kind:l(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...ie(n)&&o?{appleOs:o}:{},identifiers:j(n,r,i),...we(t),...I(n,r)}}function we(e){let t=e.claimedBy;if(!t||typeof t!=`object`||Array.isArray(t))return{};let n=t,r=n.session,i=n.workspace;return typeof r!=`string`||typeof i!=`string`?{}:{claimedBy:{session:r,workspace:i}}}function Te(e){let{record:t,platform:n,id:r,name:i,target:a}=F(e,`name`),o=u(t,`device`),c=P(t),l={session:i,...j(n,r,o)};return{name:i,address:h(t,`address`),createdAt:s(t,`createdAt`),sessionStateDir:h(t,`sessionStateDir`),runnerLogPath:h(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...c?{appleOs:c}:{},identifiers:l,...I(n,r,{simulatorSetPath:d(t,`ios_simulator_device_set`)})},identifiers:l}}function P(e){let t=e.appleOs;return b(t)?t:void 0}function F(e,t){let n=p(e);return{record:n,platform:m(n,`platform`),id:u(n,`id`),name:u(n,t),target:g(n,`target`)}}function I(e,t,n={}){if(e===`ios`)return{ios:{udid:t,...n.simulatorSetPath===void 0?{}:{simulatorSetPath:n.simulatorSetPath}}};if(!v(e))return{};let r=n.serial??t;return e===`android`?{android:{serial:r}}:e===`harmonyos`?{harmonyos:{serial:r}}:{vega:{serial:r}}}function Ee(e){if(!f(e))return;let t=e.platform,n=h(e,`metroHost`),r=typeof e.metroPort==`number`?e.metroPort:void 0,i=h(e,`bundleUrl`),o=h(e,`launchUrl`);return{platform:a(t)?t:void 0,metroHost:n,metroPort:r,bundleUrl:i,launchUrl:o}}function De(e){let t=e.platform,n=h(e,`id`),r=h(e,`device`);if(!y(t)||!n||!r)return;let i=g(e,`target`),a=v(t)?h(e,`serial`)??n:void 0;return{platform:t,target:i,id:n,name:r,identifiers:{...j(t,n,r),...a?{serial:a}:{}},...I(t,t===`ios`?h(e,`device_udid`)??n:n,{simulatorSetPath:d(e,`ios_simulator_device_set`),serial:a})}}const Oe=[`explicit-selector`,`existing-session`,`single-booted-local`,`single-bootable-local`,`single-app-installed-local`,`preferred-local`,`single-provider-device`],ke=[`session`,`local`,`provider`];function Ae(e){if(!f(e))return;let{reason:t,source:n,candidateCount:r,bootOccurred:i}=e;if(!(!Oe.includes(t)||!ke.includes(n)||typeof r!=`number`||!Number.isInteger(r)||r<0||typeof i!=`boolean`))return{reason:t,source:n,candidateCount:r,bootOccurred:i}}function je(e){if(f(e)&&typeof e.durationMs==`number`&&typeof e.measuredAt==`string`&&typeof e.method==`string`)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:h(e,`appTarget`),appBundleId:h(e,`appBundleId`)}}function L(e){if(!f(e)||typeof e.success!=`boolean`||typeof e.exitCode!=`number`||typeof e.stdout!=`string`||typeof e.stderr!=`string`)return;let t=R(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}const Me=[`hint`,`diagnosticId`,`logPath`,`supportedOn`];function R(e){if(!f(e)||typeof e.code!=`string`||typeof e.message!=`string`)return;let t={code:e.code,message:e.message};Object.assign(t,Ne(e.cause));for(let n of Me){let r=e[n];typeof r==`string`&&(t[n]=r)}return f(e.details)&&(t.details=e.details),typeof e.retriable==`boolean`&&(t.retriable=e.retriable),t}function Ne(e){let n=t(e);return n?{cause:n}:void 0}function Pe(e){let t=R(e.initialSnapshotError);return{...e.snapshot&&typeof e.snapshot==`object`?{snapshot:e.snapshot}:{},...t?{initialSnapshotError:t}:{}}}function Fe(e){return Array.isArray(e)?e:[]}function Ie(e){let t=S(e);return c({requestId:e.requestId,cwd:e.cwd,sessionExplicit:e.session!==void 0,debug:e.debug,includeCost:e.cost,responseLevel:e.responseLevel,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform,...x(t),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function z(e){return e??`default`}const B={...re(),batch:ne(Le)};async function Le(e,t,r){let i=B[e];if(!i)throw Error(`Missing daemon writer for batch command: ${e}`);let a=E(e);if(!a)throw Error(`Missing command metadata for batch command: ${e}`);try{return await V(i,a,a.readInput(t))}catch(t){let i=t instanceof Error?t.message:String(t);throw new n(`INVALID_ARGS`,`Batch step ${r} ${e} input is invalid: ${i}`,void 0,t)}}async function Re(e,t){let n=B[e];if(!n)throw Error(`Missing daemon writer for command: ${e}`);return await V(n,E(e),t)}async function V(e,t,n){let r=await e(n);return{...r,...t?{metadataFlags:ee(t,r.options)}:{}}}async function H(e,t={}){let n=e.meta?.requestId??se(),r=!!(e.meta?.debug||e.flags?.verbose),i=e.flags,{daemonAuthToken:a,...o}=i??{},s=i?{...e,flags:o}:e,c=ge(s,t.authToken??a),l=oe(ae(s.command),s),u=await T(`daemon_startup`,async()=>await de(c),{requestId:n,session:e.session}),d=u.info,f=await fe(s,d);Ke(s.command);let p=ze(s,f,d.token,n,r);return ce({level:`info`,phase:`daemon_request_prepare`,data:{requestId:n,command:s.command,session:s.session}}),await Ue(s,u,c,async()=>Ge(We(await T(`daemon_request`,async()=>await ue(d,p,c.transportPreference,c.paths,l,t.onProgress?{onProgress:t.onProgress}:void 0),{requestId:n,command:e.command}),c),s,c))}function ze(e,t,n,r,i){return{...e,positionals:t.positionals,flags:t.flags,token:n,meta:Be(e,t,r,i)}}function Be(e,t,n,r){let i=e.meta??{};return{...i,requestId:n,debug:r,...Ve(i,e.flags),...He(t)}}function Ve(e,t){return{includeCost:e.includeCost,cwd:e.cwd,sessionExplicit:e.sessionExplicit,tenantId:e.tenantId??t?.tenant,runId:e.runId??t?.runId,leaseId:e.leaseId??t?.leaseId,sessionIsolation:e.sessionIsolation??t?.sessionIsolation,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform}}function He(e){return{...e.uploadedArtifactId?{uploadedArtifactId:e.uploadedArtifactId}:{},...e.clientArtifactPaths?{clientArtifactPaths:e.clientArtifactPaths}:{},...e.installSource?{installSource:e.installSource}:{}}}async function Ue(e,t,r,i){let a,o=!1,s;try{a=await i()}catch(e){o=!0,s=e}let c=await he(e,t,r,a);if(o)throw s;if(!c)throw new n(`COMMAND_FAILED`,`Daemon request produced no response after cleanup`);return c}function We(e,t){return e.ok||!t.ownedStateDir||!me(e)?e:pe(e,t.paths.baseDir)}function Ge(e,t,n){return!e.ok||!le(t,e)?e:_e(e,n.ownedStateDir?n.paths.baseDir:void 0)}function Ke(e){!qe(e)||process.stderr.isTTY!==!0||process.env.CI||process.stderr.write(e===C.reinstall?`Reinstalling...
2
2
  `:`Installing...
3
- `)}function hi(e){return e===C.install||e===C.reinstall||e===w.installSource}function X(e,t){return O.join(e,`metro-sessions`,`${ve(t)}.json`)}function gi(e){let t=X(e.stateDir,e.session);k.mkdirSync(O.dirname(t),{recursive:!0}),k.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function _i(e){let t=X(e.stateDir,e.session),n;try{n=k.readFileSync(t,`utf8`)}catch{return}let r;try{r=JSON.parse(n)}catch{return}if(!r||typeof r!=`object`||Array.isArray(r))return;let i=r,a={};return typeof i.metroHost==`string`&&i.metroHost&&(a.metroHost=i.metroHost),typeof i.metroPort==`number`&&Number.isInteger(i.metroPort)&&(a.metroPort=i.metroPort),typeof i.bundleUrl==`string`&&i.bundleUrl&&(a.bundleUrl=i.bundleUrl),Object.keys(a).length>0?a:void 0}function vi(e){k.rmSync(X(e.stateDir,e.session),{force:!0})}var yi=e({createAgentDeviceClient:()=>bi});function bi(e={},t={}){let n=t.transport??oi,r=t=>a(t.responseLevel??e.responseLevel),s=async(t,r=[],i={},a,s)=>{let c=Q(e,i),l={session:N(c.session),command:t,positionals:r,...s?{input:s}:{},flags:Me(c,a),runtime:c.runtime,meta:ft(c)},u=await n(l,{authToken:c.daemonAuthToken});return u.ok||o(u.error),u.data??{}},c=async(e={})=>{let t=await s(w.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(tt)},l=async(e,t={})=>{let n=await ht(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},u=(t={})=>N(Q(e,t).session);return{command:{wait:async e=>await l(`wait`,e),alert:async(e={})=>await l(`alert`,e),...ji(l),reactNative:async e=>await l(`react-native`,e),doctor:async(e={})=>await l(`doctor`,e),prepare:async e=>await l(`prepare`,e),viewport:async e=>await l(`viewport`,e)},devices:{list:async(e={})=>{let t=await l(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(et)},capabilities:async(e={})=>{let t=await l(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:et(t.device),availableCommands:n}},boot:async(e={})=>await l(`boot`,e),shutdown:async(e={})=>await l(`shutdown`,e)},sessions:{list:async(e={})=>await c(e),stateDir:async(t={})=>v(Q(e,t).stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,close:async(t={})=>{let n=u(t);try{let e=await l(`close`,t);return{session:n,shutdown:st(e.shutdown),provider:Z(e.provider),savedScript:f(e,`savedScript`),identifiers:{session:n}}}finally{Ii(e,t)}},saveScript:async(e={})=>{let t=await s(w.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),n=t.actionCount;if(typeof n!=`number`||!Number.isInteger(n)||n<0)throw new i(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let r=h(t,`session`);return{session:r,savedScript:h(t,`savedScript`),actionCount:n,identifiers:{session:r}}},artifacts:async(e={})=>await l(`artifacts`,e)},apps:{install:async e=>Ze(await l(`install`,e),u(e)),reinstall:async e=>Ze(await l(`reinstall`,e),u(e)),installFromSource:async e=>Qe(await l(`install-from-source`,e),u(e)),list:async(e={})=>{let t=await l(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=u(t),r=await l(`open`,t);Fi({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=at(r),a=f(r,`appBundleId`),o=a,s=Array.isArray(r.warnings)?r.warnings.filter(e=>typeof e==`string`):[];return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:f(r,`sessionStateDir`),runnerLogPath:f(r,`runnerLogPath`),requestLogPath:f(r,`requestLogPath`),eventLogPath:f(r,`eventLogPath`),appName:f(r,`appName`),appBundleId:a,appId:o,startup:ot(r.startup),runtime:it(r.runtime),device:i,...ut(r),identifiers:{session:n,deviceId:i?.id,deviceName:i?.name,udid:i?.ios?.udid,serial:i?.android?.serial,appId:o,appBundleId:a}}},close:async(e={})=>{let t=u(e),n=await l(`close`,e);return{session:t,closedApp:e.app,shutdown:st(n.shutdown),savedScript:f(n,`savedScript`),identifiers:{session:t}}},push:async e=>await l(`push`,e),triggerEvent:async e=>await l(`trigger-app-event`,e)},materializations:{release:async e=>$e(await s(w.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:{allocate:async e=>Li(await s(w.leaseAllocate,[],{...e,leaseId:void 0})),heartbeat:async e=>Li(await s(w.leaseHeartbeat,[],e)),release:async e=>{let t=await s(w.leaseRelease,[],e);return{released:t.released===!0,provider:Z(t.provider)}}},metro:{prepare:async t=>{let n=await Ge({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath});return Mi(e,n),n},reload:async(t={})=>await We({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??Ni(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=u(e),n=await l(`snapshot`,e);return r(e)?n:ki(n,t)},screenshot:async(e={})=>{let t=u(e),n=await l(`screenshot`,e);if(r(e))return n;let i=Ce(n);return{path:h(n,`path`),width:i?.width,height:i?.height,logicalWidth:i?.logicalWidth,logicalHeight:i?.logicalHeight,pixelDensity:i?.pixelDensity,overlayRefs:i?.overlayRefs,identifiers:{session:t}}},diff:async e=>await l(`diff`,e)},interactions:{click:async e=>await l(`click`,e),press:async e=>await l(`press`,e),longPress:async e=>await l(`longpress`,e),hover:async e=>await l(`hover`,e),swipe:async e=>await l(`swipe`,e),pan:async e=>await l(`gesture`,xi(e)),drag:async e=>await l(`gesture`,Si(e)),fling:async e=>await l(`gesture`,Ci(e)),swipeGesture:async e=>await l(`gesture`,wi(e)),focus:async e=>await l(`focus`,e),type:async e=>await l(`type`,e),fill:async e=>await l(`fill`,e),scroll:async e=>await l(`scroll`,e),pinch:async e=>await l(`gesture`,Ti(e)),rotateGesture:async e=>await l(`gesture`,Ei(e)),transformGesture:async e=>await l(`gesture`,Di(e)),get:async e=>await l(`get`,e),is:async e=>await l(`is`,e),find:async e=>await l(`find`,e)},replay:{run:async e=>await l(`replay`,e),test:async e=>await l(`test`,e)},batch:{run:async e=>await l(`batch`,e)},observability:{perf:async(e={})=>await l(`perf`,e),logs:async(e={})=>await l(`logs`,e),events:async(e={})=>await l(`events`,e),network:async(e={})=>await l(`network`,e),audio:async(e={})=>await l(`audio`,e)},debug:{symbols:async t=>{let{symbolicateCrashArtifact:n}=await import(`./debug-symbols.js`);return n({cwd:t.cwd??e.cwd,...t})}},recording:{record:async e=>await l(`record`,e),trace:async e=>await l(`trace`,e)},settings:{update:async e=>await l(`settings`,e)}}}function xi(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`pan`,origin:{x:t,y:n},delta:{x:r,y:i}}}function Si(e){return{...e,kind:`drag`}}function Ci(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function wi(e){return{...e,kind:`swipe`}}function Ti(e){let{x:t,y:n,...r}=e;return Oi(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function Ei(e){let{x:t,y:n,...r}=e;return Oi(t,n,`rotate`),{...r,kind:`rotate`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function Di(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`transform`,origin:{x:t,y:n},delta:{x:r,y:i}}}function Oi(e,t,n){if(e===void 0!=(t===void 0))throw new i(`INVALID_ARGS`,`gesture ${n} center requires both x and y`)}function ki(e,t){let n=f(e,`appBundleId`);return{nodes:dt(e.nodes),truncated:e.truncated===!0,appName:f(e,`appName`),appBundleId:n,...Ai(e),identifiers:{session:t,appId:n,appBundleId:n}}}function Ai(e){let t=Z(e.visibility),n=Z(e.unchanged),r=c(e.snapshotDiagnostics);return{...t?{visibility:t}:{},...s(e),...n?{unchanged:n}:{},...r?{snapshotDiagnostics:r}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function ji(e){let t={};for(let[n,r]of Object.entries(ke.clientCommandMethods??{}))t[n]=async(t={})=>await e(r,t);let n=t.orientation;if(!n)throw Error(`orientation client method missing from the system command family`);return t.rotate=async(e={})=>({...await n(e),action:`rotate`}),t}function Z(e){return g(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:v(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:N(n.session)}}function Mi(e,t){try{let n=new URL(t.statusUrl),r=Number.parseInt(n.port,10);if(!n.hostname||!Number.isInteger(r))return;let i=t.bridge?void 0:t.iosRuntime.bundleUrl??t.androidRuntime.bundleUrl;gi({...$(e),hints:{metroHost:n.hostname,metroPort:r,bundleUrl:i}})}catch{}}function Ni(e){try{return _i($(e))}catch{return}}function Pi(e){if(!e)return;let{metroHost:t,metroPort:n,bundleUrl:r}=e;if(!(t===void 0&&n===void 0&&r===void 0))return{metroHost:t,metroPort:n,bundleUrl:r}}function Fi(e){try{let t=$(e.config,e.options),n=Pi(e.runtime);if(n){gi({...t,hints:n});return}e.sessionReused||vi(t)}catch{}}function Ii(e,t){try{vi($(e,t))}catch{}}function Li(e){let t=e.lease;if(!g(t))throw Error(`Invalid lease response from daemon`);return{leaseId:h(t,`leaseId`),tenantId:h(t,`tenantId`),runId:h(t,`runId`),backend:h(t,`backend`),leaseProvider:f(t,`leaseProvider`),clientId:f(t,`clientId`),deviceKey:f(t,`deviceKey`),createdAt:typeof t.createdAt==`number`?t.createdAt:void 0,heartbeatAt:typeof t.heartbeatAt==`number`?t.heartbeatAt:void 0,expiresAt:typeof t.expiresAt==`number`?t.expiresAt:void 0}}export{kr as a,Fr as i,bi as n,oi as r,yi as t};
3
+ `)}function qe(e){return e===C.install||e===C.reinstall||e===w.installSource}function U(e,t){return O.join(e,`metro-sessions`,`${ve(t)}.json`)}function W(e){let t=U(e.stateDir,e.session);k.mkdirSync(O.dirname(t),{recursive:!0}),k.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function Je(e){let t=U(e.stateDir,e.session),n;try{n=k.readFileSync(t,`utf8`)}catch{return}let r;try{r=JSON.parse(n)}catch{return}if(!r||typeof r!=`object`||Array.isArray(r))return;let i=r,a={};return typeof i.metroHost==`string`&&i.metroHost&&(a.metroHost=i.metroHost),typeof i.metroPort==`number`&&Number.isInteger(i.metroPort)&&(a.metroPort=i.metroPort),typeof i.bundleUrl==`string`&&i.bundleUrl&&(a.bundleUrl=i.bundleUrl),Object.keys(a).length>0?a:void 0}function G(e){k.rmSync(U(e.stateDir,e.session),{force:!0})}function Ye(e){let t=async(t,n)=>await e(w.humanControl,t,n);return{allocate:async t=>q(await e(w.leaseAllocate,[],{...t,leaseId:void 0})),heartbeat:async t=>q(await e(w.leaseHeartbeat,[],t)),release:async t=>{let n=await e(w.leaseRelease,[],t);return{released:n.released===!0,provider:f(n.provider)?n.provider:void 0}},humanControl:{list:async e=>{let r=await t([`list`],e);if(!Array.isArray(r.holds))throw new n(`COMMAND_FAILED`,`Daemon did not return human-control holds.`);return r.holds.map(K)},put:async(e,n={},r)=>K((await t([`put`,e,JSON.stringify(n)],r)).hold),remove:async(e,n)=>(await t([`remove`,e],n)).released===!0}}}function K(e){if(!f(e)||!f(e.scope)||e.state!==`active`&&e.state!==`activating`||typeof e.createdAt!=`number`||typeof e.updatedAt!=`number`)throw new n(`COMMAND_FAILED`,`Daemon returned an invalid human-control hold.`);return{id:u(e,`id`),scope:{backend:u(e.scope,`backend`),leaseProvider:h(e.scope,`leaseProvider`),deviceKey:u(e.scope,`deviceKey`)},state:e.state,reason:h(e,`reason`),createdAt:e.createdAt,updatedAt:e.updatedAt,...typeof e.expiresAt==`number`?{expiresAt:e.expiresAt}:{}}}function q(e){let t=e.lease;if(!f(t))throw Error(`Invalid lease response from daemon`);return{leaseId:u(t,`leaseId`),tenantId:u(t,`tenantId`),runId:u(t,`runId`),backend:u(t,`backend`),leaseProvider:h(t,`leaseProvider`),clientId:h(t,`clientId`),deviceKey:h(t,`deviceKey`),createdAt:typeof t.createdAt==`number`?t.createdAt:void 0,heartbeatAt:typeof t.heartbeatAt==`number`?t.heartbeatAt:void 0,expiresAt:typeof t.expiresAt==`number`?t.expiresAt:void 0}}var Xe=e({createAgentDeviceClient:()=>J});function J(e={},t={}){let a=t.transport??H,o=t=>i(t.responseLevel??e.responseLevel),s=async(t,n=[],i={},o,s)=>{let c=Q(e,i),l={session:z(c.session),command:t,positionals:n,...s?{input:s}:{},flags:te(c,o),runtime:c.runtime,meta:Ie(c)},u=await a(l,{authToken:c.daemonAuthToken});return u.ok||r(u.error),u.data??{}},c=async(e={})=>{let t=await s(w.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(Te)},l=async(e,t={})=>{let n=await Re(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},d=(t={})=>z(Q(e,t).session);return{command:{wait:async e=>await l(`wait`,e),alert:async(e={})=>await l(`alert`,e),appState:async(e={})=>await l(`appstate`,e),back:async(e={})=>await l(`back`,e),home:async(e={})=>await l(`home`,e),orientation:async e=>await l(`orientation`,e),appSwitcher:async(e={})=>await l(`app-switcher`,e),keyboard:async(e={})=>await l(`keyboard`,e),clipboard:async e=>await l(`clipboard`,e),tvRemote:async e=>await l(`tv-remote`,e),reactNative:async e=>await l(`react-native`,e),doctor:async(e={})=>await l(`doctor`,e),prepare:async e=>await l(`prepare`,e),viewport:async e=>await l(`viewport`,e)},devices:{list:async(e={})=>{let t=await l(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(N)},capabilities:async(e={})=>{let t=await l(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:N(t.device),availableCommands:n}},boot:async(e={})=>await l(`boot`,e),shutdown:async(e={})=>await l(`shutdown`,e)},sessions:{list:async(e={})=>await c(e),stateDir:async(t={})=>{let n=Q(e,t);return D(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir},close:async(t={})=>{let n=d(t);try{let e=await l(`close`,t);return{session:n,shutdown:L(e.shutdown),provider:Z(e.provider),savedScript:h(e,`savedScript`),identifiers:{session:n}}}finally{lt(e,t)}},saveScript:async(e={})=>{let t=await s(w.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),r=t.actionCount;if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw new n(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let i=u(t,`session`);return{session:i,savedScript:u(t,`savedScript`),actionCount:r,identifiers:{session:i}}},artifacts:async(e={})=>await l(`artifacts`,e)},apps:{install:async e=>M(await l(`install`,e),d(e)),reinstall:async e=>M(await l(`reinstall`,e),d(e)),installFromSource:async e=>Se(await l(`install-from-source`,e),d(e)),list:async(e={})=>{let t=await l(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=d(t),r=await l(`open`,t);ct({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=De(r),a=h(r,`appBundleId`),o=a,s=Array.isArray(r.warnings)?r.warnings.filter(e=>typeof e==`string`):[];return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:h(r,`sessionStateDir`),runnerLogPath:h(r,`runnerLogPath`),requestLogPath:h(r,`requestLogPath`),eventLogPath:h(r,`eventLogPath`),appName:h(r,`appName`),appBundleId:a,appId:o,selection:Ae(r.selection),startup:je(r.startup),runtime:Ee(r.runtime),device:i,...Pe(r),identifiers:{session:n,deviceId:i?.id,deviceName:i?.name,udid:i?.ios?.udid,serial:i?.android?.serial,appId:o,appBundleId:a}}},close:async(e={})=>{let t=d(e),n=await l(`close`,e);return{session:t,closedApp:e.app,shutdown:L(n.shutdown),savedScript:h(n,`savedScript`),identifiers:{session:t}}},push:async e=>await l(`push`,e),triggerEvent:async e=>await l(`trigger-app-event`,e)},materializations:{release:async e=>Ce(await s(w.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:Ye(s),metro:{prepare:async t=>{let n=await be({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath});return at(e,n),n},reload:async(t={})=>await ye({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??ot(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=d(e),n=await l(`snapshot`,e);return o(e)?n:rt(n,t)},screenshot:async(e={})=>{let t=d(e),n=await l(`screenshot`,e);return o(e)?n:xe(n,t)},diff:async e=>await l(`diff`,e)},interactions:{click:async e=>await l(`click`,e),press:async e=>await l(`press`,e),longPress:async e=>await l(`longpress`,e),hover:async e=>await l(`hover`,e),swipe:async e=>await l(`swipe`,e),pan:async e=>await l(`gesture`,Ze(e)),drag:async e=>await l(`gesture`,Qe(e)),fling:async e=>await l(`gesture`,Y(e)),swipeGesture:async e=>await l(`gesture`,$e(e)),focus:async e=>await l(`focus`,e),type:async e=>await l(`type`,e),fill:async e=>await l(`fill`,e),scroll:async e=>await l(`scroll`,e),pinch:async e=>await l(`gesture`,et(e)),rotateGesture:async e=>await l(`gesture`,tt(e)),transformGesture:async e=>await l(`gesture`,nt(e)),get:async e=>await l(`get`,e),is:async e=>await l(`is`,e),find:async e=>await l(`find`,e)},replay:{run:async e=>await l(`replay`,e),test:async e=>await l(`test`,e)},batch:{run:async e=>await l(`batch`,e)},observability:{perf:async e=>await l(`perf`,e),logs:async(e={})=>await l(`logs`,e),events:async(e={})=>await l(`events`,e),network:async(e={})=>await l(`network`,e),audio:async(e={})=>await l(`audio`,e)},debug:{symbols:async t=>{let{symbolicateCrashArtifact:n}=await import(`./debug-symbols-facade.js`);return n({cwd:t.cwd??e.cwd,...t})}},recording:{record:async e=>await l(`record`,e),trace:async e=>await l(`trace`,e)},settings:{update:async e=>await l(`settings`,e)}}}function Ze(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`pan`,origin:{x:t,y:n},delta:{x:r,y:i}}}function Qe(e){return{...e,kind:`drag`}}function Y(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function $e(e){return{...e,kind:`swipe`}}function et(e){let{x:t,y:n,...r}=e;return X(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function tt(e){let{x:t,y:n,...r}=e;return X(t,n,`rotate`),{...r,kind:`rotate`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function nt(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`transform`,origin:{x:t,y:n},delta:{x:r,y:i}}}function X(e,t,r){if(e===void 0!=(t===void 0))throw new n(`INVALID_ARGS`,`gesture ${r} center requires both x and y`)}function rt(e,t){let n=h(e,`appBundleId`);return{nodes:Fe(e.nodes),...typeof e.truncated==`boolean`?{truncated:e.truncated}:{},appName:h(e,`appName`),appBundleId:n,...it(e),identifiers:{session:t,appId:n,appBundleId:n}}}function it(e){let t=Z(e.visibility),n=Z(e.unchanged),r=_(e.snapshotDiagnostics);return{...t?{visibility:t}:{},...o(e),...n?{unchanged:n}:{},...r?{snapshotDiagnostics:r}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function Z(e){return f(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:D(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:z(n.session)}}function at(e,t){try{let n=new URL(t.statusUrl),r=Number.parseInt(n.port,10);if(!n.hostname||!Number.isInteger(r))return;let i=t.bridge?void 0:t.iosRuntime.bundleUrl??t.androidRuntime.bundleUrl;W({...$(e),hints:{metroHost:n.hostname,metroPort:r,bundleUrl:i}})}catch{}}function ot(e){try{return Je($(e))}catch{return}}function st(e){if(!e)return;let{metroHost:t,metroPort:n,bundleUrl:r}=e;if(t!==void 0||n!==void 0||r!==void 0)return{metroHost:t,metroPort:n,bundleUrl:r}}function ct(e){try{let t=$(e.config,e.options),n=st(e.runtime);if(n){W({...t,hints:n});return}e.sessionReused||G(t)}catch{}}function lt(e,t){try{G($(e,t))}catch{}}export{J as n,H as r,Xe as t};
@@ -1,10 +1,10 @@
1
- import { H as PlatformSelector } from "./sdk-contracts.js";
1
+ import { L as PlatformSelector } from "./sdk-contracts.js";
2
2
  import { t as AgentDeviceClient } from "./client-types.js";
3
3
  import { ToolApprovalStatus, ToolSet } from "ai";
4
4
  //#region src/ai-sdk/index.d.ts
5
5
  /**
6
6
  * `'core'` — the curated perceive/act loop (see the `frameworkTier` pinning
7
- * test in `src/core/command-descriptor/__tests__/parity.test.ts`). `'all'`
7
+ * test in `src/__tests__/command-descriptor-parity.test.ts`). `'all'`
8
8
  * exposes every MCP-exposed command, same set the MCP server surfaces.
9
9
  */
10
10
  type AgentDeviceToolSet = 'core' | 'all';
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{y as t}from"./sdk-batch-runner.js";import{n}from"./agent-device-client.js";import{i as r,n as i,r as a}from"./command-tools.js";const o=[`session`,`stateDir`,`mcpOutputFormat`,`includeCost`,`responseLevel`];async function s(s){let{jsonSchema:d,tool:f}=await c(),{session:p,platform:m,set:h=`core`,approval:g}=s,_=n({session:p,...m?{lockPlatform:m}:{}}),v=i(),y=new Set(o);m&&y.add(`platform`);let b={};for(let n of a())h===`core`&&t(n.name)!==`core`||(b[n.name]=f({description:n.description,inputSchema:d(l(n.inputSchema,y)),...n.outputSchema?{outputSchema:d(n.outputSchema)}:{},execute:async t=>{let i={...u(t,y),session:p,...m?{platform:m}:{}},a=await v.execute(n.name,i);if(a.isError){let t=a.structuredContent;throw new e(t.code,r(t),t.details)}return a.structuredContent??{}}}));return{tools:b,client:_,...g?{toolApproval:g}:{}}}async function c(){try{return await import(`ai`)}catch(t){throw new e(`MISSING_PEER_DEPENDENCY`,"createAgentDeviceTools() requires the optional peer dependency 'ai'. Install it with `pnpm add ai` (or npm/yarn equivalent).",void 0,t)}}function l(e,t){if(!e.properties)return e;let n=e.required?.filter(e=>!t.has(e));return{...e,properties:u(e.properties,t),...n?{required:n}:{}}}function u(e,t){let n={};for(let[r,i]of Object.entries(e))t.has(r)||(n[r]=i);return n}export{s as createAgentDeviceTools};
1
+ import{C as e}from"./sdk-contracts.js";import{n as t}from"./agent-device-client.js";import{y as n}from"./sdk-batch.js";import{i as r,n as i,o as a,r as o}from"./command-tools.js";const s=[`session`,...a];async function c(a){let{jsonSchema:c,tool:f}=await l(),{session:p,platform:m,set:h=`core`,approval:g}=a,_=t({session:p,...m?{lockPlatform:m}:{}}),v=i(),y=new Set(s);m&&y.add(`platform`);let b={};for(let t of o())(h!==`core`||n(t.name)===`core`)&&(b[t.name]=f({description:t.description,inputSchema:c(u(t.inputSchema,y)),...t.outputSchema?{outputSchema:c(t.outputSchema)}:{},execute:async n=>{let i={...d(n,y),session:p,...m?{platform:m}:{}},a=await v.execute(t.name,i);if(a.isError){let t=a.structuredContent,n=r(t);throw new e(t.code,n,t.details)}return a.structuredContent??{}}}));return{tools:b,client:_,...g?{toolApproval:g}:{}}}async function l(){try{return await import(`ai`)}catch(t){throw new e(`MISSING_PEER_DEPENDENCY`,"createAgentDeviceTools() requires the optional peer dependency 'ai'. Install it with `pnpm add ai` (or npm/yarn equivalent).",void 0,t)}}function u(e,t){if(!e.properties)return e;let n=e.required?.filter(e=>!t.has(e));return{...e,properties:d(e.properties,t),...n?{required:n}:{}}}function d(e,t){let n={};for(let[r,i]of Object.entries(e))t.has(r)||(n[r]=i);return n}export{c as createAgentDeviceTools};
@@ -0,0 +1 @@
1
+ const e=1e4,t=2e3,n=`ALERT_NOT_FOUND`,r=`alert-not-found`,i=[`get`,`accept`,`dismiss`,`wait`];export{e as a,n as i,t as n,r,i as t};
@@ -0,0 +1 @@
1
+ import{C as e}from"./sdk-contracts.js";import{Zt as t}from"./sdk-batch.js";import{a as n,o as r}from"./touch-runtime.js";function i(e){return Object.freeze({captureScreenshot:e.capture})}function a(e,t){return Object.freeze({captureScreenshot:async n=>{await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).screenshot(n.outPath,n.options)}})}function o(e){return a(e.signal,n(e))}function s(e){return a(e.signal,r({...e,operation:`screenshot`}))}function c(e,t){return t.signal===void 0?e:AbortSignal.any([e,t.signal])}function l(e){return Object.freeze({captureSnapshot:e.capture,captureSnapshotWithCustomActions:e.customActions,captureSnapshotWithoutActiveApp:e.withoutActiveApp})}function u(t){let n=async n=>{let r=c(t.signal,n),i={...n.execution,appBundleId:n.options?.appBundleId,signal:r},a=t.ownership===`local`?await t.resolveInteractor(t.device,i):t.resolveInteractor(i);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`Provider-owned snapshot operation has no bound provider interactor.`,{reason:`provider-runtime-interactor-missing`,deviceId:t.device.id});let o=await a.snapshot({...n.options,signal:r});if(!p(o))return o;if(!t.presentIosAcquisition)throw new e(`COMMAND_FAILED`,`Acquired iOS snapshot has no host presentation owner.`,{reason:`ios-snapshot-presenter-missing`,deviceId:t.device.id});return await t.presentIosAcquisition(o,n.options)};return Object.freeze({captureSnapshot:n,captureSnapshotWithCustomActions:n,captureSnapshotWithoutActiveApp:n})}function d(e){return u({...e,ownership:`local`})}function f(e){return u({...e,ownership:`provider`})}function p(e){return`stage`in e&&e.stage===`acquired`}function m(e){return Object.freeze({findText:e.findText})}function h(e){return Object.freeze({setViewport:e.setViewport})}function g(e){return Object.freeze({focusPoint:e.focus})}function _(e,t){return Object.freeze({focusPoint:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).focus(n.point.x,n.point.y)}})}function v(e){return _(e.signal,n(e))}function y(e){return _(e.signal,r({...e,operation:`focus`}))}function b(e){let t=t=>t??e.unsupported;return Object.freeze({performGesturePlan:t(e.plan),performDirectionalFlingPlan:t(e.directionalFling),performMultiTouchGesturePlan:t(e.multiTouch),performTargetAuthoredDrag:t(e.targetAuthoredDrag),gestureViewport:t(e.viewport)})}function x(e,n,r){let i=async e=>{let i=await S(n,r,e);if(typeof i.performGesture!=`function`)throw t(`Runtime owner advertised gesture execution without an interactor implementation`);return await i.performGesture(e.plan)};return Object.freeze({...e.performGesturePlan.available?{performGesturePlan:i}:{},...e.performDirectionalFlingPlan.available?{performDirectionalFlingPlan:i}:{},...e.performMultiTouchGesturePlan.available?{performMultiTouchGesturePlan:i}:{},...e.performTargetAuthoredDrag.available?{performTargetAuthoredDrag:i}:{},...e.gestureViewport.available?{gestureViewport:async e=>{let i=await S(n,r,e);if(typeof i.gestureViewport!=`function`)throw t(`Runtime owner advertised gestureViewport without an interactor implementation`);return await i.gestureViewport()}}:{}})}async function S(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}function C(e){return x(e.facts,e.signal,n(e))}function w(e){return x(e.facts,e.signal,r({...e,operation:`gesture`}))}function T(e){return Object.freeze({scrollDirection:e.scroll})}function E(e,t){return Object.freeze({scrollDirection:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.target?.appBundleId,signal:e})).scroll(n.direction,n.options))})}function D(e){return E(e.signal,n(e))}function O(e){return E(e.signal,r({...e,operation:`scroll`}))}function k(e){return Object.freeze({typeText:e.type})}function A(e,t){return Object.freeze({typeText:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).type(n.text,n.delayMs))})}function j(e){return A(e.signal,n(e))}function M(e){return A(e.signal,r({...e,operation:`type`}))}function N(e){return typeof e!=`string`||e.trim().length===0?Object.freeze({status:`unreadable`,reason:`no-text-at-point`}):Object.freeze({status:`read`,text:e})}function P(e){return Object.freeze({readTextAtPoint:e.readTextAtPoint})}function F(e){return Object.freeze({readTextAtPoint:async n=>{let r=e.signal;r.throwIfAborted();let i=await e.resolveInteractor(e.device,{...n.execution,appBundleId:n.options?.appBundleId,signal:r});if(typeof i.readTextAtPoint!=`function`)throw t(`Runtime owner advertised readTextAtPoint without an interactor implementation`);return N(await i.readTextAtPoint(n.point,{appBundleId:n.options?.appBundleId,surface:n.options?.surface,signal:r}))}})}function I(e){return Object.freeze({back:e.back})}function ee(e,t){return Object.freeze({back:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).back(n.mode)}})}function L(e){return Object.freeze({home:e.home})}function R(e,t){return Object.freeze({home:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).home()}})}function z(e){return Object.freeze({setOrientation:e.orientation})}function B(e,t){return Object.freeze({setOrientation:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).setOrientation(n.rotation))})}function V(e){return Object.freeze({tvRemote:e.tvRemote})}function H(e,t){return Object.freeze({tvRemote:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).tvRemote(n.button,n.durationMs)}})}function U(e){let t=t=>t??e.unsupported;return Object.freeze({keyboardStatus:t(e.status),keyboardDismiss:t(e.dismiss),keyboardEnter:t(e.enter)})}function W(t,n){if(t)return t;throw new e(`COMMAND_FAILED`,`${n} was admitted but its bound interactor has no implementation.`,{reason:`interactor-method-missing`})}async function G(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}const K={keyboardStatus:`keyboard status`,keyboardDismiss:`keyboard dismiss`,keyboardEnter:`keyboard enter`};function q(e,t,n){let r=async r=>{let i=await G(t,n,r);return await W(i[e],K[e]).call(i)};return Object.freeze({[e]:r})}function J(e){let t=t=>t??e.unsupported;return Object.freeze({readClipboard:t(e.read),writeClipboard:t(e.write)})}async function Y(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}function X(e,t){return Object.freeze({readClipboard:async n=>await(await Y(e,t,n)).readClipboard()})}function Z(e,t){return Object.freeze({writeClipboard:async n=>{await(await Y(e,t,n)).writeClipboard(n.text)}})}function Q(e){return Object.freeze({appSwitcher:e.appSwitcher})}function $(e,t){return Object.freeze({appSwitcher:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).appSwitcher()}})}function te(e){return Object.freeze({triggerAppEvent:e.triggerAppEvent})}function ne(e,t){return Object.freeze({triggerAppEvent:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).open(n.eventUrl,{appBundleId:n.options?.appBundleId})}})}function re(e){return Object.freeze({setSetting:e.setSetting})}function ie(e,t){return Object.freeze({setSetting:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.appBundleId,signal:e})).setSetting(n.setting,n.state,n.appBundleId,n.options))})}function ae(e){return Object.freeze({readAlert:e.read,awaitAlert:e.wait,acceptAlert:e.accept,dismissAlert:e.dismiss})}async function oe(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.appBundleId,signal:e})}function se(e){return{...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs},...e.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...e.surface===void 0?{}:{surface:e.surface}}}function ce(e,t,n){return Object.freeze({[e]:async r=>await(await oe(t,n,r))[e](se(r))})}export{T as A,f as B,F as C,k as D,M as E,y as F,i as G,l as H,g as I,h as L,w as M,b as N,D as O,v as P,m as R,ee as S,j as T,o as U,c as V,s as W,B as _,te as a,L as b,$ as c,J as d,K as f,V as g,H as h,re as i,C as j,O as k,X as l,U as m,ce as n,ne as o,q as p,ie as r,Q as s,ae as t,Z as u,z as v,P as w,I as x,R as y,d as z};
@@ -1,27 +1,29 @@
1
1
  import { t as AppsFilter } from "./app-inventory.js";
2
- import { a as createAndroidPortReverseManager, i as AndroidPortReverseEndpoint, n as AndroidAdbExecutorOptions, r as AndroidAdbProvider, t as AndroidAdbExecutor } from "./sdk-android-adb.js";
3
- import { a as readAndroidClipboardWithAdb, i as getAndroidKeyboardStatusWithAdb, n as AndroidKeyboardState, o as writeAndroidClipboardWithAdb, r as dismissAndroidKeyboardWithAdb, t as AndroidKeyboardDismissResult } from "./device-input-state.js";
4
- //#region packages/contracts/src/app-state-runtime.d.ts
5
- /** Neutral foreground identity returned by a selected platform/provider runtime. */
6
- type AppStateRuntimeResult = Readonly<{
7
- package?: string;
8
- activity?: string;
9
- }>;
2
+ import { a as readAndroidClipboardWithAdb, c as AndroidAdbExecutor, d as AndroidPortReverseEndpoint, f as AndroidPortReverseProvider, i as getAndroidKeyboardStatusWithAdb, l as AndroidAdbExecutorOptions, n as AndroidKeyboardState, o as writeAndroidClipboardWithAdb, r as dismissAndroidKeyboardWithAdb, t as AndroidKeyboardDismissResult, u as AndroidAdbProvider } from "./device-input-state.js";
3
+ //#region packages/platform-android/src/adb-port-reverse.d.ts
4
+ declare function createAndroidPortReverseManager(provider: AndroidAdbProvider | AndroidAdbExecutor): AndroidPortReverseProvider;
10
5
  //#endregion
11
- //#region src/platforms/android/app-helpers.d.ts
6
+ //#region packages/platform-android/src/app-helpers.d.ts
12
7
  type AndroidAppListFilter = AppsFilter;
13
8
  type AndroidAppListTarget = 'mobile' | 'tv' | 'auto';
14
9
  type AndroidAppListOptions = {
15
10
  filter?: AndroidAppListFilter;
16
11
  target?: AndroidAppListTarget;
17
12
  };
18
- declare function listAndroidAppsWithAdb(adb: AndroidAdbExecutor, options?: AndroidAppListOptions): Promise<Array<{
13
+ declare function listAndroidAppsWithAdb$1(adb: AndroidAdbExecutor, options?: AndroidAppListOptions): Promise<Array<{
19
14
  package: string;
20
15
  name: string;
21
16
  }>>;
22
- declare function getAndroidAppStateWithAdb(adb: AndroidAdbExecutor): Promise<AppStateRuntimeResult>;
23
17
  //#endregion
24
- //#region src/platforms/android/app-control.d.ts
18
+ //#region packages/platform-android/src/logcat.d.ts
19
+ type AndroidLogcatCaptureOptions = {
20
+ lines?: number;
21
+ timeoutMs?: number;
22
+ signal?: AbortSignal;
23
+ };
24
+ declare function captureAndroidLogcatWithAdb$1(adb: AndroidAdbExecutor, options?: AndroidLogcatCaptureOptions): Promise<string>;
25
+ //#endregion
26
+ //#region packages/platform-android/src/app-control.d.ts
25
27
  type AndroidOpenAppWithAdbOptions = {
26
28
  activity?: string;
27
29
  category?: string;
@@ -29,12 +31,18 @@ type AndroidOpenAppWithAdbOptions = {
29
31
  declare function forceStopAndroidAppWithAdb(adb: AndroidAdbExecutor, packageName: string): Promise<void>;
30
32
  declare function openAndroidAppWithAdb(adb: AndroidAdbExecutor, packageName: string, options?: AndroidOpenAppWithAdbOptions): Promise<void>;
31
33
  //#endregion
32
- //#region src/platforms/android/logcat.d.ts
33
- type AndroidLogcatCaptureOptions = {
34
- lines?: number;
35
- timeoutMs?: number;
36
- signal?: AbortSignal;
37
- };
38
- declare function captureAndroidLogcatWithAdb(adb: AndroidAdbExecutor, options?: AndroidLogcatCaptureOptions): Promise<string>;
34
+ //#region packages/contracts/src/app-state-runtime.d.ts
35
+ /** Neutral foreground identity returned by a selected platform/provider runtime. */
36
+ type AppStateRuntimeResult = Readonly<{
37
+ package?: string;
38
+ activity?: string;
39
+ }>;
40
+ //#endregion
41
+ //#region packages/platform-android/src/mechanics.d.ts
42
+ declare function listAndroidAppsWithAdb(...args: Parameters<typeof listAndroidAppsWithAdb$1>): Promise<Awaited<ReturnType<typeof listAndroidAppsWithAdb$1>>>;
43
+ declare function captureAndroidLogcatWithAdb(...args: Parameters<typeof captureAndroidLogcatWithAdb$1>): Promise<Awaited<ReturnType<typeof captureAndroidLogcatWithAdb$1>>>;
44
+ //#endregion
45
+ //#region src/sdk/android-adb.d.ts
46
+ declare function getAndroidAppStateWithAdb(adb: AndroidAdbExecutor, signal?: AbortSignal): Promise<AppStateRuntimeResult>;
39
47
  //#endregion
40
48
  export { type AndroidAdbExecutor, type AndroidAdbExecutorOptions, type AndroidAdbProvider, type AndroidKeyboardDismissResult, type AndroidKeyboardState, type AndroidPortReverseEndpoint, captureAndroidLogcatWithAdb, createAndroidPortReverseManager, dismissAndroidKeyboardWithAdb, forceStopAndroidAppWithAdb, getAndroidAppStateWithAdb, getAndroidKeyboardStatusWithAdb, listAndroidAppsWithAdb, openAndroidAppWithAdb, readAndroidClipboardWithAdb, writeAndroidClipboardWithAdb };
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{r as t}from"./sdk-android-adb.js";import{a as n,c as r}from"./app-lifecycle.js";import{n as i,r as a}from"./app-helpers.js";import{t as o}from"./logcat.js";import{c as s,i as c,n as l,o as u}from"./device-input-state.js";const d=`android.intent.category.LAUNCHER`,f=`android.intent.category.DEFAULT`;async function p(e,t){await e([`shell`,`am`,`force-stop`,t])}async function m(e,t,n=[d]){for(let i of n){let n=await e([`shell`,`cmd`,`package`,`resolve-activity`,`--brief`,`-a`,`android.intent.action.MAIN`,`-c`,i,t],{allowFailure:!0});if(n.exitCode!==0)continue;let a=r(n.stdout);if(a)return a}return null}async function h(t,r,i={}){let a=i.category??d;if(i.activity){await t([`shell`,`am`,`start`,`-W`,`-a`,`android.intent.action.MAIN`,`-c`,f,`-c`,a,`-n`,g(r,i.activity)]);return}let o=await t([`shell`,`am`,`start`,`-W`,`-a`,`android.intent.action.MAIN`,`-c`,f,`-c`,a,`-p`,r],{allowFailure:!0});if(o.exitCode===0&&!n(o.stdout,o.stderr))return;let s=await m(t,r,[a]);if(!s)throw new e(`COMMAND_FAILED`,`Failed to resolve Android launch component for ${r}`,{stdout:o.stdout,stderr:o.stderr,exitCode:o.exitCode});await t([`shell`,`am`,`start`,`-W`,`-a`,`android.intent.action.MAIN`,`-c`,f,`-c`,a,`-n`,s])}function g(e,t){return t.includes(`/`)?t:`${e}/${t.startsWith(`.`)?t:`.${t}`}`}export{o as captureAndroidLogcatWithAdb,t as createAndroidPortReverseManager,l as dismissAndroidKeyboardWithAdb,p as forceStopAndroidAppWithAdb,i as getAndroidAppStateWithAdb,c as getAndroidKeyboardStatusWithAdb,a as listAndroidAppsWithAdb,h as openAndroidAppWithAdb,u as readAndroidClipboardWithAdb,s as writeAndroidClipboardWithAdb};
1
+ import"./platform-runtime-android-adb-host.js";import{d as e}from"./adb-executor.js";import{_ as t,d as n,h as r,n as i,p as a,t as o,v as s,y as c}from"./mechanics.js";async function l(e,t){let{getAndroidAppStateWithAdb:n}=await import(`./platform-runtime.js`).then(e=>e.a);return await n(e,t)}export{o as captureAndroidLogcatWithAdb,e as createAndroidPortReverseManager,n as dismissAndroidKeyboardWithAdb,s as forceStopAndroidAppWithAdb,l as getAndroidAppStateWithAdb,a as getAndroidKeyboardStatusWithAdb,i as listAndroidAppsWithAdb,c as openAndroidAppWithAdb,r as readAndroidClipboardWithAdb,t as writeAndroidClipboardWithAdb};
@@ -0,0 +1 @@
1
+ import{p as e}from"./sdk-contracts.js";import{Lr as t,Tr as n,jr as r}from"./sdk-batch.js";import{n as i,t as a}from"./rect-center.js";const o=new WeakMap;function s(e,t){return o.set(e,{...o.get(e),...t}),e}function c(e,t){return s(e,{clickability:t})}function l(e){return e?o.get(e)?.clickability:void 0}function u(e,t){let n=l(e);return n?c(t,n):t}function d(e,t){return s(e,{occlusionContext:t})}function f(e){return e?o.get(e)?.occlusionContext:void 0}const p=[`tabbar`,`toolbar`,`navigationbar`,`bottomnavigation`,`bottomnavigationview`,`sheet`,`dialog`,`alert`,`popover`,`menu`],m=[`tabbar`,`toolbar`,`navigationbar`],h=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`edittext`,`checkbox`,`radio`,`switch`,`cell`];function g(e,t={}){if(e.length<2)return e;let n=new Map(e.map(e=>[e.index,e])),r={nodes:e,byIndex:n,overlayPositions:e.flatMap((e,r)=>E(e,n,t)?[r]:[]),coverCache:new Map},i=[];for(let[n,a]of e.entries())T(a)&&b(r,n,a,t)&&i.push(n);return v(e,i)}function _(e,t){let n=[];for(let[r,i]of e.entries())T(i)&&t(i)&&n.push(r);return v(e,n)}function v(e,t){if(t.length===0)return e;let n=[...e];for(let r of t){let t=e[r];n[r]={...t,hittable:!1,interactionBlocked:`covered`,presentationHints:L(t.presentationHints)}}return n}function y(e){return e.interactionBlocked!==void 0}function b(t,n,r,i){let a=t.coverCache.get(n);if(a!==void 0)return a;t.coverCache.set(n,null);let o=I(r.rect);if(!o)return S(t,n,null);let s=e(o),c=i.isAdditionalOverlayNode?.(r)===!0;for(let e of t.overlayPositions){if(!x(t,e,n,c,i))continue;let a=t.nodes[e];if(C(t,e,r,o,s,i))return S(t,n,a)}return S(t,n,null)}function x(e,t,n,r,i){let a=e.nodes[t];return a?t>n?!0:t===n||r?!1:i.isAdditionalOverlayNode?.(a)===!0:!1}function S(e,t,n){return e.coverCache.set(t,n),n}function C(e,n,r,i,a,o){if(!e.nodes[n])return!1;let s=w(e,n,r,i,o);return!!(s&&t(s,a.x,a.y))}function w(e,t,n,r,i){let o=e.nodes[t];if(!o||!E(o,e.byIndex,i)||P(n,o,e.byIndex))return null;let s=I(o.rect);return!s||a(r,s)||b(e,t,o,i)?null:s}function T(e){return I(e.rect)?e.hittable===!0||j(e)?!0:!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()):!1}function E(e,t,r){return!I(e.rect)||n(e)||D(e,t)?!1:M(e,p)||O(e,t,r)}function D(e,t){if(!M(e,m))return!1;let r=I(e.rect);if(!r)return!1;let i=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,o=new Set;for(;i&&!o.has(i.index);){if(n(i)){let e=I(i.rect);return!!(e&&a(r,e))}o.add(i.index),i=typeof i.parentIndex==`number`?t.get(i.parentIndex):void 0}return!1}function O(e,t,n){return n.isAdditionalOverlayNode?.(e)===!0&&!k(e,t,n)}function k(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(A(r,n))return!0;i.add(r.index),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}function A(e,t){return t.isAdditionalOverlayNode?.(e)===!0&&I(e.rect)!==null&&!n(e)}function j(e){return M(e,h)}function M(e,t){let n=N(e);return t.some(e=>n.includes(e))}function N(e){return[e.type,e.role,e.subrole].map(e=>r(e??``)).join(` `)}function P(e,t,n){return F(e,t,n)||F(t,e,n)}function F(e,t,n){let r=typeof t.parentIndex==`number`?n.get(t.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(r.index===e.index)return!0;i.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}return!1}function I(e){let t=i(e);return t&&t.width>0&&t.height>0?t:null}function L(e){return Array.from(new Set([...e??[],`covered`]))}const R=new Set([`com.google.android.inputmethod.latin`,`com.samsung.android.honeyboard`,`com.touchtype.swiftkey`,`com.microsoft.swiftkey`]);function z(e){let t=J(e.packageName),n=(e.resourceId??``).toLowerCase(),r=J(e.activeInputMethodPackage);if(t&&r&&t===r)return{inputMethodOwned:!0,source:`active-input-method`};if(r&&n.startsWith(`${r}:id/`))return{inputMethodOwned:!0,source:`active-input-method-resource`};if(t&&R.has(t))return{inputMethodOwned:!0,source:`known-ime-package`};for(let e of R)if(n.startsWith(`${e}:id/`))return{inputMethodOwned:!0,source:`known-ime-resource`};return{inputMethodOwned:!1,source:`app`}}function B(e,t,n){return z({packageName:e,resourceId:t,activeInputMethodPackage:n}).inputMethodOwned}function V(e){return z(e).inputMethodOwned}function H(e){return V({packageName:e.bundleId,resourceId:e.identifier})}function U(e){let t=J(e);return!!(t&&R.has(t))}function W(e){let t=(e??``).toLowerCase();for(let e of R)if(t.startsWith(`${e}:id/`))return!0;return!1}function G(e,t,n){return!e&&!t?`unknown`:B(e,t,n)?`ime`:`app`}function K(e){for(let t of[/\bmCurMethodId=([^\s]+)/i,/\bmCurId=([^\s]+)/i,/\bmCurrentInputMethodId=([^\s]+)/i,/\bcurMethodId=([^\s]+)/i]){let n=q(e.match(t)?.[1]);if(n)return n}}function q(e){let t=(e??``).trim();if(t)return J((t.split(`/`)[0]??``).match(/[a-zA-Z0-9_.]+/)?.[0])}function J(e){return(e??``).trim().toLowerCase()||void 0}export{W as a,_ as c,d,u as f,U as i,y as l,f as m,H as n,K as o,l as p,V as r,g as s,G as t,c as u};
@@ -0,0 +1 @@
1
+ const e=new Set([`empty-helper-output`,`system-window-only`,`content-poor-app-window`]);function t(t){return typeof t==`string`&&e.has(t)}function n(e){if(!e||typeof e!=`object`)return!1;let n=e.details?.androidSnapshotHelperFailureReason;return t(n)}const r=new Set([`accessibility-timeout`]);function i(e){return typeof e==`string`&&r.has(e)}function a(e){if(!e||typeof e!=`object`)return;let t=e.details?.androidCaptureFailureReason;return i(t)?t:void 0}const o=`com.android.systemui`;function s(e){let t=e??``;if(!t.startsWith(`com.android.systemui:id/`))return!1;let n=t.slice(`${o}:id/`.length);return/(^|_)(status_bar|navigation_bar)(_|$)/.test(n)}function c(e){return`systemChrome`in e&&e.systemChrome===!0}function l(e){if(!c(e))return e;let{systemChrome:t,...n}=e;return n}function u(e){return e.some(c)?e.map(l):e}export{l as a,u as i,c as n,n as o,s as r,a as s,o as t};
@@ -1 +1 @@
1
- import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{c as n,g as r,n as i,s as a}from"./location-coordinates.js";import{F as o,n as s,u as c}from"./sdk-android-adb.js";import{t as l}from"./timeouts.js";import{f as u,g as d,n as f,o as p,s as ee}from"./app-lifecycle.js";import{a as m,s as h}from"./device-input-state.js";import{c as g,d as te,f as _,h as v,i as y,l as b,m as x,n as S,o as C,p as w,r as T,t as E,u as D}from"./input-actions.js";import{n as O}from"./snapshot.js";import{n as k,t as A}from"./setting-state.js";import{t as j}from"./appearance.js";import{t as M}from"./method-scope.js";import{promises as N}from"node:fs";const P=[`window_animation_scale`,`transition_animation_scale`,`animator_duration_scale`];async function F(e,n,r,o,s){switch(n.toLowerCase()){case`wifi`:await d(e,[`shell`,`svc`,`wifi`,A(r)?`enable`:`disable`]);return;case`airplane`:{let t=A(r),n=t?`1`:`0`,i=t?`true`:`false`;await d(e,[`shell`,`settings`,`put`,`global`,`airplane_mode_on`,n]),await d(e,[`shell`,`am`,`broadcast`,`-a`,`android.intent.action.AIRPLANE_MODE`,`--ez`,`state`,i]);return}case`location`:if(r.toLowerCase()===`set`){if(e.kind!==`emulator`)throw new t(`UNSUPPORTED_OPERATION`,`Android precise location coordinates are supported only on emulators.`,{deviceId:e.id,hint:`Use an Android emulator for adb emu geo fix, or configure location through device/provider tooling.`});let{latitude:n,longitude:r}=i(s);return await d(e,[`emu`,`geo`,`fix`,String(r),String(n)]),{latitude:n,longitude:r}}await d(e,[`shell`,`settings`,`put`,`secure`,`location_mode`,A(r)?`3`:`0`]);return;case`animations`:{let t=A(r)?`1`:`0`;for(let n of P)await d(e,[`shell`,`settings`,`put`,`global`,n,t]);return{scale:t,keys:[...P]}}case`appearance`:await d(e,[`shell`,`cmd`,`uimode`,`night`,await B(e,r)===`dark`?`yes`:`no`]);return;case`clear-app-state`:{if(r.toLowerCase()!==`clear`)throw new t(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!o)throw new t(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);let n=await u(e,o);if(n.type===`intent`)throw new t(`INVALID_ARGS`,`settings clear-app-state requires a package name, not an intent.`);await d(e,[`shell`,`am`,`force-stop`,n.value],{allowFailure:!0});let i=await d(e,[`shell`,`pm`,`clear`,n.value],{allowFailure:!0});if(i.exitCode!==0||!/\bSuccess\b/i.test(i.stdout))throw new t(`COMMAND_FAILED`,`Failed to clear Android app data for ${n.value}`,{package:n.value,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode});return{package:n.value,cleared:!0}}case`fingerprint`:await L(e,I(r));return;case`permission`:{if(!o)throw new t(`INVALID_ARGS`,`permission setting requires an active app in session`);let n=a(r),i=H(s?.permissionTarget,s?.permissionMode);if(i.kind===`notifications`){await W(e,o,n,i);return}let c=n===`grant`?`grant`:`revoke`;if(i.type===`photos`){let t=await U(e,o,c);n===`reset`&&await G(e,o,t);return}await d(e,[`shell`,`pm`,c,o,i.value]),n===`reset`&&await G(e,o,i.value);return}default:throw new t(`INVALID_ARGS`,`Unsupported setting: ${n}`)}}function I(e){let n=e.trim().toLowerCase();if(n===`match`)return`match`;if(n===`nonmatch`)return`nonmatch`;throw new t(`INVALID_ARGS`,`Invalid fingerprint state: ${e}. Use match|nonmatch.`)}async function L(e,n){let r=R(e,n),i=[];for(let t of r){let n=await d(e,t,{allowFailure:!0});if(n.exitCode===0)return;i.push({args:t,stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})}let a=k(i);throw i.length>0&&i.every(e=>z(e.stdout,e.stderr))?new t(`UNSUPPORTED_OPERATION`,`Android fingerprint simulation is not supported on this target/runtime.`,{deviceId:e.id,action:n,hint:`Use an Android emulator with biometric support, or a device/runtime that exposes cmd fingerprint.`,attempts:a}):new t(`COMMAND_FAILED`,`Failed to simulate Android fingerprint.`,{deviceId:e.id,action:n,attempts:a})}function R(e,t){let n=t===`match`?`1`:`9999`,r=[[`shell`,`cmd`,`fingerprint`,`touch`,n],[`shell`,`cmd`,`fingerprint`,`finger`,n]];return e.kind===`emulator`&&r.push([`emu`,`finger`,`touch`,n]),r}function z(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`unknown command`)||n.includes(`can't find service: fingerprint`)||n.includes(`service fingerprint was not found`)||n.includes(`fingerprint cmd unavailable`)||n.includes(`emu command is not supported`)||n.includes(`emulator console is not running`)||n.includes(`fingerprint`)&&n.includes(`not found`)}async function B(e,n){let r=j(n);if(r!==`toggle`)return r;let i=await d(e,[`shell`,`cmd`,`uimode`,`night`],{allowFailure:!0});if(i.exitCode!==0)throw s(`Failed to read current Android appearance`,i);let a=V(i.stdout,i.stderr);if(!a)throw new t(`COMMAND_FAILED`,`Unable to determine current Android appearance for toggle`,{stdout:i.stdout,stderr:i.stderr});return a===`auto`?`dark`:a===`dark`?`light`:`dark`}function V(e,t){let n=/night mode:\s*(yes|no|auto)\b/i.exec(`${e}\n${t}`);if(!n)return null;let r=n[1]?.toLowerCase();return r===`yes`?`dark`:r===`no`?`light`:r===`auto`?`auto`:null}function H(e,r){let i=n(e);if(r?.trim())throw new t(`INVALID_ARGS`,`Permission mode is only supported for photos. Received: ${r}.`);if(i===`camera`)return{kind:`pm`,value:`android.permission.CAMERA`,type:`camera`};if(i===`microphone`)return{kind:`pm`,value:`android.permission.RECORD_AUDIO`,type:`microphone`};if(i===`photos`)return{kind:`pm`,value:`android.permission.READ_MEDIA_IMAGES`,type:`photos`};if(i===`contacts`)return{kind:`pm`,value:`android.permission.READ_CONTACTS`,type:`contacts`};if(i===`notifications`)return{kind:`notifications`,appOps:`POST_NOTIFICATION`,permission:`android.permission.POST_NOTIFICATIONS`};throw new t(`INVALID_ARGS`,`Unsupported permission target on Android: ${e}. Use camera|microphone|photos|contacts|notifications.`)}async function U(e,n,r){let i=await K(e),a=i!==null&&i>=33?[`android.permission.READ_MEDIA_IMAGES`,`android.permission.READ_EXTERNAL_STORAGE`]:[`android.permission.READ_EXTERNAL_STORAGE`,`android.permission.READ_MEDIA_IMAGES`],o=[];for(let t of a){let i=await d(e,[`shell`,`pm`,r,n,t],{allowFailure:!0});if(i.exitCode===0)return t;o.push({permission:t,stderr:i.stderr,exitCode:i.exitCode})}throw new t(`COMMAND_FAILED`,`Failed to ${r} Android photos permission`,{appPackage:n,sdkInt:i,attempts:o})}async function W(e,t,n,r){let i=n===`grant`?`allow`:n===`deny`?`deny`:`default`;n===`grant`?await d(e,[`shell`,`pm`,`grant`,t,r.permission],{allowFailure:!0}):(await d(e,[`shell`,`pm`,`revoke`,t,r.permission],{allowFailure:!0}),n===`reset`&&await G(e,t,r.permission)),await d(e,[`shell`,`appops`,`set`,t,r.appOps,i])}async function G(e,t,n){await d(e,[`shell`,`pm`,`clear-permission-flags`,t,n,`user-set`],{allowFailure:!0}),await d(e,[`shell`,`pm`,`clear-permission-flags`,t,n,`user-fixed`],{allowFailure:!0})}async function K(e){let t=await d(e,[`shell`,`getprop`,`ro.build.version.sdk`],{allowFailure:!0});if(t.exitCode!==0)return null;let n=Number.parseInt(t.stdout.trim(),10);return!Number.isFinite(n)||n<=0?null:n}const q=Buffer.from([137,80,78,71,13,10,26,10]);async function J(e,t,n={}){if(n.stabilize===!1){await Z(e,t);return}await Y(e);try{await l(1e3),await Z(e,t)}finally{await X(e).catch(()=>{})}}async function Y(e){let t=t=>d(e,[`shell`,t],{allowFailure:!0});await t(`settings put global sysui_demo_allowed 1`);let n=e=>t(`am broadcast -a com.android.systemui.demo -e command ${e}`);await n(`clock -e hhmm 0941`),await n(`notifications -e visible false`)}async function X(e){await d(e,[`shell`,`am broadcast -a com.android.systemui.demo -e command exit`],{allowFailure:!0})}async function Z(e,n){let r=await d(e,[`exec-out`,`screencap`,`-p`],{binaryStdout:!0});if(!r.stdoutBuffer)throw new t(`COMMAND_FAILED`,`Failed to capture screenshot`);let i=r.stdoutBuffer.indexOf(q);if(i<0)throw new t(`COMMAND_FAILED`,`Screenshot data does not contain a valid PNG header`);let a=Q(r.stdoutBuffer,i);if(!a)throw new t(`COMMAND_FAILED`,`Screenshot data does not contain a complete PNG payload`);await N.writeFile(n,r.stdoutBuffer.subarray(i,a))}function Q(e,t){let n=t+q.length;for(;n+8<=e.length;){let t=e.readUInt32BE(n),r=n+4,i=e.toString(`ascii`,r,r+4),a=n+12+t;if(a>e.length)return null;if(i===`IEND`)return a;n=a}return null}var ne=e({createAndroidInteractor:()=>$});function $(e,t,n){let i={open:(t,n)=>p(e,t,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:n?.launchArgs,url:n?.url}),openDevice:()=>ee(e),close:t=>f(e,t),tap:(t,n)=>b(e,t,n),doubleTap:async(t,n)=>{await b(e,t,n),await b(e,t,n)},longPress:(t,n,r)=>g(e,t,n,r),focus:(t,n)=>y(e,t,n),type:(t,n)=>w(e,t,n),fill:(t,n,r,i)=>T(e,t,n,r,i),scroll:(t,n)=>te(e,t,n),performGesture:t=>x(e,t),gestureViewport:()=>v(e),screenshot:(t,n)=>J(e,t,n),snapshot:async t=>{let i=t??{},a=await o(`snapshot_capture`,async()=>await O(e,{appBundleId:i.appBundleId,signal:i.signal??n?.signal,interactiveOnly:i.interactiveOnly,depth:i.depth,scope:i.scope,raw:i.raw,includeHiddenContentHints:i.includeHiddenContentHints,helperSessionScope:i.appBundleId?`daemon-session`:`command`}),{backend:`android`});return{nodes:a.nodes??[],truncated:a.truncated??!1,backend:`android`,...r(a)}},back:t=>S(e),home:()=>C(e),setOrientation:t=>_(e,t),appSwitcher:()=>E(e),tvRemote:(t,n)=>D(e,t,n),readClipboard:()=>m(e),writeClipboard:t=>h(e,t),setSetting:(t,n,r,i)=>F(e,t,n,r,i)};return t?M(i,n=>c(t,{serial:e.id},n)):i}export{$ as n,ne as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{c as t}from"./diagnostics.js";import"./diagnostics2.js";import"./platform-runtime-android-adb-host.js";import{u as n}from"./adb-executor.js";import{A as r,C as i,D as a,E as o,M as s,O as c,S as l,T as u,a as d,b as f,c as p,f as m,g as h,i as g,j as _,k as v,l as y,m as b,o as x,s as S,u as C,w,x as T}from"./mechanics.js";import{a as E,i as D,n as O}from"./app-lifecycle.js";import{n as k}from"./scoped-provider.js";import{t as A}from"./snapshot-state.js";var j=e({createAndroidInteractor:()=>N});function M(e){return e?`daemon-session`:`command`}function N(e,j,N){let P=M(N?.appBundleId),F=t=>({...t===void 0?{}:{timeoutMs:t},captureNodes:async()=>{let t=await p(e,{includeHiddenContentHints:!1});return A(y(t),void 0).nodes}}),I={open:(t,n)=>D(e,t,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:n?.launchArgs,url:n?.url}),openDevice:()=>E(e),close:t=>O(e,t),tap:(t,n)=>o(e,t,n),doubleTap:async(t,n)=>{await o(e,t,n),await o(e,t,n)},longPress:(t,n,r)=>u(e,t,n,r),focus:(t,n)=>i(e,t,n),type:(t,n)=>d(e,t,n),fill:(t,n,r,i)=>g(e,t,n,r,i,{helperSessionScope:P}),scroll:(t,n)=>v(e,t,{...n,helperSessionScope:P}),performGesture:t=>_(e,t),gestureViewport:()=>s(e,{helperSessionScope:P}),screenshot:(t,n)=>x(e,t,n),readTextAtPoint:async(t,n)=>{let{readAndroidTextAtPoint:r}=await import(`./mechanics.js`).then(e=>e.r);return await r(e,t.x,t.y,{helperSessionScope:M(n?.appBundleId)})??void 0},snapshot:async n=>{let r=n??{},i=await t(`snapshot_capture`,async()=>await p(e,{appBundleId:r.appBundleId,signal:r.signal??N?.signal,interactiveOnly:r.interactiveOnly,depth:r.depth,scope:r.scope,raw:r.raw,includeHiddenContentHints:r.includeHiddenContentHints,helperSessionScope:M(r.appBundleId)}),{backend:`android`});return y(i)},back:t=>l(e),home:()=>w(e),setOrientation:t=>r(e,t),appSwitcher:()=>T(e),tvRemote:(t,n)=>c(e,t,n),keyboardStatus:async()=>({kind:`ime-probe`,...await m(e)}),keyboardDismiss:async()=>({kind:`ime-probe`,...await C(e)}),keyboardEnter:async()=>(await a(e),{kind:`android-acknowledged`}),readClipboard:()=>b(e),writeClipboard:t=>h(e,t),setSetting:(t,n,r,i)=>S(e,t,n,r,i),readAlert:async()=>await f(e,`get`,F()),awaitAlert:async t=>await f(e,`wait`,F(t?.timeoutMs)),acceptAlert:async()=>await f(e,`accept`,F()),dismissAlert:async()=>await f(e,`dismiss`,F())};return j?k(I,t=>n(j,{serial:e.id},t)):I}export{N as n,j as t};
@@ -0,0 +1,11 @@
1
+ import{a as e,i as t,t as n}from"./rolldown-runtime.js";import{a as r,i,r as a}from"./ios-client.js";import{promises as o}from"fs";import s from"os";import c,{basename as l}from"path";import u,{createHash as d}from"crypto";function f(e,t,n,r,i){if(r===`m`)throw TypeError(`Private method is not writable`);if(r===`a`&&!i)throw TypeError(`Private accessor was defined without a setter`);if(typeof t==`function`?e!==t||!i:!t.has(e))throw TypeError(`Cannot write private member to an object whose class did not declare it`);return r===`a`?i.call(e,n):i?i.value=n:t.set(e,n),n}function p(e,t,n,r){if(n===`a`&&!r)throw TypeError(`Private accessor was defined without a getter`);if(typeof t==`function`?e!==t||!r:!t.has(e))throw TypeError(`Cannot read private member from an object whose class did not declare it`);return n===`m`?r:n===`a`?r.call(e):r?r.value:t.get(e)}let m=function(){let{crypto:e}=globalThis;if(e?.randomUUID)return m=e.randomUUID.bind(e),e.randomUUID();let t=new Uint8Array(1),n=e?()=>e.getRandomValues(t)[0]:()=>Math.random()*255&255;return`10000000-1000-4000-8000-100000000000`.replace(/[018]/g,e=>(e^n()&15>>e/4).toString(16))};function h(e){return typeof e==`object`&&!!e&&(`name`in e&&e.name===`AbortError`||`message`in e&&String(e.message).includes(`FetchRequestCanceledException`))}const g=e=>{if(e instanceof Error)return e;if(typeof e==`object`&&e){try{if(Object.prototype.toString.call(e)===`[object Error]`){let t=Error(e.message,e.cause?{cause:e.cause}:{});return e.stack&&(t.stack=e.stack),e.cause&&!t.cause&&(t.cause=e.cause),e.name&&(t.name=e.name),t}}catch{}try{return Error(JSON.stringify(e))}catch{}}return Error(e)};var _=class extends Error{},v=class e extends _{constructor(t,n,r,i){super(`${e.makeMessage(t,n,r)}`),this.status=t,this.headers=i,this.error=n}static makeMessage(e,t,n){let r=t?.message?typeof t.message==`string`?t.message:JSON.stringify(t.message):t?JSON.stringify(t):n;return e&&r?`${e} ${r}`:e?`${e} status code (no body)`:r||`(no status code or body)`}static generate(t,n,r,i){if(!t||!i)return new b({message:r,cause:g(n)});let a=n;return t===400?new S(t,a,r,i):t===401?new C(t,a,r,i):t===403?new w(t,a,r,i):t===404?new T(t,a,r,i):t===409?new E(t,a,r,i):t===422?new D(t,a,r,i):t===429?new O(t,a,r,i):t>=500?new k(t,a,r,i):new e(t,a,r,i)}},y=class extends v{constructor({message:e}={}){super(void 0,void 0,e||`Request was aborted.`,void 0)}},b=class extends v{constructor({message:e,cause:t}){super(void 0,void 0,e||`Connection error.`,void 0),t&&(this.cause=t)}},x=class extends b{constructor({message:e}={}){super({message:e??`Request timed out.`})}},S=class extends v{},C=class extends v{},w=class extends v{},T=class extends v{},E=class extends v{},D=class extends v{},O=class extends v{},k=class extends v{};const A=/^[a-z][a-z0-9+.-]*:/i,ee=e=>A.test(e);let j=e=>(j=Array.isArray,j(e)),M=j;function N(e){return typeof e==`object`?e??{}:{}}function P(e){if(!e)return!0;for(let t in e)return!1;return!0}function te(e,t){return Object.prototype.hasOwnProperty.call(e,t)}const ne=(e,t)=>{if(typeof t!=`number`||!Number.isInteger(t))throw new _(`${e} must be an integer`);if(t<0)throw new _(`${e} must be a positive integer`);return t},re=e=>{try{return JSON.parse(e)}catch{return}},ie=e=>new Promise(t=>setTimeout(t,e)),F=`0.24.5`;function ae(){return typeof Deno<`u`&&Deno.build!=null?`deno`:typeof EdgeRuntime<`u`?`edge`:Object.prototype.toString.call(globalThis.process===void 0?0:globalThis.process)===`[object process]`?`node`:`unknown`}const oe=()=>{let e=ae();if(e===`deno`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":F,"X-Stainless-OS":le(Deno.build.os),"X-Stainless-Arch":ce(Deno.build.arch),"X-Stainless-Runtime":`deno`,"X-Stainless-Runtime-Version":typeof Deno.version==`string`?Deno.version:Deno.version?.deno??`unknown`};if(typeof EdgeRuntime<`u`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":F,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":`edge`,"X-Stainless-Runtime-Version":globalThis.process.version};if(e===`node`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":F,"X-Stainless-OS":le(globalThis.process.platform??`unknown`),"X-Stainless-Arch":ce(globalThis.process.arch??`unknown`),"X-Stainless-Runtime":`node`,"X-Stainless-Runtime-Version":globalThis.process.version??`unknown`};let t=se();return t?{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":F,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`unknown`,"X-Stainless-Runtime":`browser:${t.browser}`,"X-Stainless-Runtime-Version":t.version}:{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":F,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`unknown`,"X-Stainless-Runtime":`unknown`,"X-Stainless-Runtime-Version":`unknown`}};function se(){if(typeof navigator>`u`||!navigator)return null;for(let{key:e,pattern:t}of[{key:`edge`,pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`ie`,pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`ie`,pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`chrome`,pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`firefox`,pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`safari`,pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}]){let n=t.exec(navigator.userAgent);if(n)return{browser:e,version:`${n[1]||0}.${n[2]||0}.${n[3]||0}`}}return null}const ce=e=>e===`x32`?`x32`:e===`x86_64`||e===`x64`?`x64`:e===`arm`?`arm`:e===`aarch64`||e===`arm64`?`arm64`:e?`other:${e}`:`unknown`,le=e=>(e=e.toLowerCase(),e.includes(`ios`)?`iOS`:e===`android`?`Android`:e===`darwin`?`MacOS`:e===`win32`?`Windows`:e===`freebsd`?`FreeBSD`:e===`openbsd`?`OpenBSD`:e===`linux`?`Linux`:e?`Other:${e}`:`Unknown`);let ue;const de=()=>ue??=oe();function fe(){if(typeof fetch<`u`)return r.fetch;throw Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Limrun({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function pe(...e){let t=globalThis.ReadableStream;if(t===void 0)throw Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new t(...e)}function me(e){let t=Symbol.asyncIterator in e?e[Symbol.asyncIterator]():e[Symbol.iterator]();return pe({start(){},async pull(e){let{done:n,value:r}=await t.next();n?e.close():e.enqueue(r)},async cancel(){await t.return?.()}})}async function he(e){if(typeof e!=`object`||!e)return;if(e[Symbol.asyncIterator]){await e[Symbol.asyncIterator]().return?.();return}let t=e.getReader(),n=t.cancel();t.releaseLock(),await n}const ge=({headers:e,body:t})=>({bodyHeaders:{"content-type":`application/json`},body:JSON.stringify(t)});function _e(e){return Object.entries(e).filter(([e,t])=>t!==void 0).map(([e,t])=>{if(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)return`${encodeURIComponent(e)}=${encodeURIComponent(t)}`;if(t===null)return`${encodeURIComponent(e)}=`;throw new _(`Cannot stringify type ${typeof t}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join(`&`)}const I={off:0,error:200,warn:300,info:400,debug:500},ve=(e,t,n)=>{if(e){if(te(I,e))return e;z(n).warn(`${t} was set to ${JSON.stringify(e)}, expected one of ${JSON.stringify(Object.keys(I))}`)}};function L(){}function R(e,t,n){return!t||I[e]>I[n]?L:t[e].bind(t)}const ye={error:L,warn:L,info:L,debug:L};let be=new WeakMap;function z(e){let t=e.logger,n=e.logLevel??`off`;if(!t)return ye;let r=be.get(t);if(r&&r[0]===n)return r[1];let i={error:R(`error`,t,n),warn:R(`warn`,t,n),info:R(`info`,t,n),debug:R(`debug`,t,n)};return be.set(t,[n,i]),i}const B=e=>(e.options&&(e.options={...e.options},delete e.options.headers),e.headers&&=Object.fromEntries((e.headers instanceof Headers?[...e.headers]:Object.entries(e.headers)).map(([e,t])=>[e,e.toLowerCase()===`authorization`||e.toLowerCase()===`cookie`||e.toLowerCase()===`set-cookie`?`***`:t])),`retryOfRequestLogID`in e&&(e.retryOfRequestLogID&&(e.retryOf=e.retryOfRequestLogID),delete e.retryOfRequestLogID),e);async function xe(e,t){let{response:n,requestLogID:r,retryOfRequestLogID:i,startTime:a}=t,o=await(async()=>{if(n.status===204)return null;if(t.options.__binaryResponse)return n;let e=n.headers.get(`content-type`)?.split(`;`)[0]?.trim();return e?.includes(`application/json`)||e?.endsWith(`+json`)?n.headers.get(`content-length`)===`0`?void 0:await n.json():await n.text()})();return z(e).debug(`[${r}] response parsed`,B({retryOfRequestLogID:i,url:n.url,status:n.status,body:o,durationMs:Date.now()-a})),o}var V,Se=class e extends Promise{constructor(e,t,n=xe){super(e=>{e(null)}),this.responsePromise=t,this.parseResponse=n,V.set(this,void 0),f(this,V,e,`f`)}_thenUnwrap(t){return new e(p(this,V,`f`),this.responsePromise,async(e,n)=>t(await this.parseResponse(e,n),n))}asResponse(){return this.responsePromise.then(e=>e.response)}async withResponse(){let[e,t]=await Promise.all([this.parse(),this.asResponse()]);return{data:e,response:t}}parse(){return this.parsedPromise||=this.responsePromise.then(e=>this.parseResponse(p(this,V,`f`),e)),this.parsedPromise}then(e,t){return this.parse().then(e,t)}catch(e){return this.parse().catch(e)}finally(e){return this.parse().finally(e)}};V=new WeakMap;var H,Ce=class{constructor(e,t,n,r){H.set(this,void 0),f(this,H,e,`f`),this.options=r,this.response=t,this.body=n}hasNextPage(){return this.getPaginatedItems().length?this.nextPageRequestOptions()!=null:!1}async getNextPage(){let e=this.nextPageRequestOptions();if(!e)throw new _("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await p(this,H,`f`).requestAPIList(this.constructor,e)}async*iterPages(){let e=this;for(yield e;e.hasNextPage();)e=await e.getNextPage(),yield e}async*[(H=new WeakMap,Symbol.asyncIterator)](){for await(let e of this.iterPages())for(let t of e.getPaginatedItems())yield t}},we=class extends Se{constructor(e,t,n){super(e,t,async(e,t)=>new n(e,t.response,await xe(e,t),t.options))}async*[Symbol.asyncIterator](){let e=await this;for await(let t of e)yield t}},U=class extends Ce{constructor(e,t,n,r){super(e,t,n,r),this.items=n||[]}getPaginatedItems(){return this.items??[]}nextPageRequestOptions(){let e=this.getPaginatedItems();if(!(typeof this.options.query==`object`&&`endingBefore`in(this.options.query||{}))){let t=e[e.length-1]?.metadata.id;return t?{...this.options,query:{...N(this.options.query),startingAfter:t}}:null}let t=e[0]?.metadata.id;return t?{...this.options,query:{...N(this.options.query),endingBefore:t}}:null}};const Te=()=>{if(typeof File>`u`){let{process:e}=globalThis,t=typeof e?.versions?.node==`string`&&parseInt(e.versions.node.split(`.`))<20;throw Error("`File` is not defined as a global, which is required for file uploads."+(t?" Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`.":``))}};function W(e,t,n){return Te(),new File(e,t??`unknown_file`,n)}function Ee(e){return(typeof e==`object`&&!!e&&(`name`in e&&e.name&&String(e.name)||`url`in e&&e.url&&String(e.url)||`filename`in e&&e.filename&&String(e.filename)||`path`in e&&e.path&&String(e.path))||``).split(/[\\/]/).pop()||void 0}const De=e=>typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`,Oe=e=>typeof e==`object`&&!!e&&typeof e.size==`number`&&typeof e.type==`string`&&typeof e.text==`function`&&typeof e.slice==`function`&&typeof e.arrayBuffer==`function`,ke=e=>typeof e==`object`&&!!e&&typeof e.name==`string`&&typeof e.lastModified==`number`&&Oe(e),Ae=e=>typeof e==`object`&&!!e&&typeof e.url==`string`&&typeof e.blob==`function`;async function je(e,t,n){if(Te(),e=await e,ke(e))return e instanceof File?e:W([await e.arrayBuffer()],e.name);if(Ae(e)){let r=await e.blob();return t||=new URL(e.url).pathname.split(/[\\/]/).pop(),W(await G(r),t,n)}let r=await G(e);if(t||=Ee(e),!n?.type){let e=r.find(e=>typeof e==`object`&&`type`in e&&e.type);typeof e==`string`&&(n={...n,type:e})}return W(r,t,n)}async function G(e){let t=[];if(typeof e==`string`||ArrayBuffer.isView(e)||e instanceof ArrayBuffer)t.push(e);else if(Oe(e))t.push(e instanceof Blob?e:await e.arrayBuffer());else if(De(e))for await(let n of e)t.push(...await G(n));else{let t=e?.constructor?.name;throw Error(`Unexpected data type: ${typeof e}${t?`; constructor: ${t}`:``}${Me(e)}`)}return t}function Me(e){return typeof e!=`object`||!e?``:`; props: [${Object.getOwnPropertyNames(e).map(e=>`"${e}"`).join(`, `)}]`}var K=class{constructor(e){this._client=e}};const Ne=Symbol(`brand.privateNullableHeaders`);function*Pe(e){if(!e)return;if(Ne in e){let{values:t,nulls:n}=e;yield*t.entries();for(let e of n)yield[e,null];return}let t=!1,n;e instanceof Headers?n=e.entries():M(e)?n=e:(t=!0,n=Object.entries(e??{}));for(let e of n){let n=e[0];if(typeof n!=`string`)throw TypeError(`expected header name to be a string`);let r=M(e[1])?e[1]:[e[1]],i=!1;for(let e of r)e!==void 0&&(t&&!i&&(i=!0,yield[n,null]),yield[n,e])}}const q=e=>{let t=new Headers,n=new Set;for(let r of e){let e=new Set;for(let[i,a]of Pe(r)){let r=i.toLowerCase();e.has(r)||(t.delete(i),e.add(r)),a===null?(t.delete(i),n.add(r)):(t.append(i,a),n.delete(r))}}return{[Ne]:!0,values:t,nulls:n}};function Fe(e){return e.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}const Ie=Object.freeze(Object.create(null)),J=((e=Fe)=>function(t,...n){if(t.length===1)return t[0];let r=!1,i=[],a=t.reduce((t,a,o)=>{/[?#]/.test(a)&&(r=!0);let s=n[o],c=(r?encodeURIComponent:e)(``+s);return o!==n.length&&(s==null||typeof s==`object`&&s.toString===Object.getPrototypeOf(Object.getPrototypeOf(s.hasOwnProperty??Ie)??Ie)?.toString)&&(c=s+``,i.push({start:t.length+a.length,length:c.length,error:`Value of type ${Object.prototype.toString.call(s).slice(8,-1)} is not a valid path parameter`})),t+a+(o===n.length?``:c)},``),o=a.split(/[?#]/,1)[0],s=/(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi,c;for(;(c=s.exec(o))!==null;)i.push({start:c.index,length:c[0].length,error:`Value "${c[0]}" can\'t be safely passed as a path parameter`});if(i.sort((e,t)=>e.start-t.start),i.length>0){let e=0,t=i.reduce((t,n)=>{let r=` `.repeat(n.start-e),i=`^`.repeat(n.length);return e=n.start+n.length,t+r+i},``);throw new _(`Path parameters result in path with invalid segments:\n${i.map(e=>e.error).join(`
2
+ `)}\n${a}\n${t}`)}return a})(Fe);var Le=class extends K{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/android_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/android_instances`,U,{query:e,...t})}delete(e,t){return this._client.delete(J`/v1/android_instances/${e}`,{...t,headers:q([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(J`/v1/android_instances/${e}`,t)}},Re=class extends K{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/ios_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/ios_instances`,U,{query:e,...t})}delete(e,t){return this._client.delete(J`/v1/ios_instances/${e}`,{...t,headers:q([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(J`/v1/ios_instances/${e}`,t)}},ze=class extends K{list(e={},t){return this._client.get(`/v1/assets`,{query:e,...t})}delete(e,t){return this._client.delete(J`/v1/assets/${e}`,{...t,headers:q([{Accept:`*/*`},t?.headers])})}get(e,t={},n){return this._client.get(J`/v1/assets/${e}`,{query:t,...n})}getOrCreate(e,t){return this._client.put(`/v1/assets`,{body:e,...t})}},Be=class extends ze{async getOrUpload(e,t){let n=await this.getOrCreate({name:e.name??l(e.path)},t),i=await o.readFile(e.path),a=d(`md5`).update(i).digest(`hex`);if(n.md5&&n.md5===a)return{id:n.id,name:n.name,signedDownloadUrl:n.signedDownloadUrl,md5:n.md5};let s=await r.fetch(n.signedUploadUrl,{headers:{"Content-Length":i.length.toString(),"Content-Type":`application/octet-stream`},method:`PUT`,body:i});if(s.status!==200)throw Error(`Failed to upload asset: ${s.status} ${await s.text()}`);return{id:n.id,name:n.name,signedDownloadUrl:n.signedDownloadUrl,md5:a}}},Ve=class extends K{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/xcode_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/xcode_instances`,U,{query:e,...t})}delete(e,t){return this._client.delete(J`/v1/xcode_instances/${e}`,{...t,headers:q([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(J`/v1/xcode_instances/${e}`,t)}},He=n((e=>{Object.defineProperty(e,"__esModule",{value:!0});var t=class extends Error{constructor(e,t){super(e),this.name=`ParseError`,this.type=t.type,this.field=t.field,this.value=t.value,this.line=t.line}};function n(e){}function r(e){if(typeof e==`function`)throw TypeError("`config` must be an object, got a function instead. Did you mean `createParser({onEvent: fn})`?");let{onEvent:r=n,onError:o=n,onRetry:s=n,onComment:c,maxBufferSize:l}=e,u=[],d=0,f=!0,p,m=``,h=0,g,_=!1;function v(e){if(_)throw Error("Cannot feed parser: it was terminated after exceeding the configured max buffer size. Call `reset()` to resume parsing.");if(f&&(f=!1,e.charCodeAt(0)===239&&e.charCodeAt(1)===187&&e.charCodeAt(2)===191&&(e=e.slice(3))),u.length===0){let t=b(e);t!==``&&(u.push(t),d=t.length),y();return}if(e.indexOf(`
3
+ `)===-1&&e.indexOf(`\r`)===-1){u.push(e),d+=e.length,y();return}u.push(e);let t=u.join(``);u.length=0,d=0;let n=b(t);n!==``&&(u.push(n),d=n.length),y()}function y(){l!==void 0&&(d+m.length<=l||(_=!0,u.length=0,d=0,p=void 0,m=``,h=0,g=void 0,o(new t(`Buffered data exceeded max buffer size of ${l} characters`,{type:`max-buffer-size-exceeded`}))))}function b(e){let t=0;if(e.indexOf(`\r`)===-1){let n=e.indexOf(`
4
+ `,t);for(;n!==-1;){if(t===n){h>0&&r({id:p,event:g,data:m}),p=void 0,m=``,h=0,g=void 0,t=n+1,n=e.indexOf(`
5
+ `,t);continue}let o=e.charCodeAt(t);if(i(e,t,o)){let i=e.charCodeAt(t+5)===32?t+6:t+5,a=e.slice(i,n);if(h===0&&e.charCodeAt(n+1)===10){r({id:p,event:g,data:a}),p=void 0,m=``,g=void 0,t=n+2,n=e.indexOf(`
6
+ `,t);continue}m=h===0?a:`${m}
7
+ ${a}`,h++}else a(e,t,o)?g=e.slice(e.charCodeAt(t+6)===32?t+7:t+6,n)||void 0:x(e,t,n);t=n+1,n=e.indexOf(`
8
+ `,t)}return e.slice(t)}for(;t<e.length;){let n=e.indexOf(`\r`,t),r=e.indexOf(`
9
+ `,t),i=-1;if(n!==-1&&r!==-1?i=n<r?n:r:n===-1?r!==-1&&(i=r):i=n===e.length-1?-1:n,i===-1)break;x(e,t,i),t=i+1,e.charCodeAt(t-1)===13&&e.charCodeAt(t)===10&&t++}return e.slice(t)}function x(e,t,n){if(t===n){C();return}let r=e.charCodeAt(t);if(i(e,t,r)){let r=e.charCodeAt(t+5)===32?t+6:t+5,i=e.slice(r,n);m=h===0?i:`${m}
10
+ ${i}`,h++;return}if(a(e,t,r)){g=e.slice(e.charCodeAt(t+6)===32?t+7:t+6,n)||void 0;return}if(r===105&&e.charCodeAt(t+1)===100&&e.charCodeAt(t+2)===58){let r=e.slice(e.charCodeAt(t+3)===32?t+4:t+3,n);p=r.includes(`\0`)?void 0:r;return}if(r===58){if(c){let r=e.slice(t,n);c(r.slice(e.charCodeAt(t+1)===32?2:1))}return}let o=e.slice(t,n),s=o.indexOf(`:`);if(s===-1){S(o,``,o);return}let l=o.slice(0,s),u=o.charCodeAt(s+1)===32?2:1;S(l,o.slice(s+u),o)}function S(e,n,r){switch(e){case`event`:g=n||void 0;break;case`data`:m=h===0?n:`${m}
11
+ ${n}`,h++;break;case`id`:p=n.includes(`\0`)?void 0:n;break;case`retry`:/^\d+$/.test(n)?s(parseInt(n,10)):o(new t(`Invalid \`retry\` value: "${n}"`,{type:`invalid-retry`,value:n,line:r}));break;default:o(new t(`Unknown field "${e.length>20?`${e.slice(0,20)}\u2026`:e}"`,{type:`unknown-field`,field:e,value:n,line:r}))}}function C(){h>0&&r({id:p,event:g,data:m}),p=void 0,m=``,h=0,g=void 0}function w(e={}){if(e.consume&&u.length>0){let e=u.join(``);x(e,0,e.length)}f=!0,p=void 0,m=``,h=0,g=void 0,u.length=0,d=0,_=!1}return{feed:v,reset:w}}function i(e,t,n){return n===100&&e.charCodeAt(t+1)===97&&e.charCodeAt(t+2)===116&&e.charCodeAt(t+3)===97&&e.charCodeAt(t+4)===58}function a(e,t,n){return n===101&&e.charCodeAt(t+1)===118&&e.charCodeAt(t+2)===101&&e.charCodeAt(t+3)===110&&e.charCodeAt(t+4)===116&&e.charCodeAt(t+5)===58}e.ParseError=t,e.createParser=r}));const Ue=e(n((e=>{Object.defineProperty(e,"__esModule",{value:!0});var n=t(`node:stream`),r=He();let i=`connecting`,a=`open`,o=`closed`,s=()=>{};function c(e,{getStream:t}){let n=typeof e==`string`||e instanceof URL?{url:e}:e,{onMessage:c,onComment:u=s,onConnect:d=s,onDisconnect:f=s,onScheduleReconnect:p=s}=n,{fetch:m,url:h,initialLastEventId:g}=l(n),_={...n.headers},v=[],y=c?[c]:[],b=e=>y.forEach(t=>t(e)),x=r.createParser({onEvent:N,onRetry:P,onComment:u}),S,C=h.toString(),w=new AbortController,T=g,E=2e3,D,O=o;return k(),{close:A,connect:k,[Symbol.iterator]:()=>{throw Error("EventSource does not support synchronous iteration. Use `for await` instead.")},[Symbol.asyncIterator]:ee,get lastEventId(){return T},get url(){return C},get readyState(){return O}};function k(){S||=(O=i,w=new AbortController,m(h,te()).then(M).catch(e=>{S=null,!(e.name===`AbortError`||e.type===`aborted`||w.signal.aborted)&&j()}))}function A(){O=o,w.abort(),x.reset(),clearTimeout(D),v.forEach(e=>e())}function ee(){let e=[],t=[];function n(){return new Promise(n=>{let r=t.shift();r?n({value:r,done:!1}):e.push(n)})}let r=function(n){let r=e.shift();r?r({value:n,done:!1}):t.push(n)};function i(){for(y.splice(y.indexOf(r),1);e.shift(););for(;t.shift(););}function a(){let t=e.shift();t&&(t({done:!0,value:void 0}),i())}return v.push(a),y.push(r),{next(){return O===o?this.return():n()},return(){return i(),Promise.resolve({done:!0,value:void 0})},throw(e){return i(),Promise.reject(e)},[Symbol.asyncIterator](){return this}}}function j(){p({delay:E}),!w.signal.aborted&&(O=i,D=setTimeout(k,E))}async function M(e){d(),x.reset();let{body:n,redirected:r,status:i}=e;if(i===204){f(),A();return}if(!n)throw Error(`Missing response body`);r&&(C=e.url);let o=t(n),s=new TextDecoder,c=o.getReader(),l=!0;O=a;do{let{done:e,value:t}=await c.read();t&&x.feed(s.decode(t,{stream:!e})),e&&(l=!1,S=null,x.reset(),j(),f())}while(l)}function N(e){typeof e.id==`string`&&(T=e.id),b(e)}function P(e){E=e}function te(){let{mode:e,credentials:t,body:r,method:i,redirect:a,referrer:o,referrerPolicy:s}=n;return{mode:e,credentials:t,body:r,method:i,redirect:a,referrer:o,referrerPolicy:s,headers:{Accept:`text/event-stream`,..._,...T?{"Last-Event-ID":T}:void 0},cache:`no-store`,signal:w.signal}}}function l(e){let t=e.fetch||globalThis.fetch;if(!u(t))throw Error(`No fetch implementation provided, and one was not found on the global object.`);if(typeof AbortController!=`function`)throw Error(`Missing AbortController implementation`);let{url:n,initialLastEventId:r}=e;if(typeof n!=`string`&&!(n instanceof URL))throw Error(`Invalid URL provided - must be string or URL instance`);if(typeof r!=`string`&&r!==void 0)throw Error(`Invalid initialLastEventId provided - must be string or undefined`);return{fetch:t,url:n,initialLastEventId:r}}function u(e){return typeof e==`function`}let d={getStream:p};function f(e){return c(e,d)}function p(e){if(`getReader`in e)return e;if(typeof e.pipe!=`function`||typeof e.on!=`function`)throw Error(`Invalid response body, expected a web or node.js stream`);if(typeof n.Readable.toWeb!=`function`)throw Error("Node.js 18 or higher required (`Readable.toWeb()` not defined)");return n.Readable.toWeb(n.Readable.from(e))}e.CLOSED=o,e.CONNECTING=i,e.OPEN=a,e.createEventSource=f}))(),1).createEventSource;var Y=class{constructor(){this.dataListeners=[],this.closeListeners=[],this.closed=!1}on(e,t){return e===`data`?this.dataListeners.push(t):e===`close`&&this.closeListeners.push(t),this}emit(e,t){if(e===`data`&&typeof t==`string`)for(let e of this.dataListeners)e(t);else if(e===`close`&&!this.closed){this.closed=!0;for(let e of this.closeListeners)e()}}},We=class{constructor(e,t){this.command=new Y,this.stdout=new Y,this.stderr=new Y,this.exitListeners=[],this.abortController=new AbortController,this.sseConnection=null,this.killed=!1,this.options=t,this.log=t.log??(()=>{}),this.resultPromise=e instanceof Promise?e.then(e=>this.run(e)):this.run(e)}then(e,t){return this.resultPromise.then(e,t)}catch(e){return this.resultPromise.catch(e)}finally(e){return this.resultPromise.finally(e)}on(e,t){return e===`exit`&&this.exitListeners.push(t),this}async kill(){if(this.killed=!0,this.abortController.abort(),this.sseConnection&&=(this.sseConnection.close(),null),!this.execId){this.log(`warn`,`Failed to cancel build: execId is not set`);return}try{await r.fetch(`${this.options.apiUrl}/exec/${this.execId}/cancel`,{method:`POST`,headers:{Authorization:`Bearer ${this.options.token}`}}),this.log(`info`,`Build cancelled`)}catch(e){this.log(`warn`,`Failed to cancel build: ${e}`)}}async run(e){let{log:t}=this,{apiUrl:n,token:i}=this.options,a;try{a=await r.fetch(`${n}/exec`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${i}`},body:JSON.stringify(e),signal:this.abortController.signal})}catch(e){if(this.killed){this.command.emit(`close`),this.stdout.emit(`close`),this.stderr.emit(`close`);for(let e of this.exitListeners)e(-1);return{exitCode:-1,execId:``,status:`CANCELLED`}}throw e}if(!a.ok){let e=await a.text();throw Error(`exec failed: ${a.status} ${e}`)}let o=await a.json();this.execId=o.execId,t(`debug`,`Build started: ${this.execId}`);let s=`${n}/exec/${this.execId}/events`,c,l;try{c=await Promise.race([this.connectSSE(s),new Promise((e,t)=>{l=setTimeout(()=>t(Error(`SSE timeout`)),36e5)})])}catch{this.killed?(t(`debug`,`Build killed`),c=-1):(t(`warn`,`SSE completion timeout`),c=1)}finally{clearTimeout(l),this.sseConnection&&=(this.sseConnection.close(),null)}this.command.emit(`close`),this.stdout.emit(`close`),this.stderr.emit(`close`);for(let e of this.exitListeners)e(c);let u=c===0?`SUCCEEDED`:c===-1?`CANCELLED`:`FAILED`,d={exitCode:c,execId:this.execId,status:u,...e.additionalMetadata??{}};return this.log(`debug`,`Build finished: ${d.status} (exit ${d.exitCode})`),d}connectSSE(e){return new Promise((t,n)=>{if(this.abortController.signal.aborted){n(Error(`killed`));return}try{let i=Ue({url:e,fetch:r.fetch,headers:{Authorization:`Bearer ${this.options.token}`},onMessage:e=>{let n=typeof e.data==`string`?e.data:String(e.data??``),r=e.event;if(r===`command`)this.command.emit(`data`,n);else if(r===`stdout`)this.stdout.emit(`data`,n);else if(r===`stderr`)this.stderr.emit(`data`,n);else if(r===`exitCode`){let e=parseInt(n,10);if(Number.isNaN(e)){this.log(`warn`,`SSE exitCode event has invalid data: ${n}`);return}this.log(`debug`,`Build completed via SSE: exitCode=${e}`),t(e)}},onDisconnect:()=>{this.killed||this.log(`warn`,`SSE disconnected`)}});this.sseConnection=i,this.abortController.signal.addEventListener(`abort`,()=>n(Error(`killed`)),{once:!0})}catch(e){this.killed||this.log(`warn`,`SSE setup failed: ${e}`),n(e)}})}};function Ge(e,t){return new We(e,t)}function Ke(e){let t=t=>{let n=[`none`,`error`,`warn`,`info`,`debug`];return n.indexOf(e)>=n.indexOf(t)};return(e,n)=>{if(!t(e))return;let r=`[XcodeInstance]`;e===`error`||e===`warn`?console[e](r,n):console.log(r,n)}}var qe=class extends Ve{async createClient(e){let t,n;if(`instance`in e){if(!e.instance.status.apiUrl)throw Error(`Instance not ready: apiUrl is not available`);t=e.instance.status.apiUrl,n=e.instance.status.token}else t=e.apiUrl,n=e.token;let o=Ke(e.logLevel??`info`),l=this._client;return{async sync(e,r){let l=c.resolve(e),d=`limsync-cache-${c.basename(l)}-${u.createHash(`sha1`).update(l).digest(`hex`).slice(0,8)}`,f=r?.basisCacheDir??c.join(s.tmpdir(),d),p={apiUrl:t,token:n,udid:d,install:r?.install??!0,ignoreFn:await a(e,{basisCacheDir:f,additional:e=>!!(e.startsWith(`build/`)||e.startsWith(`.build/`)||e.startsWith(`DerivedData/`)||e.startsWith(`Index.noindex/`)||e.startsWith(`ModuleCache.noindex/`)||e.startsWith(`.index-build/`)||e.startsWith(`.swiftpm/`)||e.startsWith(`Pods/`)||e.startsWith(`Carthage/Build/`)||e.includes(`/xcuserdata/`)||e.includes(`.dSYM/`)||r?.ignore?.(e))}),basisCacheDir:f,watch:r?.watch??!0,maxPatchBytes:r?.maxPatchBytes??4194304,launchMode:`ForegroundIfRunning`,log:o},m=await i(e,p);return m.stopWatching?{stopWatching:m.stopWatching}:{}},xcodebuild(e,r){let i={command:`xcodebuild`,...e&&{xcodebuild:e}};if(r?.upload){let e=r.upload.assetName;return Ge(l.assets.getOrCreate({name:e}).then(e=>(i.signedUploadUrl=e.signedUploadUrl,i.additionalMetadata={signedDownloadUrl:e.signedDownloadUrl},i)).catch(t=>{throw Error(`Failed to create upload URL for artifact '${e}': ${t instanceof Error?t.message:t}`)}),{apiUrl:t,token:n,log:o})}return Ge(i,{apiUrl:t,token:n,log:o})},async attachSimulator(e){let i,a;if(`status`in e){if(!e.status.apiUrl)throw Error(`Simulator instance not ready: apiUrl is not available`);i=e.status.apiUrl,a=e.status.token}else i=e.apiUrl,a=e.token;let o=await r.fetch(`${t}/simulator`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify({apiUrl:i,token:a})});if(!o.ok){let e=await o.text();throw Error(`POST /simulator failed: ${o.status} ${e}`)}}}}};const X=e=>{if(globalThis.process!==void 0)return globalThis.process.env?.[e]?.trim()||void 0;if(globalThis.Deno!==void 0)return globalThis.Deno.env?.get?.(e)?.trim()||void 0};var Z,Je,Q,Ye,$=class{constructor({baseURL:e=X(`LIMRUN_BASE_URL`),apiKey:t=X(`LIM_API_KEY`)??null,...n}={}){Z.add(this),Q.set(this,void 0),this.androidInstances=new Le(this),this.assets=new Be(this),this.iosInstances=new Re(this),this.xcodeInstances=new qe(this);let r={apiKey:t,...n,baseURL:e||`https://api.limrun.com`};this.baseURL=r.baseURL,this.timeout=r.timeout??Je.DEFAULT_TIMEOUT,this.logger=r.logger??console;let i=`warn`;this.logLevel=i,this.logLevel=ve(r.logLevel,`ClientOptions.logLevel`,this)??ve(X(`LIMRUN_LOG`),`process.env['LIMRUN_LOG']`,this)??i,this.fetchOptions=r.fetchOptions,this.maxRetries=r.maxRetries??2,this.fetch=r.fetch??fe(),f(this,Q,ge,`f`),this._options=r,this.apiKey=t}withOptions(e){return new this.constructor({...this._options,baseURL:this.baseURL,maxRetries:this.maxRetries,timeout:this.timeout,logger:this.logger,logLevel:this.logLevel,fetch:this.fetch,fetchOptions:this.fetchOptions,apiKey:this.apiKey,...e})}defaultQuery(){return this._options.defaultQuery}validateHeaders({values:e,nulls:t}){if(!(this.apiKey&&e.get(`authorization`))&&!t.has(`authorization`))throw Error(`Could not resolve authentication method. Expected the apiKey to be set. Or for the "Authorization" headers to be explicitly omitted`)}async authHeaders(e){if(this.apiKey!=null)return q([{Authorization:`Bearer ${this.apiKey}`}])}stringifyQuery(e){return _e(e)}getUserAgent(){return`${this.constructor.name}/JS ${F}`}defaultIdempotencyKey(){return`stainless-node-retry-${m()}`}makeStatusError(e,t,n,r){return v.generate(e,t,n,r)}buildURL(e,t,n){let r=!p(this,Z,`m`,Ye).call(this)&&n||this.baseURL,i=ee(e)?new URL(e):new URL(r+(r.endsWith(`/`)&&e.startsWith(`/`)?e.slice(1):e)),a=this.defaultQuery(),o=Object.fromEntries(i.searchParams);return(!P(a)||!P(o))&&(t={...o,...a,...t}),typeof t==`object`&&t&&!Array.isArray(t)&&(i.search=this.stringifyQuery(t)),i.toString()}async prepareOptions(e){}async prepareRequest(e,{url:t,options:n}){}get(e,t){return this.methodRequest(`get`,e,t)}post(e,t){return this.methodRequest(`post`,e,t)}patch(e,t){return this.methodRequest(`patch`,e,t)}put(e,t){return this.methodRequest(`put`,e,t)}delete(e,t){return this.methodRequest(`delete`,e,t)}methodRequest(e,t,n){return this.request(Promise.resolve(n).then(n=>({method:e,path:t,...n})))}request(e,t=null){return new Se(this,this.makeRequest(e,t,void 0))}async makeRequest(e,t,n){let r=await e,i=r.maxRetries??this.maxRetries;t??=i,await this.prepareOptions(r);let{req:a,url:o,timeout:s}=await this.buildRequest(r,{retryCount:i-t});await this.prepareRequest(a,{url:o,options:r});let c=`log_`+(Math.random()*(1<<24)|0).toString(16).padStart(6,`0`),l=n===void 0?``:`, retryOf: ${n}`,u=Date.now();if(z(this).debug(`[${c}] sending request`,B({retryOfRequestLogID:n,method:r.method,url:o,options:r,headers:a.headers})),r.signal?.aborted)throw new y;let d=new AbortController,f=await this.fetchWithTimeout(o,a,s,d).catch(g),p=Date.now();if(f instanceof globalThis.Error){let e=`retrying, ${t} attempts remaining`;if(r.signal?.aborted)throw new y;let i=h(f)||/timed? ?out/i.test(String(f)+(`cause`in f?String(f.cause):``));if(t)return z(this).info(`[${c}] connection ${i?`timed out`:`failed`} - ${e}`),z(this).debug(`[${c}] connection ${i?`timed out`:`failed`} (${e})`,B({retryOfRequestLogID:n,url:o,durationMs:p-u,message:f.message})),this.retryRequest(r,t,n??c);throw z(this).info(`[${c}] connection ${i?`timed out`:`failed`} - error; no more retries left`),z(this).debug(`[${c}] connection ${i?`timed out`:`failed`} (error; no more retries left)`,B({retryOfRequestLogID:n,url:o,durationMs:p-u,message:f.message})),i?new x:new b({cause:f})}let m=`[${c}${l}] ${a.method} ${o} ${f.ok?`succeeded`:`failed`} with status ${f.status} in ${p-u}ms`;if(!f.ok){let e=await this.shouldRetry(f);if(t&&e){let e=`retrying, ${t} attempts remaining`;return await he(f.body),z(this).info(`${m} - ${e}`),z(this).debug(`[${c}] response error (${e})`,B({retryOfRequestLogID:n,url:f.url,status:f.status,headers:f.headers,durationMs:p-u})),this.retryRequest(r,t,n??c,f.headers)}let i=e?`error; no more retries left`:`error; not retryable`;z(this).info(`${m} - ${i}`);let a=await f.text().catch(e=>g(e).message),o=re(a),s=o?void 0:a;throw z(this).debug(`[${c}] response error (${i})`,B({retryOfRequestLogID:n,url:f.url,status:f.status,headers:f.headers,message:s,durationMs:Date.now()-u})),this.makeStatusError(f.status,o,s,f.headers)}return z(this).info(m),z(this).debug(`[${c}] response start`,B({retryOfRequestLogID:n,url:f.url,status:f.status,headers:f.headers,durationMs:p-u})),{response:f,options:r,controller:d,requestLogID:c,retryOfRequestLogID:n,startTime:u}}getAPIList(e,t,n){return this.requestAPIList(t,n&&`then`in n?n.then(t=>({method:`get`,path:e,...t})):{method:`get`,path:e,...n})}requestAPIList(e,t){let n=this.makeRequest(t,null,void 0);return new we(this,n,e)}async fetchWithTimeout(e,t,n,r){let{signal:i,method:a,...o}=t||{},s=this._makeAbort(r);i&&i.addEventListener(`abort`,s,{once:!0});let c=setTimeout(s,n),l=globalThis.ReadableStream&&o.body instanceof globalThis.ReadableStream||typeof o.body==`object`&&o.body!==null&&Symbol.asyncIterator in o.body,u={signal:r.signal,...l?{duplex:`half`}:{},method:`GET`,...o};a&&(u.method=a.toUpperCase());try{return await this.fetch.call(void 0,e,u)}finally{clearTimeout(c)}}async shouldRetry(e){let t=e.headers.get(`x-should-retry`);return t===`true`?!0:t===`false`?!1:e.status===408||e.status===409||e.status===429||e.status>=500}async retryRequest(e,t,n,r){let i,a=r?.get(`retry-after-ms`);if(a){let e=parseFloat(a);Number.isNaN(e)||(i=e)}let o=r?.get(`retry-after`);if(o&&!i){let e=parseFloat(o);i=Number.isNaN(e)?Date.parse(o)-Date.now():e*1e3}if(i===void 0){let n=e.maxRetries??this.maxRetries;i=this.calculateDefaultRetryTimeoutMillis(t,n)}return await ie(i),this.makeRequest(e,t-1,n)}calculateDefaultRetryTimeoutMillis(e,t){let n=t-e;return Math.min(.5*2**n,8)*(1-Math.random()*.25)*1e3}async buildRequest(e,{retryCount:t=0}={}){let n={...e},{method:r,path:i,query:a,defaultBaseURL:o}=n,s=this.buildURL(i,a,o);`timeout`in n&&ne(`timeout`,n.timeout),n.timeout=n.timeout??this.timeout;let{bodyHeaders:c,body:l}=this.buildBody({options:n});return{req:{method:r,headers:await this.buildHeaders({options:e,method:r,bodyHeaders:c,retryCount:t}),...n.signal&&{signal:n.signal},...globalThis.ReadableStream&&l instanceof globalThis.ReadableStream&&{duplex:`half`},...l&&{body:l},...this.fetchOptions??{},...n.fetchOptions??{}},url:s,timeout:n.timeout}}async buildHeaders({options:e,method:t,bodyHeaders:n,retryCount:r}){let i={};this.idempotencyHeader&&t!==`get`&&(e.idempotencyKey||=this.defaultIdempotencyKey(),i[this.idempotencyHeader]=e.idempotencyKey);let a=q([i,{Accept:`application/json`,"User-Agent":this.getUserAgent(),"X-Stainless-Retry-Count":String(r),...e.timeout?{"X-Stainless-Timeout":String(Math.trunc(e.timeout/1e3))}:{},...de()},await this.authHeaders(e),this._options.defaultHeaders,n,e.headers]);return this.validateHeaders(a),a.values}_makeAbort(e){return()=>e.abort()}buildBody({options:{body:e,headers:t}}){if(!e)return{bodyHeaders:void 0,body:void 0};let n=q([t]);return ArrayBuffer.isView(e)||e instanceof ArrayBuffer||e instanceof DataView||typeof e==`string`&&n.values.has(`content-type`)||globalThis.Blob&&e instanceof globalThis.Blob||e instanceof FormData||e instanceof URLSearchParams||globalThis.ReadableStream&&e instanceof globalThis.ReadableStream?{bodyHeaders:void 0,body:e}:typeof e==`object`&&(Symbol.asyncIterator in e||Symbol.iterator in e&&`next`in e&&typeof e.next==`function`)?{bodyHeaders:void 0,body:me(e)}:typeof e==`object`&&n.values.get(`content-type`)===`application/x-www-form-urlencoded`?{bodyHeaders:{"content-type":`application/x-www-form-urlencoded`},body:this.stringifyQuery(e)}:p(this,Q,`f`).call(this,{body:e,headers:n})}};Je=$,Q=new WeakMap,Z=new WeakSet,Ye=function(){return this.baseURL!==`https://api.limrun.com`},$.Limrun=Je,$.DEFAULT_TIMEOUT=3e5,$.LimrunError=_,$.APIError=v,$.APIConnectionError=b,$.APIConnectionTimeoutError=x,$.APIUserAbortError=y,$.NotFoundError=T,$.ConflictError=E,$.RateLimitError=O,$.BadRequestError=S,$.AuthenticationError=C,$.InternalServerError=k,$.PermissionDeniedError=w,$.UnprocessableEntityError=D,$.toFile=je,$.AndroidInstances=Le,$.Assets=Be,$.IosInstances=Re,$.XcodeInstances=qe;export{T as n,$ as t};
@@ -0,0 +1 @@
1
+ import{C as e}from"./sdk-contracts.js";const t=1e3;function n(t){if(t)throw new e(`UNAUTHORIZED`,`Limrun uploaded apps are unavailable on the public daemon HTTP surface.`)}async function r(e,n,r){r?.throwIfAborted();let i=await e.assets.list({limit:t},{signal:r});r?.throwIfAborted();let a=[];for(let e of i){let t=o(e,n);t&&a.push(t)}return a.sort((e,t)=>e.name.localeCompare(t.name))}async function i(n,r,i,a){a?.throwIfAborted();let s=await n.assets.list({limit:t,nameFilter:i},{signal:a});a?.throwIfAborted();let c=s.filter(e=>e.name===i).map(e=>o(e,r)).filter(e=>e!==void 0);if(c.length<=1)return c[0];throw new e(`COMMAND_FAILED`,`Limrun returned multiple uploaded apps named ${i}.`,{app:i,platform:r,assetIds:c.map(e=>e.id)})}function a(e,t){let n=l(e.replace(/\.(?:tar\.gz|tgz|tar|zip|ipa|apk)$/i,``).replace(/\.app$/i,``));if(n.length<5)return;let r=t.map(e=>({app:e,keys:c(e)})).filter(({keys:e})=>e.includes(n));return r.length===1?r[0]?.app.id:void 0}function o(e,t){if(e.md5&&s(e)===t)return{id:e.id,name:e.name}}function s(e){if(e.os===`android`||e.os===`ios`)return e.os;let t=e.name.toLowerCase();if(t.endsWith(`.apk`))return`android`;if(t.endsWith(`.ipa`)||t.endsWith(`.zip`)||t.endsWith(`.tar`)||t.endsWith(`.tar.gz`)||t.endsWith(`.tgz`))return`ios`}function c(e){let t=e.id.split(/[.:/]/).at(-1);return[e.id,t,e.name].filter(e=>typeof e==`string`).map(l)}function l(e){return e.toLowerCase().replaceAll(/[^a-z0-9]+/g,``)}export{n as assertLimrunUploadedAppAccess,r as listLimrunAppAssets,a as resolveInstalledAppIdForAsset,i as resolveLimrunAppAsset};
@@ -0,0 +1,2 @@
1
+ import{C as e}from"./sdk-contracts.js";import{r as t}from"./adb.js";import{t as n}from"./app-resolution-cache.js";const r=/\.(?:apk|aab)$/i,i=/^[A-Za-z_][\w]*(\.[A-Za-z_][\w]*)+$/;function a(e){let t=e.trim();return t.length===0?`other`:r.test(t)?t.includes(`/`)||t.includes(`\\`)||t.startsWith(`.`)||t.startsWith(`~`)||!o(t)?`binary`:`package`:o(t)?`package`:`other`}function o(e){return i.test(e)}function s(e){return`Android runtime hints require an installed package name, not "${e}". Install or reinstall the app first, then relaunch by package.`}const c={settings:{type:`intent`,value:`android.settings.SETTINGS`}},l=`Run agent-device apps --platform android to discover the installed package name, then retry open with that exact package.`,u=n();function d(e){return{platform:`android`,deviceId:e.id,variant:e.target??``}}async function f(e,t){return await u.invalidateWhile(d(e),t)}async function p(n,r){let i=r.trim();if(a(i)===`package`)return{type:`package`,value:i};let o=c[i.toLowerCase()];if(o)return o;let s=d(n),f=u.get(s,i);if(f)return f;let p=(await t(n,[`shell`,`pm`,`list`,`packages`])).stdout.split(`
2
+ `).map(e=>e.replace(`package:`,``).trim()).filter(Boolean).filter(e=>e.toLowerCase().includes(i.toLowerCase())),m=p[0];if(m!==void 0&&p.length===1)return u.set(s,i,{type:`package`,value:m});throw p.length>1?new e(`INVALID_ARGS`,`Multiple packages matched "${r}"`,{matches:p,hint:`Run agent-device apps --platform android to see the exact installed package names before retrying open.`}):new e(`APP_NOT_INSTALLED`,`No package found matching "${r}"`,{hint:l})}function m(e){let t=new Set([`com`,`android`,`google`,`app`,`apps`,`service`,`services`,`mobile`,`client`]),n=e.split(`.`).flatMap(e=>e.split(/[_-]+/)).map(e=>e.trim().toLowerCase()).filter(e=>e.length>0),r=n.at(-1)??e;for(let e=n.length-1;e>=0;--e){let i=n[e];if(i&&!t.has(i)){r=i;break}}return r.split(/[^a-z0-9]+/i).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}export{a,f as i,m as n,s as o,p as r,l as t};
@@ -1 +1 @@
1
- import{n as e}from"./rolldown-runtime.js";import{p as t}from"./device.js";import{n}from"./sdk-android-adb.js";import{d as r,v as i,y as a}from"./app-lifecycle.js";var o=e({getAndroidAppStateWithAdb:()=>u,listAndroidAppsWithAdb:()=>l});const s=`android.intent.category.LAUNCHER`,c=`android.intent.category.LEANBACK_LAUNCHER`;async function l(e,n={}){let i=await d(e,n.target??`auto`);return(t(n.filter)===`user-installed`?(await h(e)).filter(e=>i.has(e)):Array.from(i)).map(e=>({package:e,name:r(e)})).sort((e,t)=>e.package.localeCompare(t.package))}async function u(e){return await g(e,[[`shell`,`dumpsys`,`window`,`windows`],[`shell`,`dumpsys`,`window`]])||await g(e,[[`shell`,`dumpsys`,`activity`,`activities`],[`shell`,`dumpsys`,`activity`]])||{}}async function d(e,t){let n=(await Promise.all(f(t).map(async t=>{let n=await e(p(t),{allowFailure:!0});return n.exitCode===0?m(n.stdout):[]}))).flat();return new Set(n)}function f(e){switch(e){case`mobile`:return[s];case`tv`:return[c];default:return[s,c]}}function p(e){return[`shell`,`cmd`,`package`,`query-activities`,`--brief`,`-a`,`android.intent.action.MAIN`,`-c`,e]}function m(e){return e.trim().length===0?[]:i(e)}async function h(e){let t=await e([`shell`,`pm`,`list`,`packages`,`-3`],{allowFailure:!0});if(t.exitCode!==0)throw n(`Failed to list Android user-installed apps`,t);return a(t.stdout)}async function g(e,t){let{parseAndroidForegroundApp:n}=await import(`./platform-runtime.js`).then(e=>e.r);for(let r of t){let t=await n((await e(r,{allowFailure:!0})).stdout??``);if(t)return t}return null}export{u as n,l as r,o as t};
1
+ import{r as e}from"./app-inventory.js";import"./device.js";import{n as t}from"./adb-failure.js";import"./adb-executor.js";import{n}from"./app-deployment-resolution.js";import{a as r,i}from"./app-parsers.js";const a=`android.intent.category.LAUNCHER`,o=`android.intent.category.LEANBACK_LAUNCHER`;async function s(t,r={}){let i=await c(t,r.target??`auto`);return(e(r.filter)===`user-installed`?(await f(t)).filter(e=>i.has(e)):Array.from(i)).map(e=>({package:e,name:n(e)})).sort((e,t)=>e.package.localeCompare(t.package))}async function c(e,t){let n=(await Promise.all(l(t).map(async t=>{let n=await e(u(t),{allowFailure:!0});return n.exitCode===0?d(n.stdout):[]}))).flat();return new Set(n)}function l(e){switch(e){case`mobile`:return[a];case`tv`:return[o];default:return[a,o]}}function u(e){return[`shell`,`cmd`,`package`,`query-activities`,`--brief`,`-a`,`android.intent.action.MAIN`,`-c`,e]}function d(e){return e.trim().length===0?[]:i(e)}async function f(e){let n=await e([`shell`,`pm`,`list`,`packages`,`-3`],{allowFailure:!0});if(n.exitCode!==0)throw t(`Failed to list Android user-installed apps`,n);return r(n.stdout)}export{s as listAndroidAppsWithAdb};
@@ -0,0 +1 @@
1
+ import{C as e,w as t}from"./sdk-contracts.js";import{Dr as n,Hn as r,Qn as i,jr as a}from"./sdk-batch.js";import{n as o}from"./scroll-indicator.js";import"./device.js";function s(e){let t=f(e.label),n=f(e.value),r=f(e.identifier),i=m(r)?r:``;return p(e.type??``)?n||t||i:t||n||i}function c(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=a(e.type??``),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`textview`)||n.includes(`textarea`)||n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`edittext`)||r.includes(`text area`)||r.includes(`text field`)}function l(e){let t=e.replaceAll(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function u(e,t){let n=s(e),r=c(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&d(n)}}function d(e){return e?e.length>80||/[\r\n]/.test(e):!1}function f(e){return typeof e==`string`?e.trim():``}function p(e){let t=a(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function m(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}const h={application:`application`,navigationbar:`navigation-bar`,tabbar:`tab-bar`,button:`button`,imagebutton:`button`,link:`link`,cell:`cell`,statictext:`text`,checkedtextview:`text`,textbox:`text-field`,textfield:`text-field`,edittext:`text-field`,textarea:`text-view`,switch:`switch`,slider:`slider`,image:`image`,imageview:`image`,webview:`webview`,framelayout:`group`,linearlayout:`group`,relativelayout:`group`,constraintlayout:`group`,viewgroup:`group`,view:`group`,listview:`list`,recyclerview:`list`,collectionview:`collection`,searchfield:`search`,heading:`heading`,activityindicator:`activity-indicator`,progressindicator:`progress-indicator`,segmentedcontrol:`segmented-control`,group:`group`,window:`window`,checkbox:`checkbox`,radio:`radio`,menuitem:`menu-item`,toolbar:`toolbar`,scrollarea:`scroll-area`,scrollview:`scroll-area`,nestedscrollview:`scroll-area`,table:`table`};function g(e,t={}){let n=[],r=[];for(let i of e){let e=i.depth??0,a=i.label?.trim()||i.value?.trim()||i.identifier?.trim()||``,o=x(i.type??`Element`),s=i.inheritsLabel===!0||i.inheritsIdentifier===!0;if(o===`group`&&!a&&!s)continue;for(;n.length>0&&e<=n.at(-1);)n.pop();let c=n.length;n.push(e),r.push({node:i,depth:c,type:o,text:_(i,c,!1,o,t)})}return r}function _(e,t,n,r,i={}){let a=r??x(e.type??`Element`),o=u(e,a),s=E(e,a,i,o),c=` `.repeat(t),l=e.ref?`@${e.ref}`:``,d=D(e,a,i,o);!s&&(e.inheritsLabel===!0||e.inheritsIdentifier===!0)&&d.push(`same label as parent`);let f=d.map(e=>` [${e}]`).join(``),p=s?` "${s}"`:``,m=v(e);return n?`${c}${l} [${a}]${f}${m}`.trimEnd():`${c}${l} [${a}]${p}${f}${m}`.trimEnd()}function v(e){let t=e.actions?.filter(e=>e.trim().length>0);return!t||t.length===0?``:` actions: [${t.map(e=>`"${A(y(e))}"`).join(`, `)}]`}function y(e){return e.replaceAll(/\s+/g,` `).replaceAll(/[\u0000-\u001f\u007f-\u009f]/g,``).trim()}function b(e,t){let n=e.label?.trim();if(n&&w(t,n))return``;let r=e.value?.trim();if(C(t)){if(r)return r;if(n)return n}else if(n)return n;if(r)return r;let i=e.identifier?.trim();return!i||T(i)&&(t===`group`||t===`image`||t===`list`||t===`collection`)?``:i}function x(e){let t=e,n=e.replaceAll(/XCUIElementType/gi,``).toLowerCase(),r=t.includes(`.`)&&(t.startsWith(`android.`)||t.startsWith(`androidx.`)||t.startsWith(`com.`));return n.includes(`.`)&&(n=n.replace(/^android\.widget\./,``).replace(/^android\.view\./,``).replace(/^android\.webkit\./,``).replace(/^androidx\./,``).replace(/^com\.google\.android\./,``).replace(/^com\.android\./,``),r&&n.includes(`.`)&&(n=n.slice(n.lastIndexOf(`.`)+1))),n===`textview`?r?`text`:`text-view`:S(n)||n||`element`}function S(e){return Object.prototype.hasOwnProperty.call(h,e)?h[e]:void 0}function C(e){return e===`text-field`||e===`text-view`||e===`search`}function w(e,t){return e!==`scroll-area`&&e!==`list`&&e!==`collection`&&e!==`table`?!1:o(t)}function T(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function E(e,t,n,r){return!n.summarizeTextSurfaces||!r.shouldSummarize?b(e,t):O(e,t,r.text)||b(e,t)}function D(e,t,n,r){let i=[];return e.enabled===!1&&i.push(`disabled`),i.push(...e.presentationHints??[]),!n.summarizeTextSurfaces||(e.selected===!0&&i.push(`selected`),e.focused===!0&&i.push(`focused`),C(t)&&i.push(`editable`),k(e,t)&&i.push(`scrollable`),!r.shouldSummarize)?j(i):(i.push(`preview:"${A(l(r.text))}"`),i.push(`truncated`),j(i))}function O(e,t,n){let r=f(e.label);if(r&&r!==n)return r;let i=f(e.identifier);if(i&&!T(i)&&i!==n)return i;switch(t){case`text`:case`text-view`:return`Text view`;case`text-field`:return`Text field`;case`search`:return`Search field`;default:return``}}function k(e,t){if(t===`scroll-area`)return!0;let n=(e.type??``).toLowerCase(),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`scroll`)||r.includes(`scroll`)}function A(e){return e.replaceAll(`\\`,String.raw`\\`).replaceAll(`"`,String.raw`\"`)}function j(e){return[...new Set(e)]}const M={state:`sparse`,backend:`tree`,reason:`legacy iOS capture exposed only the application root`,reasonCode:`sparse-tree`};function N(e){if(e.scope!==void 0)return`scope`;if(e.depth!==void 0)return`depth`}function P(e,t=`is`){let n=`${t} absent`;return e===`scope`?`${n} does not support --scope; it requires an unscoped capture`:`${n} does not support --depth; it requires a full-depth capture`}function F(e,t){let n=t[0]?R(t[0]):void 0,r=t.length;if(e.truncated===!0)return{kind:`truncated`,matches:r,...n?{firstMatch:n}:{}};let i=I(e);return i?{kind:`sparse`,matches:r,...n?{firstMatch:n}:{},quality:{state:i.state,backend:i.backend,...i.reason?{reason:i.reason}:{},...i.reasonCode?{reasonCode:i.reasonCode}:{}}}:r===0?{kind:`absent`,matches:0}:{kind:`present`,matches:r,firstMatch:n}}function I(e){let t=e.snapshotQuality;return t?.state===`sparse`?{state:t.state,backend:t.backend,...t.reason?{reason:t.reason}:{},...t.reasonCode?{reasonCode:t.reasonCode}:{}}:L(e)?M:void 0}function L(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:a(e.nodes[0]?.type??``)===`application`}function R(e){let t=r(e),a=i(n(e),256);return{...t,...a&&a!==t.label?{text:a}:{}}}const z={selectorNotFound:`selector_not_found`,predicateFailed:`predicate_failed`};function B(t,n=`is`){return new e(`INVALID_ARGS`,P(t,n),{command:n,predicate:`absent`,rejectedOption:t})}function V(t,n,r=`is`){let i=`firstMatch`in n?n.firstMatch:void 0,a={command:r,reason:z.predicateFailed,predicate:`absent`,selector:t,matches:n.matches,observation:n.kind,...i?{firstMatch:i}:{},...n.kind===`sparse`?{snapshotQuality:n.quality}:{},...n.kind===`truncated`?{truncated:!0}:{}};if(n.kind===`present`){let i=n.matches>1;return new e(`COMMAND_FAILED`,`${r} absent failed for selector ${t}: ${n.matches} match${i?`es`:``} found`,{...a,...i?{hint:`Refine the selector to match no elements.`}:{}})}return new e(`COMMAND_FAILED`,`${r} absent could not prove absence for selector ${t}: ${n.kind===`sparse`?`capture was sparse`:`capture was truncated`}`,{...a,hint:`Retry after the accessibility capture is complete.`})}function H(n,r,i=`is`){let a=t(r),o=typeof a.details?.reason==`string`?a.details.reason:typeof a.details?.androidSnapshotHelperFailureReason==`string`?a.details.androidSnapshotHelperFailureReason:void 0;return new e(`COMMAND_FAILED`,`${i} absent could not prove absence for selector ${n}: capture was unreadable`,{command:i,reason:z.predicateFailed,predicate:`absent`,selector:n,matches:0,observation:`unreadable`,captureErrorCode:a.code,...o?{captureErrorReason:o}:{},hint:`Retry after the accessibility capture is readable.`},a)}export{N as a,I as c,x as d,_ as f,z as i,g as l,p as m,V as n,F as o,s as p,H as r,L as s,B as t,b as u};
@@ -0,0 +1 @@
1
+ import{C as e}from"./sdk-contracts.js";const t=`user-installed`;function n(e){return e??`user-installed`}function r(t){if(t===void 0)throw new e(`INVALID_ARGS`,`appsFilter must be resolved before executing the apps command`);return t}export{r as n,n as r,t};
@@ -0,0 +1,2 @@
1
+ import{C as e}from"./sdk-contracts.js";import{a as t,i as n,r}from"./sdk-batch-runner.js";import{l as i,u as a}from"./sdk-device.js";import{n as o,t as s}from"./launch-console.js";import"./observability.js";import{r as c}from"./diagnostics.js";import{n as l}from"./exec.js";import"./diagnostics2.js";import"./command.js";import{i as u,n as d}from"./retry.js";import{D as f,o as p}from"./host-file.js";import{f as m,t as h}from"./config2.js";import{a as g,o as _}from"./tool-provider.js";import{t as v}from"./physical-device-control.js";import{t as y}from"./simctl.js";import{n as b,r as x}from"./apps-simctl.js";import{m as S}from"./runner-client.js";import{t as C}from"./simulator.js";import{a as w,l as T,u as E}from"./app-resolution.js";import D from"node:path";function O(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=t.details??{};if(n.exitCode!==4)return!1;let r=String(n.stderr??``).toLowerCase();return r.includes(`fbsopenapplicationserviceerrordomain`)&&r.includes(`the request to open`)}async function k(e,t){let n=await _(y(e,[`get_app_container`,e.id,t]),{allowFailure:!0});if(n.exitCode!==0)return{installed:!1};let r=n.stdout.trim();if(!r)return{installed:!1};let i=await g(`plutil`,[`-extract`,`CFBundleExecutable`,`raw`,`-o`,`-`,`${r}/Info.plist`],{allowFailure:!0});if(i.exitCode!==0||!i.stdout.trim())return{installed:!0};let a=`${r}/${i.stdout.trim()}`,o=await g(`otool`,[`-l`,a],{allowFailure:!0});if(o.exitCode!==0)return{installed:!0};let s=o.stdout.toLowerCase();return{installed:!0,simulatorCompatible:s.includes(`iossimulator`)||s.includes(`platform 7`)}}function A(e){return e.installed?e.simulatorCompatible===!1?`ARCH_MISMATCH`:`PERSISTENT_LAUNCH_FAIL`:`APP_NOT_INSTALLED`}function j(e){switch(e){case`ARCH_MISMATCH`:return`The app binary was not built for the simulator platform. Rebuild with a simulator destination or use a physical device.`;case`APP_NOT_INSTALLED`:return`The app bundle is not installed on this simulator. Run install before open.`;case`PERSISTENT_LAUNCH_FAIL`:return`The simulator repeatedly refused to launch the app. Inspect crash logs in Console.app or ~/Library/Logs/DiagnosticReports/ and consider reinstalling the app.`;default:return`The simulator failed to launch the app. Retry with --debug and inspect diagnostics log for details.`}}const M=25e3;async function N(c,l,u){let d=u?.launchConsole?.trim(),f=u?.launchArgs;if(d&&(!i(c)||c.kind!==`simulator`))throw new e(`UNSUPPORTED_OPERATION`,o);if(a(c)){if(f&&f.length>0)throw new e(`UNSUPPORTED_OPERATION`,`--launch-args is not supported on macOS; launch arguments are currently iOS-only.`);await E(c,l,u);return}let p=u?.url?.trim();if(p){if(d)throw new e(`INVALID_ARGS`,s);if(!r(p))throw new e(`INVALID_ARGS`,`open <app> <url> requires a valid URL target`);if(c.kind===`simulator`){let e=!!f||n(p);if(u?.terminateRunningApp||e){let t=u?.appBundleId??await w(c,l);e?await z(c,t,{...f?{launchArgs:f}:{},...u?.terminateRunningApp?{terminateRunningApp:!0}:{}}):await R(c,t)}await P(c,p,void 0);return}let i=u?.appBundleId??await w(c,l),a=t(i,p);if(!a)throw new e(`INVALID_ARGS`,`Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.`);await W(c,a,{payloadUrl:p,launchArgs:f,runnerOptions:u?.runnerOptions});return}let m=l.trim();if(r(m)){if(d)throw new e(`INVALID_ARGS`,s);if(c.kind===`simulator`){await P(c,m,f);return}let n=t(u?.appBundleId,m);if(!n)throw new e(`INVALID_ARGS`,`Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.`);await W(c,n,{payloadUrl:m,launchArgs:f,runnerOptions:u?.runnerOptions});return}let h=u?.appBundleId??await w(c,l);if(c.kind===`simulator`){await z(c,h,{...d?{launchConsole:d}:{},...f?{launchArgs:f}:{},...u?.terminateRunningApp?{terminateRunningApp:!0}:{}});return}await W(c,h,{launchArgs:f,runnerOptions:u?.runnerOptions})}async function P(t,n,r){if(r&&r.length>0)throw new e(`INVALID_ARGS`,`--launch-args is not supported with iOS simulator URL opens (simctl openurl ignores launch args). Launch the app first with --launch-args, then issue the URL open in a separate call.`);await C(t),await b(t,[`openurl`,t.id,n])}async function F(e){a(e)||e.kind===`simulator`&&await C(e)}async function I(e,t,n){if(a(e)){await T(e,t);return}let r=await w(e,t);if(e.kind===`simulator`){await R(e,r);return}await L(r),await v(e).terminateApp(e,r,{runnerOptions:n,runRunnerCommand:S})}async function L(t){let{isIosSystemSurfaceHost:n,iosSystemSurfaceOpenRefusal:r}=await import(`./ios-system-surface.js`).then(e=>e.i);if(n(t))throw new e(`UNSUPPORTED_OPERATION`,r(t),{reason:`system-surface-host-not-openable`,appBundleId:t})}async function R(t,n){await L(n),await C(t);let r=x(t,[`terminate`,t.id,n]),i=await _(r,{allowFailure:!0,timeoutMs:m});if(i.exitCode!==0&&!i.stderr.toLowerCase().includes(`found nothing to terminate`))throw new e(`COMMAND_FAILED`,`xcrun exited with code ${i.exitCode}`,l(i,{cmd:`xcrun`,args:r}))}async function z(t,n,r){await L(n),await C(t);let i=0,a=d.fromTimeoutMs(h);try{await u(async({deadline:i})=>{if(i?.isExpired())throw new e(`COMMAND_FAILED`,`App launch deadline exceeded`,{timeoutMs:h});let a=x(t,B(t.id,n,r)),o=r?.launchConsole?await V(a,r.launchConsole):await _(a,{allowFailure:!0});if(o.exitCode!==0)throw new e(`COMMAND_FAILED`,`xcrun exited with code ${o.exitCode}`,l(o,{cmd:`xcrun`,args:a}))},{maxAttempts:10,baseDelayMs:1e3,maxDelayMs:5e3,jitter:.2,shouldRetry(e){return O(e)?(i+=1,i<3):!1}},{deadline:a})}catch(e){if(O(e)){let r=e,i=A(await k(t,n));r.details={...r.details,hint:j(i)}}throw e}}function B(e,t,n){let r=[`launch`];return n?.launchConsole&&r.push(`--console-pty`),n?.terminateRunningApp&&r.push(`--terminate-running-process`),r.push(e,t),n?.launchArgs&&n.launchArgs.length>0&&r.push(...n.launchArgs),r}async function V(t,n){await p(D.dirname(n));try{let e=await _(t,{allowFailure:!0,timeoutMs:M});return await H(n,e.stdout,e.stderr),e}catch(t){let r=(t instanceof e?t:void 0)?.details;if(r?.timeoutMs===M){let e=typeof r.stdout==`string`?r.stdout:``,t=typeof r.stderr==`string`?r.stderr:``;return await H(n,e,t),c({level:`warn`,phase:`ios_simulator_launch_console_capture_timeout`,data:{timeoutMs:M,logPath:n,stdoutBytes:Buffer.byteLength(e),stderrBytes:Buffer.byteLength(t)}}),{stdout:e,stderr:t,exitCode:0}}throw t}}async function H(e,t,n){await f(e,U(t,n))}function U(e,t){return!e||!t||e.endsWith(`
2
+ `)||e.endsWith(`\r`)?`${e}${t}`:`${e}\n${t}`}async function W(e,t,n){await L(t),await v(e).launchApp(e,t,{...n,runRunnerCommand:S})}export{N as n,F as r,I as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./app-launch.js";export{e as closeIosApp};