agent-device 0.20.10 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) 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.0.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.0.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.0.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.0.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.0.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.0.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 +49 -0
  12. package/apple/snapshot-bridge/SnapshotBridge.m +280 -0
  13. package/apple/snapshot-bridge/SnapshotBridgeRuntime.h +33 -0
  14. package/apple/snapshot-bridge/SnapshotBridgeRuntime.m +382 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +58 -0
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +19 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAlertVerification.swift +36 -0
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerStringNormalization.swift +8 -0
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +12 -1
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +100 -6
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +2 -2
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +16 -8
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +21 -88
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +124 -0
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +106 -103
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +6 -14
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +63 -91
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +13 -6
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +72 -155
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXElementTypes.swift +12 -0
  31. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +74 -78
  32. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +17 -9
  33. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +42 -11
  34. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +185 -461
  35. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +98 -0
  36. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +224 -164
  37. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationInvariant.swift +19 -0
  38. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTiming.swift +110 -0
  39. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +206 -0
  40. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +147 -25
  41. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +1 -0
  42. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +24 -307
  43. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +206 -0
  44. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +158 -0
  45. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +49 -16
  46. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +2 -11
  47. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +4 -19
  48. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +16 -20
  49. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +111 -0
  50. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +42 -81
  51. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +35 -82
  52. package/dist/apple/snapshot-presentation/Package.swift +21 -0
  53. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +56 -0
  54. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +259 -0
  55. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentation.swift +153 -0
  56. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationFailure.swift +27 -0
  57. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +91 -0
  58. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +161 -0
  59. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotScopePolicy.swift +53 -0
  60. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +242 -0
  61. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +97 -0
  62. package/dist/src/adapter.js +1 -0
  63. package/dist/src/adb-executor.js +2 -0
  64. package/dist/src/adb-failure.js +1 -0
  65. package/dist/src/adb-host.js +1 -0
  66. package/dist/src/adb.js +1 -0
  67. package/dist/src/agent-browser-lifecycle.js +1 -0
  68. package/dist/src/agent-browser-process-record.js +1 -0
  69. package/dist/src/agent-browser-provider.js +1 -0
  70. package/dist/src/agent-browser-tool.js +1 -1
  71. package/dist/src/agent-device-client.js +2 -2
  72. package/dist/src/ai-sdk.d.ts +2 -2
  73. package/dist/src/ai-sdk.js +1 -1
  74. package/dist/src/alert-contract.js +1 -0
  75. package/dist/src/alert-runtime.js +1 -0
  76. package/dist/src/android-adb.d.ts +27 -19
  77. package/dist/src/android-adb.js +1 -1
  78. package/dist/src/android-input-ownership.js +1 -0
  79. package/dist/src/android-system-chrome.js +1 -0
  80. package/dist/src/android.js +1 -1
  81. package/dist/src/api.js +11 -0
  82. package/dist/src/app-catalog.js +1 -0
  83. package/dist/src/app-deployment-resolution.js +2 -0
  84. package/dist/src/app-helpers.js +1 -1
  85. package/dist/src/app-inventory-contract.js +1 -0
  86. package/dist/src/app-inventory.js +1 -0
  87. package/dist/src/app-launch.js +2 -0
  88. package/dist/src/app-lifecycle-facade.js +1 -0
  89. package/dist/src/app-lifecycle.js +3 -6
  90. package/dist/src/app-lifecycle2.js +2 -2
  91. package/dist/src/app-lifecycle3.js +1 -0
  92. package/dist/src/app-log-files.js +1 -1
  93. package/dist/src/app-log-reconnect.js +1 -1
  94. package/dist/src/app-log-runtime.js +1 -4
  95. package/dist/src/app-log-runtime2.js +4 -0
  96. package/dist/src/app-parsers.js +4 -0
  97. package/dist/src/app-resolution-cache.js +1 -0
  98. package/dist/src/app-resolution-facade.js +1 -0
  99. package/dist/src/app-resolution.js +2 -2
  100. package/dist/src/app-state.js +1 -2
  101. package/dist/src/application-lifecycle-interaction.js +1 -0
  102. package/dist/src/application-lifecycle-runtime.js +1 -0
  103. package/dist/src/apps-simctl.js +1 -0
  104. package/dist/src/archive.js +4 -0
  105. package/dist/src/artifact-download.js +1 -0
  106. package/dist/src/artifacts.d.ts +6 -2
  107. package/dist/src/artifacts.js +1 -1
  108. package/dist/src/async-lifecycle.js +1 -0
  109. package/dist/src/audio-probe-result.js +1 -0
  110. package/dist/src/audio-probe-runtime.js +1 -0
  111. package/dist/src/audio-probe-support.js +1 -0
  112. package/dist/src/auth-session.js +1 -1
  113. package/dist/src/auth.js +1 -1
  114. package/dist/src/back-mode.js +1 -0
  115. package/dist/src/{url.js → base-url.js} +1 -1
  116. package/dist/src/boot-diagnostics.js +2 -2
  117. package/dist/src/byte-limit-stream.js +1 -1
  118. package/dist/src/capabilities.js +1 -0
  119. package/dist/src/capture.js +1 -0
  120. package/dist/src/catalog.js +1 -0
  121. package/dist/src/cli-command-aliases.js +1 -0
  122. package/dist/src/cli-config.js +1 -1
  123. package/dist/src/cli-help.js +69 -50
  124. package/dist/src/cli-output.js +1 -1
  125. package/dist/src/cli-runner.js +1 -1
  126. package/dist/src/cli.js +4 -6
  127. package/dist/src/click-button.js +1 -0
  128. package/dist/src/client-metro-companion.js +1 -0
  129. package/dist/src/client-metro.js +1 -1
  130. package/dist/src/client-types.d.ts +255 -231
  131. package/dist/src/clipboard.js +1 -0
  132. package/dist/src/code-signature-cache.js +1 -0
  133. package/dist/src/code-signature.js +1 -0
  134. package/dist/src/color.js +1 -0
  135. package/dist/src/command-metadata.js +1 -1
  136. package/dist/src/command-schema.js +3 -3
  137. package/dist/src/command-surface.js +1 -1
  138. package/dist/src/command-tools.js +2 -2
  139. package/dist/src/command.js +1 -0
  140. package/dist/src/compatibility-policy.js +1 -0
  141. package/dist/src/config.js +1 -1
  142. package/dist/src/config2.js +1 -0
  143. package/dist/src/connection-runtime.js +1 -1
  144. package/dist/src/connection.js +5 -5
  145. package/dist/src/contracts.d.ts +1 -1
  146. package/dist/src/contracts.js +1 -1
  147. package/dist/src/daemon-client-lifecycle.js +1 -0
  148. package/dist/src/daemon-process.js +1 -0
  149. package/dist/src/daemon-registration.js +1 -0
  150. package/dist/src/daemon-shutdown-report.js +1 -1
  151. package/dist/src/daemon.js +2 -2
  152. package/dist/src/debug-symbols-facade.js +5 -0
  153. package/dist/src/deploy-result-target.js +1 -0
  154. package/dist/src/device-claim-inspection.js +1 -1
  155. package/dist/src/device-claim-rule.js +1 -0
  156. package/dist/src/device-input-state.d.ts +190 -3
  157. package/dist/src/device-inventory-context.js +1 -0
  158. package/dist/src/device-isolation.js +1 -0
  159. package/dist/src/device-release.js +1 -0
  160. package/dist/src/device-rotation.js +1 -0
  161. package/dist/src/device-selection-resolver.js +1 -0
  162. package/dist/src/device-session.js +1 -0
  163. package/dist/src/device.js +1 -1
  164. package/dist/src/device2.js +3 -2
  165. package/dist/src/diagnostics.js +3 -0
  166. package/dist/src/diagnostics2.js +1 -0
  167. package/dist/src/dispatch-resolve.js +1 -0
  168. package/dist/src/doctor-facade.js +1 -0
  169. package/dist/src/doctor-output.js +1 -0
  170. package/dist/src/doctor.js +1 -0
  171. package/dist/src/doctor2.js +1 -0
  172. package/dist/src/doctor3.js +1 -0
  173. package/dist/src/durable-resource.js +1 -0
  174. package/dist/src/entities.js +1 -1
  175. package/dist/src/error.js +2 -0
  176. package/dist/src/exec.js +1 -0
  177. package/dist/src/file.js +1 -0
  178. package/dist/src/find.js +1 -1
  179. package/dist/src/finders.js +1 -1
  180. package/dist/src/format.js +2 -0
  181. package/dist/src/generic-settle.js +1 -1
  182. package/dist/src/generic.js +1 -1
  183. package/dist/src/gesture-admission.js +1 -0
  184. package/dist/src/gesture-plan-types.js +1 -0
  185. package/dist/src/gesture-plan.js +1 -0
  186. package/dist/src/gesture-runtime.js +1 -0
  187. package/dist/src/harmonyos.js +1 -1
  188. package/dist/src/hdc.js +1 -1
  189. package/dist/src/helper.js +2 -2
  190. package/dist/src/host-file.js +1 -0
  191. package/dist/src/human-control-contract.js +1 -0
  192. package/dist/src/human-control.js +1 -0
  193. package/dist/src/index.d.ts +1 -1
  194. package/dist/src/index.js +1 -1
  195. package/dist/src/input-actions.js +1 -4
  196. package/dist/src/input-actions2.js +2 -1
  197. package/dist/src/install-artifact-facade.js +1 -0
  198. package/dist/src/install-source-network-transport.js +1 -0
  199. package/dist/src/install-source.d.ts +3 -10
  200. package/dist/src/install-source2.js +1 -1
  201. package/dist/src/interaction-positionals.js +1 -0
  202. package/dist/src/interaction-ref-policy.js +1 -0
  203. package/dist/src/interaction.js +1 -1
  204. package/dist/src/interaction2.js +1 -1
  205. package/dist/src/interactor-operation-catalog.js +1 -0
  206. package/dist/src/interactor-types.js +1 -0
  207. package/dist/src/interactor.js +6 -2
  208. package/dist/src/interactor2.js +1 -1
  209. package/dist/src/interactors.js +1 -1
  210. package/dist/src/internal/bin.d.ts +1 -1
  211. package/dist/src/internal/bin.js +1 -2
  212. package/dist/src/internal/companion-tunnel.d.ts +1 -1
  213. package/dist/src/internal/companion-tunnel.js +1 -1
  214. package/dist/src/internal/daemon.d.ts +1 -1
  215. package/dist/src/internal/daemon.js +2 -4
  216. package/dist/src/internal/png-worker.d.ts +4 -4
  217. package/dist/src/internal/png-worker.js +1 -1
  218. package/dist/src/internal/run-script-http-child.d.ts +4 -0
  219. package/dist/src/internal/run-script-http-child.js +1 -0
  220. package/dist/src/internal/update-check-entry.d.ts +1 -1
  221. package/dist/src/inventory.js +4 -4
  222. package/dist/src/inventory2.js +1 -1
  223. package/dist/src/inventory3.js +1 -1
  224. package/dist/src/inventory5.js +1 -1
  225. package/dist/src/inventory6.js +1 -1
  226. package/dist/src/ios-client.js +16 -0
  227. package/dist/src/ios-snapshot-acquisition.js +1 -0
  228. package/dist/src/ios-snapshot-adapter.js +1 -0
  229. package/dist/src/ios-snapshot-planning.js +1 -0
  230. package/dist/src/ios-snapshot-runtime.js +1 -0
  231. package/dist/src/json.js +1 -0
  232. package/dist/src/keyboard-actions.js +1 -0
  233. package/dist/src/launch-console.js +1 -0
  234. package/dist/src/lease-context.js +1 -1
  235. package/dist/src/lease-scope.js +1 -0
  236. package/dist/src/lease.js +1 -1
  237. package/dist/src/limrun-runtime-dependencies.js +1 -1
  238. package/dist/src/limrun.d.ts +1610 -7
  239. package/dist/src/limrun.js +1 -1
  240. package/dist/src/linux.js +1 -1
  241. package/dist/src/local-interactor-operation-set.js +1 -0
  242. package/dist/src/location-coordinates.js +1 -1
  243. package/dist/src/logcat.js +1 -1
  244. package/dist/src/macos-facade.js +1 -0
  245. package/dist/src/managed-device-scope.js +1 -0
  246. package/dist/src/mechanics.js +19 -0
  247. package/dist/src/metro.d.ts +4 -2
  248. package/dist/src/metro.js +1 -1
  249. package/dist/src/metro2.js +1 -1
  250. package/dist/src/mobile-snapshot-semantics.js +1 -1
  251. package/dist/src/multitouch-support.js +1 -0
  252. package/dist/src/numeric.js +1 -0
  253. package/dist/src/observability.js +1 -1
  254. package/dist/src/observation.js +2 -0
  255. package/dist/src/output-path.js +1 -1
  256. package/dist/src/owner-identity.js +3 -1
  257. package/dist/src/parameterized-recorded-fill.js +1 -0
  258. package/dist/src/parser.js +1 -1
  259. package/dist/src/perf-facade.js +2 -0
  260. package/dist/src/perf-runtime-operation-builder.js +1 -0
  261. package/dist/src/perf-runtime-plan.js +1 -0
  262. package/dist/src/perf-runtime.js +1 -0
  263. package/dist/src/perf.js +1 -4
  264. package/dist/src/physical-device-control.js +1 -1
  265. package/dist/src/physical-device-facade.js +1 -0
  266. package/dist/src/platform-request-scope.js +1 -0
  267. package/dist/src/platform-runtime-android-adb-host.js +1 -0
  268. package/dist/src/platform-runtime-android-mechanics.js +1 -0
  269. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  270. package/dist/src/platform-runtime-app-log-process.js +1 -1
  271. package/dist/src/platform-runtime-apple-resources.js +1 -0
  272. package/dist/src/platform-runtime-host.js +1 -1
  273. package/dist/src/platform-runtime-managed-owner.js +1 -0
  274. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  275. package/dist/src/platform-runtime-open-target.js +1 -1
  276. package/dist/src/platform-runtime-operation-host.js +4 -4
  277. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  278. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  279. package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
  280. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  281. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  282. package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
  283. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  284. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  285. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -0
  286. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  287. package/dist/src/platform-runtime-unavailable.js +1 -0
  288. package/dist/src/platform-runtime.js +1 -1
  289. package/dist/src/platform-runtime2.js +1 -1
  290. package/dist/src/plist.js +1 -1
  291. package/dist/src/png-worker-contract.js +1 -1
  292. package/dist/src/prepare-kind.js +1 -0
  293. package/dist/src/process-exit.js +1 -1
  294. package/dist/src/process.js +1 -0
  295. package/dist/src/provider-device-runtime.js +1 -0
  296. package/dist/src/provider-session-ownership.js +2 -0
  297. package/dist/src/provider-webdriver.js +1 -1
  298. package/dist/src/provider.js +1 -1
  299. package/dist/src/providers.js +1 -0
  300. package/dist/src/proxy.js +2 -2
  301. package/dist/src/react-native-overlay.js +1 -0
  302. package/dist/src/react-native.js +1 -1
  303. package/dist/src/record-runtime.js +1 -1
  304. package/dist/src/record-trace.js +1 -1
  305. package/dist/src/rect-center.js +1 -0
  306. package/dist/src/register-builtins.js +1 -0
  307. package/dist/src/registry.js +39 -28
  308. package/dist/src/remote-config2.js +1 -1
  309. package/dist/src/replay-divergence.js +2 -0
  310. package/dist/src/replay.js +2 -2
  311. package/dist/src/reporting.js +8 -8
  312. package/dist/src/request-admission.js +1 -0
  313. package/dist/src/request-cancel.js +1 -0
  314. package/dist/src/request-cancellation.js +1 -0
  315. package/dist/src/request-progress-protocol.js +1 -0
  316. package/dist/src/request-providers.js +1 -0
  317. package/dist/src/request-runtime-binding.js +1 -0
  318. package/dist/src/request.js +1 -0
  319. package/dist/src/result-serialization.js +1 -0
  320. package/dist/src/retry.js +1 -0
  321. package/dist/src/rolldown-runtime.js +1 -1
  322. package/dist/src/runner-cache-metadata.js +2 -0
  323. package/dist/src/runner-client.js +1 -1
  324. package/dist/src/runner-disposal.js +1 -1
  325. package/dist/src/runner-operations-facade.js +1 -0
  326. package/dist/src/runner-owner-facade.js +1 -0
  327. package/dist/src/runner-owner-state.js +1 -0
  328. package/dist/src/runner-presentation.js +1 -0
  329. package/dist/src/runner-selector-query.js +1 -0
  330. package/dist/src/runner.js +1 -0
  331. package/dist/src/{runtime-transport.js → runtime-transport-hints.js} +1 -1
  332. package/dist/src/runtime.js +3 -3
  333. package/dist/src/runtime2.js +4 -4
  334. package/dist/src/runtime3.js +1 -1
  335. package/dist/src/runtime4.js +4 -3
  336. package/dist/src/runtime5.js +1 -1
  337. package/dist/src/runtime6.js +1 -1
  338. package/dist/src/runtime7.js +1 -1
  339. package/dist/src/runtime8.js +1 -1
  340. package/dist/src/runtime9.js +1 -1
  341. package/dist/src/scoped-provider.js +1 -1
  342. package/dist/src/screen-recording-completion.js +1 -0
  343. package/dist/src/screen-recording-live-handle.js +1 -0
  344. package/dist/src/screen-recording-options.js +1 -0
  345. package/dist/src/screen-recording-resource-recovery.js +1 -0
  346. package/dist/src/screen-recording-runtime.js +1 -0
  347. package/dist/src/screenshot-density.js +1 -1
  348. package/dist/src/screenshot-result.js +1 -6
  349. package/dist/src/screenshot-runtime.js +1 -0
  350. package/dist/src/screenshot.js +1 -1
  351. package/dist/src/screenshot2.js +1 -0
  352. package/dist/src/screenshot3.js +5 -0
  353. package/dist/src/script.js +1 -0
  354. package/dist/src/scroll-command.js +1 -0
  355. package/dist/src/scroll-gesture.js +1 -0
  356. package/dist/src/scroll-indicator.js +1 -0
  357. package/dist/src/sdk-batch-runner.d.ts +23 -6
  358. package/dist/src/sdk-batch-runner.js +2 -3
  359. package/dist/src/sdk-batch.js +2 -0
  360. package/dist/src/sdk-contracts.d.ts +127 -41
  361. package/dist/src/sdk-contracts.js +2 -2
  362. package/dist/src/sdk-device.js +1 -1
  363. package/dist/src/sdk-finders.js +1 -1
  364. package/dist/src/sdk-io.js +1 -1
  365. package/dist/src/sdk-remote-config.d.ts +1 -1
  366. package/dist/src/sdk-remote-config.js +1 -1
  367. package/dist/src/sdk-selectors.d.ts +472 -144
  368. package/dist/src/sdk-selectors.js +1 -1
  369. package/dist/src/selection.js +1 -0
  370. package/dist/src/selector-runtime.js +1 -1
  371. package/dist/src/selectors.js +1 -1
  372. package/dist/src/semantic-index.js +1 -0
  373. package/dist/src/server.js +4 -4
  374. package/dist/src/session-allocation.js +1 -0
  375. package/dist/src/session-artifact-paths.js +1 -0
  376. package/dist/src/session-paths.js +1 -0
  377. package/dist/src/session-repair-tombstone.js +1 -0
  378. package/dist/src/session-routing.js +1 -0
  379. package/dist/src/session-runtime-admission.js +1 -0
  380. package/dist/src/session-snapshot.js +1 -0
  381. package/dist/src/session-store.js +4 -0
  382. package/dist/src/session-target-evidence.js +1 -1
  383. package/dist/src/session2.js +5 -27
  384. package/dist/src/settings.js +1 -0
  385. package/dist/src/shared.js +2 -2
  386. package/dist/src/simctl-facade.js +1 -0
  387. package/dist/src/simctl.js +1 -1
  388. package/dist/src/simulator-facade.js +1 -0
  389. package/dist/src/simulator.js +1 -1
  390. package/dist/src/snapshot-capture-annotations.js +1 -0
  391. package/dist/src/snapshot-desktop-projection.js +1 -0
  392. package/dist/src/snapshot-diagnostics.js +1 -0
  393. package/dist/src/snapshot-process.js +1 -0
  394. package/dist/src/snapshot-quality-backend-capabilities.js +1 -0
  395. package/dist/src/snapshot-quality-verdict.js +1 -0
  396. package/dist/src/snapshot-runtime-binding.js +1 -0
  397. package/dist/src/snapshot-runtime.js +1 -1
  398. package/dist/src/snapshot-scope.js +1 -1
  399. package/dist/src/snapshot-state.js +1 -0
  400. package/dist/src/snapshot.js +1 -8
  401. package/dist/src/snapshot2.js +1 -1
  402. package/dist/src/snapshot3.js +1 -1
  403. package/dist/src/snapshot4.js +1 -0
  404. package/dist/src/src.js +1 -1
  405. package/dist/src/src2.js +1 -1
  406. package/dist/src/src3.js +1 -2
  407. package/dist/src/src4.js +1 -1
  408. package/dist/src/src5.js +1 -0
  409. package/dist/src/src6.js +1 -0
  410. package/dist/src/src7.js +2 -0
  411. package/dist/src/src8.js +115 -0
  412. package/dist/src/startup-recovery-fence.js +1 -0
  413. package/dist/src/status-markers.js +1 -0
  414. package/dist/src/string-enum.js +1 -1
  415. package/dist/src/success-text.js +1 -0
  416. package/dist/src/surface-snapshot.js +1 -0
  417. package/dist/src/surface-snapshot2.js +1 -0
  418. package/dist/src/takeover.js +5 -0
  419. package/dist/src/tool-provider-facade.js +1 -0
  420. package/dist/src/tool-provider.js +4 -3
  421. package/dist/src/tool-provider2.js +1 -1
  422. package/dist/src/tool-provider3.js +1 -1
  423. package/dist/src/toolchain-probe.js +2 -0
  424. package/dist/src/touch-runtime.js +1 -0
  425. package/dist/src/transport.js +3 -0
  426. package/dist/src/tree.js +1 -0
  427. package/dist/src/ttl-memo.js +1 -0
  428. package/dist/src/tv-remote.js +1 -0
  429. package/dist/src/type-text-runtime.js +1 -0
  430. package/dist/src/undici.js +99 -0
  431. package/dist/src/update-check.js +1 -1
  432. package/dist/src/verified-file.js +1 -1
  433. package/dist/src/version.js +1 -1
  434. package/dist/src/video.js +2 -2
  435. package/dist/src/web.js +2 -1
  436. package/dist/src/web2.js +1 -0
  437. package/dist/src/webdriver-ios-snapshot.js +1 -0
  438. package/dist/src/webdriver-source.js +1 -0
  439. package/linux/atspi-dump.py +54 -9
  440. package/package.json +56 -34
  441. package/server.json +9 -3
  442. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.10.apk.sha256 +0 -1
  443. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk +0 -0
  444. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk.sha256 +0 -1
  445. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +0 -4
  446. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -168
  447. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -6
  448. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +0 -4
  449. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +0 -4
  450. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentation.swift +0 -183
  451. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationTests.swift +0 -0
  452. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -4
  453. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +0 -4
  454. package/dist/src/appearance.js +0 -1
  455. package/dist/src/apps.js +0 -5
  456. package/dist/src/audio-probe.js +0 -1
  457. package/dist/src/cli-grammar.js +0 -1
  458. package/dist/src/command-catalog.js +0 -1
  459. package/dist/src/debug-symbols.js +0 -5
  460. package/dist/src/device-input-state.js +0 -2
  461. package/dist/src/device-ready.js +0 -1
  462. package/dist/src/dispatch.js +0 -1
  463. package/dist/src/handler-utils.js +0 -1
  464. package/dist/src/helper-package-install.js +0 -1
  465. package/dist/src/host-process.js +0 -3
  466. package/dist/src/ime-lifecycle.js +0 -2
  467. package/dist/src/ime-recovery-marker.js +0 -1
  468. package/dist/src/input-actions3.js +0 -1
  469. package/dist/src/install-artifact.js +0 -1
  470. package/dist/src/install-artifact2.js +0 -1
  471. package/dist/src/interaction-common.js +0 -1
  472. package/dist/src/interaction-runtime.js +0 -1
  473. package/dist/src/interaction-snapshot.js +0 -1
  474. package/dist/src/manifest.js +0 -1
  475. package/dist/src/method-scope.js +0 -1
  476. package/dist/src/png-resize.js +0 -1
  477. package/dist/src/process-lock.js +0 -1
  478. package/dist/src/runner-lease.js +0 -1
  479. package/dist/src/runner-sequence.js +0 -1
  480. package/dist/src/script-source-bundle.js +0 -16
  481. package/dist/src/sdk-android-adb.d.ts +0 -245
  482. package/dist/src/sdk-android-adb.js +0 -4
  483. package/dist/src/sdk.js +0 -1
  484. package/dist/src/setting-state.js +0 -1
  485. package/dist/src/shell-quote.js +0 -1
  486. package/dist/src/snapshot-session.js +0 -1
  487. package/dist/src/timing-safe-equal.js +0 -1
  488. package/dist/src/unsupported-interactor.js +0 -1
  489. package/dist/src/verdict.js +0 -1
  490. /package/dist/src/{recording-telemetry.js → telemetry.js} +0 -0
@@ -1,2 +1,2 @@
1
1
  import{t as e}from"./entities.js";const t=new Set(`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-`),n=new Set([` `,` `,`
2
- `,`\r`]),r=new Set([`__defineGetter__`,`__defineSetter__`,`__proto__`,`constructor`,`prototype`]);function i(e,t={}){let n=t.maxDocumentChars??134217728;if(e.length>n)throw Error(`XML document exceeds maximum supported size of ${n} characters.`);return new a(e).parse()}var a=class{roots=[];stack=[];index=0;xml;constructor(e){this.xml=e}parse(){for(this.skipByteOrderMark();this.index<this.xml.length;)this.readNextToken();return this.assertFullyClosed(),this.roots}readNextToken(){if(this.xml[this.index]!==`<`){this.readText();return}this.resolveMarkupReader()()}resolveMarkupReader(){return this.startsWith(`<!--`)?()=>this.skipUntil(`-->`,`Comment is not closed.`):this.startsWith(`<?`)?()=>this.skipUntil(`?>`,`Processing instruction is not closed.`):this.startsWith(`<![CDATA[`)?()=>this.readCdata():this.startsWith(`<!`)?()=>this.skipDeclaration():this.startsWith(`</`)?()=>this.readClosingTag():()=>this.readOpeningTag()}assertFullyClosed(){if(this.stack.length>0){let e=this.stack[this.stack.length-1];throw Error(`Unclosed XML tag <${e?.name??`unknown`}>.`)}}skipByteOrderMark(){this.xml.charCodeAt(0)===65279&&(this.index=1)}readOpeningTag(){this.index+=1,this.skipWhitespace();let e=this.readRequiredName(`Missing XML tag name at offset ${this.index}.`),{attributes:t,selfClosing:n}=this.readOpeningTagBody(),r={name:e,attributes:t,text:null,children:[]};this.addNode(r),n||this.pushOpenNode(r)}readOpeningTagBody(){let e={};for(;;){this.skipWhitespace();let t=this.readOpeningTagEnd();if(t)return{attributes:e,selfClosing:t===`self-closing`};let n=this.readAttribute();e[n.name]=n.value}}readOpeningTagEnd(){if(this.index>=this.xml.length)throw Error(`Opening XML tag is not closed.`);return this.xml[this.index]===`>`?(this.index+=1,`open`):this.xml[this.index]===`/`&&this.xml[this.index+1]===`>`?(this.index+=2,`self-closing`):null}readAttribute(){let e=this.readRequiredName(`Invalid XML attribute at offset ${this.index}.`);if(f(e),this.skipWhitespace(),this.xml[this.index]!==`=`)throw Error(`Missing value for XML attribute "${e}".`);return this.index+=1,this.skipWhitespace(),{name:e,value:this.readAttributeValue(e)}}pushOpenNode(e){if(this.stack.length>=256)throw Error(`Maximum XML nesting depth of 256 exceeded.`);this.stack.push(e)}readClosingTag(){this.index+=2,this.skipWhitespace();let e=this.readName();if(this.skipWhitespace(),this.xml[this.index]!==`>`)throw Error(`Closing XML tag </${e}> is not closed.`);this.index+=1;let t=this.stack.pop();if(!t)throw Error(`Unexpected closing XML tag </${e}>.`);if(t.name!==e)throw Error(`Expected </${t.name}> before </${e}>.`)}readText(){let e=this.xml.indexOf(`<`,this.index),t=e===-1?this.xml.length:e;this.appendText(this.xml.slice(this.index,t),!0),this.index=t}readCdata(){let e=this.index+9,t=this.xml.indexOf(`]]>`,e);if(t===-1)throw Error(`CDATA section is not closed.`);this.appendText(this.xml.slice(e,t),!1),this.index=t+3}appendText(t,n){let r=t.trim();if(!r)return;let i=this.stack[this.stack.length-1];i&&(i.text=`${i.text??``}${n?e(r):r}`)}addNode(e){let t=this.stack[this.stack.length-1];t?t.children.push(e):this.roots.push(e)}readName(){let e=this.index;for(;this.index<this.xml.length&&o(this.xml[this.index]);)this.index+=1;return this.xml.slice(e,this.index)}readRequiredName(e){let t=this.readName();if(!t)throw Error(e);return t}readAttributeValue(t){let n=this.xml[this.index];if(n!==`"`&&n!==`'`)throw Error(`XML attribute "${t}" must use a quoted value.`);this.index+=1;let r=this.index,i=this.xml.indexOf(n,r);if(i===-1)throw Error(`XML attribute "${t}" is not closed.`);return this.index=i+1,e(this.xml.slice(r,i).trim())}skipDeclaration(){let e={quote:null,bracketDepth:0};for(let t=this.index+2;t<this.xml.length;t+=1)if(c(e,this.xml[t])){this.index=t+1;return}throw Error(`XML declaration is not closed.`)}skipUntil(e,t){let n=this.xml.indexOf(e,this.index+e.length);if(n===-1)throw Error(t);this.index=n+e.length}skipWhitespace(){for(;this.index<this.xml.length&&s(this.xml[this.index]);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}};function o(e){return e!==void 0&&t.has(e)}function s(e){return e!==void 0&&n.has(e)}function c(e,t){return t===void 0||l(e,t)?!1:(u(e,t),d(e,t))}function l(e,t){return e.quote?(t===e.quote&&(e.quote=null),!0):t===`"`||t===`'`?(e.quote=t,!0):!1}function u(e,t){if(t===`[`){e.bracketDepth+=1;return}t===`]`&&e.bracketDepth>0&&--e.bracketDepth}function d(e,t){return t===`>`&&e.bracketDepth===0}function f(e){if(r.has(e))throw Error(`Unsupported XML attribute name "${e}".`)}export{i as t};
2
+ `,`\r`]),r=new Set([`__defineGetter__`,`__defineSetter__`,`__proto__`,`constructor`,`prototype`]);function i(e,t={}){let n=t.maxDocumentChars??134217728;if(e.length>n)throw Error(`XML document exceeds maximum supported size of ${n} characters.`);return new a(e).parse()}var a=class{roots=[];stack=[];index=0;xml;constructor(e){this.xml=e}parse(){for(this.skipByteOrderMark();this.index<this.xml.length;)this.readNextToken();return this.assertFullyClosed(),this.roots}readNextToken(){if(this.xml[this.index]!==`<`){this.readText();return}this.resolveMarkupReader()()}resolveMarkupReader(){return this.startsWith(`<!--`)?()=>this.skipUntil(`-->`,`Comment is not closed.`):this.startsWith(`<?`)?()=>this.skipUntil(`?>`,`Processing instruction is not closed.`):this.startsWith(`<![CDATA[`)?()=>this.readCdata():this.startsWith(`<!`)?()=>this.skipDeclaration():this.startsWith(`</`)?()=>this.readClosingTag():()=>this.readOpeningTag()}assertFullyClosed(){if(this.stack.length>0){let e=this.stack.at(-1);throw Error(`Unclosed XML tag <${e?.name??`unknown`}>.`)}}skipByteOrderMark(){this.xml.charCodeAt(0)===65279&&(this.index=1)}readOpeningTag(){this.index+=1,this.skipWhitespace();let e=this.readRequiredName(`Missing XML tag name at offset ${this.index}.`),{attributes:t,selfClosing:n}=this.readOpeningTagBody(),r={name:e,attributes:t,text:null,children:[]};this.addNode(r),n||this.pushOpenNode(r)}readOpeningTagBody(){let e={};for(;;){this.skipWhitespace();let t=this.readOpeningTagEnd();if(t)return{attributes:e,selfClosing:t===`self-closing`};let n=this.readAttribute();e[n.name]=n.value}}readOpeningTagEnd(){if(this.index>=this.xml.length)throw Error(`Opening XML tag is not closed.`);return this.xml[this.index]===`>`?(this.index+=1,`open`):this.xml[this.index]===`/`&&this.xml[this.index+1]===`>`?(this.index+=2,`self-closing`):null}readAttribute(){let e=this.readRequiredName(`Invalid XML attribute at offset ${this.index}.`);if(f(e),this.skipWhitespace(),this.xml[this.index]!==`=`)throw Error(`Missing value for XML attribute "${e}".`);return this.index+=1,this.skipWhitespace(),{name:e,value:this.readAttributeValue(e)}}pushOpenNode(e){if(this.stack.length>=256)throw Error(`Maximum XML nesting depth of 256 exceeded.`);this.stack.push(e)}readClosingTag(){this.index+=2,this.skipWhitespace();let e=this.readName();if(this.skipWhitespace(),this.xml[this.index]!==`>`)throw Error(`Closing XML tag </${e}> is not closed.`);this.index+=1;let t=this.stack.pop();if(!t)throw Error(`Unexpected closing XML tag </${e}>.`);if(t.name!==e)throw Error(`Expected </${t.name}> before </${e}>.`)}readText(){let e=this.xml.indexOf(`<`,this.index),t=e===-1?this.xml.length:e;this.appendText(this.xml.slice(this.index,t),!0),this.index=t}readCdata(){let e=this.index+9,t=this.xml.indexOf(`]]>`,e);if(t===-1)throw Error(`CDATA section is not closed.`);this.appendText(this.xml.slice(e,t),!1),this.index=t+3}appendText(t,n){let r=t.trim();if(!r)return;let i=this.stack.at(-1);i&&(i.text=`${i.text??``}${n?e(r):r}`)}addNode(e){let t=this.stack.at(-1);t?t.children.push(e):this.roots.push(e)}readName(){let e=this.index;for(;this.index<this.xml.length&&o(this.xml[this.index]);)this.index+=1;return this.xml.slice(e,this.index)}readRequiredName(e){let t=this.readName();if(!t)throw Error(e);return t}readAttributeValue(t){let n=this.xml[this.index];if(n!==`"`&&n!==`'`)throw Error(`XML attribute "${t}" must use a quoted value.`);this.index+=1;let r=this.index,i=this.xml.indexOf(n,r);if(i===-1)throw Error(`XML attribute "${t}" is not closed.`);return this.index=i+1,e(this.xml.slice(r,i).trim())}skipDeclaration(){let e={quote:null,bracketDepth:0};for(let t=this.index+2;t<this.xml.length;t+=1)if(c(e,this.xml[t])){this.index=t+1;return}throw Error(`XML declaration is not closed.`)}skipUntil(e,t){let n=this.xml.indexOf(e,this.index+e.length);if(n===-1)throw Error(t);this.index=n+e.length}skipWhitespace(){for(;this.index<this.xml.length&&s(this.xml[this.index]);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}};function o(e){return e!==void 0&&t.has(e)}function s(e){return e!==void 0&&n.has(e)}function c(e,t){return t===void 0||l(e,t)?!1:(u(e,t),d(e,t))}function l(e,t){return e.quote?(t===e.quote&&(e.quote=null),!0):t===`"`||t===`'`?(e.quote=t,!0):!1}function u(e,t){if(t===`[`){e.bracketDepth+=1;return}t===`]`&&e.bracketDepth>0&&--e.bracketDepth}function d(e,t){return t===`>`&&e.bracketDepth===0}function f(e){if(r.has(e))throw Error(`Unsupported XML attribute name "${e}".`)}export{i as t};
@@ -0,0 +1,2 @@
1
+ import{y as e}from"./sdk-contracts.js";import{E as t}from"./sdk-batch-runner.js";import{c as n,l as r,u as i,v as a}from"./sdk-device.js";import{nr as o}from"./sdk-batch.js";import{c as s,i as c,n as l}from"./exec.js";import"./command.js";import{t as u}from"./parser.js";import{n as d,t as f}from"./numeric.js";import{C as p,D as ee,g as te,i as ne,m,o as h,u as g,w as re,y as _}from"./host-file.js";import{a as v,o as y}from"./tool-provider.js";import{a as ie,i as ae,t as oe}from"./physical-device-control.js";import{t as b}from"./simctl.js";import{t as se}from"./plist.js";import x from"node:path";import{fileURLToPath as S}from"node:url";function C(e,t){for(let n of e){if(t(n))return n;let e=C(n.children,t);if(e)return e}}function w(e,t){let n=[];for(let r of e)t(r)&&n.push(r),n.push(...w(r.children,t));return n}function ce(e,t){return e.children.find(e=>e.name===t)?.text??null}function T(e,t){let n=C(e,e=>e.name===`schema`&&e.attributes.name===t);return n?n.children.filter(e=>e.name===`col`).map(e=>ce(e,`mnemonic`)??``):[]}function E(e){if(!e||e.children.some(e=>e.name===`sentinel`)||!e.text)return null;let t=Number(e.text);return Number.isFinite(t)?t:null}function D(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.numberValue??null:E(e):null}function le(e){return new Map(w(e,e=>!!e.attributes.id).flatMap(e=>{let t=e.attributes.id;return t?[[t,e]]:[]}))}function O(e,t){if(e)return e.attributes.ref?t.get(e.attributes.ref):e}const k=`xctrace-animation-hitches`;function ue(e){let t=de(e.frameLifetimesXml),n=fe(e.displayInfoXml),r=pe(e.hitchesXml).filter(t=>ge(t,e.processIds,e.processNames)),i=r.length,a=Math.max(0,Math.round(Date.parse(e.windowEndedAt)-Date.parse(e.windowStartedAt))),s=_e(r,Date.parse(e.windowStartedAt));return{droppedFramePercent:t>0?d(i/t*100):0,droppedFrameCount:i,totalFrameCount:t,sampleWindowMs:a,windowStartedAt:e.windowStartedAt,windowEndedAt:e.windowEndedAt,measuredAt:e.measuredAt,method:k,matchedProcesses:o(r.map(e=>e.processName).filter(e=>typeof e==`string`&&e.length>0)),frameDeadlineMs:n===void 0?void 0:f(1e3/n),refreshRateHz:n,worstWindows:s.length>0?s:void 0}}function de(e){return ye(e,`hitches-frame-lifetimes`).length}function fe(e){if(!e)return;let{rows:t,schema:n}=A(e,`device-display-info`),r=n.indexOf(`max-refresh-rate`);if(r<0)return;let i=new Map;for(let e of t){j(e.children,i);let t=D(e.children[r],i);if(t!==null&&t>0)return t}}function pe(e){let t=u(e),n=me(t);if(!n)return[];let r=new Map;return w(t,e=>e.name===`row`).map(e=>he(e,n,r)).filter(e=>!!e)}function me(e){let t=T(e,`hitches`),n={start:t.indexOf(`start`),duration:t.indexOf(`duration`),process:t.indexOf(`process`),isSystem:t.indexOf(`is-system`)};return Object.values(n).every(e=>e>=0)?n:null}function he(e,t,n){if(j(e.children,n),be(e.children[t.isSystem],n)===!0)return null;let r=D(e.children[t.start],n),i=D(e.children[t.duration],n);if(r===null||i===null)return null;let a=xe(e.children[t.process],n);return{startNs:r,durationNs:i,pid:a?.pid,processName:a?.name}}function ge(e,t,n){return e.pid!==void 0&&t.includes(e.pid)?!0:e.processName?n.includes(e.processName):!1}function _e(e,t){if(e.length===0)return[];let n=[...e].sort((e,t)=>e.startNs-t.startNs),r=[],i=[];for(let e of n){let t=i.at(-1);if(!t||e.startNs-(t.startNs+t.durationNs)<=5e8){i.push(e);continue}r.push(i),i=[e]}return i.length>0&&r.push(i),r.map(e=>ve(e,t)).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}function ve(e,t){let n=Math.min(...e.map(e=>e.startNs)),r=Math.max(...e.map(e=>e.startNs+e.durationNs)),i=Math.max(0,Math.round(n/1e6)),a=Math.max(i,Math.round(r/1e6));return{startOffsetMs:i,endOffsetMs:a,startAt:new Date(t+i).toISOString(),endAt:new Date(t+a).toISOString(),missedDeadlineFrameCount:e.length,worstFrameMs:f(Math.max(...e.map(e=>e.durationNs))/1e6)}}function ye(e,t){return A(e,t).rows}function A(e,t){let n=u(e),r=T(n,t);return{rows:r.length===0?[]:w(n,e=>e.name===`row`),schema:r}}function j(e,t){for(let n of e)j(n.children,t),n.attributes.id&&t.set(n.attributes.id,{numberValue:E(n),process:M(n)})}function be(e,t){let n=D(e,t);return n===null?null:n!==0}function xe(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.process??null:M(e):null}function M(e){if(!e||e.children.some(e=>e.name===`sentinel`))return null;let t=E(C(e.children,e=>e.name===`pid`)),n=(e.attributes.fmt??``).replace(/\s+\(\d+\)$/,``).trim();return t===null&&n.length===0?null:{pid:t??void 0,name:n.length>0?n:void 0}}const N=`ps-process-snapshot`,P=`xctrace-activity-monitor`,F=`leaks-output-graph`,I=15e3,L=12e4;async function Se(t,n){if(r(t)&&t.kind===`device`)return await Ie(t,n);let i=await W(t,n),a=await K(t,i);if(a.length===0)throw new e(`COMMAND_FAILED`,`No running process found for ${n}`,{appBundleId:n,hint:`Run open <app> for this session again to ensure the Apple app is active, then retry perf.`});let o=new Date().toISOString();return Y({residentMemoryKb:a.reduce((e,t)=>e+t.rssKb,0),measuredAt:o,matchedProcesses:[i.executableName],memoryMethod:N})}async function Ce(t,n,r){let i=z(t);if(!i.memgraph)return{available:!1,kind:`memgraph`,reason:i.reason,hint:i.hint,support:i};let a=await He(t,n,i);if(a.available===!1)return a;let{process:o}=a;await h(x.dirname(r));let s=await Ee(r),c;try{c=await we(t,r,o.pid)}catch(e){throw await R(r,s),Te(t,n,o,r,e)}if(c.exitCode!==0)throw await R(r,s),new e(`COMMAND_FAILED`,`Failed to capture Apple memgraph for ${n}`,l(c,{kind:`memgraph`,appBundleId:n,pid:o.pid,processName:x.basename(J(o.command)),path:r,hint:q(t,c.stdout,c.stderr)}));let u=await g(r).catch(()=>null);if(!u?.isFile()||u.size<=0)throw await R(r,s),new e(`COMMAND_FAILED`,`Apple memgraph artifact is missing or empty`,{kind:`memgraph`,appBundleId:n,pid:o.pid,path:r,hint:`Retry with a writable --out path. If the file is still empty, run with --debug and inspect leaks output.`});return{available:!0,kind:`memgraph`,path:r,sizeBytes:u.size,measuredAt:new Date().toISOString(),method:F,appBundleId:n,pid:o.pid,processName:x.basename(J(o.command)),support:i}}async function we(e,t,n){return i(e)?await v(`leaks`,[`--outputGraph=${t}`,String(n)],{allowFailure:!0,timeoutMs:L}):await y(b(e,[`spawn`,e.id,`leaks`,`--outputGraph=${t}`,String(n)]),{allowFailure:!0,timeoutMs:L})}function Te(t,n,r,i,a){if(a instanceof e){let o=a.details??{};return new e(a.code,`Failed to capture Apple memgraph for ${n}`,{...o,kind:`memgraph`,appBundleId:n,pid:r.pid,processName:x.basename(J(r.command)),path:i,hint:q(t,typeof o.stdout==`string`?o.stdout:``,typeof o.stderr==`string`&&o.stderr.length>0?o.stderr:a.message)},a)}return new e(`COMMAND_FAILED`,`Failed to capture Apple memgraph for ${n}`,{kind:`memgraph`,appBundleId:n,pid:r.pid,processName:x.basename(J(r.command)),path:i,hint:`Retry perf memory snapshot. If it still fails, run with --debug and inspect leaks output.`},a)}async function Ee(e){return await g(e).then(e=>e.isFile()).catch(()=>!1)}async function R(e,t){t||await p(e).catch(()=>{})}async function De(t,n){if(!r(t)||t.kind!==`device`)throw new e(`COMMAND_FAILED`,`Apple frame-health sampling is currently available only on connected iOS devices.`,{metric:`fps`,platform:a(t),deviceKind:t.kind});let i=await G(t,n),s=await Ae(t,n,i);return ue({hitchesXml:s.hitchesXml,frameLifetimesXml:s.frameLifetimesXml,displayInfoXml:s.displayInfoXml,processIds:i.map(e=>e.pid),processNames:o(i.map(e=>x.basename(S(e.executable)))),windowStartedAt:s.windowStartedAt,windowEndedAt:s.windowEndedAt,measuredAt:s.windowEndedAt})}function Oe(e){return r(e)&&e.kind===`device`?{method:k,description:`Rendered-frame hitch health from xctrace Animation Hitches on connected iOS devices. Dropped frames are counted from native hitch rows for the attached app process, with total frames from the same trace frame-lifetime table.`,unit:`percent`,primaryField:`droppedFramePercent`,window:`short 2s xctrace Animation Hitches record of the active app process`,resetsAfterRead:!1}:{method:k,description:`Unavailable on iOS simulators and macOS because local Apple tooling does not expose reliable app frame hitches for these targets.`,unit:`percent`,primaryField:`droppedFramePercent`}}function ke(e){if(r(e)&&e.kind===`device`)return{method:P,description:`Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.`,unit:`kB`};let t=i(e)?`host ps for the running macOS app executable resolved from the bundle ID.`:`xcrun simctl spawn ps, with host ps fallback, for the running iOS simulator app executable resolved from the bundle ID.`;return{method:N,description:`Resident memory snapshot from ${t}`,unit:`kB`}}function z(e){return r(e)&&e.kind===`device`?{platform:a(e),deviceKind:e.kind,memgraph:!1,method:F,reason:`Physical iOS device memgraph capture is not exposed through reliable local agent-device tooling.`,hint:`Use perf memory sample for a compact resident-memory reading, or reproduce on an iOS simulator/macOS target for memgraph capture.`}:r(e)&&e.kind===`simulator`?{platform:a(e),deviceKind:e.kind,memgraph:!0,method:F,reason:`iOS simulator processes are host-visible through simctl spawn leaks.`,hint:`Keep the simulator app running in the foreground while the memgraph is captured.`}:i(e)?{platform:a(e),deviceKind:e.kind,memgraph:!0,method:F,reason:`macOS app processes are host-visible to leaks --outputGraph.`,hint:`Grant Terminal/agent process permissions if macOS denies process inspection.`}:{platform:a(e),deviceKind:e.kind,memgraph:!1,method:F,reason:`Apple memgraph capture is available only for iOS simulator and macOS app sessions.`,hint:`Use perf memory sample on supported app sessions, or rerun against iOS simulator/macOS for memgraph capture.`}}async function Ae(e,t,n){let r=await m(`agent-device-ios-frame-perf-`),i=x.join(r,`animation-hitches.trace`),a=x.join(r,`hitches.xml`),o=x.join(r,`frame-lifetimes.xml`),s=x.join(r,`display-info.xml`);try{let r=await B({device:e,appBundleId:t,tracePath:i,template:`Animation Hitches`,duration:`2s`,targetPids:n.map(e=>e.pid),validateTraceOutput:!0,failureMessage:`Failed to record iOS frame-health sample for ${t}`});await U(e,t,i,`hitches`,a),await U(e,t,i,`hitches-frame-lifetimes`,o);let c=await Ne(e,t,i,`device-display-info`,s);return{windowStartedAt:r.startedAt,windowEndedAt:r.endedAt,hitchesXml:await _(a),frameLifetimesXml:await _(o),displayInfoXml:c?await _(s):void 0}}finally{await p(r).catch(()=>{})}}async function B(t){let{device:n,appBundleId:r,tracePath:i,template:a,duration:o}=t,s=t.allProcesses?[`--all-processes`]:(t.targetPids??[]).flatMap(e=>[`--attach`,String(e)]),c=[`xctrace`,`record`,`--template`,a,`--device`,n.id,...s,`--time-limit`,o,`--output`,i,`--quiet`,`--no-prompt`],u=await je(c,t.tracePath);if(u.result.exitCode===0)return t.validateTraceOutput&&await Me(t,u.result.stdout,u.result.stderr),{startedAt:u.startedAt,endedAt:u.endedAt,capturedAtMs:u.capturedAtMs};throw new e(`COMMAND_FAILED`,t.failureMessage,l(u.result,{cmd:`xcrun`,args:c,appBundleId:r,deviceId:n.id,hint:Z(u.result.stdout,u.result.stderr)}))}async function je(e,t){let n;for(let r=1;r<=3;r+=1){await H(t,r,1500);let i=new Date().toISOString(),a=await y(e,{allowFailure:!0,timeoutMs:6e4});if(n={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},a.exitCode===0||!V(a))return n}return n}function V(e){let t=`${e.stdout}\n${e.stderr}`.toLowerCase();return t.includes(`_lockkperf`)||t.includes(`could not lock kperf`)||t.includes(`likely another session just started`)}async function H(e,t,n){t<=1||(await p(e).catch(()=>{}),await new Promise(e=>setTimeout(e,n)))}async function Me(t,n,r){let i=await g(t.tracePath).catch(()=>null);if(!(i?.isDirectory()===!0?(await te(t.tracePath).catch(()=>[])).length>0:(i?.size??0)>0))throw new e(`COMMAND_FAILED`,`${t.failureMessage}: xctrace produced no trace data`,{tracePath:t.tracePath,appBundleId:t.appBundleId,deviceId:t.device.id,stdout:n,stderr:r,hint:`Keep the iOS device unlocked and connected by cable, keep the app active, then retry perf.`})}async function U(e,t,n,r,i){let a=[`xctrace`,`export`,`--input`,n,`--xpath`,`/trace-toc/run/data/table[@schema="${r}"]`,`--output`,i];c(await y(a,{allowFailure:!0,timeoutMs:15e3}),`Failed to export iOS device ${r} data`,n=>({cmd:`xcrun`,args:a,appBundleId:t,deviceId:e.id,hint:Z(n.stdout,n.stderr)}))}async function Ne(e,t,n,r,i){try{return await U(e,t,n,r,i),!0}catch{return!1}}function Pe(e){let n=[];for(let r of t(e)){let e=r.match(/^(\d+)\s+([0-9]+(?:\.[0-9]+)?)\s+(\d+)\s+(.+)$/);if(!e)continue;let[t,i,a,o]=e.slice(1);if(t===void 0||i===void 0||a===void 0||o===void 0)continue;let s=Number(t),c=Number(i),l=Number(a),u=o.trim();!Number.isFinite(s)||!Number.isFinite(c)||!Number.isFinite(l)||n.push({pid:s,cpuPercent:c,rssKb:l,command:u})}return n}async function Fe(t){let n=u(t),r=T(n,`activity-monitor-process-live`);if(r.length===0)throw new e(`COMMAND_FAILED`,`Failed to parse xctrace activity-monitor-process-live schema`);let i=r.indexOf(`pid`),a=r.indexOf(`process`),o=r.indexOf(`memory-real`);if(i<0||a<0||o<0)throw new e(`COMMAND_FAILED`,`xctrace activity-monitor-process-live export is missing expected columns`);let s=w(n,e=>e.name===`row`),c=[],l=new Map;for(let e of s){let t=e.children;if(t.length===0)continue;for(let e of t){let t=C(e.children,e=>e.name===`pid`&&typeof e.attributes.id==`string`);if(t?.attributes.id){let e=Number(t.text);l.set(t.attributes.id,{numberValue:Number.isFinite(e)?e:null})}e.attributes.id&&l.set(e.attributes.id,{numberValue:E(e),processName:X(e)})}let n=D(t[i],l),r=qe(t[a],l);n===null||!Number.isFinite(n)||!r||c.push({pid:n,processName:r,residentMemoryBytes:D(t[o],l)})}return c}async function W(t,n){let r=i(t)?await ze(n):await Be(t,n),a=i(t)?x.join(r,`Contents`,`Info.plist`):x.join(r,`Info.plist`),o=await se(a,`CFBundleExecutable`);if(!o)throw new e(`COMMAND_FAILED`,`Failed to resolve executable for ${n}`,{appBundleId:n,appPath:r});return{executableName:o,executablePath:i(t)?x.join(r,`Contents`,`MacOS`,o):x.join(r,o)}}async function Ie(t,n){let r=await G(t,n),i=await Le(t,n),a=Re(await Fe(i.xml),r,n,t);if(a.residentMemoryBytes===null)throw new e(`COMMAND_FAILED`,`Incomplete Activity Monitor sample for ${n}`,{appBundleId:n,deviceId:t.id,hint:`Keep the app running in the foreground while perf samples the device, then retry.`});return Y({residentMemoryKb:a.residentMemoryBytes/1024,measuredAt:new Date(i.capturedAtMs).toISOString(),matchedProcesses:a.matchedProcesses,memoryMethod:P})}async function G(t,n){let{appBundleUrl:r,processes:i}=await oe(t).resolveAppProcesses(t,n),a=S(r);if(i.length===0)throw new e(`COMMAND_FAILED`,`No running process found for ${n}`,{appBundleId:n,deviceId:t.id,appBundlePath:a,hint:`Run open <app> for this session again to ensure the iOS app is active, then retry perf.`});return i}async function Le(e,t){let n=await m(`agent-device-ios-perf-`),r=x.join(n,`sample.trace`),i=x.join(n,`activity-monitor-process-live.xml`);try{let n=await B({device:e,appBundleId:t,tracePath:r,template:`Activity Monitor`,duration:`1s`,allProcesses:!0,failureMessage:`Failed to record iOS device Activity Monitor sample for ${t}`});return await U(e,t,r,`activity-monitor-process-live`,i),{capturedAtMs:n.capturedAtMs,xml:await _(i)}}finally{await p(n).catch(()=>{})}}function Re(t,n,r,i){let a=new Set(n.map(e=>e.pid)),s=new Set(n.map(e=>x.basename(S(e.executable)))),c=t.filter(e=>a.has(e.pid)||s.has(e.processName));if(c.length===0)throw new e(`COMMAND_FAILED`,`No Activity Monitor sample found for ${r}`,{appBundleId:r,deviceId:i.id,hint:`Keep the app running in the foreground while perf samples the device, then retry.`});let l=new Map;for(let e of c){let t=l.get(e.pid);if(!t){l.set(e.pid,e);continue}l.set(e.pid,{pid:e.pid,processName:e.processName||t.processName,residentMemoryBytes:Je(t.residentMemoryBytes,e.residentMemoryBytes)})}let u=[...l.values()],d=u.map(e=>e.residentMemoryBytes).filter(e=>e!==null);return{residentMemoryBytes:d.length>0?d.reduce((e,t)=>e+t,0):null,matchedProcesses:o(u.map(e=>e.processName))}}async function ze(t){let n=`kMDItemCFBundleIdentifier == "${t.replaceAll(`"`,String.raw`\"`)}"`,r=c(await v(`mdfind`,[n],{allowFailure:!0,timeoutMs:I}),`Failed to resolve macOS app bundle for ${t}`,{appBundleId:t}).stdout.split(`
2
+ `).map(e=>e.trim()).find(e=>e.endsWith(`.app`));if(!r)throw new e(`APP_NOT_INSTALLED`,`No macOS app found for ${t}`,{appBundleId:t});return r}async function Be(t,n){let r=b(t,[`get_app_container`,t.id,n,`app`]),i=c(await y(r,{allowFailure:!0,timeoutMs:I}),`Failed to resolve iOS simulator app container for ${n}`,{appBundleId:n,hint:`Ensure the iOS simulator app is installed and booted, then retry perf.`}).stdout.trim();if(i.length===0)throw new e(`APP_NOT_INSTALLED`,`No iOS simulator app container found for ${n}`,{appBundleId:n});return i}async function K(e,t){let n=i(e)?[`-axo`,`pid=,%cpu=,rss=,command=`]:b(e,[`spawn`,e.id,`ps`,`-axo`,`pid=,%cpu=,rss=,command=`]);return Pe((i(e)?await v(`ps`,n,{timeoutMs:I}):await We(n)).stdout).filter(e=>Ge(e.command,t))}async function Ve(t,n,r){let i=(await K(t,r)).sort((e,t)=>t.rssKb-e.rssKb)[0];if(i)return i;throw new e(`COMMAND_FAILED`,`No running process found for ${n}`,{kind:`memgraph`,appBundleId:n,hint:`Run open <app> for this session again to ensure the Apple app is active, then retry perf memory snapshot.`})}async function He(e,t,n){try{return{available:!0,process:await Ve(e,t,await W(e,t))}}catch(t){if(Ue(e,t))return{available:!1,kind:`memgraph`,reason:`iOS simulator memgraph capture needs process tools inside simctl spawn, but this simulator runtime did not provide ps.`,hint:`Use perf memory sample when available, or retry memgraph on a simulator runtime that includes process tools such as ps and leaks.`,support:{...n,memgraph:!1}};throw t}}function Ue(t,n){if(!r(t)||t.kind!==`simulator`||!(n instanceof e))return!1;let i=n.details??{},a=Array.isArray(i.args)?i.args.join(` `):``,o=typeof i.stderr==`string`?i.stderr:``,s=`${n.message}\n${o}`.toLowerCase();return a.includes(`simctl spawn`)&&a.includes(` ps `)&&s.includes(`no such file`)}function q(e,t,n){let r=`${t}\n${n}`.toLowerCase();return r.includes(`timed out`)||r.includes(`timeout`)?`Apple memgraph capture can take longer than metric sampling. Keep the app running and retry; if it times out again, collect a smaller reproduction before capturing leaks --outputGraph.`:r.includes(`not found`)||r.includes(`no such file`)?`Install Xcode command line tools and ensure leaks is available, then retry.`:r.includes(`permission`)||r.includes(`denied`)||r.includes(`not authorized`)?i(e)?`Grant the agent terminal process permission to inspect this macOS app, then retry.`:`Keep the simulator booted and app running; if inspection is denied, retry with a debug simulator build.`:`Keep the app process running and retry perf memory snapshot with --debug if the failure persists.`}async function We(e){let t=await y(e,{allowFailure:!0,timeoutMs:I});return t.exitCode===0?t:await v(`ps`,[`-axo`,`pid=,%cpu=,rss=,command=`],{timeoutMs:I})}function Ge(e,t){let n=J(e);if(t.executablePath){for(let r of Ke(t.executablePath))if(e===r||n===r||e.startsWith(`${r} `))return!0}return x.basename(n)===t.executableName}function Ke(e){let t=[e];return e.startsWith(`/private/var/`)?t.push(e.replace(`/private/var/`,`/var/`)):e.startsWith(`/var/`)&&t.push(e.replace(`/var/`,`/private/var/`)),t}function J(e){let[t=``]=e.trim().split(/\s+/,1);return t}function Y(e){return{residentMemoryKb:Math.round(e.residentMemoryKb),measuredAt:e.measuredAt,method:e.memoryMethod,matchedProcesses:e.matchedProcesses}}function X(e){let t=e?.attributes.fmt?.trim()??``;return t?t.replace(/\s+\(\d+\)$/,``).trim():null}function qe(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.processName??null:X(e):null}function Z(e,t){let n=ie(e,t);if(n)return n;let r=`${e}\n${t}`.toLowerCase();return r.includes(`no device matched`)||r.includes(`failed to find device`)?ae:r.includes(`timed out`)?`Keep the iOS device unlocked and connected by cable, keep the app active, then retry perf.`:`Ensure the iOS device is unlocked, trusted, visible to xctrace, and the target app stays active while perf samples it.`}function Je(e,t){return e===null?t:t===null?e:Math.max(e,t)}function Ye(e,t=10){let n=u(e),r=le(n),i=new Map,a=0,o=0;for(let e of w(n,e=>e.name===`row`)){let t=Xe(e,r),n=Ze(e,r);if(t===void 0||!n)continue;let s=n.attributes.name?.trim()||`<unknown>`,c=Qe(n,r),l=`${c??``}\u0000${s}`,u=i.get(l);i.set(l,{symbol:s,binary:c,weightNs:(u?.weightNs??0)+t}),a+=1,o+=t}let s=Math.max(0,Math.floor(t)),c=[...i.values()].sort((e,t)=>t.weightNs-e.weightNs||e.symbol.localeCompare(t.symbol)).slice(0,s).map(({symbol:e,binary:t,weightNs:n})=>({symbol:e,binary:t,selfSampleMs:Q(n),selfSamplePercent:o>0?d(n/o*100):0}));return{sampleCount:a,totalSampleWeightMs:Q(o),topFunctions:c}}function Xe(e,t){let n=O(e.children.find(e=>e.name===`weight`),t);if(!n?.text)return;let r=Number(n.text);return Number.isFinite(r)&&r>0?r:void 0}function Ze(e,t){return O(O(e.children.find(e=>e.name===`backtrace`),t)?.children.find(e=>e.name===`frame`),t)}function Qe(e,t){return O(e.children.find(e=>e.name===`binary`),t)?.attributes.name?.trim()||void 0}function Q(e){return Math.round(e/1e6*1e3)/1e3}const $=15e3;async function $e(e){let t=await it(e.device,e.appBundleId);await h(x.dirname(e.outPath));let n=at({device:e.device,template:e.template,targetPids:t.pids,outPath:e.outPath}),r=new Date().toISOString(),i=await ot(n,e.outPath,{device:e.device,appBundleId:e.appBundleId,failureMessage:`Failed to start Apple xctrace ${e.mode} capture for ${e.appBundleId}`});return{kind:`xctrace`,mode:e.mode,template:e.template,outPath:e.outPath,appBundleId:e.appBundleId,deviceId:e.device.id,platform:a(e.device),targetPids:t.pids,targetProcesses:t.processNames,startedAt:r,child:i.child,wait:i.wait}}async function et(e,t=e.outPath){t!==e.outPath&&await h(x.dirname(t));let n=c(await ct(e,{failOnForcedKill:!0}),`Failed to stop Apple xctrace ${e.mode} capture`,t=>({tracePath:e.outPath,captureCleanedUp:!0,hint:Z(t.stdout,t.stderr)}));return t!==e.outPath&&await re(e.outPath,t).catch(async()=>{await ne(e.outPath,t),await p(e.outPath)}),await ut(t,{appBundleId:e.appBundleId,deviceId:e.deviceId,stdout:n.stdout,stderr:n.stderr}),{kind:`xctrace`,mode:e.mode,template:e.template,outPath:t,appBundleId:e.appBundleId,deviceId:e.deviceId,platform:e.platform,targetPids:e.targetPids,targetProcesses:e.targetProcesses,startedAt:e.startedAt,endedAt:new Date().toISOString()}}async function tt(e){return await ct(e,{failOnForcedKill:!1})}async function nt(t){let n=await m(`agent-device-xctrace-report-`),r=x.join(n,`trace-toc.xml`),i=x.join(n,`time-profile.xml`);try{let n=[`xctrace`,`export`,`--input`,t.tracePath,`--toc`,`--output`,r];c(await y(n,{allowFailure:!0,timeoutMs:$}),`Failed to export Apple xctrace report metadata`,e=>({cmd:`xcrun`,args:n,tracePath:t.tracePath,hint:Z(e.stdout,e.stderr)}));let a=await _(r),o=await rt(t.tracePath,i),s=dt({...t,tocXml:a,timeProfileXml:o});if(s.summary.sampleCount===0)throw new e(`COMMAND_FAILED`,`Apple xctrace CPU report contained no samples`,{tracePath:t.tracePath,tableSchemas:s.summary.tableSchemas,hint:`Keep the app active while recording, then retry. Open the raw trace in Instruments if it still contains no Time Profiler samples.`});return await h(x.dirname(t.outPath)),await ee(t.outPath,`${JSON.stringify(s,null,2)}\n`),s}finally{await p(n).catch(()=>{})}}async function rt(e,t){let n=[`xctrace`,`export`,`--input`,e,`--xpath`,`/trace-toc/run/data/table[@schema="time-profile"]`,`--output`,t];return c(await y(n,{allowFailure:!0,timeoutMs:$}),`Failed to export Apple xctrace Time Profiler samples`,t=>({cmd:`xcrun`,args:n,tracePath:e,hint:Z(t.stdout,t.stderr)})),await _(t)}async function it(t,i){if(!n(t.platform))throw new e(`UNSUPPORTED_OPERATION`,`Apple xctrace perf is not supported on Android.`,{platform:t.platform,hint:`Android native profiling belongs to the Android perf rollout and is not implemented under Apple xctrace.`});if(r(t)&&t.kind===`device`){let e=await G(t,i);return{pids:e.map(e=>e.pid),processNames:o(e.map(e=>x.basename(S(e.executable))))}}let a=await W(t,i),s=await K(t,a);if(s.length===0)throw new e(`COMMAND_FAILED`,`No running process found for ${i}`,{appBundleId:i,deviceId:t.id,hint:`Run open <app> for this session again to ensure the Apple app is active, then retry perf.`});return{pids:s.map(e=>e.pid),processNames:[a.executableName]}}function at(e){return[`xctrace`,`record`,`--template`,e.template,...r(e.device)?[`--device`,e.device.id]:[],...e.targetPids.flatMap(e=>[`--attach`,String(e)]),`--output`,e.outPath,`--quiet`,`--no-prompt`]}async function ot(t,n,r){let i;for(let e=1;e<=3;e+=1){await H(n,e,1500);let r=s(`xcrun`,t,{allowFailure:!0}),a=await st(r.wait);if(!a)return r;if(i=a,!V(a))break}let a=i??{stdout:``,stderr:``,exitCode:1};throw new e(`COMMAND_FAILED`,r.failureMessage,l(a,{cmd:`xcrun`,args:t,appBundleId:r.appBundleId,deviceId:r.device.id,hint:Z(a.stdout,a.stderr)}))}async function st(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function ct(t,n){t.child.kill(`SIGINT`);let r=await lt(t.wait,45e3);if(r)return r;t.child.kill(`SIGKILL`);let i=await lt(t.wait,5e3);if(i&&!n.failOnForcedKill)return i;throw i?new e(`COMMAND_FAILED`,`Timed out waiting for Apple xctrace capture to stop`,{exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,tracePath:t.outPath,captureCleanedUp:!0,forcedKill:!0,hint:`xctrace did not finish after SIGINT, so it was force-killed. Retry the perf command after confirming no other xctrace session is active.`}):new e(`COMMAND_FAILED`,`Timed out waiting for Apple xctrace capture to stop after SIGKILL`,{tracePath:t.outPath,captureCleanedUp:!1,forcedKill:!0,hint:`xctrace did not exit after SIGKILL. Inspect running xctrace processes before retrying.`})}async function lt(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function ut(t,n){let r=await g(t).catch(()=>null);if(!(r?.isDirectory()===!0?(await te(t).catch(()=>[])).length>0:(r?.size??0)>0))throw new e(`COMMAND_FAILED`,`xctrace produced no trace data`,{tracePath:t,appBundleId:n.appBundleId,deviceId:n.deviceId,stdout:n.stdout,stderr:n.stderr,hint:`Keep the Apple device unlocked and connected, keep the app active, then retry perf.`})}function dt(e){let t=u(e.tocXml),n=w(t,e=>e.name===`run`),r=o(w(t,e=>e.name===`table`).map(e=>e.attributes.schema).filter(e=>typeof e==`string`&&e.length>0)).sort(),i=Ye(e.timeProfileXml);return{kind:`xctrace`,mode:`cpu-profile`,template:e.template,tracePath:e.tracePath,reportPath:e.outPath,appBundleId:e.appBundleId,generatedAt:new Date().toISOString(),summary:{runCount:n.length,tableSchemas:r,...i}}}export{Oe as buildAppleFrameSamplingMetadata,ke as buildAppleMemorySamplingMetadata,z as buildAppleMemorySnapshotSupport,Ce as captureAppleMemorySnapshot,tt as cleanupAppleXctracePerfCapture,V as isRetryableIosDeviceTraceRecordFailure,K as readAppleProcessSamples,W as resolveAppleExecutable,Z as resolveIosDevicePerfHint,G as resolveIosDevicePerfTarget,De as sampleAppleFramePerf,Se as sampleAppleMemoryPerf,$e as startAppleXctracePerfCapture,et as stopAppleXctracePerfCapture,nt as writeAppleXctracePerfReport};
@@ -0,0 +1 @@
1
+ import{O as e,y as t}from"./sdk-contracts.js";async function n(t){try{return{available:!0,...await t}}catch(t){let n=e(t);return{available:!1,reason:n.message,error:n}}}function r(e,t){return{available:!1,reason:`No ${e} app ${t} is associated with this session. Run open <app> first.`}}function i(e,t,n,r){return{artifact:{available:!1,kind:t,reason:`${e} perf memory snapshot does not support ${t}.`,hint:r,support:n},support:n}}function a(){return new t(`INVALID_ARGS`,`perf memory snapshot requires an active app session`,{hint:`Run open <app> first so perf memory snapshot can resolve the app process.`})}function o(e){return Object.freeze({perfNativeCaptureStart:e.start,perfNativeCaptureReattach:e.reattach,perfNativeCaptureCleanup:e.cleanup,perfProfileReport:async n=>{if(n.kind!==e.expectedProfileKind)throw new t(`INVALID_ARGS`,`${e.platform} native perf requires --kind ${e.expectedProfileKind}, not ${n.kind}`);return await e.writeProfileReport(n)}})}export{i as a,n as i,r as n,a as r,o as t};
@@ -0,0 +1 @@
1
+ import{O as e,y as t}from"./sdk-contracts.js";import{S as n,c as r,w as i}from"./sdk-device.js";import{Et as a,Ot as o,Tt as s,kt as c,wt as l}from"./sdk-batch.js";import{m as u}from"./observability.js";import{r as d}from"./diagnostics.js";import{D as f,a as p,i as m}from"./owner-identity.js";import{t as h}from"./file.js";import"./diagnostics2.js";import"./process.js";import{c as g,i as ee,l as _,r as v,s as y,t as b}from"./device-claim-inspection.js";import{c as x,l as S}from"./screen-recording-resource-recovery.js";import C from"node:path";import w from"node:fs";import te from"node:crypto";function T(e){let t=g(e.deviceKey);w.mkdirSync(C.dirname(t),{recursive:!0,mode:448}),f({destination:t,contents:`${JSON.stringify(e)}\n`,mode:384})}async function E(e,t){let n=p(),r=await h({lockDirPath:`${g(e)}.lock`,owner:{pid:n.pid,startTime:n.startTime,acquiredAtMs:Date.now()},timeoutMs:3e4,description:`device claim for ${e}`});try{return await t()}finally{await r()}}function ne(e){return`transient:${e}`}async function re(e){let t=N(e.device),n=y(t);return await E(n,async()=>await O({...e,deviceKey:n,identity:t}))}async function D(e){let t=N(e.device),n=y(t);return await E(n,async()=>{let r=v(g(n));return r?.claim&&!A(r.claim)&&k(r.claim,e.stateDir,p())?{status:`covered-by-owned-claim`}:await O({device:e.device,deviceKey:n,identity:t,session:ne(e.command),workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim})})}async function O(e){let{deviceKey:t,identity:n}=e,r=p(),i=await P({deviceKey:t,owner:r,session:e.session,workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim});if(i.status!==`available`)return i;let a=Date.now(),o={schemaVersion:2,deviceKey:t,device:{...n,name:e.device.name},session:e.session,workspace:e.workspace,stateDir:e.stateDir,ownerPid:r.pid,ownerStartTime:r.startTime,ownerToken:te.randomUUID(),createdAtMs:a,updatedAtMs:a};return T(o),{status:`acquired`,ownership:J(o)}}function k(e,t,n){return e.stateDir===t&&m({pid:e.ownerPid,startTime:e.ownerStartTime},n)}function A(e){return e.abandonedAtMs!==void 0}function j(e){let t=y(N(e)),n=v(g(t))?.claim;return n!==void 0&&n.deviceKey===t&&!A(n)&&m({pid:n.ownerPid,startTime:n.ownerStartTime},p())}function M(e,t,n){return A(e)&&k(e,t,n)}function N(e){return i({...e,...r(e.platform)?{appleOs:n(e)}:{}})}async function P(e){let t=v(g(e.deviceKey));if(!t)return{status:`available`};if(t.claim&&M(t.claim,e.stateDir,e.owner))return K(e.deviceKey,t.claim),{status:`available`};if(t.claim&&ie(t.claim,e,e.owner))return{status:`acquired`,ownership:J(t.claim)};if(!t.claim||!b(t.classification))return W(e.deviceKey,t),{status:`conflict`,conflict:t};let n=await q(t.claim,e.reconcileOrphanedDeviceClaim);return n.status===`retained`?(W(e.deviceKey,t,n.reason),{status:`conflict`,conflict:t}):{status:`available`}}function ie(e,t,n){return e.session===t.session&&e.workspace===t.workspace&&e.stateDir===t.stateDir&&m({pid:e.ownerPid,startTime:e.ownerStartTime},n)}async function F(e){let t=[];for(let n of ee(e.selectors))t.push(await I(n,e.reconcile));return t}async function I(e,t){let n=e.claim,r={fileName:e.fileName,classification:e.classification,...e.deviceKey?{deviceKey:e.deviceKey}:{},...n?{device:n.device,session:n.session,workspace:n.workspace,stateDir:n.stateDir}:{},...e.allocatorClaim?{device:e.allocatorClaim.device,stateDir:e.allocatorClaim.stateDir,allocator:e.allocatorClaim.allocator}:{}};if(!n||!b(e.classification))return{...r,status:`refused`,reason:R(e.classification)};if(g(n.deviceKey)!==C.join(_(),e.fileName))return{...r,status:`refused`,reason:`claim-file-name-mismatch`};let{deviceKey:i,ownerToken:a}=n;return await E(i,async()=>{let e=v(g(i));if(!e?.claim||e.claim.ownerToken!==a||!b(e.classification))return{...r,status:`changed`,reason:`claim-changed-during-release`};let o=await q(e.claim,t);return o.status===`retained`?{...r,status:`retained`,reason:o.reason}:(d({level:`info`,phase:`device_claim_stale_released`,data:{deviceKey:i,ownerSession:n.session,ownerStateDir:n.stateDir}}),{...r,status:`released`})})}const L=Object.freeze({live:`live-owner`,"owner-process-reused":`owner-pid-reused`,"owner-state-dir-gone":`owner-process-still-running`,unknown:`owner-liveness-unknown`,inconsistent:`claim-record-inconsistent`,"allocator-inconsistent":`allocator-claim-record-inconsistent`,"allocator-held":`allocator-held-owner`,"owner-process-dead":`claim-record-unreadable`,"owner-daemon-superseded":`claim-record-unreadable`});function R(e){return L[e]}async function z(e){return e?await E(e.deviceKey,async()=>{let t=g(e.deviceKey),n=v(t);if(!n)return`absent`;let r=n.claim;if(!r||!V(r,e))return`ownership-changed`;try{w.unlinkSync(t)}catch(e){if(e.code!==`ENOENT`)throw e;return`absent`}return`deleted`}):`absent`}async function B(e){return e?await E(e.deviceKey,async()=>{let t=v(g(e.deviceKey));if(!t)return`absent`;let n=t.claim;if(!n||!V(n,e))return`ownership-changed`;let r=Date.now();return T({...n,abandonedAtMs:r,updatedAtMs:r}),`abandoned`}):`absent`}function V(e,t){return e.ownerToken===t.ownerToken&&m({pid:e.ownerPid,startTime:e.ownerStartTime},{pid:t.ownerPid,startTime:t.ownerStartTime})}async function H(e,t){let n=_(),r;try{r=w.readdirSync(n,{withFileTypes:!0})}catch{return{examined:0,reconciled:0,retained:0,changed:0}}let i=0,a=0,o=0,s=0;for(let c of r){if(!c.isFile()||!c.name.endsWith(`.json`))continue;let r=C.join(n,c.name),l=v(r);if(!l?.claim||!U(l.classification,l.claim.stateDir,t))continue;i+=1;let{deviceKey:u,ownerToken:d}=l.claim;if(g(u)!==r){o+=1;continue}await E(u,async()=>{let n=v(r);if(!n?.claim||!U(n.classification,n.claim.stateDir,t)||n.claim.ownerToken!==d){s+=1;return}if((await q(n.claim,e)).status===`retained`){o+=1;return}a+=1})}return{examined:i,reconciled:a,retained:o,changed:s}}function U(e,t,n){return b(e)?e!==`owner-daemon-superseded`||C.resolve(t)===C.resolve(n):!1}function W(e,t,n){d({level:`warn`,phase:`device_claim_conflict`,data:{deviceKey:e,classification:t.classification,...G(t),...n?{reconciliationReason:n}:{}}})}function G(e){return e.allocatorClaim?{ownerStateDir:e.allocatorClaim.stateDir,allocatorInstanceId:e.allocatorClaim.allocator.instanceId,identityIncarnationId:e.allocatorClaim.allocator.identityIncarnationId}:{ownerSession:e.claim?.session,ownerStateDir:e.claim?.stateDir}}function K(e,t){d({level:`info`,phase:`device_claim_abandoned_superseded`,data:{deviceKey:e,abandonedSession:t.session,abandonedAtMs:t.abandonedAtMs}})}async function q(e,t){let n=await t(e);if(n.status===`retained`)return n;try{w.unlinkSync(g(e.deviceKey))}catch(e){if(e.code!==`ENOENT`)throw e}return{status:`reconciled`}}function J(e){return{deviceKey:e.deviceKey,ownerToken:e.ownerToken,ownerPid:e.ownerPid,ownerStartTime:e.ownerStartTime}}const Y=S({resourceKind:`app-log`,fileName:`app-log.resource.json`,displayName:`App-log`}),X=x({resourceKind:`app-log`,displayName:`app-log`,store:Y,sessionSlot:{read:e=>e.appLog,replace:(e,t)=>({...e,appLog:t,appLogFailure:void 0})},completionMetadata:e=>({backend:e.backend,outputPath:e.outputPath,completedAt:e.completedAt}),messages:{noActive:`no app log stream active`,cleanupPendingHint:`Keep app-log.resource.json and retry cleanup through its exact runtime owner.`}});function ae(e){if(e.appLog){let t=e.appLog.handle.inspect();return{active:t.state===`active`||t.state===`recovering`,...t}}return e.appLogFailure?{active:!1,state:`failed`,backend:e.appLogFailure.backend,failureCode:e.appLogFailure.code,failureMessage:e.appLogFailure.message,hint:e.appLogFailure.hint}:{active:!1,state:`inactive`}}function oe(e){return X.adoptStarted(e)}function se(e){return X.finishLive(e)}function ce(e){return X.forceCleanupLive(e)}function le(t){let n=e(t.error);return t.sessionStore.set(t.sessionName,{...t.session,appLog:void 0,appLogFailure:{backend:t.backend,code:n.code,message:n.message,hint:n.hint}}),n}function ue(e){e.sessionStore.set(e.sessionName,{...e.session,appLogFailure:void 0})}const de=S({resourceKind:`audio-probe`,fileName:`audio-probe.resource.json`,displayName:`Audio probe`}),Z=x({resourceKind:`audio-probe`,displayName:`audio probe`,store:de,sessionSlot:{read:e=>e.audioProbe,replace:(e,t)=>({...e,audioProbe:t})},completionMetadata:e=>({backend:e.backend??`unknown`,source:e.source,durationMs:e.durationMs,elapsedMs:e.elapsedMs,bucketMs:e.bucketMs,sampleCount:e.sampleCount,heard:e.heard}),messages:{noActive:`no active audio probe`,cleanupPendingHint:`Keep audio-probe.resource.json and retry stop through its exact runtime owner.`}});function Q(e){return Z.adoptStarted(e)}function fe(e){return Z.finishLive(e)}const pe=S({resourceKind:`perf-capture`,fileName:`perf-capture.resource.json`,displayName:`Perf capture`}),$=x({resourceKind:`perf-capture`,displayName:`perf capture`,store:pe,sessionSlot:{read:e=>e.perfCapture,replace:(e,t)=>({...e,perfCapture:t})},completionMetadata:e=>({kind:typeof e.kind==`string`?e.kind:`unknown`,mode:typeof e.mode==`string`?e.mode:`unknown`,...typeof e.outPath==`string`?{outPath:e.outPath}:{}}),messages:{noActive:`no active native perf capture`,cleanupPendingHint:`Keep perf-capture.resource.json and retry stop through its exact runtime owner.`}});function me(e){return $.adoptStarted(e)}function he(e){return $.finishLive(e)}function ge(e){if(e.area===`frames`)return Object.freeze({kind:`frames`,request:e,use:l});if(e.area===`memory`)return e.action===`snapshot`?Object.freeze({kind:`memory-snapshot`,request:e,use:a}):Object.freeze({kind:`memory-sample`,request:e,use:s});if(e.area===`trace`)return e.action===`start`?Object.freeze({kind:`capture-start`,request:e,use:o}):Object.freeze({kind:`capture-stop`,request:e});switch(e.action){case`start`:return Object.freeze({kind:`capture-start`,request:e,use:o});case`stop`:return Object.freeze({kind:`capture-stop`,request:e});case`report`:return Object.freeze({kind:`profile-report`,request:e,use:c})}}function _e(e){let n=e.positionals??[],r=n[0]?.toLowerCase();if(r===`frames`){let i=n[1]?.toLowerCase();if(i!==void 0&&i!==`sample`||n.length>2||e.kind!==void 0)throw new t(`INVALID_ARGS`,`perf action must be frames, memory sample|snapshot, cpu profile start|stop|report, or trace start|stop`);return Object.freeze({area:r,action:`sample`})}if(r===`memory`)return ve(n,e);if(r===`cpu`)return ye(n,e.outPath);if(r===`trace`)return be(n,e.outPath);throw new t(`INVALID_ARGS`,`perf requires frames, memory, cpu, or trace`)}function ve(e,n){let r=(e[1]??`sample`).toLowerCase();if(r!==`sample`&&r!==`snapshot`)throw new t(`INVALID_ARGS`,`perf memory requires sample or snapshot`);if(n.kind!==void 0&&r!==`snapshot`)throw new t(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(r===`sample`&&e.length>2)throw new t(`INVALID_ARGS`,`perf memory sample does not accept additional positionals`);if(r===`snapshot`&&e.length>3)throw new t(`INVALID_ARGS`,`perf memory snapshot accepts at most one positional kind`);let i=n.kind??e[2];if(i!==void 0&&!u(i))throw new t(`INVALID_ARGS`,`perf memory snapshot --kind must be android-hprof or memgraph`);return Object.freeze({area:`memory`,action:r,...i===void 0?{}:{kind:i},...n.outPath===void 0?{}:{outPath:n.outPath}})}function ye(e,n){if(e[1]?.toLowerCase()!==`profile`)throw new t(`INVALID_ARGS`,`perf cpu requires profile`);let r=e[2]?.toLowerCase();if(r!==`start`&&r!==`stop`&&r!==`report`)throw new t(`INVALID_ARGS`,`perf cpu profile action must be start, stop, or report`);let i=e[3]?.toLowerCase();if(i!==`xctrace`&&i!==`simpleperf`)throw new t(`INVALID_ARGS`,`perf cpu profile requires --kind xctrace or simpleperf`);let a=n??e[5];return Object.freeze({area:`cpu`,subject:`profile`,action:r,kind:i,...e[4]?{template:e[4]}:{},...a?{outPath:a}:{},...e[6]?{tracePath:e[6]}:{}})}function be(e,n){let r=e[1]?.toLowerCase();if(r!==`start`&&r!==`stop`)throw new t(`INVALID_ARGS`,`perf trace action must be start or stop`);let i=e[2]?.toLowerCase();if(i!==`xctrace`&&i!==`perfetto`)throw new t(`INVALID_ARGS`,`perf trace requires --kind xctrace or perfetto`);let a=n??e[4];return Object.freeze({area:`trace`,action:r,kind:i,...e[3]?{template:e[3]}:{},...a?{outPath:a}:{}})}export{H as C,j as S,B as _,$ as a,z as b,fe as c,ue as d,se as f,Y as g,le as h,he as i,oe as l,ae as m,ge as n,Q as o,ce as p,me as r,Z as s,_e as t,X as u,re as v,F as w,N as x,D as y};
@@ -0,0 +1 @@
1
+ const e=`perf-capture`;function t(e){return Object.freeze({perfFrames:e.frames,perfMemorySample:e.memorySample,perfMemorySnapshot:e.memorySnapshot,perfNativeCaptureStart:e.nativeCapture,perfNativeCaptureReattach:e.nativeCapture,perfNativeCaptureCleanup:e.nativeCapture,perfProfileReport:e.profileReport})}export{t as n,e as t};
package/dist/src/perf.js CHANGED
@@ -1,4 +1 @@
1
- import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{qr as n}from"./sdk-batch-runner.js";import{h as r,n as i,o as a}from"./sdk-android-adb.js";import{t as o}from"./timeouts.js";import s from"node:path";import{promises as c}from"node:fs";function l(e){return Math.round(e*10)/10}function u(e){return l(e)}function d(e){let t=e.replaceAll(`,`,``).match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let n=Number(t[0]);return Number.isFinite(n)?n:null}function f(e){let t=ne(e.map(e=>e.intendedVsyncNs)),n=[];for(let e=1;e<t.length;e+=1){let r=t[e]-t[e-1];r>=4e6&&r<=5e7&&n.push(r)}if(n.length!==0)return re(n)}function p(e){let{frames:t,frameDeadlineNs:n,summaryDroppedFrameCount:r}=e;return r===void 0?n===void 0?[]:t.filter(e=>e.durationNs>n):r<=0?[]:[...t].sort((e,t)=>t.durationNs-e.durationNs).slice(0,r).sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs)}function ee(e){let{frames:t,windowStartNs:n,measuredAtMs:r,uptimeMs:i}=e;if(t.length===0||n===void 0)return[];let a=[],o=[];for(let e of t){let t=o.at(-1);if(!t||e.intendedVsyncNs-t.frameCompletedNs<=5e8){o.push(e);continue}a.push(o),o=[e]}return o.length>0&&a.push(o),a.map(e=>te({frames:e,windowStartNs:n,measuredAtMs:r,uptimeMs:i})).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}function m(e){return Math.round(e*10)/10}function te(e){let{frames:t,windowStartNs:n,measuredAtMs:r,uptimeMs:i}=e,a=Math.min(...t.map(e=>e.intendedVsyncNs)),o=Math.max(...t.map(e=>e.frameCompletedNs)),s=Math.max(0,Math.round((a-n)/1e6)),c=Math.max(s,Math.round((o-n)/1e6)),l=i!==void 0&&Number.isFinite(r)?r-i:void 0;return{startOffsetMs:s,endOffsetMs:c,startAt:l===void 0?void 0:new Date(l+a/1e6).toISOString(),endAt:l===void 0?void 0:new Date(l+o/1e6).toISOString(),missedDeadlineFrameCount:t.length,worstFrameMs:m(Math.max(...t.map(e=>e.durationNs))/1e6)}}function ne(e){return[...new Set(e.filter(e=>Number.isFinite(e)))].sort((e,t)=>e-t)}function re(e){let t=[...e].sort((e,t)=>e-t),n=Math.floor(t.length/2);return t.length%2==1?t[n]:(t[n-1]+t[n])/2}const h=`adb-shell-dumpsys-gfxinfo-framestats`,g=`Rendered-frame health from the current adb shell dumpsys gfxinfo <package> framestats window. Dropped frames use Android gfxinfo janky-frame/frame-deadline data when available; this is not video recording FPS.`;function ie(e,t,n){_(e,t);let r=pe(e),i=ue(e),a=oe(i,r,t),o=Date.parse(n),s=he({frames:i,measuredAtMs:o,summary:r}),c=p({frames:i,frameDeadlineNs:a,summaryDroppedFrameCount:r?.droppedFrameCount}),l=r?.sampleWindowMs??s.sampleWindowMs??x(i),u=se(r,i,c),d=le({droppedFrames:c,timing:s,measuredAtMs:o,summary:r});return{...u,sampleWindowMs:l,...ce(a),windowStartedAt:s.windowStartedAt,windowEndedAt:s.windowEndedAt,timestampSource:s.timestampSource,measuredAt:n,method:h,source:r?`android-gfxinfo-summary`:`framestats-rows`,worstWindows:d&&d.length>0?d:void 0}}function _(e,n){if(/no process found for:/i.test(e))throw new t(`COMMAND_FAILED`,`Android gfxinfo did not find a running process for ${n}`,{metric:`fps`,package:n,hint:`Run open <app> for this session again to ensure the Android app is active, then retry perf after the interaction you want to inspect.`})}function ae(e){throw new t(`COMMAND_FAILED`,`Failed to parse Android framestats output for ${e}`,{metric:`fps`,package:e,hint:`Retry perf after exercising the app screen. If the problem persists, capture adb shell dumpsys gfxinfo <package> framestats output for debugging.`})}function oe(e,n,r){let i=f(e);if(!n&&e.length===0&&ae(r),n||i!==void 0)return i;throw new t(`COMMAND_FAILED`,`Failed to infer Android frame deadline from framestats output for ${r}`,{metric:`fps`,package:r,hint:`Retry perf after a longer interaction window so consecutive Android frame timestamps are available.`})}function se(e,t,n){let r=e?.totalFrameCount??t.length,i=e?.droppedFrameCount??n.length;return{totalFrameCount:r,droppedFrameCount:i,droppedFramePercent:e?.droppedFramePercent??(r>0?l(i/r*100):0)}}function ce(e){return{frameDeadlineMs:e===void 0?void 0:m(e/1e6),refreshRateHz:e===void 0?void 0:m(1e9/e)}}function le(e){let{droppedFrames:t,timing:n,measuredAtMs:r,summary:i}=e;if(t.length===0)return;let a=ee({frames:t,windowStartNs:n.windowStartNs,measuredAtMs:r,uptimeMs:i?.uptimeMs});return a.length>0?a:void 0}function ue(e){let t=[],n=null;for(let r of e.split(`
2
- `)){let e=r.trim();if(e.length===0||e===`---PROFILEDATA---`)continue;let i=e.split(`,`).map(e=>e.trim());if(de(i)){n=new Map(i.map((e,t)=>[e,t]));continue}let a=fe(i,n);a&&t.push(a)}return t.sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs)}function de(e){return e.includes(`IntendedVsync`)&&e.includes(`FrameCompleted`)}function fe(e,t){if(!t||e.length<t.size)return;let n=v(e,t,`Flags`),r=v(e,t,`IntendedVsync`),i=v(e,t,`FrameCompleted`);if(!(n!==0||r===null||i===null||r<=0||i<=r))return{intendedVsyncNs:r,frameCompletedNs:i,durationNs:i-r}}function v(e,t,n){let r=t.get(n);if(r===void 0)return null;let i=Number(e[r]);return Number.isFinite(i)?i:null}function pe(e){let t=e.split(/\nProfile data in ms:\n/i)[0]??``,n=S(t,`Total frames rendered`),r=t.match(/^\s*Janky frames:\s*([0-9][0-9,]*)\s*\(([0-9.]+)%\)/im);if(n===void 0||!r)return;let i=r[1],a=r[2];if(i===void 0||a===void 0)return;let o=d(i)??void 0,s=Number(a);if(o===void 0||!Number.isFinite(s)||n<0)return;let c=S(t,`Uptime`),u=S(t,`Stats since`);return{droppedFramePercent:l(s),droppedFrameCount:o,totalFrameCount:n,sampleWindowMs:me({uptimeMs:c,statsSinceNs:u}),uptimeMs:c,statsSinceNs:u}}function me(e){let{uptimeMs:t,statsSinceNs:n}=e;if(t===void 0||n===void 0)return;let r=t-Math.round(n/1e6);return r>=0?r:void 0}function he(e){let{frames:t,measuredAtMs:n,summary:r}=e,i=y(t),a=r?.statsSinceNs,o=a??i.firstFrameNs,s=b(o,i.lastFrameNs),c=r?.sampleWindowMs??s;if(!Number.isFinite(n)||r?.uptimeMs===void 0||o===void 0)return{sampleWindowMs:c,windowStartNs:o};let l=n-r.uptimeMs;return{sampleWindowMs:c,windowStartNs:o,windowStartedAt:new Date(l+o/1e6).toISOString(),windowEndedAt:ge({deviceBootWallClockMs:l,measuredAtMs:n,summaryStartNs:a,lastFrameNs:i.lastFrameNs}),timestampSource:`estimated-from-device-uptime`}}function y(e){return e.length===0?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function b(e,t){if(!(e===void 0||t===void 0))return Math.max(0,Math.round((t-e)/1e6))}function ge(e){let{deviceBootWallClockMs:t,measuredAtMs:n,summaryStartNs:r,lastFrameNs:i}=e;return r===void 0?i===void 0?void 0:new Date(t+i/1e6).toISOString():new Date(n).toISOString()}function x(e){if(e.length===0)return;let t=y(e);return b(t.firstFrameNs,t.lastFrameNs)}function S(e,t){let n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),r=e.match(RegExp(`^\\s*${n}:\\s*([0-9][0-9,]*)`,`im`));if(!r)return;let i=r[1];return i===void 0?void 0:d(i)??void 0}async function C(e,t,n={}){let r=a(e,n.adb);try{let i=ie((await r([`shell`,`dumpsys`,`gfxinfo`,t,`framestats`],{timeoutMs:15e3})).stdout,t,new Date().toISOString());return await w(e,t,n),i}catch(e){throw _e(t,e)}}async function w(e,t,n={}){let r=a(e,n.adb);try{await r([`shell`,`dumpsys`,`gfxinfo`,t,`reset`],{allowFailure:!0,timeoutMs:3e3})}catch{}}function _e(e,n){return n instanceof t?new t(n.code,n.message,{...n.details??{},metric:`fps`,package:e},n):new t(`COMMAND_FAILED`,`Failed to sample Android fps for ${e}`,{metric:`fps`,package:e},n)}function T(e,n,r,i){if(i instanceof t){let a=i.details??{};return new t(i.code,i.message,{...a,action:e,package:r,tool:n,hint:typeof a.hint==`string`?a.hint:ye(n,a)},i)}return new t(`COMMAND_FAILED`,`Failed to ${e} Android ${n} for ${r}`,{action:e,package:r,tool:n,hint:E(n)},i)}function E(e){return e===`simpleperf`?`Verify simpleperf is available, the app process is running, and the app/device permits native CPU profiling.`:`Verify perfetto is available, the app process is running, and the device permits trace capture.`}function ve(e){return e===`simpleperf`?`Use an emulator/system image with simpleperf available, or install the Android NDK simpleperf binary for this device.`:`Use Android 10+ or a system image that exposes the perfetto command-line binary.`}function ye(e,t){let n=(typeof t.stderr==`string`?t.stderr:``).toLowerCase();return e===`simpleperf`?be(n):Se(n)?`Use a device image that permits perfetto trace capture for shell, keep the app running, then retry perf trace start.`:E(e)}function be(e){return xe(e)?`Use a debuggable/profileable Android app or a device image that permits simpleperf for the target process, then retry perf cpu profile start.`:e.includes(`not supported`)||e.includes(`failed to open perf event`)?`This device image does not expose the requested simpleperf event for the app process. Try a different emulator/system image or a profileable app.`:E(`simpleperf`)}function xe(e){return e.includes(`permission denied`)||e.includes(`not profileable`)||e.includes(`profileable`)}function Se(e){return e.includes(`permission denied`)||e.includes(`not allowed`)}async function Ce(e,t,n,r,i){return{capture:{durationMs:r,packageName:t.packageName,appPid:t.appPid,artifactPath:t.outPath,sizeBytes:n},frameHealth:t.kind===`perfetto`?await we(e,t.packageName,i):void 0,notes:[t.kind===`perfetto`?`Frame health is sampled from Android gfxinfo around the trace window; open the Perfetto artifact for timeline root cause.`:`Open the Simpleperf report artifact for symbol-level CPU attribution.`]}}async function we(e,t,n){try{let r=await C(e,t,n);return{available:!0,droppedFramePercent:r.droppedFramePercent,droppedFrameCount:r.droppedFrameCount,totalFrameCount:r.totalFrameCount,method:r.method,worstWindows:r.worstWindows?.slice(0,3).map(e=>({startOffsetMs:e.startOffsetMs,endOffsetMs:e.endOffsetMs,missedDeadlineFrameCount:e.missedDeadlineFrameCount,worstFrameMs:e.worstFrameMs}))}}catch(e){return{available:!1,reason:e instanceof Error?e.message:`Android frame health was not available`}}}const D=`adb-shell-simpleperf`,O=`adb-shell-perfetto`,k=15e3,A=3e4,j=`/data/local/tmp`;async function M(e,t,n){let r=a(e,n.adb);await L(r,t),await R(r,t),await Oe(r,t);let i=await F(t.outPath);await P(r,t.remotePath);let o=Date.now(),s=Math.max(0,o-t.startedAt),c=await Ce(e,t,i,s,{adb:r});return{...t,action:`stop`,platform:`android`,state:`stopped`,stoppedAt:o,durationMs:s,sizeBytes:i,method:t.kind===`simpleperf`?D:O,artifact:{path:t.outPath,sizeBytes:i},summary:c,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function Te(e,t,n={}){let r=a(e,n.adb);try{t.state===`running`&&(await L(r,t),await R(r,t).catch(()=>{}))}finally{await P(r,t.remotePath)}}function N(e,t,n=j){return`${n}/agent-device-${e.replace(/[^A-Za-z0-9_.-]/g,`_`)}-${Date.now()}-${t}`}async function P(e,t){try{await e([`shell`,`rm -f ${I(t)}`],{allowFailure:!0,timeoutMs:k})}catch{}}async function Ee(e,t){await c.mkdir(s.dirname(e),{recursive:!0}),await c.writeFile(e,`${JSON.stringify(t,null,2)}\n`)}async function F(e){try{return(await c.stat(e)).size}catch(n){throw new t(`COMMAND_FAILED`,`Profiler artifact was not written: ${e}`,{outPath:e,hint:`Retry the profiling command and check daemon logs if the artifact path is still missing.`},n)}}function I(e){return`'${e.replace(/'/g,`'\\''`)}'`}async function L(e,t){try{await e([`shell`,De(t.profilerPid)],{timeoutMs:A})}catch(e){throw T(`stop`,t.kind,t.packageName,e)}}function De(e){return[`pid=${I(e)}`,`kill -INT "$pid" 2>/dev/null || true`,`for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done`,`kill -TERM "$pid" 2>/dev/null || true`,`for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done`,`echo "profiler process did not stop after SIGTERM" >&2`,`exit 1`].join(`; `)}async function Oe(e,n){await c.mkdir(s.dirname(n.outPath),{recursive:!0});try{await e([`pull`,n.remotePath,n.outPath],{timeoutMs:A})}catch(e){throw new t(`COMMAND_FAILED`,`Failed to pull Android ${n.kind} artifact for ${n.packageName}`,{package:n.packageName,tool:n.kind,remotePath:n.remotePath,outPath:n.outPath,hint:`Check that the profiling command ran long enough to create an artifact, then retry stop with the same session.`},e)}}async function R(e,n){let r;for(let t=0;t<12;t+=1){let t=await ke(e,n.remotePath);if(t!==void 0&&t>0&&t===r)return;r=t,await o(250)}throw new t(`COMMAND_FAILED`,`Android ${n.kind} artifact is not ready to pull`,{package:n.packageName,tool:n.kind,remotePath:n.remotePath,hint:`The profiler stopped, but the remote artifact was missing, empty, or still changing. Retry stop with the same session or inspect the device-side artifact.`})}async function ke(e,t){let n=I(t),r=await e([`shell`,`if [ -f ${n} ]; then stat -c %s ${n} 2>/dev/null || wc -c < ${n}; fi`],{allowFailure:!0,timeoutMs:k});if(r.exitCode!==0)return;let i=Number(r.stdout.trim().split(/\s+/)[0]);return Number.isFinite(i)?i:void 0}async function z(e,n){try{let t=await e([`shell`,`pidof`,n],{allowFailure:!0,timeoutMs:k}),r=V(t.stdout);if(t.exitCode===0&&r)return r}catch{}throw new t(`COMMAND_FAILED`,`No active Android app process found for ${n}`,{package:n,hint:`Run open <app> for this session again, wait for the app UI to appear, then retry perf.`})}async function B(e,n,r){let i=await e([`shell`,`command -v ${n} || which ${n}`],{allowFailure:!0,timeoutMs:k});if(!(i.exitCode===0&&i.stdout.trim()))throw new t(`UNSUPPORTED_OPERATION`,`Android device does not expose ${n}`,{package:r,tool:n,hint:ve(n)})}function V(e){return e.trim().split(/\s+/).find(e=>/^\d+$/.test(e))}async function H(e,t,n,r={}){let i=a(e,r.adb),o=await z(i,t);await B(i,`perfetto`,t);let s=N(t,`app.perfetto-trace`,`/data/misc/perfetto-traces`),c;try{await w(e,t,{adb:i}),c=await je(i,s,t)}catch(e){throw await P(i,s),e}return{type:`trace`,kind:`perfetto`,packageName:t,appPid:o,profilerPid:c,remotePath:s,outPath:n,startedAt:Date.now(),state:`running`,action:`start`,platform:`android`,method:O,message:`Started Android Perfetto trace for ${t}`}}async function Ae(e,t,n,r={}){return await M(e,{...t,outPath:n},r)}async function je(e,n,r){try{let i=V((await e([`shell`,`perfetto`,`--background-wait`,`-o`,n,`-t`,`3600s`,`sched`,`freq`,`idle`,`am`,`wm`,`gfx`,`view`,`binder_driver`,`hal`,`dalvik`],{timeoutMs:A})).stdout);if(i)return i;throw new t(`COMMAND_FAILED`,`Android perfetto did not return a profiler pid`,{package:r,tool:`perfetto`,hint:`Retry perf trace start. If perfetto exits immediately, verify the device permits trace capture.`})}catch(e){throw T(`start`,`perfetto`,r,e)}}function Me(e){let t=[];for(let r of n(e)){let e=r.match(/^([0-9]+(?:\.[0-9]+)?)%\s+(.+)$/);if(!e)continue;let n=Number(e[1]),i=e[2]?.trim();if(!Number.isFinite(n)||!i)continue;let a=i.split(/\s{2,}/).filter(Boolean);if(t.push({percentage:l(n),command:a[0],dso:a[1],symbol:a.slice(2).join(` `)||void 0}),t.length>=50)break}return t}async function Ne(e,t,n,r={}){let i=a(e,r.adb),o=await z(i,t);await B(i,`simpleperf`,t);let s=N(t,`cpu.perf.data`),c;try{c=await Ie(i,o,s,t)}catch(e){throw await P(i,s),e}return{type:`cpu-profile`,kind:`simpleperf`,packageName:t,appPid:o,profilerPid:c,remotePath:s,outPath:n,startedAt:Date.now(),state:`running`,action:`start`,platform:`android`,method:D,message:`Started Android Simpleperf CPU profile for ${t}`}}async function Pe(e,t,n,r={}){return await M(e,{...t,outPath:n},r)}async function Fe(e,t,n,r={}){let i=a(e,r.adb);await B(i,`simpleperf`,t.packageName);let o=await ze(i,t),s=new Date().toISOString(),c=Me(o.stdout),l=c.slice(0,10).map(e=>({symbol:e.symbol??`<unknown>`,binary:e.dso,selfSamplePercent:e.percentage}));await Ee(n,{kind:`simpleperf-report`,generatedAt:s,packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,sourceRemotePath:t.remotePath,entryCount:c.length,summary:{topFunctions:l},entries:c});let u=await F(n);return{action:`report`,platform:`android`,type:`cpu-profile-report`,kind:`simpleperf`,packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,outPath:n,sizeBytes:u,generatedAt:s,entryCount:c.length,summary:{topFunctions:l},method:D,message:`Wrote Android Simpleperf report for ${t.packageName}`}}async function Ie(e,n,r,i){try{let a=V((await e([`shell`,Le(n,r)],{timeoutMs:A})).stdout);if(a)return a;throw new t(`COMMAND_FAILED`,`Android simpleperf did not return a profiler pid`,{package:i,tool:`simpleperf`,hint:`Retry perf. If simpleperf exits immediately, verify the app is profileable and the device permits native profiling.`})}catch(e){throw T(`start`,`simpleperf`,i,e)}}function Le(e,t){return Re([`simpleperf`,`record`,`-e`,`cpu-clock:u`,`-p`,e,`-o`,t,`--duration`,`3600`],`simpleperf`)}function Re(e,t){let n=e.map(I).join(` `);return[`err=${I(`${j}/agent-device-${t}-${Date.now()}.err`)}`,`(${n}) >/dev/null 2>"$err" & pid=$!`,`sleep 1`,`if kill -0 "$pid" 2>/dev/null; then rm -f "$err"; echo "$pid"; exit 0; fi`,`cat "$err" >&2`,`rm -f "$err"`,`exit 1`].join(`; `)}async function ze(e,t){try{return await e([`shell`,`simpleperf`,`report`,`-i`,t.remotePath,`--stdio`,`--sort`,`comm,dso,symbol`],{timeoutMs:A})}catch(e){throw T(`report`,`simpleperf`,t.packageName,e)}}var Be=e({ANDROID_FRAME_SAMPLE_DESCRIPTION:()=>g,ANDROID_FRAME_SAMPLE_METHOD:()=>h,ANDROID_HPROF_SNAPSHOT_DESCRIPTION:()=>K,ANDROID_HPROF_SNAPSHOT_METHOD:()=>G,ANDROID_MEMORY_SAMPLE_DESCRIPTION:()=>W,ANDROID_MEMORY_SAMPLE_METHOD:()=>U,captureAndroidHeapSnapshot:()=>X,parseAndroidMemInfoSample:()=>Q,resetAndroidFramePerfStats:()=>w,sampleAndroidMemoryPerf:()=>Y});const U=`adb-shell-dumpsys-meminfo`,W=`Memory snapshot from adb shell dumpsys meminfo <package>. Values are reported in kilobytes.`,G=`adb-shell-am-dumpheap`,K=`Java heap dump captured with adb shell am dumpheap, pulled to a local artifact path.`,q=15e3,J=12e4;async function Y(e,t,n={}){let r=a(e,n.adb);try{return Q((await r([`shell`,`dumpsys`,`meminfo`,t],{timeoutMs:q})).stdout,t,new Date().toISOString())}catch(e){throw Ye(`memory`,t,e)}}async function X(e,n,o,l={}){let u=a(e,l.adb),d=await He(u,n),f=Ue(n);await c.mkdir(s.dirname(o),{recursive:!0});let p=await Ve(o);try{r(await u([`shell`,`am`,`dumpheap`,n,f],{allowFailure:!0,timeoutMs:J}),`Failed to capture Android heap dump for ${n}`,e=>({kind:`android-hprof`,package:n,pid:d,remotePath:f,hint:We(e.stdout,e.stderr)}));let e=await u([`pull`,f,o],{allowFailure:!0,timeoutMs:J});if(e.exitCode!==0)throw await Z(o,p),i(`Failed to pull Android heap dump for ${n}`,e,{kind:`android-hprof`,package:n,pid:d,remotePath:f,path:o,hint:`Verify the daemon can write the requested --out path and retry. The heap dump stays on-device only until cleanup runs.`});let a=await c.stat(o).catch(()=>null);if(!a?.isFile()||a.size<=0)throw await Z(o,p),new t(`COMMAND_FAILED`,`Android heap dump artifact is missing or empty`,{kind:`android-hprof`,package:n,pid:d,path:o,remotePath:f,hint:`Retry with a writable --out path. If the file is still empty, inspect adb pull output with --debug.`});return{available:!0,kind:`android-hprof`,path:o,sizeBytes:a.size,measuredAt:new Date().toISOString(),method:G,packageName:n,pid:d,remotePath:f}}finally{await u([`shell`,`rm`,`-f`,f],{allowFailure:!0,timeoutMs:q}).catch(()=>{})}}async function Ve(e){return await c.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function Z(e,t){t||await c.rm(e,{force:!0}).catch(()=>{})}function Q(e,n,r){if(/no process found for:/i.test(e))throw new t(`COMMAND_FAILED`,`Android meminfo did not find a running process for ${n}`,{metric:`memory`,package:n,hint:`Run open <app> for this session again to ensure the Android app is active, then retry perf.`});let i=$(e,`TOTAL PSS`)??Xe(e);if(i===void 0)throw new t(`COMMAND_FAILED`,`Failed to parse Android meminfo output for ${n}`,{metric:`memory`,package:n,hint:`Retry perf after reopening the app session. If the problem persists, capture adb shell dumpsys meminfo output for debugging.`});return{totalPssKb:i,totalRssKb:$(e,`TOTAL RSS`),measuredAt:r,method:U,topConsumers:Ge(e)}}async function He(e,n){let r=await e([`shell`,`pidof`,n],{allowFailure:!0,timeoutMs:q}),i=r.stdout.trim().split(/\s+/).map(e=>Number(e)).find(e=>Number.isInteger(e)&&e>0);if(r.exitCode===0&&i!==void 0)return i;throw new t(`COMMAND_FAILED`,`No running Android process found for ${n}`,{kind:`android-hprof`,package:n,stdout:r.stdout,stderr:r.stderr,hint:`Run open <app> for this session again to ensure the Android app is active, then retry perf memory snapshot.`})}function Ue(e){return`/data/local/tmp/agent-device-${e.replace(/[^a-zA-Z0-9._-]/g,`_`)}-${Date.now()}.hprof`}function We(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`profileable`)||n.includes(`debuggable`)||n.includes(`not allowed`)?`Android heap dumps require a debuggable/profileable app process on many devices. Use a debug/profileable build, reopen the app, then retry.`:n.includes(`permission`)||n.includes(`denied`)?`The device denied heap dump access. Use a debug/profileable build or a device image that permits app heap dumping.`:`Reopen the app to refresh the process, then retry perf memory snapshot. If it still fails, run with --debug and inspect adb am dumpheap output.`}function Ge(e){let t=e.split(`
3
- `).flatMap(e=>Ke(e)??[]).sort((e,t)=>t.pssKb-e.pssKb).slice(0,5);return t.length>0?t:void 0}function Ke(e){let t=e.trim();if(qe(t))return;let n=t.match(/^(.+?)\s+([0-9][0-9,]*(?:\(\d+\))?)(?:\s|$)/);if(n)return Je(n[1],n[2])}function qe(e){if(!e||e.startsWith(`**`)||e.startsWith(`-`)||e.includes(`:`))return!0;let t=/^\S.+\s+\d/.test(e);return/^(pss|total|native|dalvik|unknown|app summary\b)/i.test(e)&&!t}function Je(e,t){let n=e?.trim(),r=t?d(t):null;if(!(!n||n===`TOTAL`||r===null||r<=0)&&!/^(pss|private|shared|heap|size|alloc|free)$/i.test(n))return{name:n,pssKb:r}}function Ye(e,n,r){return r instanceof t?new t(r.code,r.message,{...r.details??{},metric:e,package:n},r):new t(`COMMAND_FAILED`,`Failed to sample Android ${e} for ${n}`,{metric:e,package:n},r)}function $(e,t){let n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),r=e.match(RegExp(`${n}:\\s*([0-9][0-9,]*)`,`i`));if(!r)return;let i=r[1];return i===void 0?void 0:d(i)??void 0}function Xe(e){for(let t of e.split(`
4
- `)){let e=t.trim();if(!/^TOTAL\b(?!\s+PSS:)/.test(e))continue;let n=e.split(/\s+/).slice(1).find(e=>d(e)!==null);return n?d(n)??void 0:void 0}}export{u as _,X as a,Ne as c,H as d,Ae as f,h as g,g as h,U as i,Pe as l,C as m,G as n,Be as o,Te as p,W as r,Y as s,K as t,Fe as u,l as v};
1
+ import{y as e}from"./sdk-contracts.js";import{runHarmonyHdc as t}from"./hdc.js";function n(e){let t=e.trim().split(/\s+/)[0];if(!t||!/^\d+$/.test(t))return;let n=Number.parseInt(t,10);return n>0?n:void 0}function r(e){let t=o(e,`VmRSS`);if(t===void 0)return;let n=o(e,`VmHWM`);return{totalRssKb:t,...n===void 0?{}:{peakRssKb:n}}}async function i(n,i){let o=await a(n,i),s=r((await t(n,[`shell`,`cat`,`/proc/${o}/status`],{timeoutMs:15e3})).stdout);if(!s)throw new e(`COMMAND_FAILED`,`Could not read resident memory for ${i}`,{hint:`Verify the app is still running, then retry perf memory sample.`,details:{bundleName:i,pid:o}});return{...s,measuredAt:new Date().toISOString(),method:`hdc-shell-proc-status`,pid:o}}async function a(r,i){let a=await t(r,[`shell`,`pidof`,i],{allowFailure:!0,timeoutMs:15e3}),o=a.exitCode===0?n(a.stdout):void 0;if(o!==void 0)return o;throw new e(`COMMAND_FAILED`,`Could not find a running process for ${i}`,{hint:`Open the app in this session, then retry perf memory sample.`,details:{bundleName:i}})}function o(e,t){let n=e.match(RegExp(`^${t}:\\s+(\\d+)\\s+kB$`,`m`));if(!n?.[1])return;let r=Number.parseInt(n[1],10);return Number.isFinite(r)?r:void 0}export{i as sampleHarmonyMemoryPerf};
@@ -1 +1 @@
1
- import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{l as n,s as r,v as i}from"./sdk-device.js";import{A as a,S as o,f as s}from"./sdk-android-adb.js";import{n as c,t as ee}from"./version.js";import{a as te,i as ne}from"./boot-diagnostics.js";import{n as re}from"./simctl.js";import{a as l,s as ie}from"./tool-provider.js";import{a as ae,i as oe,p as se,r as ce}from"./config.js";import u from"node:path";import d from"node:crypto";import f,{promises as p}from"node:fs";import m from"node:os";const h={iOS:{sdkName:{simulator:`iphonesimulator`,device:`iphoneos`},derivedBaseName:{simulator:`ios-simulator`,device:`ios-device`},xctestrunHints:{simulator:{preferred:[`iphonesimulator`],disallowed:[`iphoneos`,`appletvos`,`appletvsimulator`,`macos`]},device:{preferred:[`iphoneos`],disallowed:[`iphonesimulator`,`appletvos`,`appletvsimulator`,`macos`]}}},tvOS:{sdkName:{simulator:`appletvsimulator`,device:`appletvos`},derivedBaseName:{simulator:`tvos-simulator`,device:`tvos-device`},xctestrunHints:{simulator:{preferred:[`appletvsimulator`],disallowed:[`appletvos`,`iphoneos`,`iphonesimulator`,`macos`]},device:{preferred:[`appletvos`],disallowed:[`appletvsimulator`,`iphoneos`,`iphonesimulator`,`macos`]}}},macOS:{sdkName:{simulator:`macosx`,device:`macosx`},derivedBaseName:{simulator:`macos`,device:`macos`},xctestrunHints:{simulator:{preferred:[`macos`],disallowed:[`iphoneos`,`iphonesimulator`,`appletvos`,`appletvsimulator`]},device:{preferred:[`macos`],disallowed:[`iphoneos`,`iphonesimulator`,`appletvos`,`appletvsimulator`]}}},visionOS:{sdkName:{simulator:`xrsimulator`,device:`xros`},derivedBaseName:{simulator:`visionos-simulator`,device:`visionos-device`},xctestrunHints:{simulator:{preferred:[`xrsimulator`],disallowed:[`xros`,`iphoneos`,`iphonesimulator`,`appletvos`,`appletvsimulator`,`macos`]},device:{preferred:[`xros`],disallowed:[`xrsimulator`,`iphoneos`,`iphonesimulator`,`appletvos`,`appletvsimulator`,`macos`]}}}};function g(e){if(!r(e.platform))throw new t(`UNSUPPORTED_PLATFORM`,`Unsupported platform for Apple runner: ${e.platform}`);return n(e)?`macOS`:i(e.target,e.appleOs)}function le(e,t){return h[e].sdkName[_(t)]}function ue(e){return h[g(e)].derivedBaseName[_(e.kind)]}function de(e){return h[g(e)].xctestrunHints[_(e.kind)]}function fe(e){let t=g(e);return t===`macOS`?`platform=macOS,arch=${v()}`:e.kind===`simulator`?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`}function pe(e){let t=g(e);return t===`macOS`?`platform=macOS,arch=${v()}`:e.kind===`simulator`?`platform=${t} Simulator,id=${e.id}`:`generic/platform=${t}`}function me(e){let t=g(e);return t===`macOS`?`platform=macOS,arch=${v()}`:e.kind===`simulator`?`generic/platform=${t} Simulator`:`generic/platform=${t}`}function _(e){return e===`simulator`?`simulator`:`device`}function v(){return process.arch===`arm64`?`arm64`:`x86_64`}const he=u.join(`apple`,`runner`,`AgentDeviceRunner`),ge=u.join(`dist`,`apple`,`runner`,`AgentDeviceRunner`);function y(e){let t=u.join(e,he);return f.existsSync(t)?t:u.join(e,ge)}function _e(e){return u.join(y(e),`AgentDeviceRunner.xcodeproj`)}const ve=u.join(m.homedir(),`.agent-device`,`apple-runner`),ye=`.agent-device-runner-cache.json`,be=[`-IDEPackageSupportDisableManifestSandbox=1`,`-IDEPackageSupportDisablePluginExecutionSandbox=1`,`ENABLE_USER_SCRIPT_SANDBOXING=NO`],b=se();function x(e){return e?.trim()??``}function S(e=process.env){return x(e.AGENT_DEVICE_IOS_BUNDLE_ID)||x(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||`com.callstack.agentdevice.runner`}function C(e=process.env){return x(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID)||`${S(e)}.uitests`}function xe(e=process.env){let t=S(e),n=C(e);return Array.from(new Set([x(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${n}.xctrunner`,t].filter(e=>e.length>0)))}const w=xe(process.env);function Se(e,t=ee()){let n=g(e);return{schemaVersion:2,packageVersion:c(t),runnerSourceFingerprint:Oe(t),...Ce(n,e.kind),platformName:n,deviceKind:e.kind,target:e.target??`mobile`,buildDestinationFamily:me(e),runnerBundleBuildSettings:j(process.env),runnerSigningBuildSettings:A(process.env,e.kind===`device`,e),runnerPerformanceBuildSettings:M(),runnerSandboxBuildArgs:N()}}function Ce(e,t){let n=we(T(`xcodebuild`,[`-version`])),r=le(e,t);return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:r,sdkVersion:T(`xcrun`,[`--sdk`,r,`--show-sdk-version`]),sdkBuildVersion:T(`xcrun`,[`--sdk`,r,`--show-sdk-build-version`])}}function T(e,t){let n=JSON.stringify([e,t]),r=b.get(n);if(r!==void 0)return r;try{let r=o(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:128*1024}),i=r.exitCode===0&&r.stdout.trim()||`unknown`;return b.set(n,i),i}catch{return b.set(n,`unknown`),`unknown`}}function we(e){return{version:e.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||`unknown`,buildVersion:e.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||`unknown`}}function Te(e,t){let n=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(n)return u.resolve(n);let r=De(t),i=Ee(e);return u.join(i,r)}function Ee(e){return u.join(ve,`derived`,ue(e))}function De(e){return`cache-${d.createHash(`sha256`).update(D(E(e))).digest(`hex`).slice(0,16)}`}function E(e){let{artifacts:t,packageVersion:n,...r}=e;return r}function D(e){return JSON.stringify(O(e))}function O(e){return Array.isArray(e)?e.map(e=>O(e)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,O(t)]))}const k=new Map;function Oe(e){let t=y(e),n=Ae(t),r=ke(t,n),i=k.get(t);if(i?.fileStatsFingerprint===r)return i.sourceFingerprint;let a=d.createHash(`sha256`);for(let e of n){let n=u.relative(t,e);a.update(n),a.update(`\0`),a.update(f.readFileSync(e)),a.update(`\0`)}let o=a.digest(`hex`);return k.set(t,{fileStatsFingerprint:r,sourceFingerprint:o}),o}function ke(e,t){let n=d.createHash(`sha256`);for(let r of t){let t=u.relative(e,r),i=f.statSync(r);n.update(t),n.update(`\0`),n.update(String(i.size)),n.update(`\0`),n.update(String(Math.trunc(i.mtimeMs))),n.update(`\0`)}return n.digest(`hex`)}function Ae(e){if(!f.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop();for(let r of f.readdirSync(e,{withFileTypes:!0})){let i=u.join(e,r.name);if(r.isDirectory()){if(r.name===`xcuserdata`)continue;n.push(i);continue}r.isFile()&&je(r.name,i)&&t.push(i)}}return t.sort((e,t)=>e.localeCompare(t))}function je(e,t){return e===`project.pbxproj`?t.includes(`${u.sep}.xcodeproj${u.sep}`):[`.jpg`,`.json`,`.png`,`.swift`,`.m`,`.h`,`.plist`,`.entitlements`,`.xctestplan`,`.xcconfig`,`.storyboard`,`.xib`].includes(u.extname(e))}function Me(e){return n(e)||e.kind===`device`?`-maximum-concurrent-test-device-destinations`:`-maximum-concurrent-test-simulator-destinations`}function A(e=process.env,t=!1,r={platform:`apple`}){if(n(r))return[`CODE_SIGNING_ALLOWED=NO`,`CODE_SIGNING_REQUIRED=NO`,`CODE_SIGN_IDENTITY=`,`DEVELOPMENT_TEAM=`];if(!t)return[];let i=e.AGENT_DEVICE_IOS_TEAM_ID?.trim()||``,a=e.AGENT_DEVICE_IOS_SIGNING_IDENTITY?.trim()||``,o=e.AGENT_DEVICE_IOS_PROVISIONING_PROFILE?.trim()||``,s=[`CODE_SIGN_STYLE=Automatic`];return i&&s.push(`DEVELOPMENT_TEAM=${i}`),a&&s.push(`CODE_SIGN_IDENTITY=${a}`),o&&s.push(`PROVISIONING_PROFILE_SPECIFIER=${o}`),s}function j(e=process.env){let t=S(e),n=C(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${n}`]}function M(){return[`COMPILER_INDEX_STORE_ENABLE=NO`,`ENABLE_CODE_COVERAGE=NO`,`ONLY_ACTIVE_ARCH=YES`,`ENABLE_PREVIEWS=NO`,`ENABLE_DEBUG_DYLIB=NO`]}function N(){return[...be,`OTHER_SWIFT_FLAGS=${Ne(process.env)}`]}function Ne(e){return te(e.AGENT_DEVICE_XCUITEST_INCLUDE_UNIT_TESTS)?`$(inherited) -disable-sandbox -D AGENT_DEVICE_RUNNER_UNIT_TESTS`:`$(inherited) -disable-sandbox`}async function P(e,n,r={}){let i=[`devicectl`,...e],a=await l(i,{allowFailure:!0,signal:r.signal,timeoutMs:r.timeoutMs??2e4});if(a.exitCode===0)return;let{stdout:o,stderr:c}=a;if(!r.tolerateOutput?.(o,c))throw new t(`COMMAND_FAILED`,`Failed to ${n.action}`,s(a,{cmd:`xcrun`,args:i,stdout:o,stderr:c,deviceId:n.deviceId,hint:H(o,c)??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}async function F(e,t){return Be(Re(await L(e,{jsonPrefix:`agent-device-ios-apps`,args:[`devicectl`,`device`,`info`,`apps`,`--device`,e.id,`--include-all-apps`],failureMessage:`Failed to list iOS apps`,parseFailureMessage:`Failed to parse iOS apps list`})),t)}async function Pe(e){let n=await L(e,{jsonPrefix:`agent-device-ios-processes`,args:[`devicectl`,`device`,`info`,`processes`,`--device`,e.id],failureMessage:`Failed to list iOS processes`,parseFailureMessage:`Failed to parse iOS process list`,fallbackHint:V});if(!Ie(n))throw new t(`COMMAND_FAILED`,`Unsupported iOS process list response`,{deviceId:e.id,hint:V});return ze(n)}async function Fe(e,t){let{appBundleUrl:n,processes:r}=await I(e,t),i=r.sort((e,t)=>z(e,n)-z(t,n))[0];i&&await L(e,{jsonPrefix:`agent-device-ios-process-terminate`,args:[`devicectl`,`device`,`process`,`terminate`,`--device`,e.id,`--pid`,String(i.pid),`--kill`],failureMessage:`Failed to terminate iOS app`,parseFailureMessage:`Failed to parse iOS process termination response`,tolerateFailurePayload:Le})}async function I(e,n){let r=(await F(e,`all`)).find(e=>e.bundleId===n);if(!r)throw new t(`APP_NOT_INSTALLED`,`No iOS device app found for ${n}`,{appBundleId:n,deviceId:e.id});if(!r.url)throw new t(`COMMAND_FAILED`,`Missing app bundle URL for ${n}`,{appBundleId:n,deviceId:e.id,hint:`Installed-app metadata from devicectl did not include the bundle URL required to match running processes. Use an Xcode/CoreDevice toolchain that reports app URLs.`});let i=r.url.replace(/\/+$/,``);return{appBundleUrl:i,processes:(await Pe(e)).filter(e=>e.executable.startsWith(`${i}/`))}}async function L(e,n){let r=u.join(m.tmpdir(),`${n.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),i=[...n.args,`--json-output`,r],a=await l(i,{allowFailure:!0,timeoutMs:ce});try{if(a.exitCode!==0){let{stdout:o,stderr:c}=a;if(n.tolerateFailurePayload){let e=await R(r).catch(()=>void 0);if(e!==void 0&&n.tolerateFailurePayload(e))return e}throw new t(`COMMAND_FAILED`,n.failureMessage,s(a,{cmd:`xcrun`,args:i,stdout:o,stderr:c,deviceId:e.id,hint:H(o,c)??n.fallbackHint??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}return await R(r)}catch(r){throw r instanceof t?r:new t(`COMMAND_FAILED`,n.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await p.unlink(r).catch(()=>{})}}async function R(e){return JSON.parse(await p.readFile(e,`utf8`))}function z(e,t){return e.executable.slice(t.length+1).split(`/`).length}function Ie(e){return Array.isArray(e?.result?.runningProcesses)}function Le(e){let t=e?.error?.userInfo?.NSUnderlyingError?.error;return t?.domain===`NSPOSIXErrorDomain`&&t.code===3}function Re(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.bundleIdentifier==`string`?e.bundleIdentifier.trim():``;if(!t)continue;let r=typeof e.name==`string`&&e.name.trim().length>0?e.name.trim():t,i=typeof e.url==`string`&&e.url.trim().length>0?e.url.trim():void 0;n.push({bundleId:t,name:r,url:i})}return n}function ze(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.executable==`string`?e.executable.trim():``,r=typeof e.processIdentifier==`number`&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;!t||!Number.isFinite(r)||n.push({executable:t,pid:r})}return n}function Be(e,t){return ie(e,t)}const B=`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`,V=`This Xcode/CoreDevice toolchain must support 'devicectl device info processes' with JSON runningProcesses so agent-device can resolve app process IDs. Inspect diagnostics for the exact devicectl API failure.`;function H(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`device is busy`)&&n.includes(`connecting`)?`iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.`:n.includes(`coredeviceservice`)&&n.includes(`timed out`)?`CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.`:n.includes(`developer disk image`)||n.includes(`developer mode is disabled`)?`Enable Developer Mode on the iOS device (Settings > Privacy & Security > Developer Mode), restart it when prompted, unlock it, then retry.`:n.includes(`must be paired`)?`Pair the iOS device with this Mac: connect it by cable, unlock it, accept the Trust prompt, and enter the device passcode, then retry.`:null}function U(e,t){return re(e,t)}function Ve(e,t,n){return l(U(e,t),n)}function He(e){return e.includes(`not installed`)||e.includes(`not found`)||e.includes(`no such file`)}async function Ue(e,t){return await F(e,t)}async function We(e,t,n){await P([`device`,`install`,`app`,`--device`,e.id,t],{action:`install iOS app`,deviceId:e.id},{signal:n,timeoutMs:oe})}async function Ge(e,t,n){await P([`device`,`uninstall`,`app`,`--device`,e.id,t],{action:`uninstall iOS app ${t}`,deviceId:e.id},{signal:n,tolerateOutput:(e,t)=>He(`${e}\n${t}`.toLowerCase())})}async function Ke(e,t){await Fe(e,t)}async function qe(e,t){return await I(e,t)}const W=1e4;async function Je(e,t,n={}){let r=[`device`,`process`,`launch`,`--device`,e.id,t];n.payloadUrl&&r.push(`--payload-url`,n.payloadUrl),n.launchArgs&&n.launchArgs.length>0&&r.push(`--`,...n.launchArgs),await P(r,{action:`launch iOS app`,deviceId:e.id})}async function Ye(e,n){try{let{result:r,parsed:i}=await G(e.id,15e3,3e3,n);if(r.exitCode===0){if(!i.parsed)throw new t(`COMMAND_FAILED`,`iOS device readiness probe failed`,{kind:`probe_inconclusive`,deviceId:e.id,stdout:r.stdout,stderr:r.stderr,hint:`CoreDevice returned success but readiness JSON output was missing or invalid. Retry; if it persists restart Xcode and the iOS device.`});let n=i.tunnelState?.toLowerCase();if(n===`connecting`)throw new t(`COMMAND_FAILED`,`iOS device is not ready for automation`,{kind:`not_ready`,deviceId:e.id,tunnelState:n,hint:`Device tunnel is still connecting. Keep the device unlocked and connected by cable until it is fully available in Xcode Devices, then retry.`});return}throw new t(`COMMAND_FAILED`,`iOS device is not ready for automation`,s(r,{kind:`not_ready`,deviceId:e.id,tunnelState:i.tunnelState,hint:q(r.stdout,r.stderr)}))}catch(t){throw Xe(e.id,t)}}function Xe(e,n){return!(n instanceof t)||n.code!==`COMMAND_FAILED`?Qe(e,n):(typeof n.details?.kind==`string`?n.details.kind:``)===`not_ready`?n:Ze(e,n)}function Ze(e,n){let r=n.details??{},i=String(r.stdout??``),a=String(r.stderr??``),o=Number(r.timeoutMs??15e3),s=`CoreDevice did not respond within ${o}ms. Keep the device unlocked and trusted, then retry; if it persists restart Xcode and the iOS device.`;return new t(`COMMAND_FAILED`,`iOS device readiness probe failed`,{deviceId:e,cause:n.message,timeoutMs:o,stdout:i,stderr:a,hint:i||a?q(i,a):s},n)}function Qe(e,n){return new t(`COMMAND_FAILED`,`iOS device readiness probe failed`,{deviceId:e,hint:`Reconnect the device, keep it unlocked, and retry.`},n instanceof Error?n:void 0)}async function $e(e,t){if(typeof t==`number`&&t<=0)return null;let n=typeof t==`number`?Math.max(1,Math.min(W,t)):W;try{let t=await G(e.id,n);return t.result.exitCode!==0||!t.parsed.parsed||t.parsed.outcome&&t.parsed.outcome!==`success`?null:t.parsed.tunnelIp??null}catch{return null}}async function G(e,t,n=0,r){let i=u.join(m.tmpdir(),`agent-device-coredevice-info-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),a=Math.max(1,Math.ceil(t/1e3));try{return{result:await l([`devicectl`,`device`,`info`,`details`,`--device`,e,`--json-output`,i,`--timeout`,String(a)],{allowFailure:!0,signal:r,timeoutMs:t+n}),parsed:await et(i)}}finally{await p.rm(i,{force:!0}).catch(()=>{})}}async function et(e){try{return{parsed:!0,...tt(JSON.parse(await p.readFile(e,`utf8`)))}}catch{return{parsed:!1}}}function tt(e){let t=e?.result;if(!t||typeof t!=`object`)return{};let n=t.connectionProperties,r=t.device?.connectionProperties,i=K(n?.tunnelState)??K(r?.tunnelState),a=K(n?.tunnelIPAddress)??K(r?.tunnelIPAddress),o=K(e?.info?.outcome);return{...o?{outcome:o}:{},...i?{tunnelState:i}:{},...a?{tunnelIp:a}:{}}}function K(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function q(e,t){return H(e,t)||(`${e}\n${t}`.toLowerCase().includes(`timed out waiting for all destinations`)?`Xcode destination did not become available in time. Keep device unlocked and retry.`:B)}async function J(e,n,r,i=ae){let a=ne.fromTimeoutMs(i),o={exitCode:1,stdout:``,stderr:``};for(let t of w)if(o=await l([`devicectl`,`device`,`copy`,`from`,`--device`,e.id,`--source`,n,`--destination`,r,`--domain-type`,`appDataContainer`,`--domain-identifier`,t],{allowFailure:!0,timeoutMs:nt(a,i)}),o.exitCode===0)return;throw new t(`COMMAND_FAILED`,`Failed to copy runner file from iOS device: ${o.stderr.trim()||o.stdout.trim()||`devicectl exited with code ${o.exitCode}`}`)}function nt(e,n){let r=e.remainingMs();if(r>0)return r;throw new t(`COMMAND_FAILED`,`iOS runner file copy timed out after ${n}ms`,{timeoutMs:n,step:`runner file copy`})}function Y(e){if(!(e instanceof t))return{reason:e instanceof Error?e.message:String(e)};let n=e.details??{},r=Array.isArray(n.args)?n.args.filter(e=>typeof e==`string`).join(` `):void 0;return{errorCode:e.code,reason:e.message,timeoutMs:typeof n.timeoutMs==`number`?n.timeoutMs:void 0,exitCode:typeof n.exitCode==`number`?n.exitCode:void 0,stderr:typeof n.stderr==`string`&&n.stderr.trim()?n.stderr:void 0,stdout:typeof n.stdout==`string`&&n.stdout.trim()?n.stdout:void 0,commandArgs:r}}function X(e){let t=e.details??{},n=typeof t.stdout==`string`?t.stdout:``,r=typeof t.stderr==`string`?t.stderr:``,i=Array.isArray(t.args)?t.args.filter(e=>typeof e==`string`).join(` `):``;return`${e.message}\n${n}\n${r}\n${i}`.toLowerCase()}async function rt(e,t,n){if(!n.preferRunner)try{await P([`device`,`capture`,`screenshot`,`--device`,e.id,`--destination`,t],{action:`capture iOS screenshot`,deviceId:e.id});return}catch(t){if(!st(t))throw t;ot(e,t)}let r=await Z(e,n,!1);await Q(r,t)||await J(e,at(r),t)}async function it(e,n,r){if(!await Q(await Z(e,r,!0),n))throw new t(`COMMAND_FAILED`,`Failed to capture iOS screenshot: XCTest runner returned no inline image`,{deviceId:e.id,backend:`xctest`})}async function Z(e,t,n){return await t.runRunnerCommand(e,{command:`screenshot`,appBundleId:t.appBundleId,fullscreen:t.fullscreen,inlineScreenshot:n},t.runnerOptions??{})}async function Q(e,t){let n=e.imageBase64;return typeof n!=`string`||n.length===0?!1:(await p.writeFile(t,Buffer.from(n,`base64`)),!0)}function at(e){let n=e.message;if(typeof n==`string`&&n.length>0)return n;throw new t(`COMMAND_FAILED`,`Failed to capture iOS screenshot: runner returned no file path`)}function ot(e,t){a({level:`warn`,phase:`ios_screenshot_fallback`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:`devicectl_screenshot`,to:`runner`,...Y(t)}})}function st(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=X(e);return n.includes(`unknown option '--device'`)||n.includes(`unknown subcommand`)&&n.includes(`screenshot`)||n.includes(`unrecognized subcommand`)&&n.includes(`screenshot`)}var ct=e({resolveIosPhysicalDeviceControl:()=>$});const lt={coredevice:{backend:`coredevice`,assertAppInstallationSupported:()=>{},ensureReady:Ye,listApps:Ue,installApp:We,uninstallApp:Ge,launchApp:Je,terminateApp:async(e,t)=>await Ke(e,t),resolveAppProcesses:qe,captureScreenshot:rt,copyRunnerFile:J,resolveTunnel:async(e,t)=>({tunnelIp:await $e(e,t)})},xctest:{backend:`xctest`,assertAppInstallationSupported:ut,ensureReady:gt,listApps:ft,installApp:dt,uninstallApp:dt,launchApp:_t,terminateApp:vt,resolveAppProcesses:pt,captureScreenshot:it,copyRunnerFile:ht,resolveTunnel:mt}};function $(e){return lt[e.iosPhysicalDeviceBackend===`xctest`?`xctest`:`coredevice`]}function ut(e){throw new t(`UNSUPPORTED_OPERATION`,`Installing apps is unavailable on this XCTest-backed physical iOS device.`,{deviceId:e.id,backend:`xctest`,hint:`Install the app with Xcode, then open it in agent-device by bundle ID.`})}async function dt(e){return ut(e)}async function ft(e){throw new t(`UNSUPPORTED_OPERATION`,`App inventory is unavailable on this XCTest-backed physical iOS device.`,{deviceId:e.id,backend:`xctest`,hint:`Use an installed app bundle ID when opening the device.`})}async function pt(e){throw new t(`UNSUPPORTED_OPERATION`,`Process lookup is unavailable on this XCTest-backed physical iOS device.`,{deviceId:e.id,backend:`xctest`,hint:`Use a CoreDevice-backed iOS device for performance sampling.`})}async function mt(e){throw new t(`UNSUPPORTED_OPERATION`,`XCTest-backed physical iOS devices have no CoreDevice tunnel.`,{deviceId:e.id,backend:`xctest`,hint:`Connect the device by cable so it is reachable through usbmux.`})}async function ht(e){throw new t(`UNSUPPORTED_OPERATION`,`Runner file copy is unavailable on this XCTest-backed physical iOS device.`,{deviceId:e.id,backend:`xctest`})}async function gt(e,n){let r=[`xcdevice`,`wait`,`--both`,`--timeout=15`,e.id],i=await l(r,{allowFailure:!0,signal:n,timeoutMs:18e3});if(i.exitCode!==0)throw new t(`COMMAND_FAILED`,`iOS device is not ready for XCTest automation`,s(i,{cmd:`xcrun`,args:r,deviceId:e.id,backend:`xctest`,hint:"Keep the device unlocked, trusted, connected, and visible in `xcrun xcdevice list`, then retry."}))}async function _t(e,n,r){if(r.payloadUrl||r.launchArgs&&r.launchArgs.length>0)throw new t(`UNSUPPORTED_OPERATION`,`XCTest-backed physical iOS devices do not support deep links or launch arguments during open.`,{deviceId:e.id,backend:`xctest`,hint:`Open the installed app by bundle ID without a URL or --launch-args.`});await r.runRunnerCommand(e,{command:`activate`,appBundleId:n},r.runnerOptions??{})}async function vt(e,t,n){await n.runRunnerCommand(e,{command:`terminate`,appBundleId:t},n.runnerOptions??{})}export{fe as C,pe as S,M as _,Ve as a,D as b,H as c,E as d,Se as f,Me as g,Te as h,Y as i,w as l,j as m,$ as n,U as o,S as p,X as r,B as s,ct as t,ye as u,N as v,de as w,_e as x,A as y};
1
+ import{y as e}from"./sdk-contracts.js";import{r as t}from"./diagnostics.js";import{f as n}from"./owner-identity.js";import{n as r}from"./exec.js";import"./diagnostics2.js";import"./command.js";import{n as i}from"./retry.js";import"./process.js";import{C as a,E as o,T as s,p as c,y as l}from"./host-file.js";import{a as u,i as d,r as ee}from"./config2.js";import{c as te,o as f}from"./tool-provider.js";import{t as p}from"./apps-simctl.js";import"./runner.js";import{t as m}from"./runner-cache-metadata.js";import h from"node:path";async function g(t,n,i={}){let a=[`devicectl`,...t],o=await f(a,{allowFailure:!0,signal:i.signal,timeoutMs:i.timeoutMs??2e4});if(o.exitCode===0)return;let{stdout:s,stderr:c}=o;if(!i.tolerateOutput?.(s,c))throw new e(`COMMAND_FAILED`,`Failed to ${n.action}`,r(o,{cmd:`xcrun`,args:a,stdout:s,stderr:c,deviceId:n.deviceId,hint:D(s,c)??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}async function _(e,t){return ae(re(await x(e,{jsonPrefix:`agent-device-ios-apps`,args:[`devicectl`,`device`,`info`,`apps`,`--device`,e.id,`--include-all-apps`],failureMessage:`Failed to list iOS apps`,parseFailureMessage:`Failed to parse iOS apps list`})),t)}async function v(t){let n=await x(t,{jsonPrefix:`agent-device-ios-processes`,args:[`devicectl`,`device`,`info`,`processes`,`--device`,t.id],failureMessage:`Failed to list iOS processes`,parseFailureMessage:`Failed to parse iOS process list`,fallbackHint:E});if(!ne(n))throw new e(`COMMAND_FAILED`,`Unsupported iOS process list response`,{deviceId:t.id,hint:E});return ie(n)}async function y(e,t){let{appBundleUrl:n,processes:r}=await b(e,t),i=r.sort((e,t)=>C(e,n)-C(t,n))[0];i&&await x(e,{jsonPrefix:`agent-device-ios-process-terminate`,args:[`devicectl`,`device`,`process`,`terminate`,`--device`,e.id,`--pid`,String(i.pid),`--kill`],failureMessage:`Failed to terminate iOS app`,parseFailureMessage:`Failed to parse iOS process termination response`,tolerateFailurePayload:w})}async function b(t,n){let r=(await _(t,`all`)).find(e=>e.bundleId===n);if(!r)throw new e(`APP_NOT_INSTALLED`,`No iOS device app found for ${n}`,{appBundleId:n,deviceId:t.id});if(!r.url)throw new e(`COMMAND_FAILED`,`Missing app bundle URL for ${n}`,{appBundleId:n,deviceId:t.id,hint:`Installed-app metadata from devicectl did not include the bundle URL required to match running processes. Use an Xcode/CoreDevice toolchain that reports app URLs.`});let i=r.url.replace(/\/+$/,``);return{appBundleUrl:i,processes:(await v(t)).filter(e=>e.executable.startsWith(`${i}/`))}}async function x(t,i){let a=h.join(c(),`${i.jsonPrefix}-${n()}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),o=[...i.args,`--json-output`,a],l=await f(o,{allowFailure:!0,timeoutMs:ee});try{if(l.exitCode!==0){let{stdout:n,stderr:s}=l;if(i.tolerateFailurePayload){let e=await S(a).catch(()=>void 0);if(e!==void 0&&i.tolerateFailurePayload(e))return e}throw new e(`COMMAND_FAILED`,i.failureMessage,r(l,{cmd:`xcrun`,args:o,stdout:n,stderr:s,deviceId:t.id,hint:D(n,s)??i.fallbackHint??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}return await S(a)}catch(n){throw n instanceof e?n:new e(`COMMAND_FAILED`,i.parseFailureMessage,{deviceId:t.id,cause:String(n)})}finally{await s(a).catch(()=>{})}}async function S(e){return JSON.parse(await l(e))}function C(e,t){return e.executable.slice(t.length+1).split(`/`).length}function ne(e){return Array.isArray(e?.result?.runningProcesses)}function w(e){let t=e?.error?.userInfo?.NSUnderlyingError?.error;return t?.domain===`NSPOSIXErrorDomain`&&t.code===3}function re(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.bundleIdentifier==`string`?e.bundleIdentifier.trim():``;if(!t)continue;let r=typeof e.name==`string`&&e.name.trim().length>0?e.name.trim():t,i=typeof e.url==`string`&&e.url.trim().length>0?e.url.trim():void 0;n.push({bundleId:t,name:r,url:i})}return n}function ie(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.executable==`string`?e.executable.trim():``,r=typeof e.processIdentifier==`number`&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;!t||!Number.isFinite(r)||n.push({executable:t,pid:r})}return n}function ae(e,t){return te(e,t)}const T=`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`,E=`This Xcode/CoreDevice toolchain must support 'devicectl device info processes' with JSON runningProcesses so agent-device can resolve app process IDs. Inspect diagnostics for the exact devicectl API failure.`;function D(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`device is busy`)&&n.includes(`connecting`)?`iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.`:n.includes(`coredeviceservice`)&&n.includes(`timed out`)?`CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.`:n.includes(`developer disk image`)||n.includes(`developer mode is disabled`)?`Enable Developer Mode on the iOS device (Settings > Privacy & Security > Developer Mode), restart it when prompted, unlock it, then retry.`:n.includes(`must be paired`)?`Pair the iOS device with this Mac: connect it by cable, unlock it, accept the Trust prompt, and enter the device passcode, then retry.`:null}async function O(e,t){return await _(e,t)}async function k(e,t,n){await g([`device`,`install`,`app`,`--device`,e.id,t],{action:`install iOS app`,deviceId:e.id},{signal:n,timeoutMs:d})}async function A(e,t,n){await g([`device`,`uninstall`,`app`,`--device`,e.id,t],{action:`uninstall iOS app ${t}`,deviceId:e.id},{signal:n,tolerateOutput:(e,t)=>p(`${e}\n${t}`.toLowerCase())})}async function j(e,t){await y(e,t)}async function M(e,t){return await b(e,t)}const N=1e4;async function P(e,t,n={}){let r=[`device`,`process`,`launch`,`--device`,e.id,t];n.payloadUrl&&r.push(`--payload-url`,n.payloadUrl),n.launchArgs&&n.launchArgs.length>0&&r.push(`--`,...n.launchArgs),await g(r,{action:`launch iOS app`,deviceId:e.id})}async function F(t,n){try{let{result:i,parsed:a}=await B(t.id,15e3,3e3,n);if(i.exitCode===0){if(!a.parsed)throw new e(`COMMAND_FAILED`,`iOS device readiness probe failed`,{kind:`probe_inconclusive`,deviceId:t.id,stdout:i.stdout,stderr:i.stderr,hint:`CoreDevice returned success but readiness JSON output was missing or invalid. Retry; if it persists restart Xcode and the iOS device.`});let n=a.tunnelState?.toLowerCase();if(n===`connecting`)throw new e(`COMMAND_FAILED`,`iOS device is not ready for automation`,{kind:`not_ready`,deviceId:t.id,tunnelState:n,hint:`Device tunnel is still connecting. Keep the device unlocked and connected by cable until it is fully available in Xcode Devices, then retry.`});return}throw new e(`COMMAND_FAILED`,`iOS device is not ready for automation`,r(i,{kind:`not_ready`,deviceId:t.id,tunnelState:a.tunnelState,hint:W(i.stdout,i.stderr)}))}catch(e){throw I(t.id,e)}}function I(t,n){return!(n instanceof e)||n.code!==`COMMAND_FAILED`?R(t,n):(typeof n.details?.kind==`string`?n.details.kind:``)===`not_ready`?n:L(t,n)}function L(t,n){let r=n.details??{},i=String(r.stdout??``),a=String(r.stderr??``),o=Number(r.timeoutMs??15e3),s=`CoreDevice did not respond within ${o}ms. Keep the device unlocked and trusted, then retry; if it persists restart Xcode and the iOS device.`;return new e(`COMMAND_FAILED`,`iOS device readiness probe failed`,{deviceId:t,cause:n.message,timeoutMs:o,stdout:i,stderr:a,hint:i||a?W(i,a):s},n)}function R(t,n){return new e(`COMMAND_FAILED`,`iOS device readiness probe failed`,{deviceId:t,hint:`Reconnect the device, keep it unlocked, and retry.`},n instanceof Error?n:void 0)}async function z(e,t){if(typeof t==`number`&&t<=0)return null;let n=typeof t==`number`?Math.max(1,Math.min(N,t)):N;try{let t=await B(e.id,n);return t.result.exitCode!==0||!t.parsed.parsed||t.parsed.outcome&&t.parsed.outcome!==`success`?null:t.parsed.tunnelIp??null}catch{return null}}async function B(e,t,r=0,i){let o=h.join(c(),`agent-device-coredevice-info-${n()}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),s=Math.max(1,Math.ceil(t/1e3));try{return{result:await f([`devicectl`,`device`,`info`,`details`,`--device`,e,`--json-output`,o,`--timeout`,String(s)],{allowFailure:!0,signal:i,timeoutMs:t+r}),parsed:await V(o)}}finally{await a(o).catch(()=>{})}}async function V(e){try{return{parsed:!0,...H(JSON.parse(await l(e)))}}catch{return{parsed:!1}}}function H(e){let t=e?.result;if(!t||typeof t!=`object`)return{};let n=t.connectionProperties,r=t.device?.connectionProperties,i=U(n?.tunnelState)??U(r?.tunnelState),a=U(n?.tunnelIPAddress)??U(r?.tunnelIPAddress),o=U(e?.info?.outcome);return{...o?{outcome:o}:{},...i?{tunnelState:i}:{},...a?{tunnelIp:a}:{}}}function U(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function W(e,t){return D(e,t)||(`${e}\n${t}`.toLowerCase().includes(`timed out waiting for all destinations`)?`Xcode destination did not become available in time. Keep device unlocked and retry.`:T)}async function G(t,n,r,a=u){let o=i.fromTimeoutMs(a),s={exitCode:1,stdout:``,stderr:``};for(let e of m)if(s=await f([`devicectl`,`device`,`copy`,`from`,`--device`,t.id,`--source`,n,`--destination`,r,`--domain-type`,`appDataContainer`,`--domain-identifier`,e],{allowFailure:!0,timeoutMs:K(o,a)}),s.exitCode===0)return;let c=s.stderr.trim()||s.stdout.trim()||`devicectl exited with code ${s.exitCode}`;throw new e(`COMMAND_FAILED`,`Failed to copy runner file from iOS device: ${c}`)}function K(t,n){let r=t.remainingMs();if(r>0)return r;throw new e(`COMMAND_FAILED`,`iOS runner file copy timed out after ${n}ms`,{timeoutMs:n,step:`runner file copy`})}function q(t){if(!(t instanceof e))return{reason:t instanceof Error?t.message:String(t)};let n=t.details??{},r=Array.isArray(n.args)?n.args.filter(e=>typeof e==`string`).join(` `):void 0;return{errorCode:t.code,reason:t.message,timeoutMs:typeof n.timeoutMs==`number`?n.timeoutMs:void 0,exitCode:typeof n.exitCode==`number`?n.exitCode:void 0,stderr:typeof n.stderr==`string`&&n.stderr.trim()?n.stderr:void 0,stdout:typeof n.stdout==`string`&&n.stdout.trim()?n.stdout:void 0,commandArgs:r}}function J(e){let t=e.details??{},n=typeof t.stdout==`string`?t.stdout:``,r=typeof t.stderr==`string`?t.stderr:``,i=Array.isArray(t.args)?t.args.filter(e=>typeof e==`string`).join(` `):``;return`${e.message}\n${n}\n${r}\n${i}`.toLowerCase()}async function oe(e,t,n){if(!n.preferRunner)try{await g([`device`,`capture`,`screenshot`,`--device`,e.id,`--destination`,t],{action:`capture iOS screenshot`,deviceId:e.id});return}catch(t){if(!ue(t))throw t;le(e,t)}let r=await Y(e,n,!1);await X(r,t)||await G(e,ce(r),t)}async function se(t,n,r){if(!await X(await Y(t,r,!0),n))throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: XCTest runner returned no inline image`,{deviceId:t.id,backend:`xctest`})}async function Y(e,t,n){return await t.runRunnerCommand(e,{command:`screenshot`,appBundleId:t.appBundleId,fullscreen:t.fullscreen,inlineScreenshot:n},t.runnerOptions??{})}async function X(e,t){let n=e.imageBase64;return typeof n!=`string`||n.length===0?!1:(await o(t,Buffer.from(n,`base64`)),!0)}function ce(t){let n=t.message;if(typeof n==`string`&&n.length>0)return n;throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: runner returned no file path`)}function le(e,n){t({level:`warn`,phase:`ios_screenshot_fallback`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:`devicectl_screenshot`,to:`runner`,...q(n)}})}function ue(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=J(t);return n.includes(`unknown option '--device'`)||n.includes(`unknown subcommand`)&&n.includes(`screenshot`)||n.includes(`unrecognized subcommand`)&&n.includes(`screenshot`)}const de={coredevice:{backend:`coredevice`,assertAppInstallationSupported:()=>{},ensureReady:F,listApps:O,installApp:k,uninstallApp:A,launchApp:P,terminateApp:async(e,t)=>await j(e,t),resolveAppProcesses:M,captureScreenshot:oe,copyRunnerFile:G,resolveTunnel:async(e,t)=>({tunnelIp:await z(e,t)})},xctest:{backend:`xctest`,assertAppInstallationSupported:Z,ensureReady:ge,listApps:pe,installApp:Q,uninstallApp:Q,launchApp:_e,terminateApp:ve,resolveAppProcesses:$,captureScreenshot:se,copyRunnerFile:he,resolveTunnel:me}};function fe(e){return de[e.iosPhysicalDeviceBackend===`xctest`?`xctest`:`coredevice`]}function Z(t){throw new e(`UNSUPPORTED_OPERATION`,`Installing apps is unavailable on this XCTest-backed physical iOS device.`,{deviceId:t.id,backend:`xctest`,hint:`Install the app with Xcode, then open it in agent-device by bundle ID.`})}async function Q(e){return Z(e)}async function pe(t){throw new e(`UNSUPPORTED_OPERATION`,`App inventory is unavailable on this XCTest-backed physical iOS device.`,{deviceId:t.id,backend:`xctest`,hint:`Use an installed app bundle ID when opening the device.`})}async function $(t){throw new e(`UNSUPPORTED_OPERATION`,`Process lookup is unavailable on this XCTest-backed physical iOS device.`,{deviceId:t.id,backend:`xctest`,hint:`Use a CoreDevice-backed iOS device for performance sampling.`})}async function me(t){throw new e(`UNSUPPORTED_OPERATION`,`XCTest-backed physical iOS devices have no CoreDevice tunnel.`,{deviceId:t.id,backend:`xctest`,hint:`Connect the device by cable so it is reachable through usbmux.`})}async function he(t){throw new e(`UNSUPPORTED_OPERATION`,`Runner file copy is unavailable on this XCTest-backed physical iOS device.`,{deviceId:t.id,backend:`xctest`})}async function ge(t,n){let i=[`xcdevice`,`wait`,`--both`,`--timeout=15`,t.id],a=await f(i,{allowFailure:!0,signal:n,timeoutMs:18e3});if(a.exitCode!==0)throw new e(`COMMAND_FAILED`,`iOS device is not ready for XCTest automation`,r(a,{cmd:`xcrun`,args:i,deviceId:t.id,backend:`xctest`,hint:"Keep the device unlocked, trusted, connected, and visible in `xcrun xcdevice list`, then retry."}))}async function _e(t,n,r){if(r.payloadUrl||r.launchArgs&&r.launchArgs.length>0)throw new e(`UNSUPPORTED_OPERATION`,`XCTest-backed physical iOS devices do not support deep links or launch arguments during open.`,{deviceId:t.id,backend:`xctest`,hint:`Open the installed app by bundle ID without a URL or --launch-args.`});await r.runRunnerCommand(t,{command:`activate`,appBundleId:n},r.runnerOptions??{})}async function ve(e,t,n){await n.runRunnerCommand(e,{command:`terminate`,appBundleId:t},n.runnerOptions??{})}export{D as a,T as i,J as n,q as r,fe as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./physical-device-control.js";export{e as resolveIosPhysicalDeviceControl};
@@ -0,0 +1 @@
1
+ import{D as e}from"./sdk-device.js";import{Dt as t,Kt as n,ft as r,j as i}from"./sdk-batch.js";import{t as a}from"./session-store.js";import{r as o}from"./diagnostics.js";import"./diagnostics2.js";import{n as s}from"./config.js";import{t as c}from"./process.js";import{r as l}from"./session-paths.js";import{r as u}from"./request-cancel.js";import{t as d}from"./request.js";import{r as f}from"./platform-runtime.js";import{a as p,s as m,u as h}from"./perf-runtime-plan.js";import{n as g,r as _,s as v}from"./screen-recording-resource-recovery.js";import y from"node:path";const b=r({required:[`appLogReattach`,`appLogCleanup`]});function x(e){return h.recoverAll({sessionsDir:e.sessionsDir,...C(e)})}function S(e){return h.recoverOne({sessionsDir:e.sessionsDir,...C(e)},e.resourcePath)}function C(e){return{scope:e.scope,perRecordDeadlineMs:e.perRecordDeadlineMs,onDiagnostic:e.onDiagnostic,acquireControl:async(t,n)=>await w(e.gateway,t,n)}}async function w(e,t,r){return await _({gateway:e,envelope:t,scope:r,create:e=>{let t=n(e,b);return Object.freeze({reattach:async e=>await t.operations.appLogReattach({envelope:e}),cleanup:async e=>await t.operations.appLogCleanup({envelope:e}),[Symbol.asyncDispose]:async()=>await e[Symbol.asyncDispose]()})}})}function T(e){return m.recoverOne({sessionsDir:e.sessionsDir,scope:e.scope,perRecordDeadlineMs:e.perRecordDeadlineMs,onDiagnostic:e.onDiagnostic,acquireControl:async(t,n)=>await E(e.gateway,t,n)},e.resourcePath)}async function E(e,t,r){return await _({gateway:e,envelope:t,scope:r,create:e=>D({runtime:n(e,i),dispose:async()=>await e[Symbol.asyncDispose]()})})}function D(e){return Object.freeze({reattach:async t=>await e.runtime.operations.audioProbeReattach({envelope:t}),cleanup:async t=>await e.runtime.operations.audioProbeCleanup({envelope:t}),[Symbol.asyncDispose]:e.dispose})}function O(e){return p.recoverOne({sessionsDir:e.sessionsDir,scope:e.scope,perRecordDeadlineMs:e.perRecordDeadlineMs,onDiagnostic:e.onDiagnostic,acquireControl:async(t,n)=>await k(e.gateway,t,n)},e.resourcePath)}async function k(e,r,i){return await _({gateway:e,envelope:r,scope:i,create:e=>A({runtime:n(e,t),dispose:async()=>await e[Symbol.asyncDispose]()})})}function A(e){return Object.freeze({reattach:async t=>await e.runtime.operations.perfNativeCaptureReattach({envelope:t}),cleanup:async t=>await e.runtime.operations.perfNativeCaptureCleanup({envelope:t}),[Symbol.asyncDispose]:e.dispose})}function j(e){return async t=>{let n=s(t.stateDir).sessionsDir,r=y.join(n,l(t.session));try{for(let i of Object.values(M)){let a=N(i,t,r);if(a.status===`retained`)return{status:`retained`,reason:a.reason};if(a.status===`owned`&&await i.recover(e,n,a.resourcePath)===`retained`)return{status:`retained`,reason:`${i.resourceKind}-cleanup-pending`}}return{status:`reconciled`}}catch(e){return o({level:`warn`,phase:`device_claim_orphan_reconciliation_failed`,data:{deviceKey:t.deviceKey,ownerSession:t.session,error:e instanceof Error?e.message:String(e)}}),{status:`retained`,reason:`durable-resource-reconciliation-failed`}}}}const M={"app-log":{resourceKind:`app-log`,store:h.store,recover:async(e,t,n)=>await S({sessionsDir:t,resourcePath:n,gateway:e.gateway,scope:e.scope})},"screen-recording":{resourceKind:`screen-recording`,store:v.store,recover:async(e,t,n)=>await g({sessionsDir:t,resourcePath:n,gateway:e.gateway,scope:e.scope})},"audio-probe":{resourceKind:`audio-probe`,store:m.store,recover:async(e,t,n)=>await T({sessionsDir:t,resourcePath:n,gateway:e.gateway,scope:e.scope})},"perf-capture":{resourceKind:`perf-capture`,store:p.store,recover:async(e,t,n)=>await O({sessionsDir:t,resourcePath:n,gateway:e.gateway,scope:e.scope})}};function N(t,n,r){let i=t.store.resolvePath(r),a=t.store.read(i);return a.status===`missing`?{status:`missing`}:a.status===`unreattachable`?{status:`retained`,reason:`${t.resourceKind}-${a.reason}`}:a.envelope.sessionId!==n.session||!e(a.envelope.device,n.device)?{status:`retained`,reason:`${t.resourceKind}-owner-mismatch`}:{status:`owned`,resourcePath:i}}function P(e,t){let n=t??(t=>F(t,e));return async e=>{let t=n(e.stateDir);try{return await t.reconcile(e)}finally{await t.dispose()}}}function F(e,t){let n=s(e),r=new a(n.sessionsDir),i=f({sessionsDir:n.sessionsDir,ownedProcesses:c({stateDir:n.baseDir,sessionsDir:n.sessionsDir,resolveSessionDir:e=>r.resolveSessionDir(e)}),resolveSessionArtifacts:e=>({outputPath:r.resolveAppLogPath(e),pidPath:r.resolveAppLogPidPath(e)})});return{reconcile:j({gateway:i,scope:t}),dispose:async()=>{await i.shutdown()}}}const I=new AbortController().signal;function L(e){return Object.freeze({signal:u(e.meta?.requestId)??I,diagnostics:Object.freeze({emit:e=>o(e)}),progress:Object.freeze({report:e=>d({type:`command`,status:`progress`,message:e.message})})})}function R(){return Object.freeze({signal:I,diagnostics:Object.freeze({emit:e=>o(e)}),progress:Object.freeze({report:()=>{}})})}export{x as i,L as n,P as r,R as t};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime.js";import{y as t}from"./sdk-contracts.js";import{r as n}from"./diagnostics.js";import{c as r,h as i,m as a,n as o,s,t as c}from"./exec.js";import"./diagnostics2.js";import"./command.js";import{t as l}from"./adb-host.js";import u from"node:path";import{constants as d}from"node:fs";import{createHash as f,randomUUID as p}from"node:crypto";import m from"node:os";import{access as h,mkdir as g,mkdtemp as _,open as v,readFile as y,readdir as b,rename as x,rm as S,stat as C,writeFile as w}from"node:fs/promises";var T=e({});const E=process.env;l({environment:E,files:{access:async e=>await h(e),ensureDirectory:async e=>{await g(e,{recursive:!0})},isExecutable:async e=>{try{return await h(e,d.X_OK),!0}catch{return!1}},makeTempDirectory:async e=>await _(u.join(m.tmpdir(),e)),readBytes:async e=>await y(e),readDirectory:async e=>await b(e),readText:async e=>await y(e,`utf8`),remove:async(e,t)=>await S(e,t),stat:async e=>{let t=await C(e);return{isFile:t.isFile(),size:t.size}},sha256:e=>f(`sha256`).update(e).digest(`hex`),writeAtomicText:async(e,t,n=384)=>{let r=u.dirname(e),i=u.join(r,`.${u.basename(e)}.${p()}.tmp`),a,o=!1;try{a=await v(i,`wx`,n),await a.writeFile(t,`utf8`),await a.sync(),await a.close(),a=void 0,await x(i,e),o=!0;let s;try{s=await v(r,`r`),await s.sync()}catch{}finally{s&&await s.close().catch(()=>{})}}finally{a&&await a.close().catch(()=>{}),o||await S(i,{force:!0}).catch(()=>{})}},writeBytes:async(e,t)=>await w(e,t)},execSerialAdb:async(e,t,n)=>{let r=D([`-s`,e,...t],n);return await i(async()=>await s(`adb`,r.args,{...r.options,detached:process.platform!==`win32`}))},spawnSerialAdb:(e,t,n)=>{let i=D([`-s`,e,...t],n),a=r(`adb`,i.args,{...i.options,allowFailure:!0,captureOutput:!1});return a.wait.catch(()=>{}),a.child},execHostAdb:async(e,t)=>{let n=D(e,t);return await s(`adb`,n.args,n.options)},withAdbCommandExecutorOverride:a,withoutAdbCommandExecutorOverride:i,coerceAdbResult:c,execFailureDetails:o,emitDiagnostic:n,imeRecoveryMarkers:{write:async(e,t)=>{let{writeAndroidTestImeRecoveryMarker:n}=await import(`./mechanics.js`).then(e=>e.r);return await n(e,t)},clear:async(e,t)=>{let{clearAndroidTestImeRecoveryMarker:n}=await import(`./mechanics.js`).then(e=>e.r);await n(e,t)},read:async e=>{let{readAndroidTestImeRecoveryMarkers:t}=await import(`./mechanics.js`).then(e=>e.r);return await t(e)}},resolveHelperArtifact:async e=>{let{resolveAndroidHelperArtifact:t}=await import(`./mechanics.js`).then(e=>e.r);return await t(e)},ensureHelperInstalled:async(e,t)=>{let{makeEnsureAndroidHelperInstalled:n}=await import(`./mechanics.js`).then(e=>e.r);return await n(e)(t)}});function D(e,t){let{serverPort:n,...r}=t??{};return n===void 0?{args:e,options:r}:{args:O(e,n),options:{...r,env:{...E,...r.env??{},ADB_SERVER_SOCKET:void 0,ANDROID_ADB_SERVER_PORT:String(n),ANDROID_ADB_SERVER_ADDRESS:`127.0.0.1`}}}}function O(e,t){let n=[`-P`,String(t)],r=0,i;for(;r<e.length;){let t=e[r];if(t===`-P`){r+=2;continue}if(t===`-s`){if(i!==void 0&&i!==e[r+1])throw A();i=e[r+1],n.push(t,e[r+1]),r+=2;continue}if(t?.startsWith(`-`))throw A();break}let a=e.slice(r);return k(a),[...n,...a]}function k(e){let t=e.find(e=>!e.startsWith(`wait-for-`));if([`nodaemon`,`server`,`fork-server`,`kill-server`,`start-server`,`connect`,`disconnect`,`reconnect`,`attach`,`detach`,`pair`].includes(t??``))throw A()}function A(){return new t(`COMMAND_FAILED`,`Managed ADB transport cannot select another target.`,{reason:`managed-device-transport-mismatch`})}export{T as t};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime.js";var t=e({loadAndroidMechanics:()=>r});let n;async function r(){return n??=import(`./platform-runtime-android-adb-host.js`).then(e=>e.t).then(async()=>await import(`./mechanics.js`).then(e=>e.r)),await n}export{t as n,r as t};
@@ -1 +1 @@
1
- import{t as e}from"./platform-runtime-app-log-process.js";async function t(t,i,a){let{resolveScopedAndroidAdbBackgroundTransport:o}=await import(`./sdk-android-adb.js`).then(e=>e.t),s=o(i);if(s.mode===`local`)return a;if(!s.spawn)return Object.freeze({mode:`transport-composed`});let c=s.spawn,l=e(t,{launch:async(e,t)=>{t?.throwIfAborted();let a=n(e,i.id);return r(c([...a.args],{allowFailure:a.options?.allowFailure,cwd:a.options?.cwd,env:a.options?.env?{...process.env,...a.options.env}:void 0,timeoutMs:a.options?.timeoutMs,captureOutput:!1,signal:t}))}});return Object.freeze({mode:`transport-composed`,start:l.start})}function n(e,t){if(e.kind!==`android-adb`||e.serial!==t)throw Error(`Android app-log provider transport received a non-device-scoped adb command`);return e}function r(e){return Object.freeze({child:e,wait:i(e)})}function i(e){return new Promise((t,n)=>{let r=!1,i=e=>{r||(r=!0,e instanceof Error?n(e):t(e))};e.on(`error`,e=>i(e)),e.once(`close`,(e,t)=>i({stdout:``,stderr:``,exitCode:e??+!!t})),e.exitCode!==null&&e.exitCode!==void 0&&queueMicrotask(()=>i({stdout:``,stderr:``,exitCode:e.exitCode??0}))})}export{t as resolveAndroidAppLogProcessTransport};
1
+ import{t as e}from"./platform-runtime-android-mechanics.js";import{t}from"./platform-runtime-app-log-process.js";async function n(n,a,o){let{resolveScopedAndroidAdbBackgroundTransport:s}=await e(),c=s(a);if(c.mode===`local`)return o;if(!c.spawn)return Object.freeze({mode:`transport-composed`});let l=c.spawn,u=t(n,{launch:async(e,t)=>{t?.throwIfAborted();let n=r(e,a.id);return i(l([...n.args],{allowFailure:n.options?.allowFailure,cwd:n.options?.cwd,env:n.options?.env?{...process.env,...n.options.env}:void 0,timeoutMs:n.options?.timeoutMs,captureOutput:!1,signal:t}))}});return Object.freeze({mode:`transport-composed`,start:u.start})}function r(e,t){if(e.kind!==`android-adb`||e.serial!==t)throw Error(`Android app-log provider transport received a non-device-scoped adb command`);return e}function i(e){return Object.freeze({child:e,wait:a(e)})}function a(e){return new Promise((t,n)=>{let r=!1,i=e=>{r||(r=!0,e instanceof Error?n(e):t(e))};e.on(`error`,e=>i(e)),e.once(`close`,(e,t)=>i({stdout:``,stderr:``,exitCode:e??+!!t})),e.exitCode!==null&&e.exitCode!==void 0&&queueMicrotask(()=>i({stdout:``,stderr:``,exitCode:e.exitCode??0}))})}export{n as resolveAndroidAppLogProcessTransport};
@@ -1 +1 @@
1
- import{v as e}from"./sdk-android-adb.js";import{c as t,d as n,n as r,s as i}from"./host-process.js";import{_ as a}from"./src3.js";import{n as o}from"./verified-file.js";import s from"node:path";import c from"node:fs";function l(e){let t=s.resolve(e.sessionsDir),n=s.resolve(e.pathname);if(s.basename(n)!==e.basename)throw Error(`${e.label} is outside the daemon-owned sessions directory`);if(c.existsSync(t)&&c.existsSync(s.dirname(n))){let r=c.realpathSync.native(t),i=c.realpathSync.native(s.dirname(n));if(i!==r&&!i.startsWith(`${r}${s.sep}`))throw Error(`${e.label} resolves outside the daemon-owned sessions directory`);return s.join(i,e.basename)}if(n!==t&&!n.startsWith(`${t}${s.sep}`))throw Error(`${e.label} is outside the daemon-owned sessions directory`);return n}const u=`app-log.pid`;function d(e,t={}){let n=s.resolve(e),r=t.launch??h;return Object.freeze({start:async(e,t)=>await m(n,e,r,t),readMarker:async e=>T(n,e),clearMarker:async e=>D(n,e),inspect:async e=>k(e),terminate:async e=>await A(e)})}async function f(e){let t=[],n=[];if(!c.existsSync(e))return{recovered:t,retained:n};let r=s.resolve(e);for(let e of c.readdirSync(r,{withFileTypes:!0})){if(!e.isDirectory())continue;let i=s.join(r,e.name);if(c.existsSync(s.join(i,`app-log.resource.json`)))continue;let a=s.join(i,u),o=T(r,a);if(o.status!==`missing`){if(o.status===`invalid`){n.push({markerPath:a,reason:`invalid`,message:o.message});continue}if(await A(o.marker)===`ownership-lost`){let e=p(o.marker.command);n.push({markerPath:a,reason:`ownership-lost`,...e?{device:e}:{}});continue}D(r,a),t.push(a)}}return Object.freeze({recovered:Object.freeze(t),retained:Object.freeze(n)})}function p(e){let t=/(?:^|\s)(?:\S*\/)?adb\s+-s\s+([^\s]+)/.exec(e)?.[1];if(t)return Object.freeze({id:t,family:`android`,kind:t.startsWith(`emulator-`)?`emulator`:`device`,target:`mobile`});let n=/(?:^|\s)xcrun\s+(?:--set\s+\S+\s+)?simctl\s+spawn\s+([^\s]+)/.exec(e)?.[1];if(n)return Object.freeze({id:n,family:`apple`,appleOs:`ios`,kind:`simulator`,target:`mobile`});let r=/(?:^|\s)xcrun\s+devicectl\b[^\n]*?\s--device\s+([^\s]+)/.exec(e)?.[1];if(r)return Object.freeze({id:r,family:`apple`,appleOs:`ios`,kind:`device`,target:`mobile`,iosPhysicalDeviceBackend:`coredevice`})}async function m(e,t,n,r){_(e,t.markerPath),r?.throwIfAborted();let i=await n(t.command,r),a=i.child,o=v(a,t.output),s=await y(e,t.markerPath,i),c=i.wait.then(async e=>(await o(),e)).finally(()=>{t.markerPath&&s&&S(e,t.markerPath,s)}),l=b(a,c);return{marker:s,wait:c,terminate:l,[Symbol.asyncDispose]:l}}function h(t,n){let r=g(t);return e(r.executable,[...r.args],{allowFailure:r.allowFailure,cwd:r.cwd,env:r.env?{...process.env,...r.env}:void 0,timeoutMs:r.timeoutMs,captureOutput:!1,signal:n})}function g(e){return e.kind===`host`?e.request:{executable:`adb`,args:[`-s`,e.serial,...e.args],...e.options}}function _(e,t){if(t&&T(e,t).status!==`missing`)throw Error(`Existing app-log process marker evidence must be recovered before start`)}function v(e,t){let n=Promise.resolve(),r,i=i=>{n=n.then(async()=>await t.write(i)).catch(t=>{r??=t,typeof e.exitCode!=`number`&&e.kill(`SIGKILL`)})};return e.stdout?.on(`data`,i),e.stderr?.on(`data`,i),async()=>{if(await n,r!==void 0)throw r}}async function y(e,t,n){let r=n.child.pid?await w(n.child.pid):void 0;try{if(!r)throw Error(`Managed app-log process did not expose a complete ownership marker`);return t&&E(e,t,r),r}catch(e){throw n.child.kill(`SIGKILL`),await n.wait.catch(()=>void 0),e}}function b(e,t){let n;return async()=>await(n??=(async()=>{typeof e.exitCode!=`number`&&(e.kill(`SIGINT`),await x(t,2e3)||e.kill(`SIGKILL`),await t.catch(()=>void 0))})())}async function x(e,t){return await new Promise(n=>{let r=setTimeout(()=>n(!1),t),i=()=>{clearTimeout(r),n(!0)};e.then(i,i)})}function S(e,t,n){let r=T(e,t);r.status===`decoded`&&r.marker.pid===n.pid&&r.marker.startTime===n.startTime&&r.marker.command===n.command&&D(e,t)}function C(e){let n=t(e),r=i(e);if(!(!n||!r))return Object.freeze({pid:e,startTime:n,command:r})}async function w(e){for(let t=0;t<5;t+=1){let t=C(e);if(t)return t;await new Promise(e=>setTimeout(e,10))}}function T(e,t){let n=O(e,t),r;try{let e=o(n);if(e===void 0)return{status:`missing`};r=e}catch(e){return{status:`invalid`,message:e instanceof Error?e.message:`App-log process marker is invalid`}}try{return a(JSON.parse(c.readFileSync(r,`utf8`)))}catch(e){return{status:`invalid`,message:e instanceof Error?e.message:`App-log process marker is invalid`}}finally{c.closeSync(r)}}function E(e,t,n){let r=O(e,t);if(T(e,r).status!==`missing`)throw Error(`Existing app-log process marker evidence must be recovered before replacement`);c.mkdirSync(s.dirname(r),{recursive:!0});let i=`${r}.${process.pid}.${Date.now()}.tmp`,a,o=!1,l=!1;try{a=c.openSync(i,`wx`,384),c.writeFileSync(a,`${JSON.stringify(n)}\n`),c.fsyncSync(a),c.closeSync(a),a=void 0,c.linkSync(i,r),o=!0,c.unlinkSync(i);let e=c.openSync(s.dirname(r),`r`);try{c.fsyncSync(e)}finally{c.closeSync(e)}l=!0}finally{if(a!==void 0)try{c.closeSync(a)}catch{}if(!l)for(let e of o?[r,i]:[i])try{c.unlinkSync(e)}catch{}}}function D(e,t){let n=O(e,t);try{c.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`)throw e}}function O(e,t){return l({sessionsDir:e,pathname:t,basename:u,label:`App-log process marker`})}function k(e){return r(e.pid)?j(e)?`owned-alive`:`ownership-lost`:`missing`}async function A(e){if(!r(e.pid))return`already-missing`;if(!j(e))return`ownership-lost`;try{process.kill(e.pid,`SIGTERM`)}catch{return`already-missing`}if(!await n(e.pid,2e3)){if(!j(e))return`ownership-lost`;try{process.kill(e.pid,`SIGKILL`)}catch{return`already-missing`}await n(e.pid,2e3)}return r(e.pid)?`ownership-lost`:`terminated`}function j(e){return!e.startTime||!e.command?!1:t(e.pid)===e.startTime&&i(e.pid)===e.command}export{f as n,l as r,d as t};
1
+ import{b as e,p as t,w as n,y as r}from"./owner-identity.js";import{i}from"./verified-file.js";import{c as a}from"./exec.js";import"./file.js";import"./command.js";import"./process.js";import{p as o}from"./src7.js";import s from"node:path";import c from"node:fs";function l(e){let t=s.resolve(e.sessionsDir),n=s.resolve(e.pathname);if(s.basename(n)!==e.basename)throw Error(`${e.label} is outside the daemon-owned sessions directory`);if(c.existsSync(t)&&c.existsSync(s.dirname(n))){let r=c.realpathSync.native(t),i=c.realpathSync.native(s.dirname(n));if(i!==r&&!i.startsWith(`${r}${s.sep}`))throw Error(`${e.label} resolves outside the daemon-owned sessions directory`);return s.join(i,e.basename)}if(n!==t&&!n.startsWith(`${t}${s.sep}`))throw Error(`${e.label} is outside the daemon-owned sessions directory`);return n}const u=`app-log.pid`;function d(e,t={}){let n=s.resolve(e),r=t.launch??h;return Object.freeze({start:async(e,t)=>await m(n,e,r,t),readMarker:async e=>T(n,e),clearMarker:async e=>D(n,e),inspect:async e=>k(e),terminate:async e=>await A(e)})}async function f(e){let t=[],n=[];if(!c.existsSync(e))return{recovered:t,retained:n};let r=s.resolve(e);for(let e of c.readdirSync(r,{withFileTypes:!0})){if(!e.isDirectory())continue;let i=s.join(r,e.name);if(c.existsSync(s.join(i,`app-log.resource.json`)))continue;let a=s.join(i,u),o=T(r,a);if(o.status!==`missing`){if(o.status===`invalid`){n.push({markerPath:a,reason:`invalid`,message:o.message});continue}if(await A(o.marker)===`ownership-lost`){let e=p(o.marker.command);n.push({markerPath:a,reason:`ownership-lost`,...e?{device:e}:{}});continue}D(r,a),t.push(a)}}return Object.freeze({recovered:Object.freeze(t),retained:Object.freeze(n)})}function p(e){let t=/(?:^|\s)(?:\S*\/)?adb\s+-s\s+([^\s]+)/.exec(e)?.[1];if(t)return Object.freeze({id:t,family:`android`,kind:t.startsWith(`emulator-`)?`emulator`:`device`,target:`mobile`});let n=/(?:^|\s)xcrun\s+(?:--set\s+\S+\s+)?simctl\s+spawn\s+([^\s]+)/.exec(e)?.[1];if(n)return Object.freeze({id:n,family:`apple`,appleOs:`ios`,kind:`simulator`,target:`mobile`});let r=/(?:^|\s)xcrun\s+devicectl\b[^\n]*?\s--device\s+([^\s]+)/.exec(e)?.[1];if(r)return Object.freeze({id:r,family:`apple`,appleOs:`ios`,kind:`device`,target:`mobile`,iosPhysicalDeviceBackend:`coredevice`})}async function m(e,t,n,r){_(e,t.markerPath),r?.throwIfAborted();let i=await n(t.command,r),a=i.child,o=v(a,t.output),s=await y(e,t.markerPath,i),c=i.wait.then(async e=>(await o(),e)).finally(()=>{t.markerPath&&s&&S(e,t.markerPath,s)}),l=b(a,c);return{marker:s,wait:c,terminate:l,[Symbol.asyncDispose]:l}}function h(e,t){let n=g(e);return a(n.executable,[...n.args],{allowFailure:n.allowFailure,cwd:n.cwd,env:n.env?{...process.env,...n.env}:void 0,timeoutMs:n.timeoutMs,captureOutput:!1,signal:t})}function g(e){return e.kind===`host`?e.request:{executable:`adb`,args:[`-s`,e.serial,...e.args],...e.options}}function _(e,t){if(t&&T(e,t).status!==`missing`)throw Error(`Existing app-log process marker evidence must be recovered before start`)}function v(e,t){let n=Promise.resolve(),r,i=i=>{n=n.then(async()=>await t.write(i)).catch(t=>{r??=t,typeof e.exitCode!=`number`&&e.kill(`SIGKILL`)})};return e.stdout?.on(`data`,i),e.stderr?.on(`data`,i),async()=>{if(await n,r!==void 0)throw r}}async function y(e,t,n){let r=n.child.pid?await w(n.child.pid):void 0;try{if(!r)throw Error(`Managed app-log process did not expose a complete ownership marker`);return t&&E(e,t,r),r}catch(e){throw n.child.kill(`SIGKILL`),await n.wait.catch(()=>void 0),e}}function b(e,t){let n;return async()=>await(n??=(async()=>{typeof e.exitCode!=`number`&&(e.kill(`SIGINT`),await x(t,2e3)||e.kill(`SIGKILL`),await t.catch(()=>void 0))})())}async function x(e,t){return await new Promise(n=>{let r=setTimeout(()=>n(!1),t),i=()=>{clearTimeout(r),n(!0)};e.then(i,i)})}function S(e,t,n){let r=T(e,t);r.status===`decoded`&&r.marker.pid===n.pid&&r.marker.startTime===n.startTime&&r.marker.command===n.command&&D(e,t)}function C(t){let n=e(t),i=r(t);if(!(!n||!i))return Object.freeze({pid:t,startTime:n,command:i})}async function w(e){for(let t=0;t<5;t+=1){let t=C(e);if(t)return t;await new Promise(e=>setTimeout(e,10))}}function T(e,t){let n=O(e,t),r;try{let e=i(n);if(e===void 0)return{status:`missing`};r=e}catch(e){return{status:`invalid`,message:e instanceof Error?e.message:`App-log process marker is invalid`}}try{let e=JSON.parse(c.readFileSync(r,`utf8`));return o(e)}catch(e){return{status:`invalid`,message:e instanceof Error?e.message:`App-log process marker is invalid`}}finally{c.closeSync(r)}}function E(e,t,n){let r=O(e,t);if(T(e,r).status!==`missing`)throw Error(`Existing app-log process marker evidence must be recovered before replacement`);c.mkdirSync(s.dirname(r),{recursive:!0});let i=`${r}.${process.pid}.${Date.now()}.tmp`,a,o=!1,l=!1;try{a=c.openSync(i,`wx`,384),c.writeFileSync(a,`${JSON.stringify(n)}\n`),c.fsyncSync(a),c.closeSync(a),a=void 0,c.linkSync(i,r),o=!0,c.unlinkSync(i);let e=c.openSync(s.dirname(r),`r`);try{c.fsyncSync(e)}finally{c.closeSync(e)}l=!0}finally{if(a!==void 0)try{c.closeSync(a)}catch{}if(!l)for(let e of o?[r,i]:[i])try{c.unlinkSync(e)}catch{}}}function D(e,t){let n=O(e,t);try{c.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`)throw e}}function O(e,t){return l({sessionsDir:e,pathname:t,basename:u,label:`App-log process marker`})}function k(e){return t(e.pid)?j(e)?`owned-alive`:`ownership-lost`:`missing`}async function A(e){if(!t(e.pid))return`already-missing`;if(!j(e))return`ownership-lost`;try{process.kill(e.pid,`SIGTERM`)}catch{return`already-missing`}if(!await n(e.pid,2e3)){if(!j(e))return`ownership-lost`;try{process.kill(e.pid,`SIGKILL`)}catch{return`already-missing`}await n(e.pid,2e3)}return t(e.pid)?`ownership-lost`:`terminated`}function j(t){return!t.startTime||!t.command?!1:e(t.pid)===t.startTime&&r(t.pid)===t.command}export{f as n,l as r,d as t};
@@ -0,0 +1 @@
1
+ import{f as e}from"./scroll-gesture.js";const t=new WeakMap;function n(e){if(!e)return;let n=t.get(e);if(n)return n;let r=i(e.nodes??[]);if(r)return t.set(e,r),r}function r(e){return n({nodes:e,createdAt:0})}const i=e;async function a(e){let{getRunnerSessionSnapshot:t}=await import(`./runner-operations-facade.js`);return t(e)}async function o(e,t,n,r){let{queryAppleRunnerSelector:i}=await import(`./runner-operations-facade.js`);return await i(e,t,n,r)}export{r as i,o as n,n as r,a as t};
@@ -1 +1 @@
1
- import{C as e,_ as t}from"./sdk-android-adb.js";import n from"node:path";import{constants as r}from"node:fs";import i from"node:os";import{access as a,mkdtemp as o,readFile as s,rm as c,writeFile as l}from"node:fs/promises";function u(){return Object.freeze({isXcrunAvailable:async e=>{let{resolveAppleToolProvider:t}=await d(async()=>await import(`./tool-provider.js`).then(e=>e.o),e);return await d(async()=>await t().whichCommand(`xcrun`),e)},run:async(e,t)=>{let{runXcrun:n}=await d(async()=>await import(`./tool-provider.js`).then(e=>e.o),t),r=await d(async()=>await n([e.tool,...e.args],{allowFailure:e.allowFailure,signal:t,timeoutMs:e.timeoutMs}),t);return{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode}}})}async function d(e,t){t?.throwIfAborted();try{let n=await e();return t?.throwIfAborted(),n}catch(e){throw t?.throwIfAborted(),e}}function f(){return Object.freeze({prepare:async e=>{if(e===`android`){let{ensureAndroidSdkPathConfigured:e}=await import(`./sdk.js`).then(e=>e.n);await e();return}if(e===`harmonyos`){let{ensureHarmonyToolchainPathConfigured:e}=await import(`./hdc.js`).then(e=>e.t);await e()}}})}function p(){return Object.freeze({commands:Object.freeze({which:async t=>await e(t)?t:void 0,run:async(e,n)=>{let r=await t(e.executable,[...e.args],{allowFailure:e.allowFailure,cwd:e.cwd,env:e.env?{...process.env,...e.env}:void 0,signal:n,timeoutMs:e.timeoutMs});return{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode}}}),appleTools:u(),toolchains:f(),files:Object.freeze({isExecutable:async e=>await h(e),createTemporaryTextFile:async e=>await g(e)}),hostOs:m(process.platform),hostName:i.hostname(),homeDirectory:i.homedir(),observations:Object.freeze({deviceBooted:async e=>{let{markSimulatorBooted:t}=await import(`./simulator.js`).then(e=>e.i);t(e)}})})}function m(e){return e===`darwin`||e===`linux`||e===`win32`?e:`other`}async function h(e){try{return await a(e,r.X_OK),!0}catch{return!1}}async function g(e){let t=await o(n.join(i.tmpdir(),e.prefix)),r=n.join(t,`value${e.suffix}`),a=!1;return{path:r,readText:async()=>await s(r,`utf8`),writeText:async e=>await l(r,e,`utf8`),[Symbol.asyncDispose]:async()=>{a||(a=!0,await c(t,{recursive:!0,force:!0}))}}}export{p as createDeviceInventoryHost,g as createTemporaryTextFile,u as n,f as t};
1
+ import{p as e,s as t}from"./exec.js";import"./command.js";import{t as n}from"./platform-runtime-android-mechanics.js";import r from"node:path";import{constants as i}from"node:fs";import a from"node:os";import{access as o,mkdtemp as s,readFile as c,rm as l,writeFile as u}from"node:fs/promises";function d(){return Object.freeze({isXcrunAvailable:async e=>{let{resolveAppleToolProvider:t}=await f(async()=>await import(`./tool-provider-facade.js`),e),n=t();return await f(async()=>await n.whichCommand(`xcrun`),e)},run:async(e,t)=>{let{runXcrun:n}=await f(async()=>await import(`./tool-provider-facade.js`),t),r=await f(async()=>await n([e.tool,...e.args],{allowFailure:e.allowFailure,signal:t,timeoutMs:e.timeoutMs}),t);return{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode}}})}async function f(e,t){t?.throwIfAborted();try{let n=await e();return t?.throwIfAborted(),n}catch(e){throw t?.throwIfAborted(),e}}function p(){return Object.freeze({prepare:async e=>{if(e===`android`){let{ensureAndroidSdkPathConfigured:e}=await n();await e(process.env);return}if(e===`harmonyos`){let{ensureHarmonyToolchainPathConfigured:e}=await import(`./src3.js`).then(e=>e.b);await e()}}})}function m(){return Object.freeze({commands:Object.freeze({which:async t=>await e(t)?t:void 0,run:async(e,n)=>{let r=await t(e.executable,[...e.args],{allowFailure:e.allowFailure,cwd:e.cwd,env:e.env?{...process.env,...e.env}:void 0,signal:n,timeoutMs:e.timeoutMs});return{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode}}}),appleTools:d(),toolchains:p(),files:Object.freeze({isExecutable:async e=>await g(e),createTemporaryTextFile:async e=>await _(e)}),hostOs:h(process.platform),hostName:a.hostname(),homeDirectory:a.homedir(),observations:Object.freeze({deviceBooted:async e=>{let{markSimulatorBooted:t}=await import(`./simulator-facade.js`);t(e)}})})}function h(e){return e===`darwin`||e===`linux`||e===`win32`?e:`other`}async function g(e){try{return await o(e,i.X_OK),!0}catch{return!1}}async function _(e){let t=await s(r.join(a.tmpdir(),e.prefix)),n=r.join(t,`value${e.suffix}`),i=!1;return{path:n,readText:async()=>await c(n,`utf8`),writeText:async e=>await u(n,e,`utf8`),[Symbol.asyncDispose]:async()=>{i||(i=!0,await l(t,{recursive:!0,force:!0}))}}}export{m as createDeviceInventoryHost,_ as createTemporaryTextFile,d as n,p as t};
@@ -0,0 +1 @@
1
+ import{y as e}from"./sdk-contracts.js";import{Yt as t}from"./sdk-batch.js";import{n}from"./scoped-provider.js";import{r,t as i}from"./platform-runtime-unavailable.js";import{a,t as o}from"./managed-device-scope.js";const s={ensureReady:`both`,deployApp:`both`,materializeAppSource:`both`,deployMaterializedApp:`both`,sendPushNotification:`both`,setSetting:`both`,readClipboard:`both`,writeClipboard:`both`,captureScreenshot:`android`},c=Object.freeze({available:!1,reason:`owner-capability-missing`,hint:`This operation has no verified managed-device automation path.`});function l(s){return Object.freeze({owner:s.owner,ownsDevice:()=>!1,inspectFacts:async e=>r(e,s.owner,i(c)),bind:async r=>{if(r.intent.kind!==`exact-owner`||!t(r.intent.owner,s.owner))throw new e(`COMMAND_FAILED`,`A managed local owner binds only under an exact-owner intent naming it`,{reason:`runtime-contract-invalid`});let i=r.scope.managedDevice;if(!i||!t(i.owner,s.owner)||i.fence.token!==r.intent.fence.token||i.fence.generation!==r.intent.fence.generation)throw new e(`COMMAND_FAILED`,`Managed automation requires its exact request authority.`,{reason:`runtime-contract-invalid`});o(i,r.device);let c=e=>i.run(()=>a(i,e)),l=await s.loadLocal(r.device.platform),f=await c(()=>l.bind({device:r.device,intent:{kind:`ordinary`},scope:r.scope})),p=u(f.facts);return Object.freeze({device:f.device,owner:s.owner,facts:p,operations:d(n({...f.operations},e=>c(async()=>(r.scope.signal.throwIfAborted(),await i.admit(async()=>(r.scope.signal.throwIfAborted(),await e()))))),p),[Symbol.asyncDispose]:async()=>await c(async()=>await f[Symbol.asyncDispose]())})},shutdown:async()=>void 0})}function u(e){let t=Object.fromEntries(Object.entries(e.operations).map(([t,n])=>{let r=s[t];return[t,(e.device.family===`android`||e.device.family===`apple`&&e.device.appleOs===`ios`)&&(r===`both`||r===e.device.family)?n:c]}));return Object.freeze({device:e.device,operations:Object.freeze(t)})}function d(e,t){let n={};for(let[r,i]of Object.entries(e))t.operations[r]?.available===!0&&(n[r]=i);return Object.freeze(n)}export{l as createManagedLocalRuntimeOwner};
@@ -1 +1 @@
1
- async function e(e){if(e.platform!==`web`)return Object.freeze({mode:`local`});let{hasScopedWebProvider:t,resolveWebProvider:n}=await import(`./provider.js`).then(e=>e.t),r=n().dumpNetwork,i=t()?`transport-composed`:`local`;return Object.freeze(r?{mode:i,dump:async e=>{let t=await r({limit:e.maxEntries,include:e.include});return Object.freeze({backend:t.backend??`agent-browser`,entries:t.entries,...t.notes===void 0?{}:{notes:t.notes}})}}:{mode:i})}export{e as resolveWebNetworkTransport};
1
+ async function e(e){if(e.platform!==`web`)return Object.freeze({mode:`local`});let{hasScopedWebProvider:t,resolveWebProvider:n}=await import(`./src6.js`).then(e=>e.i),r=(await n()).dumpNetwork,i=await t()?`transport-composed`:`local`;return Object.freeze(r?{mode:i,dump:async e=>{let t=await r({limit:e.maxEntries,include:e.include});return Object.freeze({backend:t.backend??`agent-browser`,entries:t.entries,...t.notes===void 0?{}:{notes:t.notes}})}}:{mode:i})}export{e as resolveWebNetworkTransport};
@@ -1 +1 @@
1
- import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{J as n,X as r,Y as i}from"./sdk-batch-runner.js";import{l as a,s as o}from"./sdk-device.js";import{n as s}from"./session.js";var c=e({inferAndroidPackageAfterOpen:()=>x,resolveAndroidPackageForOpen:()=>b,resolveRequestedOpenSurface:()=>d,resolveSessionAppBundleIdForTarget:()=>w,resolveSoleForegroundIosApp:()=>u,validateOpenRelaunchTarget:()=>g});const l=new Set([`app`,`desktop`,`frontmost-app`]);async function u(e={}){let{listLocalDeviceInventory:t,shouldPropagateDeviceInventoryProbeError:n}=await import(`./verified-file.js`).then(e=>e.c);try{let n=await t({platform:`ios`,iosSimulatorSetPath:e.simulatorSetPath,kind:`simulator`,booted:!0});if(n.length!==1)return;let[r]=n;if(!r)return;let{detectSoleRunningIosSimulatorApp:i}=await import(`./app-resolution.js`).then(e=>e.t),a=await i(r);return a?{device:r,app:a}:void 0}catch(e){if(n(e))throw e;return}}function d(e){let{device:t,surfaceFlag:n,openTarget:r,existingSurface:i}=e;return t.platform===`linux`?f(n,r,i):a(t)?p(n,r,i):m(n)}function f(e,n,r){if(!e)return r??`app`;let i=s(e);if(!l.has(i))throw new t(`INVALID_ARGS`,`Linux supports --surface app, desktop, and frontmost-app (got "${e}")`);return h(i,n),i}function p(e,t,n){if(!e)return n??`app`;let r=s(e);return r!==`app`&&r!==`menubar`&&h(r,t),r}function m(e){if(e)throw new t(`INVALID_ARGS`,`surface is only supported on macOS and Linux`);return`app`}function h(e,n){if(e!==`app`&&e!==`menubar`&&n)throw new t(`INVALID_ARGS`,`open --surface ${e} does not accept an app target`)}async function g(e){let{target:t,platform:r,surface:i}=e;if(t&&n(t))return`open --relaunch does not support URL targets.`;if(i!==void 0&&i!==`app`)return`open --relaunch is supported only for app surfaces.`;if(r===`android`&&t){let{classifyAndroidAppTarget:e,formatAndroidInstalledPackageRequiredMessage:n}=await import(`./app-lifecycle.js`).then(e=>e.p);if(e(t)===`binary`)return n(t)}}async function _(e,t,s){if(!(!o(e.platform)||!t))return n(t)?a(e)?void 0:e.kind===`device`?r(s,t):i(t)?void 0:s??await v(e,t):await y(e,t)}async function v(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function y(e,t){try{let{resolveIosApp:n}=await import(`./apps.js`).then(e=>e.t);return await n(e,t)}catch{return}}async function b(e,t){if(!(e.platform!==`android`||!t||n(t)))try{let{resolveAndroidApp:n}=await import(`./app-lifecycle.js`).then(e=>e.u),r=await n(e,t);return r.type===`package`?r.value:void 0}catch{return}}async function x(e,t,r){if(r||e.platform!==`android`||!t||!n(t))return r;try{let{getAndroidAppState:t}=await import(`./app-lifecycle.js`).then(e=>e.t);return(await t(e)).package?.trim()||r}catch{return r}}function S(e,t){return e.platform===`android`&&!!(t&&n(t))}function C(e){let t=e?.trim();if(!(!t||n(t)||!t.includes(`.`)))return t}async function w(e,t,n,r){return e.platform===`harmonyos`?C(t)??n:await _(e,t,n)??await r(e,t)??(S(e,t)?n:void 0)}export{u as a,w as i,b as n,g as o,d as r,c as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{y as t}from"./sdk-contracts.js";import{a as n,i as r,r as i}from"./sdk-batch-runner.js";import{c as a,u as o}from"./sdk-device.js";import{n as s}from"./session.js";import{t as c}from"./platform-runtime-android-mechanics.js";var l=e({inferAndroidPackageAfterOpen:()=>S,resolveAndroidPackageForOpen:()=>x,resolveRequestedOpenSurface:()=>f,resolveSessionAppBundleIdForTarget:()=>T,resolveSoleForegroundIosApp:()=>d,validateOpenRelaunchTarget:()=>_});const u=new Set([`app`,`desktop`,`frontmost-app`]);async function d(e={}){let{listLocalDeviceInventory:t,shouldPropagateDeviceInventoryProbeError:n}=await import(`./device-inventory-context.js`).then(e=>e.t);try{let n=await t({platform:`ios`,iosSimulatorSetPath:e.simulatorSetPath,kind:`simulator`,booted:!0});if(n.length!==1)return;let[r]=n;if(!r)return;let{detectSoleRunningIosSimulatorApp:i}=await import(`./app-resolution-facade.js`),a=await i(r);return a?{device:r,app:a}:void 0}catch(e){if(n(e))throw e;return}}function f(e){let{device:t,surfaceFlag:n,openTarget:r,existingSurface:i}=e;return t.platform===`linux`?p(n,r,i):o(t)?m(n,r,i):h(n)}function p(e,n,r){if(!e)return r??`app`;let i=s(e);if(!u.has(i))throw new t(`INVALID_ARGS`,`Linux supports --surface app, desktop, and frontmost-app (got "${e}")`);return g(i,n),i}function m(e,t,n){if(!e)return n??`app`;let r=s(e);return r!==`app`&&r!==`menubar`&&g(r,t),r}function h(e){if(e)throw new t(`INVALID_ARGS`,`surface is only supported on macOS and Linux`);return`app`}function g(e,n){if(e!==`app`&&e!==`menubar`&&n)throw new t(`INVALID_ARGS`,`open --surface ${e} does not accept an app target`)}async function _(e){let{target:t,platform:n,surface:r}=e;if(t&&i(t))return`open --relaunch does not support URL targets.`;if(r!==void 0&&r!==`app`)return`open --relaunch is supported only for app surfaces.`;if(n===`android`&&t){let{classifyAndroidAppTarget:e,formatAndroidInstalledPackageRequiredMessage:n}=await c();if(e(t)===`binary`)return n(t)}}async function v(e,t,s){if(!(!a(e.platform)||!t))return i(t)?o(e)?void 0:e.kind===`device`?n(s,t):r(t)?void 0:s??await y(e,t):await b(e,t)}async function y(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:n}=await import(`./app-resolution-facade.js`);return await n(e,t)}catch{return}}async function b(e,t){try{let{resolveIosApp:n}=await import(`./app-resolution-facade.js`);return await n(e,t)}catch{return}}async function x(e,t){if(!(e.platform!==`android`||!t||i(t)))try{let{resolveAndroidApp:n}=await c(),r=await n(e,t);return r.type===`package`?r.value:void 0}catch{return}}async function S(e,t,n){if(n||e.platform!==`android`||!t||!i(t))return n;try{let{getAndroidAppState:t}=await c();return(await t(e)).package?.trim()||n}catch{return n}}function C(e,t){return e.platform===`android`&&!!(t&&i(t))}function w(e){let t=e?.trim();if(!(!t||i(t)||!t.includes(`.`)))return t}async function T(e,t,n,r){return e.platform===`harmonyos`?w(t)??n:await v(e,t,n)??await r(e,t)??(C(e,t)?n:void 0)}export{d as a,T as i,x as n,_ as o,f as r,l as t};
@@ -1,5 +1,5 @@
1
- import{_ as e}from"./sdk-contracts.js";import{c as t,l as n}from"./sdk-device.js";import{A as r,C as i,_ as a,y as o}from"./sdk-android-adb.js";import{u as s}from"./host-process.js";import{n as c,o as l,t as u,u as d}from"./verified-file.js";import{t as f}from"./app-log-files.js";import{n as p,r as m,t as h}from"./platform-runtime-app-log-process.js";import{createTemporaryTextFile as g,n as _,t as v}from"./platform-runtime-host.js";import y from"node:fs";import{setTimeout as b}from"node:timers/promises";async function x(e,t){t=C(e,t),f(t);let n=u(t),r;try{r=y.createWriteStream(t,{fd:n,autoClose:!0})}catch(e){throw y.closeSync(n),e}let i;r.on(`error`,e=>{i??=e});let a=w(),o=``,s=Promise.resolve(),c,l=e=>{let t=s.then(e);return s=t.catch(()=>void 0),t},d=async e=>{let t=`${o}${e}`.split(`
2
- `);o=t.pop()??``;for(let e of t)await D(r,T(`${e}\n`,a))};return{write:async e=>await l(async()=>await d(E(e))),[Symbol.asyncDispose]:async()=>{c??=l(async()=>{if(o&&=(await D(r,T(o,a)),``),await O(r),i)throw i}),await c}}}async function S(e,t,n){if(t=C(e,t),!Number.isInteger(n)||n<1||n>1024*1024)throw TypeError(`App-log tail size must be between 1 byte and 1 MiB`);let r=c(t);if(r===void 0)return``;let i=y.fstatSync(r).size,a=Math.min(i,n),o=i-a,s=+(o>0),l=Buffer.alloc(a+s);try{y.readSync(r,l,0,l.length,o-s)}finally{y.closeSync(r)}let u=l.subarray(s).toString(`utf8`);if(s===0||l[0]===10)return u;let d=u.indexOf(`
3
- `);return d<0?``:u.slice(d+1)}function C(e,t){return m({sessionsDir:e,pathname:t,basename:`app.log`,label:`App-log output`})}function w(){return(process.env.AGENT_DEVICE_APP_LOG_REDACT_PATTERNS??``).split(`,`).map(e=>e.trim()).filter(Boolean).flatMap(e=>{try{return[new RegExp(e,`gi`)]}catch{return[]}})}function T(e,t){return t.reduce((e,t)=>e.replace(t,`[REDACTED]`),e)}function E(e){return typeof e==`string`?e:Buffer.from(e).toString(`utf8`)}async function D(e,t){t&&await new Promise((n,r)=>{e.write(t,e=>e?r(e):n())})}async function O(e){e.closed||await new Promise((t,n)=>{e.once(`error`,n),e.end(()=>{e.off(`error`,n),t()})})}function k(e){return Object.freeze({appLogs:Object.freeze({resolveSession:e.resolveSessionArtifacts,readRecent:async(t,n)=>{let{outputPath:r}=e.resolveSessionArtifacts(t);return A(r,n)},readProcessMarker:async t=>{let{pidPath:n}=e.resolveSessionArtifacts(t);return await e.processes.readMarker(n)}}),networkTransports:Object.freeze({resolve:e.resolveTransport})})}function A(e,t){if(!Number.isInteger(t)||t<1||t>2e4)throw TypeError(`Network app-log scan lines must be between 1 and 20000`);let n=c(e);if(n===void 0)return Object.freeze({path:e,exists:!1,text:``,skippedLines:0});try{let r=j(y.readFileSync(n,`utf8`),t);return Object.freeze({path:e,exists:!0,...r})}finally{y.closeSync(n)}}function j(e,t){let n=e.split(`
1
+ import{y as e}from"./sdk-contracts.js";import{l as t,p as n,u as r,w as i}from"./sdk-device.js";import{r as a}from"./diagnostics.js";import{C as o}from"./owner-identity.js";import{i as s,r as c}from"./verified-file.js";import{l,p as u,s as d}from"./exec.js";import"./file.js";import"./diagnostics2.js";import"./command.js";import"./process.js";import{t as f}from"./platform-runtime-android-mechanics.js";import{t as p}from"./perf-runtime.js";import{a as ee,n as te}from"./durable-resource.js";import{n as ne}from"./async-lifecycle.js";import{m}from"./src7.js";import{r as re}from"./device-inventory-context.js";import{t as ie}from"./app-log-files.js";import{n as ae,r as oe,t as h}from"./platform-runtime-app-log-process.js";import{createTemporaryTextFile as g,n as _,t as v}from"./platform-runtime-host.js";import{i as y,n as b,t as x}from"./platform-runtime-screen-recording-process-host.js";import S from"node:fs";import{setTimeout as se}from"node:timers/promises";async function ce(e,t){t=C(e,t),ie(t);let n=c(t),r;try{r=S.createWriteStream(t,{fd:n,autoClose:!0})}catch(e){throw S.closeSync(n),e}let i;r.on(`error`,e=>{i??=e});let a=ue(),o=``,s=Promise.resolve(),l,u=e=>{let t=s.then(e);return s=t.catch(()=>void 0),t},d=async e=>{let t=`${o}${e}`.split(`
2
+ `);o=t.pop()??``;for(let e of t)await T(r,w(`${e}\n`,a))};return{write:async e=>await u(async()=>await d(de(e))),[Symbol.asyncDispose]:async()=>{l??=u(async()=>{if(o&&=(await T(r,w(o,a)),``),await fe(r),i)throw i}),await l}}}async function le(e,t,n){if(t=C(e,t),!Number.isInteger(n)||n<1||n>1048576)throw TypeError(`App-log tail size must be between 1 byte and 1 MiB`);let r=s(t);if(r===void 0)return``;let i=S.fstatSync(r).size,a=Math.min(i,n),o=i-a,c=+(o>0),l=Buffer.alloc(a+c);try{S.readSync(r,l,0,l.length,o-c)}finally{S.closeSync(r)}let u=l.subarray(c).toString(`utf8`);if(c===0||l[0]===10)return u;let d=u.indexOf(`
3
+ `);return d<0?``:u.slice(d+1)}function C(e,t){return oe({sessionsDir:e,pathname:t,basename:`app.log`,label:`App-log output`})}function ue(){return(process.env.AGENT_DEVICE_APP_LOG_REDACT_PATTERNS??``).split(`,`).map(e=>e.trim()).filter(Boolean).flatMap(e=>{try{return[new RegExp(e,`gi`)]}catch{return[]}})}function w(e,t){return t.reduce((e,t)=>e.replace(t,`[REDACTED]`),e)}function de(e){return typeof e==`string`?e:Buffer.from(e).toString(`utf8`)}async function T(e,t){t&&await new Promise((n,r)=>{e.write(t,e=>e?r(e):n())})}async function fe(e){e.closed||await new Promise((t,n)=>{e.once(`error`,n),e.end(()=>{e.off(`error`,n),t()})})}function pe(e){return Object.freeze({appLogs:Object.freeze({resolveSession:e.resolveSessionArtifacts,readRecent:async(t,n)=>{let{outputPath:r}=e.resolveSessionArtifacts(t);return me(r,n)},readProcessMarker:async t=>{let{pidPath:n}=e.resolveSessionArtifacts(t);return await e.processes.readMarker(n)}}),networkTransports:Object.freeze({resolve:e.resolveTransport})})}function me(e,t){if(!Number.isInteger(t)||t<1||t>2e4)throw TypeError(`Network app-log scan lines must be between 1 and 20000`);let n=s(e);if(n===void 0)return Object.freeze({path:e,exists:!1,text:``,skippedLines:0});try{let r=he(S.readFileSync(n,`utf8`),t);return Object.freeze({path:e,exists:!0,...r})}finally{S.closeSync(n)}}function he(e,t){let n=e.split(`
4
4
  `),r=Math.max(0,n.length-t);return Object.freeze({text:n.slice(r).join(`
5
- `),skippedLines:r})}function M(){let e=Object.freeze({resolve:async e=>{let{createAndroidScreenRecordingTransport:t}=await import(`./platform-runtime-screen-recording-android-host.js`);return await t(e)}}),t=Object.freeze({resolve:async e=>{let{resolveWebScreenRecordingTransport:t}=await import(`./platform-runtime-screen-recording-web-host.js`);return await t(e)}}),n=Object.freeze({prepare:async e=>{let{createScreenRecordingOutputHost:t}=await import(`./platform-runtime-screen-recording-output-host.js`);await t().prepare(e)}}),r=Object.freeze({complete:async(e,t)=>{let{createScreenRecordingFinalizer:n}=await import(`./platform-runtime-screen-recording-finalizer-host.js`);return await n().complete(e,t)}});return Object.freeze({apple:N(),android:e,harmony:P(),web:t,outputs:n,finalize:r})}function N(){let e=async()=>{let{createAppleScreenRecordingHost:e}=await import(`./platform-runtime-screen-recording-apple-host.js`);return e()};return Object.freeze({availability:async t=>(await e()).availability(t),runRunner:async(t,n,r)=>await(await e()).runRunner(t,n,r),startSimulator:async(t,n,r)=>await(await e()).startSimulator(t,n,r),inspectProcess:async t=>await(await e()).inspectProcess(t),terminateProcess:async t=>await(await e()).terminateProcess(t),inspectRunner:async(t,n,r)=>await(await e()).inspectRunner(t,n,r),retrieveRunnerRecording:async(t,n,r,i)=>await(await e()).retrieveRunnerRecording(t,n,r,i),captureClockAnchor:async(t,n,r)=>await(await e()).captureClockAnchor(t,n,r),isRunnerBundleId:async t=>await(await e()).isRunnerBundleId(t)})}function P(){let e=async()=>{let{createHarmonyScreenRecordingHost:e}=await import(`./platform-runtime-screen-recording-harmony-host.js`);return e()};return Object.freeze({start:async(t,n,r)=>await(await e()).start(t,n,r),stop:async(t,n)=>await(await e()).stop(t,n),findMedia:async(t,n,r)=>await(await e()).findMedia(t,n,r),stageMedia:async(t,n,r)=>await(await e()).stageMedia(t,n,r),stagedFileSize:async(t,n,r)=>await(await e()).stagedFileSize(t,n,r),pull:async(t,n,r)=>await(await e()).pull(t,n,r),remove:async(t,n,r)=>await(await e()).remove(t,n,r),removeMedia:async(t,n,r)=>await(await e()).removeMedia(t,n,r)})}function F(){return Object.freeze({ensureConnected:async(e,t)=>{t.throwIfAborted();try{let{resolveIosPhysicalDeviceControl:n}=await import(`./physical-device-control.js`).then(e=>e.t);await n(e).ensureReady(e,t),t.throwIfAborted()}catch(e){throw t.throwIfAborted(),e}}})}function I(){return Object.freeze({keepHot:e=>{import(`./runner-client.js`).then(e=>e.r).then(({prewarmAppleRunnerCache:t})=>t(e,{})).catch(()=>{})},markBooted:e=>{import(`./simulator.js`).then(e=>e.i).then(({markSimulatorBooted:t})=>t(e)).catch(()=>{})}})}function L(){return Object.freeze({discover:async(e,t)=>{t.throwIfAborted();let n=await d(e);return t.throwIfAborted(),n},launch:(e,t)=>{let n=[`-avd`,e];return t&&n.push(`-no-window`,`-no-audio`),o(`emulator`,n)},terminate:async e=>{await s({pids:[e],termTimeoutMs:1500,killTimeoutMs:1500})}})}function ee(){return Object.freeze({apple:Object.freeze({listApps:async(e,t)=>{let{listIosApps:n}=await import(`./apps.js`).then(e=>e.t);return R(await n(e,t))}}),android:Object.freeze({listApps:async(e,t)=>{let{listAndroidApps:n}=await import(`./app-lifecycle.js`).then(e=>e.t);return(await n(e,t)).map(e=>({id:e.package,name:e.name}))}}),harmonyos:Object.freeze({listApps:async(e,t,n)=>{let{listHarmonyApps:r}=await import(`./app-lifecycle2.js`);return(await r(e,t,{signal:n})).map(e=>({id:e.package,name:e.name}))}})})}function R(e){return e.map(e=>({id:e.bundleId,name:e.name}))}function z(){return Object.freeze({android:Object.freeze({run:async(e,t,n)=>{n.throwIfAborted();let{runAndroidAdb:r}=await import(`./app-lifecycle.js`).then(e=>e.m),i=await r(e,[...t.args],{allowFailure:t.allowFailure,timeoutMs:t.timeoutMs,signal:n});return n.throwIfAborted(),{stdout:i.stdout}}}),harmonyos:Object.freeze({run:async(e,t,n)=>{n.throwIfAborted();let{runHarmonyHdc:r}=await import(`./hdc.js`).then(e=>e.t),i=await r(e,[...t.args],{allowFailure:t.allowFailure,timeoutMs:t.timeoutMs,signal:n});return n.throwIfAborted(),{stdout:i.stdout}}})})}function B(e,t){let n,r,i=async()=>(n??=t.apple({appleTools:e.appleTools}),await n),a=async()=>(r??=t.android({commands:e.commands}),await r),o=Object.freeze({shutdownTarget:async(e,t)=>await(await i()).shutdownTarget(e,t)}),s=Object.freeze({shutdownTarget:async(e,t)=>await(await a()).shutdownTarget(e,t)}),c=Object.freeze({canShutdownTarget:async e=>await V(e,i,a),shutdownTarget:async e=>await H(e,i,a)});return Object.freeze({apple:o,android:s,close:c})}async function V(e,t,n){return e.platform===`apple`?(await t()).canShutdownTarget(e):e.platform===`android`?(await n()).canShutdownTarget(e):!1}async function H(e,t,n){let r=new AbortController().signal;return e.platform===`apple`?await(await t()).shutdownTarget(e,r):e.platform===`android`?await(await n()).shutdownTarget(e,r):{success:!1,exitCode:-1,stdout:``,stderr:`Cannot shut down unsupported device ${e.platform}/${e.kind}`}}function U(){return Object.freeze({withInvalidatedAppResolutionCache:async(e,t)=>{let{invalidateIosAppResolutionCache:n}=await import(`./app-resolution.js`).then(e=>e.t);return await n(e,t)},prepareArtifact:async(e,t)=>{let{prepareIosInstallArtifact:n}=await import(`./install-artifact2.js`);return await n(e.source,t)},resolveAppBundleId:async(e,t)=>{let{resolveIosApp:n}=await import(`./app-resolution.js`).then(e=>e.t);return await n(e,t)}})}function W(){return Object.freeze({bundletoolJar:process.env.AGENT_DEVICE_BUNDLETOOL_JAR?.trim()||void 0,withInvalidatedAppResolutionCache:async(e,t)=>{let{withAndroidAppResolutionCacheInvalidated:n}=await import(`./app-lifecycle.js`).then(e=>e.u);return await n(e,t)},prepareArtifact:async(e,t)=>{let{prepareAndroidInstallArtifact:n}=await import(`./install-artifact.js`);return await n(e.source,t)},resolveAppPackage:async(e,t)=>{let{resolveAndroidApp:n}=await import(`./app-lifecycle.js`).then(e=>e.u),r=await n(e,t);if(r.type===`intent`){let{AppError:e}=await import(`./sdk-contracts.js`).then(e=>e.S);throw new e(`INVALID_ARGS`,`App uninstall requires a package name, not an intent`)}return r.value}})}function G(){return Object.freeze({runAdb:async(e,t,n,r)=>{let{runAndroidAdb:i}=await import(`./app-lifecycle.js`).then(e=>e.m),a=await i(e,[...t],{allowFailure:n.allowFailure,timeoutMs:n.timeoutMs,signal:r});return{stdout:a.stdout,stderr:a.stderr,exitCode:a.exitCode}},installPackage:async(e,t,n,r)=>{let{resolveAndroidAdbProvider:i}=await import(`./sdk-android-adb.js`).then(e=>e.t),a=i(e),o=a.install?await a.install(t,{replace:n.replace,signal:r}):await a.exec([`install`,...n.replace?[`-r`]:[],t],{signal:r});return{stdout:o.stdout,stderr:o.stderr,exitCode:o.exitCode}},installBundle:async(e,t,n,r)=>{let{resolveAndroidAdbProvider:i}=await import(`./sdk-android-adb.js`).then(e=>e.t),a=i(e).installBundle;return a?(await a(t,{mode:n,signal:r}),!0):!1}})}function K(){return Object.freeze({resolveOpenTarget:async(e,t)=>await q(e,t),prewarmRunnerCache:async(e,t,n)=>{let{prewarmAppleRunnerCache:r}=await import(`./runner-client.js`).then(e=>e.r);await r(e,X(t,n))},prewarmRunnerSession:async(e,t,n,r)=>{let{prewarmIosRunnerSession:i}=await import(`./runner-client.js`).then(e=>e.r);await i(e,{...X(t,n),propagateError:r})},notifyRunnerAppRelaunched:async(e,t,n)=>{let{notifyIosRunnerAppRelaunched:r}=await import(`./runner-client.js`).then(e=>e.r);await r(e,X(t,n))},stopRunnerSession:async e=>{let{stopIosRunnerSession:t}=await import(`./runner-client.js`).then(e=>e.r);await t(e)},scheduleRunnerIdleStop:e=>{import(`./runner-client.js`).then(e=>e.r).then(({scheduleIosRunnerIdleStop:t})=>t(e))},prepareRunner:async(e,t,n)=>{let{Deadline:r}=await import(`./boot-diagnostics.js`).then(e=>e.s),{prepareIosRunner:i}=await import(`./runner-client.js`).then(e=>e.r),a=Date.now();return await i(e,{...X(t.execution,n),cleanStaleBundles:!0,buildTimeoutMs:t.timeoutMs,healthTimeoutMs:t.timeoutMs,prepareDeadline:r.fromTimeoutMs(t.timeoutMs,a),startupTimeoutMs:t.timeoutMs})},applyRuntimeHints:async(e,t)=>{let{applyRuntimeHintValues:n}=await import(`./platform-runtime-runtime-hints.js`);await n({device:e,...t})},clearRuntimeHints:async(e,t)=>{let{clearRuntimeHintValues:n}=await import(`./platform-runtime-runtime-hints.js`);await n({device:e,...t})},dismissCloseAlerts:async(e,t)=>await Z(e,t),detachRunnerSessionsForShutdown:async()=>{let{detachIosSimulatorRunnerSessionsForShutdown:e}=await import(`./runner-client.js`).then(e=>e.r);await e()},finalizeRunnerSessionsForShutdown:async()=>{let{stopAllIosRunnerSessions:e}=await import(`./runner-client.js`).then(e=>e.r);await e()}})}async function q(t,n){if(n.foreground){let n=await J(t);if(n)return n;throw new e(`AMBIGUOUS_MATCH`,`open --foreground requires exactly one running app on the selected iOS simulator.`,{reason:`foreground_app_ambiguous`,hint:`Pass an explicit app instead: agent-device open <app> --platform ios.`})}let r=await Y(t,n.surface),{resolveSessionAppBundleIdForTarget:i}=await import(`./platform-runtime-open-target.js`).then(e=>e.t);return{appBundleId:r.appBundleId??await i(t,n.target,n.currentAppBundleId,async()=>void 0),appName:r.appName??n.target}}async function J(e){if(!t(e)||e.kind!==`simulator`)return;let{detectSoleRunningIosSimulatorApp:n}=await import(`./app-resolution.js`).then(e=>e.t),r=await n(e);return r?{appBundleId:r.bundleId,appName:r.name}:void 0}async function Y(e,t){if(!n(e)||t===`app`||t===`desktop`||t===`menubar`)return{};let{resolveFrontmostMacOsApp:r}=await import(`./helper.js`).then(e=>e.t),i=await r();return{appBundleId:i.bundleId,appName:i.appName}}function X(e,t){return{requestId:e.requestId,logPath:e.logPath,traceLogPath:e.traceLogPath,verbose:e.verbose,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,runnerLeaseContext:e.runnerLeaseContext,signal:t}}async function Z(e,t){if(!n(e))return;let{runMacOsAlertAction:r}=await import(`./helper.js`).then(e=>e.t);await r(`dismiss`,t.surface===`frontmost-app`?{surface:`frontmost-app`}:t.appBundleId?{bundleId:t.appBundleId}:{})}function Q(){return Object.freeze({resolveOpenTarget:async(e,t)=>await $(e,t),inferOpenedAppBundleId:async(e,t,n)=>{let{inferAndroidPackageAfterOpen:r}=await import(`./platform-runtime-open-target.js`).then(e=>e.t);return await r(e,t,n)},resetFramePerfStats:async(e,t)=>{let{resetAndroidFramePerfStats:n}=await import(`./perf.js`).then(e=>e.o);await n(e,t)},applyRuntimeHints:async(e,t)=>{let{applyRuntimeHintValues:n}=await import(`./platform-runtime-runtime-hints.js`);await n({device:e,...t})},clearRuntimeHints:async(e,t)=>{let{clearRuntimeHintValues:n}=await import(`./platform-runtime-runtime-hints.js`);await n({device:e,...t})},activateTestIme:async(t,n)=>{let{activateAndroidTestIme:i}=await import(`./ime-lifecycle.js`).then(e=>e.n),a=await i(t,n);if(a.outcome===`helper-unavailable`){r({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:t.id,error:a.reason}});return}if(a.persistFailed&&!(!a.alreadyActive&&!a.activated))throw new e(`COMMAND_FAILED`,`Android test IME recovery records could not be persisted for ${t.name??t.id}.`,{reason:`android_test_ime_recovery_fence_failed`,deviceId:t.id})},restoreTestIme:async(t,n)=>{let{restoreAndroidTestIme:r}=await import(`./ime-lifecycle.js`).then(e=>e.n);if((await r(t,{stateDir:n.stateDir})).reason===`set-failed`)throw new e(`COMMAND_FAILED`,`Android test IME could not be restored on ${t.name??t.id}.`,{reason:`android_test_ime_restore_incomplete`,deviceId:t.id})},recoverTestImeStartup:async e=>{let{listAndroidAdbSerialsQuick:t,restoreOrphanedAndroidTestImeOnDaemonStartup:n}=await import(`./ime-lifecycle.js`).then(e=>e.n);await n({stateDir:e.stateDir,listSerials:t})},hasTestImeRecoveryEvidence:async e=>{let{readAndroidTestImeRecoveryMarkers:t}=await import(`./ime-recovery-marker.js`).then(e=>e.n);return(await t(e)).length>0}})}async function $(e,t){let{resolveAndroidPackageForOpen:n,resolveSessionAppBundleIdForTarget:r}=await import(`./platform-runtime-open-target.js`).then(e=>e.t);return{appBundleId:await r(e,t.target,t.currentAppBundleId,n),appName:t.target}}function te(){return Object.freeze({resolve:async(e,t)=>{let{getLocalInteractor:n}=await import(`./interactors.js`).then(e=>e.n);return await n(e,t)}})}function ne(e){return Object.freeze({recoverStartupResources:async t=>{await e.android.hasTestImeRecoveryEvidence(t.stateDir)&&await e.android.recoverTestImeStartup(t)},detachForDaemonShutdown:async()=>await e.apple.detachRunnerSessionsForShutdown(),finalizeDaemonShutdown:async()=>await e.apple.finalizeRunnerSessionsForShutdown()})}function re(e){let t=h(e.sessionsDir),n=Object.freeze({mode:`local`,start:t.start}),r=_(),o=Object.freeze({which:async e=>await i(e)?e:void 0,run:async(e,t)=>{let n=await a(e.executable,[...e.args],{allowFailure:e.allowFailure,cwd:e.cwd,env:e.env?{...process.env,...e.env}:void 0,signal:t,timeoutMs:e.timeoutMs});return{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode}}}),s=k({resolveSessionArtifacts:e.resolveSessionArtifacts,processes:t,resolveTransport:async e=>{if(e.platform!==`web`)return Object.freeze({mode:`local`});let{resolveWebNetworkTransport:t}=await import(`./platform-runtime-network-web-transport.js`);return await t(e)}}),c=K(),u=Q();return Object.freeze({commands:o,appleTools:r,toolchains:v(),artifacts:Object.freeze({resolveSession:e.resolveSessionArtifacts}),outputs:Object.freeze({openAppend:async t=>await x(e.sessionsDir,t),readTail:async(t,n)=>await S(e.sessionsDir,t,n)}),processes:t,processTransports:Object.freeze({resolve:async t=>{if(t.platform!==`android`)return n;let{resolveAndroidAppLogProcessTransport:r}=await import(`./platform-runtime-app-log-android-transport.js`);return r(e.sessionsDir,t,n)}}),...s,appInventory:ee(),appState:z(),appleDeployment:U(),androidDeployment:W(),androidTools:G(),temporaryFiles:Object.freeze({create:async e=>await g(e)}),deviceReadiness:Object.freeze({applePhysical:F(),appleAutomation:I(),androidEmulator:L()}),deviceShutdown:B({appleTools:r,commands:o},e.shutdownLoaders),screenRecording:M(),snapshot:l(),localInteractors:te(),appleApplications:c,androidApplications:u,applicationResources:ne({android:u,apple:c}),clock:Object.freeze({now:()=>Date.now(),sleep:async(e,t)=>{await b(e,void 0,t?{signal:t}:void 0)}})})}export{re as createPlatformRuntimeHost,p as recoverLegacyAppLogMarkersAfterDaemonLock};
5
+ `),skippedLines:r})}function ge(e={}){let t=Object.freeze({resolve:async e=>{let{createAndroidScreenRecordingTransport:t}=await import(`./platform-runtime-screen-recording-android-host.js`);return await t(e)}}),n=Object.freeze({resolve:async e=>{let{resolveWebScreenRecordingTransport:t}=await import(`./platform-runtime-screen-recording-web-host.js`);return await t(e)}}),r=Object.freeze({prepare:async e=>{let{createScreenRecordingOutputHost:t}=await import(`./platform-runtime-screen-recording-output-host.js`);await t().prepare(e)}}),i=Object.freeze({complete:async(e,t)=>{let{createScreenRecordingFinalizer:n}=await import(`./platform-runtime-screen-recording-finalizer-host.js`);return await n().complete(e,t)}}),a=e.ownedProcesses??Object.freeze({replace:()=>{},clear:()=>{}});return Object.freeze({apple:_e(),android:t,harmony:E(),web:n,outputs:r,finalize:i,ownedProcesses:a})}function _e(){let e=async()=>{let{createAppleScreenRecordingHost:e}=await import(`./platform-runtime-screen-recording-apple-host.js`);return e()};return Object.freeze({availability:async t=>(await e()).availability(t),runRunner:async(t,n,r)=>await(await e()).runRunner(t,n,r),startSimulator:async(t,n,r)=>await(await e()).startSimulator(t,n,r),inspectProcess:async t=>await(await e()).inspectProcess(t),terminateProcess:async t=>await(await e()).terminateProcess(t),inspectRunner:async(t,n,r)=>await(await e()).inspectRunner(t,n,r),retrieveRunnerRecording:async(t,n,r,i)=>await(await e()).retrieveRunnerRecording(t,n,r,i),captureClockAnchor:async(t,n,r)=>await(await e()).captureClockAnchor(t,n,r),isRunnerBundleId:async t=>await(await e()).isRunnerBundleId(t)})}function E(){let e=async()=>{let{createHarmonyScreenRecordingHost:e}=await import(`./platform-runtime-screen-recording-harmony-host.js`);return e()};return Object.freeze({start:async(t,n,r)=>await(await e()).start(t,n,r),stop:async(t,n)=>await(await e()).stop(t,n),findMedia:async(t,n,r)=>await(await e()).findMedia(t,n,r),stageMedia:async(t,n,r)=>await(await e()).stageMedia(t,n,r),stagedFileSize:async(t,n,r)=>await(await e()).stagedFileSize(t,n,r),pull:async(t,n,r)=>await(await e()).pull(t,n,r),remove:async(t,n,r)=>await(await e()).remove(t,n,r),removeMedia:async(t,n,r)=>await(await e()).removeMedia(t,n,r)})}function D(e={}){let t=e.ownedProcesses??Object.freeze({replace:()=>{},clear:()=>{}});return Object.freeze({hostCapture:Object.freeze({info:Object.freeze({source:`system-audio`,backend:`macos-screencapturekit`,sourceCount:1,notes:O}),start:async e=>{let{startMacOsAudioProbeProcess:t}=await import(`./macos-facade.js`),n=await t(e),r=await b(n.child.pid??void 0);return Object.freeze({...r===void 0?{}:{marker:r},wait:n.wait,terminate:async()=>{n.child.kill(`SIGTERM`),await n.wait.catch(()=>{})}})},inspectProcess:async e=>x(e),terminateProcess:async e=>await y([e])}),web:Object.freeze({resolve:async e=>{if(e.platform!==`web`)return;let{resolveWebProvider:t}=await import(`./src6.js`).then(e=>e.i),n=await t(),r=n.probeAudio?.bind(n);if(r)return Object.freeze({probe:async e=>await r({action:e.action,durationMs:e.durationMs,bucketMs:e.bucketMs})})}}),ownedProcesses:t})}function O(e){return[`Audio probe samples host system audio through ScreenCaptureKit for this ${t(e)?`iOS simulator`:e.platform===`android`?`Android emulator`:`macOS session`}; it is not app-instrumented audio.`,`Screen Recording permission is required for host system audio capture.`,`Other audible host apps can contribute to the measured buckets.`]}const k=f,A=async()=>await import(`./perf-facade.js`),j=Object.freeze({resourceKind:p,version:1,encode:e=>e,decode:we});async function M(t,n,r){if(r.kind!==`xctrace`)throw V(`Apple`,`xctrace`,r.kind);let i=r.template??(r.mode===`cpu-profile`?`Time Profiler`:`Animation Hitches`),a=await A(),o=await a.startAppleXctracePerfCapture({device:t,appBundleId:r.appId,mode:r.mode,template:i,outPath:r.outPath}),s=await b(o.child.pid??void 0);if(!s)throw await a.cleanupAppleXctracePerfCapture(o).catch(()=>{}),new e(`COMMAND_FAILED`,`Apple xctrace exposed no exact process identity`);return P(t,n,r,{family:`apple`,marker:s,capture:Se(o)},F(o),R(`started`,o))}async function N(e,t,n){let r=await k(),i;if(n.mode===`cpu-profile`){if(n.kind!==`simpleperf`)throw V(`Android`,`simpleperf`,n.kind);i=await r.startAndroidSimpleperfProfile(e,n.appId,n.outPath)}else{if(n.kind!==`perfetto`)throw V(`Android`,`perfetto`,n.kind);i=await r.startAndroidPerfettoTrace(e,n.appId,n.outPath)}return P(e,t,n,{family:`android`,capture:i},I(e,i),z(i))}function P(e,t,n,r,a,o){return Object.freeze({pendingHandle:new ne(a),envelope:te({resourceKind:p,sessionId:n.sessionId,device:i(e),owner:t,fence:n.fence,lifecycle:`open`,descriptor:ee(j,r)}),response:o})}function F(e){return L({initialOutPath:e.outPath,inspect:()=>R(`started`,e),finish:async t=>await A().then(async n=>R(`stopped`,await n.stopAppleXctracePerfCapture(e,t))),cleanup:async()=>await A().then(async t=>{await t.cleanupAppleXctracePerfCapture(e)})})}function I(e,t){return L({initialOutPath:t.outPath,inspect:()=>z(t),finish:async n=>{let r=await k();return z(t.kind===`simpleperf`?await r.stopAndroidSimpleperfProfile(e,t,n):await r.stopAndroidPerfettoTrace(e,t,n))},cleanup:async()=>{await(await k()).cleanupAndroidNativePerfSession(e,t)}})}function L(e){let t=e.initialOutPath,n,r,i=async()=>await e.cleanup().then(()=>({status:`cleaned`}),B);return Object.freeze({inspect:e.inspect,setOutputPath:e=>{t=e},finish:async()=>n??=e.finish(t).then(e=>({status:`completed`,result:e})),forceCleanup:async()=>r??=i(),[Symbol.asyncDispose]:async()=>{Ce(await(r??=i()))}})}async function ve(e){let t=m(e,j);if(t.status!==`decoded`||t.descriptor.family!==`apple`)return{status:`cleanup-pending`,reason:`manual-recovery-required`};let n=await x(t.descriptor.marker);if(n===`ownership-lost`)return{status:`cleanup-pending`,reason:`ownership-fence-lost`};if(n===`missing`)return{status:`already-missing`};let r=await y([t.descriptor.marker]);return r===`terminated`?{status:`cleaned`}:r===`already-missing`?{status:`already-missing`}:{status:`cleanup-pending`,reason:`ownership-fence-lost`}}async function ye(e){let t=m(e,j);if(t.status!==`decoded`)return t;if(t.descriptor.family!==`apple`)return{status:`unreattachable`,reason:`descriptor-invalid`};let n=await x(t.descriptor.marker);return n===`owned-alive`?{status:`unreattachable`,reason:`transport-not-reattachable`}:n===`ownership-lost`?{status:`unreattachable`,reason:`ownership-fence-lost`}:{status:`missing`}}async function be(e){let t=m(e,j);return t.status===`decoded`?t.descriptor.family===`android`?{status:`unreattachable`,reason:`transport-not-reattachable`}:{status:`unreattachable`,reason:`descriptor-invalid`}:t}async function xe(e,t){let n=m(t,j);if(n.status!==`decoded`||n.descriptor.family!==`android`)return{status:`cleanup-pending`,reason:`manual-recovery-required`};try{return await(await k()).cleanupAndroidNativePerfSession(e,n.descriptor.capture),{status:`cleaned`}}catch(e){return B(e)}}function Se(e){let{child:t,wait:n,...r}=e;return r}function R(e,t){return{perf:e,kind:t.kind,mode:t.mode,template:t.template,outPath:t.outPath,appBundleId:t.appBundleId,deviceId:t.deviceId,platform:t.platform,targetPids:t.targetPids,targetProcesses:t.targetProcesses,startedAt:t.startedAt,endedAt:t.endedAt}}function z(e){let t={action:e.action,platform:`android`,type:e.type,packageName:e.packageName,appPid:e.appPid,profilerPid:e.profilerPid,state:e.state,startedAt:new Date(e.startedAt).toISOString(),stoppedAt:typeof e.stoppedAt==`number`?new Date(e.stoppedAt).toISOString():void 0,outPath:e.outPath,sizeBytes:e.sizeBytes,remotePath:e.remotePath,method:e.method,message:e.message,...e.action===`stop`?{durationMs:e.durationMs,summary:e.summary}:{}};return e.kind===`simpleperf`?{...t,kind:`simpleperf`,mode:`cpu-profile`}:{...t,kind:`perfetto`,mode:`trace`}}function B(e){return{status:`cleanup-pending`,reason:`cleanup-unconfirmed`,message:e instanceof Error?e.message:String(e)}}function Ce(t){if(t.status===`cleanup-pending`)throw new e(`COMMAND_FAILED`,t.message??`Perf capture cleanup could not be confirmed`,{reason:t.reason})}function V(t,n,r){return new e(`INVALID_ARGS`,`${t} native perf requires --kind ${n}, not ${r}`)}function we(e){return e.family===`android`&&Te(e.capture)?{status:`decoded`,descriptor:{family:`android`,capture:e.capture}}:e.family===`apple`&&Oe(e.capture)&&Me(e.marker)?{status:`decoded`,descriptor:{family:`apple`,capture:e.capture,marker:e.marker}}:{status:`invalid`,message:`Perf capture descriptor body is invalid`}}function Te(e){return U(e)?Ee(e.kind,e.type)&&H(e,[`packageName`,`appPid`,`profilerPid`,`remotePath`,`outPath`])&&typeof e.startedAt==`number`&&De(e.state)&&ke(e,[`stoppedAt`,`sizeBytes`]):!1}function Ee(e,t){return e===`simpleperf`&&t===`cpu-profile`||e===`perfetto`&&t===`trace`}function De(e){return e===`running`||e===`stopped`}function Oe(e){return U(e)&&e.kind===`xctrace`&&(e.mode===`cpu-profile`||e.mode===`trace`)&&H(e,[`template`,`outPath`,`appBundleId`,`deviceId`,`startedAt`])&&n(e.platform)&&Ae(e.targetProcesses)&&je(e.targetPids)}function H(e,t){return t.every(t=>typeof e[t]==`string`)}function ke(e,t){return t.every(t=>e[t]===void 0||typeof e[t]==`number`)}function Ae(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function je(e){return Array.isArray(e)&&e.every(e=>typeof e==`number`)}function U(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Me(e){return U(e)&&typeof e.pid==`number`&&typeof e.startTime==`string`&&typeof e.command==`string`}const W=f,Ne=f,Pe=f,G=async()=>await import(`./perf-facade.js`),K=async()=>await import(`./perf-facade.js`),Fe=async()=>await import(`./perf-facade.js`),Ie=async()=>await import(`./src3.js`).then(e=>e.b);function Le(){let e=Object.freeze({sampleFrames:async(e,t)=>await(await G()).sampleAppleFramePerf(e,t),frameSampling:async e=>(await K()).buildAppleFrameSamplingMetadata(e),sampleMemory:async(e,t)=>await(await G()).sampleAppleMemoryPerf(e,t),memorySampling:async e=>(await K()).buildAppleMemorySamplingMetadata(e),memorySnapshotSupport:async e=>(await K()).buildAppleMemorySnapshotSupport(e),captureMemorySnapshot:async(e,t,n)=>await(await G()).captureAppleMemorySnapshot(e,t,n),start:async(e,t,n)=>await M(e,t,n),reattach:async(e,{envelope:t})=>await ye(t),cleanup:async(e,{envelope:t})=>await ve(t),writeProfileReport:async e=>await(await Fe()).writeAppleXctracePerfReport({tracePath:e.tracePath,outPath:e.outPath,template:e.template,appBundleId:e.appId})}),t=Object.freeze({sampleFrames:async(e,t)=>await(await Ne()).sampleAndroidFramePerf(e,t),sampleMemory:async(e,t)=>await(await W()).sampleAndroidMemoryPerf(e,t),captureMemorySnapshot:async(e,t,n)=>await(await W()).captureAndroidHeapSnapshot(e,t,n),start:async(e,t,n)=>await N(e,t,n),reattach:async(e,{envelope:t})=>await be(t),cleanup:async(e,{envelope:t})=>await xe(e,t),writeProfileReport:async(e,t)=>await(await Pe()).writeAndroidSimpleperfReport(e,Re(t.profile,t.tracePath),t.outPath)}),n=Object.freeze({sampleMemory:async(e,t)=>await(await Ie()).sampleHarmonyMemoryPerf(e,t)});return Object.freeze({apple:e,android:t,harmony:n})}function Re(t,n){if(t?.kind!==`simpleperf`||t.type!==`cpu-profile`||t.mode!==`cpu-profile`)throw new e(`INVALID_ARGS`,`Stopped Simpleperf profile metadata is malformed.`);return{type:`cpu-profile`,kind:`simpleperf`,packageName:t.packageName,appPid:t.appPid,profilerPid:t.profilerPid,remotePath:t.remotePath,outPath:n,startedAt:t.startedAt?Date.parse(t.startedAt):Date.now(),state:`stopped`,...t.stoppedAt?{stoppedAt:Date.parse(t.stoppedAt)}:{},...t.sizeBytes===void 0?{}:{sizeBytes:t.sizeBytes}}}function ze(){return Object.freeze({ensureConnected:async(e,t)=>{t.throwIfAborted();try{let{resolveIosPhysicalDeviceControl:n}=await import(`./physical-device-facade.js`);await n(e).ensureReady(e,t),t.throwIfAborted()}catch(e){throw t.throwIfAborted(),e}}})}function Be(){return Object.freeze({keepHot:e=>{import(`./runner-operations-facade.js`).then(({prewarmAppleRunnerCache:t})=>t(e,{})).catch(()=>{})},wasRecentlyObservedBooted:async e=>{let{wasSimulatorRecentlyObservedBooted:t}=await import(`./simulator-facade.js`);return t(e)},markBooted:e=>{import(`./simulator-facade.js`).then(({markSimulatorBooted:t})=>t(e)).catch(()=>{})}})}function Ve(){return Object.freeze({discover:async(e,t)=>{t.throwIfAborted();let n=await re(e);return t.throwIfAborted(),n},launch:(e,t)=>{let n=[`-avd`,e];return t&&n.push(`-no-window`,`-no-audio`),l(`emulator`,n)},terminate:async e=>{await o({pids:[e],termTimeoutMs:1500,killTimeoutMs:1500})}})}function He(e,t){let n,r,i=async()=>(n??=t.apple({appleTools:e.appleTools}),await n),a=async()=>(r??=t.android({commands:e.commands}),await r),o=Object.freeze({shutdownTarget:async(e,t)=>await(await i()).shutdownTarget(e,t)}),s=Object.freeze({shutdownTarget:async(e,t)=>await(await a()).shutdownTarget(e,t)}),c=Object.freeze({canShutdownTarget:async e=>await Ue(e,i,a),shutdownTarget:async e=>await We(e,i,a)});return Object.freeze({apple:o,android:s,close:c})}async function Ue(e,t,n){return e.platform===`apple`?(await t()).canShutdownTarget(e):e.platform===`android`&&(await n()).canShutdownTarget(e)}async function We(e,t,n){let r=new AbortController().signal;return e.platform===`apple`?await(await t()).shutdownTarget(e,r):e.platform===`android`?await(await n()).shutdownTarget(e,r):{success:!1,exitCode:-1,stdout:``,stderr:`Cannot shut down unsupported device ${e.platform}/${e.kind}`}}function Ge(){return Object.freeze({withInvalidatedAppResolutionCache:async(e,t)=>{let{invalidateIosAppResolutionCache:n}=await import(`./app-resolution-facade.js`);return await n(e,t)},prepareArtifact:async(e,t)=>{let{prepareIosInstallArtifact:n}=await import(`./install-artifact-facade.js`);return await n(e.source,t)},resolveAppBundleId:async(e,t)=>{let{resolveIosApp:n}=await import(`./app-resolution-facade.js`);return await n(e,t)}})}function Ke(){return Object.freeze({bundletoolJar:process.env.AGENT_DEVICE_BUNDLETOOL_JAR?.trim()||void 0,withInvalidatedAppResolutionCache:async(e,t)=>{let{withAndroidAppResolutionCacheInvalidated:n}=await f();return await n(e,t)},prepareArtifact:async(e,t)=>{let{prepareAndroidInstallArtifact:n}=await f();return await n(e.source,t)},resolveAppPackage:async(e,t)=>{let{resolveAndroidApp:n}=await f(),r=await n(e,t);if(r.type===`intent`){let{AppError:e}=await import(`./sdk-contracts.js`).then(e=>e.w);throw new e(`INVALID_ARGS`,`App uninstall requires a package name, not an intent`)}return r.value}})}function qe(){return Object.freeze({probeClipboardShellSupport:async(e,t)=>{try{let{runAndroidAdb:n,isAndroidShellCommandUnsupported:r}=await f(),i=await n(e,[`shell`,`cmd`,`clipboard`,`get`,`text`],{allowFailure:!0,signal:t});return i.exitCode===0?`supported`:r(i.stdout,i.stderr)?`unsupported`:`probe-failed`}catch{return`probe-failed`}},runAdb:async(e,t,n,r)=>{let{runAndroidAdb:i}=await f(),a=await i(e,[...t],{allowFailure:n.allowFailure,timeoutMs:n.timeoutMs,signal:r});return{stdout:a.stdout,stderr:a.stderr,exitCode:a.exitCode}},installPackage:async(e,t,n,r)=>{let{resolveAndroidAdbProvider:i}=await f(),a=i(e),o=a.install?await a.install(t,{replace:n.replace,signal:r}):await a.exec([`install`,...n.replace?[`-r`]:[],t],{signal:r});return{stdout:o.stdout,stderr:o.stderr,exitCode:o.exitCode}},installBundle:async(e,t,n,r)=>{let{resolveAndroidAdbProvider:i}=await f(),a=i(e).installBundle;return a?(await a(t,{mode:n,signal:r}),!0):!1}})}let Je;const q=()=>Je??=import(`./runner-operations-facade.js`);let Ye;const J=()=>Ye??=import(`./platform-runtime-runtime-hints.js`);let Xe;const Ze=()=>Xe??=import(`./platform-runtime-open-target.js`).then(e=>e.t);let Qe;const $e=()=>Qe??=import(`./app-resolution-facade.js`);let et;const Y=()=>et??=import(`./macos-facade.js`);let tt;const nt=()=>tt??=import(`./retry.js`).then(e=>e.t);function rt(){return Object.freeze({resolveOpenTarget:async(e,t)=>await it(e,t),prewarmRunnerCache:async(e,t,n)=>{let{prewarmAppleRunnerCache:r}=await q();await r(e,Z(t,n))},prewarmRunnerSession:async(e,t,n,r,i)=>{let{prewarmIosRunnerSession:a}=await q();await a(e,{...Z(t,n),propagateError:r,...i})},notifyRunnerAppRelaunched:async(e,t,n)=>{let{notifyIosRunnerAppRelaunched:r}=await q();await r(e,Z(t,n))},stopRunnerSession:async e=>{let{stopIosRunnerSession:t}=await q();await t(e)},hasLiveRunnerSession:async(e,t)=>{let{hasLiveIosRunnerSession:n}=await q();return n(e,{requestId:t.requestId})},releaseSpeculativeRunner:async(e,t)=>{let{releaseSpeculativeIosRunnerSessionFor:n}=await q();return await n(e,{requestId:t.requestId})},scheduleRunnerIdleStop:e=>{q().then(({scheduleIosRunnerIdleStop:t})=>t(e))},prepareRunner:async(e,t,n)=>{let{Deadline:r}=await nt(),{prepareIosRunner:i}=await q(),a=Date.now();return await i(e,{...Z(t.execution,n),cleanStaleBundles:!0,buildTimeoutMs:t.timeoutMs,healthTimeoutMs:t.timeoutMs,prepareDeadline:r.fromTimeoutMs(t.timeoutMs,a),startupTimeoutMs:t.timeoutMs})},applyRuntimeHints:async(e,t)=>{let{applyRuntimeHintValues:n}=await J();await n({device:e,...t})},clearRuntimeHints:async(e,t)=>{let{clearRuntimeHintValues:n}=await J();await n({device:e,...t})},dismissCloseAlerts:async(e,t)=>await ot(e,t),detachRunnerSessionsForShutdown:async()=>{let{detachIosSimulatorRunnerSessionsForShutdown:e}=await q();await e()},finalizeRunnerSessionsForShutdown:async()=>{let{stopAllIosRunnerSessions:e}=await q();await e()}})}async function it(t,n){if(n.foreground){let n=await X(t);if(n)return n;throw new e(`AMBIGUOUS_MATCH`,`open --foreground requires exactly one running app on the selected iOS simulator.`,{reason:`foreground_app_ambiguous`,hint:`Pass an explicit app instead: agent-device open <app> --platform ios.`})}let r=await at(t,n.surface),{resolveSessionAppBundleIdForTarget:i}=await Ze();return{appBundleId:r.appBundleId??await i(t,n.target,n.currentAppBundleId,async()=>void 0),appName:r.appName??n.target}}async function X(e){if(!t(e)||e.kind!==`simulator`)return;let{detectSoleRunningIosSimulatorApp:n}=await $e(),r=await n(e);return r?{appBundleId:r.bundleId,appName:r.name}:void 0}async function at(e,t){if(!r(e)||t===`app`||t===`desktop`||t===`menubar`)return{};let{resolveFrontmostMacOsApp:n}=await Y(),i=await n();return{appBundleId:i.bundleId,appName:i.appName}}function Z(e,t){return{requestId:e.requestId,logPath:e.logPath,traceLogPath:e.traceLogPath,verbose:e.verbose,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,runnerLeaseContext:e.runnerLeaseContext,signal:t}}async function ot(e,t){if(!r(e))return;let{runMacOsAlertAction:n}=await Y();await n(`dismiss`,t.surface===`frontmost-app`?{surface:`frontmost-app`}:t.appBundleId?{bundleId:t.appBundleId}:{})}let st;const Q=()=>st??=import(`./platform-runtime-open-target.js`).then(e=>e.t);let ct;const $=()=>ct??=import(`./platform-runtime-runtime-hints.js`);function lt(){return Object.freeze({resolveOpenTarget:async(e,t)=>await ut(e,t),inferOpenedAppBundleId:async(e,t,n)=>{let{inferAndroidPackageAfterOpen:r}=await Q();return await r(e,t,n)},resetFramePerfStats:async(e,t)=>{let{resetAndroidFramePerfStats:n}=await f();await n(e,t)},applyRuntimeHints:async(e,t)=>{let{applyRuntimeHintValues:n}=await $();await n({device:e,...t})},clearRuntimeHints:async(e,t)=>{let{clearRuntimeHintValues:n}=await $();await n({device:e,...t})},activateTestIme:async(t,n)=>{let{activateAndroidTestIme:r}=await f(),i=await r(t,n);if(i.outcome===`helper-unavailable`){a({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:t.id,error:i.reason}});return}if(i.persistFailed&&!(!i.alreadyActive&&!i.activated))throw new e(`COMMAND_FAILED`,`Android test IME recovery records could not be persisted for ${t.name??t.id}.`,{reason:`android_test_ime_recovery_fence_failed`,deviceId:t.id})},restoreTestIme:async(t,n)=>{let{restoreAndroidTestIme:r}=await f();if((await r(t,{stateDir:n.stateDir})).reason===`set-failed`)throw new e(`COMMAND_FAILED`,`Android test IME could not be restored on ${t.name??t.id}.`,{reason:`android_test_ime_restore_incomplete`,deviceId:t.id})},recoverTestImeStartup:async e=>{let{listAndroidAdbSerialsQuick:t,restoreOrphanedAndroidTestImeOnDaemonStartup:n}=await f();await n({stateDir:e.stateDir,listSerials:t})},hasTestImeRecoveryEvidence:async e=>{let{readAndroidTestImeRecoveryMarkers:t}=await f();return(await t(e)).length>0}})}async function ut(e,t){let{resolveAndroidPackageForOpen:n,resolveSessionAppBundleIdForTarget:r}=await Q();return{appBundleId:await r(e,t.target,t.currentAppBundleId,n),appName:t.target}}function dt(){return Object.freeze({resolve:async(e,t)=>{let{getLocalInteractor:n}=await import(`./interactors.js`);return await n(e,t)}})}function ft(e){return Object.freeze({recoverStartupResources:async t=>{await e.android.hasTestImeRecoveryEvidence(t.stateDir)&&await e.android.recoverTestImeStartup(t)},detachForDaemonShutdown:async()=>await e.apple.detachRunnerSessionsForShutdown(),finalizeDaemonShutdown:async()=>await e.apple.finalizeRunnerSessionsForShutdown()})}function pt(e){return Object.freeze({captureSurface:async(t,n,r)=>t.platform===`linux`?await e.linux(n,r):(mt(t),await e.macos(n,r)),presentIosAcquisition:async(e,t)=>{let{presentIosSnapshotAcquisition:n}=await import(`./ios-snapshot-runtime.js`);return await n(e,t)}})}function mt(e){if(e.platform!==`apple`||e.appleOs!==`macos`)throw TypeError(`Apple surface capture requires a non-app macOS surface`)}async function ht(e,t){let{captureMacOsSurfaceSnapshot:n}=await import(`./macos-facade.js`);return await n(e??{},t)}function gt(e){let t=h(e.sessionsDir),n=Object.freeze({mode:`local`,start:t.start}),r=_(),i=Object.freeze({which:async e=>await u(e)?e:void 0,run:async(e,t)=>{let n=await d(e.executable,[...e.args],{allowFailure:e.allowFailure,cwd:e.cwd,env:e.env?{...process.env,...e.env}:void 0,signal:t,timeoutMs:e.timeoutMs});return{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode}}}),a=pe({resolveSessionArtifacts:e.resolveSessionArtifacts,processes:t,resolveTransport:async e=>{if(e.platform!==`web`)return Object.freeze({mode:`local`});let{resolveWebNetworkTransport:t}=await import(`./platform-runtime-network-web-transport.js`);return await t(e)}}),o=rt(),s=lt();return Object.freeze({commands:i,appleTools:r,toolchains:v(),artifacts:Object.freeze({resolveSession:e.resolveSessionArtifacts}),outputs:Object.freeze({openAppend:async t=>await ce(e.sessionsDir,t),readTail:async(t,n)=>await le(e.sessionsDir,t,n)}),processes:t,processTransports:Object.freeze({resolve:async t=>{if(t.platform!==`android`)return n;let{resolveAndroidAppLogProcessTransport:r}=await import(`./platform-runtime-app-log-android-transport.js`);return r(e.sessionsDir,t,n)}}),...a,appleDeployment:Ge(),androidDeployment:Ke(),androidTools:qe(),temporaryFiles:Object.freeze({create:async e=>await g(e)}),deviceReadiness:Object.freeze({applePhysical:ze(),appleAutomation:Be(),androidEmulator:Ve()}),deviceShutdown:He({appleTools:r,commands:i},e.shutdownLoaders),screenRecording:ge({ownedProcesses:e.ownedProcesses}),audioProbe:D({ownedProcesses:e.ownedProcesses}),perf:Le(),snapshot:e.snapshot,localInteractors:dt(),appleApplications:o,androidApplications:s,applicationResources:ft({android:s,apple:o}),clock:Object.freeze({now:()=>Date.now(),sleep:async(e,t)=>{await se(e,void 0,t?{signal:t}:void 0)}})})}export{gt as createPlatformRuntimeHost,pt as createSnapshotRuntimeHost,ht as loadMacOsSurfaceSnapshot,ae as recoverLegacyAppLogMarkersAfterDaemonLock};