agent-device 0.21.20 → 0.21.22

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 (357) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.20.apk → agent-device-android-ime-helper-0.21.22.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.22.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.20.manifest.json → agent-device-android-ime-helper-0.21.22.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.20.manifest.json → agent-device-android-snapshot-helper-0.21.22.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 +121 -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+Models.swift +27 -0
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +6 -1
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +7 -2
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +21 -7
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +121 -17
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +179 -6
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +119 -0
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +8 -1
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +23 -11
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +59 -6
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +112 -23
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +25 -12
  29. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +6 -1
  30. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +43 -13
  31. package/dist/src/adapter.js +1 -1
  32. package/dist/src/adb-executor.js +2 -2
  33. package/dist/src/adb-failure.js +1 -1
  34. package/dist/src/adb-transport.js +1 -1
  35. package/dist/src/agent-browser-lifecycle.js +1 -1
  36. package/dist/src/agent-browser-process-record.js +1 -1
  37. package/dist/src/agent-browser-provider.js +1 -1
  38. package/dist/src/agent-browser-tool.js +1 -1
  39. package/dist/src/agent-device-client.js +2 -2
  40. package/dist/src/ai-sdk.js +1 -1
  41. package/dist/src/alert-runtime.js +1 -1
  42. package/dist/src/alert.js +1 -1
  43. package/dist/src/android-adb.d.ts +12 -0
  44. package/dist/src/android-input-ownership.js +1 -1
  45. package/dist/src/app-backend.js +1 -0
  46. package/dist/src/app-catalog.js +1 -1
  47. package/dist/src/app-deployment-resolution.js +1 -1
  48. package/dist/src/app-inventory.js +1 -1
  49. package/dist/src/app-launch.js +1 -1
  50. package/dist/src/app-lifecycle.js +2 -2
  51. package/dist/src/app-lifecycle2.js +1 -1
  52. package/dist/src/app-log-files.js +1 -1
  53. package/dist/src/app-log-reconnect.js +1 -1
  54. package/dist/src/app-log-runtime2.js +3 -3
  55. package/dist/src/app-log-session-resource.js +1 -0
  56. package/dist/src/app-resolution.js +2 -2
  57. package/dist/src/apple-runner-platform.js +1 -1
  58. package/dist/src/application-lifecycle-interaction.js +1 -1
  59. package/dist/src/archive.js +2 -2
  60. package/dist/src/artifact-download.js +1 -1
  61. package/dist/src/auth-session.js +1 -1
  62. package/dist/src/auth.js +1 -1
  63. package/dist/src/back-mode.js +1 -1
  64. package/dist/src/backend-snapshot-options.js +1 -1
  65. package/dist/src/boot-diagnostics.js +1 -1
  66. package/dist/src/cache.js +1 -1
  67. package/dist/src/capabilities.js +1 -1
  68. package/dist/src/capture.js +1 -1
  69. package/dist/src/cli-config.js +1 -1
  70. package/dist/src/cli-help.js +13 -5
  71. package/dist/src/cli.js +4 -4
  72. package/dist/src/click-button.js +1 -1
  73. package/dist/src/client-metro-companion.js +1 -1
  74. package/dist/src/client-metro.js +1 -1
  75. package/dist/src/client-options.js +3 -0
  76. package/dist/src/client-types.d.ts +88 -5
  77. package/dist/src/clipboard-shell-response.js +1 -1
  78. package/dist/src/cloud-artifacts.d.ts +7 -2
  79. package/dist/src/code-signature-cache.js +1 -1
  80. package/dist/src/code-signature.js +1 -1
  81. package/dist/src/command-schema.js +1 -1
  82. package/dist/src/command-tools.js +2 -2
  83. package/dist/src/connection-runtime.js +1 -1
  84. package/dist/src/connection.js +5 -5
  85. package/dist/src/contracts.d.ts +1 -1
  86. package/dist/src/contracts.js +1 -1
  87. package/dist/src/daemon-artifacts.js +1 -0
  88. package/dist/src/daemon-client-lease-beat.js +1 -1
  89. package/dist/src/daemon-client-lifecycle.js +1 -1
  90. package/dist/src/daemon-client-liveness-probe.js +1 -0
  91. package/dist/src/daemon-client-transport.js +1 -1
  92. package/dist/src/daemon-http.js +1 -0
  93. package/dist/src/daemon-policy-file.js +1 -1
  94. package/dist/src/daemon-registration-owner.js +1 -0
  95. package/dist/src/daemon-registration.js +1 -1
  96. package/dist/src/daemon-resolution.js +1 -1
  97. package/dist/src/daemon-shutdown-report.js +1 -1
  98. package/dist/src/daemon.js +2 -2
  99. package/dist/src/debug-symbols-facade.js +1 -1
  100. package/dist/src/device-claim-inspection.js +1 -1
  101. package/dist/src/device-claim-rule.js +1 -1
  102. package/dist/src/device-inventory-context.js +1 -1
  103. package/dist/src/device-readiness-runtime.js +1 -1
  104. package/dist/src/device-release.js +1 -1
  105. package/dist/src/device-rotation.js +1 -1
  106. package/dist/src/device-selection-resolver.js +1 -1
  107. package/dist/src/device-session.js +1 -1
  108. package/dist/src/device-shell.js +1 -1
  109. package/dist/src/device.js +1 -1
  110. package/dist/src/device2.js +1 -3
  111. package/dist/src/device3.js +3 -0
  112. package/dist/src/devicectl.js +1 -1
  113. package/dist/src/diagnostics.js +3 -3
  114. package/dist/src/dispatch-resolve.js +4 -1
  115. package/dist/src/display-inventory.js +1 -1
  116. package/dist/src/doctor-facade.js +1 -1
  117. package/dist/src/doctor2.js +1 -1
  118. package/dist/src/durable-capture-resource.js +1 -0
  119. package/dist/src/engine-eval-script.js +1 -1
  120. package/dist/src/error.js +1 -1
  121. package/dist/src/exec.js +1 -1
  122. package/dist/src/file.js +1 -1
  123. package/dist/src/find.js +1 -1
  124. package/dist/src/generic-settle.js +1 -1
  125. package/dist/src/generic.js +1 -1
  126. package/dist/src/gesture-admission.js +1 -1
  127. package/dist/src/gesture-plan.js +1 -1
  128. package/dist/src/gesture-runtime.js +1 -1
  129. package/dist/src/harmonyos.js +1 -1
  130. package/dist/src/hdc.js +1 -1
  131. package/dist/src/helper.js +2 -2
  132. package/dist/src/host-file.js +1 -1
  133. package/dist/src/host.js +1 -1
  134. package/dist/src/human-control-contract.js +1 -1
  135. package/dist/src/human-control.js +1 -1
  136. package/dist/src/index.d.ts +1 -1
  137. package/dist/src/index.js +1 -1
  138. package/dist/src/input-actions.js +1 -1
  139. package/dist/src/input-actions2.js +2 -2
  140. package/dist/src/install-artifact-facade.js +1 -1
  141. package/dist/src/install-source-network-transport.js +1 -1
  142. package/dist/src/install-source.d.ts +5 -0
  143. package/dist/src/install-source2.js +1 -1
  144. package/dist/src/instance-client.js +1 -0
  145. package/dist/src/interaction-positionals.js +1 -1
  146. package/dist/src/interaction-ref-policy.js +1 -1
  147. package/dist/src/interaction.js +1 -1
  148. package/dist/src/interaction2.js +1 -1
  149. package/dist/src/interactor-operation-binding.js +1 -1
  150. package/dist/src/interactor.js +5 -5
  151. package/dist/src/interactor2.js +1 -1
  152. package/dist/src/interactors.js +1 -1
  153. package/dist/src/internal/bin.js +1 -1
  154. package/dist/src/internal/daemon.js +1 -2
  155. package/dist/src/internal/png-worker.js +1 -1
  156. package/dist/src/internal/run-script-http-child.js +1 -1
  157. package/dist/src/inventory.js +4 -4
  158. package/dist/src/inventory2.js +1 -1
  159. package/dist/src/inventory3.js +1 -1
  160. package/dist/src/inventory5.js +1 -1
  161. package/dist/src/ios-client.js +4 -30
  162. package/dist/src/ios-settings.js +1 -0
  163. package/dist/src/ios-snapshot-engine.js +1 -1
  164. package/dist/src/ios-snapshot-runtime.js +1 -1
  165. package/dist/src/launch-confirmation.js +1 -1
  166. package/dist/src/lease-context.js +1 -1
  167. package/dist/src/lease-registry-scope.js +1 -0
  168. package/dist/src/lease-scope.js +1 -1
  169. package/dist/src/lease.js +1 -1
  170. package/dist/src/legacy-xctest-device-set.js +1 -1
  171. package/dist/src/limrun-download-file.js +1 -1
  172. package/dist/src/limrun-runtime-dependencies.js +1 -1
  173. package/dist/src/limrun.d.ts +28 -2
  174. package/dist/src/limrun.js +1 -1
  175. package/dist/src/linux.js +1 -1
  176. package/dist/src/load.js +1 -0
  177. package/dist/src/location-coordinates.js +1 -1
  178. package/dist/src/macos-facade.js +1 -1
  179. package/dist/src/managed-device-scope.js +1 -1
  180. package/dist/src/mechanics.js +16 -16
  181. package/dist/src/observation.js +1 -1
  182. package/dist/src/observe-until.js +1 -1
  183. package/dist/src/overlay.js +2 -2
  184. package/dist/src/owner-identity.js +3 -3
  185. package/dist/src/path-resolution.js +1 -1
  186. package/dist/src/perf-facade.js +1 -1
  187. package/dist/src/perf-runtime-operation-builder.js +1 -1
  188. package/dist/src/perf-runtime-plan.js +1 -1
  189. package/dist/src/perf-target.js +1 -1
  190. package/dist/src/perf.js +1 -1
  191. package/dist/src/physical-device-control.js +1 -1
  192. package/dist/src/platform-request-scope.js +1 -1
  193. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  194. package/dist/src/platform-runtime-app-log-process.js +1 -1
  195. package/dist/src/platform-runtime-host.js +1 -1
  196. package/dist/src/platform-runtime-managed-owner.js +1 -1
  197. package/dist/src/platform-runtime-open-target.js +1 -1
  198. package/dist/src/platform-runtime-operation-host.js +2 -2
  199. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  200. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  201. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  202. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  203. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  204. package/dist/src/platform-runtime-screen-recording-output-host.js +1 -1
  205. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  206. package/dist/src/platform-runtime-unavailable.js +1 -1
  207. package/dist/src/platform-runtime.js +1 -1
  208. package/dist/src/platform-runtime2.js +1 -1
  209. package/dist/src/plugins.d.ts +9 -0
  210. package/dist/src/plugins.js +1 -0
  211. package/dist/src/plugins2.js +2 -0
  212. package/dist/src/png-crop-bytes.js +1 -1
  213. package/dist/src/png-size.js +1 -1
  214. package/dist/src/png-worker-client.js +1 -1
  215. package/dist/src/png.js +1 -1
  216. package/dist/src/prepare-kind.js +1 -1
  217. package/dist/src/process.js +1 -1
  218. package/dist/src/project-runtime.js +1 -1
  219. package/dist/src/provider-credential-fingerprint.js +1 -0
  220. package/dist/src/provider-device-admission.js +1 -1
  221. package/dist/src/provider-device-runtimes.js +1 -0
  222. package/dist/src/provider-limrun-credentials.js +1 -0
  223. package/dist/src/provider-profile-fields.js +1 -0
  224. package/dist/src/provider-session-ownership.js +2 -2
  225. package/dist/src/provider-webdriver.js +2 -1
  226. package/dist/src/providers.js +1 -1
  227. package/dist/src/proxy.js +1 -1
  228. package/dist/src/quality-warnings.js +1 -1
  229. package/dist/src/react-native.js +1 -1
  230. package/dist/src/record-runtime.js +1 -1
  231. package/dist/src/record-trace.js +1 -1
  232. package/dist/src/recording.js +1 -1
  233. package/dist/src/rect-center.js +1 -1
  234. package/dist/src/register-builtins.js +1 -1
  235. package/dist/src/registry.js +39 -39
  236. package/dist/src/remote-config2.js +1 -1
  237. package/dist/src/replay-divergence.js +1 -1
  238. package/dist/src/replay.js +2 -2
  239. package/dist/src/reporting.js +5 -5
  240. package/dist/src/request-admission.js +1 -1
  241. package/dist/src/request-cancel.js +1 -1
  242. package/dist/src/request-cancellation.js +1 -1
  243. package/dist/src/request-runtime-binding.js +1 -1
  244. package/dist/src/result-serialization.js +1 -1
  245. package/dist/src/retry.js +1 -1
  246. package/dist/src/runner-artifact-manifest.js +1 -1
  247. package/dist/src/runner-cache-metadata.js +3 -3
  248. package/dist/src/runner-client.js +1 -1
  249. package/dist/src/runner-dev-tools-security.js +1 -1
  250. package/dist/src/runner-device-readiness.js +1 -1
  251. package/dist/src/runner-disposal.js +1 -1
  252. package/dist/src/runner-error-classification.js +2 -2
  253. package/dist/src/runner-exchange.js +1 -1
  254. package/dist/src/runner-operations-facade.js +1 -1
  255. package/dist/src/runner-session-types.js +1 -1
  256. package/dist/src/runner-start-budget.js +1 -1
  257. package/dist/src/runner.js +1 -1
  258. package/dist/src/runtime-admission.js +1 -1
  259. package/dist/src/runtime-transport-hints.js +1 -1
  260. package/dist/src/runtime.js +1 -1
  261. package/dist/src/runtime10.js +2 -2
  262. package/dist/src/runtime2.js +3 -3
  263. package/dist/src/runtime3.js +1 -1
  264. package/dist/src/runtime4.js +5 -5
  265. package/dist/src/runtime5.js +1 -1
  266. package/dist/src/runtime6.js +1 -1
  267. package/dist/src/runtime7.js +1 -1
  268. package/dist/src/runtime8.js +1 -1
  269. package/dist/src/runtime9.js +1 -1
  270. package/dist/src/screen-recording-admission-ledger.js +1 -1
  271. package/dist/src/screen-recording-completion.js +1 -1
  272. package/dist/src/screen-recording-options.js +1 -1
  273. package/dist/src/screen-recording-resource-recovery.js +1 -1
  274. package/dist/src/screen-recording-transport.js +1 -1
  275. package/dist/src/screenshot-density.js +1 -1
  276. package/dist/src/screenshot-image.js +1 -1
  277. package/dist/src/screenshot-result.js +1 -1
  278. package/dist/src/screenshot-runtime.js +1 -1
  279. package/dist/src/screenshot.js +1 -1
  280. package/dist/src/screenshot3.js +1 -1
  281. package/dist/src/script.js +1 -1
  282. package/dist/src/scroll-command.js +1 -1
  283. package/dist/src/scroll-gesture.js +1 -1
  284. package/dist/src/sdk-batch-runner.js +2 -2
  285. package/dist/src/sdk-batch.js +2 -2
  286. package/dist/src/sdk-contracts.d.ts +45 -2
  287. package/dist/src/sdk-contracts.js +2 -2
  288. package/dist/src/sdk-device.js +1 -1
  289. package/dist/src/sdk-io.js +1 -1
  290. package/dist/src/sdk-remote-config.js +1 -1
  291. package/dist/src/sdk-selectors.d.ts +33 -4
  292. package/dist/src/selection.js +0 -0
  293. package/dist/src/selector-runtime.js +1 -1
  294. package/dist/src/selectors.d.ts +2 -2
  295. package/dist/src/selectors.js +1 -1
  296. package/dist/src/server.js +1 -1
  297. package/dist/src/session-allocation.js +1 -1
  298. package/dist/src/session-artifact-paths.js +1 -1
  299. package/dist/src/session-repair-tombstone.js +1 -1
  300. package/dist/src/session-routing.js +1 -1
  301. package/dist/src/session-runtime-admission.js +1 -1
  302. package/dist/src/session-snapshot.js +1 -1
  303. package/dist/src/session-stream.js +27 -0
  304. package/dist/src/session.js +1 -1
  305. package/dist/src/session2.js +5 -5
  306. package/dist/src/settings.js +1 -1
  307. package/dist/src/settings2.js +1 -1
  308. package/dist/src/simctl-settings-facade.js +1 -0
  309. package/dist/src/simctl-settings.js +1 -0
  310. package/dist/src/simctl.js +1 -1
  311. package/dist/src/simulator.js +1 -1
  312. package/dist/src/snapshot-diagnostics.js +1 -1
  313. package/dist/src/snapshot-runtime-binding.js +1 -1
  314. package/dist/src/snapshot-runtime.js +1 -1
  315. package/dist/src/snapshot-state.js +1 -1
  316. package/dist/src/snapshot2.js +1 -1
  317. package/dist/src/snapshot3.js +1 -1
  318. package/dist/src/snapshot4.js +1 -1
  319. package/dist/src/src.js +1 -1
  320. package/dist/src/src7.js +1 -1
  321. package/dist/src/src8.js +2 -2
  322. package/dist/src/store.js +1 -0
  323. package/dist/src/string-enum.js +1 -1
  324. package/dist/src/surface-snapshot.js +1 -1
  325. package/dist/src/takeover.js +1 -1
  326. package/dist/src/target-evidence.js +1 -1
  327. package/dist/src/telemetry.js +1 -1
  328. package/dist/src/text-entry-focus.js +1 -1
  329. package/dist/src/tool-provider.js +1 -1
  330. package/dist/src/tool-provider2.js +1 -1
  331. package/dist/src/toolchain-probe.js +2 -2
  332. package/dist/src/touch-runtime.js +1 -1
  333. package/dist/src/touch-runtime2.js +1 -1
  334. package/dist/src/transport.js +2 -2
  335. package/dist/src/tv-remote.js +1 -1
  336. package/dist/src/type-text-runtime.js +1 -1
  337. package/dist/src/update-check.js +1 -1
  338. package/dist/src/vars.js +1 -1
  339. package/dist/src/verified-file.js +1 -1
  340. package/dist/src/version.js +1 -1
  341. package/dist/src/video.js +1 -1
  342. package/dist/src/viewport.js +1 -1
  343. package/dist/src/web.js +1 -1
  344. package/dist/src/web2.js +1 -1
  345. package/dist/src/webdriver-source.js +1 -1
  346. package/package.json +5 -1
  347. package/server.json +2 -2
  348. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.20.apk.sha256 +0 -1
  349. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.20.apk +0 -0
  350. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.20.apk.sha256 +0 -1
  351. package/dist/src/api.js +0 -3
  352. package/dist/src/daemon-process.js +0 -1
  353. package/dist/src/multitouch-support.js +0 -1
  354. package/dist/src/parameterized-recorded-fill.js +0 -1
  355. package/dist/src/runner-startup-transport.js +0 -1
  356. package/dist/src/runner-xctestrun.js +0 -1
  357. package/dist/src/session-store.js +0 -4
@@ -1 +1 @@
1
- import e from"node:path";import t from"node:fs";import n from"node:os";import r from"node:fs/promises";function i(){return n.homedir()}function a(){return n.tmpdir()}async function o(t){return await r.mkdtemp(e.join(a(),t))}async function s(e){await r.mkdir(e,{recursive:!0})}async function c(e,t={}){return await r.readFile(e,{encoding:`utf8`,signal:t.signal})}async function l(e,t={}){return await r.readFile(e,{signal:t.signal})}async function u(e,t={}){return t.withFileTypes===!0?await r.readdir(e,{withFileTypes:!0}):await r.readdir(e)}async function d(e){return await r.stat(e)}async function f(e,t){await r.writeFile(e,t,`utf8`)}async function p(e,t){await r.writeFile(e,t)}async function m(e){await r.rm(e,{recursive:!0,force:!0})}async function h(e){await r.unlink(e)}async function g(e,t){await r.copyFile(e,t)}async function _(e,t){await r.cp(e,t,{recursive:!0})}async function v(e,t){await r.rename(e,t)}async function y(e,t){await r.chmod(e,t)}async function b(e){await r.access(e)}async function x(e){await m(e)}function S(e){t.mkdirSync(e,{recursive:!0})}function C(e){return t.readFileSync(e,`utf8`)}function w(e,n){t.writeFileSync(e,n,`utf8`)}function T(e){return t.existsSync(e)}function E(e){return t.statSync(e)}function D(e){return t.lstatSync(e)}function O(e){return t.readlinkSync(e)}function k(e){t.unlinkSync(e)}function A(e,n){t.symlinkSync(e,n,`dir`)}function j(e){return t.readdirSync(e)}export{m as C,f as D,p as E,w as O,k as S,h as T,j as _,A as a,C as b,T as c,E as d,i as f,u as g,l as h,_ as i,D as l,o as m,y as n,s as o,a as p,g as r,S as s,b as t,d as u,O as v,v as w,x,c as y};
1
+ import e from"node:fs";import t from"node:os";import n from"node:path";import r from"node:fs/promises";function i(){return t.homedir()}function a(){return t.tmpdir()}async function o(e){return await r.mkdtemp(n.join(a(),e))}async function s(e){await r.mkdir(e,{recursive:!0})}async function c(e,t={}){return await r.readFile(e,{encoding:`utf8`,signal:t.signal})}async function l(e,t={}){return await r.readFile(e,{signal:t.signal})}async function u(e,t={}){return t.withFileTypes===!0?await r.readdir(e,{withFileTypes:!0}):await r.readdir(e)}async function d(e){return await r.stat(e)}async function f(e,t){await r.writeFile(e,t,`utf8`)}async function p(e,t){await r.writeFile(e,t)}async function m(e){await r.rm(e,{recursive:!0,force:!0})}async function h(e){await r.unlink(e)}async function g(e,t){await r.copyFile(e,t)}async function _(e,t){await r.cp(e,t,{recursive:!0})}async function v(e,t){await r.rename(e,t)}async function y(e,t){await r.chmod(e,t)}async function b(e){await r.access(e)}async function x(e){await m(e)}function S(t){e.mkdirSync(t,{recursive:!0})}function C(t){return e.readFileSync(t,`utf8`)}function w(t,n){e.writeFileSync(t,n,`utf8`)}function T(t){return e.existsSync(t)}function E(t){return e.statSync(t)}function D(t){return e.lstatSync(t)}function O(t){return e.readlinkSync(t)}function k(t){e.unlinkSync(t)}function A(t,n){e.symlinkSync(t,n,`dir`)}function j(t){return e.readdirSync(t)}export{m as C,f as D,p as E,w as O,k as S,h as T,j as _,A as a,C as b,T as c,E as d,i as f,u as g,l as h,_ as i,D as l,o as m,y as n,s as o,a as p,g as r,S as s,b as t,d as u,O as v,v as w,x,c as y};
package/dist/src/host.js CHANGED
@@ -1 +1 @@
1
- let e;function t(t){if(e&&e!==t)throw Error(`Apple runner host is already bound to a different implementation.`);e=t}function n(){if(!e)throw Error(`Apple runner host is not bound. Production binds it in core/runner-client.ts; package tests bind it through runner/test-host.ts.`);return e}function r(e){return((...t)=>n()[e](...t))}const i=r(`runCmdStreaming`),a=r(`runCmdSync`),o=r(`runCmdBackground`),s=r(`requireExecSuccess`),c=r(`isCommandTimeoutError`),l=r(`commandDeveloperDir`),u=r(`shellQuote`),d=r(`emitDiagnostic`),f=r(`withDiagnosticTimer`),p=r(`retryWithPolicy`),m=r(`isEnvTruthy`),h=r(`isProcessAlive`),g=r(`isProcessGroupAlive`),_=r(`readProcessStartTime`),v=r(`readProcessCommand`),y=r(`signalPidsBestEffort`),b=r(`signalProcessGroupBestEffort`),x=r(`classifyOwnerLiveness`),S=r(`readHostCpuArchSync`),C=r(`findProjectRoot`),w=r(`readVersion`),T=r(`acquireProcessLock`),E=r(`withProcessLock`),D=r(`publishFileSync`),O=r(`emitRequestProgress`),k=r(`getRequestSignal`),A=r(`isRequestCanceled`),j=r(`withKeyedLock`),M=r(`createTtlMemo`),N=r(`isRecord`),P=r(`parseBooleanLiteral`),F=r(`classifyBootFailure`),I=r(`bootFailureHint`),L=r(`runAppleToolCommand`),R=r(`runXcrun`),z=r(`readApplePlistJson`),B=r(`buildSimctlArgsForDevice`),V=r(`simulatorAddressFor`),H=r(`visitXmlPlistEntries`),U=r(`resolveIosPhysicalDeviceControl`),W=r(`leaseOwnerStateDir`),G=r(`hasDeviceClaimAuthority`),K={fromTimeoutMs:r(`deadlineFromTimeoutMs`)};export{U as A,V as B,D as C,_ as D,v as E,a as F,f as H,R as I,u as L,L as M,o as N,w as O,i as P,y as R,P as S,S as T,j as U,H as V,E as W,h as _,B as a,A as b,l as c,O as d,C as f,m as g,c as h,I as i,p as j,s as k,M as l,G as m,T as n,F as o,k as p,t as r,x as s,K as t,d as u,g as v,z as w,W as x,N as y,b as z};
1
+ let e;function t(t){if(e&&e!==t)throw Error(`Apple runner host is already bound to a different implementation.`);e=t}function n(){if(!e)throw Error(`Apple runner host is not bound. Production binds it in core/runner-client.ts; package tests bind it through runner/test-host.ts.`);return e}function r(e){return((...t)=>n()[e](...t))}const i=r(`runCmdStreaming`),a=r(`runCmdSync`),o=r(`runCmdBackground`),s=r(`requireExecSuccess`),c=r(`isCommandTimeoutError`),l=r(`commandDeveloperDir`),u=r(`shellQuote`),d=r(`emitDiagnostic`),f=r(`withDiagnosticTimer`),p=r(`retryWithPolicy`),m=r(`isEnvTruthy`),h=r(`isProcessAlive`),g=r(`isProcessGroupAlive`),_=r(`readProcessStartTime`),v=r(`readProcessCommand`),y=r(`signalPidsBestEffort`),b=r(`signalProcessGroupBestEffort`),x=r(`classifyOwnerLiveness`),S=r(`readHostCpuArchSync`),C=r(`findProjectRoot`),w=r(`readVersion`),T=r(`acquireProcessLock`),E=r(`withProcessLock`),D=r(`publishFileSync`),O=r(`emitRequestProgress`),k=r(`getRequestSignal`),A=r(`isRequestCanceled`),j=r(`withKeyedLock`),M=r(`createTtlMemo`),N=r(`isRecord`),P=r(`parseBooleanLiteral`),F=r(`classifyBootFailure`),I=r(`bootFailureHint`),L=r(`runAppleToolCommand`),R=r(`runXcrun`),z=r(`readApplePlistJson`),B=r(`hasScopedAppleToolProvider`),V=r(`buildSimctlArgsForDevice`),H=r(`simulatorAddressFor`),U=r(`visitXmlPlistEntries`),W=r(`resolveIosPhysicalDeviceControl`),G=r(`leaseOwnerStateDir`),K=r(`hasDeviceClaimAuthority`),q={fromTimeoutMs:r(`deadlineFromTimeoutMs`)};export{s as A,b as B,P as C,v as D,S as E,i as F,E as G,U as H,a as I,R as L,p as M,L as N,_ as O,o as P,u as R,G as S,z as T,f as U,H as V,j as W,m as _,V as a,N as b,l as c,O as d,C as f,c as g,B as h,I as i,W as j,w as k,M as l,K as m,T as n,F as o,k as p,t as r,x as s,q as t,d as u,h as v,D as w,A as x,g as y,y as z};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{t}from"./lease-scope.js";import n from"node:crypto";function r(e){return(e??``).trim().toLowerCase()===`tenant`?`tenant`:`none`}function i(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}const a=`default`;function o(n){let r=Number.isInteger(n.defaultLeaseTtlMs)?Math.max(1,Number(n.defaultLeaseTtlMs)):6e4,i=Number.isInteger(n.minLeaseTtlMs)?Math.max(1,Number(n.minLeaseTtlMs)):t,a=Number.isInteger(n.maxLeaseTtlMs)?Math.max(i,Number(n.maxLeaseTtlMs)):6e5;return t=>{if(!Number.isInteger(t))return r;let n=Number(t);if(n<i||n>a)throw new e(`INVALID_ARGS`,`Lease ttlMs must be between ${i} and ${a}.`);return n}}function s(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function c(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function l(t){let n=c(t);if(!n)throw new e(`INVALID_ARGS`,`Invalid lease id.`);return n}function u(t){let n=(t??``).trim().toLowerCase();if(!n||n===`ios-simulator`)return`ios-simulator`;if(n===`ios-instance`||n===`android-instance`||n===`harmonyos-instance`)return n;throw new e(`INVALID_ARGS`,`Unsupported lease backend: ${t??``}`)}function d(t){if(t===void 0)return;let n=t.trim();if(!n||n.length>256||!/^[\u0020-\u007E]+$/.test(n))throw new e(`INVALID_ARGS`,`Invalid device key. Use 1-256 printable characters.`);return n}function f(e){return m(e,`client id`,128)}function p(e){return m(e,`lease provider`,64)}function m(t,n,r){if(t===void 0)return;let i=t.trim();if(!i||i.length>r||!/^[a-zA-Z0-9._-]+$/.test(i))throw new e(`INVALID_ARGS`,`Invalid ${n}. Use 1-${String(r)} chars: letters, numbers, dot, underscore, hyphen.`);return i}function h(t){let n=i(t);if(!n)throw new e(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return n}function g(t){let n=s(t);if(!n)throw new e(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return n}function _(e){return{backend:u(e.leaseBackend),leaseProvider:p(e.leaseProvider),deviceKey:d(e.deviceKey),clientId:f(e.clientId),tenantId:h(e.tenantId),runId:g(e.runId),ttlMs:e.ttlMs}}function v(e){return!!(e.leaseProvider??e.deviceKey??e.clientId)}function y(e,t){return!t.tenantId||!t.runId?!1:[[e.leaseProvider,t.leaseProvider],[e.deviceKey,t.deviceKey],[e.clientId,t.clientId]].every(([e,t])=>!e||!!t)}function b(t,n){let r=S(n);if(r.tenantId&&t.tenantId!==r.tenantId||r.runId&&t.runId!==r.runId||r.leaseBackend&&t.backend!==r.leaseBackend||r.leaseProvider&&t.leaseProvider!==r.leaseProvider||r.deviceKey&&t.deviceKey!==r.deviceKey||r.clientId&&t.clientId!==r.clientId)throw new e(`UNAUTHORIZED`,`Lease does not match tenant/run scope`,{reason:`LEASE_SCOPE_MISMATCH`})}function x(t){let n=u(t.leaseBackend),r=i(t.tenantId);if(!r)throw new e(`INVALID_ARGS`,`tenant isolation requires tenant id.`);let a=s(t.runId);if(!a)throw new e(`INVALID_ARGS`,`tenant isolation requires run id.`);let o=c(t.leaseId);if(!o)throw new e(`INVALID_ARGS`,`tenant isolation requires lease id.`);return{...t,tenantId:r,runId:a,leaseId:o,leaseBackend:n}}function S(t){let n=i(t.tenantId),r=s(t.runId);if(t.tenantId&&!n)throw new e(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(t.runId&&!r)throw new e(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return{tenantId:n,runId:r,leaseBackend:t.leaseBackend?u(t.leaseBackend):void 0,leaseProvider:p(t.leaseProvider),deviceKey:d(t.deviceKey),clientId:f(t.clientId)}}function C(t,n){if(v(t)&&!y(t,n))throw new e(`UNAUTHORIZED`,`Lease owner scope is required`,{reason:`LEASE_SCOPE_REQUIRED`})}function w(e){if(e.deviceKey)return JSON.stringify([e.backend,e.leaseProvider??a,e.deviceKey])}function T(e){return JSON.stringify([e.tenantId,e.runId,e.backend,e.leaseProvider??a,e.deviceKey??`*`])}function E(e,t,r){return{leaseId:n.randomBytes(16).toString(`hex`),tenantId:e.tenantId,runId:e.runId,backend:e.backend,...e.leaseProvider?{leaseProvider:e.leaseProvider}:{},...e.deviceKey?{deviceKey:e.deviceKey}:{},...e.clientId?{clientId:e.clientId}:{},createdAt:r,heartbeatAt:r,expiresAt:r+t}}function D(e){return e.expiresAt-e.heartbeatAt}function O(t){return new e(`DEVICE_IN_USE`,`Device is already leased`,{reason:`DEVICE_LEASE_BUSY`,deviceKey:t.deviceKey,backend:t.backend,leaseProvider:t.leaseProvider,expiresAt:t.expiresAt,hint:`Retry after the lease expires or close the owning session.`})}const k=`/admin/human-control/holds`;function A(t){let n=M(t,`Human-control request body`),r=n.reason;if(r!==void 0&&(typeof r!=`string`||r.trim().length>512))throw new e(`INVALID_ARGS`,`Human-control reason must be at most 512 characters.`);let i=n.ttlMs;if(i!==void 0&&(typeof i!=`number`||!Number.isInteger(i)||i<1e3||i>864e5))throw new e(`INVALID_ARGS`,`Human-control ttlMs must be between 1000 and 86400000.`);return{...n.scope===void 0?{}:{scope:j(n.scope)},...typeof r==`string`&&r.trim()?{reason:r.trim()}:{},...typeof i==`number`?{ttlMs:i}:{}}}function j(t){let n=M(t,`Host human-control scope`);if(typeof n.backend!=`string`||!n.backend.trim()||typeof n.deviceKey!=`string`)throw new e(`INVALID_ARGS`,`Host human control requires scope.backend and scope.deviceKey.`);if(n.leaseProvider!==void 0&&typeof n.leaseProvider!=`string`)throw new e(`INVALID_ARGS`,`scope.leaseProvider must be a string.`);let r=p(n.leaseProvider);return{backend:u(n.backend),deviceKey:d(n.deviceKey),...r?{leaseProvider:r}:{}}}function M(t,n){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`${n} must be an object.`);return t}function N(t){let n=typeof t==`string`?t.trim():``;if(!/^[a-zA-Z0-9._-]{1,128}$/.test(n))throw new e(`INVALID_ARGS`,`Invalid human-control hold id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return n}function P(e){return{...e,scope:{...e.scope}}}function F(t){return new e(`DEVICE_IN_USE`,`A human is interacting with this simulator or device; agent interactions are temporarily disabled.`,{reason:`human_control_active`,blockedBy:`human_control`,holdId:t.id,deviceKey:t.scope.deviceKey,pausedAt:new Date(t.createdAt).toISOString(),...t.expiresAt===void 0?{}:{expiresAt:new Date(t.expiresAt).toISOString()},...t.reason?{humanReason:t.reason}:{},hint:`Wait until the human-control hold is released before retrying.`})}export{l as _,A as a,E as c,w as d,D as f,c as g,x as h,N as i,o as l,_ as m,P as n,C as o,T as p,F as r,b as s,k as t,O as u,i as v,r as y};
1
+ import{P as e}from"./sdk-contracts.js";import{f as t,g as n,m as r}from"./lease-registry-scope.js";const i=`/admin/human-control/holds`;function a(t){let n=s(t,`Human-control request body`),r=n.reason;if(r!==void 0&&(typeof r!=`string`||r.trim().length>512))throw new e(`INVALID_ARGS`,`Human-control reason must be at most 512 characters.`);let i=n.ttlMs;if(i!==void 0&&(typeof i!=`number`||!Number.isInteger(i)||i<1e3||i>864e5))throw new e(`INVALID_ARGS`,`Human-control ttlMs must be between 1000 and 86400000.`);return{...n.scope===void 0?{}:{scope:o(n.scope)},...typeof r==`string`&&r.trim()?{reason:r.trim()}:{},...typeof i==`number`?{ttlMs:i}:{}}}function o(i){let a=s(i,`Host human-control scope`);if(typeof a.backend!=`string`||!a.backend.trim()||typeof a.deviceKey!=`string`)throw new e(`INVALID_ARGS`,`Host human control requires scope.backend and scope.deviceKey.`);if(a.leaseProvider!==void 0&&typeof a.leaseProvider!=`string`)throw new e(`INVALID_ARGS`,`scope.leaseProvider must be a string.`);let o=n(a.leaseProvider);return{backend:r(a.backend),deviceKey:t(a.deviceKey),...o?{leaseProvider:o}:{}}}function s(t,n){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`${n} must be an object.`);return t}function c(t){let n=typeof t==`string`?t.trim():``;if(!/^[a-zA-Z0-9._-]{1,128}$/.test(n))throw new e(`INVALID_ARGS`,`Invalid human-control hold id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return n}function l(e){return{...e,scope:{...e.scope}}}function u(t){return new e(`DEVICE_IN_USE`,`A human is interacting with this simulator or device; agent interactions are temporarily disabled.`,{reason:`human_control_active`,blockedBy:`human_control`,holdId:t.id,deviceKey:t.scope.deviceKey,pausedAt:new Date(t.createdAt).toISOString(),...t.expiresAt===void 0?{}:{expiresAt:new Date(t.expiresAt).toISOString()},...t.reason?{humanReason:t.reason}:{},hint:`Wait until the human-control hold is released before retrying.`})}export{a,c as i,l as n,u as r,i as t};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{a as t}from"./human-control-contract.js";import{r as n}from"./request-cancel.js";import"./request.js";async function r(t){let{req:r,registry:s}=t,c=r.internal?.admittedLease;if(!c)throw new e(`UNAUTHORIZED`,`Human control requires an admitted remote lease.`);let l={kind:`lease`,leaseId:c.leaseId},u=r.positionals??[],[d,f=``,p=``]=u;switch(d){case`list`:return a(u,1),{ok:!0,data:{holds:s.listHumanControlHolds(l)}};case`put`:return a(u,3),{ok:!0,data:{hold:await s.putHumanControlHold(l,f,i(p),n(r.meta?.requestId)),state:`active`}};case`remove`:{a(u,2);let e=s.removeHumanControlHold(l,f);return{ok:!0,data:{released:!!e,...e?{hold:e}:{}}}}default:throw o()}}function i(n){let r;try{r=JSON.parse(n)}catch(t){throw new e(`INVALID_ARGS`,`Human-control payload must be valid JSON.`,void 0,t)}return t(r)}function a(e,t){if(e.length!==t)throw o()}function o(){return new e(`INVALID_ARGS`,`human_control requires list, put <id> <payload>, or remove <id>.`)}export{r as handleHumanControlCommand};
1
+ import{P as e}from"./sdk-contracts.js";import{r as t}from"./request-cancel.js";import"./request.js";import{a as n}from"./human-control-contract.js";async function r(n){let{req:r,registry:s}=n,c=r.internal?.admittedLease;if(!c)throw new e(`UNAUTHORIZED`,`Human control requires an admitted remote lease.`);let l={kind:`lease`,leaseId:c.leaseId},u=r.positionals??[],[d,f=``,p=``]=u;switch(d){case`list`:return a(u,1),{ok:!0,data:{holds:s.listHumanControlHolds(l)}};case`put`:return a(u,3),{ok:!0,data:{hold:await s.putHumanControlHold(l,f,i(p),t(r.meta?.requestId)),state:`active`}};case`remove`:{a(u,2);let e=s.removeHumanControlHold(l,f);return{ok:!0,data:{released:!!e,...e?{hold:e}:{}}}}default:throw o()}}function i(t){let r;try{r=JSON.parse(t)}catch(t){throw new e(`INVALID_ARGS`,`Human-control payload must be valid JSON.`,void 0,t)}return n(r)}function a(e,t){if(e.length!==t)throw o()}function o(){return new e(`INVALID_ARGS`,`human_control requires list, put <id> <payload>, or remove <id>.`)}export{r as handleHumanControlCommand};
@@ -1,4 +1,4 @@
1
- import { A as Rect, H as AppError, J as NormalizedError, K as ErrorCause, O as Point, P as SnapshotNode, R as SnapshotState, U as AppErrorCode, V as centerOfRect, W as AppErrorDetails, X as isAgentDeviceError, Z as normalizeAgentDeviceError, k as RawSnapshotNode, q as KnownAppErrorCode, y as AppleOS } from "./sdk-contracts.js";
1
+ import { A as Rect, G as AppErrorDetails, H as centerOfRect, J as KnownAppErrorCode, O as Point, P as SnapshotNode, Q as normalizeAgentDeviceError, R as SnapshotState, U as AppError, W as AppErrorCode, Y as NormalizedError, Z as isAgentDeviceError, k as RawSnapshotNode, q as ErrorCause, y as AppleOS } from "./sdk-contracts.js";
2
2
  import { s as AppsFilter } from "./gesture-plan-types.js";
3
3
  import { $ as NetworkOptions, $t as AppTriggerEventOptions, A as WaitCommandOptions, At as ElementTarget, B as GetOptions, Bt as FindSnapshotCommandOptions, C as HomeCommandOptions, Cn as isRecord, Ct as RotateGestureOptions, D as ReactNativeCommandOptions, Dt as SwipeOptions, E as PrepareCommandOptions, Et as SwipeGestureOptions, F as SessionCloseResult, Ft as CaptureDiffOptions, G as CommandRequestResult, Gt as AppDeployResult, H as IsStatePredicateOptions, Ht as AppCloseOptions, I as SessionSaveScriptOptions, It as CaptureScreenshotOptions, J as ReplayRunOptions, Jt as AppInstallOptions, K as BatchRunOptions, Kt as AppInstallFromSourceOptions, L as SessionSaveScriptResult, Lt as CaptureScreenshotResult, M as AlertAction, Mt as PointTarget, N as PermissionTarget, Nt as RefTarget, O as TvRemoteCommandOptions, Ot as TransformGestureOptions, P as SettingsUpdateOptions, Pt as SelectorTarget, Q as LogsOptions, Qt as AppPushOptions, R as FindBaseOptions, Rt as CaptureSnapshotOptions, S as FoldCommandOptions, Sn as JsonValue, St as RepeatedPressOptions, T as OrientationCommandOptions, Tt as SettleCommandOptions, U as IsTextPredicateOptions, Ut as AppCloseResult, V as IsOptions, Vt as SelectorSnapshotCommandOptions, W as RecordControlOptions, Wt as AppDeployOptions, X as AudioOptions, Xt as AppOpenOptions, Y as ReplayTestOptions, Yt as AppListOptions, Z as EventsOptions, Zt as AppOpenResult, _ as AppStateCommandOptions, _n as AgentDeviceSelectionOptions, _t as LongPressOptions, a as WaitCommandResult, an as AgentDeviceCapabilitiesResult, at as HumanControlHoldOptions, b as ClipboardCommandOptions, bn as JsonObject, bt as PressOptions, c as DebugSymbolsOptions, cn as AgentDeviceSessionDevice, ct as LeaseAllocateOptions, d as PrepareCommandResult, dn as StartupPerfSample, dt as ClickOptions, en as DeviceSelectionMetadata, et as PerfOptions, f as ReplayCommandResult, fn as AgentDeviceClientConfig, ft as DragOptions, g as AlertCommandOptions, gn as AgentDeviceRequestOverrides, gt as HoverOptions, h as ActionButtonCommandOptions, hn as AgentDeviceIdentifiers, ht as FocusOptions, i as TraceCommandResult, in as MaterializationReleaseResult, it as HumanControlHold, j as WaitCommandTarget, jt as InteractionTarget, k as ViewportCommandOptions, kt as TypeTextOptions, l as DebugSymbolsResult, ln as DeviceBootOptions, lt as LeaseOptions, m as TriggerAppEventCommandResult, mn as AgentDeviceDaemonTransportContext, mt as FlingOptions, n as AgentDeviceCommandClient, nn as DeviceSelectionSource, nt as TraceOptions, o as DiffSnapshotCommandResult, on as AgentDeviceDevice, ot as HumanControlHoldScope, p as ReplaySuiteResult, pn as AgentDeviceDaemonTransport, pt as FillOptions, q as BatchStep, qt as AppInstallFromSourceResult, r as RecordingCommandResult, rn as MaterializationReleaseOptions, rt as CloudArtifactsOptions, s as DoctorCommandResult, sn as AgentDeviceSession, st as Lease, t as AgentDeviceClient, tn as DeviceSelectionReason, tt as RecordOptions, u as PushCommandResult, un as DeviceShutdownOptions, ut as LeaseScopedOptions, v as AppSwitcherCommandOptions, vn as DeviceCommandBaseOptions, vt as PanOptions, w as KeyboardCommandOptions, wt as ScrollOptions, x as DoctorCommandOptions, xn as JsonPrimitive, xt as ReadinessBudgetOptions, y as BackCommandOptions, yn as TargetShutdownResult, yt as PinchOptions, z as FindOptions, zt as CaptureSnapshotResult } from "./client-types.js";
4
4
  import { r as CloudProviderSessionResult, t as AgentArtifactsResult } from "./cloud-artifacts.js";
package/dist/src/index.js CHANGED
@@ -1 +1 @@
1
- import{K as e,N as t,U as n,y as r}from"./sdk-contracts.js";import{n as i}from"./agent-device-client.js";import{t as a}from"./sdk-io.js";export{t as AppError,r as centerOfRect,i as createAgentDeviceClient,a as createLocalArtifactAdapter,n as isAgentDeviceError,e as normalizeAgentDeviceError};
1
+ import{P as e,W as t,b as n,q as r}from"./sdk-contracts.js";import{n as i}from"./agent-device-client.js";import{t as a}from"./sdk-io.js";export{e as AppError,n as centerOfRect,i as createAgentDeviceClient,a as createLocalArtifactAdapter,t as isAgentDeviceError,r as normalizeAgentDeviceError};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{d as t}from"./scroll-gesture.js";import{t as n}from"./timeouts.js";import"./retry.js";import{runHarmonyShell as r}from"./hdc.js";import{invalidateHarmonyGestureViewport as i,readHarmonyGestureViewport as a}from"./snapshot2.js";async function o(e,t,n){await r(e,[`uitest`,`uiInput`,`click`,t,n])}async function s(e,t,n){await r(e,[`uitest`,`uiInput`,`doubleClick`,t,n])}async function c(e,t,n,i=800){await r(e,[`uitest`,`uiInput`,`longClick`,t,n])}async function l(e,t,i=0){await r(e,[`uitest`,`uiInput`,`text`,t]),i>0&&await n(i)}async function u(e,t,i,a,o=0){await r(e,[`uitest`,`uiInput`,`inputText`,t,i,a]),o>0&&await n(o)}async function d(e,n,i){let o=await a(e),s=t({direction:n,amount:i?.amount,pixels:i?.pixels,referenceWidth:o.width,referenceHeight:o.height});return await r(e,[`uitest`,`uiInput`,`swipe`,s.x1,s.y1,s.x2,s.y2,i?.durationMs??300]),s}async function f(t,n){if(n.topology!==`single`)throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS HDC does not support multi-touch gestures`);let i=n.pointers[0].samples,a=i[0],o=i.at(-1);if(!a||!o)throw new e(`COMMAND_FAILED`,`HarmonyOS gesture plan has no pointer endpoints`);let s=Math.hypot(o.point.x-a.point.x,o.point.y-a.point.y),c=Math.max(200,Math.min(4e4,Math.round(s/n.durationMs*1e3))),l=n.intent===`fling`?`fling`:`swipe`;return await r(t,[`uitest`,`uiInput`,l,Math.round(a.point.x),Math.round(a.point.y),Math.round(o.point.x),Math.round(o.point.y),c]),{backend:`harmonyos-hdc-uiinput`,command:l,velocity:c,viewport:n.viewport}}async function p(e){await r(e,[`uitest`,`uiInput`,`keyEvent`,`Back`]),i(e)}async function m(e){await r(e,[`uitest`,`uiInput`,`keyEvent`,`Home`]),i(e)}async function h(e){await r(e,[`uitest`,`uiInput`,`keyEvent`,`Recent`]),i(e)}async function g(e,t){if(t===`Back`){await p(e);return}await r(e,[`uitest`,`uiInput`,`keyEvent`,t])}async function _(t,n){throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS orientation control is not available through the public HDC API.`)}export{h as appSwitcherHarmony,p as backHarmony,s as doubleClickHarmony,u as fillHarmony,m as homeHarmony,c as longPressHarmony,f as performHarmonyGesture,o as pressHarmony,g as pressHarmonyKeyboardKey,d as scrollHarmony,_ as setHarmonyOrientation,l as typeHarmony};
1
+ import{P as e}from"./sdk-contracts.js";import{d as t}from"./scroll-gesture.js";import{t as n}from"./timeouts.js";import"./retry.js";import{runHarmonyShell as r}from"./hdc.js";import{invalidateHarmonyGestureViewport as i,readHarmonyGestureViewport as a}from"./snapshot2.js";async function o(e,t,n){await r(e,[`uitest`,`uiInput`,`click`,t,n])}async function s(e,t,n){await r(e,[`uitest`,`uiInput`,`doubleClick`,t,n])}async function c(e,t,n,i=800){await r(e,[`uitest`,`uiInput`,`longClick`,t,n])}async function l(e,t,i=0){await r(e,[`uitest`,`uiInput`,`text`,t]),i>0&&await n(i)}async function u(e,t,i,a,o=0){await r(e,[`uitest`,`uiInput`,`inputText`,t,i,a]),o>0&&await n(o)}async function d(e,n,i){let o=await a(e),s=t({direction:n,amount:i?.amount,pixels:i?.pixels,referenceWidth:o.width,referenceHeight:o.height});return await r(e,[`uitest`,`uiInput`,`swipe`,s.x1,s.y1,s.x2,s.y2,i?.durationMs??300]),s}async function f(t,n){if(n.topology!==`single`)throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS HDC does not support multi-touch gestures`);let i=n.pointers[0].samples,a=i[0],o=i.at(-1);if(!a||!o)throw new e(`COMMAND_FAILED`,`HarmonyOS gesture plan has no pointer endpoints`);let s=Math.hypot(o.point.x-a.point.x,o.point.y-a.point.y),c=Math.max(200,Math.min(4e4,Math.round(s/n.durationMs*1e3))),l=n.intent===`fling`?`fling`:`swipe`;return await r(t,[`uitest`,`uiInput`,l,Math.round(a.point.x),Math.round(a.point.y),Math.round(o.point.x),Math.round(o.point.y),c]),{backend:`harmonyos-hdc-uiinput`,command:l,velocity:c,viewport:n.viewport}}async function p(e){await r(e,[`uitest`,`uiInput`,`keyEvent`,`Back`]),i(e)}async function m(e){await r(e,[`uitest`,`uiInput`,`keyEvent`,`Home`]),i(e)}async function h(e){await r(e,[`uitest`,`uiInput`,`keyEvent`,`Recent`]),i(e)}async function g(e,t){if(t===`Back`){await p(e);return}await r(e,[`uitest`,`uiInput`,`keyEvent`,t])}async function _(t,n){throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS orientation control is not available through the public HDC API.`)}export{h as appSwitcherHarmony,p as backHarmony,s as doubleClickHarmony,u as fillHarmony,m as homeHarmony,c as longPressHarmony,f as performHarmonyGesture,o as pressHarmony,g as pressHarmonyKeyboardKey,d as scrollHarmony,_ as setHarmonyOrientation,l as typeHarmony};
@@ -1,2 +1,2 @@
1
- import{N as e,z as t}from"./sdk-contracts.js";import{t as n}from"./scroll-gesture.js";import{c as r}from"./owner-identity.js";import{t as i}from"./timeouts.js";import"./process.js";import"./retry.js";import{t as a}from"./tool-provider2.js";function o(){let e=r();return e.WAYLAND_DISPLAY||e.XDG_SESSION_TYPE===`wayland`?`wayland`:`x11`}let s=null;async function c(){let t=a();if(s?.provider===t)return s;let n=o();if(n===`wayland`){if(await t.whichCommand(`ydotool`))return s={tool:`ydotool`,display:n,provider:t},s;throw new e(`TOOL_MISSING`,`ydotool is required for input synthesis on Wayland (xdotool does not work on Wayland). Install it via your package manager.`)}if(await t.whichCommand(`xdotool`))return s={tool:`xdotool`,display:n,provider:t},s;throw new e(`TOOL_MISSING`,`xdotool is required for input synthesis on X11. Install it via your package manager.`)}const l=1e4;async function u(...e){await a().runCommand(`xdotool`,e,{allowFailure:!1,timeoutMs:l})}async function d(...e){await a().runCommand(`ydotool`,e,{allowFailure:!1,timeoutMs:l})}function f(){return a().input}async function p(e,t){let{tool:n}=await c();if(n===`xdotool`){if(await m(e,t))return;await u(`mousemove`,`--sync`,String(e),String(t))}else await d(`mousemove`,`--absolute`,`-x`,String(e),`-y`,String(t))}async function m(e,t){try{let n=await a().runCommand(`xdotool`,[`getmouselocation`,`--shell`],{allowFailure:!0,timeoutMs:l}),r=new Map(n.stdout.split(`
2
- `).map(e=>e.trim().split(`=`)).filter(e=>e.length===2).map(([e,t])=>[e,Number(t)]));return r.get(`X`)===Math.round(e)&&r.get(`Y`)===Math.round(t)}catch{return!1}}async function h(e,t){let n=f();if(n){await n.key(e,t);return}let{tool:r}=await c();r===`xdotool`?await u(`key`,`--clearmodifiers`,e):await d(`key`,...t)}async function g(e,t,n,r){await p(e,t);let{tool:i}=await c();i===`xdotool`?await u(`click`,n):await d(`click`,r)}async function _(e,t,n,r,i){let a=f();if(a){await a.click(e,t,n);return}await g(e,t,r,i)}async function v(e,t){await _(e,t,`primary`,`1`,`0xC0`)}async function y(e,t){await _(e,t,`secondary`,`3`,`0xC1`)}async function b(e,t){await _(e,t,`middle`,`2`,`0xC2`)}async function x(e,t){let n=f();if(n){await n.doubleClick(e,t);return}let{tool:r}=await c();await p(e,t),r===`xdotool`?await u(`click`,`--repeat`,`2`,`1`):(await d(`click`,`0xC0`),await d(`click`,`0xC0`))}async function S(e,t,n=800){let r=f();if(r){await r.longPress(e,t,n);return}let{tool:a}=await c();await p(e,t),a===`xdotool`?(await u(`mousedown`,`1`),await i(n),await u(`mouseup`,`1`)):(await d(`click`,`--down`,`0xC0`),await i(n),await d(`click`,`--up`,`0xC0`))}async function C(e,t){await v(e,t)}async function w(e,t,n,r,a=300){let o=f();if(o){await o.drag(e,t,n,r,a);return}let{tool:s}=await c();await p(e,t),s===`xdotool`?(await u(`mousedown`,`1`),await u(`mousemove`,`--sync`,String(n),String(r)),await i(a),await u(`mouseup`,`1`)):(await d(`click`,`--down`,`0xC0`),await d(`mousemove`,`--absolute`,`-x`,String(n),`-y`,String(r)),await i(a),await d(`click`,`--up`,`0xC0`))}async function T(e,t){let r=f();if(r)return await r.scroll(e,t),D(t);let{tool:i}=await c(),a=5;if(t?.pixels==null?t?.amount!=null&&(a=Math.max(1,Math.round(5*(t.amount/n)))):a=i===`xdotool`?Math.max(1,Math.round(t.pixels/15)):Math.max(1,Math.round(t.pixels/40)),i===`xdotool`){let n=e===`up`?`4`:e===`down`?`5`:e===`left`?`6`:`7`;await E(a,t?.durationMs,async e=>{await u(`click`,`--repeat`,String(e),n)})}else e===`up`||e===`down`?await E(a,t?.durationMs,async t=>{await d(`mousemove`,`--wheel`,`-y`,String(e===`up`?-t:t))}):await E(a,t?.durationMs,async t=>{await d(`mousemove`,`--wheel`,`-x`,String(e===`left`?-t:t))});return D(t)}async function E(e,n,r){if(n===void 0||n<=0||e<=1){await r(e);return}let a=n/Math.max(1,e-1),o=0;try{for(let t=0;t<e;t+=1)await r(1),o+=1,t<e-1&&await i(a)}catch(e){throw t(e,o)}}function D(e){return e?.durationMs===void 0?{}:{durationMs:e.durationMs}}async function O(e,t=0){let n=f();if(n){await n.typeText(e,{delayMs:t});return}let{tool:r}=await c();if(r===`xdotool`){let n=[`type`];t>0&&n.push(`--delay`,String(t)),n.push(`--clearmodifiers`,`--`,e),await u(...n)}else await d(`type`,`--`,e)}async function k(e,t,n,r=0){if(await v(e,t),await i(100),await h(`ctrl+a`,[`29:1`,`30:1`,`30:0`,`29:0`]),await i(50),n.length===0){await h(`BackSpace`,[`14:1`,`14:0`]);return}await O(n,r)}export{x as doubleClickLinux,k as fillLinux,C as focusLinux,S as longPressLinux,b as middleClickLinux,v as pressLinux,y as rightClickLinux,T as scrollLinux,h as sendKey,w as swipeLinux,O as typeLinux};
1
+ import{B as e,P as t}from"./sdk-contracts.js";import{t as n}from"./scroll-gesture.js";import{l as r}from"./owner-identity.js";import{t as i}from"./timeouts.js";import"./process.js";import"./retry.js";import{t as a}from"./tool-provider2.js";function o(){let e=r();return e.WAYLAND_DISPLAY||e.XDG_SESSION_TYPE===`wayland`?`wayland`:`x11`}let s=null;async function c(){let e=a();if(s?.provider===e)return s;let n=o();if(n===`wayland`){if(await e.whichCommand(`ydotool`))return s={tool:`ydotool`,display:n,provider:e},s;throw new t(`TOOL_MISSING`,`ydotool is required for input synthesis on Wayland (xdotool does not work on Wayland). Install it via your package manager.`)}if(await e.whichCommand(`xdotool`))return s={tool:`xdotool`,display:n,provider:e},s;throw new t(`TOOL_MISSING`,`xdotool is required for input synthesis on X11. Install it via your package manager.`)}const l=1e4;async function u(...e){await a().runCommand(`xdotool`,e,{allowFailure:!1,timeoutMs:l})}async function d(...e){await a().runCommand(`ydotool`,e,{allowFailure:!1,timeoutMs:l})}function f(){return a().input}async function p(e,t){let{tool:n}=await c();if(n===`xdotool`){if(await m(e,t))return;await u(`mousemove`,`--sync`,String(e),String(t))}else await d(`mousemove`,`--absolute`,`-x`,String(e),`-y`,String(t))}async function m(e,t){try{let n=await a().runCommand(`xdotool`,[`getmouselocation`,`--shell`],{allowFailure:!0,timeoutMs:l}),r=new Map(n.stdout.split(`
2
+ `).map(e=>e.trim().split(`=`)).filter(e=>e.length===2).map(([e,t])=>[e,Number(t)]));return r.get(`X`)===Math.round(e)&&r.get(`Y`)===Math.round(t)}catch{return!1}}async function h(e,t){let n=f();if(n){await n.key(e,t);return}let{tool:r}=await c();r===`xdotool`?await u(`key`,`--clearmodifiers`,e):await d(`key`,...t)}async function g(e,t,n,r){await p(e,t);let{tool:i}=await c();i===`xdotool`?await u(`click`,n):await d(`click`,r)}async function _(e,t,n,r,i){let a=f();if(a){await a.click(e,t,n);return}await g(e,t,r,i)}async function v(e,t){await _(e,t,`primary`,`1`,`0xC0`)}async function y(e,t){await _(e,t,`secondary`,`3`,`0xC1`)}async function b(e,t){await _(e,t,`middle`,`2`,`0xC2`)}async function x(e,t){let n=f();if(n){await n.doubleClick(e,t);return}let{tool:r}=await c();await p(e,t),r===`xdotool`?await u(`click`,`--repeat`,`2`,`1`):(await d(`click`,`0xC0`),await d(`click`,`0xC0`))}async function S(e,t,n=800){let r=f();if(r){await r.longPress(e,t,n);return}let{tool:a}=await c();await p(e,t),a===`xdotool`?(await u(`mousedown`,`1`),await i(n),await u(`mouseup`,`1`)):(await d(`click`,`--down`,`0xC0`),await i(n),await d(`click`,`--up`,`0xC0`))}async function C(e,t){await v(e,t)}async function w(e,t,n,r,a=300){let o=f();if(o){await o.drag(e,t,n,r,a);return}let{tool:s}=await c();await p(e,t),s===`xdotool`?(await u(`mousedown`,`1`),await u(`mousemove`,`--sync`,String(n),String(r)),await i(a),await u(`mouseup`,`1`)):(await d(`click`,`--down`,`0xC0`),await d(`mousemove`,`--absolute`,`-x`,String(n),`-y`,String(r)),await i(a),await d(`click`,`--up`,`0xC0`))}async function T(e,t){let r=f();if(r)return await r.scroll(e,t),D(t);let{tool:i}=await c(),a=5;if(t?.pixels==null?t?.amount!=null&&(a=Math.max(1,Math.round(5*(t.amount/n)))):a=i===`xdotool`?Math.max(1,Math.round(t.pixels/15)):Math.max(1,Math.round(t.pixels/40)),i===`xdotool`){let n=e===`up`?`4`:e===`down`?`5`:e===`left`?`6`:`7`;await E(a,t?.durationMs,async e=>{await u(`click`,`--repeat`,String(e),n)})}else e===`up`||e===`down`?await E(a,t?.durationMs,async t=>{await d(`mousemove`,`--wheel`,`-y`,String(e===`up`?-t:t))}):await E(a,t?.durationMs,async t=>{await d(`mousemove`,`--wheel`,`-x`,String(e===`left`?-t:t))});return D(t)}async function E(t,n,r){if(n===void 0||n<=0||t<=1){await r(t);return}let a=n/Math.max(1,t-1),o=0;try{for(let e=0;e<t;e+=1)await r(1),o+=1,e<t-1&&await i(a)}catch(t){throw e(t,o)}}function D(e){return e?.durationMs===void 0?{}:{durationMs:e.durationMs}}async function O(e,t=0){let n=f();if(n){await n.typeText(e,{delayMs:t});return}let{tool:r}=await c();if(r===`xdotool`){let n=[`type`];t>0&&n.push(`--delay`,String(t)),n.push(`--clearmodifiers`,`--`,e),await u(...n)}else await d(`type`,`--`,e)}async function k(e,t,n,r=0){if(await v(e,t),await i(100),await h(`ctrl+a`,[`29:1`,`30:1`,`30:0`,`29:0`]),await i(50),n.length===0){await h(`BackSpace`,[`14:1`,`14:0`]);return}await O(n,r)}export{x as doubleClickLinux,k as fillLinux,C as focusLinux,S as longPressLinux,b as middleClickLinux,v as pressLinux,y as rightClickLinux,T as scrollLinux,h as sendKey,w as swipeLinux,O as typeLinux};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{r as t}from"./archive.js";import{a as n,c as r,n as i,o as a,r as o,s}from"./install-source2.js";import{C as c,g as l,m as u}from"./host-file.js";import{t as d}from"./plist.js";import f from"node:path";async function p(e,t){let n=f.join(e,`Info.plist`),[r,i,a]=await Promise.all([d(n,`CFBundleIdentifier`,t),d(n,`CFBundleDisplayName`,t),d(n,`CFBundleName`,t)]);return{bundleId:r,appName:i??a}}async function m(e,t){return await r(async()=>await h(e,t))}async function h(t,n){if(t.kind===`url`&&!i(t.url))throw new e(`INVALID_ARGS`,`iOS install_from_source URL sources are only supported for trusted artifact services such as GitHub Actions and EAS. Use a path source for other hosts.`);let r=await o({source:t,isInstallablePath:(e,t)=>t.isDirectory()&&e.toLowerCase().endsWith(`.app`)||t.isFile()&&e.toLowerCase().endsWith(`.ipa`),installableLabel:`iOS installable (.app or .ipa)`,allowArchiveExtraction:t.kind!==`url`||i(t.url),signal:n?.signal}),a;try{a=await g(r.installablePath,n);let e=a,t=await p(e.installPath,n?.signal);return{archivePath:r.archivePath??(r.installablePath.toLowerCase().endsWith(`.ipa`)?r.installablePath:void 0),installablePath:e.installPath,bundleId:t.bundleId,appName:t.appName,cleanup:async()=>{await e.cleanup(),await r.cleanup()}}}catch(e){try{await a?.cleanup()}finally{await r.cleanup()}throw e}}async function g(e,t){return e.toLowerCase().endsWith(`.ipa`)?await _(e,t):{installPath:e,cleanup:async()=>{}}}async function _(r,i){let o=await u(`agent-device-ios-ipa-`),d=async()=>{await c(o)};try{let c=f.join(o,`extracted`),u=a()+1,p=n();await t({archivePath:r,outputRoot:c,type:`zip`,budget:p,depth:u,signal:i?.signal}),s(u);let m=f.join(c,`Payload`),h=(await l(m,{withFileTypes:!0}).catch(()=>{throw new e(`INVALID_ARGS`,`Invalid IPA: missing Payload directory`)})).filter(e=>e.isDirectory()&&e.name.toLowerCase().endsWith(`.app`)).map(e=>({installPath:f.join(m,e.name),bundleName:e.name.replace(/\.app$/i,``)})),g=h[0];if(g!==void 0&&h.length===1)return{installPath:g.installPath,cleanup:d};if(h.length===0)throw new e(`INVALID_ARGS`,`Invalid IPA: expected at least one .app under Payload, found 0`);await v(h,i?.signal);let _=i?.appIdentifierHint?.trim();if(_){let t=y(h,_);if(t)return{installPath:t.installPath,cleanup:d};throw new e(`INVALID_ARGS`,`Invalid IPA: found ${h.length} .app bundles under Payload and none matched "${_}". Available bundles: ${h.map(b).join(`, `)}`)}throw new e(`INVALID_ARGS`,`Invalid IPA: found ${h.length} .app bundles under Payload. Pass an app identifier or bundle name matching one of: ${h.map(b).join(`, `)}`)}catch(e){throw await d(),e}}async function v(e,t){await Promise.all(e.map(async e=>{if(e.bundleId&&e.appName)return;let n=await p(e.installPath,t);e.bundleId=e.bundleId??n.bundleId,e.appName=e.appName??n.appName}))}function y(t,n){let r=n.toLowerCase(),i=t.filter(e=>e.bundleName.toLowerCase()===r);if(i.length===1)return i[0];if(i.length>1)throw new e(`INVALID_ARGS`,`Invalid IPA: multiple app bundles matched "${n}" by name. Use a bundle id hint instead.`);if(n.includes(`.`)){let e=t.filter(e=>e.bundleId?.toLowerCase()===r);if(e.length===1)return e[0]}}function b(e){let t=e.bundleId??e.appName;return t?`${e.bundleName}.app (${t})`:`${e.bundleName}.app`}export{m as prepareIosInstallArtifact,p as readIosBundleInfo};
1
+ import{P as e}from"./sdk-contracts.js";import{n as t,r as n}from"./archive.js";import{a as r,c as i,o as a,r as o,s}from"./install-source2.js";import{C as c,g as l,m as u}from"./host-file.js";import{t as d}from"./plist.js";import f from"node:path";async function p(e,t){let n=f.join(e,`Info.plist`),[r,i,a]=await Promise.all([d(n,`CFBundleIdentifier`,t),d(n,`CFBundleDisplayName`,t),d(n,`CFBundleName`,t)]);return{bundleId:r,appName:i??a}}async function m(e,t){return await i(async()=>await h(e,t))}async function h(e,t){let n=await o({source:e,isInstallablePath:(e,t)=>t.isDirectory()&&e.toLowerCase().endsWith(`.app`)||t.isFile()&&e.toLowerCase().endsWith(`.ipa`),installableLabel:`iOS installable (.app or .ipa)`,signal:t?.signal}),r;try{r=await _(n.installablePath,t);let e=r,i=await p(e.installPath,t?.signal),a=n.archivePath??(n.installablePath.toLowerCase().endsWith(`.ipa`)?n.installablePath:void 0),o=g(n);return{archivePath:a,installablePath:e.installPath,...o?{uploadPath:o}:{},bundleId:i.bundleId,appName:i.appName,cleanup:async()=>{await e.cleanup(),await n.cleanup()}}}catch(e){try{await r?.cleanup()}finally{await n.cleanup()}throw e}}function g(e){if(e.installablePath.toLowerCase().endsWith(`.ipa`))return e.installablePath;let{containingArchivePath:n}=e;return n&&t(n)===`zip`?n:void 0}async function _(e,t){return e.toLowerCase().endsWith(`.ipa`)?await v(e,t):{installPath:e,cleanup:async()=>{}}}async function v(t,i){let o=await u(`agent-device-ios-ipa-`),d=async()=>{await c(o)};try{let c=f.join(o,`extracted`),u=a()+1,p=r();await n({archivePath:t,outputRoot:c,type:`zip`,budget:p,depth:u,signal:i?.signal}),s(u);let m=f.join(c,`Payload`),h=(await l(m,{withFileTypes:!0}).catch(()=>{throw new e(`INVALID_ARGS`,`Invalid IPA: missing Payload directory`)})).filter(e=>e.isDirectory()&&e.name.toLowerCase().endsWith(`.app`)).map(e=>({installPath:f.join(m,e.name),bundleName:e.name.replace(/\.app$/i,``)})),g=h[0];if(g!==void 0&&h.length===1)return{installPath:g.installPath,cleanup:d};if(h.length===0)throw new e(`INVALID_ARGS`,`Invalid IPA: expected at least one .app under Payload, found 0`);await y(h,i?.signal);let _=i?.appIdentifierHint?.trim();if(_){let t=b(h,_);if(t)return{installPath:t.installPath,cleanup:d};throw new e(`INVALID_ARGS`,`Invalid IPA: found ${h.length} .app bundles under Payload and none matched "${_}". Available bundles: ${h.map(x).join(`, `)}`)}throw new e(`INVALID_ARGS`,`Invalid IPA: found ${h.length} .app bundles under Payload. Pass an app identifier or bundle name matching one of: ${h.map(x).join(`, `)}`)}catch(e){throw await d(),e}}async function y(e,t){await Promise.all(e.map(async e=>{if(e.bundleId&&e.appName)return;let n=await p(e.installPath,t);e.bundleId=e.bundleId??n.bundleId,e.appName=e.appName??n.appName}))}function b(t,n){let r=n.toLowerCase(),i=t.filter(e=>e.bundleName.toLowerCase()===r);if(i.length===1)return i[0];if(i.length>1)throw new e(`INVALID_ARGS`,`Invalid IPA: multiple app bundles matched "${n}" by name. Use a bundle id hint instead.`);if(n.includes(`.`)){let e=t.filter(e=>e.bundleId?.toLowerCase()===r);if(e.length===1)return e[0]}}function x(e){let t=e.bundleId??e.appName;return t?`${e.bundleName}.app (${t})`:`${e.bundleName}.app`}export{m as prepareIosInstallArtifact,p as readIosBundleInfo};
@@ -1 +1 @@
1
- import{a as e,t}from"./rolldown-runtime.js";import{F as n,G as r,N as i}from"./sdk-contracts.js";import{t as a}from"./undici.js";import o from"node:net";import s from"node:dns/promises";var c=e(t(((e,t)=>{(function(e){let n=`(0?\\d+|0x[a-f0-9]+)`,r={fourOctet:RegExp(`^${n}\\.${n}\\.${n}\\.${n}$`,`i`),threeOctet:RegExp(`^${n}\\.${n}\\.${n}$`,`i`),twoOctet:RegExp(`^${n}\\.${n}$`,`i`),longValue:RegExp(`^${n}$`,`i`)},i=RegExp(`^0[0-7]+$`,`i`),a=RegExp(`^0x[a-f0-9]+$`,`i`),o=`%[0-9a-z]{1,}`,s=`(?:[0-9a-f]+::?)+`,c={zoneIndex:RegExp(o,`i`),native:RegExp(`^(::)?(${s})?([0-9a-f]+)?(::)?(${o})?$`,`i`),deprecatedTransitional:RegExp(`^(?:::)(${n}\\.${n}\\.${n}\\.${n}(${o})?)$`,`i`),transitional:RegExp(`^((?:${s})|(?:::)(?:${s})?)${n}\\.${n}\\.${n}\\.${n}(${o})?$`,`i`)};function l(e,t){if(e.indexOf(`::`)!==e.lastIndexOf(`::`))return null;let n=0,r=-1,i=(e.match(c.zoneIndex)||[])[0],a,o;for(i&&(i=i.substring(1),e=e.replace(/%.+$/,``));(r=e.indexOf(`:`,r+1))>=0;)n++;if(e.substr(0,2)===`::`&&n--,e.substr(-2,2)===`::`&&n--,n>=t)return null;for(o=t-n,a=`:`;o--;)a+=`0:`;return e=e.replace(`::`,a),e[0]===`:`&&(e=e.slice(1)),e[e.length-1]===`:`&&(e=e.slice(0,-1)),t=(function(){let t=e.split(`:`),n=[];for(let e=0;e<t.length;e++)n.push(t[e].length>4?NaN:parseInt(t[e],16));return n})(),{parts:t,zoneId:i}}function u(e,t,n,r){if(e.length!==t.length)throw Error(`ipaddr: cannot match CIDR for objects with different lengths`);let i=0,a;for(;r>0;){if(a=n-r,a<0&&(a=0),e[i]>>a!==t[i]>>a)return!1;r-=n,i+=1}return!0}function d(e){if(a.test(e))return parseInt(e,16);if(e[0]===`0`&&!isNaN(parseInt(e[1],10))){if(i.test(e))return parseInt(e,8);throw Error(`ipaddr: cannot parse ${e} as octal`)}return parseInt(e,10)}function f(e,t){for(;e.length<t;)e=`0${e}`;return e}let p={};p.IPv4=(function(){function e(e){if(e.length!==4)throw Error(`ipaddr: ipv4 octet count should be 4`);let t,n;for(t=0;t<e.length;t++)if(n=e[t],!(0<=n&&n<=255))throw Error(`ipaddr: ipv4 octet should fit in 8 bits`);this.octets=e}return e.prototype.SpecialRanges={unspecified:[[new e([0,0,0,0]),8]],broadcast:[[new e([255,255,255,255]),32]],multicast:[[new e([224,0,0,0]),4]],linkLocal:[[new e([169,254,0,0]),16]],loopback:[[new e([127,0,0,0]),8]],carrierGradeNat:[[new e([100,64,0,0]),10]],private:[[new e([10,0,0,0]),8],[new e([172,16,0,0]),12],[new e([192,168,0,0]),16]],reserved:[[new e([192,0,0,0]),24],[new e([192,0,2,0]),24],[new e([192,88,99,0]),24],[new e([198,18,0,0]),15],[new e([198,51,100,0]),24],[new e([203,0,113,0]),24],[new e([240,0,0,0]),4]],as112:[[new e([192,175,48,0]),24],[new e([192,31,196,0]),24]],amt:[[new e([192,52,193,0]),24]]},e.prototype.kind=function(){return`ipv4`},e.prototype.match=function(e,t){let n;if(t===void 0&&(n=e,e=n[0],t=n[1]),e.kind()!==`ipv4`)throw Error(`ipaddr: cannot match ipv4 address with non-ipv4 one`);return u(this.octets,e.octets,8,t)},e.prototype.prefixLengthFromSubnetMask=function(){let e=0,t=!1,n={0:8,128:7,192:6,224:5,240:4,248:3,252:2,254:1,255:0},r,i,a;for(r=3;r>=0;--r)if(i=this.octets[r],i in n){if(a=n[i],t&&a!==0)return null;a!==8&&(t=!0),e+=a}else return null;return 32-e},e.prototype.range=function(){return p.subnetMatch(this,this.SpecialRanges)},e.prototype.toByteArray=function(){return this.octets.slice(0)},e.prototype.toIPv4MappedAddress=function(){return p.IPv6.parse(`::ffff:${this.toString()}`)},e.prototype.toNormalizedString=function(){return this.toString()},e.prototype.toString=function(){return this.octets.join(`.`)},e})(),p.IPv4.broadcastAddressFromCIDR=function(e){try{let t=this.parseCIDR(e),n=t[0].toByteArray(),r=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],a=0;for(;a<4;)i.push(parseInt(n[a],10)|parseInt(r[a],10)^255),a++;return new this(i)}catch(e){throw Error(`ipaddr: the address does not have IPv4 CIDR format`,{cause:e})}},p.IPv4.isIPv4=function(e){return this.parser(e)!==null},p.IPv4.isValid=function(e){try{return new this(this.parser(e)),!0}catch{return!1}},p.IPv4.isValidCIDR=function(e){try{return this.parseCIDR(e),!0}catch{return!1}},p.IPv4.isValidFourPartDecimal=function(e){return!!(p.IPv4.isValid(e)&&e.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/))},p.IPv4.isValidCIDRFourPartDecimal=function(e){let t=e.match(/^(.+)\/(\d+)$/);return!p.IPv4.isValidCIDR(e)||!t?!1:p.IPv4.isValidFourPartDecimal(t[1])},p.IPv4.networkAddressFromCIDR=function(e){let t,n,r,i,a;try{for(t=this.parseCIDR(e),r=t[0].toByteArray(),a=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],n=0;n<4;)i.push(parseInt(r[n],10)&parseInt(a[n],10)),n++;return new this(i)}catch(e){throw Error(`ipaddr: the address does not have IPv4 CIDR format`,{cause:e})}},p.IPv4.parse=function(e){let t=this.parser(e);if(t===null)throw Error(`ipaddr: string is not formatted like an IPv4 Address`);return new this(t)},p.IPv4.parseCIDR=function(e){let t;if(t=e.match(/^(.+)\/(\d+)$/)){let e=parseInt(t[2]);if(e>=0&&e<=32){let n=[this.parse(t[1]),e];return Object.defineProperty(n,"toString",{value:function(){return this.join(`/`)}}),n}}throw Error(`ipaddr: string is not formatted like an IPv4 CIDR range`)},p.IPv4.parser=function(e){let t,n,i;if(t=e.match(r.fourOctet))return(function(){let e=t.slice(1,6),r=[];for(let t=0;t<e.length;t++)n=e[t],r.push(d(n));return r})();if(t=e.match(r.longValue)){if(i=d(t[1]),i>4294967295||i<0)throw Error(`ipaddr: address outside defined range`);return(function(){let e=[],t;for(t=0;t<=24;t+=8)e.push(i>>t&255);return e})().reverse()}return(t=e.match(r.twoOctet))?(function(){let e=t.slice(1,4),n=[];if(i=d(e[1]),i>16777215||i<0)throw Error(`ipaddr: address outside defined range`);return n.push(d(e[0])),n.push(i>>16&255),n.push(i>>8&255),n.push(i&255),n})():(t=e.match(r.threeOctet))?(function(){let e=t.slice(1,5),n=[];if(i=d(e[2]),i>65535||i<0)throw Error(`ipaddr: address outside defined range`);return n.push(d(e[0])),n.push(d(e[1])),n.push(i>>8&255),n.push(i&255),n})():null},p.IPv4.subnetMaskFromPrefixLength=function(e){if(e=parseInt(e),Number.isNaN(e)||e<0||e>32)throw Error(`ipaddr: invalid IPv4 prefix length`);let t=[0,0,0,0],n=0,r=Math.floor(e/8);for(;n<r;)t[n]=255,n++;return r<4&&(t[r]=2**(e%8)-1<<8-e%8),new this(t)},p.IPv6=(function(){function e(e,t){let n,r;if(e.length===16)for(this.parts=[],n=0;n<=14;n+=2)this.parts.push(e[n]<<8|e[n+1]);else if(e.length===8)this.parts=e;else throw Error(`ipaddr: ipv6 part count should be 8 or 16`);for(n=0;n<this.parts.length;n++)if(r=this.parts[n],!(0<=r&&r<=65535))throw Error(`ipaddr: ipv6 part should fit in 16 bits`);t&&(this.zoneId=t)}return e.prototype.SpecialRanges={unspecified:[new e([0,0,0,0,0,0,0,0]),128],linkLocal:[new e([65152,0,0,0,0,0,0,0]),10],multicast:[new e([65280,0,0,0,0,0,0,0]),8],loopback:[new e([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new e([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new e([0,0,0,0,0,65535,0,0]),96],deprecatedSiteLocal:[new e([65216,0,0,0,0,0,0,0]),10],discard:[new e([256,0,0,0,0,0,0,0]),64],rfc6145:[new e([0,0,0,0,65535,0,0,0]),96],rfc6052:[[new e([100,65435,0,0,0,0,0,0]),96],[new e([100,65435,1,0,0,0,0,0]),48]],"6to4":[new e([8194,0,0,0,0,0,0,0]),16],teredo:[new e([8193,0,0,0,0,0,0,0]),32],benchmarking:[new e([8193,2,0,0,0,0,0,0]),48],amt:[new e([8193,3,0,0,0,0,0,0]),32],as112v6:[[new e([8193,4,274,0,0,0,0,0]),48],[new e([9760,79,32768,0,0,0,0,0]),48]],deprecatedOrchid:[new e([8193,16,0,0,0,0,0,0]),28],orchid2:[new e([8193,32,0,0,0,0,0,0]),28],droneRemoteIdProtocolEntityTags:[new e([8193,48,0,0,0,0,0,0]),28],segmentRouting:[new e([24320,0,0,0,0,0,0,0]),16],reserved:[[new e([8193,0,0,0,0,0,0,0]),23],[new e([8193,3512,0,0,0,0,0,0]),32],[new e([16383,0,0,0,0,0,0,0]),20]]},e.prototype.isIPv4MappedAddress=function(){return this.range()===`ipv4Mapped`},e.prototype.kind=function(){return`ipv6`},e.prototype.match=function(e,t){let n;if(t===void 0&&(n=e,e=n[0],t=n[1]),e.kind()!==`ipv6`)throw Error(`ipaddr: cannot match ipv6 address with non-ipv6 one`);return u(this.parts,e.parts,16,t)},e.prototype.prefixLengthFromSubnetMask=function(){let e=0,t=!1,n={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0},r,i;for(let a=7;a>=0;--a)if(r=this.parts[a],r in n){if(i=n[r],t&&i!==0)return null;i!==16&&(t=!0),e+=i}else return null;return 128-e},e.prototype.range=function(){return p.subnetMatch(this,this.SpecialRanges)},e.prototype.toByteArray=function(){let e,t=[],n=this.parts;for(let r=0;r<n.length;r++)e=n[r],t.push(e>>8),t.push(e&255);return t},e.prototype.toFixedLengthString=function(){let e=(function(){let e=[];for(let t=0;t<this.parts.length;t++)e.push(f(this.parts[t].toString(16),4));return e}).call(this).join(`:`),t=``;return this.zoneId&&(t=`%${this.zoneId}`),e+t},e.prototype.toIPv4Address=function(){if(!this.isIPv4MappedAddress())throw Error(`ipaddr: trying to convert a generic ipv6 address to ipv4`);let e=this.parts.slice(-2),t=e[0],n=e[1];return new p.IPv4([t>>8,t&255,n>>8,n&255])},e.prototype.toNormalizedString=function(){let e=(function(){let e=[];for(let t=0;t<this.parts.length;t++)e.push(this.parts[t].toString(16));return e}).call(this).join(`:`),t=``;return this.zoneId&&(t=`%${this.zoneId}`),e+t},e.prototype.toRFC5952String=function(){let e=/((^|:)(0(:|$)){2,})/g,t=``;this.zoneId&&(t=`%${this.zoneId}`);let n=this.toNormalizedString(),r=n.slice(0,n.length-t.length),i=0,a=-1,o=-1,s;for(;s=e.exec(r);){let e=(s[0].match(/0/g)||[]).length;e>o&&(o=e,i=s.index,a=s[0].length)}return a<0?r+t:`${r.substring(0,i)}::${r.substring(i+a)}${t}`},e.prototype.toString=function(){return this.toRFC5952String()},e})(),p.IPv6.broadcastAddressFromCIDR=function(e){try{let t=this.parseCIDR(e),n=t[0].toByteArray(),r=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],a=0;for(;a<16;)i.push(parseInt(n[a],10)|parseInt(r[a],10)^255),a++;return new this(i)}catch(e){throw Error(`ipaddr: the address does not have IPv6 CIDR format`,{cause:e})}},p.IPv6.isIPv6=function(e){return this.parser(e)!==null},p.IPv6.isValid=function(e){if(typeof e==`string`&&e.indexOf(`:`)===-1)return!1;try{let t=this.parser(e);return new this(t.parts,t.zoneId),!0}catch{return!1}},p.IPv6.isValidCIDR=function(e){if(typeof e==`string`&&e.indexOf(`:`)===-1)return!1;try{return this.parseCIDR(e),!0}catch{return!1}},p.IPv6.networkAddressFromCIDR=function(e){let t,n,r,i,a;try{for(t=this.parseCIDR(e),r=t[0].toByteArray(),a=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],n=0;n<16;)i.push(parseInt(r[n],10)&parseInt(a[n],10)),n++;return new this(i)}catch(e){throw Error(`ipaddr: the address does not have IPv6 CIDR format`,{cause:e})}},p.IPv6.parse=function(e){let t=this.parser(e);if(t===null)throw Error(`ipaddr: string is not formatted like an IPv6 Address`);return new this(t.parts,t.zoneId)},p.IPv6.parseCIDR=function(e){let t,n,r;if((n=e.match(/^(.+)\/(\d+)$/))&&(t=parseInt(n[2]),t>=0&&t<=128))return r=[this.parse(n[1]),t],Object.defineProperty(r,"toString",{value:function(){return this.join(`/`)}}),r;throw Error(`ipaddr: string is not formatted like an IPv6 CIDR range`)},p.IPv6.parser=function(e){let t,n,r,i,a,o;if(r=e.match(c.deprecatedTransitional))return this.parser(`::ffff:${r[1]}`);if(c.native.test(e))return l(e,8);if((r=e.match(c.transitional))&&(o=r[6]||``,t=r[1],r[1].endsWith(`::`)||(t=t.slice(0,-1)),t=l(t+o,6),t&&t.parts)){for(a=[parseInt(r[2]),parseInt(r[3]),parseInt(r[4]),parseInt(r[5])],n=0;n<a.length;n++)if(i=a[n],!(0<=i&&i<=255))return null;return t.parts.push(a[0]<<8|a[1]),t.parts.push(a[2]<<8|a[3]),{parts:t.parts,zoneId:t.zoneId}}return null},p.IPv6.subnetMaskFromPrefixLength=function(e){if(e=parseInt(e),Number.isNaN(e)||e<0||e>128)throw Error(`ipaddr: invalid IPv6 prefix length`);let t=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],n=0,r=Math.floor(e/8);for(;n<r;)t[n]=255,n++;return r<16&&(t[r]=2**(e%8)-1<<8-e%8),new this(t)},p.fromByteArray=function(e){let t=e.length;if(t===4)return new p.IPv4(e);if(t===16)return new p.IPv6(e);throw Error(`ipaddr: the binary input is neither an IPv6 nor IPv4 address`)},p.isValid=function(e){return p.IPv6.isValid(e)||p.IPv4.isValid(e)},p.isValidCIDR=function(e){return p.IPv6.isValidCIDR(e)||p.IPv4.isValidCIDR(e)},p.parse=function(e){if(p.IPv6.isValid(e))return p.IPv6.parse(e);if(p.IPv4.isValid(e))return p.IPv4.parse(e);throw Error(`ipaddr: the address has neither IPv6 nor IPv4 format`)},p.parseCIDR=function(e){try{return p.IPv6.parseCIDR(e)}catch{try{return p.IPv4.parseCIDR(e)}catch(e){throw Error(`ipaddr: the address has neither IPv6 nor IPv4 CIDR format`,{cause:e})}}},p.process=function(e){let t=this.parse(e);return t.kind()===`ipv6`&&t.isIPv4MappedAddress()?t.toIPv4Address():t},p.subnetMatch=function(e,t,n){let r,i,a,o;for(i in n??=`unicast`,t)if(Object.prototype.hasOwnProperty.call(t,i)){for(a=t[i],a[0]&&!(a[0]instanceof Array)&&(a=[a]),r=0;r<a.length;r++)if(o=a[r],e.kind()===o[0].kind()&&e.match.apply(e,o))return i}return n},t!==void 0&&t.exports?t.exports=p:e.ipaddr=p})(e)}))(),1);async function l(e,t){if(e.protocol!==`http:`&&e.protocol!==`https:`)throw new i(`INVALID_ARGS`,`Unsupported source URL protocol: ${e.protocol}`);if(e.username||e.password)throw new i(`INVALID_ARGS`,`Source URL credentials are not allowed`);d(t);let n=h(e.hostname);p(n)&&_(e.hostname);let a=o.isIP(n);if(a)return{address:n,family:a};let s;try{s=await u(n,t)}catch(e){throw r(e)?e:new i(`INVALID_ARGS`,`Source URL host could not be resolved: ${n}`,{hint:`Use a public artifact URL.`},e)}if(s.length===0)throw new i(`INVALID_ARGS`,`Source URL host could not be resolved: ${n}`,{hint:`Use a public artifact URL.`});s.some(e=>m(e.address))&&_(n);let c=s[0];return{address:c.address,family:c.family}}async function u(e,t){let n=s.lookup(e,{all:!0,verbatim:!0});return t?await new Promise((e,r)=>{let i=()=>r(f(t.reason));t.addEventListener(`abort`,i,{once:!0}),n.then(e,r).finally(()=>t.removeEventListener(`abort`,i))}):await n}function d(e){if(e?.aborted)throw f(e.reason)}function f(e){return n(void 0,e)}function p(e){let t;try{t=h(e)}catch{return!0}return!t||t===`localhost`||t.endsWith(`.localhost`)?!0:o.isIP(t)!==0&&m(t)}function m(e){try{return c.default.process(g(e)).range()!==`unicast`}catch{return!0}}function h(e){let t=g(e).toLowerCase().replace(/\.$/,``);if(!t||t.includes(`%`))throw new i(`INVALID_ARGS`,`Source URL host is not allowed`,{hint:`Use a public artifact URL.`});return t}function g(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}function _(e){throw new i(`INVALID_ARGS`,`Source URL host is not allowed because it resolves to a non-public address: ${e}`,{hint:`Use a public artifact URL.`})}var v=a();async function y(e){let t=b(e.url),n=t?C(t,e.url):S(e.approvedAddress,e.family),r=t?w(e.url,e.approvedAddress,e.family):e.url;try{let i={dispatcher:n,headers:t?{...e.headers,host:e.url.host}:e.headers,maxRedirections:0,method:`GET`,signal:e.signal},a=await(0,v.request)(r,i);return{statusCode:a.statusCode,headers:a.headers,body:a.body,close:async()=>await D(n)}}catch(e){throw await D(n),e}}function b(e,t=process.env){if(x(e,t.no_proxy??t.NO_PROXY))return;let n=t.http_proxy??t.HTTP_PROXY;return e.protocol===`http:`?n||void 0:(t.https_proxy??t.HTTPS_PROXY)||n||void 0}function x(e,t){if(!t)return!1;let n=E(e.hostname).toLowerCase(),r=e.port||(e.protocol===`https:`?`443`:`80`);return t.split(/[\s,]+/).filter(Boolean).some(e=>{if(e===`*`)return!0;let t=T(e);if(t.port&&t.port!==r)return!1;let i=t.hostname.replace(/^\*?\./,``).toLowerCase();return n===i||n.endsWith(`.${i}`)})}function S(e,t){return new v.Agent({connect:{lookup:(n,r,i)=>{if(r.all){i(null,[{address:e,family:t}]);return}i(null,e,t)}}})}function C(e,t){let n=o.isIP(E(t.hostname))!==0;return new v.ProxyAgent({uri:e,proxyTunnel:!0,requestTls:t.protocol===`https:`&&!n?{servername:E(t.hostname)}:void 0})}function w(e,t,n){let r=new URL(e);return r.hostname=n===6?`[${E(t)}]`:t,r}function T(e){if(e.startsWith(`[`)){let t=e.indexOf(`]`);return t<0?{hostname:e}:{hostname:e.slice(1,t),port:e[t+1]===`:`?e.slice(t+2):void 0}}let t=e.lastIndexOf(`:`);return t>-1&&e.indexOf(`:`)===t?{hostname:e.slice(0,t),port:e.slice(t+1)}:{hostname:e}}function E(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}async function D(e){await e.close()}export{b as n,l as r,y as t};
1
+ import{a as e,t}from"./rolldown-runtime.js";import{I as n,K as r,P as i}from"./sdk-contracts.js";import{t as a}from"./undici.js";import o from"node:net";import s from"node:dns/promises";var c=e(t(((e,t)=>{(function(e){let n=`(0?\\d+|0x[a-f0-9]+)`,r={fourOctet:RegExp(`^${n}\\.${n}\\.${n}\\.${n}$`,`i`),threeOctet:RegExp(`^${n}\\.${n}\\.${n}$`,`i`),twoOctet:RegExp(`^${n}\\.${n}$`,`i`),longValue:RegExp(`^${n}$`,`i`)},i=RegExp(`^0[0-7]+$`,`i`),a=RegExp(`^0x[a-f0-9]+$`,`i`),o=`%[0-9a-z]{1,}`,s=`(?:[0-9a-f]+::?)+`,c={zoneIndex:RegExp(o,`i`),native:RegExp(`^(::)?(${s})?([0-9a-f]+)?(::)?(${o})?$`,`i`),deprecatedTransitional:RegExp(`^(?:::)(${n}\\.${n}\\.${n}\\.${n}(${o})?)$`,`i`),transitional:RegExp(`^((?:${s})|(?:::)(?:${s})?)${n}\\.${n}\\.${n}\\.${n}(${o})?$`,`i`)};function l(e,t){if(e.indexOf(`::`)!==e.lastIndexOf(`::`))return null;let n=0,r=-1,i=(e.match(c.zoneIndex)||[])[0],a,o;for(i&&(i=i.substring(1),e=e.replace(/%.+$/,``));(r=e.indexOf(`:`,r+1))>=0;)n++;if(e.substr(0,2)===`::`&&n--,e.substr(-2,2)===`::`&&n--,n>=t)return null;for(o=t-n,a=`:`;o--;)a+=`0:`;return e=e.replace(`::`,a),e[0]===`:`&&(e=e.slice(1)),e[e.length-1]===`:`&&(e=e.slice(0,-1)),t=(function(){let t=e.split(`:`),n=[];for(let e=0;e<t.length;e++)n.push(t[e].length>4?NaN:parseInt(t[e],16));return n})(),{parts:t,zoneId:i}}function u(e,t,n,r){if(e.length!==t.length)throw Error(`ipaddr: cannot match CIDR for objects with different lengths`);let i=0,a;for(;r>0;){if(a=n-r,a<0&&(a=0),e[i]>>a!==t[i]>>a)return!1;r-=n,i+=1}return!0}function d(e){if(a.test(e))return parseInt(e,16);if(e[0]===`0`&&!isNaN(parseInt(e[1],10))){if(i.test(e))return parseInt(e,8);throw Error(`ipaddr: cannot parse ${e} as octal`)}return parseInt(e,10)}function f(e,t){for(;e.length<t;)e=`0${e}`;return e}let p={};p.IPv4=(function(){function e(e){if(e.length!==4)throw Error(`ipaddr: ipv4 octet count should be 4`);let t,n;for(t=0;t<e.length;t++)if(n=e[t],!(0<=n&&n<=255))throw Error(`ipaddr: ipv4 octet should fit in 8 bits`);this.octets=e}return e.prototype.SpecialRanges={unspecified:[[new e([0,0,0,0]),8]],broadcast:[[new e([255,255,255,255]),32]],multicast:[[new e([224,0,0,0]),4]],linkLocal:[[new e([169,254,0,0]),16]],loopback:[[new e([127,0,0,0]),8]],carrierGradeNat:[[new e([100,64,0,0]),10]],private:[[new e([10,0,0,0]),8],[new e([172,16,0,0]),12],[new e([192,168,0,0]),16]],reserved:[[new e([192,0,0,0]),24],[new e([192,0,2,0]),24],[new e([192,88,99,0]),24],[new e([198,18,0,0]),15],[new e([198,51,100,0]),24],[new e([203,0,113,0]),24],[new e([240,0,0,0]),4]],as112:[[new e([192,175,48,0]),24],[new e([192,31,196,0]),24]],amt:[[new e([192,52,193,0]),24]]},e.prototype.kind=function(){return`ipv4`},e.prototype.match=function(e,t){let n;if(t===void 0&&(n=e,e=n[0],t=n[1]),e.kind()!==`ipv4`)throw Error(`ipaddr: cannot match ipv4 address with non-ipv4 one`);return u(this.octets,e.octets,8,t)},e.prototype.prefixLengthFromSubnetMask=function(){let e=0,t=!1,n={0:8,128:7,192:6,224:5,240:4,248:3,252:2,254:1,255:0},r,i,a;for(r=3;r>=0;--r)if(i=this.octets[r],i in n){if(a=n[i],t&&a!==0)return null;a!==8&&(t=!0),e+=a}else return null;return 32-e},e.prototype.range=function(){return p.subnetMatch(this,this.SpecialRanges)},e.prototype.toByteArray=function(){return this.octets.slice(0)},e.prototype.toIPv4MappedAddress=function(){return p.IPv6.parse(`::ffff:${this.toString()}`)},e.prototype.toNormalizedString=function(){return this.toString()},e.prototype.toString=function(){return this.octets.join(`.`)},e})(),p.IPv4.broadcastAddressFromCIDR=function(e){try{let t=this.parseCIDR(e),n=t[0].toByteArray(),r=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],a=0;for(;a<4;)i.push(parseInt(n[a],10)|parseInt(r[a],10)^255),a++;return new this(i)}catch(e){throw Error(`ipaddr: the address does not have IPv4 CIDR format`,{cause:e})}},p.IPv4.isIPv4=function(e){return this.parser(e)!==null},p.IPv4.isValid=function(e){try{return new this(this.parser(e)),!0}catch{return!1}},p.IPv4.isValidCIDR=function(e){try{return this.parseCIDR(e),!0}catch{return!1}},p.IPv4.isValidFourPartDecimal=function(e){return!!(p.IPv4.isValid(e)&&e.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/))},p.IPv4.isValidCIDRFourPartDecimal=function(e){let t=e.match(/^(.+)\/(\d+)$/);return!p.IPv4.isValidCIDR(e)||!t?!1:p.IPv4.isValidFourPartDecimal(t[1])},p.IPv4.networkAddressFromCIDR=function(e){let t,n,r,i,a;try{for(t=this.parseCIDR(e),r=t[0].toByteArray(),a=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],n=0;n<4;)i.push(parseInt(r[n],10)&parseInt(a[n],10)),n++;return new this(i)}catch(e){throw Error(`ipaddr: the address does not have IPv4 CIDR format`,{cause:e})}},p.IPv4.parse=function(e){let t=this.parser(e);if(t===null)throw Error(`ipaddr: string is not formatted like an IPv4 Address`);return new this(t)},p.IPv4.parseCIDR=function(e){let t;if(t=e.match(/^(.+)\/(\d+)$/)){let e=parseInt(t[2]);if(e>=0&&e<=32){let n=[this.parse(t[1]),e];return Object.defineProperty(n,"toString",{value:function(){return this.join(`/`)}}),n}}throw Error(`ipaddr: string is not formatted like an IPv4 CIDR range`)},p.IPv4.parser=function(e){let t,n,i;if(t=e.match(r.fourOctet))return(function(){let e=t.slice(1,6),r=[];for(let t=0;t<e.length;t++)n=e[t],r.push(d(n));return r})();if(t=e.match(r.longValue)){if(i=d(t[1]),i>4294967295||i<0)throw Error(`ipaddr: address outside defined range`);return(function(){let e=[],t;for(t=0;t<=24;t+=8)e.push(i>>t&255);return e})().reverse()}return(t=e.match(r.twoOctet))?(function(){let e=t.slice(1,4),n=[];if(i=d(e[1]),i>16777215||i<0)throw Error(`ipaddr: address outside defined range`);return n.push(d(e[0])),n.push(i>>16&255),n.push(i>>8&255),n.push(i&255),n})():(t=e.match(r.threeOctet))?(function(){let e=t.slice(1,5),n=[];if(i=d(e[2]),i>65535||i<0)throw Error(`ipaddr: address outside defined range`);return n.push(d(e[0])),n.push(d(e[1])),n.push(i>>8&255),n.push(i&255),n})():null},p.IPv4.subnetMaskFromPrefixLength=function(e){if(e=parseInt(e),Number.isNaN(e)||e<0||e>32)throw Error(`ipaddr: invalid IPv4 prefix length`);let t=[0,0,0,0],n=0,r=Math.floor(e/8);for(;n<r;)t[n]=255,n++;return r<4&&(t[r]=2**(e%8)-1<<8-e%8),new this(t)},p.IPv6=(function(){function e(e,t){let n,r;if(e.length===16)for(this.parts=[],n=0;n<=14;n+=2)this.parts.push(e[n]<<8|e[n+1]);else if(e.length===8)this.parts=e;else throw Error(`ipaddr: ipv6 part count should be 8 or 16`);for(n=0;n<this.parts.length;n++)if(r=this.parts[n],!(0<=r&&r<=65535))throw Error(`ipaddr: ipv6 part should fit in 16 bits`);t&&(this.zoneId=t)}return e.prototype.SpecialRanges={unspecified:[new e([0,0,0,0,0,0,0,0]),128],linkLocal:[new e([65152,0,0,0,0,0,0,0]),10],multicast:[new e([65280,0,0,0,0,0,0,0]),8],loopback:[new e([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new e([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new e([0,0,0,0,0,65535,0,0]),96],deprecatedSiteLocal:[new e([65216,0,0,0,0,0,0,0]),10],discard:[new e([256,0,0,0,0,0,0,0]),64],rfc6145:[new e([0,0,0,0,65535,0,0,0]),96],rfc6052:[[new e([100,65435,0,0,0,0,0,0]),96],[new e([100,65435,1,0,0,0,0,0]),48]],"6to4":[new e([8194,0,0,0,0,0,0,0]),16],teredo:[new e([8193,0,0,0,0,0,0,0]),32],benchmarking:[new e([8193,2,0,0,0,0,0,0]),48],amt:[new e([8193,3,0,0,0,0,0,0]),32],as112v6:[[new e([8193,4,274,0,0,0,0,0]),48],[new e([9760,79,32768,0,0,0,0,0]),48]],deprecatedOrchid:[new e([8193,16,0,0,0,0,0,0]),28],orchid2:[new e([8193,32,0,0,0,0,0,0]),28],droneRemoteIdProtocolEntityTags:[new e([8193,48,0,0,0,0,0,0]),28],segmentRouting:[new e([24320,0,0,0,0,0,0,0]),16],reserved:[[new e([8193,0,0,0,0,0,0,0]),23],[new e([8193,3512,0,0,0,0,0,0]),32],[new e([16383,0,0,0,0,0,0,0]),20]]},e.prototype.isIPv4MappedAddress=function(){return this.range()===`ipv4Mapped`},e.prototype.kind=function(){return`ipv6`},e.prototype.match=function(e,t){let n;if(t===void 0&&(n=e,e=n[0],t=n[1]),e.kind()!==`ipv6`)throw Error(`ipaddr: cannot match ipv6 address with non-ipv6 one`);return u(this.parts,e.parts,16,t)},e.prototype.prefixLengthFromSubnetMask=function(){let e=0,t=!1,n={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0},r,i;for(let a=7;a>=0;--a)if(r=this.parts[a],r in n){if(i=n[r],t&&i!==0)return null;i!==16&&(t=!0),e+=i}else return null;return 128-e},e.prototype.range=function(){return p.subnetMatch(this,this.SpecialRanges)},e.prototype.toByteArray=function(){let e,t=[],n=this.parts;for(let r=0;r<n.length;r++)e=n[r],t.push(e>>8),t.push(e&255);return t},e.prototype.toFixedLengthString=function(){let e=(function(){let e=[];for(let t=0;t<this.parts.length;t++)e.push(f(this.parts[t].toString(16),4));return e}).call(this).join(`:`),t=``;return this.zoneId&&(t=`%${this.zoneId}`),e+t},e.prototype.toIPv4Address=function(){if(!this.isIPv4MappedAddress())throw Error(`ipaddr: trying to convert a generic ipv6 address to ipv4`);let e=this.parts.slice(-2),t=e[0],n=e[1];return new p.IPv4([t>>8,t&255,n>>8,n&255])},e.prototype.toNormalizedString=function(){let e=(function(){let e=[];for(let t=0;t<this.parts.length;t++)e.push(this.parts[t].toString(16));return e}).call(this).join(`:`),t=``;return this.zoneId&&(t=`%${this.zoneId}`),e+t},e.prototype.toRFC5952String=function(){let e=/((^|:)(0(:|$)){2,})/g,t=``;this.zoneId&&(t=`%${this.zoneId}`);let n=this.toNormalizedString(),r=n.slice(0,n.length-t.length),i=0,a=-1,o=-1,s;for(;s=e.exec(r);){let e=(s[0].match(/0/g)||[]).length;e>o&&(o=e,i=s.index,a=s[0].length)}return a<0?r+t:`${r.substring(0,i)}::${r.substring(i+a)}${t}`},e.prototype.toString=function(){return this.toRFC5952String()},e})(),p.IPv6.broadcastAddressFromCIDR=function(e){try{let t=this.parseCIDR(e),n=t[0].toByteArray(),r=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],a=0;for(;a<16;)i.push(parseInt(n[a],10)|parseInt(r[a],10)^255),a++;return new this(i)}catch(e){throw Error(`ipaddr: the address does not have IPv6 CIDR format`,{cause:e})}},p.IPv6.isIPv6=function(e){return this.parser(e)!==null},p.IPv6.isValid=function(e){if(typeof e==`string`&&e.indexOf(`:`)===-1)return!1;try{let t=this.parser(e);return new this(t.parts,t.zoneId),!0}catch{return!1}},p.IPv6.isValidCIDR=function(e){if(typeof e==`string`&&e.indexOf(`:`)===-1)return!1;try{return this.parseCIDR(e),!0}catch{return!1}},p.IPv6.networkAddressFromCIDR=function(e){let t,n,r,i,a;try{for(t=this.parseCIDR(e),r=t[0].toByteArray(),a=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],n=0;n<16;)i.push(parseInt(r[n],10)&parseInt(a[n],10)),n++;return new this(i)}catch(e){throw Error(`ipaddr: the address does not have IPv6 CIDR format`,{cause:e})}},p.IPv6.parse=function(e){let t=this.parser(e);if(t===null)throw Error(`ipaddr: string is not formatted like an IPv6 Address`);return new this(t.parts,t.zoneId)},p.IPv6.parseCIDR=function(e){let t,n,r;if((n=e.match(/^(.+)\/(\d+)$/))&&(t=parseInt(n[2]),t>=0&&t<=128))return r=[this.parse(n[1]),t],Object.defineProperty(r,"toString",{value:function(){return this.join(`/`)}}),r;throw Error(`ipaddr: string is not formatted like an IPv6 CIDR range`)},p.IPv6.parser=function(e){let t,n,r,i,a,o;if(r=e.match(c.deprecatedTransitional))return this.parser(`::ffff:${r[1]}`);if(c.native.test(e))return l(e,8);if((r=e.match(c.transitional))&&(o=r[6]||``,t=r[1],r[1].endsWith(`::`)||(t=t.slice(0,-1)),t=l(t+o,6),t&&t.parts)){for(a=[parseInt(r[2]),parseInt(r[3]),parseInt(r[4]),parseInt(r[5])],n=0;n<a.length;n++)if(i=a[n],!(0<=i&&i<=255))return null;return t.parts.push(a[0]<<8|a[1]),t.parts.push(a[2]<<8|a[3]),{parts:t.parts,zoneId:t.zoneId}}return null},p.IPv6.subnetMaskFromPrefixLength=function(e){if(e=parseInt(e),Number.isNaN(e)||e<0||e>128)throw Error(`ipaddr: invalid IPv6 prefix length`);let t=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],n=0,r=Math.floor(e/8);for(;n<r;)t[n]=255,n++;return r<16&&(t[r]=2**(e%8)-1<<8-e%8),new this(t)},p.fromByteArray=function(e){let t=e.length;if(t===4)return new p.IPv4(e);if(t===16)return new p.IPv6(e);throw Error(`ipaddr: the binary input is neither an IPv6 nor IPv4 address`)},p.isValid=function(e){return p.IPv6.isValid(e)||p.IPv4.isValid(e)},p.isValidCIDR=function(e){return p.IPv6.isValidCIDR(e)||p.IPv4.isValidCIDR(e)},p.parse=function(e){if(p.IPv6.isValid(e))return p.IPv6.parse(e);if(p.IPv4.isValid(e))return p.IPv4.parse(e);throw Error(`ipaddr: the address has neither IPv6 nor IPv4 format`)},p.parseCIDR=function(e){try{return p.IPv6.parseCIDR(e)}catch{try{return p.IPv4.parseCIDR(e)}catch(e){throw Error(`ipaddr: the address has neither IPv6 nor IPv4 CIDR format`,{cause:e})}}},p.process=function(e){let t=this.parse(e);return t.kind()===`ipv6`&&t.isIPv4MappedAddress()?t.toIPv4Address():t},p.subnetMatch=function(e,t,n){let r,i,a,o;for(i in n??=`unicast`,t)if(Object.prototype.hasOwnProperty.call(t,i)){for(a=t[i],a[0]&&!(a[0]instanceof Array)&&(a=[a]),r=0;r<a.length;r++)if(o=a[r],e.kind()===o[0].kind()&&e.match.apply(e,o))return i}return n},t!==void 0&&t.exports?t.exports=p:e.ipaddr=p})(e)}))(),1);async function l(e,t){if(e.protocol!==`http:`&&e.protocol!==`https:`)throw new i(`INVALID_ARGS`,`Unsupported source URL protocol: ${e.protocol}`);if(e.username||e.password)throw new i(`INVALID_ARGS`,`Source URL credentials are not allowed`);d(t);let n=h(e.hostname);p(n)&&_(e.hostname);let a=o.isIP(n);if(a)return{address:n,family:a};let s;try{s=await u(n,t)}catch(e){throw r(e)?e:new i(`INVALID_ARGS`,`Source URL host could not be resolved: ${n}`,{hint:`Use a public artifact URL.`},e)}if(s.length===0)throw new i(`INVALID_ARGS`,`Source URL host could not be resolved: ${n}`,{hint:`Use a public artifact URL.`});s.some(e=>m(e.address))&&_(n);let c=s[0];return{address:c.address,family:c.family}}async function u(e,t){let n=s.lookup(e,{all:!0,verbatim:!0});return t?await new Promise((e,r)=>{let i=()=>r(f(t.reason));t.addEventListener(`abort`,i,{once:!0}),n.then(e,r).finally(()=>t.removeEventListener(`abort`,i))}):await n}function d(e){if(e?.aborted)throw f(e.reason)}function f(e){return n(void 0,e)}function p(e){let t;try{t=h(e)}catch{return!0}return!t||t===`localhost`||t.endsWith(`.localhost`)?!0:o.isIP(t)!==0&&m(t)}function m(e){try{return c.default.process(g(e)).range()!==`unicast`}catch{return!0}}function h(e){let t=g(e).toLowerCase().replace(/\.$/,``);if(!t||t.includes(`%`))throw new i(`INVALID_ARGS`,`Source URL host is not allowed`,{hint:`Use a public artifact URL.`});return t}function g(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}function _(e){throw new i(`INVALID_ARGS`,`Source URL host is not allowed because it resolves to a non-public address: ${e}`,{hint:`Use a public artifact URL.`})}var v=a();async function y(e){let t=b(e.url),n=t?C(t,e.url):S(e.approvedAddress,e.family),r=t?w(e.url,e.approvedAddress,e.family):e.url;try{let i={dispatcher:n,headers:t?{...e.headers,host:e.url.host}:e.headers,maxRedirections:0,method:`GET`,signal:e.signal},a=await(0,v.request)(r,i);return{statusCode:a.statusCode,headers:a.headers,body:a.body,close:async()=>await D(n)}}catch(e){throw await D(n),e}}function b(e,t=process.env){if(x(e,t.no_proxy??t.NO_PROXY))return;let n=t.http_proxy??t.HTTP_PROXY;return e.protocol===`http:`?n||void 0:(t.https_proxy??t.HTTPS_PROXY)||n||void 0}function x(e,t){if(!t)return!1;let n=E(e.hostname).toLowerCase(),r=e.port||(e.protocol===`https:`?`443`:`80`);return t.split(/[\s,]+/).filter(Boolean).some(e=>{if(e===`*`)return!0;let t=T(e);if(t.port&&t.port!==r)return!1;let i=t.hostname.replace(/^\*?\./,``).toLowerCase();return n===i||n.endsWith(`.${i}`)})}function S(e,t){return new v.Agent({connect:{lookup:(n,r,i)=>{if(r.all){i(null,[{address:e,family:t}]);return}i(null,e,t)}}})}function C(e,t){let n=o.isIP(E(t.hostname))!==0;return new v.ProxyAgent({uri:e,proxyTunnel:!0,requestTls:t.protocol===`https:`&&!n?{servername:E(t.hostname)}:void 0})}function w(e,t,n){let r=new URL(e);return r.hostname=n===6?`[${E(t)}]`:t,r}function T(e){if(e.startsWith(`[`)){let t=e.indexOf(`]`);return t<0?{hostname:e}:{hostname:e.slice(1,t),port:e[t+1]===`:`?e.slice(t+2):void 0}}let t=e.lastIndexOf(`:`);return t>-1&&e.indexOf(`:`)===t?{hostname:e.slice(0,t),port:e.slice(t+1)}:{hostname:e}}function E(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}async function D(e){await e.close()}export{b as n,l as r,y as t};
@@ -5,6 +5,11 @@ import { p as LocalInstallSource } from "./sdk-contracts.js";
5
5
  */
6
6
  declare const ARCHIVE_EXTENSIONS: readonly [".zip", ".tar", ".tar.gz", ".tgz"];
7
7
  declare function validateDownloadSourceUrl(parsedUrl: URL): Promise<void>;
8
+ /**
9
+ * @deprecated agent-device does not gate install sources on this check: URL sources from any
10
+ * public host may point at an installable or an archive containing one. This only classifies
11
+ * whether a URL names a GitHub Actions or EAS artifact, which says nothing about who built it.
12
+ */
8
13
  declare function isTrustedInstallSourceUrl(sourceUrl: string | URL): boolean;
9
14
  //#endregion
10
15
  export { ARCHIVE_EXTENSIONS, type LocalInstallSource as MaterializeInstallSource, isTrustedInstallSourceUrl, validateDownloadSourceUrl };
@@ -1 +1 @@
1
- import{F as e,N as t}from"./sdk-contracts.js";import{t as n}from"./path-resolution.js";import"./file.js";import{a as r,i,n as a,r as o}from"./archive.js";import{t as s}from"./byte-limit-stream.js";import{r as c,t as l}from"./install-source-network-transport.js";import u from"node:path";import{createWriteStream as d,promises as f}from"node:fs";import{AsyncLocalStorage as p}from"node:async_hooks";import m from"node:os";import{pipeline as h}from"node:stream/promises";async function g(e,n){let r=await f.stat(e).catch(()=>null);if(!r)throw new t(`INVALID_ARGS`,`App source not found: ${e}`);if(n.isInstallablePath(e,r))return{archivePath:n.archivePath,installablePath:e};if(r.isFile()&&x(e))return b(e,n,!1),await _(e,n);if(r.isDirectory()){let r=await y(e,n.isInstallablePath);if(r.length===1)return{archivePath:n.archivePath,installablePath:r[0]};if(r.length>1)throw new t(`INVALID_ARGS`,`Found multiple ${n.installableLabel} candidates under ${e}: ${r.join(`, `)}`,{matches:r});let i=await y(e,(e,t)=>!!(t.isFile()&&x(e)));if(i.length===1)return b(i[0],n,!0),await _(i[0],n);if(i.length>1)throw new t(`INVALID_ARGS`,`Found multiple nested archives under ${e}; expected one ${n.installableLabel} source`,{matches:i})}throw new t(`INVALID_ARGS`,`Expected ${n.installableLabel} source, but got ${e}`)}async function _(e,t){let n=await v(e,t.budget,t.archiveDepth+1);return t.onArchiveAccepted?.(t.archiveDepth+1),t.registerCleanup(n.cleanup),await g(n.outputPath,{...t,archivePath:t.archivePath??e,archiveDepth:t.archiveDepth+1})}async function v(e,n,r){let i=a(e);if(!i)throw new t(`INVALID_ARGS`,`Unsupported archive: ${e}`);let s=await f.mkdtemp(u.join(m.tmpdir(),`agent-device-archive-`)),c=u.join(s,`extracted`);try{return await o({archivePath:e,outputRoot:c,type:i,budget:n,depth:r}),{outputPath:c,cleanup:async()=>await f.rm(s,{recursive:!0,force:!0})}}catch(e){throw await f.rm(s,{recursive:!0,force:!0}),e}}async function y(e,t){let n=[],r=[{path:e,depth:0}];for(;r.length>0;){let e=r.shift();if(!e)continue;let i=await f.readdir(e.path,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i){if(a.name===`__MACOSX`||a.name.startsWith(`._`))continue;let i=u.join(e.path,a.name);t(i,a)?n.push(i):a.isDirectory()&&e.depth<5&&r.push({path:i,depth:e.depth+1})}}return[...new Set(n)]}function b(e,n,r){if(n.allowArchiveExtraction)return;let i=r?`URL sources must point directly to a ${n.installableLabel}; nested archives are not allowed`:`URL sources must point directly to a ${n.installableLabel}; archive extraction is not allowed`;throw new t(`INVALID_ARGS`,i,{path:e})}function x(e){return a(e)!==void 0}const S=new p;async function C(e){return await S.run({budget:new i,depth:0},e)}function w(){return S.getStore()?.budget}function T(){return S.getStore()?.depth??0}function E(e){let t=S.getStore();t&&(t.depth=Math.max(t.depth,e))}const D=new Set([301,302,303,307,308]),O=/^[A-Z][A-Z0-9_]{0,63}$/,k=new Set([`accept-encoding`,`connection`,`content-length`,`host`,`keep-alive`,`proxy-connection`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`]);async function A(e){let t=H(e.url),n=R(L(e.headers));for(let r=0;;r+=1){let i=await j(t,n,e.signal);try{let a=N(i,t,r);if(a){a.origin!==t.origin&&(n=z(n)),t=a;continue}return P(i),await F(e.tempDir,t,i)}finally{await i.close()}}}async function j(e,n,r){let i=await c(e,r);try{return await l({url:e,approvedAddress:i.address,family:i.family,headers:{...n,"accept-encoding":`identity`},signal:r})}catch(e){if(e instanceof t)throw e;let n=M(e);throw new t(`COMMAND_FAILED`,n?`The daemon failed to fetch the app source (network error code: ${n})`:`The daemon failed to fetch the app source`,n?{networkErrorCode:n}:void 0,e)}}function M(e){let t=e?.code;return typeof t==`string`&&O.test(t)?t:void 0}function N(e,n,r){if(!D.has(e.statusCode))return;e.body.resume?.();let i=V(e.headers,`location`);if(!i||r>=5)throw new t(`COMMAND_FAILED`,`App source redirect limit was exceeded`,{status:e.statusCode});let a=new URL(i,n);if(n.protocol===`https:`&&a.protocol!==`https:`)throw new t(`COMMAND_FAILED`,`App source redirect downgraded HTTPS`);return a}function P(e){if(!(e.statusCode>=200&&e.statusCode<300))throw new t(`COMMAND_FAILED`,`Failed to download app source: ${e.statusCode}`,{status:e.statusCode})}async function F(e,n,i){let a=V(i.headers,`content-encoding`);if(a&&a.toLowerCase()!==`identity`)throw new t(`COMMAND_FAILED`,`App source response used unsupported content encoding`);I(V(i.headers,`content-length`));let o=u.join(e,B(i,n)),c=s({maxBytes:r,createLimitError:()=>new t(`COMMAND_FAILED`,`App source exceeds maximum size of ${r} bytes`,{reason:`ARTIFACT_BYTE_LIMIT`})});try{return await h(i.body,c,d(o,{flags:`wx`})),o}catch(e){throw await f.rm(o,{force:!0}).catch(()=>{}),e}}function I(e){if(e===null)return;if(!/^\d+$/.test(e))throw new t(`COMMAND_FAILED`,`App source response had invalid content-length`);let n=Number(e);if(!Number.isSafeInteger(n)||n>2147483648)throw new t(`COMMAND_FAILED`,`App source response exceeded the byte limit`,{reason:`ARTIFACT_BYTE_LIMIT`})}function L(e){let t=new Set(Object.entries(e??{}).filter(([e])=>e.toLowerCase()===`connection`).flatMap(([,e])=>e.split(`,`).map(e=>e.trim().toLowerCase())));return Object.fromEntries(Object.entries(e??{}).filter(([e])=>{let n=e.toLowerCase();return!k.has(n)&&!t.has(n)}))}function R(e){return Object.keys(e).some(e=>e.toLowerCase()===`user-agent`)?e:{...e,"user-agent":`agent-device`}}function z(e){return Object.fromEntries(Object.entries(e).filter(([e])=>[`accept`,`user-agent`].includes(e.toLowerCase())))}function B(e,t){let n=(V(e.headers,`content-disposition`)?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i))?.[1]?.trim()||u.basename(t.pathname)||`downloaded-artifact.bin`;return u.basename(n)}function V(e,t){let n=e[t];return Array.isArray(n)?n[0]??null:n??null}function H(e){let n;try{n=new URL(e)}catch{throw new t(`INVALID_ARGS`,`Invalid source URL`)}if(n.username||n.password)throw new t(`INVALID_ARGS`,`Source URL credentials are not allowed`);return n}const U=Object.freeze([`.zip`,`.tar`,`.tar.gz`,`.tgz`]);async function W(e){let t=[];try{let n=await K(e.source,{signal:e.signal,downloadTimeoutMs:e.downloadTimeoutMs});t.push(n.cleanup);let r=await g(n.localPath,{archivePath:void 0,isInstallablePath:e.isInstallablePath,installableLabel:e.installableLabel,allowArchiveExtraction:e.allowArchiveExtraction!==!1,registerCleanup:e=>{t.push(e)},budget:w()??new i,archiveDepth:0,onArchiveAccepted:E});return{archivePath:r.archivePath,installablePath:r.installablePath,cleanup:async()=>{await $(t)}}}catch(e){throw await $(t),e}}function G(e){return n(e)}async function K(e,t){if(e.kind===`path`)return{localPath:G(e.path),cleanup:async()=>{}};let n=await f.mkdtemp(u.join(m.tmpdir(),`agent-device-source-`));try{return{localPath:await q(n,e.url,e.headers,t),cleanup:async()=>{await f.rm(n,{recursive:!0,force:!0})}}}catch(e){throw await f.rm(n,{recursive:!0,force:!0}),e}}async function q(t,n,r,i){let a=i?.signal;if(a?.aborted)throw e();let o=i?.downloadTimeoutMs??12e4,s=AbortSignal.timeout(o),c=a?AbortSignal.any([a,s]):s;try{return await A({tempDir:t,url:n,headers:r,signal:c})}catch(e){throw J(e,a,s,o)}}function J(n,r,i,a){return r?.aborted?e(void 0,n):i.aborted?new t(`COMMAND_FAILED`,`App source download timed out after ${a}ms`,{timeoutMs:a},n):n}async function Y(e){await c(e)}function X(e){let t=e instanceof URL?e:new URL(e),n=t.hostname.toLowerCase();if(!n)return!1;let r=t.pathname;return Z(n,r)||Q(n,r)}function Z(e,t){return e===`api.github.com`?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(t):e===`github.com`&&/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(t)}function Q(e,t){return e!==`expo.dev`&&!e.endsWith(`.expo.dev`)?!1:/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(t)}async function $(e){for(let t of[...e].reverse())await t()}export{w as a,C as c,Y as i,X as n,T as o,W as r,E as s,U as t};
1
+ import{I as e,P as t}from"./sdk-contracts.js";import{t as n}from"./path-resolution.js";import"./file.js";import{a as r,i,n as a,r as o}from"./archive.js";import{t as s}from"./byte-limit-stream.js";import{r as c,t as ee}from"./install-source-network-transport.js";import{AsyncLocalStorage as l}from"node:async_hooks";import{createWriteStream as u,promises as d}from"node:fs";import f from"node:os";import p from"node:path";import{pipeline as m}from"node:stream/promises";function h(e,t){return{archivePath:t.archivePath,...t.containingArchivePath?{containingArchivePath:t.containingArchivePath}:{},installablePath:e}}async function g(e,n){let r=await d.stat(e).catch(()=>null);if(!r)throw new t(`INVALID_ARGS`,`App source not found: ${e}`);if(n.isInstallablePath(e,r))return h(e,n);if(r.isFile()&&b(e))return await _(e,n);if(r.isDirectory()){let r=await y(e,n.isInstallablePath);if(r.length===1)return h(r[0],n);if(r.length>1)throw new t(`INVALID_ARGS`,`Found multiple ${n.installableLabel} candidates under ${e}: ${r.join(`, `)}`,{matches:r});let i=await y(e,(e,t)=>!!(t.isFile()&&b(e)));if(i.length===1)return await _(i[0],n);if(i.length>1)throw new t(`INVALID_ARGS`,`Found multiple nested archives under ${e}; expected one ${n.installableLabel} source`,{matches:i})}throw new t(`INVALID_ARGS`,`Expected ${n.installableLabel} source, but got ${e}`)}async function _(e,t){let n=await v(e,t.budget,t.archiveDepth+1);return t.onArchiveAccepted?.(t.archiveDepth+1),t.registerCleanup(n.cleanup),await g(n.outputPath,{...t,archivePath:t.archivePath??e,containingArchivePath:e,archiveDepth:t.archiveDepth+1})}async function v(e,n,r){let i=a(e);if(!i)throw new t(`INVALID_ARGS`,`Unsupported archive: ${e}`);let s=await d.mkdtemp(p.join(f.tmpdir(),`agent-device-archive-`)),c=p.join(s,`extracted`);try{return await o({archivePath:e,outputRoot:c,type:i,budget:n,depth:r}),{outputPath:c,cleanup:async()=>await d.rm(s,{recursive:!0,force:!0})}}catch(e){throw await d.rm(s,{recursive:!0,force:!0}),e}}async function y(e,t){let n=[],r=[{path:e,depth:0}];for(;r.length>0;){let e=r.shift();if(!e)continue;let i=await d.readdir(e.path,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i){if(a.name===`__MACOSX`||a.name.startsWith(`._`))continue;let i=p.join(e.path,a.name);t(i,a)?n.push(i):a.isDirectory()&&e.depth<5&&r.push({path:i,depth:e.depth+1})}}return[...new Set(n)]}function b(e){return a(e)!==void 0}const x=new l;async function S(e){return await x.run({budget:new i,depth:0},e)}function C(){return x.getStore()?.budget}function w(){return x.getStore()?.depth??0}function T(e){let t=x.getStore();t&&(t.depth=Math.max(t.depth,e))}const E=new Set([301,302,303,307,308]),D=/^[A-Z][A-Z0-9_]{0,63}$/,O=new Set([`accept-encoding`,`connection`,`content-length`,`host`,`keep-alive`,`proxy-connection`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`]);async function k(e){let t=V(e.url),n=L(I(e.headers));for(let r=0;;r+=1){let i=await A(t,n,e.signal);try{let a=M(i,t,r);if(a){a.origin!==t.origin&&(n=R(n)),t=a;continue}return N(i),await P(e.tempDir,t,i)}finally{await i.close()}}}async function A(e,n,r){let i=await c(e,r);try{return await ee({url:e,approvedAddress:i.address,family:i.family,headers:{...n,"accept-encoding":`identity`},signal:r})}catch(e){if(e instanceof t)throw e;let n=j(e);throw new t(`COMMAND_FAILED`,n?`The daemon failed to fetch the app source (network error code: ${n})`:`The daemon failed to fetch the app source`,n?{networkErrorCode:n}:void 0,e)}}function j(e){let t=e?.code;return typeof t==`string`&&D.test(t)?t:void 0}function M(e,n,r){if(!E.has(e.statusCode))return;e.body.resume?.();let i=B(e.headers,`location`);if(!i||r>=5)throw new t(`COMMAND_FAILED`,`App source redirect limit was exceeded`,{status:e.statusCode});let a=new URL(i,n);if(n.protocol===`https:`&&a.protocol!==`https:`)throw new t(`COMMAND_FAILED`,`App source redirect downgraded HTTPS`);return a}function N(e){if(!(e.statusCode>=200&&e.statusCode<300))throw new t(`COMMAND_FAILED`,`Failed to download app source: ${e.statusCode}`,{status:e.statusCode})}async function P(e,n,i){let a=B(i.headers,`content-encoding`);if(a&&a.toLowerCase()!==`identity`)throw new t(`COMMAND_FAILED`,`App source response used unsupported content encoding`);F(B(i.headers,`content-length`));let o=p.join(e,z(i,n)),c=s({maxBytes:r,createLimitError:()=>new t(`COMMAND_FAILED`,`App source exceeds maximum size of ${r} bytes`,{reason:`ARTIFACT_BYTE_LIMIT`})});try{return await m(i.body,c,u(o,{flags:`wx`})),o}catch(e){throw await d.rm(o,{force:!0}).catch(()=>{}),e}}function F(e){if(e===null)return;if(!/^\d+$/.test(e))throw new t(`COMMAND_FAILED`,`App source response had invalid content-length`);let n=Number(e);if(!Number.isSafeInteger(n)||n>2147483648)throw new t(`COMMAND_FAILED`,`App source response exceeded the byte limit`,{reason:`ARTIFACT_BYTE_LIMIT`})}function I(e){let t=new Set(Object.entries(e??{}).filter(([e])=>e.toLowerCase()===`connection`).flatMap(([,e])=>e.split(`,`).map(e=>e.trim().toLowerCase())));return Object.fromEntries(Object.entries(e??{}).filter(([e])=>{let n=e.toLowerCase();return!O.has(n)&&!t.has(n)}))}function L(e){return Object.keys(e).some(e=>e.toLowerCase()===`user-agent`)?e:{...e,"user-agent":`agent-device`}}function R(e){return Object.fromEntries(Object.entries(e).filter(([e])=>[`accept`,`user-agent`].includes(e.toLowerCase())))}function z(e,t){let n=(B(e.headers,`content-disposition`)?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i))?.[1]?.trim()||p.basename(t.pathname)||`downloaded-artifact.bin`;return p.basename(n)}function B(e,t){let n=e[t];return Array.isArray(n)?n[0]??null:n??null}function V(e){let n;try{n=new URL(e)}catch{throw H()}if(n.username||n.password)throw new t(`INVALID_ARGS`,`Source URL credentials are not allowed`);return n}function H(){return new t(`INVALID_ARGS`,`Invalid source URL`)}const U=Object.freeze([`.zip`,`.tar`,`.tar.gz`,`.tgz`]);async function W(e){let t=[];try{let n=await K(e.source,{signal:e.signal,downloadTimeoutMs:e.downloadTimeoutMs});t.push(n.cleanup);let r=await g(n.localPath,{archivePath:void 0,isInstallablePath:e.isInstallablePath,installableLabel:e.installableLabel,registerCleanup:e=>{t.push(e)},budget:C()??new i,archiveDepth:0,onArchiveAccepted:T});return{archivePath:r.archivePath,...r.containingArchivePath?{containingArchivePath:r.containingArchivePath}:{},installablePath:r.installablePath,cleanup:async()=>{await $(t)}}}catch(e){throw await $(t),e}}function G(e){return n(e)}async function K(e,t){if(e.kind===`path`)return{localPath:G(e.path),cleanup:async()=>{}};let n=await d.mkdtemp(p.join(f.tmpdir(),`agent-device-source-`));try{return{localPath:await q(n,e.url,e.headers,t),cleanup:async()=>{await d.rm(n,{recursive:!0,force:!0})}}}catch(e){throw await d.rm(n,{recursive:!0,force:!0}),e}}async function q(t,n,r,i){let a=i?.signal;if(a?.aborted)throw e();let o=i?.downloadTimeoutMs??12e4,s=AbortSignal.timeout(o),c=a?AbortSignal.any([a,s]):s;try{return await k({tempDir:t,url:n,headers:r,signal:c})}catch(e){throw J(e,a,s,o)}}function J(n,r,i,a){return r?.aborted?e(void 0,n):i.aborted?new t(`COMMAND_FAILED`,`App source download timed out after ${a}ms`,{timeoutMs:a},n):n}async function Y(e){await c(e)}function X(e){let t=e instanceof URL?e:URL.parse(e);if(!t)throw H();let n=t.hostname.toLowerCase();if(!n)return!1;let r=t.pathname;return Z(n,r)||Q(n,r)}function Z(e,t){return e===`api.github.com`?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(t):e===`github.com`&&/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(t)}function Q(e,t){return e!==`expo.dev`&&!e.endsWith(`.expo.dev`)?!1:/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(t)}async function $(e){for(let t of[...e].reverse())await t()}export{C as a,S as c,Y as i,X as n,w as o,W as r,T as s,U as t};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime.js";import{a as t,b as n,c as r,f as i,i as a,m as o,n as s,p as c,r as l,s as u,t as d,u as f}from"./session-stream.js";import{execFile as p}from"node:child_process";import m from"fs";import{Readable as h}from"stream";import g from"os";import _ from"path";import v from"crypto";const y=/^[0-9a-f]{64}$/i,b=/^[0-9a-f]{32}$/i;function x(e){return v.createHash(`sha256`).update(e).digest(`hex`).slice(0,32)}function S(e,t){let n=t*e.blockSize;return{offset:n,length:Math.min(e.blockSize,e.fileSize-n)}}async function C(e){return await new Promise((t,n)=>{let r=v.createHash(`sha256`),i=m.createReadStream(e);i.on(`data`,e=>r.update(e)),i.on(`error`,n),i.on(`end`,()=>t(r.digest(`hex`)))})}function w(e,t){if(!e||typeof e!=`object`)throw Error(`Invalid seed signature: expected an object`);let n=e;if(n.version!==1)throw Error(`Unsupported seed signature version: ${String(n.version)}`);if(!Number.isSafeInteger(n.blockSize)||n.blockSize<=0)throw Error(`Invalid seed signature blockSize`);if(!Number.isSafeInteger(n.fileSize)||n.fileSize<0)throw Error(`Invalid seed signature fileSize`);if(typeof n.sha256!=`string`||!y.test(n.sha256)||n.sha256.toLowerCase()!==t.toLowerCase())throw Error(`Seed signature sha256 does not match the requested seed`);if(!Array.isArray(n.blocks))throw Error(`Invalid seed signature blocks`);let r=Math.ceil(n.fileSize/n.blockSize);if(n.blocks.length!==r)throw Error(`Invalid seed signature block count: got ${n.blocks.length}, expected ${r}`);let i=n.blocks.map((e,t)=>{if(!e||!Number.isInteger(e.w)||e.w<0||e.w>4294967295||typeof e.s!=`string`||!b.test(e.s))throw Error(`Invalid seed signature block at index ${t}`);return{w:e.w,s:e.s.toLowerCase()}});return{version:n.version,blockSize:n.blockSize,fileSize:n.fileSize,sha256:n.sha256.toLowerCase(),blocks:i}}async function T(e,t,r){let i=await n.fetch(e,{method:`GET`,headers:{Authorization:`Bearer ${t}`}});if(!i.ok){let e=await i.text();throw Error(`Seed signature download failed: ${i.status} ${e}`)}return w(await i.json(),r)}async function E(e,t,n,r){let i=0;for(;i<n;){let{bytesRead:a}=await e.read(t,i,n-i,r+i);if(a<=0)throw Error(`Unexpected EOF at offset ${r+i}`);i+=a}}async function D(e,t,n,r,i){let a=n.blockSize,o=await m.promises.open(e.path,`r`);try{if(e.size<a||i.size===0)return;let s=Buffer.allocUnsafe(a);await E(o,s,a,0);let c=0,l=0;for(let e=0;e<a;e++){let t=s[e];c=c+t&65535,l=l+(a-e)*t&65535}let u=0,d=0,f,p=async t=>{f??=Buffer.allocUnsafe(a),await E(o,f,a,d);let s=x(f);for(let a of t)i.has(a)&&n.blocks[a].s===s&&(r.set(a,{sourcePath:e.path,sourceOffset:d}),i.delete(a))},m=t.get(l*65536+c);m?.some(e=>i.has(e))&&await p(m);let h=Buffer.allocUnsafe(1048576),g=a;for(;g<e.size&&i.size>0;){let n=Math.min(h.byteLength,e.size-g),{bytesRead:r}=await o.read(h,0,n,g);if(r<=0)break;for(let e=0;e<r&&i.size>0;e++){let n=s[u],r=h[e];s[u]=r,u++,u===a&&(u=0),c=c-n+r&65535,l=l-(a*n&65535)+c&65535,d++,m=t.get(l*65536+c),m?.some(e=>i.has(e))&&await p(m)}g+=r}}finally{await o.close()}}async function O(e){let t=[];for(let n of e){let e=await m.promises.stat(n).catch(()=>void 0);e?.isFile()&&t.push({path:n,size:e.size})}return t}async function k(e,t,n){for(let r of e){let e=await m.promises.open(r.path,`r`),i=Buffer.allocUnsafe(t.blockSize);try{for(let a=0;a<t.blocks.length;a++){if(n.has(a))continue;let o=S(t,a);o.offset+o.length>r.size||(await E(e,i,o.length,o.offset),x(i.subarray(0,o.length))===t.blocks[a].s&&n.set(a,{sourcePath:r.path,sourceOffset:o.offset}))}}finally{await e.close()}}}async function A(e,t,n){if(t.fileSize===0||t.fileSize%t.blockSize===0)return;let r=t.blocks.length-1;if(n.has(r))return;let i=S(t,r),a=t.blocks[r].s,o=Buffer.allocUnsafe(i.length);for(let t of e){if(t.size<i.length)continue;let e=t.size-i.length;if(e===i.offset)continue;let s=await m.promises.open(t.path,`r`);try{if(await E(s,o,i.length,e),x(o)===a){n.set(r,{sourcePath:t.path,sourceOffset:e});return}}finally{await s.close()}}}function j(e,t){let n=0;for(let r=0;r<e.blocks.length;r++)t.has(r)||(n+=S(e,r).length);return(e.blocks.length===0?1:t.size/e.blocks.length)>=.8&&n<=33554432}async function M(e,t,n){let r=Math.floor(t.fileSize/t.blockSize),i=new Set,a=new Map;for(let e=0;e<r;e++){if(n.has(e))continue;i.add(e);let r=t.blocks[e].w,o=a.get(r)??[];o.push(e),a.set(r,o)}for(let r of e){if(i.size===0)return;await D(r,a,t,n,i)}}async function N(e,t){let n=await O(e),r=new Map;return await k(n,t,r),await A(n,t,r),j(t,r)||await M(n,t,r),r}function P(e,t){let n=[],r;for(let i=0;i<=e.blocks.length;i++){let a=i<e.blocks.length&&!t.has(i);if(a&&r===void 0)r=i;else if(!a&&r!==void 0){let t=S(e,r),a=S(e,i-1);n.push({start:t.offset,end:a.offset+a.length-1}),r=void 0}}return n}async function F(e,t,n){let r=new Map;try{for(let[i,a]of n){let n=r.get(a.sourcePath);n||(n=await m.promises.open(a.sourcePath,`r`),r.set(a.sourcePath,n));let o=S(t,i),s=Buffer.allocUnsafe(o.length);await E(n,s,o.length,a.sourceOffset),await I(e,s,o.offset)}}finally{await Promise.all([...r.values()].map(e=>e.close()))}}async function I(e,t,n){let r=0;for(;r<t.byteLength;){let{bytesWritten:i}=await e.write(t,r,t.byteLength-r,n+r);if(i<=0)throw Error(`Unable to write reconstructed seed at offset ${n+r}`);r+=i}}async function L(e,t,r,i,a,o){let s=await n.fetch(e,{method:`GET`,headers:{Authorization:`Bearer ${t}`,Range:`bytes=${r.start}-${r.end}`}});if(s.status!==206||!s.body){let e=await s.text();throw Error(`Seed range download failed: ${s.status} ${e}`)}let c=`bytes ${r.start}-${r.end}/${i}`;if(s.headers.get(`content-range`)!==c)throw Error(`Invalid Content-Range for seed: ${s.headers.get(`content-range`)??`<missing>`}`);let l=r.end-r.start+1,u=0,d=h.fromWeb(s.body);for await(let e of d){let t=Buffer.isBuffer(e)?e:Buffer.from(e);if(u+t.byteLength>l)throw Error(`Seed range response exceeded the requested length`);await I(a,t,r.start+u),u+=t.byteLength,o(t.byteLength)}if(u!==l)throw Error(`Seed range response was truncated: got ${u}, expected ${l}`)}async function R(e){let t=e.expectedSha256.toLowerCase(),n=await T(e.signatureUrl,e.token,t),r=await N([...new Set(e.sourcePaths.map(e=>_.resolve(e)))],n),i=P(n,r),a=i.reduce((e,t)=>e+t.end-t.start+1,0),o=0;e.onProgress?.(0,a),await m.promises.mkdir(_.dirname(e.outputPath),{recursive:!0});let s=`${e.outputPath}.reconstruct-${process.pid}-${v.randomBytes(6).toString(`hex`)}`,c=await m.promises.open(s,`wx`),l=!1,u=!1;try{await c.truncate(n.fileSize),await F(c,n,r);for(let t of i)await L(e.seedUrl,e.token,t,n.fileSize,c,t=>{o+=t,e.onProgress?.(o,a)});await c.close(),l=!0;let d=await C(s);if(d!==t)throw Error(`Reconstructed seed SHA-256 mismatch: got ${d}, expected ${t}`);await m.promises.rm(e.outputPath,{force:!0}),await m.promises.rename(s,e.outputPath),u=!0}finally{l||await c.close().catch(()=>void 0),u||await m.promises.rm(s,{force:!0})}return{downloadedBytes:o,totalDownloadBytes:a,matchedBlocks:r.size}}function z(e){return`${e}/sync/state`}function B(e,t){return`${e}/sync/seeds/${encodeURIComponent(t)}`}async function V(e){return await new Promise((t,n)=>{let r=v.createHash(`sha256`),i=m.createReadStream(e);i.on(`data`,e=>r.update(e)),i.on(`error`,n),i.on(`end`,()=>t(r.digest(`hex`)))})}async function H(e,t){let r=await n.fetch(z(e),{method:`GET`,headers:{Authorization:`Bearer ${t}`}});if(!r.ok){let e=await r.text();throw Error(`Failed to fetch Android sync state: ${r.status} ${e}`)}return await r.json()}async function ee(e,t,n,i,a,o){let s=_.basename(e),c=_.join(t,s),l=await H(n,i).catch(e=>{a(`debug`,`android sync state unavailable: ${e instanceof Error?e.message:String(e)}`)});if(!l)return;let u=new Set;for(let e of l.roots??[])for(let t of e.files??[])t.path===s&&typeof t.sha256==`string`&&u.add(t.sha256.toLowerCase());let d=[...l.seeds??[]].filter(e=>typeof e.sha256==`string`&&/^[0-9a-f]{64}$/i.test(e.sha256)).sort((e,t)=>(t.mtime??0)-(e.mtime??0));for(let e of d)u.add(e.sha256.toLowerCase());let f;if(m.existsSync(c)){let e=(await V(c)).toLowerCase();if(u.has(e))return;a(`debug`,`local basis ${e} unknown to instance; re-seeding basis cache`),f=c}let p=(await V(e)).toLowerCase();if(u.has(p)){await m.promises.mkdir(_.dirname(c),{recursive:!0}),await m.promises.copyFile(e,c),a(`debug`,`seeded Android basis cache from local APK already known to instance: ${p}`);return}let h=d[0];if(!h){f&&await m.promises.rm(f,{force:!0});return}let g=B(n,h.sha256);try{let t=await R({signatureUrl:`${g}.sig`,seedUrl:g,token:i,sourcePaths:f?[e,f]:[e],outputPath:c,expectedSha256:h.sha256,...o?{onProgress:o}:{}});a(`debug`,`reconstructed Android basis seed ${h.sha256}: matched=${t.matchedBlocks} downloaded=${t.downloadedBytes}`)}catch(e){a(`debug`,`basis seed reconstruction unavailable; downloading full seed: ${e instanceof Error?e.message:String(e)}`),o?.(0,h.size??0),await r(g,i,c,o),a(`debug`,`seeded Android basis cache from full instance seed: ${h.sha256}`)}}var U=e({RecordingQuality:()=>K,createInstanceClient:()=>q});function W(e){let t=new URL(e);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.search=``,t.hash=``,t.pathname=`${t.pathname.replace(/\/$/,``)}/ws`,t.toString().replace(/\/$/,``)}function te(e){return`${e}/files?path=%2Fdata%2Flocal%2Ftmp%2Frecordings%2Fvideo_recording.mp4`}function G(e,t){if(!Number.isInteger(t)||t<0)throw Error(`${e} must be a non-negative integer Kbps value`)}async function ne(e){if(!(await m.promises.stat(e).catch(()=>null))?.isFile())throw Error(`APK file not found: ${e}`);let t=await m.promises.open(e,`r`);try{let n=Buffer.alloc(4),{bytesRead:r}=await t.read(n,0,4,0);if(r<4||n[0]!==80||n[1]!==75)throw Error(`File is not an APK/ZIP archive: ${e}`)}finally{await t.close()}}var K;(function(e){e[e.Q5=5]=`Q5`,e[e.Q6=6]=`Q6`,e[e.Q7=7]=`Q7`,e[e.Q8=8]=`Q8`,e[e.Q9=9]=`Q9`,e[e.Q10=10]=`Q10`})(K||={});function re(e){return e.map(e=>`'${e.replace(/'/g,`'\\''`)}'`).join(` `)}async function q(e){let h=`${W(e.apiUrl)}?token=${e.token}`,y=e.apiUrl,b=e.logLevel??`info`,x=e.maxReconnectAttempts??6,S=e.reconnectDelay??1e3,C=e.maxReconnectDelay??3e4,w,T=`connecting`,E=0,D,O=!1,k,A=new Map,j=new Map,M=new Map,N=new Set,P={debug:(...e)=>{b===`debug`&&console.log(`[Endpoint]`,...e)},info:(...e)=>{(b===`info`||b===`debug`)&&console.log(`[Endpoint]`,...e)},warn:(...e)=>{(b===`warn`||b===`info`||b===`debug`)&&console.warn(`[Endpoint]`,...e)},error:(...e)=>{b!==`none`&&console.error(`[Endpoint]`,...e)}},F=e=>{T!==e&&(T=e,P.debug(`Connection state changed to: ${e}`),N.forEach(t=>{try{t(e)}catch(e){P.error(`Error in connection state callback:`,e)}}))},I=e=>{A.forEach(t=>{clearTimeout(t.timeout),t.reject(Error(e))}),A.clear(),j.forEach(t=>{t.forEach(t=>{clearTimeout(t.timeout),t.reject(Error(e))})}),j.clear()},L=()=>{D&&=(clearTimeout(D),void 0),R&&=(clearInterval(R),void 0),w&&=(w.removeAllListeners(),(w.readyState===c.default.OPEN||w.readyState===c.default.CONNECTING)&&w.close(),void 0)},R,z=0,B=Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15);return new Promise((V,H)=>{let U=!1,W=e=>(z+=1,`${e}-${Date.now()}-${z}`),K=(e,t)=>{let n=A.get(e);if(!n){P.debug(`Received response for unknown/already-settled request: ${e}`);return}clearTimeout(n.timeout),A.delete(e),n.resolve(t)},q=(e,t)=>{let n=A.get(e);if(!n){P.debug(`Received error for unknown/already-settled request: ${e}`);return}clearTimeout(n.timeout),A.delete(e),n.reject(t)},J=e=>{if(`message`in e&&typeof e.message==`string`)return e.message;if(`error`in e&&typeof e.error==`string`&&e.error)return e.error;if(`error`in e&&e.error&&typeof e.error==`object`){let t=e.error;return typeof t.message==`string`&&t.message?t.message:typeof t.code==`string`&&t.code?t.code:`Server returned ${String(e.type)} with an error payload but no error message/code`}},ie=e=>{if(!(`type`in e)||typeof e.type!=`string`)return!1;switch(e.type){case`screenshotResult`:case`getElementTreeResult`:case`findElementResult`:case`tapResult`:case`setTextResult`:case`pressKeyResult`:case`scrollScreenResult`:case`scrollElementResult`:case`openUrlResult`:case`launchAppResult`:case`terminateAppResult`:case`watchAppResult`:case`unwatchAppResult`:case`listAppsResult`:case`playOnMicrophoneResult`:case`cameraControlResult`:case`adbShellResult`:case`setWifiBandwidthResult`:case`startRecordingResult`:case`stopRecordingResult`:case`startAppLogCaptureResult`:case`stopAppLogCaptureResult`:case`startEventCaptureResult`:case`stopEventCaptureResult`:return`id`in e&&typeof e.id==`string`;default:return!1}},Y=async(e,t,n=3e4)=>{if(!w||w.readyState!==c.default.OPEN)return Promise.reject(Error(`WebSocket is not connected or connection is not open.`));let r=W(`ts-client`),i=Object.keys(t).length>0?{type:e,id:r,...t,payload:t}:{type:e,id:r};return new Promise((t,a)=>{let o=setTimeout(()=>{A.has(r)&&(A.delete(r),a(Error(`Request ${e} timed out`)))},n);A.set(r,{resolve:e=>t(e),reject:e=>a(e),timeout:o}),w.send(JSON.stringify(i),e=>{e&&(clearTimeout(o),A.delete(r),a(e))})})},ae=()=>{if(O){P.debug(`Skipping reconnection (intentional disconnect)`);return}if(f(k??``)){P.debug(`Skipping reconnection (non-retryable error)`);return}if(E>=x){P.error(`Max reconnection attempts (${x}) reached. Giving up.`,k?`Last error: ${k}`:``),F(`disconnected`);return}let e=Math.min(S*2**E,C);E++,P.debug(`Scheduling reconnection attempt ${E} in ${e}ms...`),F(`reconnecting`),D=setTimeout(()=>{P.debug(`Attempting to reconnect (attempt ${E})...`),X()},e)},X=()=>{L(),F(`connecting`);let e=n.getWebSocketAgent(h);w=new c.default(h,e?{agent:e}:{}),w.on(`message`,e=>{let t;try{t=JSON.parse(e.toString())}catch(t){P.error({data:e,error:t},`Failed to parse JSON message`);return}switch(t.type){case`screenshot`:{if(!(`dataUri`in t)||typeof t.dataUri!=`string`||!(`id`in t)){P.warn(`Received invalid screenshot message:`,t);break}let e=t;P.debug(`Received screenshot data URI for request ${e.id}.`),K(e.id,{dataUri:e.dataUri});break}case`appExit`:{let e=t,{execId:n,packageName:r,reason:i}=e;if(typeof n!=`string`||typeof r!=`string`||typeof i!=`string`){P.warn(`Received malformed appExit message:`,t);break}let a=M.get(n);if(!a){P.debug(`Received appExit for unknown or already handled execId: ${n}`);break}M.delete(n);let o=Array.isArray(e.logs)?e.logs.map(String):[],s={packageName:r,reason:i,...e.crash?{crash:e.crash}:{},...e.anr?{anr:e.anr}:{}};Promise.resolve().then(()=>a(o,s)).catch(e=>{P.error(`Error in onExit callback for execId ${n}:`,e)});break}case`screenshotResult`:{let e=t,n=J(e);if(n){q(e.id,Error(n));break}let r=typeof e.payload?.dataUri==`string`?e.payload.dataUri:``;if(!r){q(e.id,Error(`Received screenshotResult without payload.dataUri`));break}K(e.id,{dataUri:r});break}case`screenshotError`:{if(!(`message`in t)||!(`id`in t)){P.warn(`Received invalid screenshot error message:`,t);break}let e=t;P.error(`Server reported an error capturing screenshot for request ${e.id}:`,e.message),q(e.id,Error(e.message));break}case`assetResult`:{P.debug(`Received assetResult:`,t);let e=t.url,n=j.get(e);if(!n||n.length===0){P.warn(`Received assetResult for unknown or already handled url: ${t.url}`);break}let r=n.shift();if(n.length===0?j.delete(e):j.set(e,n),clearTimeout(r.timeout),t.result===`success`){P.debug(`Asset result is success`),r.resolve();break}let i=typeof t.message==`string`&&t.message?t.message:`Asset processing failed: ${JSON.stringify(t)}`;P.debug(`Asset result is failure`,i),r.reject(Error(i));break}default:if(ie(t)){let e=J(t);e?q(t.id,Error(e)):K(t.id,t.payload??t);break}P.warn(`Received unexpected message type: ${t.type}`)}}),w.on(`error`,e=>{let t=e.message;k=t,P.debug(`WebSocket error:`,t),!U&&(w?.readyState===c.default.CONNECTING||w?.readyState===c.default.OPEN)&&H(e)}),w.on(`close`,()=>{R&&=(clearInterval(R),void 0);let e=!O&&!f(k??``)&&T!==`disconnected`;F(`disconnected`),P.debug(`Disconnected from server.`),I(`Connection closed`),e?ae():f(k??``)&&(P.error(`Closing connection due to non-retryable error: ${k}`),L(),F(`disconnected`),I(`Non-retryable error`),P.debug(`Non-retryable error. Closing connection.`))}),w.on(`open`,()=>{P.debug(`Connected to ${h}`),E=0,k=void 0,F(`connected`),R=setInterval(()=>{w&&w.readyState===c.default.OPEN&&w.ping()},3e4),U||(U=!0,V({screenshot:oe,getElementTree:se,findElement:ce,tap:le,setText:ue,pressKey:de,scrollScreen:fe,scrollElement:pe,openUrl:me,launchApp:he,terminateApp:ge,listApps:_e,watchApp:ve,playOnMicrophone:ye,pushFile:Q,pullFile:be,setCameraVideo:xe,clearCameraVideo:Se,adbShell:Ce,setWifiBandwidth:we,startRecording:Te,stopRecording:Ee,startAppLogCapture:De,stopAppLogCapture:Oe,startEventCapture:ke,stopEventCapture:Ae,streamAppLogCapture:je,streamEventCapture:Me,keepAlive:Ne,disconnect:Pe,startAdbTunnel:Le,startTunnel:Re,getTunnelStatus:ze,stopTunnel:Be,sendAsset:Ve,syncApp:He,getConnectionState:Fe,onConnectionStateChange:Ie}))})},oe=async()=>Y(`screenshot`,{}),se=async e=>{let t=await Y(`getElementTree`,e??{},3e4+(e?.waitForIdleTimeoutMs??0));return{xml:typeof t.xml==`string`?t.xml:``,nodes:Array.isArray(t.nodes)?t.nodes:[]}},ce=async(e,t=20)=>{let n=await Y(`findElement`,{selector:e,limit:t}),r=Array.isArray(n.elements)?n.elements:[];return{elements:r,count:typeof n.count==`number`?n.count:r.length}},le=async e=>{let t=await Y(`tap`,e);return{x:Number(t.x??0),y:Number(t.y??0)}},ue=async(e,t)=>{let n={text:t};e?.selector&&(n.selector=e.selector),typeof e?.x==`number`&&(n.x=e.x),typeof e?.y==`number`&&(n.y=e.y);let r=await Y(`setText`,n);return{textLength:Number(r.textLength??t.length)}},de=async(e,t)=>{let n={keyName:e,...t?{modifiers:t}:{}},r=await Y(`pressKey`,n);return{key:typeof r.key==`string`?r.key:String(e)}},fe=async(e,t=6)=>await Y(`scrollScreen`,{direction:e,amount:t}),pe=async(e,t,n=6)=>await Y(`scrollElement`,{...e,direction:t,amount:n}),me=async e=>{let t=await Y(`openUrl`,{url:e});return{url:typeof t.url==`string`?t.url:e}},Z=async(e,t,n)=>{let r=W(e);M.set(r,t);try{return{execId:r,result:await n(r)}}catch(e){throw M.delete(r),e}},he=async(e,t={})=>{let n=n=>{let r={packageName:e};return t.mode&&(r.mode=t.mode),n&&(r.execId=n),Y(`launchApp`,r,6e4)},r=t.onExit?(await Z(`exec`,t.onExit,n)).result:await n();return{packageName:typeof r.packageName==`string`?r.packageName:e}},ge=async e=>{await Y(`terminateApp`,{packageName:e})},_e=async()=>(await Y(`listApps`,{})).apps??[],ve=async(e,t)=>{let{execId:n}=await Z(`watch`,t,t=>Y(`watchApp`,{packageName:e,execId:t}));return{execId:n,stop:async()=>{M.delete(n),await Y(`unwatchApp`,{execId:n})}}},ye=async(e,t)=>{if(!e)throw Error(`path must be a non-empty string`);return Y(`playOnMicrophone`,{path:e,...t?.once===void 0?{}:{once:t.once}})},Q=async(t,r)=>{let i=r===void 0?`${e.apiUrl}/files`:`${e.apiUrl}/files?path=${encodeURIComponent(r)}`,a=m.createReadStream(t),o=await n.fetch(i,{method:`PUT`,headers:{"Content-Type":`application/octet-stream`,"Content-Length":m.statSync(t).size.toString(),Authorization:`Bearer ${e.token}`},body:a,duplex:`half`});if(!o.ok){let e=await o.text();throw P.debug(`Upload failed: ${o.status} ${e}`),Error(`Upload failed: ${o.status} ${e}`)}return(await o.json()).path},be=async(t,n)=>{let i=`${e.apiUrl}/files?path=${encodeURIComponent(t)}`;await r(i,e.token,n)},xe=async(e,t)=>{let n=await Q(e);await Y(`cameraControl`,{action:`setSource`,source:`video`,arg:n,loop:t?.loop??!0})},Se=async()=>{await Y(`cameraControl`,{action:`reset`})},Ce=async(e,t=[],n)=>{if(!e)throw Error(`command must be a non-empty string`);let r=re([e,...t]),i=n?.timeoutMs,a=(i??3e4)+15e3,o=await Y(`adbShell`,{command:r,...i===void 0?{}:{timeoutMs:i}},a),s=n?.encoding??`utf8`;return{stdout:Buffer.from(o.stdout??``,`base64`).toString(s),stderr:Buffer.from(o.stderr??``,`base64`).toString(s),exitCode:typeof o.exitCode==`number`?o.exitCode:-1,truncated:o.truncated===!0}},we=async e=>{let t={};if(e.downKbps!==void 0&&(G(`downKbps`,e.downKbps),t.downKbps=e.downKbps),e.upKbps!==void 0&&(G(`upKbps`,e.upKbps),t.upKbps=e.upKbps),t.downKbps===void 0&&t.upKbps===void 0)throw Error(`setWifiBandwidth requires downKbps, upKbps, or both`);await Y(`setWifiBandwidth`,t)},Te=async e=>{let t={...s(e?.persist)};if(e?.quality!==void 0){if(!Number.isInteger(e.quality)||e.quality<5||e.quality>10)throw Error(`quality must be one of: 5, 6, 7, 8, 9, 10`);t.quality=e.quality}await Y(`startRecording`,t)},Ee=async t=>{let n={};t.presignedUrl&&(n.upload={presignedUrl:t.presignedUrl}),await Y(`stopRecording`,n);let i=te(y);return t.localPath&&await r(i,e.token,t.localPath),i},De=async e=>{if(!e.bundleId)throw Error(`bundleId must be a non-empty string`);await Y(`startAppLogCapture`,{bundleId:e.bundleId,...s(e.persist)})},Oe=async()=>{await Y(`stopAppLogCapture`,{})},ke=async e=>{await Y(`startEventCapture`,{...s(e?.persist)})},Ae=async()=>{await Y(`stopEventCapture`,{})},je=t=>d({url:`${e.apiUrl}/session/applogs/events`,token:e.token,onEntry:t.onLine,onError:t.onError}),Me=t=>d({url:`${e.apiUrl}/session/events/events`,token:e.token,onEntry:t.onEvent,onError:t.onError}),Ne=()=>{!w||w.readyState!==c.default.OPEN||w.send(JSON.stringify({type:`keepAlive`,sessionId:B}))},Pe=()=>{O=!0,L(),F(`disconnected`),I(`Intentional disconnect`),P.debug(`Intentionally disconnected from WebSocket.`)},Fe=()=>T,Ie=e=>(N.add(e),()=>{N.delete(e)}),Le=async()=>{if(!e.adbUrl)throw Error(`adbUrl is required to start an ADB tunnel.`);let t=await i(e.adbUrl,e.token,`127.0.0.1`,0,{maxReconnectAttempts:x,reconnectDelay:S,maxReconnectDelay:C,logLevel:b});try{await new Promise((n,r)=>{p(e.adbPath??`adb`,[`connect`,`${t.address.address}:${t.address.port}`],e=>{if(e)return r(e);n()})}),P.debug(`ADB connected on ${t.address.address}`)}catch(e){throw t.close(),e}return t},$=()=>{if(!e.adbUrl)throw Error(`adbUrl is required to manage a destination tunnel.`);return e.adbUrl},Re=async n=>t(u($()),e.token,{selectors:n.selectors,inspection:{enabled:!0,captureBodies:!1,...n.inspection??{}},...n.onInspectionEvent?{onInspectionEvent:n.onInspectionEvent}:{},...n.onInspectionError?{onInspectionError:n.onInspectionError}:{},...n.window===void 0?{}:{window:n.window},logLevel:n.logLevel??b}),ze=async()=>l($(),e.token),Be=async t=>{await a($(),e.token,t)},Ve=async(e,t)=>{if(!w||w.readyState!==c.default.OPEN)return Promise.reject(Error(`WebSocket is not connected or connection is not open.`));let n={type:`asset`,url:e};return new Promise((r,i)=>{let a,o=setTimeout(()=>{let t=j.get(e);if(!t)return;let n=t.indexOf(a);n>=0&&(t.splice(n,1),i(Error(`Request asset timed out for url: ${e}`))),t.length===0?j.delete(e):j.set(e,t)},t??12e4);a={resolve:r,reject:e=>i(e),timeout:o};let s=j.get(e)??[];s.push(a),j.set(e,s),w.send(JSON.stringify(n),t=>{if(t){clearTimeout(o);let n=j.get(e)??[],r=n.indexOf(a);r>=0&&n.splice(r,1),n.length===0?j.delete(e):j.set(e,n),P.error(`Failed to send asset request:`,t),i(t)}})})},He=async(t,n)=>{let r=_.resolve(t);await ne(r);let i=`limsync-cache-android-${_.basename(r)}-${v.createHash(`sha1`).update(r).digest(`hex`).slice(0,8)}`,a=n?.basisCacheDir??_.join(g.tmpdir(),i),s=(e,t)=>{switch(e){case`debug`:P.debug(t);break;case`info`:P.info(t);break;case`warn`:P.warn(t);break;case`error`:P.error(t);break;default:P.info(t)}};return await m.promises.mkdir(a,{recursive:!0}),await ee(r,a,e.apiUrl,e.token,s,n?.onBasisDownloadProgress),await o(r,{apiUrl:e.apiUrl,token:e.token,udid:i,basisCacheDir:a,install:n?.install??!0,launchMode:n?.launchMode??`ForegroundIfRunning`,watch:n?.watch??!1,ignoreFn:()=>!1,log:s,compression:`identity`,...n?.onSyncComplete?{onSyncComplete:n.onSyncComplete}:{}})};X()})}export{U as n,q as t};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{Cr as t,br as n,vr as r,xr as i,yr as a}from"./sdk-batch.js";function o(e){return e?.startsWith(`@`)?e.slice(1):e}const s=/^e\d+$/;function c(n){if(n[0]?.startsWith(`@`)){let e=_(n.slice(1));return{ref:n[0],...e===void 0?{}:{label:e}}}if(s.test(n[0]??``))throw new e(`INVALID_ARGS`,`Did you mean "@${n[0]}"? Snapshot refs need the @ prefix.`);let r=t(n);if(r){if(r.rest.length>0)throw new e(`INVALID_ARGS`,m(n,r));return{selector:r.selectorExpression}}return u(n)}function l(n){let r=n[0];if(r?.startsWith(`@`)){let e=n.slice(1),t=e.length===0?void 0:e.join(` `);return{kind:`ref`,target:{ref:r},text:t}}if(s.test(r??``))throw new e(`INVALID_ARGS`,`Did you mean "@${r}"? Snapshot refs need the @ prefix.`);let i=t(n,{preferTrailingValue:!0});if(i)return{kind:`selector`,target:{selector:i.selectorExpression},text:i.rest.length===0?void 0:i.rest.join(` `)};let a=n.slice(2);return{kind:`point`,target:u(n.slice(0,2)),text:a.length===0?void 0:a.join(` `)}}function u(t){let n=t[0]??``,r=a(n);if(r){let i=d(n)?r.value:[r.value,...t.slice(1)].join(` `).trim();throw new e(`INVALID_ARGS`,f({key:r.key,value:i}))}let i=Number(t[0]),o=Number(t[1]);if(Number.isFinite(i)&&Number.isFinite(o))return{x:i,y:o};throw new e(`INVALID_ARGS`,p(t))}function d(e){let t=e.slice(e.indexOf(`=`)+1).trim();if(t.length<2)return!1;let n=t[0];return(n===`"`||n===`'`)&&t.endsWith(n)}function f(e){let{key:t,value:i}=e;return`Unknown selector key "${t}". Supported: ${r.join(`, `)}. ${n(t)?`Did you mean role=${t} label=${g(i)}?`:`Did you mean label=${g(i)}?`}`}function p(e){let t=e.filter(e=>e!==void 0).join(` `);if(!t.trim())return`Missing target. Pass an @ref from snapshot, a selector like text="Sign in", or "x y" coordinates.`;let n=`Target "${t}" is not a @ref, selector, or "x y" point.`;return e.some(e=>i(e??``))?`${n} Selector values with spaces need quotes, e.g. text="Sign in".`:`${n} To match by visible text, use text=${g(t)} (or label=/id=/role=), or pass an @ref from snapshot.`}function m(e,t){return`${`Selector ${t.selectorExpression} is followed by unexpected extra arguments: "${t.rest.join(` `)}".`} Selector values with spaces need quotes, e.g. ${h(e,t)??`text="Sign in"`}.`}function h(e,t){let n=e.length-t.rest.length,r=e[n-1];if(r===void 0)return;let i=r.indexOf(`=`);if(i<=0)return;let a=[r.slice(i+1),...t.rest].join(` `),o=`${r.slice(0,i+1)}${g(a)}`;return[...e.slice(0,n-1),o].join(` `)}function g(e){return`"${e.replaceAll(`\\`,String.raw`\\`).replaceAll(`"`,String.raw`\"`)}"`}function _(e){return e.join(` `).trim()||void 0}export{c as n,o as r,l as t};
1
+ import{P as e}from"./sdk-contracts.js";import{Cr as t,br as n,vr as r,xr as i,yr as a}from"./sdk-batch.js";function o(e){return e?.startsWith(`@`)?e.slice(1):e}const s=/^e\d+$/;function c(n){if(n[0]?.startsWith(`@`)){let e=_(n.slice(1));return{ref:n[0],...e===void 0?{}:{label:e}}}if(s.test(n[0]??``))throw new e(`INVALID_ARGS`,`Did you mean "@${n[0]}"? Snapshot refs need the @ prefix.`);let r=t(n);if(r){if(r.rest.length>0)throw new e(`INVALID_ARGS`,m(n,r));return{selector:r.selectorExpression}}return u(n)}function l(n){let r=n[0];if(r?.startsWith(`@`)){let e=n.slice(1),t=e.length===0?void 0:e.join(` `);return{kind:`ref`,target:{ref:r},text:t}}if(s.test(r??``))throw new e(`INVALID_ARGS`,`Did you mean "@${r}"? Snapshot refs need the @ prefix.`);let i=t(n,{preferTrailingValue:!0});if(i)return{kind:`selector`,target:{selector:i.selectorExpression},text:i.rest.length===0?void 0:i.rest.join(` `)};let a=n.slice(2);return{kind:`point`,target:u(n.slice(0,2)),text:a.length===0?void 0:a.join(` `)}}function u(t){let n=t[0]??``,r=a(n);if(r){let i=d(n)?r.value:[r.value,...t.slice(1)].join(` `).trim();throw new e(`INVALID_ARGS`,f({key:r.key,value:i}))}let i=Number(t[0]),o=Number(t[1]);if(Number.isFinite(i)&&Number.isFinite(o))return{x:i,y:o};throw new e(`INVALID_ARGS`,p(t))}function d(e){let t=e.slice(e.indexOf(`=`)+1).trim();if(t.length<2)return!1;let n=t[0];return(n===`"`||n===`'`)&&t.endsWith(n)}function f(e){let{key:t,value:i}=e;return`Unknown selector key "${t}". Supported: ${r.join(`, `)}. ${n(t)?`Did you mean role=${t} label=${g(i)}?`:`Did you mean label=${g(i)}?`}`}function p(e){let t=e.filter(e=>e!==void 0).join(` `);if(!t.trim())return`Missing target. Pass an @ref from snapshot, a selector like text="Sign in", or "x y" coordinates.`;let n=`Target "${t}" is not a @ref, selector, or "x y" point.`;return e.some(e=>i(e??``))?`${n} Selector values with spaces need quotes, e.g. text="Sign in".`:`${n} To match by visible text, use text=${g(t)} (or label=/id=/role=), or pass an @ref from snapshot.`}function m(e,t){return`${`Selector ${t.selectorExpression} is followed by unexpected extra arguments: "${t.rest.join(` `)}".`} Selector values with spaces need quotes, e.g. ${h(e,t)??`text="Sign in"`}.`}function h(e,t){let n=e.length-t.rest.length,r=e[n-1];if(r===void 0)return;let i=r.indexOf(`=`);if(i<=0)return;let a=[r.slice(i+1),...t.rest].join(` `),o=`${r.slice(0,i+1)}${g(a)}`;return[...e.slice(0,n-1),o].join(` `)}function g(e){return`"${e.replaceAll(`\\`,String.raw`\\`).replaceAll(`"`,String.raw`\"`)}"`}function _(e){return e.join(` `).trim()||void 0}export{c as n,o as r,l as t};
@@ -1 +1 @@
1
- import{G as e,N as t,P as n,n as r}from"./sdk-contracts.js";import{C as i,p as a}from"./sdk-device.js";import{fn as o}from"./sdk-batch.js";import{i as s,s as c,u as l}from"./target-evidence.js";import{A as u,M as d,d as f,t as p}from"./parameterized-recorded-fill.js";import{i as m}from"./mobile-snapshot-semantics.js";import{r as h}from"./request-cancel.js";import"./request.js";import{n as g}from"./provider-device-admission.js";import{O as _,_ as v,g as y,i as b,m as x,o as S,u as C,v as w}from"./session-snapshot.js";import{i as T}from"./internal/daemon.js";function E(e){let{req:t,logPath:n,traceLogPath:r}=e;return{verbose:t.flags?.verbose,logPath:n,traceLogPath:r,requestId:t.meta?.requestId,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir}}function D(e,t){return!(!e||!a(e.device)||g(e.device)||t.skipPendingPostGestureStabilization&&y(e))}function O(e){let{session:t,selectorExpression:n}=e;return D(t,{skipPendingPostGestureStabilization:!0})?o(n):null}function k(e){let t=e.identifier?.trim();if(t)return{key:`id`,value:t};let n=e.label?.trim();return n?{key:`label`,value:n}:null}async function A(e,t,n){let r=await x(e.device,t,e.appBundleId,n),i=r.found===!0,a=j(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}function j(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}const M=new Set([`ELEMENT_NOT_FOUND`,`ELEMENT_OFFSCREEN`,`AMBIGUOUS_MATCH`]);function N(t,r){let i=n(t);return i.details?.dispatched!==`no`||e(i)?!1:M.has(i.code)?r.delegateSemanticFailures:i.code===`COMMAND_FAILED`}async function P(e){let{session:t,node:n,rootViewport:r,requestOptions:i}=e,a=k(n);if(!a)return null;let o;try{o=await A(t,a,i)}catch{return null}if(!o.found||!o.node?.rect)return null;let s={rect:o.node.rect,hittable:o.node.hittable===!0};return m(s,r)?s.rect:null}function F(e){let{operations:t,command:n,positionals:r,actionCommand:i=n,flags:a,result:o,responseData:c,recordedTarget:l,recordedTargets:u,actionStartedAt:d,actionFinishedAt:f,androidFreshnessBaseline:p}=e,m=w(a),[h,g]=L({command:n,positionals:r,flags:m,result:o,responseData:c}),_=t.isSessionRecording()&&l?s(l):void 0,v=t.isSessionRecording()&&u?I(u):void 0;return t.recordAction({command:n,positionals:r,flags:m??{},result:h,..._?{targetEvidence:_}:{},...v?{targetEvidences:v}:{}}),t.markDeferredOutcome({command:n,action:i,positionals:r,flags:a,androidFreshnessBaseline:p}),t.recordGestureVisualization(i,r,h,m??{},d,f),{ok:!0,data:g}}function I(e){let t=s(e.source),n=s(e.destination);return t&&n?{source:t,destination:n}:void 0}function L(e){if(e.command!==`fill`||typeof e.flags?.recordAs!=`string`)return[e.result,e.responseData];let t=u({ts:0,command:`fill`,positionals:e.positionals,flags:e.flags,result:e.result}),n=d(e.flags.recordAs);return[p(e.result,t,n),p(e.responseData,t,n)]}function R(e){let n=e.sessionStore.get(e.sessionName);if(!n)throw new t(`SESSION_NOT_FOUND`,r);return B({requestId:e.req.meta?.requestId,flags:e.req.flags,session:n,contextFromFlags:e.contextFromFlags,captureSnapshot:async(t,r)=>{let i=await e.captureSnapshotForSession(n,t,e.sessionStore,e.contextFromFlags,r);return c(e.captureProof,i)},runtimeSessions:S({sessionName:e.sessionName,getSession:()=>n,recordOptions:{includeSnapshot:!0,omitRefFrameSnapshot:e.req.internal?.findResolvedTarget!==void 0},setRecord:t=>{t.snapshot&&(b(n,t.snapshot),e.sessionStore.set(e.sessionName,n))}}),expireRefFrame:()=>_(n),confirmOffscreenTargetVisible:D(n,{skipPendingPostGestureStabilization:!1})?async(t,r)=>await P({session:n,node:t,rootViewport:r,requestOptions:E({req:e.req,logPath:e.logPath,traceLogPath:n.trace?.outPath})}):void 0,pairedGestureViewport:e.pairedGestureViewport,touchExecutor:e.touchExecutor,gestures:e.gestures})}function z(e){let{session:t,sessionStore:n,...r}=e;return F({...r,operations:{recordAction:n.recordAction.bind(n,t),markDeferredOutcome:e=>v({session:t,...e}),isSessionRecording:f.bind(null,t),recordGestureVisualization:T.bind(null,t)}})}function B(e){return C({backend:V(e),...l(`interaction commands`,{plural:!0}),sessions:e.runtimeSessions,signal:h(e.requestId)})}function V(e){let{flags:t,session:n}=e;return{platform:i(n.device),captureSnapshot:async(n,r)=>({snapshot:await e.captureSnapshot(t,{interactiveOnly:r?.interactiveOnly===!0,preferredBackend:r?.preferredBackend,includeRects:r?.includeRects===!0,signal:n.signal,boundCapture:e.touchExecutor?.captureSnapshot??e.gestures?.captureSnapshot})}),...H(e,()=>e.contextFromFlags(t,n.appBundleId,n.trace?.outPath)),...e.confirmOffscreenTargetVisible?{confirmOffscreenTargetVisible:async(t,n,r)=>await e.confirmOffscreenTargetVisible(n,r)}:{},...U(e.touchExecutor,e.expireRefFrame,t)}}function H(e,t){let n=e.gestures,r=e.pairedGestureViewport;return n?{resolveGestureViewport:async()=>r??await n.gestureViewport?.(t()),performGesture:async(r,i)=>(e.expireRefFrame(),W(await n.performPlan(i,t())))}:r?{resolveGestureViewport:async()=>r}:{}}function U(e,t,n){if(!e)return{};let{tapPoint:r,tapRef:i,fillPoint:a,fillRef:o,longPressPoint:s,hoverPoint:c,hoverRef:l}=e,u=async e=>(t(),W(await e()));return{tap:r?(e,t)=>u(()=>r(t,n)):void 0,tapTarget:i?(e,t)=>u(()=>i(t.ref)):void 0,fill:a?(e,t,n,r)=>u(()=>a(t,n,r)):void 0,fillTarget:o?(e,t,n,r)=>u(()=>o(t.ref,n,r)):void 0,longPress:s?(e,t,n)=>u(()=>s(t,n?.durationMs)):void 0,hover:c?(e,t)=>u(()=>c(t)):void 0,hoverTarget:l?(e,t)=>u(()=>l(t.ref)):void 0}}function W(e){return e&&typeof e==`object`?e:void 0}function G(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}function K(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:G(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function q(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function J(e){try{return Y(e),null}catch(e){if(e instanceof t)return G(e.code,e.message,e.details);throw e}}function Y(e){let n=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref,{admission:r,scope:i,currentGeneration:a}=e.frame;if(r.admitted)return;let o=r.reason===`plain_ref_requires_complete_frame`&&i!==`all`&&i.has(n)&&a!==void 0?`@${n}~s${a}`:void 0;throw new t(`COMMAND_FAILED`,Z(r.reason,e.ref),{reason:r.reason,ref:e.ref,currentGeneration:a,scope:i===`all`?`all`:Array.from(i),...e.mintedGeneration===void 0?{}:{mintedGeneration:e.mintedGeneration},...o?{suggestedRef:o}:{},hint:o?`Retry with the exact emitted ref ${o}.`:e.staleRefsWarning??X})}const X=`Capture a fresh interactive snapshot (snapshot -i) or use a stable selector, then retry.`;function Z(e,t){switch(e){case`ref_frame_expired`:return`Ref ${t} belongs to an expired ref frame — a device action since the snapshot invalidated it`;case`ref_generation_mismatch`:return`Ref ${t} was minted from a superseded snapshot generation`;case`plain_ref_requires_complete_frame`:return`Ref ${t} needs a complete snapshot — the current frame only authorizes its emitted refs`;case`ref_not_issued`:return`Ref ${t} was not issued by the current ref frame`}}export{R as a,D as c,K as i,O as l,J as n,z as o,q as r,N as s,Y as t};
1
+ import{F as e,K as t,P as n,r}from"./sdk-contracts.js";import{p as i,w as a}from"./sdk-device.js";import{fn as o}from"./sdk-batch.js";import{i as s,s as c,u as l}from"./target-evidence.js";import{M as u,P as d,n as f,p,r as m}from"./provider-device-admission.js";import{i as h}from"./mobile-snapshot-semantics.js";import{r as g}from"./request-cancel.js";import"./request.js";import{A as _,b as v,f as y,g as b,o as x,s as S,v as C,y as w}from"./session-snapshot.js";import{i as T}from"./internal/daemon.js";function E(e){return{...e,sessionRef:`sessionRef`in e?e.sessionRef:e.sessionStore.lookup(e.sessionName)}}function D(e){let{req:t,logPath:n,traceLogPath:r}=e;return{verbose:t.flags?.verbose,logPath:n,traceLogPath:r,requestId:t.meta?.requestId,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir}}function O(e,t){return!(!e||!i(e.device)||f(e.device)||t.skipPendingPostGestureStabilization&&C(e))}function k(e){let{session:t,selectorExpression:n}=e;return O(t,{skipPendingPostGestureStabilization:!0})?o(n):null}function A(e){let t=e.identifier?.trim();if(t)return{key:`id`,value:t};let n=e.label?.trim();return n?{key:`label`,value:n}:null}async function j(e,t,n){let r=await b(e.device,t,e.appBundleId,n),i=r.found===!0,a=M(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}function M(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}const N=new Set([`ELEMENT_NOT_FOUND`,`ELEMENT_OFFSCREEN`,`AMBIGUOUS_MATCH`]);function P(n,r){let i=e(n);return i.details?.dispatched!==`no`||t(i)?!1:N.has(i.code)?r.delegateSemanticFailures:i.code===`COMMAND_FAILED`}async function F(e){let{session:t,node:n,rootViewport:r,requestOptions:i}=e,a=A(n);if(!a)return null;let o;try{o=await j(t,a,i)}catch{return null}if(!o.found||!o.node?.rect)return null;let s={rect:o.node.rect,hittable:o.node.hittable===!0};return h(s,r)?s.rect:null}function I(e){let{operations:t,command:n,positionals:r,actionCommand:i=n,flags:a,result:o,responseData:c,recordedTarget:l,recordedTargets:u,actionStartedAt:d,actionFinishedAt:f,androidFreshnessBaseline:p}=e,m=v(a),[h,g]=R({command:n,positionals:r,flags:m,result:o,responseData:c}),_=t.isSessionRecording()&&l?s(l):void 0,y=t.isSessionRecording()&&u?L(u):void 0;return t.recordAction({command:n,positionals:r,flags:m??{},result:h,..._?{targetEvidence:_}:{},...y?{targetEvidences:y}:{}}),t.markDeferredOutcome({command:n,action:i,positionals:r,flags:a,androidFreshnessBaseline:p}),t.recordGestureVisualization(i,r,h,m??{},d,f),{ok:!0,data:g}}function L(e){let t=s(e.source),n=s(e.destination);return t&&n?{source:t,destination:n}:void 0}function R(e){if(e.command!==`fill`||typeof e.flags?.recordAs!=`string`)return[e.result,e.responseData];let t=u({ts:0,command:`fill`,positionals:e.positionals,flags:e.flags,result:e.result}),n=d(e.flags.recordAs);return[m(e.result,t,n),m(e.responseData,t,n)]}function z(e){let t=E(e).sessionRef;if(!t)throw new n(`SESSION_NOT_FOUND`,r);let i=e.sessionStore.requireCurrent(t);return V({requestId:e.req.meta?.requestId,flags:e.req.flags,session:i,contextFromFlags:e.contextFromFlags,captureSnapshot:async(n,r)=>{let i=await e.captureSnapshotForSession(t,n,e.sessionStore,e.contextFromFlags,r);return c(e.captureProof,i)},runtimeSessions:S({sessionName:e.sessionName,sessionStore:e.sessionStore,ref:t,recordOptions:{includeSnapshot:!0,omitRefFrameSnapshot:e.req.internal?.findResolvedTarget!==void 0},setRecord:(e,t)=>{e.snapshot&&x(t,e.snapshot)}}),expireRefFrame:()=>_(e.sessionStore.requireCurrent(t)),confirmOffscreenTargetVisible:O(i,{skipPendingPostGestureStabilization:!1})?async(t,n)=>await F({session:i,node:t,rootViewport:n,requestOptions:D({req:e.req,logPath:e.logPath,traceLogPath:i.trace?.outPath})}):void 0,pairedGestureViewport:e.pairedGestureViewport,touchExecutor:e.touchExecutor,gestures:e.gestures})}function B(e){let{ref:t,sessionStore:n,...r}=e,i=n.requireCurrent(t);return I({...r,operations:{recordAction:n.recordAction.bind(n,t),markDeferredOutcome:e=>w({session:i,...e}),isSessionRecording:p.bind(null,i),recordGestureVisualization:T.bind(null,i)}})}function V(e){return y({backend:H(e),...l(`interaction commands`,{plural:!0}),sessions:e.runtimeSessions,signal:g(e.requestId)})}function H(e){let{flags:t,session:n}=e;return{platform:a(n.device),captureSnapshot:async(n,r)=>({snapshot:await e.captureSnapshot(t,{interactiveOnly:r?.interactiveOnly===!0,preferredBackend:r?.preferredBackend,includeRects:r?.includeRects===!0,signal:n.signal,boundCapture:e.touchExecutor?.captureSnapshot??e.gestures?.captureSnapshot})}),...U(e,()=>e.contextFromFlags(t,n.appBundleId,n.trace?.outPath)),...e.confirmOffscreenTargetVisible?{confirmOffscreenTargetVisible:async(t,n,r)=>await e.confirmOffscreenTargetVisible(n,r)}:{},...W(e.touchExecutor,e.expireRefFrame,t)}}function U(e,t){let n=e.gestures,r=e.pairedGestureViewport;return n?{resolveGestureViewport:async()=>r??await n.gestureViewport?.(t()),performGesture:async(r,i)=>(e.expireRefFrame(),G(await n.performPlan(i,t())))}:r?{resolveGestureViewport:async()=>r}:{}}function W(e,t,n){if(!e)return{};let{tapPoint:r,tapRef:i,fillPoint:a,fillRef:o,longPressPoint:s,hoverPoint:c,hoverRef:l}=e,u=async e=>(t(),G(await e()));return{tap:r?(e,t)=>u(()=>r(t,n)):void 0,tapTarget:i?(e,t)=>u(()=>i(t.ref)):void 0,fill:a?(e,t,n,r)=>u(()=>a(t,n,r)):void 0,fillTarget:o?(e,t,n,r)=>u(()=>o(t.ref,n,r)):void 0,longPress:s?(e,t,n)=>u(()=>s(t,n?.durationMs)):void 0,hover:c?(e,t)=>u(()=>c(t)):void 0,hoverTarget:l?(e,t)=>u(()=>l(t.ref)):void 0}}function G(e){return e&&typeof e==`object`?e:void 0}function K(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}function q(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:K(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function J(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function Y(e){try{return X(e),null}catch(e){if(e instanceof n)return K(e.code,e.message,e.details);throw e}}function X(e){let t=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref,{admission:r,scope:i,currentGeneration:a}=e.frame;if(r.admitted)return;let o=r.reason===`plain_ref_requires_complete_frame`&&i!==`all`&&i.has(t)&&a!==void 0?`@${t}~s${a}`:void 0;throw new n(`COMMAND_FAILED`,Q(r.reason,e.ref),{reason:r.reason,ref:e.ref,currentGeneration:a,scope:i===`all`?`all`:Array.from(i),...e.mintedGeneration===void 0?{}:{mintedGeneration:e.mintedGeneration},...o?{suggestedRef:o}:{},hint:o?`Retry with the exact emitted ref ${o}.`:e.staleRefsWarning??Z})}const Z=`Capture a fresh interactive snapshot (snapshot -i) or use a stable selector, then retry.`;function Q(e,t){switch(e){case`ref_frame_expired`:return`Ref ${t} belongs to an expired ref frame — a device action since the snapshot invalidated it`;case`ref_generation_mismatch`:return`Ref ${t} was minted from a superseded snapshot generation`;case`plain_ref_requires_complete_frame`:return`Ref ${t} needs a complete snapshot — the current frame only authorizes its emitted refs`;case`ref_not_issued`:return`Ref ${t} was not issued by the current ref frame`}}export{z as a,O as c,q as i,k as l,Y as n,B as o,J as r,P as s,X as t,E as u};
@@ -1 +1 @@
1
- import{d as e,i as t,s as n}from"./session-snapshot.js";import{s as r}from"./quality-warnings.js";import{t as i}from"./backend-snapshot-options.js";import{a,i as o,n as s,o as c,r as l}from"./interaction-ref-policy.js";async function u(e){let{session:t,flags:n,contextFromFlags:a,options:o}=e,s={...n??{},...i(o)},c=a(s,t.appBundleId,t.trace?.outPath),l=await e.capture({flags:s,options:o,context:c});return r(l.snapshotQuality)||e.publishSnapshot(l),l}const d=async(r,i,a,o,s)=>await u({session:r,flags:i,contextFromFlags:o,options:s,capture:async({flags:t,options:i,context:a})=>{let{snapshot:o}=await n({device:r.device,session:r,flags:t,outPath:t.out,logPath:a.logPath??``,includeRects:i.includeRects,androidFreshnessMode:i.androidFreshnessMode,signal:i.signal,...i.boundCapture?{captureData:async()=>await i.boundCapture(e({flags:t,session:r,snapshotScope:t.snapshotScope,includeRects:i.includeRects,signal:i.signal,context:a}))}:{}});return o},publishSnapshot:e=>{t(r,e),a.set(a.resolveStoredSessionName(r),r)}});function f(e){return a({...e,captureSnapshotForSession:e.captureSnapshotForSession??d})}async function p(e){return(await import(`./find.js`)).handleFindCommands(e)}async function m(e){return await(await import(`./interaction2.js`)).handleInteractionCommands({...e,captureSnapshotForSession:e.captureSnapshotForSession??d})}export{d as captureSnapshotForSession,f as createInteractionRuntime,c as finalizeTouchInteraction,p as handleFindCommands,m as handleInteractionCommands,l as readSettleRequest,s as refMutationAdmissionResponse,o as settleFlagGuardResponse};
1
+ import{l as e,o as t,p as n}from"./session-snapshot.js";import{s as r}from"./quality-warnings.js";import{a as i,i as a,n as o,o as s,r as c,u as l}from"./interaction-ref-policy.js";import{t as u}from"./backend-snapshot-options.js";async function d(e){let{session:t,flags:n,contextFromFlags:i,options:a}=e,o={...n??{},...u(a)},s=i(o,t.appBundleId,t.trace?.outPath),c=await e.capture({flags:o,options:a,context:s});return r(c.snapshotQuality)||e.publishSnapshot(c),c}const f=async(r,i,a,o,s)=>{let c=a.requireCurrent(r);return await d({session:c,flags:i,contextFromFlags:o,options:s,capture:async({flags:t,options:r,context:i})=>{let{snapshot:a}=await e({device:c.device,session:c,flags:t,outPath:t.out,logPath:i.logPath??``,includeRects:r.includeRects,androidFreshnessMode:r.androidFreshnessMode,signal:r.signal,...r.boundCapture?{captureData:async()=>await r.boundCapture(n({flags:t,session:c,snapshotScope:t.snapshotScope,includeRects:r.includeRects,signal:r.signal,context:i}))}:{}});return a},publishSnapshot:e=>{t(a.requireCurrent(r),e)}})};function p(e){return i({...l(e),captureSnapshotForSession:e.captureSnapshotForSession??f})}async function m(e){return(await import(`./find.js`)).handleFindCommands(e)}async function h(e){let t=l(e);return await(await import(`./interaction2.js`)).handleInteractionCommands({...t,captureSnapshotForSession:e.captureSnapshotForSession??f})}export{l as bindInteractionSession,f as captureSnapshotForSession,p as createInteractionRuntime,s as finalizeTouchInteraction,m as handleFindCommands,h as handleInteractionCommands,c as readSettleRequest,o as refMutationAdmissionResponse,a as settleFlagGuardResponse};