agent-device 0.21.19 → 0.21.21

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 (369) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.19.apk → agent-device-android-ime-helper-0.21.21.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.21.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.19.manifest.json → agent-device-android-ime-helper-0.21.21.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.21.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.21.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.19.manifest.json → agent-device-android-snapshot-helper-0.21.21.manifest.json} +6 -6
  7. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AppWindowScreenshot.swift +73 -0
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/BackgroundInteraction.swift +557 -0
  9. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/GhostCursor.swift +141 -0
  10. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +107 -3
  11. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +136 -22
  12. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/BackgroundInteractionTests.swift +88 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +133 -4
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +10 -2
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +36 -9
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +28 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -14
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +14 -16
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +67 -14
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +6 -1
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +7 -2
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +21 -7
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +121 -17
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +179 -6
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +119 -0
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +8 -1
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +23 -11
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +59 -6
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +112 -23
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +25 -12
  31. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +6 -1
  32. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +43 -13
  33. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +20 -5
  34. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +2 -15
  35. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +10 -25
  36. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +1 -18
  37. package/dist/src/adapter.js +1 -1
  38. package/dist/src/adb-executor.js +2 -2
  39. package/dist/src/adb-failure.js +1 -1
  40. package/dist/src/adb-transport.js +1 -1
  41. package/dist/src/agent-browser-lifecycle.js +1 -1
  42. package/dist/src/agent-browser-process-record.js +1 -1
  43. package/dist/src/agent-browser-provider.js +1 -1
  44. package/dist/src/agent-browser-tool.js +1 -1
  45. package/dist/src/agent-device-client.js +2 -2
  46. package/dist/src/ai-sdk.js +1 -1
  47. package/dist/src/alert-runtime.js +1 -1
  48. package/dist/src/alert.js +1 -0
  49. package/dist/src/android-adb.d.ts +12 -0
  50. package/dist/src/android-input-ownership.js +1 -1
  51. package/dist/src/app-backend.js +1 -0
  52. package/dist/src/app-catalog.js +1 -1
  53. package/dist/src/app-deployment-resolution.js +1 -1
  54. package/dist/src/app-inventory.js +1 -1
  55. package/dist/src/app-launch.js +2 -2
  56. package/dist/src/app-lifecycle.js +2 -2
  57. package/dist/src/app-lifecycle2.js +1 -1
  58. package/dist/src/app-log-files.js +1 -1
  59. package/dist/src/app-log-reconnect.js +1 -1
  60. package/dist/src/app-log-runtime2.js +3 -3
  61. package/dist/src/app-log-session-resource.js +1 -0
  62. package/dist/src/app-resolution.js +2 -2
  63. package/dist/src/apple-runner-platform.js +1 -1
  64. package/dist/src/application-lifecycle-interaction.js +1 -1
  65. package/dist/src/archive.js +2 -2
  66. package/dist/src/artifact-download.js +1 -1
  67. package/dist/src/auth-session.js +1 -1
  68. package/dist/src/auth.js +1 -1
  69. package/dist/src/back-mode.js +1 -1
  70. package/dist/src/backend-snapshot-options.js +1 -1
  71. package/dist/src/boot-diagnostics.js +1 -1
  72. package/dist/src/browser-launch.js +1 -1
  73. package/dist/src/cache.js +1 -1
  74. package/dist/src/capabilities.js +1 -1
  75. package/dist/src/capture.js +1 -1
  76. package/dist/src/cli-config.js +1 -1
  77. package/dist/src/cli-help.js +317 -323
  78. package/dist/src/cli-runner.js +1 -1
  79. package/dist/src/cli.js +4 -4
  80. package/dist/src/click-button.js +1 -1
  81. package/dist/src/client-metro-companion.js +1 -1
  82. package/dist/src/client-metro.js +1 -1
  83. package/dist/src/client-options.js +3 -0
  84. package/dist/src/client-types.d.ts +101 -6
  85. package/dist/src/clipboard-shell-response.js +1 -1
  86. package/dist/src/{scroll-command.d.ts → cloud-artifacts.d.ts} +249 -240
  87. package/dist/src/code-signature-cache.js +1 -1
  88. package/dist/src/code-signature.js +1 -1
  89. package/dist/src/command-schema.js +3 -3
  90. package/dist/src/command-tools.js +2 -2
  91. package/dist/src/command.js +1 -1
  92. package/dist/src/config.js +1 -1
  93. package/dist/src/connection-runtime.js +1 -1
  94. package/dist/src/connection.js +5 -5
  95. package/dist/src/contracts.d.ts +1 -1
  96. package/dist/src/contracts.js +1 -1
  97. package/dist/src/daemon-artifacts.js +1 -0
  98. package/dist/src/daemon-client-lease-beat.js +1 -1
  99. package/dist/src/daemon-client-lifecycle.js +1 -1
  100. package/dist/src/daemon-client-liveness-probe.js +1 -0
  101. package/dist/src/daemon-client-transport.js +1 -1
  102. package/dist/src/daemon-http.js +1 -0
  103. package/dist/src/daemon-policy-file.js +1 -1
  104. package/dist/src/daemon-registration-owner.js +1 -0
  105. package/dist/src/daemon-registration.js +1 -1
  106. package/dist/src/daemon-resolution.js +1 -1
  107. package/dist/src/daemon-shutdown-report.js +1 -1
  108. package/dist/src/daemon.js +2 -2
  109. package/dist/src/debug-symbols-facade.js +3 -3
  110. package/dist/src/device-claim-inspection.js +1 -1
  111. package/dist/src/device-claim-rule.js +1 -1
  112. package/dist/src/device-inventory-context.js +1 -1
  113. package/dist/src/device-readiness-runtime.js +1 -1
  114. package/dist/src/device-release.js +1 -1
  115. package/dist/src/device-rotation.js +1 -1
  116. package/dist/src/device-selection-resolver.js +1 -1
  117. package/dist/src/device-session.js +1 -1
  118. package/dist/src/device-shell.js +1 -1
  119. package/dist/src/device.js +1 -1
  120. package/dist/src/device2.js +1 -3
  121. package/dist/src/device3.js +3 -0
  122. package/dist/src/devicectl.js +1 -1
  123. package/dist/src/diagnostics.js +3 -3
  124. package/dist/src/dispatch-resolve.js +4 -1
  125. package/dist/src/display-inventory.js +1 -1
  126. package/dist/src/doctor-facade.js +1 -1
  127. package/dist/src/doctor2.js +1 -1
  128. package/dist/src/durable-capture-resource.js +1 -0
  129. package/dist/src/engine-eval-script.js +1 -1
  130. package/dist/src/error.js +1 -1
  131. package/dist/src/exec.js +1 -1
  132. package/dist/src/file.js +1 -1
  133. package/dist/src/find.js +1 -1
  134. package/dist/src/generic-settle.js +1 -1
  135. package/dist/src/generic.js +1 -1
  136. package/dist/src/gesture-admission.js +1 -1
  137. package/dist/src/gesture-plan.js +1 -1
  138. package/dist/src/gesture-runtime.js +1 -1
  139. package/dist/src/harmonyos.js +1 -1
  140. package/dist/src/hdc.js +1 -1
  141. package/dist/src/helper.js +2 -2
  142. package/dist/src/host-file.js +1 -1
  143. package/dist/src/host.js +1 -1
  144. package/dist/src/human-control-contract.js +1 -1
  145. package/dist/src/human-control.js +1 -1
  146. package/dist/src/index.d.ts +2 -2
  147. package/dist/src/index.js +1 -1
  148. package/dist/src/input-actions.js +1 -1
  149. package/dist/src/input-actions2.js +2 -2
  150. package/dist/src/install-artifact-facade.js +1 -1
  151. package/dist/src/install-source-network-transport.js +1 -1
  152. package/dist/src/install-source.d.ts +5 -0
  153. package/dist/src/install-source2.js +1 -1
  154. package/dist/src/instance-client.js +1 -0
  155. package/dist/src/interaction-positionals.js +1 -1
  156. package/dist/src/interaction-ref-policy.js +1 -1
  157. package/dist/src/interaction.js +1 -1
  158. package/dist/src/interaction2.js +1 -1
  159. package/dist/src/interactor-operation-binding.js +1 -1
  160. package/dist/src/interactor.js +5 -5
  161. package/dist/src/interactor2.js +1 -1
  162. package/dist/src/interactors.js +1 -1
  163. package/dist/src/internal/bin.js +1 -1
  164. package/dist/src/internal/daemon.js +1 -2
  165. package/dist/src/internal/png-worker.js +1 -1
  166. package/dist/src/internal/run-script-http-child.js +1 -1
  167. package/dist/src/inventory.js +4 -4
  168. package/dist/src/inventory2.js +1 -1
  169. package/dist/src/inventory3.js +1 -1
  170. package/dist/src/inventory5.js +1 -1
  171. package/dist/src/ios-client.js +4 -30
  172. package/dist/src/ios-settings.js +1 -0
  173. package/dist/src/ios-snapshot-engine.js +1 -1
  174. package/dist/src/ios-snapshot-runtime.js +1 -1
  175. package/dist/src/launch-confirmation.js +1 -0
  176. package/dist/src/lease-context.js +1 -1
  177. package/dist/src/lease-registry-scope.js +1 -0
  178. package/dist/src/lease-scope.js +1 -1
  179. package/dist/src/lease.js +1 -1
  180. package/dist/src/legacy-xctest-device-set.js +1 -1
  181. package/dist/src/limrun-download-file.js +1 -1
  182. package/dist/src/limrun-runtime-dependencies.js +1 -1
  183. package/dist/src/limrun.d.ts +78 -44
  184. package/dist/src/limrun.js +1 -1
  185. package/dist/src/linux.js +1 -1
  186. package/dist/src/load.js +1 -0
  187. package/dist/src/location-coordinates.js +1 -1
  188. package/dist/src/macos-facade.js +1 -1
  189. package/dist/src/managed-device-scope.js +1 -1
  190. package/dist/src/mechanics.js +16 -16
  191. package/dist/src/observation.js +1 -1
  192. package/dist/src/observe-until.js +1 -1
  193. package/dist/src/overlay.js +2 -2
  194. package/dist/src/owner-identity.js +3 -3
  195. package/dist/src/path-resolution.js +1 -1
  196. package/dist/src/perf-facade.js +1 -1
  197. package/dist/src/perf-runtime-operation-builder.js +1 -1
  198. package/dist/src/perf-runtime-plan.js +1 -1
  199. package/dist/src/perf-target.js +1 -1
  200. package/dist/src/perf.js +1 -1
  201. package/dist/src/physical-device-control.js +1 -1
  202. package/dist/src/platform-request-scope.js +1 -1
  203. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  204. package/dist/src/platform-runtime-app-log-process.js +1 -1
  205. package/dist/src/platform-runtime-host.js +1 -1
  206. package/dist/src/platform-runtime-managed-owner.js +1 -1
  207. package/dist/src/platform-runtime-open-target.js +1 -1
  208. package/dist/src/platform-runtime-operation-host.js +2 -2
  209. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  210. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  211. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  212. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  213. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  214. package/dist/src/platform-runtime-screen-recording-output-host.js +1 -1
  215. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  216. package/dist/src/platform-runtime-unavailable.js +1 -1
  217. package/dist/src/platform-runtime.js +1 -1
  218. package/dist/src/platform-runtime2.js +1 -1
  219. package/dist/src/plugins.d.ts +9 -0
  220. package/dist/src/plugins.js +1 -0
  221. package/dist/src/plugins2.js +2 -0
  222. package/dist/src/png-crop-bytes.js +1 -1
  223. package/dist/src/png-size.js +1 -1
  224. package/dist/src/png-worker-client.js +1 -1
  225. package/dist/src/png.js +1 -1
  226. package/dist/src/prepare-kind.js +1 -1
  227. package/dist/src/process.js +1 -1
  228. package/dist/src/project-runtime.js +1 -1
  229. package/dist/src/provider-credential-fingerprint.js +1 -0
  230. package/dist/src/provider-device-admission.js +1 -1
  231. package/dist/src/provider-device-runtimes.js +1 -0
  232. package/dist/src/provider-limrun-credentials.js +1 -0
  233. package/dist/src/provider-profile-fields.js +1 -0
  234. package/dist/src/provider-session-ownership.js +2 -2
  235. package/dist/src/provider-webdriver.js +2 -1
  236. package/dist/src/providers.js +1 -1
  237. package/dist/src/proxy.js +1 -1
  238. package/dist/src/quality-warnings.js +1 -1
  239. package/dist/src/react-native.js +1 -1
  240. package/dist/src/record-runtime.js +1 -1
  241. package/dist/src/record-trace.js +1 -1
  242. package/dist/src/recording.js +1 -1
  243. package/dist/src/rect-center.js +1 -1
  244. package/dist/src/register-builtins.js +1 -1
  245. package/dist/src/registry.js +52 -36
  246. package/dist/src/remote-config2.js +1 -1
  247. package/dist/src/replay-divergence.js +1 -1
  248. package/dist/src/replay.js +2 -2
  249. package/dist/src/reporting.js +5 -5
  250. package/dist/src/request-admission.js +1 -1
  251. package/dist/src/request-cancel.js +1 -1
  252. package/dist/src/request-cancellation.js +1 -1
  253. package/dist/src/request-runtime-binding.js +1 -1
  254. package/dist/src/result-serialization.js +1 -1
  255. package/dist/src/retry.js +1 -1
  256. package/dist/src/runner-artifact-manifest.js +1 -1
  257. package/dist/src/runner-cache-metadata.js +3 -3
  258. package/dist/src/runner-client.js +1 -1
  259. package/dist/src/runner-dev-tools-security.js +1 -1
  260. package/dist/src/runner-device-readiness.js +1 -1
  261. package/dist/src/runner-disposal.js +1 -1
  262. package/dist/src/runner-error-classification.js +2 -2
  263. package/dist/src/runner-exchange.js +1 -1
  264. package/dist/src/runner-operations-facade.js +1 -1
  265. package/dist/src/runner-session-types.js +1 -1
  266. package/dist/src/runner-start-budget.js +1 -1
  267. package/dist/src/runner.js +1 -1
  268. package/dist/src/runtime-admission.js +1 -1
  269. package/dist/src/runtime-transport-hints.js +1 -1
  270. package/dist/src/runtime.js +1 -1
  271. package/dist/src/runtime10.js +2 -2
  272. package/dist/src/runtime2.js +3 -3
  273. package/dist/src/runtime3.js +1 -1
  274. package/dist/src/runtime4.js +5 -5
  275. package/dist/src/runtime5.js +1 -1
  276. package/dist/src/runtime6.js +1 -1
  277. package/dist/src/runtime7.js +1 -1
  278. package/dist/src/runtime8.js +1 -1
  279. package/dist/src/runtime9.js +1 -1
  280. package/dist/src/screen-recording-admission-ledger.js +1 -1
  281. package/dist/src/screen-recording-completion.js +1 -1
  282. package/dist/src/screen-recording-options.js +1 -1
  283. package/dist/src/screen-recording-resource-recovery.js +1 -1
  284. package/dist/src/screen-recording-transport.js +1 -1
  285. package/dist/src/screenshot-density.js +1 -1
  286. package/dist/src/screenshot-image.js +1 -1
  287. package/dist/src/screenshot-result.js +1 -1
  288. package/dist/src/screenshot-runtime.js +1 -1
  289. package/dist/src/screenshot.js +1 -1
  290. package/dist/src/screenshot3.js +1 -1
  291. package/dist/src/script.js +1 -1
  292. package/dist/src/scroll-command.js +1 -1
  293. package/dist/src/scroll-gesture.js +1 -1
  294. package/dist/src/sdk-batch-runner.js +2 -2
  295. package/dist/src/sdk-batch.js +2 -2
  296. package/dist/src/sdk-contracts.d.ts +47 -2
  297. package/dist/src/sdk-contracts.js +2 -2
  298. package/dist/src/sdk-device.js +1 -1
  299. package/dist/src/sdk-io.js +1 -1
  300. package/dist/src/sdk-remote-config.js +1 -1
  301. package/dist/src/sdk-selectors.d.ts +37 -8
  302. package/dist/src/selection.js +0 -0
  303. package/dist/src/selector-runtime.js +1 -1
  304. package/dist/src/selectors.d.ts +2 -2
  305. package/dist/src/selectors.js +1 -1
  306. package/dist/src/server.js +1 -1
  307. package/dist/src/session-allocation.js +1 -1
  308. package/dist/src/session-artifact-paths.js +1 -1
  309. package/dist/src/session-repair-tombstone.js +1 -1
  310. package/dist/src/session-routing.js +1 -1
  311. package/dist/src/session-runtime-admission.js +1 -1
  312. package/dist/src/session-snapshot.js +1 -1
  313. package/dist/src/session-stream.js +27 -0
  314. package/dist/src/session.js +1 -1
  315. package/dist/src/session2.js +5 -5
  316. package/dist/src/settings.js +1 -1
  317. package/dist/src/settings2.js +1 -1
  318. package/dist/src/simctl-settings-facade.js +1 -0
  319. package/dist/src/simctl-settings.js +1 -0
  320. package/dist/src/simctl.js +1 -1
  321. package/dist/src/simulator-boot.js +1 -1
  322. package/dist/src/simulator.js +1 -1
  323. package/dist/src/snapshot-diagnostics.js +1 -1
  324. package/dist/src/snapshot-runtime-binding.js +1 -1
  325. package/dist/src/snapshot-runtime.js +1 -1
  326. package/dist/src/snapshot-state.js +1 -1
  327. package/dist/src/snapshot2.js +1 -1
  328. package/dist/src/snapshot3.js +1 -1
  329. package/dist/src/snapshot4.js +1 -1
  330. package/dist/src/src.js +1 -1
  331. package/dist/src/src7.js +1 -1
  332. package/dist/src/src8.js +2 -2
  333. package/dist/src/store.js +1 -0
  334. package/dist/src/string-enum.js +1 -1
  335. package/dist/src/surface-snapshot.js +1 -1
  336. package/dist/src/takeover.js +1 -1
  337. package/dist/src/target-evidence.js +1 -1
  338. package/dist/src/telemetry.js +1 -1
  339. package/dist/src/text-entry-focus.js +1 -1
  340. package/dist/src/tool-provider.js +3 -3
  341. package/dist/src/tool-provider2.js +1 -1
  342. package/dist/src/tool-provider3.js +1 -1
  343. package/dist/src/toolchain-probe.js +2 -2
  344. package/dist/src/touch-runtime.js +1 -1
  345. package/dist/src/touch-runtime2.js +1 -1
  346. package/dist/src/transport.js +2 -2
  347. package/dist/src/tv-remote.js +1 -1
  348. package/dist/src/type-text-runtime.js +1 -1
  349. package/dist/src/update-check.js +1 -1
  350. package/dist/src/vars.js +1 -1
  351. package/dist/src/verified-file.js +1 -1
  352. package/dist/src/version.js +1 -1
  353. package/dist/src/video.js +1 -1
  354. package/dist/src/viewport.js +1 -1
  355. package/dist/src/web.js +1 -1
  356. package/dist/src/web2.js +1 -1
  357. package/dist/src/webdriver-source.js +1 -1
  358. package/package.json +5 -1
  359. package/server.json +2 -2
  360. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.19.apk.sha256 +0 -1
  361. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.19.apk +0 -0
  362. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.19.apk.sha256 +0 -1
  363. package/dist/src/api.js +0 -3
  364. package/dist/src/daemon-process.js +0 -1
  365. package/dist/src/multitouch-support.js +0 -1
  366. package/dist/src/parameterized-recorded-fill.js +0 -1
  367. package/dist/src/runner-startup-transport.js +0 -1
  368. package/dist/src/runner-xctestrun.js +0 -1
  369. package/dist/src/session-store.js +0 -4
@@ -1 +1 @@
1
- import{G as e,N as t}from"./sdk-contracts.js";import{Jr as n,Xr as r,Yr as i}from"./sdk-batch.js";import{c as a,r as o}from"./diagnostics.js";import{c as s,l as c,m as l}from"./exec.js";import"./diagnostics2.js";import"./command.js";import"./process.js";import{r as u}from"./version.js";import{f as d}from"./host-file.js";import{t as f}from"./apple-runner-platform.js";import{t as p}from"./simctl.js";import{a as m,c as ee,d as te,i as ne,l as re,n as ie,o as ae,r as oe,s as se,t as ce,u as le}from"./cache.js";import h from"node:path";import{createHash as g,randomUUID as _}from"node:crypto";import ue from"node:net";import{Buffer as v}from"node:buffer";const de={unsupported:`UNSUPPORTED_OPERATION`,"malformed-tree":`COMMAND_FAILED`,"stale-target":`COMMAND_FAILED`,timeout:`COMMAND_FAILED`,cancelled:`COMMAND_FAILED`,"process-crash":`COMMAND_FAILED`,"transport-failure":`COMMAND_FAILED`,preparing:`COMMAND_FAILED`};var y=class extends t{failureKind;failureCode;constructor(e,t,n=`iOS Simulator snapshot source ${e}: ${t}`,r={},i){super(de[e],n,{...r,bridgeFailure:e,bridgeFailureCode:t,...e===`cancelled`?{reason:`request_canceled`}:{}},i),this.name=`SnapshotSourceError`,this.failureKind=e,this.failureCode=t}};function b(e,t,n={},r){return new y(e,t,void 0,n,r)}function x(e){return e instanceof ee?new y(e.buildFailureKind,e.buildFailureCode,void 0,e.buildDetails,e.cause):e}function S(n){return n instanceof y||(n=x(n),n instanceof y)?n:e(n)?b(`cancelled`,`abort-signal`,{},n):n instanceof t&&typeof n.details?.timeoutMs==`number`?b(`timeout`,`host-operation-timeout`,{timeoutMs:n.details.timeoutMs},n):b(`transport-failure`,`unexpected-host-error`,{error:n instanceof Error?n.message:String(n)},n)}function C(e,t,n=Date.now){if(t?.aborted)throw b(`cancelled`,`abort-signal`);return ae(e,t,n)}function w(e,t){try{return se(e,t)}catch(e){throw x(e)}}async function T(e,t,n,r){let i=Math.min(t,w(e,n));await te({waitMs:i,signal:e.signal,stop:r,cancelled:()=>b(`cancelled`,`abort-signal`)})}var fe=class{entries=new Map;probeBackAfterUses;constructor(e=8){this.probeBackAfterUses=e}consume(e,t,n){if(n)return{nativeLevels:void 0,reason:`explicit-depth`};let r=this.currentEntry(e);return r===`unidentified`?{nativeLevels:void 0,reason:`unidentified-target`}:!r||r.nativeLevels>=t?{nativeLevels:void 0,reason:`no-hint`}:r.remainingUses<=0?{nativeLevels:void 0,reason:`probe-back`}:(--r.remainingUses,{nativeLevels:r.nativeLevels,reason:`hinted`})}learn(e,t,n,r){return n||!e.targetId?`ignored`:r.rejected>0&&r.acceptedLevels<t?(this.remember(e.targetId,{generation:e.generation,nativeLevels:r.acceptedLevels,remainingUses:this.probeBackAfterUses}),`learned`):r.rejected===0&&r.acceptedLevels>=t?this.entries.delete(e.targetId)?`forgotten`:`ignored`:this.currentEntry(e)?`kept`:`ignored`}currentEntry(e){if(!e.targetId)return`unidentified`;let t=this.entries.get(e.targetId);if(t){if(t.generation!==e.generation){this.entries.delete(e.targetId);return}return t}}remember(e,t){if(this.entries.delete(e),this.entries.size>=32){let e=this.entries.keys().next().value;e!==void 0&&this.entries.delete(e)}this.entries.set(e,t)}};const E=65536;function pe(){return{...m(async(e,t,n)=>await s(e,t,n)),projectRoot:u,homeDirectory:d,start:me,connect:he,emitDiagnostic:o,withDiagnosticTimer:a,readTargetProcessStartTime:re}}function me(e,t,n,r={}){if(r.signal?.aborted)throw b(`cancelled`,`abort-signal`);let i=c(`xcrun`,p(e,[`spawn`,e.udid,t,`serve`,n,`--idle-timeout`,`60`,`--exit-on-disconnect`,`false`]),{allowFailure:!0,captureOutput:!1,detached:!0}),a=i.child.pid??0;if(a<=0)throw b(`transport-failure`,`bridge-process-pid-missing`);let o=``;return i.child.stderr?.setEncoding(`utf8`),i.child.stderr?.on(`data`,e=>{o=ge(o,String(e))}),{pid:a,wait:i.wait,isAlive:()=>i.child.exitCode===null&&i.child.signalCode===null,signal:e=>{l(a,e)||i.child.kill(e)},readLog:()=>o}}async function he(e,t){if(t.signal?.aborted)throw b(`cancelled`,`abort-signal`);let n=Math.max(1,Math.floor(t.timeoutMs));return await new Promise((r,i)=>{let a=ue.createConnection({path:e}),o=!1,s=!1,c=setTimeout(()=>{p(b(`timeout`,`bridge-connect-timeout`)),a.destroy()},n),l=()=>{p(b(`cancelled`,`abort-signal`)),a.destroy()},u=()=>{o=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`error`,d),a.off(`close`,f),a.setTimeout(0),r(a)},d=e=>{p(e),a.destroy()},f=()=>{o||p(b(`transport-failure`,`bridge-closed-before-connect`))},p=e=>{s||o||(s=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`connect`,u),a.off(`error`,d),a.off(`close`,f),i(e))};a.once(`connect`,u),a.once(`error`,d),a.once(`close`,f),t.signal?.addEventListener(`abort`,l,{once:!0}),t.signal?.aborted&&l()})}function ge(e,t){let n=e+t;return n.length<=E?n:n.slice(n.length-E)}function _e(e,t,n){let r=g(`sha256`).update(t).digest(`hex`).slice(0,12),i=g(`sha256`).update(n).digest(`hex`).slice(0,12);return h.join(`/tmp`,`agent-device-ax-${r}-${e.processId()}-${i}`,`snapshot.sock`)}const D=new WeakSet;async function O(e,t){let n;try{n=(await t.wait).exitCode}catch{n=void 0}return D.has(t)||(D.add(t),e.emitDiagnostic({level:`error`,phase:`ios.snapshot-source.bridge-process-exit`,data:{pid:t.pid,...n===void 0?{}:{exitCode:n},stderr:ve(t.readLog())}})),b(`process-crash`,`bridge-exited`,{pid:t.pid,...n===void 0?{}:{exitCode:n}})}function ve(e){let t=v.from(e);return t.length<=65536?e:t.subarray(-65536).toString(`utf8`)}const k=`agent-device-simulator-ax-v1.8.0`;Object.freeze([`verb`,`requestId`,`pid`,`generation`,`snapshotTree`,`automationMode`,`maxDepth`,`maxNodes`,`maxDurationMs`,`maxResponseBytes`,`nativeLevelsHint`]),Object.freeze([`protocolVersion`,`sourceVersion`,`requestId`,`generation`,`ok`,`pid`,`tree`,`truncated`,`automationEnabled`,`recovery`,`error_kind`,`error_code`,`error`]),Object.freeze([`XC_kAXXCAttributeElementType`,`XC_kAXXCAttributeElementBaseType`,`XC_kAXXCAttributeLabel`,`XC_kAXXCAttributeValue`,`XC_kAXXCAttributePlaceholderValue`,`XC_kAXXCAttributeIdentifier`,`XC_kAXXCAttributeFrame`,`XC_kAXXCAttributeAutomationType`,`XC_kAXXCAttributeTraits`,`XC_kAXXCAttributeIsUserInteractionEnabled`,`XC_kAXXCAttributeChildren`]);const ye=[`requests`,`rejected`,`continuations`,`acceptedLevels`];function A(e){let t=e.recovery;if(!F(t))throw b(`malformed-tree`,`recovery-invalid`);let n=ye.map(e=>[e,t[e]]);if(n.some(([,e])=>!Number.isSafeInteger(e)||e<0))throw b(`malformed-tree`,`recovery-invalid`);return Object.freeze(Object.fromEntries(n))}function j(e,t){let n;try{n=v.from(JSON.stringify(e),`utf8`)}catch(e){throw b(`malformed-tree`,`request-not-json`,{},e)}let r=n.length+4;if(r>t.maxRequestBytes)throw b(`transport-failure`,`request-limit-exceeded`,{frameBytes:r,maxRequestBytes:t.maxRequestBytes});let i=v.alloc(4);return i.writeUInt32BE(n.length,0),v.concat([i,n])}var M=class{header=v.alloc(4);headerBytes=0;chunks=[];payloadBytes=0;expectedBodyBytes;frame;maxFrameBytes;constructor(e){if(!Number.isSafeInteger(e)||e<=0)throw b(`malformed-tree`,`frame-limit-invalid`,{maxFrameBytes:e});this.maxFrameBytes=e}push(e){if(this.frame)return this.acceptTrailingChunk(e);let t=this.readHeader(e);if(t&&(this.appendPayload(e,t.offset,t.bodyBytes),this.payloadBytes===t.bodyBytes))return this.frame=v.concat(this.chunks,t.bodyBytes),this.frame}acceptTrailingChunk(e){if(e.length>0)throw b(`malformed-tree`,`multiple-frames`,{trailingBytes:e.length});return this.frame}readHeader(e){if(this.headerBytes===4)return{offset:0,bodyBytes:this.expectedBodyBytes};let t=Math.min(4-this.headerBytes,e.length);if(e.copy(this.header,this.headerBytes,0,t),this.headerBytes+=t,this.headerBytes<4)return;let n=this.header.readUInt32BE(0);if(n===0||n>this.maxFrameBytes)throw b(`malformed-tree`,`frame-limit-exceeded`,{bodyBytes:n,maxFrameBytes:this.maxFrameBytes});return this.expectedBodyBytes=n,{offset:t,bodyBytes:n}}appendPayload(e,t,n){let r=n-this.payloadBytes,i=e.length-t;if(i>r)throw b(`malformed-tree`,`multiple-frames`,{trailingBytes:i-r});i!==0&&(this.chunks.push(e.subarray(t)),this.payloadBytes+=i)}finish(){if(this.frame)return this.frame;throw b(`transport-failure`,`bridge-frame-incomplete`,{headerBytes:this.headerBytes,payloadBytes:this.payloadBytes,expectedBodyBytes:this.expectedBodyBytes})}};function N(e){let t;try{t=JSON.parse(e.toString(`utf8`))}catch(e){throw b(`malformed-tree`,`response-not-json`,{},e)}if(!F(t))throw b(`malformed-tree`,`response-not-object`);return t}function P(e){return Object.freeze({verb:`describe`,requestId:e.requestId,pid:e.pid,generation:e.generation,snapshotTree:!0,automationMode:!0,maxDepth:e.maxDepth,maxNodes:e.maxNodes,maxDurationMs:e.maxDurationMs,maxResponseBytes:e.maxResponseBytes,...e.nativeLevelsHint===void 0?{}:{nativeLevelsHint:e.nativeLevelsHint}})}function be(e,t){if(e.protocolVersion!==1)throw b(`transport-failure`,`protocol-version-mismatch`,{expected:1,observed:e.protocolVersion});if(e.sourceVersion!==`agent-device-simulator-ax-v1.8.0`)throw b(`transport-failure`,`source-version-mismatch`,{expected:k,observed:e.sourceVersion});if(e.requestId!==t)throw b(`transport-failure`,`request-id-mismatch`,{expected:t,observed:e.requestId})}function xe(e,t){if(typeof e.pid!=`number`||e.pid!==t.pid)throw b(`stale-target`,`bridge-pid-mismatch`,{expectedPid:t.pid,observedPid:e.pid});if(e.generation!==t.generation)throw b(`stale-target`,`bridge-generation-mismatch`,{expectedGeneration:t.generation,observedGeneration:e.generation})}function Se(e){let t=e.error_kind,n=typeof e.error_code==`string`?e.error_code:`guest-error`,r=typeof e.error==`string`?e.error:void 0,i=r?{guestMessage:r.slice(0,1024)}:{};throw b(t===`unsupported`?`unsupported`:t===`malformed_tree`?`malformed-tree`:t===`application_not_responding`?`timeout`:t===`application_unavailable`?`transport-failure`:t===`bad_request`?`malformed-tree`:`transport-failure`,n,i)}function F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function Ce(e){let t=new M(e.limits.maxResponseBytes-4),n=w(e.deadline,`bridge-request-deadline`);return await new Promise((r,i)=>{let a=!1,o=!1,s=setTimeout(()=>{p(b(`timeout`,`bridge-request-deadline`,{bridgeRequestSent:o})),e.socket.destroy()},n),c=()=>{p(b(`cancelled`,`abort-signal`,{bridgeRequestSent:o})),e.socket.destroy()},l=n=>{try{if(!Buffer.isBuffer(n))throw b(`transport-failure`,`bridge-data-invalid`);let r=t.push(n);if(r){let t=N(r);if(be(t,e.requestId),xe(t,{pid:e.expectedPid,generation:e.expectedGeneration}),t.ok!==!0&&Se(t),typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);f(t);return}}catch(t){p(t),e.socket.destroy()}},u=e=>p(S(e)),d=()=>{a||(e.process.isAlive()?p(b(`transport-failure`,`bridge-connection-closed`)):O(e.host,e.process).then(p))};e.process.wait.then(()=>{a||O(e.host,e.process).then(p)},e=>{a||p(S(e))});let f=e=>m(()=>r(e)),p=e=>m(()=>i(e)),m=t=>{a||(a=!0,clearTimeout(s),e.deadline.signal?.removeEventListener(`abort`,c),e.socket.off(`data`,l),e.socket.off(`error`,u),e.socket.off(`close`,d),t())};e.socket.on(`data`,l),e.socket.on(`error`,u),e.socket.on(`close`,d),e.deadline.signal?.addEventListener(`abort`,c,{once:!0});try{if(e.deadline.signal?.aborted)throw b(`cancelled`,`abort-signal`);o=!0,e.socket.write(e.frame)}catch(t){p(S(t)),e.socket.destroy()}})}var we=class{sessions=new Map;requestQueues=new Map;ownerId=_();closed=!1;host;constructor(e){this.host=e}async request(e){if(this.closed)throw b(`unsupported`,`source-closed`);return await this.withSimulatorLock(e.target.simulator.udid,e.deadline,()=>this.requestInSimulator(e))}async requestInSimulator(e){if(this.closed)throw b(`unsupported`,`source-closed`);let t=e.deadline;w(t,`bridge-request-deadline`);let n=this.sessions.get(e.target.simulator.udid),r=await this.ensureSession(e,t);try{let n=await this.readTargetStartTime(e.target,t),i=await this.exchange(r,e,t);return await this.assertTargetStillCurrent(e.target,n,t),i}catch(e){throw await this.handleRequestFailure(e,r,n)}}async handleRequestFailure(e,t,n){let r=S(e);return Ee(r,t,n)?await this.removeSession(t,!0):r.failureKind===`process-crash`?await this.removeSession(t,!1):r.failureKind===`transport-failure`&&(t.socket?.destroy(),t.socket=void 0),r}async withSimulatorLock(e,t,n){let r=this.requestQueues.get(e)??Promise.resolve(),i,a=new Promise(e=>{i=e}),o=r.then(()=>a);this.requestQueues.set(e,o);try{return await Te(r,t),await n()}finally{i(),this.requestQueues.get(e)===o&&this.requestQueues.delete(e)}}async close(){if(this.closed)return;this.closed=!0;let e=[...this.sessions.values()];this.sessions.clear(),await Promise.all(e.map(async e=>await this.dispose(e,!0)))}async ensureSession(e,t){let n=e.target.simulator.udid,r=this.sessions.get(n);if(r&&r.bridgePath===e.bridge.path&&r.process.isAlive())return(!r.socket||r.socket.destroyed)&&(r.socket=await this.connectUntilReady(r,t)),r;r&&await this.removeSession(r,!0);let i=_e(this.host,e.target.simulator.udid,this.ownerId);await this.host.ensureDirectory(h.dirname(i)),await this.host.remove(i);let a=this.host.start(e.target.simulator,e.bridge.path,i,{signal:t.signal}),o={udid:e.target.simulator.udid,bridgePath:e.bridge.path,socketPath:i,process:a};this.sessions.set(n,o);try{return o.socket=await this.connectUntilReady(o,t),o}catch(e){throw await this.removeSession(o,!0),S(e)}}async connectUntilReady(e,t){let n;for(;;){let r=w(t,`bridge-connect-deadline`);if(!e.process.isAlive())throw await O(this.host,e.process);try{return await this.host.connect(e.socketPath,{signal:t.signal,timeoutMs:Math.min(250,r)})}catch(e){if(n=e,e instanceof y&&e.failureKind===`cancelled`)throw e;let r=Math.min(20,w(t,`bridge-connect-deadline`));try{await T(t,r,`bridge-connect-deadline`)}catch(e){throw S(e)}}if(n instanceof y&&n.failureKind===`timeout`)throw n}}async exchange(e,t,n){(!e.socket||e.socket.destroyed)&&(e.socket=await this.connectUntilReady(e,n));let r=_(),i=j(P({requestId:r,pid:t.target.pid,generation:t.target.generation,maxDepth:Math.min(t.limits.maxTraversalDepth,t.maxDepth),maxNodes:t.limits.maxNodes,maxDurationMs:w(n,`bridge-request-deadline`),maxResponseBytes:t.limits.maxResponseBytes,...t.nativeLevelsHint===void 0?{}:{nativeLevelsHint:t.nativeLevelsHint}}),t.limits);return await Ce({process:e.process,socket:e.socket,frame:i,requestId:r,deadline:n,limits:t.limits,expectedPid:t.target.pid,expectedGeneration:t.target.generation,host:this.host})}async readTargetStartTime(e,t){let n=await this.host.readTargetProcessStartTime(e.pid,{signal:t.signal,timeoutMs:w(t,`target-identity-deadline`)});if(!n)throw b(`stale-target`,`target-process-unavailable`,{pid:e.pid,generation:e.generation});if(e.processStartTime!==void 0&&e.processStartTime!==n)throw b(`stale-target`,`target-process-changed`,{pid:e.pid,generation:e.generation,expectedStartTime:e.processStartTime,observedStartTime:n});return n}async assertTargetStillCurrent(e,t,n){let r=await this.host.readTargetProcessStartTime(e.pid,{signal:n.signal,timeoutMs:w(n,`target-identity-deadline`)});if(r!==t)throw b(`stale-target`,`target-process-changed`,{pid:e.pid,generation:e.generation,expectedStartTime:t,observedStartTime:r})}async removeSession(e,t){this.sessions.get(e.udid)===e&&this.sessions.delete(e.udid),await this.dispose(e,t)}async dispose(e,t){e.socket?.destroy(),e.socket=void 0,t&&e.process.isAlive()&&(e.process.signal(`SIGTERM`),await I(e.process,500),e.process.isAlive()&&(e.process.signal(`SIGKILL`),await I(e.process,500))),await this.host.remove(e.socketPath)}};async function Te(e,t){let n=w(t,`bridge-request-deadline`);await Promise.race([e,T(t,n,`bridge-request-deadline`).then(()=>{throw b(`timeout`,`bridge-request-deadline`)})])}function Ee(e,t,n){return(e.failureKind===`cancelled`||e.failureKind===`timeout`)&&(e.details?.bridgeRequestSent===!0||n!==t)}async function I(e,t){await Promise.race([e.wait.catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}const L=16777216,R=12e4,z=1e4,De=Object.freeze({maxRequestBytes:65536,maxResponseBytes:4194304,maxNodes:5e3,maxTraversalDepth:64,maxDurationMs:5e3});function B(e){let n={...De,...e??{}};for(let[e,r]of Object.entries(n))if(!Number.isSafeInteger(r)||r<=0)throw new t(`INVALID_ARGS`,`Snapshot source limit ${e} must be a positive integer`,{name:e,value:r});if(n.maxRequestBytes>n.maxResponseBytes)throw new t(`INVALID_ARGS`,`Snapshot source request bytes cannot exceed response bytes`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});if(n.maxRequestBytes>L||n.maxResponseBytes>L)throw new t(`INVALID_ARGS`,`Snapshot source frame limits exceed the bridge bound`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes,maximumFrameBytes:L});if(n.maxNodes>z||n.maxTraversalDepth>128)throw new t(`INVALID_ARGS`,`Snapshot source tree limits exceed the bridge bound`,{maxNodes:n.maxNodes,maxTraversalDepth:n.maxTraversalDepth,maximumNodes:z,maximumDepth:128});if(n.maxDurationMs>R)throw new t(`INVALID_ARGS`,`Snapshot source duration exceeds the bridge bound`,{maxDurationMs:n.maxDurationMs,maximumDurationMs:R});if(n.maxRequestBytes<=4||n.maxResponseBytes<=4)throw new t(`INVALID_ARGS`,`Snapshot source frame limits must leave room for a body`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});return Object.freeze(n)}const V=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeRuntime.h`,`SnapshotBridgeCapture.h`,`SnapshotBridgeCapture.m`],Oe=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeCapture.m`];async function ke(e,t,n){let r=await ne(e,n).catch(e=>{throw x(e)}),i=t.trim();if(!i)throw b(`unsupported`,`simulator-runtime-missing`);return{...r,simulatorRuntime:i}}const H=12e4;async function Ae(e){let t=e.deadline,n=e.sourceRoot??je(e.host);try{let r=await oe(e.host,n,V,t),i=await ke(e.host,e.runtime,t),a=e.cacheRoot??h.join(e.host.homeDirectory(),`.agent-device`,`snapshot-source`),o=await ce({host:e.host,deadline:t,cacheRoot:a,binaryFilename:`snapshot-bridge`,lockDescription:`iOS Simulator snapshot bridge cache`,keyInputs:{schemaVersion:1,protocolVersion:1,sourceVersion:k,sourceHash:r,toolchain:i,compileArgv:U({architecture:i.architecture,sourceRoot:``,outputPath:``})},build:async r=>{let a=await ie({host:e.host,deadline:t,argv:U({architecture:i.architecture,sourceRoot:n,outputPath:r}),budgetMs:H,label:`bridge`});if(a.exitCode!==0||!e.host.exists(r))throw b(`unsupported`,`native-build-failed`,{exitCode:a.exitCode,stderr:a.stderr.slice(0,4096)})}});return{path:o.path,sourceHash:r,cacheKey:o.cacheKey,protocolVersion:1,sourceVersion:k}}catch(e){throw x(e)}}function U(e){return[`--sdk`,`iphonesimulator`,`clang`,`-arch`,e.architecture,`-mios-simulator-version-min=15.0`,`-fobjc-arc`,`-Wall`,`-Wextra`,`-framework`,`Foundation`,`-framework`,`CoreGraphics`,...Oe.map(t=>h.join(e.sourceRoot,t)),`-o`,e.outputPath]}function je(e){let t=e.projectRoot(),n=h.join(t,`apple`,`snapshot-bridge`);if(V.every(t=>e.exists(h.join(n,t))))return n;let r=h.join(t,`dist`,`apple`,`snapshot-bridge`);if(V.every(t=>e.exists(h.join(r,t))))return r;throw b(`unsupported`,`native-source-missing`,{projectRoot:t})}const Me=f+H;function Ne(e){let t=e.now??Date.now,n=new Map,r=le({waitMs:2e3,waitGrant:`first-caller`,retryAfterMs:6e4,now:t}),i=async(r,i)=>{let a=C(Me,i,t);try{let t=await e.host.withDiagnosticTimer(`ios.snapshot-source.prepare`,async()=>await Ae({host:e.host,runtime:r,limits:e.limits,deadline:a,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),{producer:e.producer});return n.set(r,t),t}catch(e){throw S(e)}};return{readyBinary:async(e,t,a)=>n.get(e)||await r.value(e,{start:t=>i(e,t),wait:(e,n)=>T(t,e,a,n),pending:()=>b(`preparing`,`bridge-preparation-pending`)}),close:()=>{n.clear(),r.close()}}}function Pe(e,t){return!i(e)||!i(t)||Math.abs(t.width-t.height)<=1?!1:Math.abs(e.width-t.height)<=1&&Math.abs(e.height-t.width)<=1}const W=Object.freeze({elementType:`XC_kAXXCAttributeElementType`,elementBaseType:`XC_kAXXCAttributeElementBaseType`,label:`XC_kAXXCAttributeLabel`,value:`XC_kAXXCAttributeValue`,placeholder:`XC_kAXXCAttributePlaceholderValue`,identifier:`XC_kAXXCAttributeIdentifier`,frame:`XC_kAXXCAttributeFrame`,automationType:`XC_kAXXCAttributeAutomationType`,traits:`XC_kAXXCAttributeTraits`,userInteractionEnabled:`XC_kAXXCAttributeIsUserInteractionEnabled`,children:`XC_kAXXCAttributeChildren`}),G=`Other.Other.Application.Group.Window.Sheet.Drawer.Alert.Dialog.Button.RadioButton.RadioGroup.CheckBox.DisclosureTriangle.PopUpButton.ComboBox.MenuButton.ToolbarButton.Popover.Keyboard.Key.NavigationBar.TabBar.TabGroup.Toolbar.StatusBar.Table.TableRow.TableColumn.Outline.OutlineRow.Browser.CollectionView.Slider.PageIndicator.ProgressIndicator.ActivityIndicator.SegmentedControl.Picker.PickerWheel.Switch.Toggle.Link.Image.Icon.SearchField.ScrollView.ScrollBar.StaticText.TextField.SecureTextField.DatePicker.TextView.Menu.MenuItem.MenuBar.MenuBarItem.Map.WebView.IncrementArrow.DecrementArrow.Timeline.RatingIndicator.ValueIndicator.SplitGroup.Splitter.RelevanceIndicator.ColorWell.HelpTag.Matte.DockItem.Ruler.RulerMarker.Grid.LevelIndicator.Cell.LayoutArea.LayoutItem.Handle.Stepper.Tab.TouchBar.StatusItem`.split(`.`),K={UIApplication:`Application`,UIWindow:`Window`},Fe=new Set(Object.values(W)),Ie=1n<<8n,Le=1n<<3n,Re={x:0,y:0,width:0,height:0};function ze(e,t,n){let r=Array.isArray(e)?e:[e];if(r.length===0||r.some(e=>!F(e)))throw b(`malformed-tree`,`guest-tree-root-invalid`);let i=[],a=[],o=0;for(let e of r)c(e,void 0,0,!1);if(i.length>n.maxNodes)throw b(`malformed-tree`,`node-limit-exceeded`,{nodeCount:i.length,maxNodes:n.maxNodes});if(o>n.maxTraversalDepth)throw b(`malformed-tree`,`traversal-depth-exceeded`,{maxTraversalDepth:o,maxAllowedDepth:n.maxTraversalDepth});if(typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);let s=We(i.filter(J)[0]);return s.kind===`reported`&&Ge(i,s.rect),{nodes:i,maxTraversalDepth:o,viewport:s,opaqueRemoteElements:a.filter(e=>He(e,s)).length,unresolvedCoordinateSpaceWindows:Y(i,s)};function c(e,t,r,s){if(i.length>=n.maxNodes)throw b(`malformed-tree`,`node-limit-exceeded`,{maxNodes:n.maxNodes});for(let t of Object.keys(e))if(!Fe.has(t))throw b(`malformed-tree`,`node-contains-unknown-field`,{key:t});let l=e[W.children];if(!Array.isArray(l))throw b(`malformed-tree`,`children-invalid`);let u=i.length,d=Be(e,u,t,r);i.push(d),o=Math.max(o,r),Ve(d,l.length,s)&&a.push(d.rect);let f=s||d.type===`WebView`;for(let e of l){if(!F(e))throw b(`malformed-tree`,`child-invalid`);c(e,u,r+1,f)}}}function Be(e,t,n,r){let i=X(e[W.elementType]),a=X(e[W.elementBaseType]),o=Ye(e[W.automationType]),s=Ue(e[W.frame]),c=qe(e[W.traits]),l=c===void 0?void 0:(c&Ie)===0n,u=c===void 0||(c&Le)===0n?void 0:!0,d=Je(e[W.userInteractionEnabled]),f=X(e[W.placeholder])?.trim();return{index:t,...n===void 0?{}:{parentIndex:n},...q(i,o)?{type:q(i,o)}:{},...i?{role:i}:{},...a&&a!==i?{subrole:a}:{},...X(e[W.label])?{label:X(e[W.label])}:{},...Z(e[W.value])?{value:Z(e[W.value])}:{},...f?{placeholder:f}:{},...X(e[W.identifier])?{identifier:X(e[W.identifier])}:{},...s?{rect:s}:{},...l===void 0?{}:{enabled:l},...u===void 0?{}:{selected:u},...d===void 0?{}:{userInteractionEnabled:d},depth:r}}function q(e,t){if(e!==void 0&&K[e])return K[e];if(e!==void 0&&G.includes(e))return e;if(t!==void 0)return G[t]??`Other`}function Ve(e,t,n){return n&&e.role===`AXRemoteElement`&&t===0}function He(e,t){return e===void 0?!0:i(e)?t.kind!==`reported`||r(e,t.rect):!1}function Ue(e){if(e===void 0)return;if(!F(e))throw b(`malformed-tree`,`frame-invalid`);let t=[`X`,`Y`,`Width`,`Height`].map(t=>e[t]);if(!t.every(e=>typeof e==`number`&&Number.isFinite(e)))throw b(`malformed-tree`,`frame-invalid`);let[n,r,i,a]=t;if(i<0||a<0)throw b(`malformed-tree`,`frame-invalid`);return{x:n,y:r,width:i,height:a}}function We(e){return!e||!J(e)?{kind:`missing`,reason:`not-provided`}:i(e.rect)?{kind:`reported`,rect:e.rect}:{kind:`missing`,reason:e.rect?`invalid`:`not-provided`}}function J(e){return e.type===`Application`||e.type===`Window`}function Ge(e,t){for(let r of e)r.hittable=r.parentIndex!==void 0&&n(r.enabled!==!1,r.rect,t)}function Y(e,t){return t.kind===`reported`?e.filter(n=>Ke(n,e)&&Pe(n.rect??Re,t.rect)).length:0}function Ke(e,t){return J(e)?!0:e.parentIndex!==void 0&&J(t[e.parentIndex]??e)}function X(e){return typeof e==`string`&&e.length>0?e:void 0}function Z(e){if(typeof e==`string`)return e.length>0?e:void 0;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(e!=null)throw b(`malformed-tree`,`scalar-invalid`)}function qe(e){if(e!=null){if(typeof e!=`string`||!/^\d{1,20}$/.test(e))throw b(`malformed-tree`,`traits-invalid`);return BigInt(e)}}function Je(e){if(e!=null){if(typeof e!=`boolean`)throw b(`malformed-tree`,`user-interaction-invalid`);return e}}function Ye(e){if(e!=null){if(!Number.isSafeInteger(e))throw b(`malformed-tree`,`automation-type-invalid`);return e}}const Q=`simulator-ax-bridge`;function Xe(e={}){let t=e.host??pe(),n=new we(t),r=new fe,i=Ne({host:t,limits:B(e.limits),producer:Q,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),a=!1;return{acquire:async o=>{try{if(a)throw b(`unsupported`,`source-closed`);Ze(o);let s=B({...e.limits,...o.limits}),c=C(s.maxDurationMs,o.signal),l=$e(o.hint,s.maxTraversalDepth),u=l+1,d=o.hint.rawTraversalDepth!==null;return await t.withDiagnosticTimer(`ios.snapshot-source.acquire`,async()=>{let e=await i.readyBinary(o.target.runtime,c,`bridge-preparation-deadline`),a=r.consume(o.target,u,d),f=await n.request({target:o.target,bridge:e,limits:s,maxDepth:l,nativeLevelsHint:a.nativeLevels,deadline:c});w(c,`snapshot-decode-deadline`);let p=et(o.hint,o.target,f,s);return Qe(t,r,o.target,u,d,a,f),{stage:`acquired`,acquisition:p}},{producer:Q})}catch(e){let t=S(e);return{stage:`failed`,failure:{kind:t.failureKind,code:t.failureCode,...t.details?{details:t.details}:{}}}}},close:async()=>{a||(a=!0,i.close(),await n.close())}}}function Ze(e){if(!e.target.simulator.udid.trim()||!e.target.runtime.trim()||!e.target.generation.trim()||!Number.isSafeInteger(e.target.pid)||e.target.pid<=0)throw new t(`INVALID_ARGS`,`Simulator snapshot source target identity is incomplete`);let n=e.hint;if(n.projection!==`raw`&&n.projection!==`regular`||![`full`,`surface-observation`].includes(n.acquisitionIntent)||typeof n.interactiveOnly!=`boolean`||typeof n.customActions!=`boolean`||!$(n.rawTraversalDepth)||!$(n.regularPresentedDepth))throw new t(`INVALID_ARGS`,`Simulator snapshot source capture hint is invalid`)}function Qe(e,t,n,r,i,a,o){let s=A(o),c=o.truncated===!0,l=t.learn(n,r,i,s);e.emitDiagnostic({level:`debug`,phase:`ios_snapshot_source_recovery`,data:{producer:Q,...n.targetId?{targetId:n.targetId}:{},generation:n.generation,requestedLevels:r,hint:a.reason,...a.nativeLevels===void 0?{}:{hintedLevels:a.nativeLevels},...s,truncated:c,learning:l}})}function $e(e,n){let r=e.rawTraversalDepth??n;if(r>n)throw new t(`INVALID_ARGS`,`Simulator snapshot source depth exceeds its bound`,{requested:r,maximum:n});return r}function $(e){return e===null||Number.isSafeInteger(e)&&e>=0}function et(e,t,n,r){if(n.automationEnabled!==!0)throw b(`unsupported`,`automation-mode-unavailable`);let i=n.tree,a=n.truncated;if(typeof a!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);let o=ze(i,{truncated:a},r),s=n.generation;if(typeof s!=`string`||!s)throw b(`malformed-tree`,`generation-invalid`);if(o.opaqueRemoteElements>0)throw b(`unsupported`,`remote-content-boundary`,{remoteElements:o.opaqueRemoteElements});if(o.unresolvedCoordinateSpaceWindows>0)throw b(`unsupported`,`window-coordinate-space-unresolved`,{windows:o.unresolvedCoordinateSpaceWindows});let c=Object.freeze(o.nodes.map(e=>Object.freeze({...e,pid:t.pid}))),l=tt(e,a,o.viewport),u=Object.freeze({...t.targetId?{targetId:t.targetId}:{},generation:s}),d={producer:Q,nodes:c,truncated:a,viewport:o.viewport,lineage:u,residue:l};return e.acquisitionIntent===`full`?{...d,intent:`full`,hint:{...e,acquisitionIntent:`full`}}:{...d,intent:`surface-observation`,hint:{...e,acquisitionIntent:`surface-observation`}}}function tt(e,t,n){let r=n.kind===`reported`?[]:[{kind:`unavailable-fact`,fact:`hittability`}];return Object.freeze([...r,...e.interactiveOnly?[{kind:`unavailable-fact`,fact:`interactive-query`}]:[],...t?[{kind:`truncated`}]:[],...n.kind===`missing`?[{kind:`missing-viewport`,reason:n.reason}]:[]])}export{Xe as createSimulatorSnapshotSource};
1
+ import{K as e,P as t}from"./sdk-contracts.js";import{c as n,r}from"./diagnostics.js";import"./diagnostics2.js";import{Jr as i,Xr as a,Yr as o}from"./sdk-batch.js";import{h as s,l as c,u as l}from"./exec.js";import"./command.js";import"./process.js";import{r as u}from"./version.js";import{f as d}from"./host-file.js";import{t as f}from"./apple-runner-platform.js";import{t as p}from"./simctl.js";import{a as m,c as ee,d as te,i as ne,l as re,n as ie,o as ae,r as oe,s as se,t as ce,u as le}from"./cache.js";import{createHash as h,randomUUID as g}from"node:crypto";import _ from"node:path";import ue from"node:net";import{Buffer as v}from"node:buffer";const de={unsupported:`UNSUPPORTED_OPERATION`,"malformed-tree":`COMMAND_FAILED`,"stale-target":`COMMAND_FAILED`,timeout:`COMMAND_FAILED`,cancelled:`COMMAND_FAILED`,"process-crash":`COMMAND_FAILED`,"transport-failure":`COMMAND_FAILED`,preparing:`COMMAND_FAILED`};var y=class extends t{failureKind;failureCode;constructor(e,t,n=`iOS Simulator snapshot source ${e}: ${t}`,r={},i){super(de[e],n,{...r,bridgeFailure:e,bridgeFailureCode:t,...e===`cancelled`?{reason:`request_canceled`}:{}},i),this.name=`SnapshotSourceError`,this.failureKind=e,this.failureCode=t}};function b(e,t,n={},r){return new y(e,t,void 0,n,r)}function x(e){return e instanceof ee?new y(e.buildFailureKind,e.buildFailureCode,void 0,e.buildDetails,e.cause):e}function S(n){return n instanceof y||(n=x(n),n instanceof y)?n:e(n)?b(`cancelled`,`abort-signal`,{},n):n instanceof t&&typeof n.details?.timeoutMs==`number`?b(`timeout`,`host-operation-timeout`,{timeoutMs:n.details.timeoutMs},n):b(`transport-failure`,`unexpected-host-error`,{error:n instanceof Error?n.message:String(n)},n)}function C(e,t,n=Date.now){if(t?.aborted)throw b(`cancelled`,`abort-signal`);return ae(e,t,n)}function w(e,t){try{return se(e,t)}catch(e){throw x(e)}}async function T(e,t,n,r){let i=Math.min(t,w(e,n));await te({waitMs:i,signal:e.signal,stop:r,cancelled:()=>b(`cancelled`,`abort-signal`)})}var fe=class{entries=new Map;probeBackAfterUses;constructor(e=8){this.probeBackAfterUses=e}consume(e,t,n){if(n)return{nativeLevels:void 0,reason:`explicit-depth`};let r=this.currentEntry(e);return r===`unidentified`?{nativeLevels:void 0,reason:`unidentified-target`}:!r||r.nativeLevels>=t?{nativeLevels:void 0,reason:`no-hint`}:r.remainingUses<=0?{nativeLevels:void 0,reason:`probe-back`}:(--r.remainingUses,{nativeLevels:r.nativeLevels,reason:`hinted`})}learn(e,t,n,r){return n||!e.targetId?`ignored`:r.rejected>0&&r.acceptedLevels<t?(this.remember(e.targetId,{generation:e.generation,nativeLevels:r.acceptedLevels,remainingUses:this.probeBackAfterUses}),`learned`):r.rejected===0&&r.acceptedLevels>=t?this.entries.delete(e.targetId)?`forgotten`:`ignored`:this.currentEntry(e)?`kept`:`ignored`}currentEntry(e){if(!e.targetId)return`unidentified`;let t=this.entries.get(e.targetId);if(t){if(t.generation!==e.generation){this.entries.delete(e.targetId);return}return t}}remember(e,t){if(this.entries.delete(e),this.entries.size>=32){let e=this.entries.keys().next().value;e!==void 0&&this.entries.delete(e)}this.entries.set(e,t)}};const E=65536;function pe(){return{...m(async(e,t,n)=>await c(e,t,n)),projectRoot:u,homeDirectory:d,start:me,connect:he,emitDiagnostic:r,withDiagnosticTimer:n,readTargetProcessStartTime:re}}function me(e,t,n,r={}){if(r.signal?.aborted)throw b(`cancelled`,`abort-signal`);let i=l(`xcrun`,p(e,[`spawn`,e.udid,t,`serve`,n,`--idle-timeout`,`60`,`--exit-on-disconnect`,`false`]),{allowFailure:!0,captureOutput:!1,detached:!0}),a=i.child.pid??0;if(a<=0)throw b(`transport-failure`,`bridge-process-pid-missing`);let o=``;return i.child.stderr?.setEncoding(`utf8`),i.child.stderr?.on(`data`,e=>{o=ge(o,String(e))}),{pid:a,wait:i.wait,isAlive:()=>i.child.exitCode===null&&i.child.signalCode===null,signal:e=>{s(a,e)||i.child.kill(e)},readLog:()=>o}}async function he(e,t){if(t.signal?.aborted)throw b(`cancelled`,`abort-signal`);let n=Math.max(1,Math.floor(t.timeoutMs));return await new Promise((r,i)=>{let a=ue.createConnection({path:e}),o=!1,s=!1,c=setTimeout(()=>{p(b(`timeout`,`bridge-connect-timeout`)),a.destroy()},n),l=()=>{p(b(`cancelled`,`abort-signal`)),a.destroy()},u=()=>{o=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`error`,d),a.off(`close`,f),a.setTimeout(0),r(a)},d=e=>{p(e),a.destroy()},f=()=>{o||p(b(`transport-failure`,`bridge-closed-before-connect`))},p=e=>{s||o||(s=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`connect`,u),a.off(`error`,d),a.off(`close`,f),i(e))};a.once(`connect`,u),a.once(`error`,d),a.once(`close`,f),t.signal?.addEventListener(`abort`,l,{once:!0}),t.signal?.aborted&&l()})}function ge(e,t){let n=e+t;return n.length<=E?n:n.slice(n.length-E)}function _e(e,t,n){let r=h(`sha256`).update(t).digest(`hex`).slice(0,12),i=h(`sha256`).update(n).digest(`hex`).slice(0,12);return _.join(`/tmp`,`agent-device-ax-${r}-${e.processId()}-${i}`,`snapshot.sock`)}const D=new WeakSet;async function O(e,t){let n;try{n=(await t.wait).exitCode}catch{n=void 0}return D.has(t)||(D.add(t),e.emitDiagnostic({level:`error`,phase:`ios.snapshot-source.bridge-process-exit`,data:{pid:t.pid,...n===void 0?{}:{exitCode:n},stderr:ve(t.readLog())}})),b(`process-crash`,`bridge-exited`,{pid:t.pid,...n===void 0?{}:{exitCode:n}})}function ve(e){let t=v.from(e);return t.length<=65536?e:t.subarray(-65536).toString(`utf8`)}const k=`agent-device-simulator-ax-v1.8.0`;Object.freeze([`verb`,`requestId`,`pid`,`generation`,`snapshotTree`,`automationMode`,`maxDepth`,`maxNodes`,`maxDurationMs`,`maxResponseBytes`,`nativeLevelsHint`]),Object.freeze([`protocolVersion`,`sourceVersion`,`requestId`,`generation`,`ok`,`pid`,`tree`,`truncated`,`automationEnabled`,`recovery`,`error_kind`,`error_code`,`error`]),Object.freeze([`XC_kAXXCAttributeElementType`,`XC_kAXXCAttributeElementBaseType`,`XC_kAXXCAttributeLabel`,`XC_kAXXCAttributeValue`,`XC_kAXXCAttributePlaceholderValue`,`XC_kAXXCAttributeIdentifier`,`XC_kAXXCAttributeFrame`,`XC_kAXXCAttributeAutomationType`,`XC_kAXXCAttributeTraits`,`XC_kAXXCAttributeIsUserInteractionEnabled`,`XC_kAXXCAttributeChildren`]);const ye=[`requests`,`rejected`,`continuations`,`acceptedLevels`];function A(e){let t=e.recovery;if(!F(t))throw b(`malformed-tree`,`recovery-invalid`);let n=ye.map(e=>[e,t[e]]);if(n.some(([,e])=>!Number.isSafeInteger(e)||e<0))throw b(`malformed-tree`,`recovery-invalid`);return Object.freeze(Object.fromEntries(n))}function j(e,t){let n;try{n=v.from(JSON.stringify(e),`utf8`)}catch(e){throw b(`malformed-tree`,`request-not-json`,{},e)}let r=n.length+4;if(r>t.maxRequestBytes)throw b(`transport-failure`,`request-limit-exceeded`,{frameBytes:r,maxRequestBytes:t.maxRequestBytes});let i=v.alloc(4);return i.writeUInt32BE(n.length,0),v.concat([i,n])}var M=class{header=v.alloc(4);headerBytes=0;chunks=[];payloadBytes=0;expectedBodyBytes;frame;maxFrameBytes;constructor(e){if(!Number.isSafeInteger(e)||e<=0)throw b(`malformed-tree`,`frame-limit-invalid`,{maxFrameBytes:e});this.maxFrameBytes=e}push(e){if(this.frame)return this.acceptTrailingChunk(e);let t=this.readHeader(e);if(t&&(this.appendPayload(e,t.offset,t.bodyBytes),this.payloadBytes===t.bodyBytes))return this.frame=v.concat(this.chunks,t.bodyBytes),this.frame}acceptTrailingChunk(e){if(e.length>0)throw b(`malformed-tree`,`multiple-frames`,{trailingBytes:e.length});return this.frame}readHeader(e){if(this.headerBytes===4)return{offset:0,bodyBytes:this.expectedBodyBytes};let t=Math.min(4-this.headerBytes,e.length);if(e.copy(this.header,this.headerBytes,0,t),this.headerBytes+=t,this.headerBytes<4)return;let n=this.header.readUInt32BE(0);if(n===0||n>this.maxFrameBytes)throw b(`malformed-tree`,`frame-limit-exceeded`,{bodyBytes:n,maxFrameBytes:this.maxFrameBytes});return this.expectedBodyBytes=n,{offset:t,bodyBytes:n}}appendPayload(e,t,n){let r=n-this.payloadBytes,i=e.length-t;if(i>r)throw b(`malformed-tree`,`multiple-frames`,{trailingBytes:i-r});i!==0&&(this.chunks.push(e.subarray(t)),this.payloadBytes+=i)}finish(){if(this.frame)return this.frame;throw b(`transport-failure`,`bridge-frame-incomplete`,{headerBytes:this.headerBytes,payloadBytes:this.payloadBytes,expectedBodyBytes:this.expectedBodyBytes})}};function N(e){let t;try{t=JSON.parse(e.toString(`utf8`))}catch(e){throw b(`malformed-tree`,`response-not-json`,{},e)}if(!F(t))throw b(`malformed-tree`,`response-not-object`);return t}function P(e){return Object.freeze({verb:`describe`,requestId:e.requestId,pid:e.pid,generation:e.generation,snapshotTree:!0,automationMode:!0,maxDepth:e.maxDepth,maxNodes:e.maxNodes,maxDurationMs:e.maxDurationMs,maxResponseBytes:e.maxResponseBytes,...e.nativeLevelsHint===void 0?{}:{nativeLevelsHint:e.nativeLevelsHint}})}function be(e,t){if(e.protocolVersion!==1)throw b(`transport-failure`,`protocol-version-mismatch`,{expected:1,observed:e.protocolVersion});if(e.sourceVersion!==`agent-device-simulator-ax-v1.8.0`)throw b(`transport-failure`,`source-version-mismatch`,{expected:k,observed:e.sourceVersion});if(e.requestId!==t)throw b(`transport-failure`,`request-id-mismatch`,{expected:t,observed:e.requestId})}function xe(e,t){if(typeof e.pid!=`number`||e.pid!==t.pid)throw b(`stale-target`,`bridge-pid-mismatch`,{expectedPid:t.pid,observedPid:e.pid});if(e.generation!==t.generation)throw b(`stale-target`,`bridge-generation-mismatch`,{expectedGeneration:t.generation,observedGeneration:e.generation})}function Se(e){let t=e.error_kind,n=typeof e.error_code==`string`?e.error_code:`guest-error`,r=typeof e.error==`string`?e.error:void 0,i=r?{guestMessage:r.slice(0,1024)}:{};throw b(t===`unsupported`?`unsupported`:t===`malformed_tree`?`malformed-tree`:t===`application_not_responding`?`timeout`:t===`application_unavailable`?`transport-failure`:t===`bad_request`?`malformed-tree`:`transport-failure`,n,i)}function F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function Ce(e){let t=new M(e.limits.maxResponseBytes-4),n=w(e.deadline,`bridge-request-deadline`);return await new Promise((r,i)=>{let a=!1,o=!1,s=setTimeout(()=>{p(b(`timeout`,`bridge-request-deadline`,{bridgeRequestSent:o})),e.socket.destroy()},n),c=()=>{p(b(`cancelled`,`abort-signal`,{bridgeRequestSent:o})),e.socket.destroy()},l=n=>{try{if(!Buffer.isBuffer(n))throw b(`transport-failure`,`bridge-data-invalid`);let r=t.push(n);if(r){let t=N(r);if(be(t,e.requestId),xe(t,{pid:e.expectedPid,generation:e.expectedGeneration}),t.ok!==!0&&Se(t),typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);f(t);return}}catch(t){p(t),e.socket.destroy()}},u=e=>p(S(e)),d=()=>{a||(e.process.isAlive()?p(b(`transport-failure`,`bridge-connection-closed`)):O(e.host,e.process).then(p))};e.process.wait.then(()=>{a||O(e.host,e.process).then(p)},e=>{a||p(S(e))});let f=e=>m(()=>r(e)),p=e=>m(()=>i(e)),m=t=>{a||(a=!0,clearTimeout(s),e.deadline.signal?.removeEventListener(`abort`,c),e.socket.off(`data`,l),e.socket.off(`error`,u),e.socket.off(`close`,d),t())};e.socket.on(`data`,l),e.socket.on(`error`,u),e.socket.on(`close`,d),e.deadline.signal?.addEventListener(`abort`,c,{once:!0});try{if(e.deadline.signal?.aborted)throw b(`cancelled`,`abort-signal`);o=!0,e.socket.write(e.frame)}catch(t){p(S(t)),e.socket.destroy()}})}var we=class{sessions=new Map;requestQueues=new Map;ownerId=g();closed=!1;host;constructor(e){this.host=e}async request(e){if(this.closed)throw b(`unsupported`,`source-closed`);return await this.withSimulatorLock(e.target.simulator.udid,e.deadline,()=>this.requestInSimulator(e))}async requestInSimulator(e){if(this.closed)throw b(`unsupported`,`source-closed`);let t=e.deadline;w(t,`bridge-request-deadline`);let n=this.sessions.get(e.target.simulator.udid),r=await this.ensureSession(e,t);try{let n=await this.readTargetStartTime(e.target,t),i=await this.exchange(r,e,t);return await this.assertTargetStillCurrent(e.target,n,t),i}catch(e){throw await this.handleRequestFailure(e,r,n)}}async handleRequestFailure(e,t,n){let r=S(e);return Ee(r,t,n)?await this.removeSession(t,!0):r.failureKind===`process-crash`?await this.removeSession(t,!1):r.failureKind===`transport-failure`&&(t.socket?.destroy(),t.socket=void 0),r}async withSimulatorLock(e,t,n){let r=this.requestQueues.get(e)??Promise.resolve(),i,a=new Promise(e=>{i=e}),o=r.then(()=>a);this.requestQueues.set(e,o);try{return await Te(r,t),await n()}finally{i(),this.requestQueues.get(e)===o&&this.requestQueues.delete(e)}}async close(){if(this.closed)return;this.closed=!0;let e=[...this.sessions.values()];this.sessions.clear(),await Promise.all(e.map(async e=>await this.dispose(e,!0)))}async ensureSession(e,t){let n=e.target.simulator.udid,r=this.sessions.get(n);if(r&&r.bridgePath===e.bridge.path&&r.process.isAlive())return(!r.socket||r.socket.destroyed)&&(r.socket=await this.connectUntilReady(r,t)),r;r&&await this.removeSession(r,!0);let i=_e(this.host,e.target.simulator.udid,this.ownerId);await this.host.ensureDirectory(_.dirname(i)),await this.host.remove(i);let a=this.host.start(e.target.simulator,e.bridge.path,i,{signal:t.signal}),o={udid:e.target.simulator.udid,bridgePath:e.bridge.path,socketPath:i,process:a};this.sessions.set(n,o);try{return o.socket=await this.connectUntilReady(o,t),o}catch(e){throw await this.removeSession(o,!0),S(e)}}async connectUntilReady(e,t){let n;for(;;){let r=w(t,`bridge-connect-deadline`);if(!e.process.isAlive())throw await O(this.host,e.process);try{return await this.host.connect(e.socketPath,{signal:t.signal,timeoutMs:Math.min(250,r)})}catch(e){if(n=e,e instanceof y&&e.failureKind===`cancelled`)throw e;let r=Math.min(20,w(t,`bridge-connect-deadline`));try{await T(t,r,`bridge-connect-deadline`)}catch(e){throw S(e)}}if(n instanceof y&&n.failureKind===`timeout`)throw n}}async exchange(e,t,n){(!e.socket||e.socket.destroyed)&&(e.socket=await this.connectUntilReady(e,n));let r=g(),i=j(P({requestId:r,pid:t.target.pid,generation:t.target.generation,maxDepth:Math.min(t.limits.maxTraversalDepth,t.maxDepth),maxNodes:t.limits.maxNodes,maxDurationMs:w(n,`bridge-request-deadline`),maxResponseBytes:t.limits.maxResponseBytes,...t.nativeLevelsHint===void 0?{}:{nativeLevelsHint:t.nativeLevelsHint}}),t.limits);return await Ce({process:e.process,socket:e.socket,frame:i,requestId:r,deadline:n,limits:t.limits,expectedPid:t.target.pid,expectedGeneration:t.target.generation,host:this.host})}async readTargetStartTime(e,t){let n=await this.host.readTargetProcessStartTime(e.pid,{signal:t.signal,timeoutMs:w(t,`target-identity-deadline`)});if(!n)throw b(`stale-target`,`target-process-unavailable`,{pid:e.pid,generation:e.generation});if(e.processStartTime!==void 0&&e.processStartTime!==n)throw b(`stale-target`,`target-process-changed`,{pid:e.pid,generation:e.generation,expectedStartTime:e.processStartTime,observedStartTime:n});return n}async assertTargetStillCurrent(e,t,n){let r=await this.host.readTargetProcessStartTime(e.pid,{signal:n.signal,timeoutMs:w(n,`target-identity-deadline`)});if(r!==t)throw b(`stale-target`,`target-process-changed`,{pid:e.pid,generation:e.generation,expectedStartTime:t,observedStartTime:r})}async removeSession(e,t){this.sessions.get(e.udid)===e&&this.sessions.delete(e.udid),await this.dispose(e,t)}async dispose(e,t){e.socket?.destroy(),e.socket=void 0,t&&e.process.isAlive()&&(e.process.signal(`SIGTERM`),await I(e.process,500),e.process.isAlive()&&(e.process.signal(`SIGKILL`),await I(e.process,500))),await this.host.remove(e.socketPath)}};async function Te(e,t){let n=w(t,`bridge-request-deadline`);await Promise.race([e,T(t,n,`bridge-request-deadline`).then(()=>{throw b(`timeout`,`bridge-request-deadline`)})])}function Ee(e,t,n){return(e.failureKind===`cancelled`||e.failureKind===`timeout`)&&(e.details?.bridgeRequestSent===!0||n!==t)}async function I(e,t){await Promise.race([e.wait.catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}const L=16777216,R=12e4,z=1e4,De=Object.freeze({maxRequestBytes:65536,maxResponseBytes:4194304,maxNodes:5e3,maxTraversalDepth:64,maxDurationMs:5e3});function B(e){let n={...De,...e??{}};for(let[e,r]of Object.entries(n))if(!Number.isSafeInteger(r)||r<=0)throw new t(`INVALID_ARGS`,`Snapshot source limit ${e} must be a positive integer`,{name:e,value:r});if(n.maxRequestBytes>n.maxResponseBytes)throw new t(`INVALID_ARGS`,`Snapshot source request bytes cannot exceed response bytes`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});if(n.maxRequestBytes>L||n.maxResponseBytes>L)throw new t(`INVALID_ARGS`,`Snapshot source frame limits exceed the bridge bound`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes,maximumFrameBytes:L});if(n.maxNodes>z||n.maxTraversalDepth>128)throw new t(`INVALID_ARGS`,`Snapshot source tree limits exceed the bridge bound`,{maxNodes:n.maxNodes,maxTraversalDepth:n.maxTraversalDepth,maximumNodes:z,maximumDepth:128});if(n.maxDurationMs>R)throw new t(`INVALID_ARGS`,`Snapshot source duration exceeds the bridge bound`,{maxDurationMs:n.maxDurationMs,maximumDurationMs:R});if(n.maxRequestBytes<=4||n.maxResponseBytes<=4)throw new t(`INVALID_ARGS`,`Snapshot source frame limits must leave room for a body`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});return Object.freeze(n)}const V=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeRuntime.h`,`SnapshotBridgeCapture.h`,`SnapshotBridgeCapture.m`],Oe=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeCapture.m`];async function ke(e,t,n){let r=await ne(e,n).catch(e=>{throw x(e)}),i=t.trim();if(!i)throw b(`unsupported`,`simulator-runtime-missing`);return{...r,simulatorRuntime:i}}const H=12e4;async function Ae(e){let t=e.deadline,n=e.sourceRoot??je(e.host);try{let r=await oe(e.host,n,V,t),i=await ke(e.host,e.runtime,t),a=e.cacheRoot??_.join(e.host.homeDirectory(),`.agent-device`,`snapshot-source`),o=await ce({host:e.host,deadline:t,cacheRoot:a,binaryFilename:`snapshot-bridge`,lockDescription:`iOS Simulator snapshot bridge cache`,keyInputs:{schemaVersion:1,protocolVersion:1,sourceVersion:k,sourceHash:r,toolchain:i,compileArgv:U({architecture:i.architecture,sourceRoot:``,outputPath:``})},build:async r=>{let a=await ie({host:e.host,deadline:t,argv:U({architecture:i.architecture,sourceRoot:n,outputPath:r}),budgetMs:H,label:`bridge`});if(a.exitCode!==0||!e.host.exists(r))throw b(`unsupported`,`native-build-failed`,{exitCode:a.exitCode,stderr:a.stderr.slice(0,4096)})}});return{path:o.path,sourceHash:r,cacheKey:o.cacheKey,protocolVersion:1,sourceVersion:k}}catch(e){throw x(e)}}function U(e){return[`--sdk`,`iphonesimulator`,`clang`,`-arch`,e.architecture,`-mios-simulator-version-min=15.0`,`-fobjc-arc`,`-Wall`,`-Wextra`,`-framework`,`Foundation`,`-framework`,`CoreGraphics`,...Oe.map(t=>_.join(e.sourceRoot,t)),`-o`,e.outputPath]}function je(e){let t=e.projectRoot(),n=_.join(t,`apple`,`snapshot-bridge`);if(V.every(t=>e.exists(_.join(n,t))))return n;let r=_.join(t,`dist`,`apple`,`snapshot-bridge`);if(V.every(t=>e.exists(_.join(r,t))))return r;throw b(`unsupported`,`native-source-missing`,{projectRoot:t})}const Me=f+H;function Ne(e){let t=e.now??Date.now,n=new Map,r=le({waitMs:2e3,waitGrant:`first-caller`,retryAfterMs:6e4,now:t}),i=async(r,i)=>{let a=C(Me,i,t);try{let t=await e.host.withDiagnosticTimer(`ios.snapshot-source.prepare`,async()=>await Ae({host:e.host,runtime:r,limits:e.limits,deadline:a,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),{producer:e.producer});return n.set(r,t),t}catch(e){throw S(e)}};return{readyBinary:async(e,t,a)=>n.get(e)||await r.value(e,{start:t=>i(e,t),wait:(e,n)=>T(t,e,a,n),pending:()=>b(`preparing`,`bridge-preparation-pending`)}),close:()=>{n.clear(),r.close()}}}function Pe(e,t){return!o(e)||!o(t)||Math.abs(t.width-t.height)<=1?!1:Math.abs(e.width-t.height)<=1&&Math.abs(e.height-t.width)<=1}const W=Object.freeze({elementType:`XC_kAXXCAttributeElementType`,elementBaseType:`XC_kAXXCAttributeElementBaseType`,label:`XC_kAXXCAttributeLabel`,value:`XC_kAXXCAttributeValue`,placeholder:`XC_kAXXCAttributePlaceholderValue`,identifier:`XC_kAXXCAttributeIdentifier`,frame:`XC_kAXXCAttributeFrame`,automationType:`XC_kAXXCAttributeAutomationType`,traits:`XC_kAXXCAttributeTraits`,userInteractionEnabled:`XC_kAXXCAttributeIsUserInteractionEnabled`,children:`XC_kAXXCAttributeChildren`}),G=`Other.Other.Application.Group.Window.Sheet.Drawer.Alert.Dialog.Button.RadioButton.RadioGroup.CheckBox.DisclosureTriangle.PopUpButton.ComboBox.MenuButton.ToolbarButton.Popover.Keyboard.Key.NavigationBar.TabBar.TabGroup.Toolbar.StatusBar.Table.TableRow.TableColumn.Outline.OutlineRow.Browser.CollectionView.Slider.PageIndicator.ProgressIndicator.ActivityIndicator.SegmentedControl.Picker.PickerWheel.Switch.Toggle.Link.Image.Icon.SearchField.ScrollView.ScrollBar.StaticText.TextField.SecureTextField.DatePicker.TextView.Menu.MenuItem.MenuBar.MenuBarItem.Map.WebView.IncrementArrow.DecrementArrow.Timeline.RatingIndicator.ValueIndicator.SplitGroup.Splitter.RelevanceIndicator.ColorWell.HelpTag.Matte.DockItem.Ruler.RulerMarker.Grid.LevelIndicator.Cell.LayoutArea.LayoutItem.Handle.Stepper.Tab.TouchBar.StatusItem`.split(`.`),K={UIApplication:`Application`,UIWindow:`Window`},Fe=new Set(Object.values(W)),Ie=1n<<8n,Le=1n<<3n,Re=1n<<21n,ze={x:0,y:0,width:0,height:0};function Be(e,t,n){let r=Array.isArray(e)?e:[e];if(r.length===0||r.some(e=>!F(e)))throw b(`malformed-tree`,`guest-tree-root-invalid`);let i=[],a=[],o=0;for(let e of r)c(e,void 0,0,!1);if(i.length>n.maxNodes)throw b(`malformed-tree`,`node-limit-exceeded`,{nodeCount:i.length,maxNodes:n.maxNodes});if(o>n.maxTraversalDepth)throw b(`malformed-tree`,`traversal-depth-exceeded`,{maxTraversalDepth:o,maxAllowedDepth:n.maxTraversalDepth});if(typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);let s=Ge(i.filter(J)[0]);return s.kind===`reported`&&Y(i,s.rect),{nodes:i,maxTraversalDepth:o,viewport:s,opaqueRemoteElements:a.filter(e=>Ue(e,s)).length,unresolvedCoordinateSpaceWindows:Ke(i,s)};function c(e,t,r,s){if(i.length>=n.maxNodes)throw b(`malformed-tree`,`node-limit-exceeded`,{maxNodes:n.maxNodes});for(let t of Object.keys(e))if(!Fe.has(t))throw b(`malformed-tree`,`node-contains-unknown-field`,{key:t});let l=e[W.children];if(!Array.isArray(l))throw b(`malformed-tree`,`children-invalid`);let u=i.length,d=Ve(e,u,t,r);i.push(d),o=Math.max(o,r),He(d,l.length,s)&&a.push(d.rect);let f=s||d.type===`WebView`;for(let e of l){if(!F(e))throw b(`malformed-tree`,`child-invalid`);c(e,u,r+1,f)}}}function Ve(e,t,n,r){let i=X(e[W.elementType]),a=X(e[W.elementBaseType]),o=Xe(e[W.automationType]),s=We(e[W.frame]),c=Je(e[W.traits]),l=c===void 0?void 0:(c&Ie)===0n,u=c===void 0||(c&Le)===0n?void 0:!0,d=c===void 0||(c&Re)===0n?void 0:!0,f=Ye(e[W.userInteractionEnabled]),p=X(e[W.placeholder])?.trim();return{index:t,...n===void 0?{}:{parentIndex:n},...q(i,o)?{type:q(i,o)}:{},...i?{role:i}:{},...a&&a!==i?{subrole:a}:{},...X(e[W.label])?{label:X(e[W.label])}:{},...Z(e[W.value])?{value:Z(e[W.value])}:{},...p?{placeholder:p}:{},...X(e[W.identifier])?{identifier:X(e[W.identifier])}:{},...s?{rect:s}:{},...l===void 0?{}:{enabled:l},...u===void 0?{}:{selected:u},...d===void 0?{}:{focused:d},...f===void 0?{}:{userInteractionEnabled:f},depth:r}}function q(e,t){if(e!==void 0&&K[e])return K[e];if(e!==void 0&&G.includes(e))return e;if(t!==void 0)return G[t]??`Other`}function He(e,t,n){return n&&e.role===`AXRemoteElement`&&t===0}function Ue(e,t){return e===void 0?!0:o(e)?t.kind!==`reported`||a(e,t.rect):!1}function We(e){if(e===void 0)return;if(!F(e))throw b(`malformed-tree`,`frame-invalid`);let t=[`X`,`Y`,`Width`,`Height`].map(t=>e[t]);if(!t.every(e=>typeof e==`number`&&Number.isFinite(e)))throw b(`malformed-tree`,`frame-invalid`);let[n,r,i,a]=t;if(i<0||a<0)throw b(`malformed-tree`,`frame-invalid`);return{x:n,y:r,width:i,height:a}}function Ge(e){return!e||!J(e)?{kind:`missing`,reason:`not-provided`}:o(e.rect)?{kind:`reported`,rect:e.rect}:{kind:`missing`,reason:e.rect?`invalid`:`not-provided`}}function J(e){return e.type===`Application`||e.type===`Window`}function Y(e,t){for(let n of e)n.hittable=n.parentIndex!==void 0&&i(n.enabled!==!1,n.rect,t)}function Ke(e,t){return t.kind===`reported`?e.filter(n=>qe(n,e)&&Pe(n.rect??ze,t.rect)).length:0}function qe(e,t){return J(e)?!0:e.parentIndex!==void 0&&J(t[e.parentIndex]??e)}function X(e){return typeof e==`string`&&e.length>0?e:void 0}function Z(e){if(typeof e==`string`)return e.length>0?e:void 0;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(e!=null)throw b(`malformed-tree`,`scalar-invalid`)}function Je(e){if(e!=null){if(typeof e!=`string`||!/^\d{1,20}$/.test(e))throw b(`malformed-tree`,`traits-invalid`);return BigInt(e)}}function Ye(e){if(e!=null){if(typeof e!=`boolean`)throw b(`malformed-tree`,`user-interaction-invalid`);return e}}function Xe(e){if(e!=null){if(!Number.isSafeInteger(e))throw b(`malformed-tree`,`automation-type-invalid`);return e}}const Q=`simulator-ax-bridge`;function Ze(e={}){let t=e.host??pe(),n=new we(t),r=new fe,i=Ne({host:t,limits:B(e.limits),producer:Q,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),a=!1;return{acquire:async o=>{try{if(a)throw b(`unsupported`,`source-closed`);Qe(o);let s=B({...e.limits,...o.limits}),c=C(s.maxDurationMs,o.signal),l=et(o.hint,s.maxTraversalDepth),u=l+1,d=o.hint.rawTraversalDepth!==null;return await t.withDiagnosticTimer(`ios.snapshot-source.acquire`,async()=>{let e=await i.readyBinary(o.target.runtime,c,`bridge-preparation-deadline`),a=r.consume(o.target,u,d),f=await n.request({target:o.target,bridge:e,limits:s,maxDepth:l,nativeLevelsHint:a.nativeLevels,deadline:c});w(c,`snapshot-decode-deadline`);let p=tt(o.hint,o.target,f,s);return $e(t,r,o.target,u,d,a,f),{stage:`acquired`,acquisition:p}},{producer:Q})}catch(e){let t=S(e);return{stage:`failed`,failure:{kind:t.failureKind,code:t.failureCode,...t.details?{details:t.details}:{}}}}},close:async()=>{a||(a=!0,i.close(),await n.close())}}}function Qe(e){if(!e.target.simulator.udid.trim()||!e.target.runtime.trim()||!e.target.generation.trim()||!Number.isSafeInteger(e.target.pid)||e.target.pid<=0)throw new t(`INVALID_ARGS`,`Simulator snapshot source target identity is incomplete`);let n=e.hint;if(n.projection!==`raw`&&n.projection!==`regular`||![`full`,`surface-observation`].includes(n.acquisitionIntent)||typeof n.interactiveOnly!=`boolean`||typeof n.customActions!=`boolean`||!$(n.rawTraversalDepth)||!$(n.regularPresentedDepth))throw new t(`INVALID_ARGS`,`Simulator snapshot source capture hint is invalid`)}function $e(e,t,n,r,i,a,o){let s=A(o),c=o.truncated===!0,l=t.learn(n,r,i,s);e.emitDiagnostic({level:`debug`,phase:`ios_snapshot_source_recovery`,data:{producer:Q,...n.targetId?{targetId:n.targetId}:{},generation:n.generation,requestedLevels:r,hint:a.reason,...a.nativeLevels===void 0?{}:{hintedLevels:a.nativeLevels},...s,truncated:c,learning:l}})}function et(e,n){let r=e.rawTraversalDepth??n;if(r>n)throw new t(`INVALID_ARGS`,`Simulator snapshot source depth exceeds its bound`,{requested:r,maximum:n});return r}function $(e){return e===null||Number.isSafeInteger(e)&&e>=0}function tt(e,t,n,r){if(n.automationEnabled!==!0)throw b(`unsupported`,`automation-mode-unavailable`);let i=n.tree,a=n.truncated;if(typeof a!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);let o=Be(i,{truncated:a},r),s=n.generation;if(typeof s!=`string`||!s)throw b(`malformed-tree`,`generation-invalid`);if(o.opaqueRemoteElements>0)throw b(`unsupported`,`remote-content-boundary`,{remoteElements:o.opaqueRemoteElements});if(o.unresolvedCoordinateSpaceWindows>0)throw b(`unsupported`,`window-coordinate-space-unresolved`,{windows:o.unresolvedCoordinateSpaceWindows});let c=Object.freeze(o.nodes.map(e=>Object.freeze({...e,pid:t.pid}))),l=nt(e,a,o.viewport),u=Object.freeze({...t.targetId?{targetId:t.targetId}:{},generation:s}),d={producer:Q,nodes:c,truncated:a,viewport:o.viewport,lineage:u,residue:l};return e.acquisitionIntent===`full`?{...d,intent:`full`,hint:{...e,acquisitionIntent:`full`}}:{...d,intent:`surface-observation`,hint:{...e,acquisitionIntent:`surface-observation`}}}function nt(e,t,n){let r=n.kind===`reported`?[]:[{kind:`unavailable-fact`,fact:`hittability`}];return Object.freeze([...r,...e.interactiveOnly?[{kind:`unavailable-fact`,fact:`interactive-query`}]:[],...t?[{kind:`truncated`}]:[],...n.kind===`missing`?[{kind:`missing-viewport`,reason:n.reason}]:[]])}export{Ze as createSimulatorSnapshotSource};
@@ -1,2 +1,2 @@
1
- import{N as e}from"./sdk-contracts.js";import{n as t,r as n,t as r}from"./device-shell.js";import{a as i,d as a,f as o,i as s,l as c,m as l,n as u,p as d,s as f,u as p}from"./adb-transport.js";import{i as m,n as ee,s as te,u as h}from"./adb-failure.js";import{AsyncLocalStorage as g}from"node:async_hooks";let _;const v=new g;function y(e){_=e}function b(){if(!_)throw Error(`Android adb host port is not bound; import the platform composition wiring (src/platform-runtime-android-adb-host.ts) before using the adb/IME cluster.`);return _}async function x(e,t){let n=b(),r=v.getStore(),i=n.coerceAdbResult(r?await r(e,t):await n.execAdb(e,{...t,allowFailure:!0}));if(!t?.allowFailure&&i.exitCode!==0){let{androidAdbResultError:t}=await import(`./adb-failure.js`).then(e=>e.t),{serializeAndroidAdbInvocation:n}=await import(`./adb-transport.js`).then(e=>e.t);throw t(`adb ${n(e).join(` `)} exited with code ${i.exitCode}`,i)}return i}async function S(e,t){return await v.run(e,t)}function C(e){b().emitDiagnostic(e)}const w=new WeakSet;function T(e){return ne(typeof e==`function`?{exec:e}:e)}function ne(e){if(w.has(e))return e;let t={...e,exec:h(E(e.exec)),...e.pull?{pull:h(E(e.pull))}:{},...e.install?{install:h(E(e.install))}:{},...e.installBundle?{installBundle:h(e.installBundle)}:{}};return w.add(t),t}function E(e){return async(...t)=>b().coerceAdbResult(await e(...t))}const D=new WeakSet;function O(t){let n=T(t);if(n.reverse&&D.has(n.reverse))return n.reverse;let r=n.reverse??k(n.exec),i=new Map,a={async ensure(t,n){let a=i.get(t.local);if(a&&a.ownerId!==t.ownerId)throw new e(`COMMAND_FAILED`,`Android port reverse ${t.local} is already owned by ${a.ownerId??`another session`}`,{current:a,requested:t});a?.remote!==t.remote&&(await r.ensure(t,n),i.set(t.local,{...t}))},async remove(e,t){if(!i.has(e)){await r.remove(e,t);return}await r.remove(e,t),i.delete(e)},async removeAllOwned(e,t){let n=[...i.values()].filter(t=>t.ownerId===e).map(e=>e.local);if(n.length===0){await r.removeAllOwned(e,t);return}for(let e of n)await r.remove(e,t),i.delete(e)},async list(e){return r.list?await r.list(e):[...i.values()]}};return D.add(a),a}function k(e){let t=new Map;return{async ensure(n,r){if(await e([`reverse`,n.local,n.remote],{allowFailure:!1,signal:r?.signal,timeoutMs:r?.timeoutMs}),n.ownerId){let e=t.get(n.ownerId)??new Set;e.add(n.local),t.set(n.ownerId,e)}},async remove(n,r){let i=await e([`reverse`,`--remove`,n],{allowFailure:!0,signal:r?.signal,timeoutMs:r?.timeoutMs});if(i.exitCode!==0&&!re(i.stdout,i.stderr))throw ee(`Failed to remove Android port reverse ${n}`,i,{local:n});for(let e of t.values())e.delete(n)},async removeAllOwned(e,n){let r=[...t.get(e)??[]];for(let e of r)await this.remove(e,n);t.delete(e)},async list(n){let r=await e([`reverse`,`--list`],{allowFailure:!0,signal:n?.signal,timeoutMs:n?.timeoutMs});return r.exitCode===0?A(r.stdout,t):[]}}}function A(e,t){let n=new Map;for(let[e,r]of t)for(let t of r)n.set(t,e);return e.split(`
2
- `).map(e=>e.trim().split(/\s+/)).filter(e=>e.length>=3).map(([,e,t])=>{let r=e;return{local:r,remote:t,ownerId:n.get(r)}})}function re(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`listener`)&&n.includes(`not found`)}const j=new g;function M(e,t={}){return Q(ie(e.id,t.serverPort))}function ie(e,t){return h(async(n,r)=>{let i=b(),a=async(n,r)=>{let a=V(e,t,n,r);return await i.withoutAdbCommandExecutorOverride(async()=>await i.execAdb(a.invocation,a.options))};return await P(`${t??r?.serverPort??``}/${e}`,r,async e=>await a(n,e),async e=>{await a([`wait-for-device`],{allowFailure:!0,timeoutMs:e,signal:r?.signal,env:r?.env,serverPort:r?.serverPort}).catch(()=>void 0)})})}function ae(e,t=new Map){return{has:e=>(t.get(e)??0)>Date.now(),mark:n=>{let r=Date.now();for(let[e,n]of t)n<=r&&t.delete(e);t.set(n,r+e)},forget:e=>{t.delete(e)}}}const N=ae(3e4);async function P(e,t,n,r){let i=Date.now(),a=await F(e,async()=>await n(t));if(!a.offline||N.has(e))return a.outcome();let o=t?.timeoutMs,s=()=>o===void 0?1/0:Math.floor(o-(Date.now()-i)),c=Math.min(15e3,Math.floor(s()/2));if(c<1)return a.outcome();await r(c),t?.signal?.throwIfAborted();let l=s();if(l<1)return a.outcome();let u=await F(e,async()=>await n(o===void 0?t:{...t,timeoutMs:l}));return u.offline&&N.mark(e),u.outcome()}async function F(e,t){try{let n=await t(),r=I(n);return r||N.forget(e),{offline:r,outcome:()=>n}}catch(t){let n=m(t),r=L(n);return!r&&z(n)&&N.forget(e),{offline:r,outcome:()=>{throw n}}}}function I(e){if(e.exitCode===0)return!1;let t=te(e.stderr,e.stdout);return R(t?.reason,t?.hostRefusal)}function L(t){return t instanceof e&&R(t.details?.adbFailure,t.details?.adbHostRefusal)}function R(e,t){return e===`device_offline`&&t===!0}function z(t){if(!(t instanceof e)||t.details?.timeoutMs!==void 0)return!1;let n=t.details?.exitCode;return typeof n==`number`&&n>=0}function B(e,t){return $((n,r)=>{let i=V(e,t,n,r);return b().spawnAdb(i.invocation,i.options)})}function V(e,t,n,r){let{serverPort:i,...a}=r??{};return{invocation:H(e,n,U(e,t,i)),options:a}}function H(e,t,n){let r=p(t),i=u(r.target,e);if(n===void 0)return s(i,r.command,[`-s`,e,...t]);let a=f(r,{port:n});return s(o(a.target,e),a.command)}function U(e,t,n){let r=j.getStore();return r&&Z(r,{kind:`serial`,serial:e}),r?.serverPort===void 0?t??n:(d(t,r.serverPort),d(n,r.serverPort))}function W(e,t={}){let n=M(e,t);return{exec:n,spawn:B(e.id,t.serverPort),reverse:k(n),pull:async(e,t,r)=>await n([`pull`,e,t],r),install:async(e,t)=>{let{installArgs:r,execOptions:i}=c(t);return await n([`install`,...r,e],i)}}}function G(e,t){let n=X(e);return t?Q(t):n?.serial===e.id?Q(n.provider.exec):M(e)}function K(e,t){let n=X(e);return me(t?T(t):n?.serial===e.id?T(n.provider):W(e))}function q(e){let t=X(e);return t?.serial===e.id?{mode:`transport-composed`,...t.provider.spawn?{spawn:$(t.provider.spawn)}:{}}:{mode:`local`}}function oe(e){let t=X(e);return t?.serial===e.id?t.provider.text:void 0}function se(e){let t=X(e);return t?.serial===e.id&&t.provider.touch?t.provider:void 0}function J(e,t){if(t)return T(t);if(e)return K(e);let n=j.getStore();if(n)return T(n.provider)}async function ce(e,t,n){if(!e)return await n();let r={provider:T(e),serial:t.serial,...t.serverPort===void 0?{}:{serverPort:t.serverPort}},i=le(r),a=async()=>await j.run(r,async()=>await b().withAdbCommandExecutorOverride(i,n));return t.serverPort===void 0?await a():await S(ue(r,t.serverPort),a)}function le(e){return(t,n,r)=>{if(!de(t)||e.serverPort===void 0&&t!==`adb`)return;let o=p(n);if(Z(e,o.target.selector),o.target.selector.kind===`serial`){if(o.target.selector.serial!==e.serial)return;e.serverPort!==void 0&&a(o.target,e.serverPort);let t=i(n,e.serial);return t===void 0?void 0:b().withoutAdbCommandExecutorOverride(async()=>await e.provider.exec(t,r))}let s=e.serverPort;if(s!==void 0)return Y(e,s,o,r)}}function ue(e,t){return async(n,r)=>(Z(e,n.target.selector),Y(e,t,n,r))}async function Y(e,t,n,r){d(t,r?.serverPort);let{serverPort:i,...a}=r??{},c=o(n.target,e.serial),l=f(s(c,n.command),{port:t}),u=b();return await u.withoutAdbCommandExecutorOverride(async()=>await u.execAdb(l,{...a,allowFailure:!0}))}function X(e){let t=j.getStore();return t&&Z(t,{kind:`serial`,serial:e.id}),t}function Z(e,t){e?.serverPort!==void 0&&l(t,e.serial)}function de(e){return n(e)===`adb`}async function fe(e,n,r){return await e(t(`adb`,`shell`,n),r)}async function pe(e,n,r){return await e(t(`adb`,`exec-out`,n),r)}function Q(e){return async(t,n)=>(r(t,`adb`),await e(t,n))}function $(e){return(t,n)=>(r(t,`adb`),e(t,n))}function me(e){return{...e,exec:Q(e.exec),...e.spawn?{spawn:$(e.spawn)}:{}}}async function he(t,n,r){let{device:i,provider:a,...o}=r??{},s=J(i,a),c=s?.pull,l=b();if(c)return await l.withoutAdbCommandExecutorOverride(async()=>await c(t,n,o));let u=s?.exec;if(!u)throw new e(`COMMAND_FAILED`,`Android adb pull requires an adb provider`);return await l.withoutAdbCommandExecutorOverride(async()=>await u([`pull`,t,n],o))}async function ge(t,n){let{device:r,provider:i,...a}=n??{},o=J(r,i),s=o?.install,l=b();if(s)return await l.withoutAdbCommandExecutorOverride(async()=>await s(t,a));let u=o?.exec;if(!u)throw new e(`COMMAND_FAILED`,`Android adb install requires an adb provider`);let{installArgs:d,execOptions:f}=c(a);return await l.withoutAdbCommandExecutorOverride(async()=>await u([`install`,...d,t],f))}export{x as _,G as a,se as c,fe as d,ce as f,b as g,C as h,W as i,q as l,y as m,he as n,K as o,O as p,M as r,oe as s,ge as t,pe as u,S as v};
1
+ import{P as e}from"./sdk-contracts.js";import{n as t,r as n,t as r}from"./device-shell.js";import{a as i,d as a,f as o,i as s,l as c,m as l,n as u,p as d,s as f,u as p}from"./adb-transport.js";import{i as ee,n as m,s as h,u as g}from"./adb-failure.js";import{t as te}from"./keyed-lock.js";import{AsyncLocalStorage as _}from"node:async_hooks";let v;const y=new _;function b(e){v=e}function x(){if(!v)throw Error(`Android adb host port is not bound; import the platform composition wiring (src/platform-runtime-android-adb-host.ts) before using the adb/IME cluster.`);return v}async function S(e,t){let n=x(),r=y.getStore(),i=n.coerceAdbResult(r?await r(e,t):await n.execAdb(e,{...t,allowFailure:!0}));if(!t?.allowFailure&&i.exitCode!==0){let{androidAdbResultError:t}=await import(`./adb-failure.js`).then(e=>e.t),{serializeAndroidAdbInvocation:n}=await import(`./adb-transport.js`).then(e=>e.t);throw t(`adb ${n(e).join(` `)} exited with code ${i.exitCode}`,i)}return i}async function C(e,t){return await y.run(e,t)}function ne(e){x().emitDiagnostic(e)}const w=new WeakSet;function T(e){return E(typeof e==`function`?{exec:e}:e)}function E(e){if(w.has(e))return e;let t={...e,exec:g(D(e.exec)),...e.pull?{pull:g(D(e.pull))}:{},...e.install?{install:g(D(e.install))}:{},...e.installBundle?{installBundle:g(e.installBundle)}:{}};return w.add(t),t}function D(e){return async(...t)=>x().coerceAdbResult(await e(...t))}const O=new WeakSet;function k(t,n){let r=T(t);if(r.reverse&&O.has(r.reverse))return r.reverse;let i=r.reverse??A(r.exec,n),a=new Map,o=new Map,s={async ensure(t,n){await te(o,t.local,async()=>{let r=a.get(t.local);if(r&&r.ownerId!==t.ownerId)throw new e(`COMMAND_FAILED`,`Android port reverse ${t.local} is already owned by ${r.ownerId??`another session`}`,{current:r,requested:t});r?.remote!==t.remote&&(await i.ensure(t,n),a.set(t.local,{...t}))})},async remove(e,t){if(!a.has(e)){await i.remove(e,t);return}await i.remove(e,t),a.delete(e)},async removeAllOwned(e,t){let n=[...a.values()].filter(t=>t.ownerId===e).map(e=>e.local);if(n.length===0){await i.removeAllOwned(e,t);return}for(let e of n)await i.remove(e,t),a.delete(e)},async list(e){return i.list?await i.list(e):[...a.values()]}};return O.add(s),s}function A(e,t={}){let n=new Map,r=async t=>{let r=await e([`reverse`,`--list`],{allowFailure:!0,signal:t?.signal,timeoutMs:t?.timeoutMs});return r.exitCode===0?ie(r.stdout,n):[]},i=async(t,r)=>{let i=await e([`reverse`,`--remove`,t],{allowFailure:!0,signal:r?.signal,timeoutMs:r?.timeoutMs});if(i.exitCode!==0&&!ae(i.stdout,i.stderr))throw m(`Failed to remove Android port reverse ${t}`,i,{local:t});n.delete(t)};return{async ensure(i,a){let o=t.noRebind===!0,s=await e([`reverse`,...o?[`--no-rebind`]:[],i.local,i.remote],{allowFailure:o,signal:a?.signal,timeoutMs:a?.timeoutMs});if(s.exitCode!==0){let e=(await r(a)).find(e=>e.local===i.local);throw e?re(i,e):m(`Failed to ensure Android port reverse ${i.local}`,s,{local:i.local,remote:i.remote})}n.set(i.local,i.ownerId)},remove:i,async removeAllOwned(e,t){let r=[...n].filter(([,t])=>t===e).map(([e])=>e);for(let e of r)await i(e,t)},list:r}}function re(t,n){return new e(`COMMAND_FAILED`,`Android port reverse ${t.local} is already mapped on the device`,{reason:`android_port_reverse_rebind_refused`,requested:t,existing:n,hint:`agent-device does not replace an existing reverse mapping on a shared device. Remove the mapping that holds device ${t.local}, or use another device port.`})}function ie(e,t){return e.split(`
2
+ `).map(e=>e.trim().split(/\s+/)).filter(e=>e.length>=3).map(([,e,n])=>{let r=e;return{local:r,remote:n,ownerId:t.get(r)}})}function ae(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`listener`)&&n.includes(`not found`)}const j=new _;function M(e,t={}){return Z(oe(e.id,t.serverPort))}function oe(e,t){return g(async(n,r)=>{let i=x(),a=async(n,r)=>{let a=V(e,t,n,r);return await i.withoutAdbCommandExecutorOverride(async()=>await i.execAdb(a.invocation,a.options))};return await P(`${t??r?.serverPort??``}/${e}`,r,async e=>await a(n,e),async e=>{await a([`wait-for-device`],{allowFailure:!0,timeoutMs:e,signal:r?.signal,env:r?.env,serverPort:r?.serverPort}).catch(()=>void 0)})})}function se(e,t=new Map){return{has:e=>(t.get(e)??0)>Date.now(),mark:n=>{let r=Date.now();for(let[e,n]of t)n<=r&&t.delete(e);t.set(n,r+e)},forget:e=>{t.delete(e)}}}const N=se(3e4);async function P(e,t,n,r){let i=Date.now(),a=await F(e,async()=>await n(t));if(!a.offline||N.has(e))return a.outcome();let o=t?.timeoutMs,s=()=>o===void 0?1/0:Math.floor(o-(Date.now()-i)),c=Math.min(15e3,Math.floor(s()/2));if(c<1)return a.outcome();await r(c),t?.signal?.throwIfAborted();let l=s();if(l<1)return a.outcome();let u=await F(e,async()=>await n(o===void 0?t:{...t,timeoutMs:l}));return u.offline&&N.mark(e),u.outcome()}async function F(e,t){try{let n=await t(),r=I(n);return r||N.forget(e),{offline:r,outcome:()=>n}}catch(t){let n=ee(t),r=L(n);return!r&&z(n)&&N.forget(e),{offline:r,outcome:()=>{throw n}}}}function I(e){if(e.exitCode===0)return!1;let t=h(e.stderr,e.stdout);return R(t?.reason,t?.hostRefusal)}function L(t){return t instanceof e&&R(t.details?.adbFailure,t.details?.adbHostRefusal)}function R(e,t){return e===`device_offline`&&t===!0}function z(t){if(!(t instanceof e)||t.details?.timeoutMs!==void 0)return!1;let n=t.details?.exitCode;return typeof n==`number`&&n>=0}function B(e,t){return Q((n,r)=>{let i=V(e,t,n,r);return x().spawnAdb(i.invocation,i.options)})}function V(e,t,n,r){let{serverPort:i,...a}=r??{};return{invocation:H(e,n,U(e,t,i)),options:a}}function H(e,t,n){let r=p(t),i=u(r.target,e);if(n===void 0)return s(i,r.command,[`-s`,e,...t]);let a=f(r,{port:n});return s(o(a.target,e),a.command)}function U(e,t,n){let r=j.getStore();return r&&X(r,{kind:`serial`,serial:e}),r?.serverPort===void 0?t??n:(d(t,r.serverPort),d(n,r.serverPort))}function W(e,t={}){let n=M(e,t);return{exec:n,spawn:B(e.id,t.serverPort),reverse:A(n),pull:async(e,t,r)=>await n([`pull`,e,t],r),install:async(e,t)=>{let{installArgs:r,execOptions:i}=c(t);return await n([`install`,...r,e],i)}}}function G(e,t){let n=Y(e);return t?Z(t):n?.serial===e.id?Z(n.provider.exec):M(e)}function K(e,t){let n=Y(e);return $(t?T(t):n?.serial===e.id?T(n.provider):W(e))}function ce(e){let t=Y(e);return t?.serial===e.id?{mode:`transport-composed`,...t.provider.spawn?{spawn:Q(t.provider.spawn)}:{}}:{mode:`local`}}function le(e){let t=Y(e);return t?.serial===e.id?t.provider.text:void 0}function ue(e){let t=Y(e);return t?.serial===e.id&&t.provider.touch?t.provider:void 0}function q(e,t){if(t)return T(t);if(e)return K(e);let n=j.getStore();if(n)return T(n.provider)}async function de(e,t,n){if(!e)return await n();let r={provider:T(e),serial:t.serial,...t.serverPort===void 0?{}:{serverPort:t.serverPort}},i=fe(r),a=async()=>await j.run(r,async()=>await x().withAdbCommandExecutorOverride(i,n));return t.serverPort===void 0?await a():await C(pe(r,t.serverPort),a)}function fe(e){return(t,n,r)=>{if(!me(t)||e.serverPort===void 0&&t!==`adb`)return;let o=p(n);if(X(e,o.target.selector),o.target.selector.kind===`serial`){if(o.target.selector.serial!==e.serial)return;e.serverPort!==void 0&&a(o.target,e.serverPort);let t=i(n,e.serial);return t===void 0?void 0:x().withoutAdbCommandExecutorOverride(async()=>await e.provider.exec(t,r))}let s=e.serverPort;if(s!==void 0)return J(e,s,o,r)}}function pe(e,t){return async(n,r)=>(X(e,n.target.selector),J(e,t,n,r))}async function J(e,t,n,r){d(t,r?.serverPort);let{serverPort:i,...a}=r??{},c=o(n.target,e.serial),l=f(s(c,n.command),{port:t}),u=x();return await u.withoutAdbCommandExecutorOverride(async()=>await u.execAdb(l,{...a,allowFailure:!0}))}function Y(e){let t=j.getStore();return t&&X(t,{kind:`serial`,serial:e.id}),t}function X(e,t){e?.serverPort!==void 0&&l(t,e.serial)}function me(e){return n(e)===`adb`}async function he(e,n,r){return await e(t(`adb`,`shell`,n),r)}async function ge(e,n,r){return await e(t(`adb`,`exec-out`,n),r)}function Z(e){return async(t,n)=>(r(t,`adb`),await e(t,n))}function Q(e){return(t,n)=>(r(t,`adb`),e(t,n))}function $(e){return{...e,exec:Z(e.exec),...e.spawn?{spawn:Q(e.spawn)}:{}}}async function _e(t,n,r){let{device:i,provider:a,...o}=r??{},s=q(i,a),c=s?.pull,l=x();if(c)return await l.withoutAdbCommandExecutorOverride(async()=>await c(t,n,o));let u=s?.exec;if(!u)throw new e(`COMMAND_FAILED`,`Android adb pull requires an adb provider`);return await l.withoutAdbCommandExecutorOverride(async()=>await u([`pull`,t,n],o))}async function ve(t,n){let{device:r,provider:i,...a}=n??{},o=q(r,i),s=o?.install,l=x();if(s)return await l.withoutAdbCommandExecutorOverride(async()=>await s(t,a));let u=o?.exec;if(!u)throw new e(`COMMAND_FAILED`,`Android adb install requires an adb provider`);let{installArgs:d,execOptions:f}=c(a);return await l.withoutAdbCommandExecutorOverride(async()=>await u([`install`,...d,t],f))}export{S as _,G as a,ue as c,he as d,de as f,x as g,ne as h,W as i,ce as l,b as m,_e as n,K as o,k as p,M as r,le as s,ve as t,ge as u,C as v};
@@ -1,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime.js";import{N as t,R as n}from"./sdk-contracts.js";import{r}from"./exec.js";import"./command.js";var i=e({androidAdbResultError:()=>h,androidDiscoveryCommandError:()=>_,attachAdbFailureHint:()=>f,attachAndroidDiscoveryTimeout:()=>v,attachAndroidHelperInstallTimeoutHint:()=>p,classifyAndroidAdbFailure:()=>d,discloseAdbInputDispatch:()=>y,isAdbHostRefusal:()=>b,withAdbFailureHints:()=>g});const a=String.raw`(?:adb|error): `;function o(e){return RegExp(`^${a}${e}$`)}const s=[[/device unauthorized|device still authorizing/,{reason:`device_unauthorized`,hint:`USB debugging is not authorized — accept the authorization prompt on the device screen (re-plug the cable if none appears), then retry.`},{hostRefusal:o(String.raw`device (?:unauthorized|still authorizing)\.?`)}],[/device offline/,{reason:`device_offline`,hint:`The device is connected but offline — wait for it to finish booting or run adb reconnect, then retry.`,retriable:!0},{hostRefusal:o(String.raw`device (?:'[^']*' )?offline`)}],[/more than one (?:device\/emulator|device and emulator)/,{reason:`multiple_devices`,hint:`Multiple Android devices are connected — pass --serial <serial> (see adb devices) to select one.`},{hostRefusal:o(String.raw`more than one (?:device/emulator|device and emulator)`)}],[/no devices\/emulators found|no devices found/,{reason:`no_devices`,hint:`No Android devices detected — boot an emulator or connect a device and verify it appears in adb devices.`},{hostRefusal:o(String.raw`no devices(?:/emulators)? found`)}],[/device (?:'[^']*' )?not found/,{reason:`device_not_found`,hint:`The device disconnected or is restarting — verify it is listed in adb devices, then retry.`,retriable:!0},{hostRefusal:o(String.raw`device (?:'[^']*' )?not found`)}],[/adb server version \(\d+\) doesn't match this client/,{reason:`server_version_mismatch`,hint:`Multiple adb installs conflict — adb restarts its server automatically, so retry; align PATH to a single adb to stop recurrences.`,retriable:!0}],[/transport error|connection reset|broken pipe|protocol fault/,{reason:`connection_dropped`,hint:`The adb connection dropped — retry; if it persists, run adb kill-server and reconnect the device.`,retriable:!0}],[/install_failed_insufficient_storage/,{reason:`install_insufficient_storage`,hint:`The device is out of storage — free up space or uninstall unused apps, then retry the install.`},{matchStdout:!0}],[/install_failed_update_incompatible/,{reason:`install_update_incompatible`,hint:`The installed app has an incompatible signature — uninstall the existing app first, then retry the install.`},{matchStdout:!0}],[/install_failed_version_downgrade/,{reason:`install_version_downgrade`,hint:`The APK is older than the installed app — uninstall the app first (or install with downgrade allowed), then retry.`},{matchStdout:!0}],[/install_failed_\w+|install_parse_failed_\w+/,{reason:`install_failed`,hint:`The Android package installer rejected the APK — see the INSTALL_FAILED code in the error output for the exact cause.`},{matchStdout:!0}]],c=Object.freeze({reason:`timeout`,hint:`adb timed out — the adb server may be wedged. Run adb kill-server && adb start-server, check adb devices, then retry.`}),l=/^(?:this adb server's \$adb_vendor_keys is not set|try 'adb kill-server' if that seems wrong\.|(?:otherwise|please) check (?:for|the) (?:a )?confirmation dialog on your device\.)$/;function u(e,t){if(t!==``)return;let[n,...r]=e.split(`
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t,z as n}from"./sdk-contracts.js";import{i as r}from"./exec.js";import"./command.js";var i=e({androidAdbResultError:()=>h,androidDiscoveryCommandError:()=>_,attachAdbFailureHint:()=>f,attachAndroidDiscoveryTimeout:()=>v,attachAndroidHelperInstallTimeoutHint:()=>p,classifyAndroidAdbFailure:()=>d,discloseAdbInputDispatch:()=>y,isAdbHostRefusal:()=>b,withAdbFailureHints:()=>g});const a=String.raw`(?:adb|error): `;function o(e){return RegExp(`^${a}${e}$`)}const s=[[/device unauthorized|device still authorizing/,{reason:`device_unauthorized`,hint:`USB debugging is not authorized — accept the authorization prompt on the device screen (re-plug the cable if none appears), then retry.`},{hostRefusal:o(String.raw`device (?:unauthorized|still authorizing)\.?`)}],[/device offline/,{reason:`device_offline`,hint:`The device is connected but offline — wait for it to finish booting or run adb reconnect, then retry.`,retriable:!0},{hostRefusal:o(String.raw`device (?:'[^']*' )?offline`)}],[/more than one (?:device\/emulator|device and emulator)/,{reason:`multiple_devices`,hint:`Multiple Android devices are connected — pass --serial <serial> (see adb devices) to select one.`},{hostRefusal:o(String.raw`more than one (?:device/emulator|device and emulator)`)}],[/no devices\/emulators found|no devices found/,{reason:`no_devices`,hint:`No Android devices detected — boot an emulator or connect a device and verify it appears in adb devices.`},{hostRefusal:o(String.raw`no devices(?:/emulators)? found`)}],[/device (?:'[^']*' )?not found/,{reason:`device_not_found`,hint:`The device disconnected or is restarting — verify it is listed in adb devices, then retry.`,retriable:!0},{hostRefusal:o(String.raw`device (?:'[^']*' )?not found`)}],[/adb server version \(\d+\) doesn't match this client/,{reason:`server_version_mismatch`,hint:`Multiple adb installs conflict — adb restarts its server automatically, so retry; align PATH to a single adb to stop recurrences.`,retriable:!0}],[/transport error|connection reset|broken pipe|protocol fault/,{reason:`connection_dropped`,hint:`The adb connection dropped — retry; if it persists, run adb kill-server and reconnect the device.`,retriable:!0}],[/install_failed_insufficient_storage/,{reason:`install_insufficient_storage`,hint:`The device is out of storage — free up space or uninstall unused apps, then retry the install.`},{matchStdout:!0}],[/install_failed_update_incompatible/,{reason:`install_update_incompatible`,hint:`The installed app has an incompatible signature — uninstall the existing app first, then retry the install.`},{matchStdout:!0}],[/install_failed_version_downgrade/,{reason:`install_version_downgrade`,hint:`The APK is older than the installed app — uninstall the app first (or install with downgrade allowed), then retry.`},{matchStdout:!0}],[/install_failed_\w+|install_parse_failed_\w+/,{reason:`install_failed`,hint:`The Android package installer rejected the APK — see the INSTALL_FAILED code in the error output for the exact cause.`},{matchStdout:!0}]],c=Object.freeze({reason:`timeout`,hint:`adb timed out — the adb server may be wedged. Run adb kill-server && adb start-server, check adb devices, then retry.`}),l=/^(?:this adb server's \$adb_vendor_keys is not set|try 'adb kill-server' if that seems wrong\.|(?:otherwise|please) check (?:for|the) (?:a )?confirmation dialog on your device\.)$/;function u(e,t){if(t!==``)return;let[n,...r]=e.split(`
2
2
  `).map(e=>e.trim()).filter(e=>e!==``);if(n===void 0||!r.every(e=>l.test(e)))return;let i=s.find(([,,e])=>e?.hostRefusal?.test(n));return i&&{...i[1],hostRefusal:!0}}function d(e,t=``){let n=e.toLowerCase(),r=t.toLowerCase(),i=u(n,r);if(i)return i;for(let[e,t,i]of s)if(e.test(n)||i?.matchStdout&&e.test(r))return t}function f(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return e;let n=m(e);return n&&(e.details={...e.details,adbFailure:n.reason,...n.hostRefusal?{adbHostRefusal:!0}:{},...typeof e.details?.hint==`string`?{}:{hint:n.hint},...n.retriable!==void 0&&e.details?.retriable===void 0?{retriable:n.retriable}:{}}),e}function p(e){if(!r(e))return e;let t=e.details?.hint;if(typeof t==`string`&&t!==c.hint)return e;let n=f(e);return n.details={...n.details,hint:`The helper install timed out — some OEM builds (ColorOS is one) hold the first install of each package behind a system install-confirmation dialog and adb waits for it. Check the device screen, confirm any pending install prompt, then retry; if none is showing, run adb kill-server && adb start-server and retry.`},n}function m(e){return typeof e.details?.timeoutMs==`number`?c:d(typeof e.details?.stderr==`string`?e.details.stderr:``,typeof e.details?.stdout==`string`?e.details.stdout:``)}function h(e,n,r){let i=n.exitCode===0?{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode,...r}:{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode,processExitError:!0,...r};return f(new t(`COMMAND_FAILED`,e,i))}function g(e){return async(...t)=>{try{return await e(...t)}catch(e){throw f(e)}}}function _(e,n,r){let i=d(n.stderr,n.stdout);return new t(`COMMAND_FAILED`,e,{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode,processExitError:!0,hint:i?.hint??r,...i?{adbFailure:i.reason}:{},...i?.retriable===void 0?{}:{retriable:i.retriable}})}function v(e){return r(e)&&(e.details={...e.details,adbFailure:c.reason,...typeof e.details?.hint==`string`?{}:{hint:c.hint}}),e}function y(e){return e instanceof t?n(e,e.code===`TOOL_MISSING`||b(e)?`no`:`unknown`):e}function b(e){return e.details?.adbHostRefusal===!0}export{v as a,y as c,f as i,b as l,h as n,p as o,_ as r,d as s,i as t,g as u};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{N as t}from"./sdk-contracts.js";import{i as n}from"./device-shell.js";var r=e({ADB_GLOBAL_OPTIONS:()=>a,ADB_MANAGED_FORBIDDEN_COMMANDS:()=>c,ADB_WAIT_STATES:()=>s,ADB_WAIT_TRANSPORTS:()=>o,adoptAndroidAdbSerial:()=>g,androidAdbHostTarget:()=>m,androidAdbInvocation:()=>h,androidAdbPayloadWithoutSerial:()=>T,androidAdbSerialTarget:()=>p,androidManagedAdbEnvironment:()=>P,applyManagedAndroidAdbServer:()=>E,lowerAndroidAdbInvocation:()=>N,normalizeAndroidAdbInstallOptions:()=>i,parseAndroidAdbArgv:()=>x,requireAndroidAdbServerPort:()=>C,requireManagedAndroidAdbAddressing:()=>k,requireManagedAndroidAdbCommand:()=>A,requireManagedAndroidAdbSerial:()=>D,requireSameAndroidAdbServer:()=>w,requireUnconflictedAndroidAdbSelector:()=>O,serializeAndroidAdbInvocation:()=>_});function i(e){let{replace:t,...n}=e??{};return{installArgs:t?[`-r`]:[],execOptions:n}}const a={"-a":0,"-d":0,"-e":0,"-s":1,"-t":1,"-H":1,"-P":1,"-L":1,"--one-device":1,"--exit-on-write-error":0},o=[``,`usb-`,`local-`,`any-`],s=[`device`,`recovery`,`bootloader`,`sideload`,`sideload-window`],c=[`nodaemon`,`server`,`fork-server`,`kill-server`,`start-server`,`connect`,`disconnect`,`reconnect`,`attach`,`detach`,`pair`],l=new Set(c);function u(e){return e.startsWith(`wait-for-`)}function d(e){if(!u(e))return;let t=e.slice(9);return o.some(e=>t.startsWith(e)&&s.includes(t.slice(e.length)))?e:void 0}function f(e){return l.has(e)}function p(e,t){return{selector:{kind:`serial`,serial:e},server:t===void 0?{kind:`ambient`}:{kind:`port`,port:t}}}function m(){return{selector:{kind:`unspecified`},server:{kind:`ambient`}}}function h(e,t,n){return{target:e,command:t,...n?{rawArgv:n}:{}}}function g(e,t){return{...e,selector:{kind:`serial`,serial:t}}}function _(e){if(e.rawArgv)return[...e.rawArgv];let{target:t,command:n}=e,r=[];return t.server.kind===`port`&&r.push(`-P`,String(t.server.port)),t.selector.kind===`serial`&&r.push(`-s`,t.selector.serial),t.hostGlobals&&r.push(...t.hostGlobals),t.waitFor&&r.push(t.waitFor),r.push(...n),r}const v={"-s":`serial`,"-P":`server`};function y(e,t){let n=e[t],r=d(n);if(r)return{kind:`wait`,waitFor:r,next:t+1};if(u(n))return{kind:`unknown-wait`,token:n,next:t+1};let i=v[n];if(i===void 0){if(!n.startsWith(`-`))return{kind:`stop`,next:t};let r=a[n]??0;return{kind:`global`,tokens:[n,...e.slice(t+1,t+1+r)],next:t+1+r}}let o=e[t+1]??``;if(i===`serial`)return{kind:`serial`,serial:o,next:t+2};let s=Number(o);return Number.isInteger(s)?{kind:`server`,port:s,next:t+2}:{kind:`global`,tokens:[n,o],next:t+2}}function b(e,t){e.kind===`wait`?t.waitFor===void 0?t.waitFor=e.waitFor:t.hostGlobals.push(e.waitFor):e.kind===`unknown-wait`?t.hostGlobals.push(e.token):e.kind===`serial`?t.selector.kind===`unspecified`?t.selector={kind:`serial`,serial:e.serial}:t.selector.serial!==e.serial&&t.hostGlobals.push(`-s`,e.serial):e.kind===`server`?t.server={kind:`port`,port:e.port}:e.kind===`global`&&t.hostGlobals.push(...e.tokens)}function x(e){let t=m(),r={selector:t.selector,server:t.server,waitFor:void 0,hostGlobals:[]},i=0;for(;;){let t=i<e.length?y(e,i):{kind:`stop`,next:i};if(t.kind===`stop`)break;b(t,r),i=t.next}let{selector:a,server:o,waitFor:s,hostGlobals:c}=r,l={selector:a,server:o,...s?{waitFor:s}:{},...c.length>0?{hostGlobals:c}:{}},u=c.length>0||s!==void 0||a.kind!==`unspecified`||o.kind===`port`;return{target:l,command:n(e,0,i),rawArgv:u?e:void 0}}function S(e){if(e.rawArgv===void 0)return e.target.server.kind===`port`?e.target.server.port:void 0}function C(e,t){return w(S(e),t?.serverPort)}function w(e,t){if(e!==void 0&&t!==void 0&&e!==t)throw M(`server`);return e??t}function T(e,t){let r=0;for(;;){let i=r<e.length?y(e,r):{kind:`stop`,next:r};if(i.kind===`stop`)return;if(i.kind===`serial`)return i.serial===t?n(e,r,2):void 0;r=i.next}}function E(e,t){let{target:n,command:r}=e;return k(n,t.port),A(r),h({selector:n.selector,server:{kind:`port`,port:t.port},...n.waitFor?{waitFor:n.waitFor}:{}},r)}function D(e,t){return O(e.selector,t),{...e,selector:{kind:`serial`,serial:t}}}function O(e,t){if(e.kind===`serial`&&e.serial!==t)throw M(`device`)}function k(e,t){if(e.hostGlobals)throw M(`target`);w(t,e.server.kind===`port`?e.server.port:void 0)}function A(e){if(f(e.find(e=>!u(e))??``))throw M(`target`)}const j={device:`Managed ADB transport cannot address another device.`,target:`Managed ADB transport cannot select another target.`,server:`Managed ADB transport cannot select another server.`};function M(e){throw new t(`COMMAND_FAILED`,j[e],{reason:`managed-device-transport-mismatch`})}function N(e,t,n){let{serverPort:r,...i}=t??{},a=C(e,t),o=a===void 0?e:E(e,{port:a}),s=a===void 0?void 0:P(o.target,n,i.env);return{args:_(o),options:{...i,...s===void 0?{}:{env:s}}}}function P(e,t,n){return e.server.kind===`port`?{...t,...n??{},ADB_SERVER_SOCKET:void 0,ANDROID_ADB_SERVER_PORT:String(e.server.port),ANDROID_ADB_SERVER_ADDRESS:`127.0.0.1`}:n}export{T as a,N as c,k as d,D as f,_ as h,h as i,i as l,O as m,g as n,p as o,w as p,m as r,E as s,r as t,x as u};
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{i as n}from"./device-shell.js";var r=e({ADB_GLOBAL_OPTIONS:()=>a,ADB_MANAGED_FORBIDDEN_COMMANDS:()=>c,ADB_WAIT_STATES:()=>s,ADB_WAIT_TRANSPORTS:()=>o,adoptAndroidAdbSerial:()=>g,androidAdbHostTarget:()=>m,androidAdbInvocation:()=>h,androidAdbPayloadWithoutSerial:()=>T,androidAdbSerialTarget:()=>p,androidManagedAdbEnvironment:()=>P,applyManagedAndroidAdbServer:()=>E,lowerAndroidAdbInvocation:()=>N,normalizeAndroidAdbInstallOptions:()=>i,parseAndroidAdbArgv:()=>x,requireAndroidAdbServerPort:()=>C,requireManagedAndroidAdbAddressing:()=>k,requireManagedAndroidAdbCommand:()=>A,requireManagedAndroidAdbSerial:()=>D,requireSameAndroidAdbServer:()=>w,requireUnconflictedAndroidAdbSelector:()=>O,serializeAndroidAdbInvocation:()=>_});function i(e){let{replace:t,...n}=e??{};return{installArgs:t?[`-r`]:[],execOptions:n}}const a={"-a":0,"-d":0,"-e":0,"-s":1,"-t":1,"-H":1,"-P":1,"-L":1,"--one-device":1,"--exit-on-write-error":0},o=[``,`usb-`,`local-`,`any-`],s=[`device`,`recovery`,`bootloader`,`sideload`,`sideload-window`],c=[`nodaemon`,`server`,`fork-server`,`kill-server`,`start-server`,`connect`,`disconnect`,`reconnect`,`attach`,`detach`,`pair`],l=new Set(c);function u(e){return e.startsWith(`wait-for-`)}function d(e){if(!u(e))return;let t=e.slice(9);return o.some(e=>t.startsWith(e)&&s.includes(t.slice(e.length)))?e:void 0}function f(e){return l.has(e)}function p(e,t){return{selector:{kind:`serial`,serial:e},server:t===void 0?{kind:`ambient`}:{kind:`port`,port:t}}}function m(){return{selector:{kind:`unspecified`},server:{kind:`ambient`}}}function h(e,t,n){return{target:e,command:t,...n?{rawArgv:n}:{}}}function g(e,t){return{...e,selector:{kind:`serial`,serial:t}}}function _(e){if(e.rawArgv)return[...e.rawArgv];let{target:t,command:n}=e,r=[];return t.server.kind===`port`&&r.push(`-P`,String(t.server.port)),t.selector.kind===`serial`&&r.push(`-s`,t.selector.serial),t.hostGlobals&&r.push(...t.hostGlobals),t.waitFor&&r.push(t.waitFor),r.push(...n),r}const v={"-s":`serial`,"-P":`server`};function y(e,t){let n=e[t],r=d(n);if(r)return{kind:`wait`,waitFor:r,next:t+1};if(u(n))return{kind:`unknown-wait`,token:n,next:t+1};let i=v[n];if(i===void 0){if(!n.startsWith(`-`))return{kind:`stop`,next:t};let r=a[n]??0;return{kind:`global`,tokens:[n,...e.slice(t+1,t+1+r)],next:t+1+r}}let o=e[t+1]??``;if(i===`serial`)return{kind:`serial`,serial:o,next:t+2};let s=Number(o);return Number.isInteger(s)?{kind:`server`,port:s,next:t+2}:{kind:`global`,tokens:[n,o],next:t+2}}function b(e,t){e.kind===`wait`?t.waitFor===void 0?t.waitFor=e.waitFor:t.hostGlobals.push(e.waitFor):e.kind===`unknown-wait`?t.hostGlobals.push(e.token):e.kind===`serial`?t.selector.kind===`unspecified`?t.selector={kind:`serial`,serial:e.serial}:t.selector.serial!==e.serial&&t.hostGlobals.push(`-s`,e.serial):e.kind===`server`?t.server={kind:`port`,port:e.port}:e.kind===`global`&&t.hostGlobals.push(...e.tokens)}function x(e){let t=m(),r={selector:t.selector,server:t.server,waitFor:void 0,hostGlobals:[]},i=0;for(;;){let t=i<e.length?y(e,i):{kind:`stop`,next:i};if(t.kind===`stop`)break;b(t,r),i=t.next}let{selector:a,server:o,waitFor:s,hostGlobals:c}=r,l={selector:a,server:o,...s?{waitFor:s}:{},...c.length>0?{hostGlobals:c}:{}},u=c.length>0||s!==void 0||a.kind!==`unspecified`||o.kind===`port`;return{target:l,command:n(e,0,i),rawArgv:u?e:void 0}}function S(e){if(e.rawArgv===void 0)return e.target.server.kind===`port`?e.target.server.port:void 0}function C(e,t){return w(S(e),t?.serverPort)}function w(e,t){if(e!==void 0&&t!==void 0&&e!==t)throw M(`server`);return e??t}function T(e,t){let r=0;for(;;){let i=r<e.length?y(e,r):{kind:`stop`,next:r};if(i.kind===`stop`)return;if(i.kind===`serial`)return i.serial===t?n(e,r,2):void 0;r=i.next}}function E(e,t){let{target:n,command:r}=e;return k(n,t.port),A(r),h({selector:n.selector,server:{kind:`port`,port:t.port},...n.waitFor?{waitFor:n.waitFor}:{}},r)}function D(e,t){return O(e.selector,t),{...e,selector:{kind:`serial`,serial:t}}}function O(e,t){if(e.kind===`serial`&&e.serial!==t)throw M(`device`)}function k(e,t){if(e.hostGlobals)throw M(`target`);w(t,e.server.kind===`port`?e.server.port:void 0)}function A(e){if(f(e.find(e=>!u(e))??``))throw M(`target`)}const j={device:`Managed ADB transport cannot address another device.`,target:`Managed ADB transport cannot select another target.`,server:`Managed ADB transport cannot select another server.`};function M(e){throw new t(`COMMAND_FAILED`,j[e],{reason:`managed-device-transport-mismatch`})}function N(e,t,n){let{serverPort:r,...i}=t??{},a=C(e,t),o=a===void 0?e:E(e,{port:a}),s=a===void 0?void 0:P(o.target,n,i.env);return{args:_(o),options:{...i,...s===void 0?{}:{env:s}}}}function P(e,t,n){return e.server.kind===`port`?{...t,...n??{},ADB_SERVER_SOCKET:void 0,ANDROID_ADB_SERVER_PORT:String(e.server.port),ANDROID_ADB_SERVER_ADDRESS:`127.0.0.1`}:n}export{T as a,N as c,k as d,D as f,_ as h,h as i,i as l,O as m,g as n,p as o,w as p,m as r,E as s,r as t,x as u};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{cr as t}from"./sdk-batch.js";import{r as n}from"./diagnostics.js";import{c as r}from"./owner-identity.js";import"./diagnostics2.js";import{n as i}from"./process.js";import{_ as a,d as o}from"./host-file.js";import"./agent-browser-process-record.js";import s from"node:path";var c=e({DEFAULT_AGENT_BROWSER_IDLE_TIMEOUT_MS:()=>l,cleanupManagedAgentBrowserOrphans:()=>f,cleanupManagedAgentBrowserOrphansForProviderStartup:()=>p,resolveAgentBrowserIdleTimeoutMs:()=>d});const l=3e5,u=new Map;function d(e){return m(e.AGENT_BROWSER_IDLE_TIMEOUT_MS)??m(e.AGENT_DEVICE_WEB_IDLE_TIMEOUT_MS)??3e5}async function f(e,a,o={}){let s=t((o.openWebSessionNames??[]).filter(e=>e.length>0));if(s.length>0)return h(`open-web-session`,{openWebSessionNames:s});let c=d(r()),l=_(e);if(l!==void 0&&Date.now()-l<c)return h(`recent-browser-activity`,{idleTimeoutMs:c,latestActivityMs:l});let u=o.ownedProcessRecords;if(!u)return g();let f=await i(u,{openWebSessionNames:s,purposes:[`managed-web-browser`],termTimeoutMs:1500,killTimeoutMs:1e3}),p=[...f.terminatedPids];return f.inspected>0&&n({level:`warn`,phase:`web_agent_browser_orphan_cleanup`,data:{reason:a,count:f.inspected,pids:[...f.inspectedPids],signalPids:p,ownershipLostPids:[...f.ownershipLostPids],stateDir:e.stateDir,installDir:e.installDir}}),{count:f.inspected,pids:[...f.inspectedPids],processes:[],signalPids:p}}async function p(e,t={}){let n=Date.now(),r=s.resolve(e.stateDir),i=u.get(r);if(!(i!==void 0&&n-i<3e4))return u.set(r,n),await f(e,`provider-startup`,t)}function m(e){if(e===void 0||e.trim()===``)return;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0?t:void 0}function h(e,t){return{count:0,pids:[],processes:[],signalPids:[],skipped:{reason:e,...t}}}function g(){return{count:0,pids:[],processes:[],signalPids:[]}}function _(e){let t=v(e.socketDir).map(e=>y(e)).filter(e=>e!==void 0);return t.length>0?Math.max(...t):void 0}function v(e){try{return a(e).map(t=>s.join(e,t))}catch{return[]}}function y(e){try{return o(e).mtimeMs}catch{return}}export{p as n,d as r,c as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{r as t}from"./diagnostics.js";import"./diagnostics2.js";import{cr as n}from"./sdk-batch.js";import{l as r}from"./owner-identity.js";import{r as i}from"./process.js";import{_ as a,d as o}from"./host-file.js";import"./agent-browser-process-record.js";import s from"node:path";var c=e({DEFAULT_AGENT_BROWSER_IDLE_TIMEOUT_MS:()=>l,cleanupManagedAgentBrowserOrphans:()=>f,cleanupManagedAgentBrowserOrphansForProviderStartup:()=>p,resolveAgentBrowserIdleTimeoutMs:()=>d});const l=3e5,u=new Map;function d(e){return m(e.AGENT_BROWSER_IDLE_TIMEOUT_MS)??m(e.AGENT_DEVICE_WEB_IDLE_TIMEOUT_MS)??3e5}async function f(e,a,o={}){let s=n((o.openWebSessionNames??[]).filter(e=>e.length>0));if(s.length>0)return h(`open-web-session`,{openWebSessionNames:s});let c=d(r()),l=_(e);if(l!==void 0&&Date.now()-l<c)return h(`recent-browser-activity`,{idleTimeoutMs:c,latestActivityMs:l});let u=o.ownedProcessRecords;if(!u)return g();let f=await i(u,{openWebSessionNames:s,purposes:[`managed-web-browser`],termTimeoutMs:1500,killTimeoutMs:1e3}),p=[...f.terminatedPids];return f.inspected>0&&t({level:`warn`,phase:`web_agent_browser_orphan_cleanup`,data:{reason:a,count:f.inspected,pids:[...f.inspectedPids],signalPids:p,ownershipLostPids:[...f.ownershipLostPids],stateDir:e.stateDir,installDir:e.installDir}}),{count:f.inspected,pids:[...f.inspectedPids],processes:[],signalPids:p}}async function p(e,t={}){let n=Date.now(),r=s.resolve(e.stateDir),i=u.get(r);if(!(i!==void 0&&n-i<3e4))return u.set(r,n),await f(e,`provider-startup`,t)}function m(e){if(e===void 0||e.trim()===``)return;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0?t:void 0}function h(e,t){return{count:0,pids:[],processes:[],signalPids:[],skipped:{reason:e,...t}}}function g(){return{count:0,pids:[],processes:[],signalPids:[]}}function _(e){let t=v(e.socketDir).map(e=>y(e)).filter(e=>e!==void 0);return t.length>0?Math.max(...t):void 0}function v(e){try{return a(e).map(t=>s.join(e,t))}catch{return[]}}function y(e){try{return o(e).mtimeMs}catch{return}}export{p as n,d as r,c as t};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{cr as t}from"./sdk-batch.js";import{C as n,f as r,g as i,o as a,x as o}from"./owner-identity.js";import{_ as s}from"./exec.js";import"./command.js";import"./process.js";import c from"node:path";import l from"node:crypto";var u=e({agentBrowserChromeLaunchMarker:()=>d,appendAgentDeviceChromeArgs:()=>f,inspectManagedAgentBrowserProcesses:()=>_,matchAgentBrowserChromeProcess:()=>p,recordManagedAgentBrowserProcesses:()=>v,summarizeAgentBrowserProcesses:()=>m,summarizeManagedAgentBrowserProcesses:()=>g});function d(e){let t=l.createHash(`sha256`);return t.update(c.resolve(e.stateDir)),t.update(`\0`),t.update(c.resolve(e.installDir)),`--agent-device-managed-web=${t.digest(`hex`).slice(0,16)}`}function f(e,t){let n=d(t),r=e?.trim();return r?x(r).includes(n)?r:`${r},${n}`:n}function p(e,t){if(!(e.pid===r()||!S(e.command))){if(e.command.includes(d(t)))return{process:e,reason:`launch-marker`};if(w(t).some(t=>T(e,t)))return{process:e,reason:`managed-browser-home`}}}function m(e,t){return b(e,e=>p(e,t))}function h(e,t){return p(e,t)??C(e,t)}function g(e,t){return b(e,e=>h(e,t))}async function _(e){return m(await y(),e)}async function v(e,t){let r=await y(),i=g(r,e),s=a(i.pids,r),c={count:s.length,pids:s.map(({pid:e})=>e),processes:s.map(t=>({process:t,reason:h(t,e)?.reason??`descendant`}))},l=c.processes.flatMap(({process:e})=>{let t=n(e.pid),r=o(e.pid);return t&&r?[{pid:e.pid,startTime:t,command:r,purpose:`managed-web-browser`}]:[]});return l.length>0&&t.replace({kind:`daemon`},l),c}async function y(){return await s(async()=>await i({timeoutMs:1500}))}function b(e,t){let n=e.flatMap(e=>{let n=t(e);return n?[n]:[]});return{count:n.length,pids:n.map(e=>e.process.pid),processes:n}}function x(e){return e.split(/[,\n]/).map(e=>e.trim()).filter(Boolean)}function S(e){return/\b(?:Google Chrome for Testing|Chrome for Testing|Chromium|chrome|chrome\.exe|chromium|chromium-browser|headless_shell)\b/i.test(e)}function C(e,t){if(e.pid===r()||S(e.command))return;let n=E(e.command),i=E(c.resolve(t.installDir));return n.includes(`${i}/`)?{process:e,reason:`agent-browser-daemon`}:void 0}function w(e){return t([c.join(e.homeDir,`.agent-browser`,`browsers`),c.join(e.runtimeHomeDir,`.agent-browser`,`browsers`)])}function T(e,t){let n=E(e.command),r=`${E(c.resolve(t)).replace(/\/+$/,``)}/`;return n.includes(r)}function E(e){return e.replaceAll(`\\`,`/`)}export{v as i,f as n,_ as r,u as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{cr as t}from"./sdk-batch.js";import{S as n,_ as r,p as i,s as a,w as o}from"./owner-identity.js";import{y as s}from"./exec.js";import"./command.js";import"./process.js";import c from"node:crypto";import l from"node:path";var u=e({agentBrowserChromeLaunchMarker:()=>d,appendAgentDeviceChromeArgs:()=>f,inspectManagedAgentBrowserProcesses:()=>_,matchAgentBrowserChromeProcess:()=>p,recordManagedAgentBrowserProcesses:()=>v,summarizeAgentBrowserProcesses:()=>m,summarizeManagedAgentBrowserProcesses:()=>g});function d(e){let t=c.createHash(`sha256`);return t.update(l.resolve(e.stateDir)),t.update(`\0`),t.update(l.resolve(e.installDir)),`--agent-device-managed-web=${t.digest(`hex`).slice(0,16)}`}function f(e,t){let n=d(t),r=e?.trim();return r?x(r).includes(n)?r:`${r},${n}`:n}function p(e,t){if(!(e.pid===i()||!S(e.command))){if(e.command.includes(d(t)))return{process:e,reason:`launch-marker`};if(w(t).some(t=>T(e,t)))return{process:e,reason:`managed-browser-home`}}}function m(e,t){return b(e,e=>p(e,t))}function h(e,t){return p(e,t)??C(e,t)}function g(e,t){return b(e,e=>h(e,t))}async function _(e){return m(await y(),e)}async function v(e,t){let r=await y(),i=g(r,e),s=a(i.pids,r),c={count:s.length,pids:s.map(({pid:e})=>e),processes:s.map(t=>({process:t,reason:h(t,e)?.reason??`descendant`}))},l=c.processes.flatMap(({process:e})=>{let t=o(e.pid),r=n(e.pid);return t&&r?[{pid:e.pid,startTime:t,command:r,purpose:`managed-web-browser`}]:[]});return l.length>0&&t.replace({kind:`daemon`},l),c}async function y(){return await s(async()=>await r({timeoutMs:1500}))}function b(e,t){let n=e.flatMap(e=>{let n=t(e);return n?[n]:[]});return{count:n.length,pids:n.map(e=>e.process.pid),processes:n}}function x(e){return e.split(/[,\n]/).map(e=>e.trim()).filter(Boolean)}function S(e){return/\b(?:Google Chrome for Testing|Chrome for Testing|Chromium|chrome|chrome\.exe|chromium|chromium-browser|headless_shell)\b/i.test(e)}function C(e,t){if(e.pid===i()||S(e.command))return;let n=E(e.command),r=E(l.resolve(t.installDir));return n.includes(`${r}/`)?{process:e,reason:`agent-browser-daemon`}:void 0}function w(e){return t([l.join(e.homeDir,`.agent-browser`,`browsers`),l.join(e.runtimeHomeDir,`.agent-browser`,`browsers`)])}function T(e,t){let n=E(e.command),r=`${E(l.resolve(t)).replace(/\/+$/,``)}/`;return n.includes(r)}function E(e){return e.replaceAll(`\\`,`/`)}export{v as i,f as n,_ as r,u as t};
@@ -1 +1 @@
1
- import{N as e,z as t}from"./sdk-contracts.js";import{k as n}from"./sdk-batch-runner.js";import{t as r}from"./scroll-gesture.js";import{r as i}from"./diagnostics.js";import{d as a}from"./owner-identity.js";import{n as o}from"./exec.js";import{t as s}from"./timeouts.js";import"./diagnostics2.js";import"./command.js";import"./process.js";import"./retry.js";import{n as c}from"./audio-probe-result.js";import{i as l}from"./agent-browser-process-record.js";import{n as ee}from"./agent-browser-lifecycle.js";import{i as te,n as u,r as ne}from"./agent-browser-tool.js";function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e,t){return d(e)?e[t]:void 0}function p(e,t){let n=f(e,t);return typeof n==`string`?n:void 0}function re(e,t){let n=f(e,t);return typeof n==`boolean`?n:void 0}function m(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}const ie=[g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M];function ae(e){let t=ie.map(e=>`${e.toString()};`).join(``),n=se(e.action),r=h(e.durationMs),i=h(e.bucketMs);return`(()=>{${t}return ${M.name}({action:${n},durationMs:${r},bucketMs:${i}})})()`}function oe(e){let t=c(ce(e),{source:`media-elements`,backend:`agent-browser`,durationMs:0,elapsedMs:0,bucketMs:1e3,activeFallback:!1,mediaElementCount:0,sourceCount:0});return{...t,source:`media-elements`,mediaElementCount:t.mediaElementCount??0}}function se(e){switch(e){case`start`:return`'start'`;case`stop`:return`'stop'`;default:return`'status'`}}function h(e){return e===void 0||!Number.isFinite(e)?`undefined`:String(Math.trunc(e))}function g(e){return!Number.isFinite(e)||e<=0?-90:Math.max(-90,Math.min(0,Math.round(20*Math.log10(e))))}function _(e,t){e.notes.includes(t)||e.notes.push(t)}function v(){return Array.from(document.querySelectorAll(`audio,video`))}function y(e,t){if(!e||e.state===`stopped`)return e;clearInterval(e.timer),clearTimeout(e.timeout),e.timer=void 0,e.timeout=void 0,e.state=`stopped`,e.active=!1,e.reason=t,e.stoppedAt=Date.now();for(let t of e.analysers)try{t.analyser.disconnect(),t.source.disconnect(),t.audible&&t.source.connect(e.context.destination)}catch{}if(e.resumeOnGesture){for(let t of[`click`,`pointerdown`,`keydown`])window.removeEventListener(t,e.resumeOnGesture,!0);e.resumeOnGesture=void 0}return e}function b(e){let t=window.AudioContext||window.webkitAudioContext;if(!t)return;let n=window[e];if(n&&n.state!==`closed`)return n;let r=new t;return window[e]=r,r}function x(e,t,n){if(!(!t.currentSrc&&!t.src&&t.readyState===0))try{window[n]||(window[n]=new WeakMap);let r=window[n].get(t);return r||(r=e.context.createMediaElementSource(t),window[n].set(t,r)),r.disconnect(),{source:r,audible:!0}}catch{return}}function S(e,t){if(!(!t||typeof t.getAudioTracks!=`function`)&&t.getAudioTracks().length!==0)return{source:e.context.createMediaStreamSource(t),audible:!1}}function C(e,t){if(typeof t.captureStream==`function`)return S(e,t.captureStream())}function w(e,t){let n=e.context.createAnalyser();n.fftSize=2048,t.source.connect(n),n.connect(t.audible?e.context.destination:e.sink),e.analysers.push({...t,analyser:n,buffer:new Float32Array(n.fftSize)})}function T(e,t){let n=v();e.mediaElementCount=n.length;for(let r of n){if(e.seen.has(r))continue;let n=S(e,r.srcObject)??C(e,r)??x(e,r,t);if(!n){_(e,`Some media elements do not expose capturable audio to Web Audio.`);continue}e.seen.add(r),w(e,n)}e.sourceCount=e.analysers.length,e.sourceCount===0&&_(e,`No capturable page media audio sources were found yet.`)}function E(e){let t=0,n=0,r=0;for(let i of e.analysers){i.analyser.getFloatTimeDomainData(i.buffer);for(let e of i.buffer)t+=e*e,n+=1,r=Math.max(r,Math.abs(e))}return{rms:n>0?Math.sqrt(t/n):0,peak:r}}function D(e){let t=Math.ceil(e.durationMs/e.bucketMs)+2;e.rmsDbfs.length>t&&e.rmsDbfs.splice(0,e.rmsDbfs.length-t),e.peakDbfs.length>t&&e.peakDbfs.splice(0,e.peakDbfs.length-t)}function O(e,t){if(!e||e.state!==`running`)return;T(e,t);let n=E(e),r=g(n.rms),i=g(n.peak);e.rmsDbfs.push(r),e.peakDbfs.push(i),e.heard=e.heard||r>-90||i>-90,D(e),Date.now()-e.startedAt>=e.durationMs&&y(e,`duration`)}function k(e,t){return{audio:`probe`,state:`stopped`,active:!1,heard:!1,source:`media-elements`,backend:`agent-browser`,durationMs:Number(e.durationMs)||1e4,elapsedMs:0,bucketMs:Number(e.bucketMs)||1e3,sampleCount:0,mediaElementCount:v().length,sourceCount:0,rmsDbfs:[],peakDbfs:[],notes:t}}function A(e,t,n,r){return e?{audio:`probe`,state:e.state,active:e.state===`running`,heard:e.heard,source:`media-elements`,backend:`agent-browser`,durationMs:e.durationMs,elapsedMs:Math.max(0,Math.min((e.stoppedAt||Date.now())-e.startedAt,e.durationMs)),bucketMs:e.bucketMs,sampleCount:e.rmsDbfs.length,mediaElementCount:v().length,sourceCount:e.sourceCount,rmsDbfs:e.rmsDbfs.slice(),peakDbfs:e.peakDbfs.slice(),startedAt:new Date(e.startedAt).toISOString(),stoppedAt:e.stoppedAt?new Date(e.stoppedAt).toISOString():void 0,reason:e.reason,notes:[n,r,...e.notes]}:k(t,[n,r])}function j(e,t,n,r,i,a,o){t&&y(t,`restarted`);let s=b(r);if(!s)return k(e,[`Web Audio API is not available in this browser context.`]);let c=s.createGain();c.gain.value=0,c.connect(s.destination);let l={state:`running`,active:!0,context:s,sink:c,seen:new WeakSet,analysers:[],mediaElementCount:0,sourceCount:0,durationMs:Math.max(100,Number(e.durationMs)||1e4),bucketMs:Math.max(100,Number(e.bucketMs)||1e3),startedAt:Date.now(),stoppedAt:void 0,reason:void 0,heard:!1,rmsDbfs:[],peakDbfs:[],notes:[]};try{s.resume()}catch{_(l,`AudioContext could not be resumed by the probe.`)}l.resumeOnGesture=()=>{try{s.resume()}catch{_(l,`AudioContext could not be resumed from a user gesture.`)}};for(let e of[`click`,`pointerdown`,`keydown`])window.addEventListener(e,l.resumeOnGesture,{capture:!0,once:!0});return T(l,i),l.timer=setInterval(()=>O(l,i),l.bucketMs),l.timeout=setTimeout(()=>y(l,`duration`),l.durationMs),window[n]=l,A(l,e,a,o)}function M(e){let t=`__agentDeviceAudioProbe`,n=`__agentDeviceAudioProbeSources`,r=`Audio probe samples HTML media elements exposed to Web Audio; it is not whole-tab or system audio capture.`,i=`URL-backed media elements may be routed through the probe AudioContext while they are observed.`,a=window[t];return a&&a.state===`running`&&Date.now()-a.startedAt>=a.durationMs&&(O(a,n),y(a,`duration`)),e.action===`start`?j(e,a,t,`__agentDeviceAudioProbeContext`,n,r,i):e.action===`stop`?(a&&O(a,n),y(a,`manual`),A(a,e,r,i)):(a&&O(a,n),A(a,e,r,i))}function ce(e){return d(e)?d(e.result)?e.result:e:{}}function le(e,t={}){let n=ue(e),r=me(t.limit),i=t.include===`headers`||t.include===`all`,a=n.slice(-r).reverse().map(e=>fe(e,i)),o=t.include===`body`||t.include===`all`?[`agent-browser network requests does not expose request or response bodies.`]:void 0;return{entries:a,backend:`agent-browser`,redacted:!1,...o?{notes:o}:{}}}function ue(e){let t=d(e)&&Array.isArray(e.requests)?e.requests:e;return Array.isArray(t)?t.filter(de).map(e=>({headers:N(e.headers),method:p(e,`method`),mimeType:p(e,`mimeType`),requestId:p(e,`requestId`),resourceType:p(e,`resourceType`),responseHeaders:N(e.responseHeaders),status:m(e,`status`),timestamp:pe(e.timestamp),url:p(e,`url`)})):[]}function de(e){return d(e)}function fe(e,t){let r=e.timestamp===void 0?void 0:P(e.timestamp),i=n({requestId:e.requestId,resourceType:e.resourceType,mimeType:e.mimeType});return n({timestamp:r,method:e.method,url:e.url,status:e.status,requestHeaders:t?e.headers:void 0,responseHeaders:t?e.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}function N(e){if(!d(e))return;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return Object.keys(t).length>0?t:void 0}function pe(e){if(typeof e==`number`||typeof e==`string`)return e}function P(e){if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)?P(t):e}let t=e>1e10?e:e*1e3,n=new Date(t);return Number.isNaN(n.getTime())?String(e):n.toISOString()}function me(e){return typeof e!=`number`||!Number.isInteger(e)?25:Math.max(1,Math.min(e,200))}async function he(e,t){let n=I(p(e,`snapshot`)??``,ge(f(e,`refs`)));return t&&await F(n,t),{nodes:n.map((e,t)=>({...e.node,index:t,ref:e.ref})),truncated:re(e,`truncated`)}}async function F(e,t){for(let n=0;n<e.length;n+=8){let r=e.slice(n,n+8),i=await Promise.all(r.map(e=>t(e.ref)));for(let[e,t]of i.entries())t&&(r[e].node.rect=t)}}function I(e,t){let n=new Map(t.map(e=>[e.ref,e])),r=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){let e=ye(t);if(!e)continue;i.add(e);let o=n.get(e)?.data,s=_e(t),c=L(t,o,s),l=ve(a,s);l!==void 0&&(c.parentIndex=l),r.push({ref:e,node:{...c,index:r.length}}),a.set(s,r.length-1)}for(let e of t)i.has(e.ref)||r.push({ref:e.ref,node:{...R(e.data),index:r.length}});return r}function L(e,t,n){let r=be(e)??V(t,[`role`,`type`]);return{index:0,type:r,role:r,label:xe(e)??V(t,[`label`,`name`,`text`]),value:Ce(e)??V(t,[`value`]),depth:n,enabled:H(t,[`enabled`])??(!Se(e)&&void 0),focused:H(t,[`focused`])}}function R(e){let t=V(e,[`role`,`type`]);return{index:0,type:t,role:t,label:V(e,[`label`,`name`,`text`]),value:V(e,[`value`]),enabled:H(e,[`enabled`]),focused:H(e,[`focused`])}}function ge(e){return Array.isArray(e)?e.flatMap(e=>{let t=d(e)?e:void 0,n=B(V(t,[`ref`,`id`])??String(e));return n?[{ref:n,data:t}]:[]}):d(e)?Object.entries(e).flatMap(([e,t])=>{let n=B(e);return n?[{ref:n,data:d(t)?t:void 0}]:[]}):[]}function _e(e){let t=e.match(/^\s*/)?.[0].length??0;return Math.floor(t/2)}function ve(e,t){for(let n=t-1;n>=0;--n){let t=e.get(n);if(t!==void 0)return t}}function ye(e){return B(z(e)?.match(/\bref\s*=\s*['"]?(@?e\d+)['"]?/i)?.[1]??e.match(/@?(e\d+)\b/i)?.[1])}function z(e){return e.replaceAll(/"(?:[^"\\]|\\.)*"/g,`""`).replaceAll(/'(?:[^'\\]|\\.)*'/g,`''`).match(/\[([^\]]*\bref\s*=\s*['"]?@?e\d+[^\]]*)\]\s*(?=:|$)/i)?.[1]}function B(e){let t=e?.trim().replace(/^@/,``);return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function be(e){return e.replaceAll(/\[[^\]]*ref[^\]]*\]/gi,``).replaceAll(/@?e\d+\b/gi,``).replaceAll(/^[\s|├└─>*-]+/g,``).trim().match(/^([A-Za-z][\w-]*)\b/)?.[1]}function xe(e){return e.match(/"([^"]+)"/)?.[1]??e.match(/'([^']+)'/)?.[1]}function Se(e){return/\bdisabled\b/i.test(z(e)??``)}function Ce(e){return we(e)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)}function we(e){return e.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0}function V(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function H(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`boolean`)return t}}function U(e){return typeof e==`string`}const W=`agent-browser`,G="Run `agent-device web setup` to install the managed web backend.";function Te(e={}){let t=e.session?.trim(),n=async(n,r)=>await Fe(n,{session:t,options:e,signal:r});return{async open(e){await n([`open`,e])},async close(){await n([`close`])},async startRecording(e){await n([`record`,`start`,e])},async stopRecording(){await n([`record`,`stop`])},async snapshot(e){return await je(t=>n(t,e?.signal),e)},async screenshot(e,t){await n([`screenshot`,...t?.fullscreen?[`--full`]:[],e])},async setViewport(e,t){await n([`set`,`viewport`,String(e),String(t)])},async click(e,t){await K(n,e,t)},async hover(e,t){await q(n,e,t)},async hoverRef(e){await n([`hover`,Z(e)])},async clickRef(e){await n([`click`,Z(e)])},async fill(e,t,r){if(await K(n,e,t),await n([`press`,Ue()]),r.length===0){await n([`press`,`Backspace`]);return}await n([`keyboard`,`type`,r])},async fillRef(e,t){await n([`fill`,Z(e),t])},async typeText(e){await n([`keyboard`,`type`,e])},async scroll(e,t){return await Ee(n,e,t),t?.durationMs===void 0?{}:{durationMs:t.durationMs}},async dumpNetwork(e){return le(await n([`network`,`requests`]),e)},async probeAudio(e){return oe(await n([`eval`,ae(e)]))}}}async function Ee(e,n,r){let i=Oe(De(r)),a=0;try{for(let t of i)await e(Ae(n,t.distance)),a+=1,t.delayAfterMs>0&&await s(t.delayAfterMs)}catch(e){throw t(e,a)}}function De(e){let t=e?.durationMs,n=t===void 0?{}:{durationMs:t};return e?.pixels===void 0?e?.amount===void 0?n:{distance:Math.max(1,Math.round(300*e.amount/r)),...n}:{distance:e.pixels,...n}}function Oe(e){let{distance:t,durationMs:n}=e;if(n===void 0||n<=0)return[{distance:t,delayAfterMs:0}];let r=Math.max(1,Math.min(20,Math.ceil(n/50))),i=n/Math.max(1,r-1);return ke(Math.round(t??300),r).map((e,t)=>({distance:e,delayAfterMs:t<r-1?i:0}))}function ke(e,t){let n=Math.floor(e/t),r=e-n*t;return Array.from({length:t},(e,t)=>t<r?n+1:n)}function Ae(e,t){return[`scroll`,e,...t===void 0?[]:[String(t)]]}async function K(e,t,n){await q(e,t,n),await e([`mouse`,`down`]),await e([`mouse`,`up`])}async function q(e,t,n){await e([`mouse`,`move`,String(Math.round(t)),String(Math.round(n))])}async function je(e,t){return await he(await e(Me(t)),t?.includeRects?async t=>await Ne(e,t):void 0)}function Me(e){return[`snapshot`,...e?.interactiveOnly?[`--interactive`]:[],...e?.raw?[]:[`--compact`],...typeof e?.depth==`number`?[`--depth`,String(e.depth)]:[],...e?.scope?[`--selector`,e.scope]:[]]}async function Ne(e,t){try{return We(await e([`get`,`box`,Z(t)]))}catch(e){if(Pe(e))return;throw e}}function Pe(e){let t=e instanceof Error?e.message:String(e);return!/\bstale\b/i.test(t)&&/\bbox\b|not visible|not found|no element/i.test(t)}async function Fe(e,t){let{session:n,options:r,signal:i}=t,a=[...e,`--json`,...n?[`--session`,n]:[]];return await Ie(a,r,e=>Y(ze(e.stdout,e.stderr,a,e.exitCode),e,a),i)}async function Ie(e,t,n,r){let i=``,a=``,o=0,s=!1,c=!1,l=u({stateDir:t.stateDir});try{await Re(t);let n=await te(e,{stateDir:t.stateDir,allowFailure:!0,timeoutMs:3e4,signal:r});i=n.stdout,a=n.stderr,o=n.exitCode,s=!0}catch(n){throw await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l}),Be(n,e)}try{let e=n({stdout:i,stderr:a,exitCode:o});return c=!0,e}finally{await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l})}}async function J(e){let t=e.options.ownedProcessRecords;if(!(!t||!e.status.installed))try{let n=e.options.openWebSessionNames?.()??[],r=e.options.session?.trim();Le(e,n.filter(e=>e!==r).length)?t.clear({kind:`daemon`}):await l(e.status,t)}catch(e){i({level:`warn`,phase:`web_agent_browser_process_record_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Le(e,t){return e.commandCompleted&&e.semanticSuccess&&e.cliArgs[0]===`close`&&e.exitCode===0&&t===0}async function Re(e){if(!e.openWebSessionNames)return;let t=u({stateDir:e.stateDir});if(t.installed)try{await ee(t,{openWebSessionNames:e.openWebSessionNames(),...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}catch(e){i({level:`warn`,phase:`web_agent_browser_provider_orphan_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Y(t,n,r){if(!d(t))return t;if((t.success??t.ok)===!1)throw new e(He(t.code),Ve(t),{cmd:W,args:r,hint:p(t,`hint`)??G,agentBrowserError:t.error});if(n.exitCode!==0)throw new e(`COMMAND_FAILED`,`agent-browser command failed`,o(n,{cmd:W,args:r,stdout:n.stdout.slice(0,500),stderr:n.stderr.slice(0,500),hint:p(t,`hint`)??G}));return Object.hasOwn(t,`data`)?t.data:t}function ze(t,n,r,i){try{return JSON.parse(t)}catch(a){let o=i!==0;throw new e(`COMMAND_FAILED`,o?`agent-browser command failed`:`agent-browser returned invalid JSON`,{cmd:W,args:r,...o?{exitCode:i}:{},stdout:t.slice(0,500),stderr:n.slice(0,500),hint:G},a instanceof Error?a:void 0)}}function Be(t,n){let r=ne(t);return r.code===`TOOL_MISSING`?new e(`TOOL_MISSING`,r.message,{...r.details??{},cmd:W,args:n,hint:X(r)},r):r.code===`COMMAND_FAILED`?new e(`COMMAND_FAILED`,r.message,{...r.details??{},cmd:W,args:n,hint:X(r)},r):r}function X(e){return typeof e.details?.hint==`string`?e.details.hint:G}function Ve(e){let t=e.error;if(typeof t==`string`&&t.trim())return t.trim();if(d(t)){let e=p(t,`message`)??p(t,`error`);if(e)return e}return p(e,`message`)??`agent-browser command failed`}function He(e){return typeof e==`string`&&e.length>0?e:`COMMAND_FAILED`}function Z(e){return e.startsWith(`@`)?e:`@${e}`}function Ue(){return a()===`darwin`?`Meta+a`:`Control+a`}function We(e){let t=d(e)&&d(e.box)?e.box:e;if(d(t))return Ge(t)??Ke(t)}function Ge(e){return Q(m(e,`x`),m(e,`y`),m(e,`width`),m(e,`height`))}function Ke(e){let t=m(e,`left`),n=m(e,`top`),r=m(e,`right`),i=m(e,`bottom`);return Q(t,n,$(r,t),$(i,n))}function Q(e,t,n,r){if(e!==void 0&&t!==void 0&&n!==void 0&&r!==void 0)return{x:e,y:t,width:n,height:r}}function $(e,t){return e===void 0||t===void 0?void 0:e-t}export{Te as createAgentBrowserWebProvider};
1
+ import{B as e,P as t}from"./sdk-contracts.js";import{A as n}from"./sdk-batch-runner.js";import{r}from"./diagnostics.js";import"./diagnostics2.js";import{t as i}from"./scroll-gesture.js";import{f as a}from"./owner-identity.js";import{r as o}from"./exec.js";import{t as s}from"./timeouts.js";import"./command.js";import"./process.js";import"./retry.js";import{n as c}from"./audio-probe-result.js";import{i as l}from"./agent-browser-process-record.js";import{n as ee}from"./agent-browser-lifecycle.js";import{i as te,n as u,r as ne}from"./agent-browser-tool.js";function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e,t){return d(e)?e[t]:void 0}function p(e,t){let n=f(e,t);return typeof n==`string`?n:void 0}function re(e,t){let n=f(e,t);return typeof n==`boolean`?n:void 0}function m(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}const ie=[g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M];function ae(e){let t=ie.map(e=>`${e.toString()};`).join(``),n=se(e.action),r=h(e.durationMs),i=h(e.bucketMs);return`(()=>{${t}return ${M.name}({action:${n},durationMs:${r},bucketMs:${i}})})()`}function oe(e){let t=c(ce(e),{source:`media-elements`,backend:`agent-browser`,durationMs:0,elapsedMs:0,bucketMs:1e3,activeFallback:!1,mediaElementCount:0,sourceCount:0});return{...t,source:`media-elements`,mediaElementCount:t.mediaElementCount??0}}function se(e){switch(e){case`start`:return`'start'`;case`stop`:return`'stop'`;default:return`'status'`}}function h(e){return e===void 0||!Number.isFinite(e)?`undefined`:String(Math.trunc(e))}function g(e){return!Number.isFinite(e)||e<=0?-90:Math.max(-90,Math.min(0,Math.round(20*Math.log10(e))))}function _(e,t){e.notes.includes(t)||e.notes.push(t)}function v(){return Array.from(document.querySelectorAll(`audio,video`))}function y(e,t){if(!e||e.state===`stopped`)return e;clearInterval(e.timer),clearTimeout(e.timeout),e.timer=void 0,e.timeout=void 0,e.state=`stopped`,e.active=!1,e.reason=t,e.stoppedAt=Date.now();for(let t of e.analysers)try{t.analyser.disconnect(),t.source.disconnect(),t.audible&&t.source.connect(e.context.destination)}catch{}if(e.resumeOnGesture){for(let t of[`click`,`pointerdown`,`keydown`])window.removeEventListener(t,e.resumeOnGesture,!0);e.resumeOnGesture=void 0}return e}function b(e){let t=window.AudioContext||window.webkitAudioContext;if(!t)return;let n=window[e];if(n&&n.state!==`closed`)return n;let r=new t;return window[e]=r,r}function x(e,t,n){if(!(!t.currentSrc&&!t.src&&t.readyState===0))try{window[n]||(window[n]=new WeakMap);let r=window[n].get(t);return r||(r=e.context.createMediaElementSource(t),window[n].set(t,r)),r.disconnect(),{source:r,audible:!0}}catch{return}}function S(e,t){if(!(!t||typeof t.getAudioTracks!=`function`)&&t.getAudioTracks().length!==0)return{source:e.context.createMediaStreamSource(t),audible:!1}}function C(e,t){if(typeof t.captureStream==`function`)return S(e,t.captureStream())}function w(e,t){let n=e.context.createAnalyser();n.fftSize=2048,t.source.connect(n),n.connect(t.audible?e.context.destination:e.sink),e.analysers.push({...t,analyser:n,buffer:new Float32Array(n.fftSize)})}function T(e,t){let n=v();e.mediaElementCount=n.length;for(let r of n){if(e.seen.has(r))continue;let n=S(e,r.srcObject)??C(e,r)??x(e,r,t);if(!n){_(e,`Some media elements do not expose capturable audio to Web Audio.`);continue}e.seen.add(r),w(e,n)}e.sourceCount=e.analysers.length,e.sourceCount===0&&_(e,`No capturable page media audio sources were found yet.`)}function E(e){let t=0,n=0,r=0;for(let i of e.analysers){i.analyser.getFloatTimeDomainData(i.buffer);for(let e of i.buffer)t+=e*e,n+=1,r=Math.max(r,Math.abs(e))}return{rms:n>0?Math.sqrt(t/n):0,peak:r}}function D(e){let t=Math.ceil(e.durationMs/e.bucketMs)+2;e.rmsDbfs.length>t&&e.rmsDbfs.splice(0,e.rmsDbfs.length-t),e.peakDbfs.length>t&&e.peakDbfs.splice(0,e.peakDbfs.length-t)}function O(e,t){if(!e||e.state!==`running`)return;T(e,t);let n=E(e),r=g(n.rms),i=g(n.peak);e.rmsDbfs.push(r),e.peakDbfs.push(i),e.heard=e.heard||r>-90||i>-90,D(e),Date.now()-e.startedAt>=e.durationMs&&y(e,`duration`)}function k(e,t){return{audio:`probe`,state:`stopped`,active:!1,heard:!1,source:`media-elements`,backend:`agent-browser`,durationMs:Number(e.durationMs)||1e4,elapsedMs:0,bucketMs:Number(e.bucketMs)||1e3,sampleCount:0,mediaElementCount:v().length,sourceCount:0,rmsDbfs:[],peakDbfs:[],notes:t}}function A(e,t,n,r){return e?{audio:`probe`,state:e.state,active:e.state===`running`,heard:e.heard,source:`media-elements`,backend:`agent-browser`,durationMs:e.durationMs,elapsedMs:Math.max(0,Math.min((e.stoppedAt||Date.now())-e.startedAt,e.durationMs)),bucketMs:e.bucketMs,sampleCount:e.rmsDbfs.length,mediaElementCount:v().length,sourceCount:e.sourceCount,rmsDbfs:e.rmsDbfs.slice(),peakDbfs:e.peakDbfs.slice(),startedAt:new Date(e.startedAt).toISOString(),stoppedAt:e.stoppedAt?new Date(e.stoppedAt).toISOString():void 0,reason:e.reason,notes:[n,r,...e.notes]}:k(t,[n,r])}function j(e,t,n,r,i,a,o){t&&y(t,`restarted`);let s=b(r);if(!s)return k(e,[`Web Audio API is not available in this browser context.`]);let c=s.createGain();c.gain.value=0,c.connect(s.destination);let l={state:`running`,active:!0,context:s,sink:c,seen:new WeakSet,analysers:[],mediaElementCount:0,sourceCount:0,durationMs:Math.max(100,Number(e.durationMs)||1e4),bucketMs:Math.max(100,Number(e.bucketMs)||1e3),startedAt:Date.now(),stoppedAt:void 0,reason:void 0,heard:!1,rmsDbfs:[],peakDbfs:[],notes:[]};try{s.resume()}catch{_(l,`AudioContext could not be resumed by the probe.`)}l.resumeOnGesture=()=>{try{s.resume()}catch{_(l,`AudioContext could not be resumed from a user gesture.`)}};for(let e of[`click`,`pointerdown`,`keydown`])window.addEventListener(e,l.resumeOnGesture,{capture:!0,once:!0});return T(l,i),l.timer=setInterval(()=>O(l,i),l.bucketMs),l.timeout=setTimeout(()=>y(l,`duration`),l.durationMs),window[n]=l,A(l,e,a,o)}function M(e){let t=`__agentDeviceAudioProbe`,n=`__agentDeviceAudioProbeSources`,r=`Audio probe samples HTML media elements exposed to Web Audio; it is not whole-tab or system audio capture.`,i=`URL-backed media elements may be routed through the probe AudioContext while they are observed.`,a=window[t];return a&&a.state===`running`&&Date.now()-a.startedAt>=a.durationMs&&(O(a,n),y(a,`duration`)),e.action===`start`?j(e,a,t,`__agentDeviceAudioProbeContext`,n,r,i):e.action===`stop`?(a&&O(a,n),y(a,`manual`),A(a,e,r,i)):(a&&O(a,n),A(a,e,r,i))}function ce(e){return d(e)?d(e.result)?e.result:e:{}}function le(e,t={}){let n=ue(e),r=me(t.limit),i=t.include===`headers`||t.include===`all`,a=n.slice(-r).reverse().map(e=>fe(e,i)),o=t.include===`body`||t.include===`all`?[`agent-browser network requests does not expose request or response bodies.`]:void 0;return{entries:a,backend:`agent-browser`,redacted:!1,...o?{notes:o}:{}}}function ue(e){let t=d(e)&&Array.isArray(e.requests)?e.requests:e;return Array.isArray(t)?t.filter(de).map(e=>({headers:N(e.headers),method:p(e,`method`),mimeType:p(e,`mimeType`),requestId:p(e,`requestId`),resourceType:p(e,`resourceType`),responseHeaders:N(e.responseHeaders),status:m(e,`status`),timestamp:pe(e.timestamp),url:p(e,`url`)})):[]}function de(e){return d(e)}function fe(e,t){let r=e.timestamp===void 0?void 0:P(e.timestamp),i=n({requestId:e.requestId,resourceType:e.resourceType,mimeType:e.mimeType});return n({timestamp:r,method:e.method,url:e.url,status:e.status,requestHeaders:t?e.headers:void 0,responseHeaders:t?e.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}function N(e){if(!d(e))return;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return Object.keys(t).length>0?t:void 0}function pe(e){if(typeof e==`number`||typeof e==`string`)return e}function P(e){if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)?P(t):e}let t=e>1e10?e:e*1e3,n=new Date(t);return Number.isNaN(n.getTime())?String(e):n.toISOString()}function me(e){return typeof e!=`number`||!Number.isInteger(e)?25:Math.max(1,Math.min(e,200))}async function he(e,t){let n=I(p(e,`snapshot`)??``,ge(f(e,`refs`)));return t&&await F(n,t),{nodes:n.map((e,t)=>({...e.node,index:t,ref:e.ref})),truncated:re(e,`truncated`)}}async function F(e,t){for(let n=0;n<e.length;n+=8){let r=e.slice(n,n+8),i=await Promise.all(r.map(e=>t(e.ref)));for(let[e,t]of i.entries())t&&(r[e].node.rect=t)}}function I(e,t){let n=new Map(t.map(e=>[e.ref,e])),r=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){let e=ye(t);if(!e)continue;i.add(e);let o=n.get(e)?.data,s=_e(t),c=L(t,o,s),l=ve(a,s);l!==void 0&&(c.parentIndex=l),r.push({ref:e,node:{...c,index:r.length}}),a.set(s,r.length-1)}for(let e of t)i.has(e.ref)||r.push({ref:e.ref,node:{...R(e.data),index:r.length}});return r}function L(e,t,n){let r=be(e)??V(t,[`role`,`type`]);return{index:0,type:r,role:r,label:xe(e)??V(t,[`label`,`name`,`text`]),value:Ce(e)??V(t,[`value`]),depth:n,enabled:H(t,[`enabled`])??(!Se(e)&&void 0),focused:H(t,[`focused`])}}function R(e){let t=V(e,[`role`,`type`]);return{index:0,type:t,role:t,label:V(e,[`label`,`name`,`text`]),value:V(e,[`value`]),enabled:H(e,[`enabled`]),focused:H(e,[`focused`])}}function ge(e){return Array.isArray(e)?e.flatMap(e=>{let t=d(e)?e:void 0,n=B(V(t,[`ref`,`id`])??String(e));return n?[{ref:n,data:t}]:[]}):d(e)?Object.entries(e).flatMap(([e,t])=>{let n=B(e);return n?[{ref:n,data:d(t)?t:void 0}]:[]}):[]}function _e(e){let t=e.match(/^\s*/)?.[0].length??0;return Math.floor(t/2)}function ve(e,t){for(let n=t-1;n>=0;--n){let t=e.get(n);if(t!==void 0)return t}}function ye(e){return B(z(e)?.match(/\bref\s*=\s*['"]?(@?e\d+)['"]?/i)?.[1]??e.match(/@?(e\d+)\b/i)?.[1])}function z(e){return e.replaceAll(/"(?:[^"\\]|\\.)*"/g,`""`).replaceAll(/'(?:[^'\\]|\\.)*'/g,`''`).match(/\[([^\]]*\bref\s*=\s*['"]?@?e\d+[^\]]*)\]\s*(?=:|$)/i)?.[1]}function B(e){let t=e?.trim().replace(/^@/,``);return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function be(e){return e.replaceAll(/\[[^\]]*ref[^\]]*\]/gi,``).replaceAll(/@?e\d+\b/gi,``).replaceAll(/^[\s|├└─>*-]+/g,``).trim().match(/^([A-Za-z][\w-]*)\b/)?.[1]}function xe(e){return e.match(/"([^"]+)"/)?.[1]??e.match(/'([^']+)'/)?.[1]}function Se(e){return/\bdisabled\b/i.test(z(e)??``)}function Ce(e){return we(e)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)}function we(e){return e.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0}function V(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function H(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`boolean`)return t}}function U(e){return typeof e==`string`}const W=`agent-browser`,G="Run `agent-device web setup` to install the managed web backend.";function Te(e={}){let t=e.session?.trim(),n=async(n,r)=>await Fe(n,{session:t,options:e,signal:r});return{async open(e){await n([`open`,e])},async close(){await n([`close`])},async startRecording(e){await n([`record`,`start`,e])},async stopRecording(){await n([`record`,`stop`])},async snapshot(e){return await je(t=>n(t,e?.signal),e)},async screenshot(e,t){await n([`screenshot`,...t?.fullscreen?[`--full`]:[],e])},async setViewport(e,t){await n([`set`,`viewport`,String(e),String(t)])},async click(e,t){await K(n,e,t)},async hover(e,t){await q(n,e,t)},async hoverRef(e){await n([`hover`,Z(e)])},async clickRef(e){await n([`click`,Z(e)])},async fill(e,t,r){if(await K(n,e,t),await n([`press`,Ue()]),r.length===0){await n([`press`,`Backspace`]);return}await n([`keyboard`,`type`,r])},async fillRef(e,t){await n([`fill`,Z(e),t])},async typeText(e){await n([`keyboard`,`type`,e])},async scroll(e,t){return await Ee(n,e,t),t?.durationMs===void 0?{}:{durationMs:t.durationMs}},async dumpNetwork(e){return le(await n([`network`,`requests`]),e)},async probeAudio(e){return oe(await n([`eval`,ae(e)]))}}}async function Ee(t,n,r){let i=Oe(De(r)),a=0;try{for(let e of i)await t(Ae(n,e.distance)),a+=1,e.delayAfterMs>0&&await s(e.delayAfterMs)}catch(t){throw e(t,a)}}function De(e){let t=e?.durationMs,n=t===void 0?{}:{durationMs:t};return e?.pixels===void 0?e?.amount===void 0?n:{distance:Math.max(1,Math.round(300*e.amount/i)),...n}:{distance:e.pixels,...n}}function Oe(e){let{distance:t,durationMs:n}=e;if(n===void 0||n<=0)return[{distance:t,delayAfterMs:0}];let r=Math.max(1,Math.min(20,Math.ceil(n/50))),i=n/Math.max(1,r-1);return ke(Math.round(t??300),r).map((e,t)=>({distance:e,delayAfterMs:t<r-1?i:0}))}function ke(e,t){let n=Math.floor(e/t),r=e-n*t;return Array.from({length:t},(e,t)=>t<r?n+1:n)}function Ae(e,t){return[`scroll`,e,...t===void 0?[]:[String(t)]]}async function K(e,t,n){await q(e,t,n),await e([`mouse`,`down`]),await e([`mouse`,`up`])}async function q(e,t,n){await e([`mouse`,`move`,String(Math.round(t)),String(Math.round(n))])}async function je(e,t){return await he(await e(Me(t)),t?.includeRects?async t=>await Ne(e,t):void 0)}function Me(e){return[`snapshot`,...e?.interactiveOnly?[`--interactive`]:[],...e?.raw?[]:[`--compact`],...typeof e?.depth==`number`?[`--depth`,String(e.depth)]:[],...e?.scope?[`--selector`,e.scope]:[]]}async function Ne(e,t){try{return We(await e([`get`,`box`,Z(t)]))}catch(e){if(Pe(e))return;throw e}}function Pe(e){let t=e instanceof Error?e.message:String(e);return!/\bstale\b/i.test(t)&&/\bbox\b|not visible|not found|no element/i.test(t)}async function Fe(e,t){let{session:n,options:r,signal:i}=t,a=[...e,`--json`,...n?[`--session`,n]:[]];return await Ie(a,r,e=>Y(ze(e.stdout,e.stderr,a,e.exitCode),e,a),i)}async function Ie(e,t,n,r){let i=``,a=``,o=0,s=!1,c=!1,l=u({stateDir:t.stateDir});try{await Re(t);let n=await te(e,{stateDir:t.stateDir,allowFailure:!0,timeoutMs:3e4,signal:r});i=n.stdout,a=n.stderr,o=n.exitCode,s=!0}catch(n){throw await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l}),Be(n,e)}try{let e=n({stdout:i,stderr:a,exitCode:o});return c=!0,e}finally{await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l})}}async function J(e){let t=e.options.ownedProcessRecords;if(!(!t||!e.status.installed))try{let n=e.options.openWebSessionNames?.()??[],r=e.options.session?.trim();Le(e,n.filter(e=>e!==r).length)?t.clear({kind:`daemon`}):await l(e.status,t)}catch(e){r({level:`warn`,phase:`web_agent_browser_process_record_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Le(e,t){return e.commandCompleted&&e.semanticSuccess&&e.cliArgs[0]===`close`&&e.exitCode===0&&t===0}async function Re(e){if(!e.openWebSessionNames)return;let t=u({stateDir:e.stateDir});if(t.installed)try{await ee(t,{openWebSessionNames:e.openWebSessionNames(),...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}catch(e){r({level:`warn`,phase:`web_agent_browser_provider_orphan_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Y(e,n,r){if(!d(e))return e;if((e.success??e.ok)===!1)throw new t(He(e.code),Ve(e),{cmd:W,args:r,hint:p(e,`hint`)??G,agentBrowserError:e.error});if(n.exitCode!==0)throw new t(`COMMAND_FAILED`,`agent-browser command failed`,o(n,{cmd:W,args:r,stdout:n.stdout.slice(0,500),stderr:n.stderr.slice(0,500),hint:p(e,`hint`)??G}));return Object.hasOwn(e,`data`)?e.data:e}function ze(e,n,r,i){try{return JSON.parse(e)}catch(a){let o=i!==0;throw new t(`COMMAND_FAILED`,o?`agent-browser command failed`:`agent-browser returned invalid JSON`,{cmd:W,args:r,...o?{exitCode:i}:{},stdout:e.slice(0,500),stderr:n.slice(0,500),hint:G},a instanceof Error?a:void 0)}}function Be(e,n){let r=ne(e);return r.code===`TOOL_MISSING`?new t(`TOOL_MISSING`,r.message,{...r.details??{},cmd:W,args:n,hint:X(r)},r):r.code===`COMMAND_FAILED`?new t(`COMMAND_FAILED`,r.message,{...r.details??{},cmd:W,args:n,hint:X(r)},r):r}function X(e){return typeof e.details?.hint==`string`?e.details.hint:G}function Ve(e){let t=e.error;if(typeof t==`string`&&t.trim())return t.trim();if(d(t)){let e=p(t,`message`)??p(t,`error`);if(e)return e}return p(e,`message`)??`agent-browser command failed`}function He(e){return typeof e==`string`&&e.length>0?e:`COMMAND_FAILED`}function Z(e){return e.startsWith(`@`)?e:`@${e}`}function Ue(){return a()===`darwin`?`Meta+a`:`Control+a`}function We(e){let t=d(e)&&d(e.box)?e.box:e;if(d(t))return Ge(t)??Ke(t)}function Ge(e){return Q(m(e,`x`),m(e,`y`),m(e,`width`),m(e,`height`))}function Ke(e){let t=m(e,`left`),n=m(e,`top`),r=m(e,`right`),i=m(e,`bottom`);return Q(t,n,$(r,t),$(i,n))}function Q(e,t,n,r){if(e!==void 0&&t!==void 0&&n!==void 0&&r!==void 0)return{x:e,y:t,width:n,height:r}}function $(e,t){return e===void 0||t===void 0?void 0:e-t}export{Te as createAgentBrowserWebProvider};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{N as t,P as n}from"./sdk-contracts.js";import{C as r,c as i,d as a,f as o,l as s,s as c,u as l}from"./owner-identity.js";import{c as u}from"./exec.js";import{n as d,t as f}from"./file.js";import"./command.js";import"./process.js";import{O as p,S as m,a as h,b as g,c as _,d as v,l as y,p as b,s as x,v as S}from"./host-file.js";import{n as C}from"./agent-browser-process-record.js";import{r as w}from"./agent-browser-lifecycle.js";import T from"node:path";import E from"node:crypto";async function D(e){x(e.packageRoot);let t=ee([`install`,`--prefix`,e.packageRoot,`--no-global`,`--no-audit`,`--no-fund`,`--no-save`,e.packageSpec]);await u(t.command,t.args,{env:i(),timeoutMs:e.timeoutMs})}function O(e){p(T.join(e.installDir,`manifest.json`),JSON.stringify({package:e.packageName,version:e.version,node:l(),installedAt:new Date().toISOString()},null,2))}function ee(e){if(a()!==`win32`)return{command:`npm`,args:e};let n=k(i());if(!n)throw new t(`TOOL_MISSING`,`npm not found in PATH`,{nodeExecPath:s(),hint:"Install Node.js with npm, or add npm to PATH, and run `agent-device web setup` again."});return{command:s(),args:[n,...e]}}function k(e){let t=e.npm_execpath?.trim();if(t){let e=T.resolve(t);if(T.basename(e)===`npm-cli.js`&&A(e))return e}let n=T.join(T.dirname(s()),`node_modules`,`npm`,`bin`,`npm-cli.js`);return A(n)?n:void 0}function A(e){try{return v(e).isFile()}catch{return!1}}var j=e({doctorManagedAgentBrowser:()=>R,getManagedAgentBrowserStatus:()=>z,mapManagedAgentBrowserError:()=>$,runManagedAgentBrowser:()=>I,setupManagedAgentBrowser:()=>L});const M=`0.27.1`,N=`agent-browser`,P=3e5,F=6e4;async function I(e,t){let n=z({stateDir:t.stateDir});if(!n.installed)throw J(n);return await B(n,e,t)}async function L(e){let t=z(e);X(t.nodeMajor);let n=o();return await d({acquire:()=>f({lockDirPath:T.join(t.installDir,`..`,`.agent-browser-install.lock`),owner:{pid:n,startTime:r(n),acquiredAtMs:Date.now()},timeoutMs:P,description:`managed agent-browser setup`}),task:async()=>{let t=z(e);if(t.installed)return t;x(t.installDir),await D({packageRoot:T.join(t.installDir,`package`),packageSpec:`${N}@${M}`,timeoutMs:P});let n=z(e);if(!n.entryScript)throw Y(n);return await B(n,[`install`],{timeoutMs:P}),await B(n,[`doctor`,`--offline`,`--quick`],{timeoutMs:F}),O({installDir:n.installDir,packageName:N,version:M}),await z(e)}})}async function R(e){let t=z(e);if(!t.installed)throw J(t);return{status:t,...await B(t,[`doctor`,`--offline`,`--quick`],{timeoutMs:F,allowFailure:!0})}}function z(e){let t=e.stateDir??i().AGENT_DEVICE_STATE_DIR??ne(),n=T.join(t,`tools`,`agent-browser`,M),r=K(n),a=q(n),o=W(r),s=T.join(n,`home`),c=Z(n),u=Q(n),d=o!==void 0&&U(n),f=Number.parseInt(l().replace(/^v/,``).split(`.`)[0]??`0`,10);return{version:M,stateDir:t,installDir:n,packageDir:r,binaryPath:a,entryScript:o,homeDir:s,runtimeHomeDir:c,socketDir:u,installed:d,nodeMajor:f,nodeSupported:f>=24}}async function B(e,t,n){if(!e.entryScript)throw J(e);return await u(s(),[e.entryScript,...t],{allowFailure:n.allowFailure,env:V(e,i()),timeoutMs:n.timeoutMs,signal:n.signal})}function V(e,t){return x(e.homeDir),H(e),x(e.socketDir),{...t,HOME:e.runtimeHomeDir,AGENT_BROWSER_SOCKET_DIR:e.socketDir,AGENT_BROWSER_IDLE_TIMEOUT_MS:String(w(t)),AGENT_BROWSER_ARGS:C(t.AGENT_BROWSER_ARGS,e)}}function H(e){if(e.runtimeHomeDir!==e.homeDir){x(T.dirname(e.runtimeHomeDir));try{let t=y(e.runtimeHomeDir);if(t.isSymbolicLink()&&S(e.runtimeHomeDir)===e.homeDir||t.isDirectory())return;t.isSymbolicLink()&&m(e.runtimeHomeDir)}catch(e){if(!te(e))throw e}try{h(e.homeDir,e.runtimeHomeDir)}catch{x(e.runtimeHomeDir)}}}function U(e){return _(T.join(e,`manifest.json`))}function W(e){let t;try{let n=JSON.parse(g(T.join(e,`package.json`)));t=typeof n==`object`&&n?n.bin:void 0}catch{return}let n=typeof t==`string`?t:typeof t==`object`&&t?t[N]:void 0;if(typeof n!=`string`)return;let r=T.resolve(e,n);return G(r)?r:void 0}function G(e){try{return v(e).isFile()}catch{return!1}}function K(e){return T.join(e,`package`,`node_modules`,N)}function q(e){let t=a()===`win32`?`${N}.cmd`:N;return T.join(e,`package`,`node_modules`,`.bin`,t)}function J(e){return new t(`TOOL_MISSING`,`Managed web browser backend is not installed.`,{version:M,installDir:e.installDir,hint:e.nodeSupported===!1?`Web automation requires Node 24+; current Node is ${l()}.`:"Run `agent-device web setup` to install the managed web backend."})}function Y(e){return new t(`TOOL_MISSING`,`Managed web backend install produced no runnable entry.`,{version:M,installDir:e.installDir,packageDir:e.packageDir,hint:`Remove ${e.installDir} and run \`agent-device web setup\` again.`})}function X(e){if(!(e>=24))throw new t(`UNSUPPORTED_OPERATION`,`Web automation requires Node 24 or newer.`,{currentNode:l(),requiredNodeMajor:24,hint:`Run agent-device with Node 24+ for web setup and web automation.`})}function Z(e){if(a()===`win32`)return T.join(e,`home`);let t=E.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return T.join(b(),`agent-device-web`,t)}function Q(e){let t=E.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return T.join(b(),`adw`,t)}function te(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}function ne(){return T.join(i().HOME??c(),`.agent-device`)}function $(e){let r=n(e);return r.code===`TOOL_MISSING`?new t(r.code,r.message,{...r.details??{},hint:typeof r.details?.hint==`string`?r.details.hint:"Run `agent-device web setup` to install the managed web backend."}):r}export{I as i,z as n,$ as r,j as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{F as t,P as n}from"./sdk-contracts.js";import{c as r,d as i,f as a,l as o,p as s,u as c,w as l}from"./owner-identity.js";import{l as u}from"./exec.js";import{a as d,t as f}from"./file.js";import"./command.js";import"./process.js";import{O as p,S as m,a as h,b as g,c as _,d as v,l as y,p as b,s as x,v as S}from"./host-file.js";import{n as C}from"./agent-browser-process-record.js";import{r as w}from"./agent-browser-lifecycle.js";import T from"node:crypto";import E from"node:path";async function D(e){x(e.packageRoot);let t=ee([`install`,`--prefix`,e.packageRoot,`--no-global`,`--no-audit`,`--no-fund`,`--no-save`,e.packageSpec]);await u(t.command,t.args,{env:o(),timeoutMs:e.timeoutMs})}function O(e){p(E.join(e.installDir,`manifest.json`),JSON.stringify({package:e.packageName,version:e.version,node:i(),installedAt:new Date().toISOString()},null,2))}function ee(e){if(a()!==`win32`)return{command:`npm`,args:e};let t=k(o());if(!t)throw new n(`TOOL_MISSING`,`npm not found in PATH`,{nodeExecPath:c(),hint:"Install Node.js with npm, or add npm to PATH, and run `agent-device web setup` again."});return{command:c(),args:[t,...e]}}function k(e){let t=e.npm_execpath?.trim();if(t){let e=E.resolve(t);if(E.basename(e)===`npm-cli.js`&&A(e))return e}let n=E.join(E.dirname(c()),`node_modules`,`npm`,`bin`,`npm-cli.js`);return A(n)?n:void 0}function A(e){try{return v(e).isFile()}catch{return!1}}var j=e({doctorManagedAgentBrowser:()=>R,getManagedAgentBrowserStatus:()=>z,mapManagedAgentBrowserError:()=>$,runManagedAgentBrowser:()=>I,setupManagedAgentBrowser:()=>L});const M=`0.27.1`,N=`agent-browser`,P=3e5,F=6e4;async function I(e,t){let n=z({stateDir:t.stateDir});if(!n.installed)throw J(n);return await B(n,e,t)}async function L(e){let t=z(e);X(t.nodeMajor);let n=s();return await d({acquire:()=>f({lockDirPath:E.join(t.installDir,`..`,`.agent-browser-install.lock`),owner:{pid:n,startTime:l(n),acquiredAtMs:Date.now()},timeoutMs:P,description:`managed agent-browser setup`}),task:async()=>{let t=z(e);if(t.installed)return t;x(t.installDir),await D({packageRoot:E.join(t.installDir,`package`),packageSpec:`${N}@${M}`,timeoutMs:P});let n=z(e);if(!n.entryScript)throw Y(n);return await B(n,[`install`],{timeoutMs:P}),await B(n,[`doctor`,`--offline`,`--quick`],{timeoutMs:F}),O({installDir:n.installDir,packageName:N,version:M}),await z(e)}})}async function R(e){let t=z(e);if(!t.installed)throw J(t);return{status:t,...await B(t,[`doctor`,`--offline`,`--quick`],{timeoutMs:F,allowFailure:!0})}}function z(e){let t=e.stateDir??o().AGENT_DEVICE_STATE_DIR??ne(),n=E.join(t,`tools`,`agent-browser`,M),r=K(n),a=q(n),s=W(r),c=E.join(n,`home`),l=Z(n),u=Q(n),d=s!==void 0&&U(n),f=Number.parseInt(i().replace(/^v/,``).split(`.`)[0]??`0`,10);return{version:M,stateDir:t,installDir:n,packageDir:r,binaryPath:a,entryScript:s,homeDir:c,runtimeHomeDir:l,socketDir:u,installed:d,nodeMajor:f,nodeSupported:f>=24}}async function B(e,t,n){if(!e.entryScript)throw J(e);return await u(c(),[e.entryScript,...t],{allowFailure:n.allowFailure,env:V(e,o()),timeoutMs:n.timeoutMs,signal:n.signal})}function V(e,t){return x(e.homeDir),H(e),x(e.socketDir),{...t,HOME:e.runtimeHomeDir,AGENT_BROWSER_SOCKET_DIR:e.socketDir,AGENT_BROWSER_IDLE_TIMEOUT_MS:String(w(t)),AGENT_BROWSER_ARGS:C(t.AGENT_BROWSER_ARGS,e)}}function H(e){if(e.runtimeHomeDir!==e.homeDir){x(E.dirname(e.runtimeHomeDir));try{let t=y(e.runtimeHomeDir);if(t.isSymbolicLink()&&S(e.runtimeHomeDir)===e.homeDir||t.isDirectory())return;t.isSymbolicLink()&&m(e.runtimeHomeDir)}catch(e){if(!te(e))throw e}try{h(e.homeDir,e.runtimeHomeDir)}catch{x(e.runtimeHomeDir)}}}function U(e){return _(E.join(e,`manifest.json`))}function W(e){let t;try{let n=JSON.parse(g(E.join(e,`package.json`)));t=typeof n==`object`&&n?n.bin:void 0}catch{return}let n=typeof t==`string`?t:typeof t==`object`&&t?t[N]:void 0;if(typeof n!=`string`)return;let r=E.resolve(e,n);return G(r)?r:void 0}function G(e){try{return v(e).isFile()}catch{return!1}}function K(e){return E.join(e,`package`,`node_modules`,N)}function q(e){let t=a()===`win32`?`${N}.cmd`:N;return E.join(e,`package`,`node_modules`,`.bin`,t)}function J(e){return new n(`TOOL_MISSING`,`Managed web browser backend is not installed.`,{version:M,installDir:e.installDir,hint:e.nodeSupported===!1?`Web automation requires Node 24+; current Node is ${i()}.`:"Run `agent-device web setup` to install the managed web backend."})}function Y(e){return new n(`TOOL_MISSING`,`Managed web backend install produced no runnable entry.`,{version:M,installDir:e.installDir,packageDir:e.packageDir,hint:`Remove ${e.installDir} and run \`agent-device web setup\` again.`})}function X(e){if(!(e>=24))throw new n(`UNSUPPORTED_OPERATION`,`Web automation requires Node 24 or newer.`,{currentNode:i(),requiredNodeMajor:24,hint:`Run agent-device with Node 24+ for web setup and web automation.`})}function Z(e){if(a()===`win32`)return E.join(e,`home`);let t=T.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return E.join(b(),`agent-device-web`,t)}function Q(e){let t=T.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return E.join(b(),`adw`,t)}function te(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}function ne(){return E.join(o().HOME??r(),`.agent-device`)}function $(e){let r=t(e);return r.code===`TOOL_MISSING`?new n(r.code,r.message,{...r.details??{},hint:typeof r.details?.hint==`string`?r.details.hint:"Run `agent-device web setup` to install the managed web backend."}):r}export{I as i,z as n,$ as r,j as t};
@@ -1,3 +1,3 @@
1
- import{r as e}from"./rolldown-runtime.js";import{$ as t,N as n,c as r,nt as i,s as a}from"./sdk-contracts.js";import"./capture.js";import{n as o}from"./snapshot-capture-annotations.js";import{C as s,D as c,E as l,S as u,T as d,_ as f,b as p,g as ee,k as m,w as te,x as h}from"./sdk-batch-runner.js";import{n as ne}from"./snapshot-diagnostics.js";import{_ as re,d as ie,u as ae,v as g}from"./sdk-device.js";import{a as oe,o as se,p as ce}from"./lease-scope.js";import{T as le,on as ue}from"./sdk-batch.js";import{n as _,t as v}from"./catalog.js";import{B as de,T as fe,i as pe,z as me}from"./registry.js";import{n as he}from"./success-text.js";import{c as y,n as ge,r as _e}from"./diagnostics.js";import{t as b}from"./command-metadata.js";import"./diagnostics2.js";import{g as x,i as ve,l as ye}from"./daemon-client-transport.js";import{t as S}from"./daemon-resolution.js";import{a as be,i as xe,n as Se,o as Ce,r as we,s as Te,t as C}from"./daemon-client-lifecycle.js";import{r as w}from"./session-paths.js";import{n as T,t as E}from"./client-metro.js";import{t as D}from"./screenshot-result.js";import O from"node:path";import k from"node:fs";function A(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function j(e,t,n){return{deviceId:t,deviceName:n,...g(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function M(e,t){let n=u(e,`bundleId`),r=u(e,`package`);return{app:l(e,`app`),appPath:l(e,`appPath`),platform:d(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:A({session:t,bundleId:n,packageName:r})}}function Ee(e,t){let r=u(e,`bundleId`),i=u(e,`packageName`),a=r??i??u(e,`appId`),o=u(e,`launchTarget`)??i??r??a;if(!o)throw new n(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:e});return{appName:u(e,`appName`),appId:a,bundleId:r,packageName:i,launchTarget:o,installablePath:u(e,`installablePath`),archivePath:u(e,`archivePath`),materializationId:u(e,`materializationId`),materializationExpiresAt:u(e,`materializationExpiresAt`),identifiers:A({session:t,bundleId:r,packageName:i,appId:a})}}function De(e){return{released:e.released===!0,materializationId:l(e,`materializationId`),identifiers:{}}}function N(e){let{record:t,platform:n,id:r,name:i,target:a}=F(e,`name`),o=P(t);return{platform:n,target:a,kind:s(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...ie(n)&&o?{appleOs:o}:{},identifiers:j(n,r,i),...Oe(t),...I(n,r)}}function Oe(e){let t=e.claimedBy;if(!t||typeof t!=`object`||Array.isArray(t))return{};let n=t,r=n.session,i=n.workspace;return typeof r!=`string`||typeof i!=`string`?{}:{claimedBy:{session:r,workspace:i}}}function ke(e){let{record:t,platform:n,id:r,name:i,target:a}=F(e,`name`),o=l(t,`device`),s=P(t),c={session:i,...j(n,r,o)};return{name:i,address:u(t,`address`),createdAt:te(t,`createdAt`),sessionStateDir:u(t,`sessionStateDir`),runnerLogPath:u(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...s?{appleOs:s}:{},identifiers:c,...I(n,r,{simulatorSetPath:h(t,`ios_simulator_device_set`)})},identifiers:c}}function P(e){let t=e.appleOs;return ae(t)?t:void 0}function F(e,t){let n=ee(e);return{record:n,platform:d(n,`platform`),id:l(n,`id`),name:l(n,t),target:p(n,`target`)}}function I(e,t,n={}){if(e===`ios`)return{ios:{udid:t,...n.simulatorSetPath===void 0?{}:{simulatorSetPath:n.simulatorSetPath}}};if(!g(e))return{};let r=n.serial??t;return e===`android`?{android:{serial:r}}:e===`harmonyos`?{harmonyos:{serial:r}}:{vega:{serial:r}}}function Ae(e){if(!f(e))return;let t=e.platform,n=u(e,`metroHost`),i=typeof e.metroPort==`number`?e.metroPort:void 0,a=u(e,`bundleUrl`),o=u(e,`launchUrl`);return{platform:r(t)?t:void 0,metroHost:n,metroPort:i,bundleUrl:a,launchUrl:o}}function je(e){let t=e.platform,n=u(e,`id`),r=u(e,`device`);if(!re(t)||!n||!r)return;let i=p(e,`target`),a=g(t)?u(e,`serial`)??n:void 0;return{platform:t,target:i,id:n,name:r,identifiers:{...j(t,n,r),...a?{serial:a}:{}},...I(t,t===`ios`?u(e,`device_udid`)??n:n,{simulatorSetPath:h(e,`ios_simulator_device_set`),serial:a})}}const Me=[`explicit-selector`,`existing-session`,`single-booted-local`,`single-bootable-local`,`single-app-installed-local`,`preferred-local`,`single-provider-device`],Ne=[`session`,`local`,`provider`];function Pe(e){if(!f(e))return;let{reason:t,source:n,candidateCount:r,bootOccurred:i}=e;if(!(!Me.includes(t)||!Ne.includes(n)||typeof r!=`number`||!Number.isInteger(r)||r<0||typeof i!=`boolean`))return{reason:t,source:n,candidateCount:r,bootOccurred:i}}function Fe(e){if(f(e)&&typeof e.durationMs==`number`&&typeof e.measuredAt==`string`&&typeof e.method==`string`)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:u(e,`appTarget`),appBundleId:u(e,`appBundleId`)}}function L(e){if(!f(e)||typeof e.success!=`boolean`||typeof e.exitCode!=`number`||typeof e.stdout!=`string`||typeof e.stderr!=`string`)return;let t=R(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}const Ie=[`hint`,`diagnosticId`,`logPath`,`supportedOn`];function R(e){if(!f(e)||typeof e.code!=`string`||typeof e.message!=`string`)return;let t={code:e.code,message:e.message};Object.assign(t,Le(e.cause));for(let n of Ie){let r=e[n];typeof r==`string`&&(t[n]=r)}return f(e.details)&&(t.details=e.details),typeof e.retriable==`boolean`&&(t.retriable=e.retriable),t}function Le(e){let t=i(e);return t?{cause:t}:void 0}function Re(e){let t=R(e.initialSnapshotError);return{...e.snapshot&&typeof e.snapshot==`object`?{snapshot:e.snapshot}:{},...t?{initialSnapshotError:t}:{}}}function ze(e){return Array.isArray(e)?e:[]}function Be(e){let t=oe(e);return m({requestId:e.requestId,cwd:e.cwd,sessionExplicit:e.session!==void 0,debug:e.debug,includeCost:e.cost,responseLevel:e.responseLevel,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform,...ce(t),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function z(e){return e??`default`}const B={...pe(),batch:fe(Ve)};async function Ve(e,t,r){let i=B[e];if(!i)throw Error(`Missing daemon writer for batch command: ${e}`);let a=b(e);if(!a)throw Error(`Missing command metadata for batch command: ${e}`);try{return await V(i,a,a.readInput(t))}catch(t){let i=t instanceof Error?t.message:String(t);throw new n(`INVALID_ARGS`,`Batch step ${r} ${e} input is invalid: ${i}`,void 0,t)}}async function He(e,t){let n=B[e];if(!n)throw Error(`Missing daemon writer for command: ${e}`);return await V(n,b(e),t)}async function V(e,t,n){let r=await e(n);return{...r,...t?{metadataFlags:de(t,r.options)}:{}}}async function H(e,t={}){let n=e.meta?.requestId??ge(),r=!!(e.meta?.debug||e.flags?.verbose),i=e.flags,{daemonAuthToken:a,...o}=i??{},s=i?{...e,flags:o}:e,c=Te(s,t.authToken??a),l=ue(le(s.command),s),u=await y(`daemon_startup`,async()=>await xe(c),{requestId:n,session:e.session}),d=u.info,f=await Qe(d,c,s);Xe(s.command);let p=Ue(s,f,d.token,n,r);return _e({level:`info`,phase:`daemon_request_prepare`,data:{requestId:n,command:s.command,session:s.session}}),await qe(s,u,c,async()=>Ye(Je(await y(`daemon_request`,async()=>await ve(d,p,c.transportPreference,c.paths,l,{onProgress:t.onProgress}),{requestId:n,command:e.command}),c),s,c))}function Ue(e,t,n,r,i){return{...e,positionals:t.positionals,flags:t.flags,token:n,meta:We(e,t,r,i)}}function We(e,t,n,r){let i=e.meta??{};return{...i,requestId:n,debug:r,...Ge(i,e.flags),...Ke(t)}}function Ge(e,t){return{includeCost:e.includeCost,cwd:e.cwd,sessionExplicit:e.sessionExplicit,tenantId:e.tenantId??t?.tenant,runId:e.runId??t?.runId,leaseId:e.leaseId??t?.leaseId,sessionIsolation:e.sessionIsolation??t?.sessionIsolation,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform}}function Ke(e){return{...e.uploadedArtifactId?{uploadedArtifactId:e.uploadedArtifactId}:{},...e.clientArtifactPaths?{clientArtifactPaths:e.clientArtifactPaths}:{},...e.installSource?{installSource:e.installSource}:{}}}async function qe(e,t,r,i){let a,o=!1,s;try{a=await i()}catch(e){o=!0,s=e}let c=await we(e,t,r,a);if(o)throw s;if(!c)throw new n(`COMMAND_FAILED`,`Daemon request produced no response after cleanup`);return c}function Je(e,t){return e.ok||!t.ownedStateDir||!Ce(e)?e:Se(e,t.paths.baseDir)}function Ye(e,t,n){return!e.ok||!be(t,e)?e:C(e,n.ownedStateDir?n.paths.baseDir:void 0)}function Xe(e){!Ze(e)||process.stderr.isTTY!==!0||process.env.CI||process.stderr.write(e===_.reinstall?`Reinstalling...
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t,at as n,c as r,l as i,nt as a}from"./sdk-contracts.js";import"./capture.js";import{n as o}from"./snapshot-capture-annotations.js";import{A as s,C as c,D as l,E as u,O as d,S as f,T as p,_ as m,v as h,w as g,x as _}from"./sdk-batch-runner.js";import{n as ee}from"./snapshot-diagnostics.js";import{c as v,n as y,r as te}from"./diagnostics.js";import"./diagnostics2.js";import{_ as ne,d as re,u as ie,v as b}from"./sdk-device.js";import{a as ae,o as x,p as oe}from"./lease-scope.js";import{Qr as se,T as ce,on as le}from"./sdk-batch.js";import{n as S,t as C}from"./catalog.js";import{B as ue,E as de,V as fe,i as pe}from"./registry.js";import{n as me}from"./success-text.js";import{t as w}from"./command-metadata.js";import{r as T}from"./daemon-artifacts.js";import{a as he,r as E,s as D}from"./daemon-client-transport.js";import{r as ge}from"./session-paths.js";import{t as O}from"./daemon-resolution.js";import{n as _e,t as ve}from"./client-metro.js";import{t as ye}from"./screenshot-result.js";import k from"node:fs";import A from"node:path";function j(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function M(e,t,n){return{deviceId:t,deviceName:n,...b(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function N(e,t){let n=c(e,`bundleId`),r=c(e,`package`);return{app:l(e,`app`),appPath:l(e,`appPath`),platform:u(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:j({session:t,bundleId:n,packageName:r})}}function be(e,n){let r=c(e,`bundleId`),i=c(e,`packageName`),a=r??i??c(e,`appId`),o=c(e,`launchTarget`)??i??r??a;if(!o)throw new t(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:e});return{appName:c(e,`appName`),appId:a,bundleId:r,packageName:i,launchTarget:o,installablePath:c(e,`installablePath`),archivePath:c(e,`archivePath`),materializationId:c(e,`materializationId`),materializationExpiresAt:c(e,`materializationExpiresAt`),identifiers:j({session:n,bundleId:r,packageName:i,appId:a})}}function xe(e){return{released:e.released===!0,materializationId:l(e,`materializationId`),identifiers:{}}}function P(e){let{record:t,platform:n,id:r,name:i,target:a}=I(e,`name`),o=F(t);return{platform:n,target:a,kind:g(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...re(n)&&o?{appleOs:o}:{},...Se(t),identifiers:M(n,r,i),...Ce(t),...L(n,r)}}function Se(e){let t=c(e,`model`),n=c(e,`osVersion`);return{...t?{model:t}:{},...n?{osVersion:n}:{}}}function Ce(e){let t=e.claimedBy;if(!t||typeof t!=`object`||Array.isArray(t))return{};let n=t,r=n.session,i=n.workspace;return typeof r!=`string`||typeof i!=`string`?{}:{claimedBy:{session:r,workspace:i}}}function we(e){let{record:t,platform:n,id:r,name:i,target:a}=I(e,`name`),o=l(t,`device`),s=F(t),u={session:i,...M(n,r,o)};return{name:i,address:c(t,`address`),createdAt:p(t,`createdAt`),sessionStateDir:c(t,`sessionStateDir`),runnerLogPath:c(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...s?{appleOs:s}:{},identifiers:u,...L(n,r,{simulatorSetPath:f(t,`ios_simulator_device_set`)})},identifiers:u}}function F(e){let t=e.appleOs;return ie(t)?t:void 0}function I(e,t){let n=m(e);return{record:n,platform:u(n,`platform`),id:l(n,`id`),name:l(n,t),target:_(n,`target`)}}function L(e,t,n={}){if(e===`ios`)return{ios:{udid:t,...n.simulatorSetPath===void 0?{}:{simulatorSetPath:n.simulatorSetPath}}};if(!b(e))return{};let r=n.serial??t;return e===`android`?{android:{serial:r}}:e===`harmonyos`?{harmonyos:{serial:r}}:{vega:{serial:r}}}function Te(e){if(!h(e))return;let t=e.platform,n=c(e,`metroHost`),r=typeof e.metroPort==`number`?e.metroPort:void 0,a=c(e,`bundleUrl`),o=c(e,`launchUrl`);return{platform:i(t)?t:void 0,metroHost:n,metroPort:r,bundleUrl:a,launchUrl:o}}function Ee(e){let t=e.platform,n=c(e,`id`),r=c(e,`device`);if(!ne(t)||!n||!r)return;let i=_(e,`target`),a=b(t)?c(e,`serial`)??n:void 0;return{platform:t,target:i,id:n,name:r,identifiers:{...M(t,n,r),...a?{serial:a}:{}},...L(t,t===`ios`?c(e,`device_udid`)??n:n,{simulatorSetPath:f(e,`ios_simulator_device_set`),serial:a})}}const De=[`explicit-selector`,`existing-session`,`single-booted-local`,`single-bootable-local`,`single-app-installed-local`,`preferred-local`,`single-provider-device`],Oe=[`session`,`local`,`provider`];function ke(e){if(!h(e))return;let{reason:t,source:n,candidateCount:r,bootOccurred:i}=e;if(!(!De.includes(t)||!Oe.includes(n)||typeof r!=`number`||!Number.isInteger(r)||r<0||typeof i!=`boolean`))return{reason:t,source:n,candidateCount:r,bootOccurred:i}}function Ae(e){if(h(e)&&typeof e.durationMs==`number`&&typeof e.measuredAt==`string`&&typeof e.method==`string`)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:c(e,`appTarget`),appBundleId:c(e,`appBundleId`)}}function R(e){if(!h(e)||typeof e.success!=`boolean`||typeof e.exitCode!=`number`||typeof e.stdout!=`string`||typeof e.stderr!=`string`)return;let t=z(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}const je=[`hint`,`diagnosticId`,`logPath`,`supportedOn`];function z(e){if(!h(e)||typeof e.code!=`string`||typeof e.message!=`string`)return;let t={code:e.code,message:e.message};Object.assign(t,Me(e.cause));for(let n of je){let r=e[n];typeof r==`string`&&(t[n]=r)}return h(e.details)&&(t.details=e.details),typeof e.retriable==`boolean`&&(t.retriable=e.retriable),t}function Me(e){let t=n(e);return t?{cause:t}:void 0}function Ne(e){let t=z(e.initialSnapshotError);return{...e.snapshot&&typeof e.snapshot==`object`?{snapshot:e.snapshot}:{},...t?{initialSnapshotError:t}:{}}}function Pe(e){return Array.isArray(e)?e:[]}function Fe(e){let t=ae(e);return s({requestId:e.requestId,cwd:e.cwd,sessionExplicit:e.session!==void 0,debug:e.debug,includeCost:e.cost,responseLevel:e.responseLevel,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform,...oe(t),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function B(e){return e??`default`}const V={...pe(),batch:de(Ie)};async function Ie(e,n,r){let i=V[e];if(!i)throw Error(`Missing daemon writer for batch command: ${e}`);let a=w(e);if(!a)throw Error(`Missing command metadata for batch command: ${e}`);try{return await H(i,a,a.readInput(n))}catch(n){let i=n instanceof Error?n.message:String(n);throw new t(`INVALID_ARGS`,`Batch step ${r} ${e} input is invalid: ${i}`,void 0,n)}}async function Le(e,t){let n=V[e];if(!n)throw Error(`Missing daemon writer for command: ${e}`);return await H(n,w(e),t)}async function H(e,t,n){let r=await e(n);return{...r,...t?{metadataFlags:fe(t,r.options)}:{}}}async function U(e,t={}){let{resolveClientSettings:n,ensureDaemon:r,attachSessionAddressHints:i}=await import(`./daemon-client-lifecycle.js`),a=e.meta?.requestId??y(),o=!!(e.meta?.debug||e.flags?.verbose),s=e.flags,{daemonAuthToken:c,...l}=s??{},u=s?{...e,flags:l}:e,d=n(u,t.authToken??c),f=le(ce(u.command),u),p=E({signal:t.signal,requestId:a});p.refuseIfAborted();let m=await p.guard(async()=>await v(`daemon_startup`,async()=>await r(d),{requestId:a,session:e.session})),h=m.info,g=await p.guard(async()=>await qe(h,d,u,t.signal));Ge(u.command);let _=Re(u,g,h,a,o,await ze(u,h));return te({level:`info`,phase:`daemon_request_prepare`,data:{requestId:a,command:u.command,session:u.session}}),await We(u,m,d,async()=>{let n=await v(`daemon_request`,async()=>await he(h,_,d.transportPreference,d.paths,f,{onProgress:t.onProgress,signal:t.signal}),{requestId:a,command:e.command});return i(n,u,d)})}function Re(e,t,n,r,i,a){return{...e,positionals:t.positionals,flags:t.flags,token:n.token,meta:{...Ve(e,t,r,i),...Be(n),providerCredentialFingerprint:a}}}async function ze(e,t){if(D(t)||e.command!==`lease_allocate`)return;let{leaseProvider:n,leaseBackend:r}=x(e);if(!n)return;let{providerCredentialFingerprint:i}=await import(`./provider-credential-fingerprint.js`).then(e=>e.t);return i(n,process.env,r)}function Be(e){let t=process.env.DEVELOPER_DIR;return D(e)?{developerDir:void 0}:t===void 0?{}:{developerDir:t}}function Ve(e,t,n,r){let i=e.meta??{};return{...i,requestId:n,debug:r,...He(i,e.flags),...Ue(t)}}function He(e,t){return{includeCost:e.includeCost,cwd:e.cwd,sessionExplicit:e.sessionExplicit,tenantId:e.tenantId??t?.tenant,runId:e.runId??t?.runId,leaseId:e.leaseId??t?.leaseId,sessionIsolation:e.sessionIsolation??t?.sessionIsolation,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform}}function Ue(e){return{...e.uploadedArtifactId?{uploadedArtifactId:e.uploadedArtifactId}:{},...e.clientArtifactPaths?{clientArtifactPaths:e.clientArtifactPaths}:{},...e.installSource?{installSource:e.installSource}:{}}}async function We(e,n,r,i){let a,o=!1,s;try{a=await i()}catch(e){o=!0,s=e}let{cleanupDaemonAfterRequest:c}=await import(`./daemon-client-lifecycle.js`),l=await c(e,n,r,a);if(o)throw s;if(!l)throw new t(`COMMAND_FAILED`,`Daemon request produced no response after cleanup`);return l}function Ge(e){!Ke(e)||process.stderr.isTTY!==!0||process.env.CI||process.stderr.write(e===S.reinstall?`Reinstalling...
2
2
  `:`Installing...
3
- `)}function Ze(e){return e===_.install||e===_.reinstall||e===v.installSource}async function Qe(e,t,n){let r=se(n);if(!ye(e)||!r.leaseId)return await x(n,e,new AbortController().signal);let{buildUploadLeaseHeartbeat:i,runProtectedLeaseWork:a}=await import(`./daemon-client-lease-beat.js`);return await a({heartbeat:i(e,t,n),task:t=>x(n,e,t)})}function U(e,t){return O.join(e,`metro-sessions`,`${w(t)}.json`)}function W(e){let t=U(e.stateDir,e.session);k.mkdirSync(O.dirname(t),{recursive:!0}),k.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function $e(e){let t=U(e.stateDir,e.session),n;try{n=k.readFileSync(t,`utf8`)}catch{return}let r;try{r=JSON.parse(n)}catch{return}if(!r||typeof r!=`object`||Array.isArray(r))return;let i=r,a={};return typeof i.metroHost==`string`&&i.metroHost&&(a.metroHost=i.metroHost),typeof i.metroPort==`number`&&Number.isInteger(i.metroPort)&&(a.metroPort=i.metroPort),typeof i.bundleUrl==`string`&&i.bundleUrl&&(a.bundleUrl=i.bundleUrl),Object.keys(a).length>0?a:void 0}function G(e){k.rmSync(U(e.stateDir,e.session),{force:!0})}function et(e){let t=async(t,n)=>await e(v.humanControl,t,n);return{allocate:async t=>q(await e(v.leaseAllocate,[],{...t,leaseId:void 0})),heartbeat:async t=>q(await e(v.leaseHeartbeat,[],t)),release:async t=>{let n=await e(v.leaseRelease,[],t);return{released:n.released===!0,provider:f(n.provider)?n.provider:void 0}},humanControl:{list:async e=>{let r=await t([`list`],e);if(!Array.isArray(r.holds))throw new n(`COMMAND_FAILED`,`Daemon did not return human-control holds.`);return r.holds.map(K)},put:async(e,n={},r)=>K((await t([`put`,e,JSON.stringify(n)],r)).hold),remove:async(e,n)=>(await t([`remove`,e],n)).released===!0}}}function K(e){if(!f(e)||!f(e.scope)||e.state!==`active`&&e.state!==`activating`||typeof e.createdAt!=`number`||typeof e.updatedAt!=`number`)throw new n(`COMMAND_FAILED`,`Daemon returned an invalid human-control hold.`);return{id:l(e,`id`),scope:{backend:l(e.scope,`backend`),leaseProvider:u(e.scope,`leaseProvider`),deviceKey:l(e.scope,`deviceKey`)},state:e.state,reason:u(e,`reason`),createdAt:e.createdAt,updatedAt:e.updatedAt,...typeof e.expiresAt==`number`?{expiresAt:e.expiresAt}:{}}}function q(e){let t=e.lease;if(!f(t))throw Error(`Invalid lease response from daemon`);return{leaseId:l(t,`leaseId`),tenantId:l(t,`tenantId`),runId:l(t,`runId`),backend:l(t,`backend`),leaseProvider:u(t,`leaseProvider`),clientId:u(t,`clientId`),deviceKey:u(t,`deviceKey`),createdAt:typeof t.createdAt==`number`?t.createdAt:void 0,heartbeatAt:typeof t.heartbeatAt==`number`?t.heartbeatAt:void 0,expiresAt:typeof t.expiresAt==`number`?t.expiresAt:void 0}}var tt=e({createAgentDeviceClient:()=>J});function J(e={},r={}){let i=r.transport??H,o=t=>a(t.responseLevel??e.responseLevel),s=async(n,r=[],a={},o,s)=>{let c=Q(e,a),l={session:z(c.session),command:n,positionals:r,...s?{input:s}:{},flags:me(c,o),runtime:c.runtime,meta:Be(c)},u=await i(l,{authToken:c.daemonAuthToken});return u.ok||t(u.error),u.data??{}},c=async(e={})=>{let t=await s(v.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(ke)},d=async(e,t={})=>{let n=await He(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},f=(t={})=>z(Q(e,t).session);return{command:{wait:async e=>await d(`wait`,e),alert:async(e={})=>await d(`alert`,e),appState:async(e={})=>await d(`appstate`,e),back:async(e={})=>await d(`back`,e),home:async(e={})=>await d(`home`,e),orientation:async e=>await d(`orientation`,e),fold:async e=>await d(`fold`,e),appSwitcher:async(e={})=>await d(`app-switcher`,e),actionButton:async(e={})=>await d(`action-button`,e),keyboard:async(e={})=>await d(`keyboard`,e),clipboard:async e=>await d(`clipboard`,e),tvRemote:async e=>await d(`tv-remote`,e),reactNative:async e=>await d(`react-native`,e),doctor:async(e={})=>await d(`doctor`,e),prepare:async e=>await d(`prepare`,e),viewport:async e=>await d(`viewport`,e)},devices:{list:async(e={})=>{let t=await d(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(N)},capabilities:async(e={})=>{let t=await d(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:N(t.device),availableCommands:n}},boot:async(e={})=>await d(`boot`,e),shutdown:async(e={})=>await d(`shutdown`,e)},sessions:{list:async(e={})=>await c(e),stateDir:async(t={})=>{let n=Q(e,t);return S(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir},close:async(t={})=>{let n=f(t);try{let e=await d(`close`,t);return{session:n,shutdown:L(e.shutdown),provider:Z(e.provider),savedScript:u(e,`savedScript`),identifiers:{session:n}}}finally{mt(e,t)}},saveScript:async(e={})=>{let t=await s(v.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),r=t.actionCount;if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw new n(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let i=l(t,`session`);return{session:i,savedScript:l(t,`savedScript`),actionCount:r,identifiers:{session:i}}},artifacts:async(e={})=>await d(`artifacts`,e)},apps:{install:async e=>M(await d(`install`,e),f(e)),reinstall:async e=>M(await d(`reinstall`,e),f(e)),installFromSource:async e=>Ee(await d(`install-from-source`,e),f(e)),list:async(e={})=>{let t=await d(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=f(t),r=await d(`open`,t);pt({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=je(r),a=u(r,`appBundleId`),o=a,s=he(r);return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:u(r,`sessionStateDir`),runnerLogPath:u(r,`runnerLogPath`),requestLogPath:u(r,`requestLogPath`),eventLogPath:u(r,`eventLogPath`),appName:u(r,`appName`),appBundleId:a,appId:o,selection:Pe(r.selection),startup:Fe(r.startup),runtime:Ae(r.runtime),device:i,...Re(r),identifiers:{session:n,deviceId:i?.id,deviceName:i?.name,udid:i?.ios?.udid,serial:i?.android?.serial,appId:o,appBundleId:a}}},close:async(e={})=>{let t=f(e),n=await d(`close`,e);return{session:t,closedApp:e.app,shutdown:L(n.shutdown),savedScript:u(n,`savedScript`),identifiers:{session:t}}},push:async e=>await d(`push`,e),triggerEvent:async e=>await d(`trigger-app-event`,e)},materializations:{release:async e=>De(await s(v.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:et(s),metro:{prepare:async t=>{let n=await E({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath});return ut(e,n),n},reload:async(t={})=>await T({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??dt(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=f(e),n=await d(`snapshot`,e);return o(e)?n:ct(n,t)},screenshot:async(e={})=>{let t=f(e),n=await d(`screenshot`,e);return o(e)?n:D(n,t)},diff:async e=>await d(`diff`,e)},interactions:{click:async e=>await d(`click`,e),press:async e=>await d(`press`,e),longPress:async e=>await d(`longpress`,e),hover:async e=>await d(`hover`,e),swipe:async e=>await d(`swipe`,e),pan:async e=>await d(`gesture`,nt(e)),drag:async e=>await d(`gesture`,rt(e)),fling:async e=>await d(`gesture`,it(e)),swipeGesture:async e=>await d(`gesture`,at(e)),focus:async e=>await d(`focus`,e),type:async e=>await d(`type`,e),fill:async e=>await d(`fill`,e),scroll:async e=>await d(`scroll`,e),pinch:async e=>await d(`gesture`,Y(e)),rotateGesture:async e=>await d(`gesture`,ot(e)),transformGesture:async e=>await d(`gesture`,st(e)),get:async e=>await d(`get`,e),is:async e=>await d(`is`,e),find:async e=>await d(`find`,e)},replay:{run:async e=>await d(`replay`,e),test:async e=>await d(`test`,e)},batch:{run:async e=>await d(`batch`,e)},observability:{perf:async e=>await d(`perf`,e),logs:async(e={})=>await d(`logs`,e),events:async(e={})=>await d(`events`,e),network:async(e={})=>await d(`network`,e),audio:async(e={})=>await d(`audio`,e)},debug:{symbols:async t=>{let{symbolicateCrashArtifact:n}=await import(`./debug-symbols-facade.js`);return n({cwd:t.cwd??e.cwd,...t})}},recording:{record:async e=>await d(`record`,e),trace:async e=>await d(`trace`,e)},settings:{update:async e=>await d(`settings`,e)}}}function nt(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`pan`,origin:{x:t,y:n},delta:{x:r,y:i}}}function rt(e){return{...e,kind:`drag`}}function it(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function at(e){return{...e,kind:`swipe`}}function Y(e){let{x:t,y:n,...r}=e;return X(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function ot(e){let{x:t,y:n,...r}=e;return X(t,n,`rotate`),{...r,kind:`rotate`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function st(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`transform`,origin:{x:t,y:n},delta:{x:r,y:i}}}function X(e,t,r){if(e===void 0!=(t===void 0))throw new n(`INVALID_ARGS`,`gesture ${r} center requires both x and y`)}function ct(e,t){let n=u(e,`appBundleId`);return{nodes:ze(e.nodes),...typeof e.truncated==`boolean`?{truncated:e.truncated}:{},appName:u(e,`appName`),appBundleId:n,...lt(e),identifiers:{session:t,appId:n,appBundleId:n}}}function lt(e){let t=Z(e.visibility),n=Z(e.unchanged),r=c(e.keyboard),i=ne(e.snapshotDiagnostics);return{...r?{keyboard:r}:{},...t?{visibility:t}:{},...o(e),...n?{unchanged:n}:{},...i?{snapshotDiagnostics:i}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function Z(e){return f(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:S(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:z(n.session)}}function ut(e,t){try{let n=new URL(t.statusUrl),r=Number.parseInt(n.port,10);if(!n.hostname||!Number.isInteger(r))return;let i=t.bridge?void 0:t.iosRuntime.bundleUrl??t.androidRuntime.bundleUrl;W({...$(e),hints:{metroHost:n.hostname,metroPort:r,bundleUrl:i}})}catch{}}function dt(e){try{return $e($(e))}catch{return}}function ft(e){if(!e)return;let{metroHost:t,metroPort:n,bundleUrl:r}=e;if(t!==void 0||n!==void 0||r!==void 0)return{metroHost:t,metroPort:n,bundleUrl:r}}function pt(e){try{let t=$(e.config,e.options),n=ft(e.runtime);if(n){W({...t,hints:n});return}e.sessionReused||G(t)}catch{}}function mt(e,t){try{G($(e,t))}catch{}}export{J as n,H as r,tt as t};
3
+ `)}function Ke(e){return e===S.install||e===S.reinstall||e===C.installSource}async function qe(e,t,n,r){let i=x(n);if(!D(e)||!i.leaseId)return await T(n,e,r??new AbortController().signal);let{buildUploadLeaseHeartbeat:a,runProtectedLeaseWork:o}=await import(`./daemon-client-lease-beat.js`);return await o({heartbeat:a(e,t,n),task:t=>T(n,e,r?AbortSignal.any([t,r]):t),callerSignal:r})}function W(e,t){return A.join(e,`metro-sessions`,`${ge(t)}.json`)}function G(e){let t=W(e.stateDir,e.session);k.mkdirSync(A.dirname(t),{recursive:!0}),k.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function Je(e){let t=W(e.stateDir,e.session),n;try{n=k.readFileSync(t,`utf8`)}catch{return}let r;try{r=JSON.parse(n)}catch{return}if(!r||typeof r!=`object`||Array.isArray(r))return;let i=r,a={};return typeof i.metroHost==`string`&&i.metroHost&&(a.metroHost=i.metroHost),typeof i.metroPort==`number`&&Number.isInteger(i.metroPort)&&(a.metroPort=i.metroPort),typeof i.bundleUrl==`string`&&i.bundleUrl&&(a.bundleUrl=i.bundleUrl),Object.keys(a).length>0?a:void 0}function K(e){k.rmSync(W(e.stateDir,e.session),{force:!0})}function Ye(e){let n=async(t,n)=>await e(C.humanControl,t,n);return{allocate:async t=>J(await e(C.leaseAllocate,[],{...t,leaseId:void 0})),heartbeat:async t=>J(await e(C.leaseHeartbeat,[],t)),release:async t=>{let n=await e(C.leaseRelease,[],t);return{released:n.released===!0,provider:h(n.provider)?n.provider:void 0}},humanControl:{list:async e=>{let r=await n([`list`],e);if(!Array.isArray(r.holds))throw new t(`COMMAND_FAILED`,`Daemon did not return human-control holds.`);return r.holds.map(q)},put:async(e,t={},r)=>q((await n([`put`,e,JSON.stringify(t)],r)).hold),remove:async(e,t)=>(await n([`remove`,e],t)).released===!0}}}function q(e){if(!h(e)||!h(e.scope)||e.state!==`active`&&e.state!==`activating`||typeof e.createdAt!=`number`||typeof e.updatedAt!=`number`)throw new t(`COMMAND_FAILED`,`Daemon returned an invalid human-control hold.`);return{id:l(e,`id`),scope:{backend:l(e.scope,`backend`),leaseProvider:c(e.scope,`leaseProvider`),deviceKey:l(e.scope,`deviceKey`)},state:e.state,reason:c(e,`reason`),createdAt:e.createdAt,updatedAt:e.updatedAt,...typeof e.expiresAt==`number`?{expiresAt:e.expiresAt}:{}}}function J(e){let t=e.lease;if(!h(t))throw Error(`Invalid lease response from daemon`);return{leaseId:l(t,`leaseId`),tenantId:l(t,`tenantId`),runId:l(t,`runId`),backend:l(t,`backend`),leaseProvider:c(t,`leaseProvider`),clientId:c(t,`clientId`),deviceKey:c(t,`deviceKey`),...t.retainOnClose===!0?{retainOnClose:!0}:{},createdAt:typeof t.createdAt==`number`?t.createdAt:void 0,heartbeatAt:typeof t.heartbeatAt==`number`?t.heartbeatAt:void 0,expiresAt:typeof t.expiresAt==`number`?t.expiresAt:void 0}}var Xe=e({createAgentDeviceClient:()=>Y});function Y(e={},n={}){let i=n.transport??U,o=t=>r(t.responseLevel??e.responseLevel),s=async(t,n=[],r={},o,s)=>{let c=Q(e,r),l=c.requestId??y(),u=E({signal:c.signal,requestId:l});u.refuseIfAborted();let d={session:B(c.session),command:t,positionals:n,...s?{input:s}:{},flags:ue(c,o),runtime:c.runtime,meta:{...Fe(c),requestId:l}},f=await u.guard(async()=>await i(d,{authToken:c.daemonAuthToken,signal:c.signal}));return f.ok||a(f.error),f.data??{}},u=async(e={})=>{let t=await s(C.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(we)},d=async(e,t={})=>{let n=await Le(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},f=(t={})=>B(Q(e,t).session);return{command:{wait:async e=>await d(`wait`,e),alert:async(e={})=>await d(`alert`,e),appState:async(e={})=>await d(`appstate`,e),back:async(e={})=>await d(`back`,e),home:async(e={})=>await d(`home`,e),orientation:async e=>await d(`orientation`,e),fold:async e=>await d(`fold`,e),appSwitcher:async(e={})=>await d(`app-switcher`,e),actionButton:async(e={})=>await d(`action-button`,e),keyboard:async(e={})=>await d(`keyboard`,e),clipboard:async e=>await d(`clipboard`,e),tvRemote:async e=>await d(`tv-remote`,e),reactNative:async e=>await d(`react-native`,e),doctor:async(e={})=>await d(`doctor`,e),prepare:async e=>await d(`prepare`,e),viewport:async e=>await d(`viewport`,e)},devices:{list:async(e={})=>{let t=await d(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(P)},capabilities:async(e={})=>{let t=await d(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:P(t.device),availableCommands:n}},boot:async(e={})=>await d(`boot`,e),shutdown:async(e={})=>await d(`shutdown`,e)},sessions:{list:async(e={})=>await u(e),stateDir:async(t={})=>{let n=Q(e,t);return O(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir},close:async(t={})=>{let n=f(t);try{let e=await d(`close`,t);return{session:n,shutdown:R(e.shutdown),provider:Z(e.provider),savedScript:c(e,`savedScript`),identifiers:{session:n}}}finally{ut(e,t)}},saveScript:async(e={})=>{let n=await s(C.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),r=n.actionCount;if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw new t(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let i=l(n,`session`);return{session:i,savedScript:l(n,`savedScript`),actionCount:r,identifiers:{session:i}}},artifacts:async(e={})=>await d(`artifacts`,e)},apps:{install:async e=>N(await d(`install`,e),f(e)),reinstall:async e=>N(await d(`reinstall`,e),f(e)),installFromSource:async e=>be(await d(`install-from-source`,e),f(e)),list:async(e={})=>{let t=await d(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=f(t),r=await d(`open`,t);lt({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=Ee(r),a=c(r,`appBundleId`),o=a,s=me(r);return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:c(r,`sessionStateDir`),runnerLogPath:c(r,`runnerLogPath`),requestLogPath:c(r,`requestLogPath`),eventLogPath:c(r,`eventLogPath`),appName:c(r,`appName`),appBundleId:a,appId:o,selection:ke(r.selection),startup:Ae(r.startup),runtime:Te(r.runtime),device:i,...r.launchConfirmation===`accepted`?{launchConfirmation:`accepted`}:{},...Ne(r),identifiers:{session:n,deviceId:i?.id,deviceName:i?.name,udid:i?.ios?.udid,serial:i?.android?.serial,appId:o,appBundleId:a}}},close:async(e={})=>{let t=f(e),n=await d(`close`,e);return{session:t,closedApp:e.app,shutdown:R(n.shutdown),savedScript:c(n,`savedScript`),identifiers:{session:t}}},push:async e=>await d(`push`,e),triggerEvent:async e=>await d(`trigger-app-event`,e)},materializations:{release:async e=>xe(await s(C.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:Ye(s),metro:{prepare:async t=>{let n=await ve({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath});return ot(e,n),n},reload:async(t={})=>await _e({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??st(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=f(e),n=await d(`snapshot`,e);return o(e)?n:it(n,t)},screenshot:async(e={})=>{let t=f(e),n=await d(`screenshot`,e);return o(e)?n:ye(n,t)},diff:async e=>await d(`diff`,e)},interactions:{click:async e=>await d(`click`,e),press:async e=>await d(`press`,e),longPress:async e=>await d(`longpress`,e),hover:async e=>await d(`hover`,e),swipe:async e=>await d(`swipe`,e),pan:async e=>await d(`gesture`,Ze(e)),drag:async e=>await d(`gesture`,Qe(e)),fling:async e=>await d(`gesture`,$e(e)),swipeGesture:async e=>await d(`gesture`,et(e)),focus:async e=>await d(`focus`,e),type:async e=>await d(`type`,e),fill:async e=>await d(`fill`,e),scroll:async e=>await d(`scroll`,e),pinch:async e=>await d(`gesture`,tt(e)),rotateGesture:async e=>await d(`gesture`,nt(e)),transformGesture:async e=>await d(`gesture`,rt(e)),get:async e=>await d(`get`,e),is:async e=>await d(`is`,e),find:async e=>await d(`find`,e)},replay:{run:async e=>await d(`replay`,e),test:async e=>await d(`test`,e)},batch:{run:async e=>await d(`batch`,e)},observability:{perf:async e=>await d(`perf`,e),logs:async(e={})=>await d(`logs`,e),events:async(e={})=>await d(`events`,e),network:async(e={})=>await d(`network`,e),audio:async(e={})=>await d(`audio`,e)},debug:{symbols:async t=>{let{symbolicateCrashArtifact:n}=await import(`./debug-symbols-facade.js`);return n({cwd:t.cwd??e.cwd,...t})}},recording:{record:async e=>await d(`record`,e),trace:async e=>await d(`trace`,e)},settings:{update:async e=>await d(`settings`,e)}}}function Ze(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`pan`,origin:{x:t,y:n},delta:{x:r,y:i}}}function Qe(e){return{...e,kind:`drag`}}function $e(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function et(e){return{...e,kind:`swipe`}}function tt(e){let{x:t,y:n,...r}=e;return X(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function nt(e){let{x:t,y:n,...r}=e;return X(t,n,`rotate`),{...r,kind:`rotate`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function rt(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`transform`,origin:{x:t,y:n},delta:{x:r,y:i}}}function X(e,n,r){if(e===void 0!=(n===void 0))throw new t(`INVALID_ARGS`,`gesture ${r} center requires both x and y`)}function it(e,t){let n=c(e,`appBundleId`);return{nodes:Pe(e.nodes),...typeof e.truncated==`boolean`?{truncated:e.truncated}:{},appName:c(e,`appName`),appBundleId:n,...at(e),identifiers:{session:t,appId:n,appBundleId:n}}}function at(e){let t=Z(e.visibility),n=Z(e.unchanged),r=d(e.keyboard),i=se(e.viewport),a=ee(e.snapshotDiagnostics);return{...r?{keyboard:r}:{},...i?{viewport:i}:{},...t?{visibility:t}:{},...o(e),...n?{unchanged:n}:{},...a?{snapshotDiagnostics:a}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function Z(e){return h(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:O(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:B(n.session)}}function ot(e,t){try{let n=new URL(t.statusUrl),r=Number.parseInt(n.port,10);if(!n.hostname||!Number.isInteger(r))return;let i=t.bridge?void 0:t.iosRuntime.bundleUrl??t.androidRuntime.bundleUrl;G({...$(e),hints:{metroHost:n.hostname,metroPort:r,bundleUrl:i}})}catch{}}function st(e){try{return Je($(e))}catch{return}}function ct(e){if(!e)return;let{metroHost:t,metroPort:n,bundleUrl:r}=e;if(t!==void 0||n!==void 0||r!==void 0)return{metroHost:t,metroPort:n,bundleUrl:r}}function lt(e){try{let t=$(e.config,e.options),n=ct(e.runtime);if(n){G({...t,hints:n});return}e.sessionReused||K(t)}catch{}}function ut(e,t){try{K($(e,t))}catch{}}export{Y as n,U as r,Xe as t};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{n as t}from"./agent-device-client.js";import{x as n}from"./sdk-batch.js";import{i as r,n as i,o as a,r as o}from"./command-tools.js";const s=[`session`,...a];async function c(a){let{jsonSchema:c,tool:f}=await l(),{session:p,platform:m,set:h=`core`,approval:g}=a,_=t({session:p,...m?{lockPlatform:m}:{}}),v=i(),y=new Set(s);m&&y.add(`platform`);let b={};for(let t of o())(h!==`core`||n(t.name)===`core`)&&(b[t.name]=f({description:t.description,inputSchema:c(u(t.inputSchema,y)),...t.outputSchema?{outputSchema:c(t.outputSchema)}:{},execute:async n=>{let i={...d(n,y),session:p,...m?{platform:m}:{}},a=await v.execute(t.name,i);if(a.isError){let t=a.structuredContent,n=r(t);throw new e(t.code,n,t.details)}return a.structuredContent??{}}}));return{tools:b,client:_,...g?{toolApproval:g}:{}}}async function l(){try{return await import(`ai`)}catch(t){throw new e(`MISSING_PEER_DEPENDENCY`,"createAgentDeviceTools() requires the optional peer dependency 'ai'. Install it with `pnpm add ai` (or npm/yarn equivalent).",void 0,t)}}function u(e,t){if(!e.properties)return e;let n=e.required?.filter(e=>!t.has(e));return{...e,properties:d(e.properties,t),...n?{required:n}:{}}}function d(e,t){let n={};for(let[r,i]of Object.entries(e))t.has(r)||(n[r]=i);return n}export{c as createAgentDeviceTools};
1
+ import{P as e}from"./sdk-contracts.js";import{n as t}from"./agent-device-client.js";import{x as n}from"./sdk-batch.js";import{i as r,n as i,o as a,r as o}from"./command-tools.js";const s=[`session`,...a];async function c(a){let{jsonSchema:c,tool:f}=await l(),{session:p,platform:m,set:h=`core`,approval:g}=a,_=t({session:p,...m?{lockPlatform:m}:{}}),v=i(),y=new Set(s);m&&y.add(`platform`);let b={};for(let t of o())(h!==`core`||n(t.name)===`core`)&&(b[t.name]=f({description:t.description,inputSchema:c(u(t.inputSchema,y)),...t.outputSchema?{outputSchema:c(t.outputSchema)}:{},execute:async n=>{let i={...d(n,y),session:p,...m?{platform:m}:{}},a=await v.execute(t.name,i);if(a.isError){let t=a.structuredContent,n=r(t);throw new e(t.code,n,t.details)}return a.structuredContent??{}}}));return{tools:b,client:_,...g?{toolApproval:g}:{}}}async function l(){try{return await import(`ai`)}catch(t){throw new e(`MISSING_PEER_DEPENDENCY`,"createAgentDeviceTools() requires the optional peer dependency 'ai'. Install it with `pnpm add ai` (or npm/yarn equivalent).",void 0,t)}}function u(e,t){if(!e.properties)return e;let n=e.required?.filter(e=>!t.has(e));return{...e,properties:d(e.properties,t),...n?{required:n}:{}}}function d(e,t){let n={};for(let[r,i]of Object.entries(e))t.has(r)||(n[r]=i);return n}export{c as createAgentDeviceTools};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{rn as t}from"./sdk-batch.js";import{i as n,n as r,r as i}from"./interactor-operation-binding.js";function a(e){return Object.freeze({captureScreenshot:e.capture})}function o(e,t){return Object.freeze({captureScreenshot:async n=>{await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).screenshot(n.outPath,n.options)}})}function s(e){return o(e.signal,r(e))}function c(e){return o(e.signal,i({...e,operation:`screenshot`}))}function l(e,t){return t.signal===void 0?e:AbortSignal.any([e,t.signal])}function ee(e){return Object.freeze({captureSnapshot:e.capture,captureSnapshotWithCustomActions:e.customActions,captureSnapshotWithoutActiveApp:e.withoutActiveApp})}function u(t){let n=async n=>{let r=l(t.signal,n),i={...n.execution,appBundleId:n.options?.appBundleId,signal:r},a=t.ownership===`local`?await t.resolveInteractor(t.device,i):t.resolveInteractor(i);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`Provider-owned snapshot operation has no bound provider interactor.`,{reason:`provider-runtime-interactor-missing`,deviceId:t.device.id});let o=await a.snapshot({...n.options,signal:r});if(!p(o))return o;if(!t.presentIosAcquisition)throw new e(`COMMAND_FAILED`,`Acquired iOS snapshot has no host presentation owner.`,{reason:`ios-snapshot-presenter-missing`,deviceId:t.device.id});return await t.presentIosAcquisition(o,n.options)};return Object.freeze({captureSnapshot:n,captureSnapshotWithCustomActions:n,captureSnapshotWithoutActiveApp:n})}function d(e){return u({...e,ownership:`local`})}function f(e){return u({...e,ownership:`provider`})}function p(e){return`stage`in e&&e.stage===`acquired`}function m(e){return Object.freeze({findText:e.findText})}function h(e){return Object.freeze({setViewport:e.setViewport})}function g(e){return Object.freeze({focusPoint:e.focus})}function _(e,t){return Object.freeze({focusPoint:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).focus(n.point.x,n.point.y)}})}function te(e){return _(e.signal,r(e))}function ne(e){return _(e.signal,i({...e,operation:`focus`}))}function re(e){let t=t=>t??e.unsupported;return Object.freeze({performGesturePlan:t(e.plan),performDirectionalFlingPlan:t(e.directionalFling),performMultiTouchGesturePlan:t(e.multiTouch),performTargetAuthoredDrag:t(e.targetAuthoredDrag),gestureViewport:t(e.viewport)})}function v(e,n,r){let i=async e=>{let i=await y(n,r,e);if(typeof i.performGesture!=`function`)throw t(`Runtime owner advertised gesture execution without an interactor implementation`);return await i.performGesture(e.plan)};return Object.freeze({...e.performGesturePlan.available?{performGesturePlan:i}:{},...e.performDirectionalFlingPlan.available?{performDirectionalFlingPlan:i}:{},...e.performMultiTouchGesturePlan.available?{performMultiTouchGesturePlan:i}:{},...e.performTargetAuthoredDrag.available?{performTargetAuthoredDrag:i}:{},...e.gestureViewport.available?{gestureViewport:async e=>{let i=await y(n,r,e);if(typeof i.gestureViewport!=`function`)throw t(`Runtime owner advertised gestureViewport without an interactor implementation`);return await i.gestureViewport()}}:{}})}async function y(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}function b(e){return v(e.facts,e.signal,r(e))}function x(e){return v(e.facts,e.signal,i({...e,operation:`gesture`}))}function S(e){return Object.freeze({scrollDirection:e.scroll})}function C(e,t){return Object.freeze({scrollDirection:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.target?.appBundleId,signal:e})).scroll(n.direction,n.options))})}function w(e){return C(e.signal,r(e))}function T(e){return C(e.signal,i({...e,operation:`scroll`}))}function E(e){return Object.freeze({typeText:e.type})}function D(e,t){return Object.freeze({typeText:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).type(n.text,n.delayMs))})}function O(e){return D(e.signal,r(e))}function k(e){return D(e.signal,i({...e,operation:`type`}))}function A(e){return typeof e!=`string`||e.trim().length===0?Object.freeze({status:`unreadable`,reason:`no-text-at-point`}):Object.freeze({status:`read`,text:e})}function j(e){return Object.freeze({readTextAtPoint:e.readTextAtPoint})}function M(e){return Object.freeze({readTextAtPoint:async n=>{let r=e.signal;r.throwIfAborted();let i=await e.resolveInteractor(e.device,{...n.execution,appBundleId:n.options?.appBundleId,signal:r});if(typeof i.readTextAtPoint!=`function`)throw t(`Runtime owner advertised readTextAtPoint without an interactor implementation`);return A(await i.readTextAtPoint(n.point,{appBundleId:n.options?.appBundleId,surface:n.options?.surface,signal:r}))}})}function N(e){return Object.freeze({back:e.back})}function P(e,t){return Object.freeze({back:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).back(n.mode)}})}function F(e){return Object.freeze({setOrientation:e.orientation})}function I(e,t){return Object.freeze({setOrientation:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).setOrientation(n.rotation))})}function L(e){return Object.freeze({tvRemote:e.tvRemote})}const R=`tv-remote`;function ie(e,t){return Object.freeze({tvRemote:async n=>{e.throwIfAborted();let r=await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e}),{requireInteractorMethod:i}=await import(`./interactor-operation-binding.js`).then(e=>e.t);await i(r.tvRemote,R).call(r,n.button,n.durationMs)}})}function z(e){let t=t=>t??e.unsupported;return Object.freeze({keyboardStatus:t(e.status),keyboardDismiss:t(e.dismiss),keyboardEnter:t(e.enter)})}async function B(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}const V={keyboardStatus:`keyboard status`,keyboardDismiss:`keyboard dismiss`,keyboardEnter:`keyboard enter`};function H(e,t,n){let r=async r=>{let i=await B(t,n,r),{requireInteractorMethod:a}=await import(`./interactor-operation-binding.js`).then(e=>e.t);return await a(i[e],V[e]).call(i)};return Object.freeze({[e]:r})}function U(e){let t=t=>t??e.unsupported;return Object.freeze({readClipboard:t(e.read),writeClipboard:t(e.write)})}const W={readClipboard:`clipboard read`,writeClipboard:`clipboard write`};async function G(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}async function K(e,t){let{requireInteractorMethod:n}=await import(`./interactor-operation-binding.js`).then(e=>e.t);return n(e[t],W[t])}function q(e,t){return Object.freeze({readClipboard:async n=>{let r=await G(e,t,n);return await(await K(r,`readClipboard`)).call(r)}})}function J(e,t){return Object.freeze({writeClipboard:async n=>{let r=await G(e,t,n);await(await K(r,`writeClipboard`)).call(r,n.text)}})}const Y=[`home`,`appSwitcher`,`actionButton`],X={home:`home`,appSwitcher:`app-switcher`,actionButton:`action-button`};function ae(e){let t={};for(let n of Y)t[n]=e[n]??e.unsupported;return Object.freeze(t)}function oe(e,t,r){let i=async i=>{t.throwIfAborted();let a=await r({...i.execution,appBundleId:i.options?.appBundleId,signal:t});await n(a[e],X[e]).call(a)};return Object.freeze({[e]:i})}function se(e){return Object.freeze({triggerAppEvent:e.triggerAppEvent})}function ce(e,t){return Object.freeze({triggerAppEvent:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).open(n.eventUrl,{appBundleId:n.options?.appBundleId})}})}function Z(e){return Object.freeze({setSetting:e.setSetting,readSetting:e.readSetting})}async function Q(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.appBundleId,signal:e})}function le(e,t){return Object.freeze({setSetting:async n=>await(await Q(e,t,n)).setSetting(n.setting,n.state,n.appBundleId,n.options)})}function ue(e,t){return Object.freeze({readSetting:async n=>{let r=await Q(e,t,n),{requireInteractorMethod:i}=await import(`./interactor-operation-binding.js`).then(e=>e.t);return await i(r.readSetting,`settings read`).call(r,n.setting)}})}function de(e){return Object.freeze({readAlert:e.read,awaitAlert:e.wait,acceptAlert:e.accept,dismissAlert:e.dismiss})}async function fe(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.appBundleId,signal:e})}function pe(e){return{...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs},...e.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...e.surface===void 0?{}:{surface:e.surface}}}const $={readAlert:`alert get`,awaitAlert:`alert wait`,acceptAlert:`alert accept`,dismissAlert:`alert dismiss`};function me(e,t,n){return Object.freeze({[e]:async r=>{let i=await fe(t,n,r),{requireInteractorMethod:a}=await import(`./interactor-operation-binding.js`).then(e=>e.t);return await a(i[e],$[e]).call(i,pe(r))}})}export{E as A,h as B,F as C,j as D,M as E,x as F,ee as G,d as H,re as I,a as J,s as K,te as L,T as M,S as N,O,b as P,ne as R,I as S,P as T,f as U,m as V,l as W,H as _,le as a,ie as b,ce as c,ae as d,W as f,V as g,U as h,ue as i,w as j,k,X as l,J as m,de as n,Z as o,q as p,c as q,me as r,se as s,$ as t,oe as u,z as v,N as w,L as x,R as y,g as z};
1
+ import{P as e}from"./sdk-contracts.js";import{rn as t}from"./sdk-batch.js";import{i as n,n as r,r as i}from"./interactor-operation-binding.js";function a(e){return Object.freeze({captureScreenshot:e.capture})}function o(e,t){return Object.freeze({captureScreenshot:async n=>await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).screenshot(n.outPath,n.options)??{}})}function s(e){return o(e.signal,r(e))}function c(e){return o(e.signal,i({...e,operation:`screenshot`}))}function l(e,t){return t.signal===void 0?e:AbortSignal.any([e,t.signal])}function ee(e){return Object.freeze({captureSnapshot:e.capture,captureSnapshotWithCustomActions:e.customActions,captureSnapshotWithoutActiveApp:e.withoutActiveApp})}function u(t){let n=async n=>{let r=l(t.signal,n),i={...n.execution,appBundleId:n.options?.appBundleId,signal:r},a=t.ownership===`local`?await t.resolveInteractor(t.device,i):t.resolveInteractor(i);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`Provider-owned snapshot operation has no bound provider interactor.`,{reason:`provider-runtime-interactor-missing`,deviceId:t.device.id});let o=await a.snapshot({...n.options,signal:r});if(!p(o))return o;if(!t.presentIosAcquisition)throw new e(`COMMAND_FAILED`,`Acquired iOS snapshot has no host presentation owner.`,{reason:`ios-snapshot-presenter-missing`,deviceId:t.device.id});return await t.presentIosAcquisition(o,n.options)};return Object.freeze({captureSnapshot:n,captureSnapshotWithCustomActions:n,captureSnapshotWithoutActiveApp:n})}function d(e){return u({...e,ownership:`local`})}function f(e){return u({...e,ownership:`provider`})}function p(e){return`stage`in e&&e.stage===`acquired`}function m(e){return Object.freeze({findText:e.findText})}function h(e){return Object.freeze({setViewport:e.setViewport})}function g(e){return Object.freeze({focusPoint:e.focus})}function _(e,t){return Object.freeze({focusPoint:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).focus(n.point.x,n.point.y)}})}function te(e){return _(e.signal,r(e))}function ne(e){return _(e.signal,i({...e,operation:`focus`}))}function re(e){let t=t=>t??e.unsupported;return Object.freeze({performGesturePlan:t(e.plan),performDirectionalFlingPlan:t(e.directionalFling),performMultiTouchGesturePlan:t(e.multiTouch),performTargetAuthoredDrag:t(e.targetAuthoredDrag),gestureViewport:t(e.viewport)})}function v(e,n,r){let i=async e=>{let i=await y(n,r,e);if(typeof i.performGesture!=`function`)throw t(`Runtime owner advertised gesture execution without an interactor implementation`);return await i.performGesture(e.plan)};return Object.freeze({...e.performGesturePlan.available?{performGesturePlan:i}:{},...e.performDirectionalFlingPlan.available?{performDirectionalFlingPlan:i}:{},...e.performMultiTouchGesturePlan.available?{performMultiTouchGesturePlan:i}:{},...e.performTargetAuthoredDrag.available?{performTargetAuthoredDrag:i}:{},...e.gestureViewport.available?{gestureViewport:async e=>{let i=await y(n,r,e);if(typeof i.gestureViewport!=`function`)throw t(`Runtime owner advertised gestureViewport without an interactor implementation`);return await i.gestureViewport()}}:{}})}async function y(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}function b(e){return v(e.facts,e.signal,r(e))}function x(e){return v(e.facts,e.signal,i({...e,operation:`gesture`}))}function S(e){return Object.freeze({scrollDirection:e.scroll})}function C(e,t){return Object.freeze({scrollDirection:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.target?.appBundleId,signal:e})).scroll(n.direction,n.options))})}function w(e){return C(e.signal,r(e))}function T(e){return C(e.signal,i({...e,operation:`scroll`}))}function E(e){return Object.freeze({typeText:e.type})}function D(e,t){return Object.freeze({typeText:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).type(n.text,n.delayMs))})}function O(e){return D(e.signal,r(e))}function k(e){return D(e.signal,i({...e,operation:`type`}))}function A(e){return typeof e!=`string`||e.trim().length===0?Object.freeze({status:`unreadable`,reason:`no-text-at-point`}):Object.freeze({status:`read`,text:e})}function j(e){return Object.freeze({readTextAtPoint:e.readTextAtPoint})}function M(e){return Object.freeze({readTextAtPoint:async n=>{let r=e.signal;r.throwIfAborted();let i=await e.resolveInteractor(e.device,{...n.execution,appBundleId:n.options?.appBundleId,signal:r});if(typeof i.readTextAtPoint!=`function`)throw t(`Runtime owner advertised readTextAtPoint without an interactor implementation`);return A(await i.readTextAtPoint(n.point,{appBundleId:n.options?.appBundleId,surface:n.options?.surface,signal:r}))}})}function N(e){return Object.freeze({back:e.back})}function P(e,t){return Object.freeze({back:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).back(n.mode)}})}function F(e){return Object.freeze({setOrientation:e.orientation})}function I(e,t){return Object.freeze({setOrientation:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).setOrientation(n.rotation))})}function L(e){return Object.freeze({tvRemote:e.tvRemote})}const R=`tv-remote`;function ie(e,t){return Object.freeze({tvRemote:async n=>{e.throwIfAborted();let r=await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e}),{requireInteractorMethod:i}=await import(`./interactor-operation-binding.js`).then(e=>e.t);await i(r.tvRemote,R).call(r,n.button,n.durationMs)}})}function z(e){let t=t=>t??e.unsupported;return Object.freeze({keyboardStatus:t(e.status),keyboardDismiss:t(e.dismiss),keyboardEnter:t(e.enter)})}async function B(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}const V={keyboardStatus:`keyboard status`,keyboardDismiss:`keyboard dismiss`,keyboardEnter:`keyboard enter`};function H(e,t,n){let r=async r=>{let i=await B(t,n,r),{requireInteractorMethod:a}=await import(`./interactor-operation-binding.js`).then(e=>e.t);return await a(i[e],V[e]).call(i)};return Object.freeze({[e]:r})}function U(e){let t=t=>t??e.unsupported;return Object.freeze({readClipboard:t(e.read),writeClipboard:t(e.write)})}const W={readClipboard:`clipboard read`,writeClipboard:`clipboard write`};async function G(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}async function K(e,t){let{requireInteractorMethod:n}=await import(`./interactor-operation-binding.js`).then(e=>e.t);return n(e[t],W[t])}function q(e,t){return Object.freeze({readClipboard:async n=>{let r=await G(e,t,n);return await(await K(r,`readClipboard`)).call(r)}})}function J(e,t){return Object.freeze({writeClipboard:async n=>{let r=await G(e,t,n);await(await K(r,`writeClipboard`)).call(r,n.text)}})}const Y=[`home`,`appSwitcher`,`actionButton`],X={home:`home`,appSwitcher:`app-switcher`,actionButton:`action-button`};function ae(e){let t={};for(let n of Y)t[n]=e[n]??e.unsupported;return Object.freeze(t)}function oe(e,t,r){let i=async i=>{t.throwIfAborted();let a=await r({...i.execution,appBundleId:i.options?.appBundleId,signal:t});await n(a[e],X[e]).call(a)};return Object.freeze({[e]:i})}function se(e){return Object.freeze({triggerAppEvent:e.triggerAppEvent})}function ce(e,t){return Object.freeze({triggerAppEvent:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).open(n.eventUrl,{appBundleId:n.options?.appBundleId})}})}function Z(e){return Object.freeze({setSetting:e.setSetting,readSetting:e.readSetting})}async function Q(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.appBundleId,signal:e})}function le(e,t){return Object.freeze({setSetting:async n=>await(await Q(e,t,n)).setSetting(n.setting,n.state,n.appBundleId,n.options)})}function ue(e,t){return Object.freeze({readSetting:async n=>{let r=await Q(e,t,n),{requireInteractorMethod:i}=await import(`./interactor-operation-binding.js`).then(e=>e.t);return await i(r.readSetting,`settings read`).call(r,n.setting)}})}function de(e){return Object.freeze({readAlert:e.read,awaitAlert:e.wait,acceptAlert:e.accept,dismissAlert:e.dismiss})}async function fe(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.appBundleId,signal:e})}function pe(e){return{...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs},...e.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...e.surface===void 0?{}:{surface:e.surface}}}const $={readAlert:`alert get`,awaitAlert:`alert wait`,acceptAlert:`alert accept`,dismissAlert:`alert dismiss`};function me(e,t,n){return Object.freeze({[e]:async r=>{let i=await fe(t,n,r),{requireInteractorMethod:a}=await import(`./interactor-operation-binding.js`).then(e=>e.t);return await a(i[e],$[e]).call(i,pe(r))}})}export{E as A,h as B,F as C,j as D,M as E,x as F,ee as G,d as H,re as I,a as J,s as K,te as L,T as M,S as N,O,b as P,ne as R,I as S,P as T,f as U,m as V,l as W,H as _,le as a,ie as b,ce as c,ae as d,W as f,V as g,U as h,ue as i,w as j,k,X as l,J as m,de as n,Z as o,q as p,c as q,me as r,se as s,$ as t,oe as u,z as v,N as w,L as x,R as y,g as z};
@@ -0,0 +1 @@
1
+ import{P as e}from"./sdk-contracts.js";import{m as t,p as n}from"./sdk-device.js";import{a as r,n as i}from"./alert-contract.js";import{t as a}from"./timeouts.js";import"./retry.js";import{c as o}from"./runner-client.js";import{a as s}from"./helper.js";function c(e,n,r){if(t(e)){let e=r?.surface===`frontmost-app`?{surface:r.surface}:{bundleId:r?.appBundleId,surface:r?.surface};return async t=>await s(t,e)}return async(t,i)=>await o(e,{command:`alert`,action:t,appBundleId:r?.appBundleId,timeoutMs:i},n)}async function l(e){try{return await e}catch(e){if(h(e))return;throw e}}async function u(e,t,n){return await c(e,t,n)(`get`,r)}async function d(t,n,r){let i=c(t,n,r),o=r?.timeoutMs??1e4,s=Date.now(),l=!0;for(;Date.now()-s<o;){try{let e=l?o:p(s,o);return l=!1,await i(`get`,e)}catch(e){if(!h(e))throw e}await a(300)}throw new e(`COMMAND_FAILED`,`alert wait timed out`)}async function f(e,t,o,s){let l=c(e,t,s),u=n(e)?r:i,d=Date.now(),f,g=!0;for(;Date.now()-d<i;){try{let e=g?u:p(d,i);return g=!1,await l(o,e)}catch(e){if(f=e,!h(e))break}await a(300)}throw m(f)}function p(e,t){return Math.max(1,t-(Date.now()-e))}function m(t){return!(t instanceof e)||!h(t)?t:new e(t.code,t.message,{...t.details??{},hint:`If the permission sheet is visible in snapshot or screenshot but alert reports no alert, take a scoped snapshot around the visible button label and use press @ref.`})}function h(t){if(!(t instanceof e))return!1;let n=t.details??{};return n.runnerErrorCode===`ALERT_NOT_FOUND`||n.reason===`alert-not-found`}export{u as i,l as n,d as r,f as t};